Pipeline controller: plan 2 (hard +, error +50 %), backlog throttle, 2 trajectory workers, stop rules, summaries every 50; budget reserve

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 13:35:54 +02:00
parent 1c4667a0fc
commit 13360292dd
781 changed files with 50211 additions and 22 deletions

View File

@@ -0,0 +1,105 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS c_base_screen TYPE ty_price VALUE '89.00'.
CONSTANTS c_base_battery TYPE ty_price VALUE '19.00'.
CONSTANTS c_base_board TYPE ty_price VALUE '149.00'.
CONSTANTS c_base_camera TYPE ty_price VALUE '59.00'.
CONSTANTS c_base_port TYPE ty_price VALUE '49.00'.
CONSTANTS c_factor_basic TYPE ty_price VALUE '1.00'.
CONSTANTS c_factor_mid TYPE ty_price VALUE '1.10'.
CONSTANTS c_factor_high TYPE ty_price VALUE '1.25'.
CONSTANTS c_express_fee TYPE ty_price VALUE '15.00'.
CONSTANTS c_warranty_rate TYPE ty_price VALUE '0.80'.
CONSTANTS c_minimum_price TYPE ty_price VALUE '25.00'.
METHODS base_price
IMPORTING iv_repair TYPE ty_repair
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS device_factor
IMPORTING iv_device TYPE ty_device
RETURNING VALUE(rv_factor) TYPE ty_price.
METHODS price_with_extras
IMPORTING iv_price TYPE ty_price
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
rv_price = base_price( iv_repair ).
IF rv_price IS INITIAL.
RETURN.
ENDIF.
rv_price = rv_price / device_factor( iv_device ).
rv_price = price_with_extras( iv_price = rv_price
iv_express = iv_express
iv_warranty = iv_warranty ).
IF rv_price < c_minimum_price.
rv_price = c_minimum_price.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_repair.
WHEN c_repair_screen.
rv_price = c_base_screen.
WHEN c_repair_battery.
rv_price = c_base_battery.
WHEN c_repair_board.
rv_price = c_base_board.
WHEN c_repair_camera.
rv_price = c_base_camera.
WHEN c_repair_port.
rv_price = c_base_port.
ENDCASE.
ENDMETHOD.
METHOD device_factor.
CASE iv_device.
WHEN c_device_mid.
rv_factor = c_factor_mid.
WHEN c_device_high.
rv_factor = c_factor_high.
WHEN OTHERS.
rv_factor = c_factor_basic.
ENDCASE.
ENDMETHOD.
METHOD price_with_extras.
rv_price = iv_price.
IF iv_express = abap_true.
rv_price = rv_price + c_express_fee.
ENDIF.
IF iv_warranty = abap_true.
rv_price = rv_price * c_warranty_rate.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS c_base_screen TYPE ty_price VALUE '89.00'.
CONSTANTS c_base_battery TYPE ty_price VALUE '19.00'.
CONSTANTS c_base_board TYPE ty_price VALUE '149.00'.
CONSTANTS c_base_camera TYPE ty_price VALUE '59.00'.
CONSTANTS c_base_port TYPE ty_price VALUE '49.00'.
CONSTANTS c_factor_basic TYPE ty_price VALUE '1.00'.
CONSTANTS c_factor_mid TYPE ty_price VALUE '1.10'.
CONSTANTS c_factor_high TYPE ty_price VALUE '1.25'.
CONSTANTS c_express_fee TYPE ty_price VALUE '15.00'.
CONSTANTS c_warranty_rate TYPE ty_price VALUE '0.80'.
CONSTANTS c_minimum_price TYPE ty_price VALUE '25.00'.
METHODS base_price
IMPORTING iv_repair TYPE ty_repair
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS device_factor
IMPORTING iv_device TYPE ty_device
RETURNING VALUE(rv_factor) TYPE ty_price.
METHODS price_with_extras
IMPORTING iv_price TYPE ty_price
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
rv_price = base_price( iv_repair ).
IF rv_price IS INITIAL.
RETURN.
ENDIF.
rv_price = rv_price * device_factor( iv_device ).
rv_price = price_with_extras( iv_price = rv_price
iv_express = iv_express
iv_warranty = iv_warranty ).
IF rv_price >= c_minimum_price.
rv_price = c_minimum_price.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_repair.
WHEN c_repair_screen.
rv_price = c_base_screen.
WHEN c_repair_battery.
rv_price = c_base_battery.
WHEN c_repair_board.
rv_price = c_base_board.
WHEN c_repair_camera.
rv_price = c_base_camera.
WHEN c_repair_port.
rv_price = c_base_port.
ENDCASE.
ENDMETHOD.
METHOD device_factor.
CASE iv_device.
WHEN c_device_mid.
rv_factor = c_factor_mid.
WHEN c_device_high.
rv_factor = c_factor_high.
WHEN OTHERS.
rv_factor = c_factor_basic.
ENDCASE.
ENDMETHOD.
METHOD price_with_extras.
rv_price = iv_price.
IF iv_express = abap_true.
rv_price = rv_price + c_express_fee.
ENDIF.
IF iv_warranty = abap_true.
rv_price = rv_price * c_warranty_rate.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS c_base_screen TYPE ty_price VALUE '89.00'.
CONSTANTS c_base_battery TYPE ty_price VALUE '19.00'.
CONSTANTS c_base_board TYPE ty_price VALUE '149.00'.
CONSTANTS c_base_camera TYPE ty_price VALUE '59.00'.
CONSTANTS c_base_port TYPE ty_price VALUE '49.00'.
CONSTANTS c_factor_basic TYPE ty_price VALUE '1.00'.
CONSTANTS c_factor_mid TYPE ty_price VALUE '1.10'.
CONSTANTS c_factor_high TYPE ty_price VALUE '1.25'.
CONSTANTS c_express_fee TYPE ty_price VALUE '15.00'.
CONSTANTS c_warranty_rate TYPE ty_price VALUE '0.80'.
CONSTANTS c_minimum_price TYPE ty_price VALUE '25.00'.
METHODS base_price
IMPORTING iv_repair TYPE ty_repair
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS device_factor
IMPORTING iv_device TYPE ty_device
RETURNING VALUE(rv_factor) TYPE ty_price.
METHODS price_with_extras
IMPORTING iv_price TYPE ty_price
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
rv_price = base_price( iv_repair ).
IF rv_price IS INITIAL.
RETURN.
ENDIF.
rv_price = rv_price * device_factor( iv_device ).
rv_price = price_with_extras( iv_price = rv_price
iv_express = iv_express
iv_warranty = iv_warranty ).
IF rv_price < c_minimum_price.
rv_price = c_minimum_price.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_repair.
WHEN c_repair_screen.
rv_price = c_base_screen.
WHEN c_repair_battery.
rv_price = c_base_battery.
WHEN c_repair_board.
rv_price = c_base_board.
WHEN c_repair_camera.
rv_price = c_base_camera.
WHEN c_repair_port.
rv_price = c_base_port.
ENDCASE.
ENDMETHOD.
METHOD device_factor.
CASE iv_device.
WHEN c_device_mid.
rv_factor = c_factor_mid.
WHEN c_device_high.
rv_factor = c_factor_high.
WHEN OTHERS.
rv_factor = c_factor_basic.
ENDCASE.
ENDMETHOD.
METHOD price_with_extras.
rv_price = iv_price.
IF iv_express <> abap_true.
rv_price = rv_price + c_express_fee.
ENDIF.
IF iv_warranty = abap_true.
rv_price = rv_price * c_warranty_rate.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS c_base_screen TYPE ty_price VALUE '89.00'.
CONSTANTS c_base_battery TYPE ty_price VALUE '19.00'.
CONSTANTS c_base_board TYPE ty_price VALUE '149.00'.
CONSTANTS c_base_camera TYPE ty_price VALUE '59.00'.
CONSTANTS c_base_port TYPE ty_price VALUE '49.00'.
CONSTANTS c_factor_basic TYPE ty_price VALUE '1.00'.
CONSTANTS c_factor_mid TYPE ty_price VALUE '1.10'.
CONSTANTS c_factor_high TYPE ty_price VALUE '1.25'.
CONSTANTS c_express_fee TYPE ty_price VALUE '15.00'.
CONSTANTS c_warranty_rate TYPE ty_price VALUE '0.80'.
CONSTANTS c_minimum_price TYPE ty_price VALUE '25.00'.
METHODS base_price
IMPORTING iv_repair TYPE ty_repair
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS device_factor
IMPORTING iv_device TYPE ty_device
RETURNING VALUE(rv_factor) TYPE ty_price.
METHODS price_with_extras
IMPORTING iv_price TYPE ty_price
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
rv_price = base_price( iv_repair ).
IF rv_price IS INITIAL.
RETURN.
ENDIF.
rv_price = rv_price * device_factor( iv_device ).
rv_price = price_with_extras( iv_price = rv_price
iv_express = iv_express
iv_warranty = iv_warranty ).
IF rv_price < c_minimum_price.
rv_price = c_minimum_price.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_repair.
WHEN c_repair_screen.
rv_price = c_base_screen.
WHEN c_repair_battery.
rv_price = c_base_battery.
WHEN c_repair_board.
rv_price = c_base_board.
WHEN c_repair_camera.
rv_price = c_base_camera.
WHEN c_repair_port.
rv_price = c_base_port.
ENDCASE.
ENDMETHOD.
METHOD device_factor.
CASE iv_device.
WHEN c_device_mid.
rv_factor = c_factor_mid.
WHEN c_device_high.
rv_factor = c_factor_high.
WHEN OTHERS.
rv_factor = c_factor_basic.
ENDCASE.
ENDMETHOD.
METHOD price_with_extras.
rv_price = iv_price.
IF iv_express = abap_true.
rv_price = rv_price + c_express_fee.
ENDIF.
IF iv_warranty = abap_false.
rv_price = rv_price * c_warranty_rate.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS c_base_screen TYPE ty_price VALUE '89.00'.
CONSTANTS c_base_battery TYPE ty_price VALUE '19.00'.
CONSTANTS c_base_board TYPE ty_price VALUE '149.00'.
CONSTANTS c_base_camera TYPE ty_price VALUE '59.00'.
CONSTANTS c_base_port TYPE ty_price VALUE '49.00'.
CONSTANTS c_factor_basic TYPE ty_price VALUE '1.00'.
CONSTANTS c_factor_mid TYPE ty_price VALUE '1.10'.
CONSTANTS c_factor_high TYPE ty_price VALUE '1.25'.
CONSTANTS c_express_fee TYPE ty_price VALUE '15.00'.
CONSTANTS c_warranty_rate TYPE ty_price VALUE '0.80'.
CONSTANTS c_minimum_price TYPE ty_price VALUE '25.00'.
METHODS base_price
IMPORTING iv_repair TYPE ty_repair
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS device_factor
IMPORTING iv_device TYPE ty_device
RETURNING VALUE(rv_factor) TYPE ty_price.
METHODS price_with_extras
IMPORTING iv_price TYPE ty_price
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
rv_price = base_price( iv_repair ).
IF rv_price IS INITIAL.
RETURN.
ENDIF.
rv_price = rv_price * device_factor( iv_device ).
rv_price = price_with_extras( iv_price = rv_price
iv_express = iv_express
iv_warranty = iv_warranty ).
IF rv_price < c_minimum_price.
rv_price = c_minimum_price.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_repair.
WHEN c_repair_screen.
rv_price = c_base_screen.
WHEN c_repair_battery.
rv_price = c_base_battery.
WHEN c_repair_board.
rv_price = c_base_board.
WHEN c_repair_camera.
rv_price = c_base_camera.
WHEN c_repair_port.
rv_price = c_base_port.
ENDCASE.
ENDMETHOD.
METHOD device_factor.
CASE iv_device.
WHEN c_device_mid.
rv_factor = c_factor_mid.
WHEN c_device_high.
rv_factor = c_factor_high.
WHEN OTHERS.
rv_factor = c_factor_basic.
ENDCASE.
ENDMETHOD.
METHOD price_with_extras.
rv_price = iv_price.
IF iv_express = abap_true.
rv_price = rv_price + c_express_fee.
ENDIF.
IF iv_warranty = abap_true.
rv_price = rv_price / c_warranty_rate.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,28 @@
{
"id": "G1010",
"pool": "train",
"object_type": "CLAS",
"category": "E",
"attempts": [
{
"stage": "bundle",
"errors": [
"reference/phone_repair_pricer.clas.abap line 27: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"METHODS\""
],
"by_check": {
"abaplint": 1
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,137 @@
CLASS {{p}}t31_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_screen_basic TYPE ty_price VALUE '89.00'.
CONSTANTS c_high_full TYPE ty_price VALUE '101.00'.
CONSTANTS c_mid_board TYPE ty_price VALUE '163.90'.
CONSTANTS c_minimum TYPE ty_price VALUE '25.00'.
CONSTANTS c_zero TYPE ty_price VALUE '0.00'.
CONSTANTS c_port_basic TYPE ty_price VALUE '49.00'.
CONSTANTS c_camera_express TYPE ty_price VALUE '74.00'.
CONSTANTS c_camera_full TYPE ty_price VALUE '59.20'.
CONSTANTS c_port_high TYPE ty_price VALUE '61.25'.
DATA mo_cut TYPE REF TO {{p}}phone_repair_pricer.
METHODS setup.
METHODS screen_basic_plain FOR TESTING.
METHODS screen_high_express_warranty FOR TESTING.
METHODS mid_device_surcharge FOR TESTING.
METHODS battery_minimum_charge FOR TESTING.
METHODS battery_warranty_minimum FOR TESTING.
METHODS unknown_repair_is_zero FOR TESTING.
METHODS unknown_repair_ignores_extras FOR TESTING.
METHODS unknown_device_is_basic FOR TESTING.
METHODS express_adds_fee FOR TESTING.
METHODS warranty_after_express FOR TESTING.
METHODS port_high_no_extras FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}phone_repair_pricer( ).
ENDMETHOD.
METHOD screen_basic_plain.
cl_abap_unit_assert=>assert_equals(
exp = c_screen_basic
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'SCREEN'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD screen_high_express_warranty.
cl_abap_unit_assert=>assert_equals(
exp = c_high_full
act = mo_cut->calculate_price( iv_device = 'HIGH'
iv_repair = 'SCREEN'
iv_express = abap_true
iv_warranty = abap_true ) ).
ENDMETHOD.
METHOD mid_device_surcharge.
cl_abap_unit_assert=>assert_equals(
exp = c_mid_board
act = mo_cut->calculate_price( iv_device = 'MID'
iv_repair = 'BOARD'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD battery_minimum_charge.
cl_abap_unit_assert=>assert_equals(
exp = c_minimum
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'BATTERY'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD battery_warranty_minimum.
cl_abap_unit_assert=>assert_equals(
exp = c_minimum
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'BATTERY'
iv_express = abap_false
iv_warranty = abap_true ) ).
ENDMETHOD.
METHOD unknown_repair_is_zero.
cl_abap_unit_assert=>assert_equals(
exp = c_zero
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'SPEAKER'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD unknown_repair_ignores_extras.
cl_abap_unit_assert=>assert_equals(
exp = c_zero
act = mo_cut->calculate_price( iv_device = 'HIGH'
iv_repair = 'SPEAKER'
iv_express = abap_true
iv_warranty = abap_true ) ).
ENDMETHOD.
METHOD unknown_device_is_basic.
cl_abap_unit_assert=>assert_equals(
exp = c_port_basic
act = mo_cut->calculate_price( iv_device = 'ULTRA'
iv_repair = 'PORT'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD express_adds_fee.
cl_abap_unit_assert=>assert_equals(
exp = c_camera_express
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'CAMERA'
iv_express = abap_true
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD warranty_after_express.
cl_abap_unit_assert=>assert_equals(
exp = c_camera_full
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'CAMERA'
iv_express = abap_true
iv_warranty = abap_true ) ).
ENDMETHOD.
METHOD port_high_no_extras.
cl_abap_unit_assert=>assert_equals(
exp = c_port_high
act = mo_cut->calculate_price( iv_device = 'HIGH'
iv_repair = 'PORT'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,79 @@
{
"task": "G1010",
"mutants": [
{
"object": "{{P}}PHONE_REPAIR_PRICER",
"mutant": "line 60: * -> / (arith)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"MID_DEVICE_SURCHARGE",
"PORT_HIGH_NO_EXTRAS",
"SCREEN_HIGH_EXPRESS_WARRANTY"
]
},
{
"object": "{{P}}PHONE_REPAIR_PRICER",
"mutant": "line 65: < -> >= (rel)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"BATTERY_MINIMUM_CHARGE",
"BATTERY_WARRANTY_MINIMUM",
"EXPRESS_ADDS_FEE",
"MID_DEVICE_SURCHARGE",
"PORT_HIGH_NO_EXTRAS",
"SCREEN_BASIC_PLAIN",
"SCREEN_HIGH_EXPRESS_WARRANTY",
"UNKNOWN_DEVICE_IS_BASIC",
"WARRANTY_AFTER_EXPRESS"
]
},
{
"object": "{{P}}PHONE_REPAIR_PRICER",
"mutant": "line 98: = -> <> (eq)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"BATTERY_MINIMUM_CHARGE",
"BATTERY_WARRANTY_MINIMUM",
"EXPRESS_ADDS_FEE",
"MID_DEVICE_SURCHARGE",
"PORT_HIGH_NO_EXTRAS",
"SCREEN_BASIC_PLAIN",
"SCREEN_HIGH_EXPRESS_WARRANTY",
"UNKNOWN_DEVICE_IS_BASIC",
"WARRANTY_AFTER_EXPRESS"
]
},
{
"object": "{{P}}PHONE_REPAIR_PRICER",
"mutant": "line 101: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "4/11",
"failed_tests": [
"EXPRESS_ADDS_FEE",
"MID_DEVICE_SURCHARGE",
"PORT_HIGH_NO_EXTRAS",
"SCREEN_BASIC_PLAIN",
"SCREEN_HIGH_EXPRESS_WARRANTY",
"UNKNOWN_DEVICE_IS_BASIC",
"WARRANTY_AFTER_EXPRESS"
]
},
{
"object": "{{P}}PHONE_REPAIR_PRICER",
"mutant": "line 102: * -> / (arith)",
"status": "killed",
"hidden": "9/11",
"failed_tests": [
"SCREEN_HIGH_EXPRESS_WARRANTY",
"WARRANTY_AFTER_EXPRESS"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,105 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
PRIVATE SECTION.
CONSTANTS c_base_screen TYPE ty_price VALUE '89.00'.
CONSTANTS c_base_battery TYPE ty_price VALUE '19.00'.
CONSTANTS c_base_board TYPE ty_price VALUE '149.00'.
CONSTANTS c_base_camera TYPE ty_price VALUE '59.00'.
CONSTANTS c_base_port TYPE ty_price VALUE '49.00'.
CONSTANTS c_factor_basic TYPE ty_price VALUE '1.00'.
CONSTANTS c_factor_mid TYPE ty_price VALUE '1.10'.
CONSTANTS c_factor_high TYPE ty_price VALUE '1.25'.
CONSTANTS c_express_fee TYPE ty_price VALUE '15.00'.
CONSTANTS c_warranty_rate TYPE ty_price VALUE '0.80'.
CONSTANTS c_minimum_price TYPE ty_price VALUE '25.00'.
METHODS base_price
IMPORTING iv_repair TYPE ty_repair
RETURNING VALUE(rv_price) TYPE ty_price.
METHODS device_factor
IMPORTING iv_device TYPE ty_device
RETURNING VALUE(rv_factor) TYPE ty_price.
METHODS price_with_extras
IMPORTING iv_price TYPE ty_price
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
rv_price = base_price( iv_repair ).
IF rv_price IS INITIAL.
RETURN.
ENDIF.
rv_price = rv_price * device_factor( iv_device ).
rv_price = price_with_extras( iv_price = rv_price
iv_express = iv_express
iv_warranty = iv_warranty ).
IF rv_price < c_minimum_price.
rv_price = c_minimum_price.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_repair.
WHEN c_repair_screen.
rv_price = c_base_screen.
WHEN c_repair_battery.
rv_price = c_base_battery.
WHEN c_repair_board.
rv_price = c_base_board.
WHEN c_repair_camera.
rv_price = c_base_camera.
WHEN c_repair_port.
rv_price = c_base_port.
ENDCASE.
ENDMETHOD.
METHOD device_factor.
CASE iv_device.
WHEN c_device_mid.
rv_factor = c_factor_mid.
WHEN c_device_high.
rv_factor = c_factor_high.
WHEN OTHERS.
rv_factor = c_factor_basic.
ENDCASE.
ENDMETHOD.
METHOD price_with_extras.
rv_price = iv_price.
IF iv_express = abap_true.
rv_price = rv_price + c_express_fee.
ENDIF.
IF iv_warranty = abap_true.
rv_price = rv_price * c_warranty_rate.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,84 @@
CLASS ltc_phone_repair_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_screen_basic TYPE ty_price VALUE '89.00'.
CONSTANTS c_port_high TYPE ty_price VALUE '61.25'.
CONSTANTS c_camera_express TYPE ty_price VALUE '74.00'.
CONSTANTS c_camera_full TYPE ty_price VALUE '59.20'.
CONSTANTS c_minimum TYPE ty_price VALUE '25.00'.
CONSTANTS c_zero TYPE ty_price VALUE '0.00'.
DATA mo_cut TYPE REF TO {{p}}phone_repair_pricer.
METHODS setup.
METHODS base_price_screen FOR TESTING.
METHODS device_factor_high FOR TESTING.
METHODS express_fee FOR TESTING.
METHODS warranty_rate FOR TESTING.
METHODS minimum_price FOR TESTING.
METHODS unknown_repair FOR TESTING.
ENDCLASS.
CLASS ltc_phone_repair_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}phone_repair_pricer( ).
ENDMETHOD.
METHOD base_price_screen.
cl_abap_unit_assert=>assert_equals(
exp = c_screen_basic
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'SCREEN'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD device_factor_high.
cl_abap_unit_assert=>assert_equals(
exp = c_port_high
act = mo_cut->calculate_price( iv_device = 'HIGH'
iv_repair = 'PORT'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD express_fee.
cl_abap_unit_assert=>assert_equals(
exp = c_camera_express
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'CAMERA'
iv_express = abap_true
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD warranty_rate.
cl_abap_unit_assert=>assert_equals(
exp = c_camera_full
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'CAMERA'
iv_express = abap_true
iv_warranty = abap_true ) ).
ENDMETHOD.
METHOD minimum_price.
cl_abap_unit_assert=>assert_equals(
exp = c_minimum
act = mo_cut->calculate_price( iv_device = 'BASIC'
iv_repair = 'BATTERY'
iv_express = abap_false
iv_warranty = abap_false ) ).
ENDMETHOD.
METHOD unknown_repair.
cl_abap_unit_assert=>assert_equals(
exp = c_zero
act = mo_cut->calculate_price( iv_device = 'HIGH'
iv_repair = 'SPEAKER'
iv_express = abap_true
iv_warranty = abap_true ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,90 @@
CLASS {{p}}phone_repair_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_device TYPE c LENGTH 6.
TYPES ty_repair TYPE c LENGTH 8.
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS c_device_basic TYPE ty_device VALUE 'BASIC'.
CONSTANTS c_device_mid TYPE ty_device VALUE 'MID'.
CONSTANTS c_device_high TYPE ty_device VALUE 'HIGH'.
CONSTANTS c_repair_screen TYPE ty_repair VALUE 'SCREEN'.
CONSTANTS c_repair_battery TYPE ty_repair VALUE 'BATTERY'.
CONSTANTS c_repair_board TYPE ty_repair VALUE 'BOARD'.
CONSTANTS c_repair_camera TYPE ty_repair VALUE 'CAMERA'.
CONSTANTS c_repair_port TYPE ty_repair VALUE 'PORT'.
METHODS calculate_price
IMPORTING iv_device TYPE ty_device
iv_repair TYPE ty_repair
iv_express TYPE abap_bool
iv_warranty TYPE abap_bool
RETURNING VALUE(rv_price) TYPE ty_price.
ENDCLASS.
CLASS {{p}}phone_repair_pricer IMPLEMENTATION.
METHOD calculate_price.
DATA lv_price TYPE ty_price.
DATA lv_factor TYPE ty_price.
DATA lv_found TYPE abap_bool.
CLEAR lv_found.
IF iv_repair = c_repair_screen.
lv_price = '89.00'.
lv_found = abap_true.
ELSEIF iv_repair = c_repair_battery.
lv_price = '19.00'.
lv_found = abap_true.
ELSEIF iv_repair = c_repair_board.
lv_price = '149.00'.
lv_found = abap_true.
ELSEIF iv_repair = c_repair_camera.
lv_price = '59.00'.
lv_found = abap_true.
ELSEIF iv_repair = c_repair_port.
lv_price = '49.00'.
lv_found = abap_true.
ENDIF.
IF lv_found = abap_true.
IF iv_device = c_device_high.
lv_factor = '1.25'.
lv_price = lv_price * lv_factor.
IF iv_express = abap_true.
lv_price = lv_price + 15.
ENDIF.
IF iv_warranty = abap_true.
lv_factor = '0.80'.
lv_price = lv_price * lv_factor.
ENDIF.
ELSEIF iv_device = c_device_mid.
lv_factor = '1.10'.
lv_price = lv_price * lv_factor.
IF iv_express = abap_true.
lv_price = lv_price + 15.
ENDIF.
IF iv_warranty = abap_true.
lv_factor = '0.80'.
lv_price = lv_price * lv_factor.
ENDIF.
ELSE.
IF iv_express = abap_true.
lv_price = lv_price + 15.
ENDIF.
IF iv_warranty = abap_true.
lv_factor = '0.80'.
lv_price = lv_price * lv_factor.
ENDIF.
ENDIF.
IF lv_price < 25.
lv_price = 25.
ENDIF.
ELSE.
CLEAR lv_price.
ENDIF.
rv_price = lv_price.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,55 @@
# 1. Goal
A mobile phone repair shop prices repair orders. The checkout program of the
shop calls the class {{P}}PHONE_REPAIR_PRICER for each order and prints the
price that the class returns. The class works, but its code is legacy code: one
long method, repeated blocks and prices that are hidden in the code. Refactor
the class in place. The behavior must stay the same.
# 2. Open questions
None.
# 3. Context
- The class {{P}}PHONE_REPAIR_PRICER exists in package $TMP and is active. Its
source code is the legacy code.
- The checkout program calls the public method CALCULATE_PRICE. It passes the
device class, the repair type, the express flag and the warranty flag, and it
prints the returned price.
- The class is in production. Its public interface must not change.
- The class has no tests.
# 4. Contract
- Refactor the class {{P}}PHONE_REPAIR_PRICER in package $TMP. Keep the name.
Do not create a second class.
- The class stays public and final. The constructor stays public and has no
parameters.
- The public section stays as it is:
- the type TY_DEVICE (character 6), the type TY_REPAIR (character 8) and the
type TY_PRICE (packed number, length 8, 2 decimals);
- the constants C_DEVICE_BASIC, C_DEVICE_MID and C_DEVICE_HIGH of type
TY_DEVICE;
- the constants C_REPAIR_SCREEN, C_REPAIR_BATTERY, C_REPAIR_BOARD,
C_REPAIR_CAMERA and C_REPAIR_PORT of type TY_REPAIR;
- the method CALCULATE_PRICE with the importing parameters IV_DEVICE
(TY_DEVICE), IV_REPAIR (TY_REPAIR), IV_EXPRESS (ABAP_BOOL) and IV_WARRANTY
(ABAP_BOOL), and the returning parameter RV_PRICE (TY_PRICE).
- Do not add other public methods, types, constants or attributes.
# 5. Business rules
- The behavior of the class must not change. Every combination of the four
input parameters must return the same price as before.
- The rules are in the legacy source code of the class. Read the legacy code.
Keep every rule and keep the sequence of the steps.
- Do not add rules and do not remove rules.
# 6. Constraints
- Release target: ABAP Platform 2025 (SAP_BASIS 816).
- Coding standards: Clean ABAP. Methods below 40 statements. No global
variables. No comment that restates the code. Replace the prices and the
factors with named constants. Remove the repeated blocks. Use names that say
what the data and the methods mean.
- Out of scope: do not change the public interface of the class.
# 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,49 @@
{
"id": "G1010",
"category": "E",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "CLAS",
"name": "{{P}}PHONE_REPAIR_PRICER",
"file": "seed/phone_repair_pricer.clas.abap",
"description": "Legacy phone repair price calculator: one long method, repeated blocks, prices hidden in the code"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}PHONE_REPAIR_PRICER"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T31_HIDDEN",
"file": "hidden/t31_hidden.clas.abap",
"description": "Behavior tests for the refactored phone repair price calculator"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}PHONE_REPAIR_PRICER",
"file": "reference/phone_repair_pricer.clas.abap",
"description": "Refactored phone repair price calculator",
"testclasses_file": "reference/phone_repair_pricer.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"duplicate_code",
"magic_numbers"
]
}