Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,103 @@
CLASS {{p}}toll_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_toll_pricer.
METHODS constructor.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_rate,
vehicle_class TYPE {{p}}if_toll_pricer=>ty_class,
cents_per_km TYPE {{p}}if_toll_pricer=>ty_cents,
END OF ty_rate,
tt_rate TYPE HASHED TABLE OF ty_rate WITH UNIQUE KEY vehicle_class.
CONSTANTS:
c_min_toll TYPE {{p}}if_toll_pricer=>ty_cents VALUE 100,
c_max_km TYPE i VALUE 130,
c_discount TYPE i VALUE 10,
c_night_div TYPE i VALUE 4.
DATA mt_rate TYPE tt_rate.
METHODS fill_rates
RETURNING VALUE(rt_rate) TYPE tt_rate.
METHODS validate
IMPORTING is_journey TYPE {{p}}if_toll_pricer=>ty_journey
RETURNING VALUE(rv_reason) TYPE {{p}}if_toll_pricer=>ty_reason.
METHODS base_toll
IMPORTING is_journey TYPE {{p}}if_toll_pricer=>ty_journey
RETURNING VALUE(rv_amount) TYPE {{p}}if_toll_pricer=>ty_cents.
METHODS apply_discount
IMPORTING iv_amount TYPE {{p}}if_toll_pricer=>ty_cents
iv_has_transponder TYPE abap_bool
RETURNING VALUE(rv_amount) TYPE {{p}}if_toll_pricer=>ty_cents.
METHODS apply_night_surcharge
IMPORTING iv_amount TYPE {{p}}if_toll_pricer=>ty_cents
is_journey TYPE {{p}}if_toll_pricer=>ty_journey
RETURNING VALUE(rv_amount) TYPE {{p}}if_toll_pricer=>ty_cents.
ENDCLASS.
CLASS {{p}}toll_pricer IMPLEMENTATION.
METHOD constructor.
mt_rate = fill_rates( ).
ENDMETHOD.
METHOD {{p}}if_toll_pricer~price_journey.
rs_result-reason = validate( is_journey ).
IF rs_result-reason <> {{p}}if_toll_pricer=>c_reason-ok.
RETURN.
ENDIF.
DATA(lv_amount) = base_toll( is_journey ).
lv_amount = apply_discount( iv_amount = lv_amount
iv_has_transponder = is_journey-has_transponder ).
lv_amount = apply_night_surcharge( iv_amount = lv_amount
is_journey = is_journey ).
rs_result-amount_cents = lv_amount.
ENDMETHOD.
METHOD fill_rates.
rt_rate = VALUE #( ( vehicle_class = {{p}}if_toll_pricer=>c_class-motorcycle cents_per_km = 5 )
( vehicle_class = {{p}}if_toll_pricer=>c_class-car cents_per_km = 10 )
( vehicle_class = {{p}}if_toll_pricer=>c_class-van cents_per_km = 18 )
( vehicle_class = {{p}}if_toll_pricer=>c_class-lorry cents_per_km = 30 ) ).
ENDMETHOD.
METHOD validate.
DATA lv_class TYPE {{p}}if_toll_pricer=>ty_class.
lv_class = to_upper( is_journey-vehicle_class ).
IF NOT line_exists( mt_rate[ vehicle_class = lv_class ] ).
rv_reason = {{p}}if_toll_pricer=>c_reason-vehicle.
ELSEIF is_journey-distance_km < 1 OR is_journey-distance_km > c_max_km.
rv_reason = {{p}}if_toll_pricer=>c_reason-distance.
ELSE.
rv_reason = {{p}}if_toll_pricer=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD base_toll.
DATA lv_class TYPE {{p}}if_toll_pricer=>ty_class.
lv_class = to_upper( is_journey-vehicle_class ).
DATA(lv_rate) = mt_rate[ vehicle_class = lv_class ]-cents_per_km.
rv_amount = is_journey-distance_km * lv_rate.
IF rv_amount < c_min_toll.
rv_amount = c_min_toll.
ENDIF.
ENDMETHOD.
METHOD apply_discount.
rv_amount = iv_amount.
IF iv_has_transponder = abap_true.
rv_amount = iv_amount - iv_amount DIV c_discount.
ENDIF.
ENDMETHOD.
METHOD apply_night_surcharge.
DATA lv_class TYPE {{p}}if_toll_pricer=>ty_class.
lv_class = to_upper( is_journey-vehicle_class ).
rv_amount = iv_amount.
IF is_journey-at_night = abap_true AND lv_class = {{p}}if_toll_pricer=>c_class-lorry.
rv_amount = iv_amount + iv_amount DIV c_night_div.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,56 @@
CLASS ltc_toll_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_toll_pricer.
METHODS setup.
METHODS car_toll FOR TESTING.
METHODS minimum_toll FOR TESTING.
METHODS transponder_discount FOR TESTING.
METHODS night_lorry FOR TESTING.
METHODS unknown_class FOR TESTING.
METHODS distance_out_of_range FOR TESTING.
ENDCLASS.
CLASS ltc_toll_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}toll_pricer( ).
ENDMETHOD.
METHOD car_toll.
DATA(ls_result) = mo_cut->price_journey( VALUE #( vehicle_class = 'C' distance_km = 50 ) ).
cl_abap_unit_assert=>assert_equals( exp = 500 act = ls_result-amount_cents ).
ENDMETHOD.
METHOD minimum_toll.
DATA(ls_result) = mo_cut->price_journey( VALUE #( vehicle_class = 'M' distance_km = 5 ) ).
cl_abap_unit_assert=>assert_equals( exp = 100 act = ls_result-amount_cents ).
ENDMETHOD.
METHOD transponder_discount.
DATA(ls_result) = mo_cut->price_journey( VALUE #( vehicle_class = 'C'
distance_km = 100
has_transponder = abap_true ) ).
cl_abap_unit_assert=>assert_equals( exp = 900 act = ls_result-amount_cents ).
ENDMETHOD.
METHOD night_lorry.
DATA(ls_result) = mo_cut->price_journey( VALUE #( vehicle_class = 'L'
distance_km = 100
at_night = abap_true ) ).
cl_abap_unit_assert=>assert_equals( exp = 3750 act = ls_result-amount_cents ).
ENDMETHOD.
METHOD unknown_class.
DATA(ls_result) = mo_cut->price_journey( VALUE #( vehicle_class = 'X' distance_km = 50 ) ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_toll_pricer=>c_reason-vehicle
act = ls_result-reason ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_result-amount_cents ).
ENDMETHOD.
METHOD distance_out_of_range.
DATA(ls_result) = mo_cut->price_journey( VALUE #( vehicle_class = 'C' distance_km = 131 ) ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_toll_pricer=>c_reason-distance
act = ls_result-reason ).
ENDMETHOD.
ENDCLASS.