Stage 2 summary at 50 accepted trajectories
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
116
tasks_gen/train/G1053/reference/rack_billing.clas.abap
Normal file
116
tasks_gen/train/G1053/reference/rack_billing.clas.abap
Normal file
@@ -0,0 +1,116 @@
|
||||
CLASS {{p}}rack_billing DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_size TYPE c LENGTH 1.
|
||||
TYPES ty_power TYPE c LENGTH 1.
|
||||
TYPES ty_customer TYPE c LENGTH 10.
|
||||
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
|
||||
|
||||
TYPES:
|
||||
BEGIN OF ty_rack,
|
||||
rack_id TYPE c LENGTH 10,
|
||||
customer TYPE ty_customer,
|
||||
size_class TYPE ty_size,
|
||||
power_class TYPE ty_power,
|
||||
END OF ty_rack.
|
||||
TYPES tt_racks TYPE STANDARD TABLE OF ty_rack WITH EMPTY KEY.
|
||||
|
||||
TYPES:
|
||||
BEGIN OF ty_bill,
|
||||
customer TYPE ty_customer,
|
||||
rack_count TYPE i,
|
||||
total_fee TYPE ty_fee,
|
||||
END OF ty_bill.
|
||||
TYPES tt_bills TYPE STANDARD TABLE OF ty_bill WITH EMPTY KEY.
|
||||
|
||||
METHODS calculate
|
||||
IMPORTING it_racks TYPE tt_racks
|
||||
RETURNING VALUE(rt_bills) TYPE tt_bills.
|
||||
|
||||
PRIVATE SECTION.
|
||||
TYPES:
|
||||
BEGIN OF ty_price,
|
||||
size_class TYPE ty_size,
|
||||
power_class TYPE ty_power,
|
||||
fee TYPE ty_fee,
|
||||
END OF ty_price.
|
||||
TYPES tt_prices TYPE HASHED TABLE OF ty_price WITH UNIQUE KEY size_class power_class.
|
||||
TYPES tt_seen TYPE HASHED TABLE OF ty_rack WITH UNIQUE KEY rack_id.
|
||||
TYPES tt_bill_hash TYPE HASHED TABLE OF ty_bill WITH UNIQUE KEY customer.
|
||||
|
||||
METHODS price_list
|
||||
RETURNING VALUE(rt_prices) TYPE tt_prices.
|
||||
METHODS rack_fee
|
||||
IMPORTING is_rack TYPE ty_rack
|
||||
it_prices TYPE tt_prices
|
||||
RETURNING VALUE(rv_fee) TYPE ty_fee.
|
||||
METHODS discount_percent
|
||||
IMPORTING iv_count TYPE i
|
||||
RETURNING VALUE(rv_percent) TYPE i.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}rack_billing IMPLEMENTATION.
|
||||
METHOD calculate.
|
||||
DATA(lt_prices) = price_list( ).
|
||||
DATA lt_seen TYPE tt_seen.
|
||||
DATA lt_bills TYPE tt_bill_hash.
|
||||
|
||||
LOOP AT it_racks INTO DATA(ls_rack).
|
||||
INSERT ls_rack INTO TABLE lt_seen.
|
||||
IF sy-subrc <> 0.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_fee) = rack_fee( is_rack = ls_rack it_prices = lt_prices ).
|
||||
IF lv_fee IS INITIAL.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
|
||||
ASSIGN lt_bills[ customer = ls_rack-customer ] TO FIELD-SYMBOL(<ls_bill>).
|
||||
IF sy-subrc <> 0.
|
||||
INSERT VALUE #( customer = ls_rack-customer ) INTO TABLE lt_bills ASSIGNING <ls_bill>.
|
||||
ENDIF.
|
||||
<ls_bill>-rack_count = <ls_bill>-rack_count + 1.
|
||||
<ls_bill>-total_fee = <ls_bill>-total_fee + lv_fee.
|
||||
ENDLOOP.
|
||||
|
||||
LOOP AT lt_bills ASSIGNING <ls_bill>.
|
||||
DATA(lv_percent) = discount_percent( <ls_bill>-rack_count ).
|
||||
<ls_bill>-total_fee = <ls_bill>-total_fee * ( 100 - lv_percent ) / 100.
|
||||
INSERT VALUE #( customer = <ls_bill>-customer
|
||||
rack_count = <ls_bill>-rack_count
|
||||
total_fee = <ls_bill>-total_fee ) INTO TABLE rt_bills.
|
||||
ENDLOOP.
|
||||
|
||||
SORT rt_bills BY customer.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD price_list.
|
||||
rt_prices = VALUE #(
|
||||
( size_class = 'S' power_class = 'A' fee = '50.00' )
|
||||
( size_class = 'S' power_class = 'B' fee = '80.00' )
|
||||
( size_class = 'S' power_class = 'C' fee = '120.00' )
|
||||
( size_class = 'M' power_class = 'A' fee = '120.00' )
|
||||
( size_class = 'M' power_class = 'B' fee = '150.00' )
|
||||
( size_class = 'M' power_class = 'C' fee = '190.00' )
|
||||
( size_class = 'L' power_class = 'A' fee = '250.00' )
|
||||
( size_class = 'L' power_class = 'B' fee = '280.00' )
|
||||
( size_class = 'L' power_class = 'C' fee = '320.00' ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rack_fee.
|
||||
ASSIGN it_prices[ size_class = is_rack-size_class power_class = is_rack-power_class ]
|
||||
TO FIELD-SYMBOL(<ls_price>).
|
||||
IF sy-subrc = 0.
|
||||
rv_fee = <ls_price>-fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD discount_percent.
|
||||
IF iv_count >= 20.
|
||||
rv_percent = 20.
|
||||
ELSEIF iv_count >= 10.
|
||||
rv_percent = 10.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
@@ -0,0 +1,88 @@
|
||||
CLASS ltc_rack_billing DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||
PRIVATE SECTION.
|
||||
DATA mo_cut TYPE REF TO {{p}}rack_billing.
|
||||
|
||||
METHODS setup.
|
||||
METHODS assert_amount
|
||||
IMPORTING iv_expected TYPE {{p}}rack_billing=>ty_fee
|
||||
iv_actual TYPE {{p}}rack_billing=>ty_fee.
|
||||
|
||||
METHODS one_rack FOR TESTING.
|
||||
METHODS groups_by_customer FOR TESTING.
|
||||
METHODS applies_discount FOR TESTING.
|
||||
METHODS ignores_invalid_rack FOR TESTING.
|
||||
METHODS ignores_duplicate_rack FOR TESTING.
|
||||
METHODS empty_input FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltc_rack_billing IMPLEMENTATION.
|
||||
METHOD setup.
|
||||
mo_cut = NEW {{p}}rack_billing( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD assert_amount.
|
||||
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD one_rack.
|
||||
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
|
||||
lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ALPHA'
|
||||
size_class = 'M' power_class = 'B' ) ).
|
||||
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ).
|
||||
assert_amount( iv_expected = '150.00' iv_actual = lt_bills[ 1 ]-total_fee ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD groups_by_customer.
|
||||
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
|
||||
lt_racks = VALUE #(
|
||||
( rack_id = 'R001' customer = 'ALPHA' size_class = 'S' power_class = 'C' )
|
||||
( rack_id = 'R002' customer = 'ALPHA' size_class = 'L' power_class = 'A' )
|
||||
( rack_id = 'R003' customer = 'BETA' size_class = 'M' power_class = 'B' ) ).
|
||||
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_bills ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_bills[ 1 ]-rack_count ).
|
||||
assert_amount( iv_expected = '370.00' iv_actual = lt_bills[ 1 ]-total_fee ).
|
||||
assert_amount( iv_expected = '150.00' iv_actual = lt_bills[ 2 ]-total_fee ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD applies_discount.
|
||||
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
|
||||
DO 10 TIMES.
|
||||
INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA'
|
||||
size_class = 'M' power_class = 'B' ) INTO TABLE lt_racks.
|
||||
ENDDO.
|
||||
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 10 act = lt_bills[ 1 ]-rack_count ).
|
||||
assert_amount( iv_expected = '1350.00' iv_actual = lt_bills[ 1 ]-total_fee ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD ignores_invalid_rack.
|
||||
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
|
||||
lt_racks = VALUE #(
|
||||
( rack_id = 'R001' customer = 'ALPHA' size_class = 'S' power_class = 'D' )
|
||||
( rack_id = 'R002' customer = 'ALPHA' size_class = 'M' power_class = 'A' ) ).
|
||||
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ).
|
||||
assert_amount( iv_expected = '120.00' iv_actual = lt_bills[ 1 ]-total_fee ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD ignores_duplicate_rack.
|
||||
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
|
||||
lt_racks = VALUE #(
|
||||
( rack_id = 'R001' customer = 'ALPHA' size_class = 'S' power_class = 'A' )
|
||||
( rack_id = 'R001' customer = 'ALPHA' size_class = 'L' power_class = 'C' ) ).
|
||||
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ).
|
||||
assert_amount( iv_expected = '50.00' iv_actual = lt_bills[ 1 ]-total_fee ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD empty_input.
|
||||
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
|
||||
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
|
||||
cl_abap_unit_assert=>assert_initial( lt_bills ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
Reference in New Issue
Block a user