Step F first pass: 81/92 accepted; budget floor 60 calls; rejected slots moved for regeneration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 12:10:52 +02:00
parent d3250acfb8
commit 39769afce8
741 changed files with 40573 additions and 317 deletions

View File

@@ -0,0 +1,74 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS subtotal
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
RETURNING VALUE(rv_subtotal) TYPE ty_price.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
METHODS floor_surcharge
IMPORTING iv_floor TYPE i
RETURNING VALUE(rv_surcharge) TYPE ty_price.
METHODS weekend_surcharge
IMPORTING iv_subtotal TYPE ty_price
RETURNING VALUE(rv_surcharge) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA(lv_subtotal) = subtotal( iv_distance_km = iv_distance_km
iv_volume_m3 = iv_volume_m3
iv_floor = iv_floor
iv_packing = iv_packing ).
rv_price = lv_subtotal.
IF iv_weekend = abap_false.
rv_price = rv_price + weekend_surcharge( lv_subtotal ).
ENDIF.
ENDMETHOD.
METHOD subtotal.
rv_subtotal = c_base_fee + iv_volume_m3 * c_volume_fee
+ distance_fee( iv_distance_km )
+ floor_surcharge( iv_floor ).
IF iv_packing = abap_true.
rv_subtotal = rv_subtotal + c_packing_fee.
ENDIF.
ENDMETHOD.
METHOD distance_fee.
rv_fee = iv_distance_km * c_distance_fee.
ENDMETHOD.
METHOD floor_surcharge.
IF iv_floor > 0.
rv_surcharge = iv_floor * c_floor_fee.
ENDIF.
ENDMETHOD.
METHOD weekend_surcharge.
rv_surcharge = round( val = iv_subtotal * c_weekend_rate dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS subtotal
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
RETURNING VALUE(rv_subtotal) TYPE ty_price.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
METHODS floor_surcharge
IMPORTING iv_floor TYPE i
RETURNING VALUE(rv_surcharge) TYPE ty_price.
METHODS weekend_surcharge
IMPORTING iv_subtotal TYPE ty_price
RETURNING VALUE(rv_surcharge) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA(lv_subtotal) = subtotal( iv_distance_km = iv_distance_km
iv_volume_m3 = iv_volume_m3
iv_floor = iv_floor
iv_packing = iv_packing ).
rv_price = lv_subtotal.
IF iv_weekend = abap_true.
rv_price = rv_price + weekend_surcharge( lv_subtotal ).
ENDIF.
ENDMETHOD.
METHOD subtotal.
rv_subtotal = c_base_fee + iv_volume_m3 * c_volume_fee
+ distance_fee( iv_distance_km )
+ floor_surcharge( iv_floor ).
IF iv_packing <> abap_true.
rv_subtotal = rv_subtotal + c_packing_fee.
ENDIF.
ENDMETHOD.
METHOD distance_fee.
rv_fee = iv_distance_km * c_distance_fee.
ENDMETHOD.
METHOD floor_surcharge.
IF iv_floor > 0.
rv_surcharge = iv_floor * c_floor_fee.
ENDIF.
ENDMETHOD.
METHOD weekend_surcharge.
rv_surcharge = round( val = iv_subtotal * c_weekend_rate dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS subtotal
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
RETURNING VALUE(rv_subtotal) TYPE ty_price.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
METHODS floor_surcharge
IMPORTING iv_floor TYPE i
RETURNING VALUE(rv_surcharge) TYPE ty_price.
METHODS weekend_surcharge
IMPORTING iv_subtotal TYPE ty_price
RETURNING VALUE(rv_surcharge) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA(lv_subtotal) = subtotal( iv_distance_km = iv_distance_km
iv_volume_m3 = iv_volume_m3
iv_floor = iv_floor
iv_packing = iv_packing ).
rv_price = lv_subtotal.
IF iv_weekend = abap_true.
rv_price = rv_price + weekend_surcharge( lv_subtotal ).
ENDIF.
ENDMETHOD.
METHOD subtotal.
rv_subtotal = c_base_fee + iv_volume_m3 * c_volume_fee
+ distance_fee( iv_distance_km )
+ floor_surcharge( iv_floor ).
IF iv_packing = abap_true.
rv_subtotal = rv_subtotal + c_packing_fee.
ENDIF.
ENDMETHOD.
METHOD distance_fee.
rv_fee = iv_distance_km * c_distance_fee.
ENDMETHOD.
METHOD floor_surcharge.
IF iv_floor <= 0.
rv_surcharge = iv_floor * c_floor_fee.
ENDIF.
ENDMETHOD.
METHOD weekend_surcharge.
rv_surcharge = round( val = iv_subtotal * c_weekend_rate dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS subtotal
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
RETURNING VALUE(rv_subtotal) TYPE ty_price.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
METHODS floor_surcharge
IMPORTING iv_floor TYPE i
RETURNING VALUE(rv_surcharge) TYPE ty_price.
METHODS weekend_surcharge
IMPORTING iv_subtotal TYPE ty_price
RETURNING VALUE(rv_surcharge) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA(lv_subtotal) = subtotal( iv_distance_km = iv_distance_km
iv_volume_m3 = iv_volume_m3
iv_floor = iv_floor
iv_packing = iv_packing ).
rv_price = lv_subtotal.
IF iv_weekend = abap_true.
rv_price = rv_price + weekend_surcharge( lv_subtotal ).
ENDIF.
ENDMETHOD.
METHOD subtotal.
rv_subtotal = c_base_fee + iv_volume_m3 * c_volume_fee
+ distance_fee( iv_distance_km )
+ floor_surcharge( iv_floor ).
IF iv_packing = abap_true.
rv_subtotal = rv_subtotal + c_packing_fee.
ENDIF.
ENDMETHOD.
METHOD distance_fee.
rv_fee = iv_distance_km * c_distance_fee.
ENDMETHOD.
METHOD floor_surcharge.
IF iv_floor > 0.
rv_surcharge = iv_floor / c_floor_fee.
ENDIF.
ENDMETHOD.
METHOD weekend_surcharge.
rv_surcharge = round( val = iv_subtotal * c_weekend_rate dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS subtotal
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
RETURNING VALUE(rv_subtotal) TYPE ty_price.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
METHODS floor_surcharge
IMPORTING iv_floor TYPE i
RETURNING VALUE(rv_surcharge) TYPE ty_price.
METHODS weekend_surcharge
IMPORTING iv_subtotal TYPE ty_price
RETURNING VALUE(rv_surcharge) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA(lv_subtotal) = subtotal( iv_distance_km = iv_distance_km
iv_volume_m3 = iv_volume_m3
iv_floor = iv_floor
iv_packing = iv_packing ).
rv_price = lv_subtotal.
IF iv_weekend = abap_true.
rv_price = rv_price + weekend_surcharge( lv_subtotal ).
ENDIF.
ENDMETHOD.
METHOD subtotal.
rv_subtotal = c_base_fee + iv_volume_m3 * c_volume_fee
+ distance_fee( iv_distance_km )
+ floor_surcharge( iv_floor ).
IF iv_packing = abap_true.
rv_subtotal = rv_subtotal + c_packing_fee.
ENDIF.
ENDMETHOD.
METHOD distance_fee.
rv_fee = iv_distance_km * c_distance_fee.
ENDMETHOD.
METHOD floor_surcharge.
IF iv_floor > 0.
rv_surcharge = iv_floor * c_floor_fee.
ENDIF.
ENDMETHOD.
METHOD weekend_surcharge.
rv_surcharge = round( val = iv_subtotal / c_weekend_rate dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,19 @@
{
"id": "G0167",
"pool": "eval",
"object_type": "CLAS",
"category": "I",
"attempts": [
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,142 @@
CLASS {{p}}move_pricer_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
DATA mo_cut TYPE REF TO {{p}}move_pricer.
METHODS setup.
METHODS base_fee_only FOR TESTING.
METHODS volume_fee FOR TESTING.
METHODS distance_15_km FOR TESTING.
METHODS first_floor_surcharge FOR TESTING.
METHODS third_floor_surcharge FOR TESTING.
METHODS packing_fee FOR TESTING.
METHODS weekend_on_subtotal FOR TESTING.
METHODS weekend_with_packing FOR TESTING.
METHODS no_weekend_no_surcharge FOR TESTING.
METHODS combined_move FOR TESTING.
METHODS constants_unchanged FOR TESTING.
ENDCLASS.
CLASS {{p}}move_pricer_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}move_pricer( ).
ENDMETHOD.
METHOD base_fee_only.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '250.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD volume_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '410.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 4
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD distance_15_km.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '268.00' )
act = mo_cut->calculate( iv_distance_km = 15
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD first_floor_surcharge.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '265.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 1
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD third_floor_surcharge.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '295.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 3
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD packing_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '430.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_true
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD weekend_on_subtotal.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '441.28' )
act = mo_cut->calculate( iv_distance_km = 20
iv_volume_m3 = 3
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_true ) ).
ENDMETHOD.
METHOD weekend_with_packing.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '481.60' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_true
iv_weekend = abap_true ) ).
ENDMETHOD.
METHOD no_weekend_no_surcharge.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '482.00' )
act = mo_cut->calculate( iv_distance_km = 10
iv_volume_m3 = 1
iv_floor = 0
iv_packing = abap_true
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD combined_move.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '669.76' )
act = mo_cut->calculate( iv_distance_km = 15
iv_volume_m3 = 3
iv_floor = 2
iv_packing = abap_true
iv_weekend = abap_true ) ).
ENDMETHOD.
METHOD constants_unchanged.
cl_abap_unit_assert=>assert_equals( exp = CONV ty_price( '250.00' )
act = {{p}}move_pricer=>c_base_fee ).
cl_abap_unit_assert=>assert_equals( exp = CONV ty_price( '40.00' )
act = {{p}}move_pricer=>c_volume_fee ).
cl_abap_unit_assert=>assert_equals( exp = CONV ty_price( '1.20' )
act = {{p}}move_pricer=>c_distance_fee ).
cl_abap_unit_assert=>assert_equals( exp = CONV ty_price( '15.00' )
act = {{p}}move_pricer=>c_floor_fee ).
cl_abap_unit_assert=>assert_equals( exp = CONV ty_price( '180.00' )
act = {{p}}move_pricer=>c_packing_fee ).
cl_abap_unit_assert=>assert_equals( exp = CONV ty_price( '0.12' )
act = {{p}}move_pricer=>c_weekend_rate ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,78 @@
{
"task": "G0167",
"mutants": [
{
"object": "{{P}}MOVE_PRICER",
"mutant": "line 47: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "1/11",
"failed_tests": [
"BASE_FEE_ONLY",
"COMBINED_MOVE",
"DISTANCE_15_KM",
"FIRST_FLOOR_SURCHARGE",
"NO_WEEKEND_NO_SURCHARGE",
"PACKING_FEE",
"THIRD_FLOOR_SURCHARGE",
"VOLUME_FEE",
"WEEKEND_ON_SUBTOTAL",
"WEEKEND_WITH_PACKING"
]
},
{
"object": "{{P}}MOVE_PRICER",
"mutant": "line 56: = -> <> (eq)",
"status": "killed",
"hidden": "1/11",
"failed_tests": [
"BASE_FEE_ONLY",
"COMBINED_MOVE",
"DISTANCE_15_KM",
"FIRST_FLOOR_SURCHARGE",
"NO_WEEKEND_NO_SURCHARGE",
"PACKING_FEE",
"THIRD_FLOOR_SURCHARGE",
"VOLUME_FEE",
"WEEKEND_ON_SUBTOTAL",
"WEEKEND_WITH_PACKING"
]
},
{
"object": "{{P}}MOVE_PRICER",
"mutant": "line 66: > -> <= (rel)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"COMBINED_MOVE",
"FIRST_FLOOR_SURCHARGE",
"THIRD_FLOOR_SURCHARGE"
]
},
{
"object": "{{P}}MOVE_PRICER",
"mutant": "line 67: * -> / (arith)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"COMBINED_MOVE",
"FIRST_FLOOR_SURCHARGE",
"THIRD_FLOOR_SURCHARGE"
]
},
{
"object": "{{P}}MOVE_PRICER",
"mutant": "line 72: * -> / (arith)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"COMBINED_MOVE",
"WEEKEND_ON_SUBTOTAL",
"WEEKEND_WITH_PACKING"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,74 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS subtotal
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
RETURNING VALUE(rv_subtotal) TYPE ty_price.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
METHODS floor_surcharge
IMPORTING iv_floor TYPE i
RETURNING VALUE(rv_surcharge) TYPE ty_price.
METHODS weekend_surcharge
IMPORTING iv_subtotal TYPE ty_price
RETURNING VALUE(rv_surcharge) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA(lv_subtotal) = subtotal( iv_distance_km = iv_distance_km
iv_volume_m3 = iv_volume_m3
iv_floor = iv_floor
iv_packing = iv_packing ).
rv_price = lv_subtotal.
IF iv_weekend = abap_true.
rv_price = rv_price + weekend_surcharge( lv_subtotal ).
ENDIF.
ENDMETHOD.
METHOD subtotal.
rv_subtotal = c_base_fee + iv_volume_m3 * c_volume_fee
+ distance_fee( iv_distance_km )
+ floor_surcharge( iv_floor ).
IF iv_packing = abap_true.
rv_subtotal = rv_subtotal + c_packing_fee.
ENDIF.
ENDMETHOD.
METHOD distance_fee.
rv_fee = iv_distance_km * c_distance_fee.
ENDMETHOD.
METHOD floor_surcharge.
IF iv_floor > 0.
rv_surcharge = iv_floor * c_floor_fee.
ENDIF.
ENDMETHOD.
METHOD weekend_surcharge.
rv_surcharge = round( val = iv_subtotal * c_weekend_rate dec = 2 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,81 @@
CLASS ltc_move_pricer DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
DATA mo_cut TYPE REF TO {{p}}move_pricer.
METHODS setup.
METHODS base_fee_only FOR TESTING.
METHODS distance_fee FOR TESTING.
METHODS first_floor FOR TESTING.
METHODS packing_fee FOR TESTING.
METHODS weekend_surcharge FOR TESTING.
METHODS combined_move FOR TESTING.
ENDCLASS.
CLASS ltc_move_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}move_pricer( ).
ENDMETHOD.
METHOD base_fee_only.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '250.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD distance_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '268.00' )
act = mo_cut->calculate( iv_distance_km = 15
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD first_floor.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '265.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 1
iv_packing = abap_false
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD packing_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '430.00' )
act = mo_cut->calculate( iv_distance_km = 0
iv_volume_m3 = 0
iv_floor = 0
iv_packing = abap_true
iv_weekend = abap_false ) ).
ENDMETHOD.
METHOD weekend_surcharge.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '441.28' )
act = mo_cut->calculate( iv_distance_km = 20
iv_volume_m3 = 3
iv_floor = 0
iv_packing = abap_false
iv_weekend = abap_true ) ).
ENDMETHOD.
METHOD combined_move.
cl_abap_unit_assert=>assert_equals(
exp = CONV ty_price( '669.76' )
act = mo_cut->calculate( iv_distance_km = 15
iv_volume_m3 = 3
iv_floor = 2
iv_packing = abap_true
iv_weekend = abap_true ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,48 @@
CLASS {{p}}move_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_base_fee TYPE ty_price VALUE '250.00',
c_volume_fee TYPE ty_price VALUE '40.00',
c_distance_fee TYPE ty_price VALUE '1.20',
c_floor_fee TYPE ty_price VALUE '15.00',
c_packing_fee TYPE ty_price VALUE '180.00',
c_weekend_rate TYPE ty_price VALUE '0.12'.
METHODS calculate
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
METHODS distance_fee
IMPORTING iv_distance_km TYPE i
RETURNING VALUE(rv_fee) TYPE ty_price.
ENDCLASS.
CLASS {{p}}move_pricer IMPLEMENTATION.
METHOD calculate.
DATA lv_price TYPE ty_price.
lv_price = c_base_fee + iv_volume_m3 * c_volume_fee.
lv_price = lv_price + distance_fee( iv_distance_km ).
IF iv_floor > 0.
lv_price = lv_price + ( iv_floor - 1 ) * c_floor_fee.
ENDIF.
IF iv_packing = abap_true.
lv_price = lv_price + c_packing_fee.
ENDIF.
IF iv_weekend = abap_true.
lv_price = lv_price + round( val = c_base_fee * c_weekend_rate dec = 2 ).
ENDIF.
rv_price = lv_price.
ENDMETHOD.
METHOD distance_fee.
rv_fee = ( iv_distance_km DIV 10 ) * 10 * c_distance_fee.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,64 @@
# 1. Goal
The class {{P}}MOVE_PRICER calculates the price of a house move for a moving
company. Users report three defects in the calculation. Fix the class. All other
behavior stays the same.
# 2. Open questions
None.
# 3. Context
- The class {{P}}MOVE_PRICER exists in package $TMP. It is active.
- The class is public and final. It has a public constructor without parameters.
- The public section contains the type TY_PRICE and the constants C_BASE_FEE,
C_VOLUME_FEE, C_DISTANCE_FEE, C_FLOOR_FEE, C_PACKING_FEE and C_WEEKEND_RATE.
- The class has one public method:
CALCULATE
IMPORTING iv_distance_km TYPE i
iv_volume_m3 TYPE i
iv_floor TYPE i
iv_packing TYPE abap_bool
iv_weekend TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
- CALCULATE gives the price of one move. The price has these parts: a base fee, a
volume fee, a distance fee, a floor surcharge, a packing fee and a weekend
surcharge.
# 4. Contract
- Fix the class {{P}}MOVE_PRICER in package $TMP.
- Keep the public interface. The type TY_PRICE, the constants and the signature of
CALCULATE stay the same.
- Do not add public methods. Do not rename the class.
# 5. Business rules
The price has these parts:
1. Base fee: 250.00 EUR for each move.
2. Volume fee: 40.00 EUR for each cubic metre of the move (iv_volume_m3).
3. Distance fee: 1.20 EUR for each kilometre of the distance (iv_distance_km).
4. Floor surcharge: 15.00 EUR for each floor above the ground floor. iv_floor is
the floor number. Floor 0 is the ground floor. If iv_floor is 0 or less, the
surcharge is 0.00 EUR.
5. Packing fee: 180.00 EUR if iv_packing is abap_true. Else 0.00 EUR.
6. Subtotal: the sum of the parts 1 to 5.
7. Weekend surcharge: if iv_weekend is abap_true, add 12 % of the subtotal,
rounded to 2 decimal places. Else add 0.00 EUR.
8. The price is the subtotal plus the weekend surcharge.
The input values are not negative.
Users report these defects:
- A move over 15 km is charged a distance fee for only 10 km. Every kilometre
must be charged.
- A move to the first floor is free. The first floor must cost 15.00 EUR. A move
to the third floor costs 30.00 EUR. It must cost 45.00 EUR.
- A weekend move is always charged a weekend surcharge of 30.00 EUR. The
surcharge must be 12 % of the subtotal.
# 6. Constraints
- Release target: SAP_BASIS 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 objects.
# 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,47 @@
{
"id": "G0167",
"category": "I",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [
{
"type": "CLAS",
"name": "{{P}}MOVE_PRICER",
"file": "seed/move_pricer.clas.abap",
"description": "Faulty move price class with three defects"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}MOVE_PRICER"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}MOVE_PRICER_HIDDEN",
"file": "hidden/move_pricer_hidden.clas.abap",
"description": "Hidden tests for the move price class"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}MOVE_PRICER",
"file": "reference/move_pricer.clas.abap",
"description": "Corrected move price class",
"testclasses_file": "reference/move_pricer.testclasses.abap"
}
],
"craft_checks": [
"method_length"
]
}