Stage 2 summary at 50 accepted trajectories
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
103
tasks_gen/train/G1063/reference/toll_pricer.clas.abap
Normal file
103
tasks_gen/train/G1063/reference/toll_pricer.clas.abap
Normal 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.
|
||||
56
tasks_gen/train/G1063/reference/toll_pricer.testclasses.abap
Normal file
56
tasks_gen/train/G1063/reference/toll_pricer.testclasses.abap
Normal 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.
|
||||
Reference in New Issue
Block a user