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,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,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 * ( 101 - 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,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,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,29 @@
{
"id": "G1053",
"pool": "train",
"object_type": "CLAS",
"category": "C",
"attempts": [
{
"stage": "bundle",
"errors": [
"hidden/t02_hidden.clas.abap line 7: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"METHODS\"",
"reference/rack_billing.testclasses.abap line 6: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"METHODS\""
],
"by_check": {
"abaplint": 2
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,157 @@
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
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 sums_per_customer FOR TESTING.
METHODS sorted_by_customer FOR TESTING.
METHODS ten_racks_discount FOR TESTING.
METHODS twenty_racks_discount FOR TESTING.
METHODS nine_racks_no_discount FOR TESTING.
METHODS ignores_unknown_size FOR TESTING.
METHODS ignores_unknown_power FOR TESTING.
METHODS ignores_second_rack_id FOR TESTING.
METHODS empty_input FOR TESTING.
METHODS all_classes FOR TESTING.
ENDCLASS.
CLASS {{p}}t02_hidden 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_bills) = mo_cut->calculate( VALUE #( ( rack_id = 'R001' customer = 'ALPHA'
size_class = 'M' power_class = 'B' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ).
cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ).
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 sums_per_customer.
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 = 'R002' customer = 'ALPHA' size_class = 'S' power_class = 'B' )
( rack_id = 'R003' customer = 'ALPHA' size_class = 'M' power_class = 'A' )
( rack_id = 'R004' customer = 'BETA' size_class = 'L' power_class = 'C' ) ).
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 = 3 act = lt_bills[ 1 ]-rack_count ).
assert_amount( iv_expected = '250.00' iv_actual = lt_bills[ 1 ]-total_fee ).
cl_abap_unit_assert=>assert_equals( exp = 'BETA' act = lt_bills[ 2 ]-customer ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 2 ]-rack_count ).
assert_amount( iv_expected = '320.00' iv_actual = lt_bills[ 2 ]-total_fee ).
ENDMETHOD.
METHOD sorted_by_customer.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
lt_racks = VALUE #(
( rack_id = 'R001' customer = 'ZULU' size_class = 'S' power_class = 'A' )
( rack_id = 'R002' customer = 'ALPHA' size_class = 'S' power_class = 'A' )
( rack_id = 'R003' customer = 'MIKE' size_class = 'S' power_class = 'A' ) ).
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_bills ) ).
cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ).
cl_abap_unit_assert=>assert_equals( exp = 'MIKE' act = lt_bills[ 2 ]-customer ).
cl_abap_unit_assert=>assert_equals( exp = 'ZULU' act = lt_bills[ 3 ]-customer ).
ENDMETHOD.
METHOD ten_racks_discount.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
DO 10 TIMES.
INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA'
size_class = 'S' power_class = 'A' ) INTO TABLE lt_racks.
ENDDO.
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 = 10 act = lt_bills[ 1 ]-rack_count ).
assert_amount( iv_expected = '450.00' iv_actual = lt_bills[ 1 ]-total_fee ).
ENDMETHOD.
METHOD twenty_racks_discount.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
DO 20 TIMES.
INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA'
size_class = 'S' power_class = 'A' ) INTO TABLE lt_racks.
ENDDO.
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
cl_abap_unit_assert=>assert_equals( exp = 20 act = lt_bills[ 1 ]-rack_count ).
assert_amount( iv_expected = '800.00' iv_actual = lt_bills[ 1 ]-total_fee ).
ENDMETHOD.
METHOD nine_racks_no_discount.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
DO 9 TIMES.
INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA'
size_class = 'S' power_class = 'A' ) INTO TABLE lt_racks.
ENDDO.
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
cl_abap_unit_assert=>assert_equals( exp = 9 act = lt_bills[ 1 ]-rack_count ).
assert_amount( iv_expected = '450.00' iv_actual = lt_bills[ 1 ]-total_fee ).
ENDMETHOD.
METHOD ignores_unknown_size.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
lt_racks = VALUE #(
( rack_id = 'R001' customer = 'ALPHA' size_class = 'X' power_class = 'A' )
( rack_id = 'R002' customer = 'ALPHA' size_class = 'S' power_class = 'A' ) ).
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 = '50.00' iv_actual = lt_bills[ 1 ]-total_fee ).
ENDMETHOD.
METHOD ignores_unknown_power.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
lt_racks = VALUE #(
( rack_id = 'R001' customer = 'ALPHA' size_class = 'L' power_class = 'Z' )
( rack_id = 'R002' customer = 'ALPHA' size_class = 'L' 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 = '280.00' iv_actual = lt_bills[ 1 ]-total_fee ).
ENDMETHOD.
METHOD ignores_second_rack_id.
DATA lt_racks TYPE {{p}}rack_billing=>tt_racks.
lt_racks = VALUE #(
( rack_id = 'R001' customer = 'ALPHA' size_class = 'M' power_class = 'A' )
( rack_id = 'R001' customer = 'BETA' size_class = 'L' power_class = 'C' ) ).
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 = 'ALPHA' act = lt_bills[ 1 ]-customer ).
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 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.
METHOD all_classes.
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 = 'M' power_class = 'C' )
( rack_id = 'R003' customer = 'ALPHA' size_class = 'L' power_class = 'C' ) ).
DATA(lt_bills) = mo_cut->calculate( lt_racks ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lt_bills[ 1 ]-rack_count ).
assert_amount( iv_expected = '630.00' iv_actual = lt_bills[ 1 ]-total_fee ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,93 @@
{
"task": "G1053",
"mutants": [
{
"object": "{{P}}RACK_BILLING",
"mutant": "line 74: + -> - (arith)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"ALL_CLASSES",
"IGNORES_SECOND_RACK_ID",
"IGNORES_UNKNOWN_POWER",
"IGNORES_UNKNOWN_SIZE",
"NINE_RACKS_NO_DISCOUNT",
"ONE_RACK",
"SUMS_PER_CUSTOMER",
"TEN_RACKS_DISCOUNT",
"TWENTY_RACKS_DISCOUNT"
]
},
{
"object": "{{P}}RACK_BILLING",
"mutant": "line 79: * -> / (arith)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"ALL_CLASSES",
"IGNORES_SECOND_RACK_ID",
"IGNORES_UNKNOWN_POWER",
"IGNORES_UNKNOWN_SIZE",
"NINE_RACKS_NO_DISCOUNT",
"ONE_RACK",
"SUMS_PER_CUSTOMER",
"TEN_RACKS_DISCOUNT",
"TWENTY_RACKS_DISCOUNT"
]
},
{
"object": "{{P}}RACK_BILLING",
"mutant": "line 79: 100 -> 101 (const)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"ALL_CLASSES",
"IGNORES_SECOND_RACK_ID",
"IGNORES_UNKNOWN_POWER",
"IGNORES_UNKNOWN_SIZE",
"NINE_RACKS_NO_DISCOUNT",
"ONE_RACK",
"SUMS_PER_CUSTOMER",
"TEN_RACKS_DISCOUNT",
"TWENTY_RACKS_DISCOUNT"
]
},
{
"object": "{{P}}RACK_BILLING",
"mutant": "line 110: >= -> < (rel)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"ALL_CLASSES",
"IGNORES_SECOND_RACK_ID",
"IGNORES_UNKNOWN_POWER",
"IGNORES_UNKNOWN_SIZE",
"NINE_RACKS_NO_DISCOUNT",
"ONE_RACK",
"SUMS_PER_CUSTOMER",
"TEN_RACKS_DISCOUNT",
"TWENTY_RACKS_DISCOUNT"
]
},
{
"object": "{{P}}RACK_BILLING",
"mutant": "line 112: >= -> < (rel)",
"status": "killed",
"hidden": "3/11",
"failed_tests": [
"ALL_CLASSES",
"IGNORES_SECOND_RACK_ID",
"IGNORES_UNKNOWN_POWER",
"IGNORES_UNKNOWN_SIZE",
"NINE_RACKS_NO_DISCOUNT",
"ONE_RACK",
"SUMS_PER_CUSTOMER",
"TEN_RACKS_DISCOUNT"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

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.

View File

@@ -0,0 +1,76 @@
# 1. Goal
A data centre operator bills its customers for the server racks that they rent.
A billing program calls one class for each billing run. The class returns one
row per customer with the number of racks and the monthly fee.
# 2. Open questions
None.
# 3. Context
- There are no seed objects. Create the class in package $TMP.
- A rack has a rack ID, a customer, a size class and a power class.
- The billing input can contain the same rack more than once.
- The class is the only object of this task.
# 4. Contract
Create the class {{P}}RACK_BILLING in package $TMP.
- The class is public and final. It has a public constructor without parameters.
- Public types:
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.
- Public method:
METHODS calculate
IMPORTING it_racks TYPE tt_racks
RETURNING VALUE(rt_bills) TYPE tt_bills.
- Do not add other public methods.
# 5. Business rules
A rack is valid when its size class is S, M or L and its power class is A, B
or C.
1. Read it_racks in the given order.
2. A rack ID identifies one rack. If a rack ID was already read, skip the rack.
Remember the rack ID of every rack that you read, also when the rack is not
valid.
3. If the size class is not S, M or L, or the power class is not A, B or C,
skip the rack.
4. The monthly fee of a valid rack is the base fee of its size class plus the
surcharge of its power class:
- base fee: S = 50.00, M = 120.00, L = 250.00
- power surcharge: A = 0.00, B = 30.00, C = 70.00
5. Add the fee of the rack to the total fee of its customer. Increase the rack
count of the customer by 1.
6. After all racks, apply a volume discount to the total fee of each customer:
- 20 or more racks: 20 percent
- 10 or more racks: 10 percent
- less than 10 racks: no discount
7. The result has one row for each customer with at least one valid rack. The
row contains the customer, the number of valid racks and the total fee after
the discount.
8. Sort the result by customer in ascending order.
9. If it_racks is empty, return an empty table.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP. Method length below 40 statements. No global
variables. No comment that restates the code.
- Out of scope: no other object.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,42 @@
{
"id": "G1053",
"category": "C",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 70,
"max_activations": 18
},
"seed": [],
"contract": [
{
"type": "CLAS",
"name": "{{P}}RACK_BILLING"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T02_HIDDEN",
"file": "hidden/t02_hidden.clas.abap",
"description": "T02 hidden tests for the rack billing class"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}RACK_BILLING",
"file": "reference/rack_billing.clas.abap",
"description": "Rack billing with price lookup, customer grouping and volume discount",
"testclasses_file": "reference/rack_billing.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"table_kind",
"key_access"
]
}