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,93 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_pet_type,
dog TYPE ty_pet_type VALUE 'DOG',
cat TYPE ty_pet_type VALUE 'CAT',
rabb TYPE ty_pet_type VALUE 'RABB',
END OF c_pet_type,
BEGIN OF c_rate,
dog TYPE i VALUE 2500,
cat TYPE i VALUE 1800,
rabb TYPE i VALUE 800,
other TYPE i VALUE 2000,
END OF c_rate,
c_surcharge_num TYPE i VALUE 1125,
c_surcharge_den TYPE i VALUE 1000,
c_discount_percent TYPE i VALUE 10,
c_percent_base TYPE i VALUE 100,
c_long_stay_nights TYPE i VALUE 7,
c_cat_high_cut TYPE i VALUE 500,
c_grooming_fee TYPE i VALUE 1500,
c_cents_per_euro TYPE i VALUE 100.
METHODS nightly_rate
IMPORTING iv_pet_type TYPE ty_pet_type
iv_high_season TYPE abap_bool
RETURNING VALUE(rv_rate) TYPE i.
METHODS long_stay_discount
IMPORTING iv_rate TYPE i
iv_nights TYPE i
RETURNING VALUE(rv_discount) TYPE i.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
iv_high_season = iv_high_season ).
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
IF iv_nights < c_long_stay_nights.
lv_cents = lv_cents - long_stay_discount( iv_rate = lv_rate
iv_nights = iv_nights ).
ENDIF.
IF iv_pet_type = c_pet_type-cat AND iv_high_season = abap_true.
lv_cents = lv_cents - c_cat_high_cut.
ENDIF.
IF iv_grooming = abap_true.
lv_cents = lv_cents + c_grooming_fee.
ENDIF.
rv_fee = lv_cents / c_cents_per_euro.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_pet_type.
WHEN c_pet_type-dog.
rv_rate = c_rate-dog.
WHEN c_pet_type-cat.
rv_rate = c_rate-cat.
WHEN c_pet_type-rabb.
rv_rate = c_rate-rabb.
WHEN OTHERS.
rv_rate = c_rate-other.
ENDCASE.
IF iv_high_season = abap_true.
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
ENDIF.
ENDMETHOD.
METHOD long_stay_discount.
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
rv_discount = lv_per_night * iv_nights.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,93 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_pet_type,
dog TYPE ty_pet_type VALUE 'DOG',
cat TYPE ty_pet_type VALUE 'CAT',
rabb TYPE ty_pet_type VALUE 'RABB',
END OF c_pet_type,
BEGIN OF c_rate,
dog TYPE i VALUE 2500,
cat TYPE i VALUE 1800,
rabb TYPE i VALUE 800,
other TYPE i VALUE 2000,
END OF c_rate,
c_surcharge_num TYPE i VALUE 1125,
c_surcharge_den TYPE i VALUE 1000,
c_discount_percent TYPE i VALUE 10,
c_percent_base TYPE i VALUE 100,
c_long_stay_nights TYPE i VALUE 7,
c_cat_high_cut TYPE i VALUE 500,
c_grooming_fee TYPE i VALUE 1500,
c_cents_per_euro TYPE i VALUE 100.
METHODS nightly_rate
IMPORTING iv_pet_type TYPE ty_pet_type
iv_high_season TYPE abap_bool
RETURNING VALUE(rv_rate) TYPE i.
METHODS long_stay_discount
IMPORTING iv_rate TYPE i
iv_nights TYPE i
RETURNING VALUE(rv_discount) TYPE i.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
iv_high_season = iv_high_season ).
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
IF iv_nights >= c_long_stay_nights.
lv_cents = lv_cents + long_stay_discount( iv_rate = lv_rate
iv_nights = iv_nights ).
ENDIF.
IF iv_pet_type = c_pet_type-cat AND iv_high_season = abap_true.
lv_cents = lv_cents - c_cat_high_cut.
ENDIF.
IF iv_grooming = abap_true.
lv_cents = lv_cents + c_grooming_fee.
ENDIF.
rv_fee = lv_cents / c_cents_per_euro.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_pet_type.
WHEN c_pet_type-dog.
rv_rate = c_rate-dog.
WHEN c_pet_type-cat.
rv_rate = c_rate-cat.
WHEN c_pet_type-rabb.
rv_rate = c_rate-rabb.
WHEN OTHERS.
rv_rate = c_rate-other.
ENDCASE.
IF iv_high_season = abap_true.
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
ENDIF.
ENDMETHOD.
METHOD long_stay_discount.
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
rv_discount = lv_per_night * iv_nights.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,93 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_pet_type,
dog TYPE ty_pet_type VALUE 'DOG',
cat TYPE ty_pet_type VALUE 'CAT',
rabb TYPE ty_pet_type VALUE 'RABB',
END OF c_pet_type,
BEGIN OF c_rate,
dog TYPE i VALUE 2500,
cat TYPE i VALUE 1800,
rabb TYPE i VALUE 800,
other TYPE i VALUE 2000,
END OF c_rate,
c_surcharge_num TYPE i VALUE 1125,
c_surcharge_den TYPE i VALUE 1000,
c_discount_percent TYPE i VALUE 10,
c_percent_base TYPE i VALUE 100,
c_long_stay_nights TYPE i VALUE 7,
c_cat_high_cut TYPE i VALUE 500,
c_grooming_fee TYPE i VALUE 1500,
c_cents_per_euro TYPE i VALUE 100.
METHODS nightly_rate
IMPORTING iv_pet_type TYPE ty_pet_type
iv_high_season TYPE abap_bool
RETURNING VALUE(rv_rate) TYPE i.
METHODS long_stay_discount
IMPORTING iv_rate TYPE i
iv_nights TYPE i
RETURNING VALUE(rv_discount) TYPE i.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
iv_high_season = iv_high_season ).
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
IF iv_nights >= c_long_stay_nights.
lv_cents = lv_cents - long_stay_discount( iv_rate = lv_rate
iv_nights = iv_nights ).
ENDIF.
IF iv_pet_type = c_pet_type-cat OR iv_high_season = abap_true.
lv_cents = lv_cents - c_cat_high_cut.
ENDIF.
IF iv_grooming = abap_true.
lv_cents = lv_cents + c_grooming_fee.
ENDIF.
rv_fee = lv_cents / c_cents_per_euro.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_pet_type.
WHEN c_pet_type-dog.
rv_rate = c_rate-dog.
WHEN c_pet_type-cat.
rv_rate = c_rate-cat.
WHEN c_pet_type-rabb.
rv_rate = c_rate-rabb.
WHEN OTHERS.
rv_rate = c_rate-other.
ENDCASE.
IF iv_high_season = abap_true.
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
ENDIF.
ENDMETHOD.
METHOD long_stay_discount.
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
rv_discount = lv_per_night * iv_nights.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,93 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_pet_type,
dog TYPE ty_pet_type VALUE 'DOG',
cat TYPE ty_pet_type VALUE 'CAT',
rabb TYPE ty_pet_type VALUE 'RABB',
END OF c_pet_type,
BEGIN OF c_rate,
dog TYPE i VALUE 2500,
cat TYPE i VALUE 1800,
rabb TYPE i VALUE 800,
other TYPE i VALUE 2000,
END OF c_rate,
c_surcharge_num TYPE i VALUE 1125,
c_surcharge_den TYPE i VALUE 1000,
c_discount_percent TYPE i VALUE 10,
c_percent_base TYPE i VALUE 100,
c_long_stay_nights TYPE i VALUE 7,
c_cat_high_cut TYPE i VALUE 500,
c_grooming_fee TYPE i VALUE 1500,
c_cents_per_euro TYPE i VALUE 100.
METHODS nightly_rate
IMPORTING iv_pet_type TYPE ty_pet_type
iv_high_season TYPE abap_bool
RETURNING VALUE(rv_rate) TYPE i.
METHODS long_stay_discount
IMPORTING iv_rate TYPE i
iv_nights TYPE i
RETURNING VALUE(rv_discount) TYPE i.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
iv_high_season = iv_high_season ).
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
IF iv_nights >= c_long_stay_nights.
lv_cents = lv_cents - long_stay_discount( iv_rate = lv_rate
iv_nights = iv_nights ).
ENDIF.
IF iv_pet_type = c_pet_type-cat AND iv_high_season = abap_true.
lv_cents = lv_cents - c_cat_high_cut.
ENDIF.
IF iv_grooming = abap_false.
lv_cents = lv_cents + c_grooming_fee.
ENDIF.
rv_fee = lv_cents / c_cents_per_euro.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_pet_type.
WHEN c_pet_type-dog.
rv_rate = c_rate-dog.
WHEN c_pet_type-cat.
rv_rate = c_rate-cat.
WHEN c_pet_type-rabb.
rv_rate = c_rate-rabb.
WHEN OTHERS.
rv_rate = c_rate-other.
ENDCASE.
IF iv_high_season = abap_true.
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
ENDIF.
ENDMETHOD.
METHOD long_stay_discount.
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
rv_discount = lv_per_night * iv_nights.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,93 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_pet_type,
dog TYPE ty_pet_type VALUE 'DOG',
cat TYPE ty_pet_type VALUE 'CAT',
rabb TYPE ty_pet_type VALUE 'RABB',
END OF c_pet_type,
BEGIN OF c_rate,
dog TYPE i VALUE 2500,
cat TYPE i VALUE 1800,
rabb TYPE i VALUE 800,
other TYPE i VALUE 2000,
END OF c_rate,
c_surcharge_num TYPE i VALUE 1125,
c_surcharge_den TYPE i VALUE 1000,
c_discount_percent TYPE i VALUE 10,
c_percent_base TYPE i VALUE 100,
c_long_stay_nights TYPE i VALUE 7,
c_cat_high_cut TYPE i VALUE 500,
c_grooming_fee TYPE i VALUE 1500,
c_cents_per_euro TYPE i VALUE 100.
METHODS nightly_rate
IMPORTING iv_pet_type TYPE ty_pet_type
iv_high_season TYPE abap_bool
RETURNING VALUE(rv_rate) TYPE i.
METHODS long_stay_discount
IMPORTING iv_rate TYPE i
iv_nights TYPE i
RETURNING VALUE(rv_discount) TYPE i.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
iv_high_season = iv_high_season ).
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
IF iv_nights >= c_long_stay_nights.
lv_cents = lv_cents - long_stay_discount( iv_rate = lv_rate
iv_nights = iv_nights ).
ENDIF.
IF iv_pet_type = c_pet_type-cat AND iv_high_season = abap_true.
lv_cents = lv_cents - c_cat_high_cut.
ENDIF.
IF iv_grooming = abap_true.
lv_cents = lv_cents + c_grooming_fee.
ENDIF.
rv_fee = lv_cents / c_cents_per_euro.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_pet_type.
WHEN c_pet_type-dog.
rv_rate = c_rate-dog.
WHEN c_pet_type-cat.
rv_rate = c_rate-cat.
WHEN c_pet_type-rabb.
rv_rate = c_rate-rabb.
WHEN OTHERS.
rv_rate = c_rate-other.
ENDCASE.
IF iv_high_season <> abap_true.
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
ENDIF.
ENDMETHOD.
METHOD long_stay_discount.
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
rv_discount = lv_per_night * iv_nights.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,47 @@
{
"id": "G0136",
"pool": "eval",
"object_type": "CLAS",
"category": "E",
"attempts": [
{
"stage": "bundle",
"errors": [
"hidden/t02_hidden.clas.abap line 26: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 27: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"00\"",
"hidden/t02_hidden.clas.abap line 35: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 36: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"75\"",
"hidden/t02_hidden.clas.abap line 44: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 45: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"12\"",
"hidden/t02_hidden.clas.abap line 53: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 54: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"17\"",
"hidden/t02_hidden.clas.abap line 62: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 63: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"61\"",
"hidden/t02_hidden.clas.abap line 71: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 72: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"40\"",
"hidden/t02_hidden.clas.abap line 80: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 81: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"00\"",
"hidden/t02_hidden.clas.abap line 89: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 90: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"00\"",
"hidden/t02_hidden.clas.abap line 98: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 99: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"00\"",
"hidden/t02_hidden.clas.abap line 107: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"hidden/t02_hidden.clas.abap line 108: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"00\""
],
"by_check": {
"abaplint": 20
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,127 @@
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_amount TYPE {{p}}kennel_pricer=>ty_amount.
CONSTANTS:
c_dog_1n TYPE ty_amount VALUE '25.00',
c_cat_3n_hi TYPE ty_amount VALUE '55.75',
c_dog_1n_hi TYPE ty_amount VALUE '28.12',
c_dog_7n_hi TYPE ty_amount VALUE '177.17',
c_cat_7n_hi TYPE ty_amount VALUE '122.61',
c_cat_7n_gr TYPE ty_amount VALUE '128.40',
c_zero TYPE ty_amount VALUE '0.00',
c_bird_2n TYPE ty_amount VALUE '40.00',
c_other_1n TYPE ty_amount VALUE '20.00',
c_rabb_10n TYPE ty_amount VALUE '72.00'.
DATA mo_cut TYPE REF TO {{p}}kennel_pricer.
METHODS setup.
METHODS dog_one_night FOR TESTING.
METHODS cat_high_season FOR TESTING.
METHODS high_season_rate FOR TESTING.
METHODS long_stay_dog_high FOR TESTING.
METHODS long_stay_cat_high FOR TESTING.
METHODS grooming_after_discount FOR TESTING.
METHODS zero_nights FOR TESTING.
METHODS negative_nights FOR TESTING.
METHODS unknown_type_default FOR TESTING.
METHODS lower_case_type FOR TESTING.
METHODS rabbit_long_stay FOR TESTING.
ENDCLASS.
CLASS {{p}}t02_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}kennel_pricer( ).
ENDMETHOD.
METHOD dog_one_night.
cl_abap_unit_assert=>assert_equals( exp = c_dog_1n
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 1
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD cat_high_season.
cl_abap_unit_assert=>assert_equals( exp = c_cat_3n_hi
act = mo_cut->calculate_fee( iv_pet_type = 'CAT'
iv_nights = 3
iv_high_season = abap_true
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD high_season_rate.
cl_abap_unit_assert=>assert_equals( exp = c_dog_1n_hi
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 1
iv_high_season = abap_true
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD long_stay_dog_high.
cl_abap_unit_assert=>assert_equals( exp = c_dog_7n_hi
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 7
iv_high_season = abap_true
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD long_stay_cat_high.
cl_abap_unit_assert=>assert_equals( exp = c_cat_7n_hi
act = mo_cut->calculate_fee( iv_pet_type = 'CAT'
iv_nights = 7
iv_high_season = abap_true
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD grooming_after_discount.
cl_abap_unit_assert=>assert_equals( exp = c_cat_7n_gr
act = mo_cut->calculate_fee( iv_pet_type = 'CAT'
iv_nights = 7
iv_high_season = abap_false
iv_grooming = abap_true ) ).
ENDMETHOD.
METHOD zero_nights.
cl_abap_unit_assert=>assert_equals( exp = c_zero
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 0
iv_high_season = abap_true
iv_grooming = abap_true ) ).
ENDMETHOD.
METHOD negative_nights.
cl_abap_unit_assert=>assert_equals( exp = c_zero
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = -2
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD unknown_type_default.
cl_abap_unit_assert=>assert_equals( exp = c_bird_2n
act = mo_cut->calculate_fee( iv_pet_type = 'BIRD'
iv_nights = 2
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD lower_case_type.
cl_abap_unit_assert=>assert_equals( exp = c_other_1n
act = mo_cut->calculate_fee( iv_pet_type = 'dog'
iv_nights = 1
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD rabbit_long_stay.
cl_abap_unit_assert=>assert_equals( exp = c_rabb_10n
act = mo_cut->calculate_fee( iv_pet_type = 'RABB'
iv_nights = 10
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,83 @@
{
"task": "G0136",
"mutants": [
{
"object": "{{P}}KENNEL_PRICER",
"mutant": "line 56: >= -> < (rel)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"CAT_HIGH_SEASON",
"DOG_ONE_NIGHT",
"GROOMING_AFTER_DISCOUNT",
"HIGH_SEASON_RATE",
"LONG_STAY_CAT_HIGH",
"LONG_STAY_DOG_HIGH",
"LOWER_CASE_TYPE",
"RABBIT_LONG_STAY",
"UNKNOWN_TYPE_DEFAULT"
]
},
{
"object": "{{P}}KENNEL_PRICER",
"mutant": "line 57: - -> + (arith)",
"status": "killed",
"hidden": "7/11",
"failed_tests": [
"GROOMING_AFTER_DISCOUNT",
"LONG_STAY_CAT_HIGH",
"LONG_STAY_DOG_HIGH",
"RABBIT_LONG_STAY"
]
},
{
"object": "{{P}}KENNEL_PRICER",
"mutant": "line 61: AND -> OR (logic)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"GROOMING_AFTER_DISCOUNT",
"HIGH_SEASON_RATE",
"LONG_STAY_DOG_HIGH"
]
},
{
"object": "{{P}}KENNEL_PRICER",
"mutant": "line 65: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"CAT_HIGH_SEASON",
"DOG_ONE_NIGHT",
"GROOMING_AFTER_DISCOUNT",
"HIGH_SEASON_RATE",
"LONG_STAY_CAT_HIGH",
"LONG_STAY_DOG_HIGH",
"LOWER_CASE_TYPE",
"RABBIT_LONG_STAY",
"UNKNOWN_TYPE_DEFAULT"
]
},
{
"object": "{{P}}KENNEL_PRICER",
"mutant": "line 84: = -> <> (eq)",
"status": "killed",
"hidden": "2/11",
"failed_tests": [
"CAT_HIGH_SEASON",
"DOG_ONE_NIGHT",
"GROOMING_AFTER_DISCOUNT",
"HIGH_SEASON_RATE",
"LONG_STAY_CAT_HIGH",
"LONG_STAY_DOG_HIGH",
"LOWER_CASE_TYPE",
"RABBIT_LONG_STAY",
"UNKNOWN_TYPE_DEFAULT"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,93 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_pet_type,
dog TYPE ty_pet_type VALUE 'DOG',
cat TYPE ty_pet_type VALUE 'CAT',
rabb TYPE ty_pet_type VALUE 'RABB',
END OF c_pet_type,
BEGIN OF c_rate,
dog TYPE i VALUE 2500,
cat TYPE i VALUE 1800,
rabb TYPE i VALUE 800,
other TYPE i VALUE 2000,
END OF c_rate,
c_surcharge_num TYPE i VALUE 1125,
c_surcharge_den TYPE i VALUE 1000,
c_discount_percent TYPE i VALUE 10,
c_percent_base TYPE i VALUE 100,
c_long_stay_nights TYPE i VALUE 7,
c_cat_high_cut TYPE i VALUE 500,
c_grooming_fee TYPE i VALUE 1500,
c_cents_per_euro TYPE i VALUE 100.
METHODS nightly_rate
IMPORTING iv_pet_type TYPE ty_pet_type
iv_high_season TYPE abap_bool
RETURNING VALUE(rv_rate) TYPE i.
METHODS long_stay_discount
IMPORTING iv_rate TYPE i
iv_nights TYPE i
RETURNING VALUE(rv_discount) TYPE i.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
DATA(lv_rate) = nightly_rate( iv_pet_type = iv_pet_type
iv_high_season = iv_high_season ).
DATA(lv_cents) = CONV ty_amount( lv_rate * iv_nights ).
IF iv_nights >= c_long_stay_nights.
lv_cents = lv_cents - long_stay_discount( iv_rate = lv_rate
iv_nights = iv_nights ).
ENDIF.
IF iv_pet_type = c_pet_type-cat AND iv_high_season = abap_true.
lv_cents = lv_cents - c_cat_high_cut.
ENDIF.
IF iv_grooming = abap_true.
lv_cents = lv_cents + c_grooming_fee.
ENDIF.
rv_fee = lv_cents / c_cents_per_euro.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_pet_type.
WHEN c_pet_type-dog.
rv_rate = c_rate-dog.
WHEN c_pet_type-cat.
rv_rate = c_rate-cat.
WHEN c_pet_type-rabb.
rv_rate = c_rate-rabb.
WHEN OTHERS.
rv_rate = c_rate-other.
ENDCASE.
IF iv_high_season = abap_true.
rv_rate = rv_rate * c_surcharge_num DIV c_surcharge_den.
ENDIF.
ENDMETHOD.
METHOD long_stay_discount.
DATA(lv_per_night) = iv_rate * c_discount_percent DIV c_percent_base.
rv_discount = lv_per_night * iv_nights.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,68 @@
CLASS ltc_kennel_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_amount TYPE {{p}}kennel_pricer=>ty_amount.
CONSTANTS:
c_dog_1n TYPE ty_amount VALUE '25.00',
c_cat_3n_hi TYPE ty_amount VALUE '55.75',
c_dog_7n_hi TYPE ty_amount VALUE '177.17',
c_zero TYPE ty_amount VALUE '0.00',
c_bird_2n TYPE ty_amount VALUE '40.00'.
DATA mo_cut TYPE REF TO {{p}}kennel_pricer.
METHODS setup.
METHODS dog_low_season FOR TESTING.
METHODS cat_high_season FOR TESTING.
METHODS long_stay FOR TESTING.
METHODS no_nights FOR TESTING.
METHODS unknown_type FOR TESTING.
ENDCLASS.
CLASS ltc_kennel_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}kennel_pricer( ).
ENDMETHOD.
METHOD dog_low_season.
cl_abap_unit_assert=>assert_equals( exp = c_dog_1n
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 1
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD cat_high_season.
cl_abap_unit_assert=>assert_equals( exp = c_cat_3n_hi
act = mo_cut->calculate_fee( iv_pet_type = 'CAT'
iv_nights = 3
iv_high_season = abap_true
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD long_stay.
cl_abap_unit_assert=>assert_equals( exp = c_dog_7n_hi
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 7
iv_high_season = abap_true
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD no_nights.
cl_abap_unit_assert=>assert_equals( exp = c_zero
act = mo_cut->calculate_fee( iv_pet_type = 'DOG'
iv_nights = 0
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
METHOD unknown_type.
cl_abap_unit_assert=>assert_equals( exp = c_bird_2n
act = mo_cut->calculate_fee( iv_pet_type = 'BIRD'
iv_nights = 2
iv_high_season = abap_false
iv_grooming = abap_false ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,71 @@
CLASS {{p}}kennel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_pet_type TYPE c LENGTH 4.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_fee
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}kennel_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA: lv_rate TYPE i,
lv_total TYPE p LENGTH 8 DECIMALS 2,
lv_discount TYPE i.
IF iv_nights < 1.
rv_fee = 0.
RETURN.
ENDIF.
IF iv_pet_type = 'DOG'.
IF iv_high_season = 'X'.
lv_rate = 2500 * 1125 DIV 1000.
ELSE.
lv_rate = 2500.
ENDIF.
ELSEIF iv_pet_type = 'CAT'.
IF iv_high_season = 'X'.
lv_rate = 1800 * 1125 DIV 1000.
ELSE.
lv_rate = 1800.
ENDIF.
ELSEIF iv_pet_type = 'RABB'.
IF iv_high_season = 'X'.
lv_rate = 800 * 1125 DIV 1000.
ELSE.
lv_rate = 800.
ENDIF.
ELSE.
IF iv_high_season = 'X'.
lv_rate = 2000 * 1125 DIV 1000.
ELSE.
lv_rate = 2000.
ENDIF.
ENDIF.
CLEAR lv_total.
DO iv_nights TIMES.
lv_total = lv_total + lv_rate.
ENDDO.
IF iv_nights >= 7.
lv_discount = lv_rate * 10 DIV 100.
lv_total = lv_total - lv_discount * iv_nights.
ENDIF.
IF iv_pet_type = 'CAT' AND iv_high_season = 'X'.
lv_total = lv_total - 500.
ENDIF.
IF iv_grooming = 'X'.
lv_total = lv_total + 1500.
ENDIF.
rv_fee = lv_total / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,42 @@
# 1. Goal
Refactor the class {{P}}KENNEL_PRICER. The class calculates the boarding fee of a
pet at a kennel. The class works correctly. The code is difficult to read and to
maintain. Refactor the class. The behavior stays the same.
# 2. Open questions
None.
# 3. Context
- The class {{P}}KENNEL_PRICER exists in package $TMP. It is active.
- A booking program calls the class before the kennel confirms a booking.
- The booking program must get the same fee after your change.
- The class has one public method. The method calculates the fee.
# 4. Contract
- Change the class {{P}}KENNEL_PRICER in package $TMP. Keep the name of the class.
- Keep the public interface of the class. These public components stay:
- The type TY_PET_TYPE. It is CHAR 4.
- The type TY_AMOUNT. It is P, length 8, 2 decimals.
- The method CALCULATE_FEE with this signature:
IMPORTING iv_pet_type TYPE ty_pet_type
iv_nights TYPE i
iv_high_season TYPE abap_bool
iv_grooming TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_amount.
- Do not add other public methods or public attributes.
# 5. Business rules
The behavior of the class must not change. Read the existing implementation in
the seed object. Every result value stays the same. This includes the results for
edge cases and for unusual input values.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP. Method length below 40 statements. No magic
numbers. No deep nesting. No comment that restates the code.
- Out of scope: none.
# 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": "G0136",
"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}}KENNEL_PRICER",
"file": "seed/kennel_pricer.clas.abap",
"description": "Legacy kennel boarding fee calculator with deep nesting, duplicated branches and magic numbers"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}KENNEL_PRICER"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T02_HIDDEN",
"file": "hidden/t02_hidden.clas.abap",
"description": "T02 hidden tests: unchanged boarding fee behaviour of the kennel pricer"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}KENNEL_PRICER",
"file": "reference/kennel_pricer.clas.abap",
"description": "Refactored kennel boarding fee calculator",
"testclasses_file": "reference/kennel_pricer.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"magic_numbers",
"nesting_depth"
]
}