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,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.

View File

@@ -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.