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/faulty/m0_rack_billing.clas.abap
Normal file
116
tasks_gen/train/G1053/faulty/m0_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.
|
||||
116
tasks_gen/train/G1053/faulty/m1_rack_billing.clas.abap
Normal file
116
tasks_gen/train/G1053/faulty/m1_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.
|
||||
116
tasks_gen/train/G1053/faulty/m2_rack_billing.clas.abap
Normal file
116
tasks_gen/train/G1053/faulty/m2_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 * ( 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.
|
||||
116
tasks_gen/train/G1053/faulty/m3_rack_billing.clas.abap
Normal file
116
tasks_gen/train/G1053/faulty/m3_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.
|
||||
116
tasks_gen/train/G1053/faulty/m4_rack_billing.clas.abap
Normal file
116
tasks_gen/train/G1053/faulty/m4_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.
|
||||
29
tasks_gen/train/G1053/generation.json
Normal file
29
tasks_gen/train/G1053/generation.json
Normal 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
|
||||
}
|
||||
157
tasks_gen/train/G1053/hidden/t02_hidden.clas.abap
Normal file
157
tasks_gen/train/G1053/hidden/t02_hidden.clas.abap
Normal 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.
|
||||
93
tasks_gen/train/G1053/mutation.json
Normal file
93
tasks_gen/train/G1053/mutation.json
Normal 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
|
||||
}
|
||||
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.
|
||||
76
tasks_gen/train/G1053/spec.md
Normal file
76
tasks_gen/train/G1053/spec.md
Normal 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.
|
||||
42
tasks_gen/train/G1053/task.json
Normal file
42
tasks_gen/train/G1053/task.json
Normal 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"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user