Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,105 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_minimum_fee TYPE ty_fee VALUE '50.00',
c_urgent_fee TYPE ty_fee VALUE '45.00',
c_area_free TYPE i VALUE 100,
c_area_step TYPE i VALUE 50,
c_area_step_fee TYPE i VALUE 15,
c_discount_pct TYPE i VALUE 10.
METHODS base_fee
IMPORTING iv_pest_type TYPE ty_pest
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS area_surcharge
IMPORTING iv_area TYPE i
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS urgent_surcharge
IMPORTING iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS contract_discount
IMPORTING iv_base TYPE ty_fee
iv_area_fee TYPE ty_fee
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA(lv_base) = base_fee( iv_pest_type ).
IF lv_base = 0.
CLEAR rv_fee.
RETURN.
ENDIF.
DATA(lv_area_fee) = area_surcharge( iv_area ).
DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ).
DATA(lv_discount) = contract_discount( iv_base = lv_base
iv_area_fee = lv_area_fee
iv_contract = iv_contract ).
rv_fee = lv_gross + lv_discount.
IF rv_fee < c_minimum_fee.
rv_fee = c_minimum_fee.
ENDIF.
ENDMETHOD.
METHOD base_fee.
CASE iv_pest_type.
WHEN 'RATS'.
rv_fee = 120.
WHEN 'MICE'.
rv_fee = 55.
WHEN 'WASP'.
rv_fee = 150.
WHEN 'ANTS'.
rv_fee = 80.
WHEN OTHERS.
CLEAR rv_fee.
ENDCASE.
ENDMETHOD.
METHOD area_surcharge.
DATA(lv_billable) = iv_area - c_area_free.
IF lv_billable <= 0.
RETURN.
ENDIF.
DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step.
rv_fee = lv_steps * c_area_step_fee.
ENDMETHOD.
METHOD urgent_surcharge.
IF iv_urgent = abap_true.
rv_fee = c_urgent_fee.
ENDIF.
ENDMETHOD.
METHOD contract_discount.
IF iv_contract = abap_false.
RETURN.
ENDIF.
DATA(lv_discountable) = iv_base + iv_area_fee.
rv_fee = lv_discountable * c_discount_pct / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_minimum_fee TYPE ty_fee VALUE '50.00',
c_urgent_fee TYPE ty_fee VALUE '45.00',
c_area_free TYPE i VALUE 100,
c_area_step TYPE i VALUE 50,
c_area_step_fee TYPE i VALUE 15,
c_discount_pct TYPE i VALUE 10.
METHODS base_fee
IMPORTING iv_pest_type TYPE ty_pest
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS area_surcharge
IMPORTING iv_area TYPE i
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS urgent_surcharge
IMPORTING iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS contract_discount
IMPORTING iv_base TYPE ty_fee
iv_area_fee TYPE ty_fee
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA(lv_base) = base_fee( iv_pest_type ).
IF lv_base = 0.
CLEAR rv_fee.
RETURN.
ENDIF.
DATA(lv_area_fee) = area_surcharge( iv_area ).
DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ).
DATA(lv_discount) = contract_discount( iv_base = lv_base
iv_area_fee = lv_area_fee
iv_contract = iv_contract ).
rv_fee = lv_gross - lv_discount.
IF rv_fee >= c_minimum_fee.
rv_fee = c_minimum_fee.
ENDIF.
ENDMETHOD.
METHOD base_fee.
CASE iv_pest_type.
WHEN 'RATS'.
rv_fee = 120.
WHEN 'MICE'.
rv_fee = 55.
WHEN 'WASP'.
rv_fee = 150.
WHEN 'ANTS'.
rv_fee = 80.
WHEN OTHERS.
CLEAR rv_fee.
ENDCASE.
ENDMETHOD.
METHOD area_surcharge.
DATA(lv_billable) = iv_area - c_area_free.
IF lv_billable <= 0.
RETURN.
ENDIF.
DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step.
rv_fee = lv_steps * c_area_step_fee.
ENDMETHOD.
METHOD urgent_surcharge.
IF iv_urgent = abap_true.
rv_fee = c_urgent_fee.
ENDIF.
ENDMETHOD.
METHOD contract_discount.
IF iv_contract = abap_false.
RETURN.
ENDIF.
DATA(lv_discountable) = iv_base + iv_area_fee.
rv_fee = lv_discountable * c_discount_pct / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_minimum_fee TYPE ty_fee VALUE '50.00',
c_urgent_fee TYPE ty_fee VALUE '45.00',
c_area_free TYPE i VALUE 100,
c_area_step TYPE i VALUE 50,
c_area_step_fee TYPE i VALUE 15,
c_discount_pct TYPE i VALUE 10.
METHODS base_fee
IMPORTING iv_pest_type TYPE ty_pest
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS area_surcharge
IMPORTING iv_area TYPE i
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS urgent_surcharge
IMPORTING iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS contract_discount
IMPORTING iv_base TYPE ty_fee
iv_area_fee TYPE ty_fee
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA(lv_base) = base_fee( iv_pest_type ).
IF lv_base = 0.
CLEAR rv_fee.
RETURN.
ENDIF.
DATA(lv_area_fee) = area_surcharge( iv_area ).
DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ).
DATA(lv_discount) = contract_discount( iv_base = lv_base
iv_area_fee = lv_area_fee
iv_contract = iv_contract ).
rv_fee = lv_gross - lv_discount.
IF rv_fee < c_minimum_fee.
rv_fee = c_minimum_fee.
ENDIF.
ENDMETHOD.
METHOD base_fee.
CASE iv_pest_type.
WHEN 'RATS'.
rv_fee = 120.
WHEN 'MICE'.
rv_fee = 55.
WHEN 'WASP'.
rv_fee = 150.
WHEN 'ANTS'.
rv_fee = 80.
WHEN OTHERS.
CLEAR rv_fee.
ENDCASE.
ENDMETHOD.
METHOD area_surcharge.
DATA(lv_billable) = iv_area - c_area_free.
IF lv_billable <= 0.
RETURN.
ENDIF.
DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step.
rv_fee = lv_steps / c_area_step_fee.
ENDMETHOD.
METHOD urgent_surcharge.
IF iv_urgent = abap_true.
rv_fee = c_urgent_fee.
ENDIF.
ENDMETHOD.
METHOD contract_discount.
IF iv_contract = abap_false.
RETURN.
ENDIF.
DATA(lv_discountable) = iv_base + iv_area_fee.
rv_fee = lv_discountable * c_discount_pct / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_minimum_fee TYPE ty_fee VALUE '50.00',
c_urgent_fee TYPE ty_fee VALUE '45.00',
c_area_free TYPE i VALUE 100,
c_area_step TYPE i VALUE 50,
c_area_step_fee TYPE i VALUE 15,
c_discount_pct TYPE i VALUE 10.
METHODS base_fee
IMPORTING iv_pest_type TYPE ty_pest
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS area_surcharge
IMPORTING iv_area TYPE i
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS urgent_surcharge
IMPORTING iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS contract_discount
IMPORTING iv_base TYPE ty_fee
iv_area_fee TYPE ty_fee
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA(lv_base) = base_fee( iv_pest_type ).
IF lv_base = 0.
CLEAR rv_fee.
RETURN.
ENDIF.
DATA(lv_area_fee) = area_surcharge( iv_area ).
DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ).
DATA(lv_discount) = contract_discount( iv_base = lv_base
iv_area_fee = lv_area_fee
iv_contract = iv_contract ).
rv_fee = lv_gross - lv_discount.
IF rv_fee < c_minimum_fee.
rv_fee = c_minimum_fee.
ENDIF.
ENDMETHOD.
METHOD base_fee.
CASE iv_pest_type.
WHEN 'RATS'.
rv_fee = 120.
WHEN 'MICE'.
rv_fee = 55.
WHEN 'WASP'.
rv_fee = 150.
WHEN 'ANTS'.
rv_fee = 80.
WHEN OTHERS.
CLEAR rv_fee.
ENDCASE.
ENDMETHOD.
METHOD area_surcharge.
DATA(lv_billable) = iv_area - c_area_free.
IF lv_billable <= 0.
RETURN.
ENDIF.
DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step.
rv_fee = lv_steps * c_area_step_fee.
ENDMETHOD.
METHOD urgent_surcharge.
IF iv_urgent <> abap_true.
rv_fee = c_urgent_fee.
ENDIF.
ENDMETHOD.
METHOD contract_discount.
IF iv_contract = abap_false.
RETURN.
ENDIF.
DATA(lv_discountable) = iv_base + iv_area_fee.
rv_fee = lv_discountable * c_discount_pct / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,105 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_minimum_fee TYPE ty_fee VALUE '50.00',
c_urgent_fee TYPE ty_fee VALUE '45.00',
c_area_free TYPE i VALUE 100,
c_area_step TYPE i VALUE 50,
c_area_step_fee TYPE i VALUE 15,
c_discount_pct TYPE i VALUE 10.
METHODS base_fee
IMPORTING iv_pest_type TYPE ty_pest
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS area_surcharge
IMPORTING iv_area TYPE i
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS urgent_surcharge
IMPORTING iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS contract_discount
IMPORTING iv_base TYPE ty_fee
iv_area_fee TYPE ty_fee
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA(lv_base) = base_fee( iv_pest_type ).
IF lv_base = 0.
CLEAR rv_fee.
RETURN.
ENDIF.
DATA(lv_area_fee) = area_surcharge( iv_area ).
DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ).
DATA(lv_discount) = contract_discount( iv_base = lv_base
iv_area_fee = lv_area_fee
iv_contract = iv_contract ).
rv_fee = lv_gross - lv_discount.
IF rv_fee < c_minimum_fee.
rv_fee = c_minimum_fee.
ENDIF.
ENDMETHOD.
METHOD base_fee.
CASE iv_pest_type.
WHEN 'RATS'.
rv_fee = 120.
WHEN 'MICE'.
rv_fee = 55.
WHEN 'WASP'.
rv_fee = 150.
WHEN 'ANTS'.
rv_fee = 80.
WHEN OTHERS.
CLEAR rv_fee.
ENDCASE.
ENDMETHOD.
METHOD area_surcharge.
DATA(lv_billable) = iv_area - c_area_free.
IF lv_billable <= 0.
RETURN.
ENDIF.
DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step.
rv_fee = lv_steps * c_area_step_fee.
ENDMETHOD.
METHOD urgent_surcharge.
IF iv_urgent = abap_true.
rv_fee = c_urgent_fee.
ENDIF.
ENDMETHOD.
METHOD contract_discount.
IF iv_contract = abap_true.
RETURN.
ENDIF.
DATA(lv_discountable) = iv_base + iv_area_fee.
rv_fee = lv_discountable * c_discount_pct / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,24 @@
{
"id": "G1054",
"pool": "train",
"object_type": "CLAS",
"category": "E",
"attempts": [
{
"stage": "validate",
"oracle": 0,
"null": 0
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,141 @@
CLASS {{p}}pest_test_hidden DEFINITION
PUBLIC
FINAL
CREATE PUBLIC
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}pest_fee.
METHODS setup.
METHODS expect_fee
IMPORTING iv_expected TYPE {{p}}pest_fee=>ty_fee
iv_actual TYPE {{p}}pest_fee=>ty_fee
iv_case TYPE string.
METHODS rats_base_fee FOR TESTING.
METHODS mice_base_fee FOR TESTING.
METHODS wasp_base_fee FOR TESTING.
METHODS unknown_pest_zero FOR TESTING.
METHODS area_surcharge_step FOR TESTING.
METHODS area_surcharge_rounds FOR TESTING.
METHODS no_surcharge_at_100 FOR TESTING.
METHODS urgent_surcharge FOR TESTING.
METHODS contract_discount FOR TESTING.
METHODS discount_excludes_urgent FOR TESTING.
METHODS minimum_fee FOR TESTING.
ENDCLASS.
CLASS {{p}}pest_test_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}pest_fee( ).
ENDMETHOD.
METHOD expect_fee.
cl_abap_unit_assert=>assert_equals( exp = iv_expected
act = iv_actual
msg = iv_case ).
ENDMETHOD.
METHOD rats_base_fee.
expect_fee( iv_expected = 120
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'RATS'
iv_area = 50
iv_urgent = abap_false
iv_contract = abap_false )
iv_case = 'RATS base fee' ).
ENDMETHOD.
METHOD mice_base_fee.
expect_fee( iv_expected = 55
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'MICE'
iv_area = 0
iv_urgent = abap_false
iv_contract = abap_false )
iv_case = 'MICE base fee' ).
ENDMETHOD.
METHOD wasp_base_fee.
expect_fee( iv_expected = 150
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'WASP'
iv_area = 100
iv_urgent = abap_false
iv_contract = abap_false )
iv_case = 'WASP base fee' ).
ENDMETHOD.
METHOD unknown_pest_zero.
expect_fee( iv_expected = 0
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'BIRD'
iv_area = 300
iv_urgent = abap_true
iv_contract = abap_true )
iv_case = 'unknown pest type' ).
ENDMETHOD.
METHOD area_surcharge_step.
expect_fee( iv_expected = 135
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'RATS'
iv_area = 101
iv_urgent = abap_false
iv_contract = abap_false )
iv_case = 'one started area step' ).
ENDMETHOD.
METHOD area_surcharge_rounds.
expect_fee( iv_expected = 165
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'RATS'
iv_area = 250
iv_urgent = abap_false
iv_contract = abap_false )
iv_case = 'three started area steps' ).
ENDMETHOD.
METHOD no_surcharge_at_100.
expect_fee( iv_expected = 80
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'ANTS'
iv_area = 100
iv_urgent = abap_false
iv_contract = abap_false )
iv_case = 'no area surcharge at 100' ).
ENDMETHOD.
METHOD urgent_surcharge.
expect_fee( iv_expected = 125
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'ANTS'
iv_area = 100
iv_urgent = abap_true
iv_contract = abap_false )
iv_case = 'urgent surcharge' ).
ENDMETHOD.
METHOD contract_discount.
expect_fee( iv_expected = 135
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'RATS'
iv_area = 200
iv_urgent = abap_false
iv_contract = abap_true )
iv_case = 'contract discount' ).
ENDMETHOD.
METHOD discount_excludes_urgent.
expect_fee( iv_expected = 153
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'RATS'
iv_area = 0
iv_urgent = abap_true
iv_contract = abap_true )
iv_case = 'discount without urgent surcharge' ).
ENDMETHOD.
METHOD minimum_fee.
expect_fee( iv_expected = 50
iv_actual = mo_cut->calculate_fee( iv_pest_type = 'MICE'
iv_area = 0
iv_urgent = abap_false
iv_contract = abap_true )
iv_case = 'minimum fee' ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,85 @@
{
"task": "G1054",
"mutants": [
{
"object": "{{P}}PEST_FEE",
"mutant": "line 60: - -> + (arith)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"CONTRACT_DISCOUNT",
"DISCOUNT_EXCLUDES_URGENT",
"MINIMUM_FEE"
]
},
{
"object": "{{P}}PEST_FEE",
"mutant": "line 61: < -> >= (rel)",
"status": "killed",
"hidden": "1/11",
"failed_tests": [
"AREA_SURCHARGE_ROUNDS",
"AREA_SURCHARGE_STEP",
"CONTRACT_DISCOUNT",
"DISCOUNT_EXCLUDES_URGENT",
"MICE_BASE_FEE",
"MINIMUM_FEE",
"NO_SURCHARGE_AT_100",
"RATS_BASE_FEE",
"URGENT_SURCHARGE",
"WASP_BASE_FEE"
]
},
{
"object": "{{P}}PEST_FEE",
"mutant": "line 88: * -> / (arith)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"AREA_SURCHARGE_ROUNDS",
"AREA_SURCHARGE_STEP",
"CONTRACT_DISCOUNT"
]
},
{
"object": "{{P}}PEST_FEE",
"mutant": "line 92: = -> <> (eq)",
"status": "killed",
"hidden": "1/11",
"failed_tests": [
"AREA_SURCHARGE_ROUNDS",
"AREA_SURCHARGE_STEP",
"CONTRACT_DISCOUNT",
"DISCOUNT_EXCLUDES_URGENT",
"MICE_BASE_FEE",
"MINIMUM_FEE",
"NO_SURCHARGE_AT_100",
"RATS_BASE_FEE",
"URGENT_SURCHARGE",
"WASP_BASE_FEE"
]
},
{
"object": "{{P}}PEST_FEE",
"mutant": "line 98: abap_false -> abap_true (bool)",
"status": "killed",
"hidden": "1/11",
"failed_tests": [
"AREA_SURCHARGE_ROUNDS",
"AREA_SURCHARGE_STEP",
"CONTRACT_DISCOUNT",
"DISCOUNT_EXCLUDES_URGENT",
"MICE_BASE_FEE",
"MINIMUM_FEE",
"NO_SURCHARGE_AT_100",
"RATS_BASE_FEE",
"URGENT_SURCHARGE",
"WASP_BASE_FEE"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,105 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_minimum_fee TYPE ty_fee VALUE '50.00',
c_urgent_fee TYPE ty_fee VALUE '45.00',
c_area_free TYPE i VALUE 100,
c_area_step TYPE i VALUE 50,
c_area_step_fee TYPE i VALUE 15,
c_discount_pct TYPE i VALUE 10.
METHODS base_fee
IMPORTING iv_pest_type TYPE ty_pest
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS area_surcharge
IMPORTING iv_area TYPE i
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS urgent_surcharge
IMPORTING iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
METHODS contract_discount
IMPORTING iv_base TYPE ty_fee
iv_area_fee TYPE ty_fee
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA(lv_base) = base_fee( iv_pest_type ).
IF lv_base = 0.
CLEAR rv_fee.
RETURN.
ENDIF.
DATA(lv_area_fee) = area_surcharge( iv_area ).
DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ).
DATA(lv_discount) = contract_discount( iv_base = lv_base
iv_area_fee = lv_area_fee
iv_contract = iv_contract ).
rv_fee = lv_gross - lv_discount.
IF rv_fee < c_minimum_fee.
rv_fee = c_minimum_fee.
ENDIF.
ENDMETHOD.
METHOD base_fee.
CASE iv_pest_type.
WHEN 'RATS'.
rv_fee = 120.
WHEN 'MICE'.
rv_fee = 55.
WHEN 'WASP'.
rv_fee = 150.
WHEN 'ANTS'.
rv_fee = 80.
WHEN OTHERS.
CLEAR rv_fee.
ENDCASE.
ENDMETHOD.
METHOD area_surcharge.
DATA(lv_billable) = iv_area - c_area_free.
IF lv_billable <= 0.
RETURN.
ENDIF.
DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step.
rv_fee = lv_steps * c_area_step_fee.
ENDMETHOD.
METHOD urgent_surcharge.
IF iv_urgent = abap_true.
rv_fee = c_urgent_fee.
ENDIF.
ENDMETHOD.
METHOD contract_discount.
IF iv_contract = abap_false.
RETURN.
ENDIF.
DATA(lv_discountable) = iv_base + iv_area_fee.
rv_fee = lv_discountable * c_discount_pct / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,73 @@
CLASS ltc_pest_fee DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}pest_fee.
METHODS setup.
METHODS rats_with_area FOR TESTING.
METHODS mice_base_fee FOR TESTING.
METHODS unknown_pest_is_free FOR TESTING.
METHODS urgent_job FOR TESTING.
METHODS contract_discount FOR TESTING.
METHODS minimum_fee FOR TESTING.
ENDCLASS.
CLASS ltc_pest_fee IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}pest_fee( ).
ENDMETHOD.
METHOD rats_with_area.
DATA lv_exp TYPE {{p}}pest_fee=>ty_fee.
lv_exp = 135.
cl_abap_unit_assert=>assert_equals(
exp = lv_exp
act = mo_cut->calculate_fee( iv_pest_type = 'RATS' iv_area = 101
iv_urgent = abap_false iv_contract = abap_false ) ).
ENDMETHOD.
METHOD mice_base_fee.
DATA lv_exp TYPE {{p}}pest_fee=>ty_fee.
lv_exp = 55.
cl_abap_unit_assert=>assert_equals(
exp = lv_exp
act = mo_cut->calculate_fee( iv_pest_type = 'MICE' iv_area = 0
iv_urgent = abap_false iv_contract = abap_false ) ).
ENDMETHOD.
METHOD unknown_pest_is_free.
DATA lv_exp TYPE {{p}}pest_fee=>ty_fee.
lv_exp = 0.
cl_abap_unit_assert=>assert_equals(
exp = lv_exp
act = mo_cut->calculate_fee( iv_pest_type = 'BIRD' iv_area = 500
iv_urgent = abap_true iv_contract = abap_true ) ).
ENDMETHOD.
METHOD urgent_job.
DATA lv_exp TYPE {{p}}pest_fee=>ty_fee.
lv_exp = 125.
cl_abap_unit_assert=>assert_equals(
exp = lv_exp
act = mo_cut->calculate_fee( iv_pest_type = 'ANTS' iv_area = 100
iv_urgent = abap_true iv_contract = abap_false ) ).
ENDMETHOD.
METHOD contract_discount.
DATA lv_exp TYPE {{p}}pest_fee=>ty_fee.
lv_exp = 153.
cl_abap_unit_assert=>assert_equals(
exp = lv_exp
act = mo_cut->calculate_fee( iv_pest_type = 'RATS' iv_area = 0
iv_urgent = abap_true iv_contract = abap_true ) ).
ENDMETHOD.
METHOD minimum_fee.
DATA lv_exp TYPE {{p}}pest_fee=>ty_fee.
lv_exp = 50.
cl_abap_unit_assert=>assert_equals(
exp = lv_exp
act = mo_cut->calculate_fee( iv_pest_type = 'MICE' iv_area = 0
iv_urgent = abap_false iv_contract = abap_true ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,87 @@
CLASS {{p}}pest_fee DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pest TYPE c LENGTH 4.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pest_type TYPE ty_pest
iv_area TYPE i
iv_urgent TYPE abap_bool
iv_contract TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
ENDCLASS.
CLASS {{p}}pest_fee IMPLEMENTATION.
METHOD calculate_fee.
DATA lv_base TYPE ty_fee.
DATA lv_area_fee TYPE ty_fee.
DATA lv_area_fee2 TYPE ty_fee.
DATA lv_total TYPE ty_fee.
DATA lv_discount TYPE ty_fee.
DATA lv_steps TYPE i.
DATA lv_rest TYPE i.
DATA lv_dummy TYPE i.
" get the base fee
IF iv_pest_type = 'RATS'.
lv_base = 120.
ELSEIF iv_pest_type = 'MICE'.
lv_base = 55.
ELSEIF iv_pest_type = 'WASP'.
lv_base = 150.
ELSEIF iv_pest_type = 'ANTS'.
lv_base = 80.
ELSE.
lv_base = 0.
ENDIF.
IF lv_base = 0.
rv_fee = 0.
RETURN.
ENDIF.
" area surcharge
lv_area_fee = 0.
IF iv_area > 100.
lv_rest = iv_area - 100.
lv_steps = lv_rest DIV 50.
IF lv_rest MOD 50 <> 0.
lv_steps = lv_steps + 1.
ENDIF.
lv_area_fee = lv_steps * 15.
ENDIF.
lv_total = lv_base + lv_area_fee.
" urgent jobs cost more
IF iv_urgent = 'X'.
lv_total = lv_total + 45.
ENDIF.
" contract customers get a discount
IF iv_contract = 'X'.
lv_area_fee2 = 0.
IF iv_area > 100.
lv_rest = iv_area - 100.
lv_steps = lv_rest DIV 50.
IF lv_rest MOD 50 <> 0.
lv_steps = lv_steps + 1.
ENDIF.
lv_area_fee2 = lv_steps * 15.
ENDIF.
lv_discount = ( lv_base + lv_area_fee2 ) * 10 / 100.
lv_total = lv_total - lv_discount.
ENDIF.
IF lv_total < 50.
lv_total = 50.
ENDIF.
rv_fee = lv_total.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,51 @@
# 1. Goal
A pest control company charges a fee for each treatment visit. The dispatcher
calls the class {{P}}PEST_FEE for each job before it plans the route. The class
is legacy code. Refactor the class in place. The class name and the public
interface stay the same. The fee stays the same for each input.
# 2. Open questions
None.
# 3. Context
- The class {{P}}PEST_FEE exists in package $TMP. It is active.
- The class is public, final, and has a public constructor without parameters.
- The public interface has the types TY_PEST and TY_FEE and the method
CALCULATE_FEE with the importing parameters IV_PEST_TYPE, IV_AREA, IV_URGENT
and IV_CONTRACT and the returning parameter RV_FEE.
- Users report that the class is difficult to read and to maintain. The method
is long, the numbers have no name, the same area logic appears twice, and one
variable is not used.
- The legacy implementation contains the business rules. Read it before you
change it.
# 4. Contract
- Refactor the class {{P}}PEST_FEE in package $TMP.
- The class name stays the same.
- The class stays public and final and keeps the public constructor without
parameters.
- The public types TY_PEST and TY_FEE stay the same.
- The public method CALCULATE_FEE keeps its name, its importing parameters
IV_PEST_TYPE, IV_AREA, IV_URGENT, IV_CONTRACT and its returning parameter
RV_FEE.
- Do not add other public methods.
- Do not change the behavior.
# 5. Business rules
- The legacy implementation of {{P}}PEST_FEE defines the business rules.
- The refactored class must return the same fee as the legacy class for every
combination of the input values.
- The rules are not repeated in this document. Read the legacy code.
# 6. Constraints
- Release target: SAP_BASIS 8.16 (ABAP Platform 2025).
- Coding standards: Clean ABAP. Method length below 40 statements. No number
without a name. No deep nesting. No unused variable. No comment that restates
the code.
- Out of scope: do not change the public interface of {{P}}PEST_FEE.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- The class has no ATC finding with priority 1 or 2.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,48 @@
{
"id": "G1054",
"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}}PEST_FEE",
"file": "seed/pest_fee.clas.abap",
"description": "Legacy class that calculates the fee of a pest control visit"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}PEST_FEE"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}PEST_TEST_HIDDEN",
"file": "hidden/pest_test_hidden.clas.abap",
"description": "Hidden tests for the unchanged fee behavior"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}PEST_FEE",
"file": "reference/pest_fee.clas.abap",
"description": "Refactored pest control fee calculation",
"testclasses_file": "reference/pest_fee.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"magic_numbers"
]
}