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,112 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_grace_minutes TYPE i VALUE 15,
c_minutes_per_hour TYPE i VALUE 60,
c_no_fee TYPE ty_fee VALUE '0.00',
c_car_rate TYPE ty_fee VALUE '2.00',
c_car_cap TYPE ty_fee VALUE '20.00',
c_car_lost_fee TYPE ty_fee VALUE '25.00',
c_moto_rate TYPE ty_fee VALUE '1.00',
c_moto_cap TYPE ty_fee VALUE '10.00',
c_moto_lost_fee TYPE ty_fee VALUE '15.00',
c_van_rate TYPE ty_fee VALUE '3.00',
c_van_cap TYPE ty_fee VALUE '24.00',
c_van_lost_fee TYPE ty_fee VALUE '35.00',
c_default_lost_fee TYPE ty_fee VALUE '25.00'.
TYPES:
BEGIN OF ty_tariff,
vehicle TYPE ty_vehicle,
rate TYPE ty_fee,
cap TYPE ty_fee,
lost_fee TYPE ty_fee,
END OF ty_tariff,
tt_tariff TYPE HASHED TABLE OF ty_tariff WITH UNIQUE KEY vehicle.
METHODS get_tariff
IMPORTING iv_vehicle TYPE ty_vehicle
RETURNING VALUE(rs_tariff) TYPE ty_tariff.
METHODS all_tariffs
RETURNING VALUE(rt_tariff) TYPE tt_tariff.
METHODS started_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA(ls_tariff) = get_tariff( iv_vehicle ).
IF iv_lost_ticket <> abap_true.
rv_fee = ls_tariff-lost_fee.
RETURN.
ENDIF.
IF iv_minutes <= c_grace_minutes.
rv_fee = c_no_fee.
RETURN.
ENDIF.
rv_fee = started_hours( iv_minutes ) * ls_tariff-rate.
IF rv_fee > ls_tariff-cap.
rv_fee = ls_tariff-cap.
ENDIF.
ENDMETHOD.
METHOD get_tariff.
DATA(lt_tariff) = all_tariffs( ).
ASSIGN lt_tariff[ vehicle = iv_vehicle ] TO FIELD-SYMBOL(<ls_tariff>).
IF sy-subrc = 0.
rs_tariff = <ls_tariff>.
ELSE.
rs_tariff = VALUE #( vehicle = iv_vehicle
rate = c_no_fee
cap = c_no_fee
lost_fee = c_default_lost_fee ).
ENDIF.
ENDMETHOD.
METHOD all_tariffs.
rt_tariff = VALUE #(
( vehicle = c_vehicle_car
rate = c_car_rate
cap = c_car_cap
lost_fee = c_car_lost_fee )
( vehicle = c_vehicle_motorcycle
rate = c_moto_rate
cap = c_moto_cap
lost_fee = c_moto_lost_fee )
( vehicle = c_vehicle_van
rate = c_van_rate
cap = c_van_cap
lost_fee = c_van_lost_fee ) ).
ENDMETHOD.
METHOD started_hours.
rv_hours = iv_minutes DIV c_minutes_per_hour.
IF iv_minutes MOD c_minutes_per_hour <> 0.
rv_hours = rv_hours + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,112 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_grace_minutes TYPE i VALUE 15,
c_minutes_per_hour TYPE i VALUE 60,
c_no_fee TYPE ty_fee VALUE '0.00',
c_car_rate TYPE ty_fee VALUE '2.00',
c_car_cap TYPE ty_fee VALUE '20.00',
c_car_lost_fee TYPE ty_fee VALUE '25.00',
c_moto_rate TYPE ty_fee VALUE '1.00',
c_moto_cap TYPE ty_fee VALUE '10.00',
c_moto_lost_fee TYPE ty_fee VALUE '15.00',
c_van_rate TYPE ty_fee VALUE '3.00',
c_van_cap TYPE ty_fee VALUE '24.00',
c_van_lost_fee TYPE ty_fee VALUE '35.00',
c_default_lost_fee TYPE ty_fee VALUE '25.00'.
TYPES:
BEGIN OF ty_tariff,
vehicle TYPE ty_vehicle,
rate TYPE ty_fee,
cap TYPE ty_fee,
lost_fee TYPE ty_fee,
END OF ty_tariff,
tt_tariff TYPE HASHED TABLE OF ty_tariff WITH UNIQUE KEY vehicle.
METHODS get_tariff
IMPORTING iv_vehicle TYPE ty_vehicle
RETURNING VALUE(rs_tariff) TYPE ty_tariff.
METHODS all_tariffs
RETURNING VALUE(rt_tariff) TYPE tt_tariff.
METHODS started_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA(ls_tariff) = get_tariff( iv_vehicle ).
IF iv_lost_ticket = abap_true.
rv_fee = ls_tariff-lost_fee.
RETURN.
ENDIF.
IF iv_minutes > c_grace_minutes.
rv_fee = c_no_fee.
RETURN.
ENDIF.
rv_fee = started_hours( iv_minutes ) * ls_tariff-rate.
IF rv_fee > ls_tariff-cap.
rv_fee = ls_tariff-cap.
ENDIF.
ENDMETHOD.
METHOD get_tariff.
DATA(lt_tariff) = all_tariffs( ).
ASSIGN lt_tariff[ vehicle = iv_vehicle ] TO FIELD-SYMBOL(<ls_tariff>).
IF sy-subrc = 0.
rs_tariff = <ls_tariff>.
ELSE.
rs_tariff = VALUE #( vehicle = iv_vehicle
rate = c_no_fee
cap = c_no_fee
lost_fee = c_default_lost_fee ).
ENDIF.
ENDMETHOD.
METHOD all_tariffs.
rt_tariff = VALUE #(
( vehicle = c_vehicle_car
rate = c_car_rate
cap = c_car_cap
lost_fee = c_car_lost_fee )
( vehicle = c_vehicle_motorcycle
rate = c_moto_rate
cap = c_moto_cap
lost_fee = c_moto_lost_fee )
( vehicle = c_vehicle_van
rate = c_van_rate
cap = c_van_cap
lost_fee = c_van_lost_fee ) ).
ENDMETHOD.
METHOD started_hours.
rv_hours = iv_minutes DIV c_minutes_per_hour.
IF iv_minutes MOD c_minutes_per_hour <> 0.
rv_hours = rv_hours + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,112 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_grace_minutes TYPE i VALUE 15,
c_minutes_per_hour TYPE i VALUE 60,
c_no_fee TYPE ty_fee VALUE '0.00',
c_car_rate TYPE ty_fee VALUE '2.00',
c_car_cap TYPE ty_fee VALUE '20.00',
c_car_lost_fee TYPE ty_fee VALUE '25.00',
c_moto_rate TYPE ty_fee VALUE '1.00',
c_moto_cap TYPE ty_fee VALUE '10.00',
c_moto_lost_fee TYPE ty_fee VALUE '15.00',
c_van_rate TYPE ty_fee VALUE '3.00',
c_van_cap TYPE ty_fee VALUE '24.00',
c_van_lost_fee TYPE ty_fee VALUE '35.00',
c_default_lost_fee TYPE ty_fee VALUE '25.00'.
TYPES:
BEGIN OF ty_tariff,
vehicle TYPE ty_vehicle,
rate TYPE ty_fee,
cap TYPE ty_fee,
lost_fee TYPE ty_fee,
END OF ty_tariff,
tt_tariff TYPE HASHED TABLE OF ty_tariff WITH UNIQUE KEY vehicle.
METHODS get_tariff
IMPORTING iv_vehicle TYPE ty_vehicle
RETURNING VALUE(rs_tariff) TYPE ty_tariff.
METHODS all_tariffs
RETURNING VALUE(rt_tariff) TYPE tt_tariff.
METHODS started_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA(ls_tariff) = get_tariff( iv_vehicle ).
IF iv_lost_ticket = abap_true.
rv_fee = ls_tariff-lost_fee.
RETURN.
ENDIF.
IF iv_minutes <= c_grace_minutes.
rv_fee = c_no_fee.
RETURN.
ENDIF.
rv_fee = started_hours( iv_minutes ) / ls_tariff-rate.
IF rv_fee > ls_tariff-cap.
rv_fee = ls_tariff-cap.
ENDIF.
ENDMETHOD.
METHOD get_tariff.
DATA(lt_tariff) = all_tariffs( ).
ASSIGN lt_tariff[ vehicle = iv_vehicle ] TO FIELD-SYMBOL(<ls_tariff>).
IF sy-subrc = 0.
rs_tariff = <ls_tariff>.
ELSE.
rs_tariff = VALUE #( vehicle = iv_vehicle
rate = c_no_fee
cap = c_no_fee
lost_fee = c_default_lost_fee ).
ENDIF.
ENDMETHOD.
METHOD all_tariffs.
rt_tariff = VALUE #(
( vehicle = c_vehicle_car
rate = c_car_rate
cap = c_car_cap
lost_fee = c_car_lost_fee )
( vehicle = c_vehicle_motorcycle
rate = c_moto_rate
cap = c_moto_cap
lost_fee = c_moto_lost_fee )
( vehicle = c_vehicle_van
rate = c_van_rate
cap = c_van_cap
lost_fee = c_van_lost_fee ) ).
ENDMETHOD.
METHOD started_hours.
rv_hours = iv_minutes DIV c_minutes_per_hour.
IF iv_minutes MOD c_minutes_per_hour <> 0.
rv_hours = rv_hours + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,112 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_grace_minutes TYPE i VALUE 15,
c_minutes_per_hour TYPE i VALUE 60,
c_no_fee TYPE ty_fee VALUE '0.00',
c_car_rate TYPE ty_fee VALUE '2.00',
c_car_cap TYPE ty_fee VALUE '20.00',
c_car_lost_fee TYPE ty_fee VALUE '25.00',
c_moto_rate TYPE ty_fee VALUE '1.00',
c_moto_cap TYPE ty_fee VALUE '10.00',
c_moto_lost_fee TYPE ty_fee VALUE '15.00',
c_van_rate TYPE ty_fee VALUE '3.00',
c_van_cap TYPE ty_fee VALUE '24.00',
c_van_lost_fee TYPE ty_fee VALUE '35.00',
c_default_lost_fee TYPE ty_fee VALUE '25.00'.
TYPES:
BEGIN OF ty_tariff,
vehicle TYPE ty_vehicle,
rate TYPE ty_fee,
cap TYPE ty_fee,
lost_fee TYPE ty_fee,
END OF ty_tariff,
tt_tariff TYPE HASHED TABLE OF ty_tariff WITH UNIQUE KEY vehicle.
METHODS get_tariff
IMPORTING iv_vehicle TYPE ty_vehicle
RETURNING VALUE(rs_tariff) TYPE ty_tariff.
METHODS all_tariffs
RETURNING VALUE(rt_tariff) TYPE tt_tariff.
METHODS started_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA(ls_tariff) = get_tariff( iv_vehicle ).
IF iv_lost_ticket = abap_true.
rv_fee = ls_tariff-lost_fee.
RETURN.
ENDIF.
IF iv_minutes <= c_grace_minutes.
rv_fee = c_no_fee.
RETURN.
ENDIF.
rv_fee = started_hours( iv_minutes ) * ls_tariff-rate.
IF rv_fee <= ls_tariff-cap.
rv_fee = ls_tariff-cap.
ENDIF.
ENDMETHOD.
METHOD get_tariff.
DATA(lt_tariff) = all_tariffs( ).
ASSIGN lt_tariff[ vehicle = iv_vehicle ] TO FIELD-SYMBOL(<ls_tariff>).
IF sy-subrc = 0.
rs_tariff = <ls_tariff>.
ELSE.
rs_tariff = VALUE #( vehicle = iv_vehicle
rate = c_no_fee
cap = c_no_fee
lost_fee = c_default_lost_fee ).
ENDIF.
ENDMETHOD.
METHOD all_tariffs.
rt_tariff = VALUE #(
( vehicle = c_vehicle_car
rate = c_car_rate
cap = c_car_cap
lost_fee = c_car_lost_fee )
( vehicle = c_vehicle_motorcycle
rate = c_moto_rate
cap = c_moto_cap
lost_fee = c_moto_lost_fee )
( vehicle = c_vehicle_van
rate = c_van_rate
cap = c_van_cap
lost_fee = c_van_lost_fee ) ).
ENDMETHOD.
METHOD started_hours.
rv_hours = iv_minutes DIV c_minutes_per_hour.
IF iv_minutes MOD c_minutes_per_hour <> 0.
rv_hours = rv_hours + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,112 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_grace_minutes TYPE i VALUE 15,
c_minutes_per_hour TYPE i VALUE 60,
c_no_fee TYPE ty_fee VALUE '0.00',
c_car_rate TYPE ty_fee VALUE '2.00',
c_car_cap TYPE ty_fee VALUE '20.00',
c_car_lost_fee TYPE ty_fee VALUE '25.00',
c_moto_rate TYPE ty_fee VALUE '1.00',
c_moto_cap TYPE ty_fee VALUE '10.00',
c_moto_lost_fee TYPE ty_fee VALUE '15.00',
c_van_rate TYPE ty_fee VALUE '3.00',
c_van_cap TYPE ty_fee VALUE '24.00',
c_van_lost_fee TYPE ty_fee VALUE '35.00',
c_default_lost_fee TYPE ty_fee VALUE '25.00'.
TYPES:
BEGIN OF ty_tariff,
vehicle TYPE ty_vehicle,
rate TYPE ty_fee,
cap TYPE ty_fee,
lost_fee TYPE ty_fee,
END OF ty_tariff,
tt_tariff TYPE HASHED TABLE OF ty_tariff WITH UNIQUE KEY vehicle.
METHODS get_tariff
IMPORTING iv_vehicle TYPE ty_vehicle
RETURNING VALUE(rs_tariff) TYPE ty_tariff.
METHODS all_tariffs
RETURNING VALUE(rt_tariff) TYPE tt_tariff.
METHODS started_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA(ls_tariff) = get_tariff( iv_vehicle ).
IF iv_lost_ticket = abap_true.
rv_fee = ls_tariff-lost_fee.
RETURN.
ENDIF.
IF iv_minutes <= c_grace_minutes.
rv_fee = c_no_fee.
RETURN.
ENDIF.
rv_fee = started_hours( iv_minutes ) * ls_tariff-rate.
IF rv_fee > ls_tariff-cap.
rv_fee = ls_tariff-cap.
ENDIF.
ENDMETHOD.
METHOD get_tariff.
DATA(lt_tariff) = all_tariffs( ).
ASSIGN lt_tariff[ vehicle = iv_vehicle ] TO FIELD-SYMBOL(<ls_tariff>).
IF sy-subrc = 0.
rs_tariff = <ls_tariff>.
ELSE.
rs_tariff = VALUE #( vehicle = iv_vehicle
rate = c_no_fee
cap = c_no_fee
lost_fee = c_default_lost_fee ).
ENDIF.
ENDMETHOD.
METHOD all_tariffs.
rt_tariff = VALUE #(
( vehicle = c_vehicle_car
rate = c_car_rate
cap = c_car_cap
lost_fee = c_car_lost_fee )
( vehicle = c_vehicle_motorcycle
rate = c_moto_rate
cap = c_moto_cap
lost_fee = c_moto_lost_fee )
( vehicle = c_vehicle_van
rate = c_van_rate
cap = c_van_cap
lost_fee = c_van_lost_fee ) ).
ENDMETHOD.
METHOD started_hours.
rv_hours = iv_minutes DIV c_minutes_per_hour.
IF iv_minutes MOD c_minutes_per_hour = 0.
rv_hours = rv_hours + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

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

View File

@@ -0,0 +1,123 @@
CLASS {{p}}parking_hidden DEFINITION
PUBLIC
FINAL
CREATE PUBLIC
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}parking_pricer.
METHODS setup.
METHODS assert_fee
IMPORTING iv_expected TYPE {{p}}parking_pricer=>ty_fee
iv_minutes TYPE i
iv_vehicle TYPE {{p}}parking_pricer=>ty_vehicle
iv_lost TYPE abap_bool DEFAULT abap_false.
METHODS car_short_stay FOR TESTING.
METHODS grace_period_free FOR TESTING.
METHODS just_after_grace FOR TESTING.
METHODS negative_minutes_free FOR TESTING.
METHODS started_hour_rounds_up FOR TESTING.
METHODS motorcycle_and_van_rates FOR TESTING.
METHODS daily_caps FOR TESTING.
METHODS lost_ticket_fees FOR TESTING.
METHODS unknown_vehicle_free FOR TESTING.
METHODS unknown_vehicle_lost FOR TESTING.
ENDCLASS.
CLASS {{p}}parking_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}parking_pricer( ).
ENDMETHOD.
METHOD assert_fee.
cl_abap_unit_assert=>assert_equals(
exp = iv_expected
act = mo_cut->calculate_fee( iv_minutes = iv_minutes
iv_vehicle = iv_vehicle
iv_lost_ticket = iv_lost ) ).
ENDMETHOD.
METHOD car_short_stay.
assert_fee( iv_expected = '4.00'
iv_minutes = 90
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD grace_period_free.
assert_fee( iv_expected = '0.00'
iv_minutes = 15
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD just_after_grace.
assert_fee( iv_expected = '2.00'
iv_minutes = 16
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD negative_minutes_free.
assert_fee( iv_expected = '0.00'
iv_minutes = -30
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD started_hour_rounds_up.
assert_fee( iv_expected = '4.00'
iv_minutes = 61
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD motorcycle_and_van_rates.
assert_fee( iv_expected = '2.00'
iv_minutes = 120
iv_vehicle = {{p}}parking_pricer=>c_vehicle_motorcycle ).
assert_fee( iv_expected = '6.00'
iv_minutes = 120
iv_vehicle = {{p}}parking_pricer=>c_vehicle_van ).
ENDMETHOD.
METHOD daily_caps.
assert_fee( iv_expected = '20.00'
iv_minutes = 900
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
assert_fee( iv_expected = '24.00'
iv_minutes = 600
iv_vehicle = {{p}}parking_pricer=>c_vehicle_van ).
assert_fee( iv_expected = '10.00'
iv_minutes = 1200
iv_vehicle = {{p}}parking_pricer=>c_vehicle_motorcycle ).
ENDMETHOD.
METHOD lost_ticket_fees.
assert_fee( iv_expected = '25.00'
iv_minutes = 5
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car
iv_lost = abap_true ).
assert_fee( iv_expected = '15.00'
iv_minutes = 120
iv_vehicle = {{p}}parking_pricer=>c_vehicle_motorcycle
iv_lost = abap_true ).
assert_fee( iv_expected = '35.00'
iv_minutes = 120
iv_vehicle = {{p}}parking_pricer=>c_vehicle_van
iv_lost = abap_true ).
ENDMETHOD.
METHOD unknown_vehicle_free.
assert_fee( iv_expected = '0.00'
iv_minutes = 120
iv_vehicle = 'X' ).
ENDMETHOD.
METHOD unknown_vehicle_lost.
assert_fee( iv_expected = '25.00'
iv_minutes = 120
iv_vehicle = 'X'
iv_lost = abap_true ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,80 @@
{
"task": "G1062",
"mutants": [
{
"object": "{{P}}PARKING_PRICER",
"mutant": "line 61: = -> <> (eq)",
"status": "killed",
"hidden": "0/10",
"failed_tests": [
"CAR_SHORT_STAY",
"DAILY_CAPS",
"GRACE_PERIOD_FREE",
"JUST_AFTER_GRACE",
"LOST_TICKET_FEES",
"MOTORCYCLE_AND_VAN_RATES",
"NEGATIVE_MINUTES_FREE",
"STARTED_HOUR_ROUNDS_UP",
"UNKNOWN_VEHICLE_FREE",
"UNKNOWN_VEHICLE_LOST"
]
},
{
"object": "{{P}}PARKING_PRICER",
"mutant": "line 66: <= -> > (rel)",
"status": "killed",
"hidden": "4/10",
"failed_tests": [
"CAR_SHORT_STAY",
"DAILY_CAPS",
"GRACE_PERIOD_FREE",
"JUST_AFTER_GRACE",
"MOTORCYCLE_AND_VAN_RATES",
"STARTED_HOUR_ROUNDS_UP"
]
},
{
"object": "{{P}}PARKING_PRICER",
"mutant": "line 71: * -> / (arith)",
"status": "killed",
"hidden": "4/10",
"failed_tests": [
"CAR_SHORT_STAY",
"DAILY_CAPS",
"JUST_AFTER_GRACE",
"MOTORCYCLE_AND_VAN_RATES",
"STARTED_HOUR_ROUNDS_UP",
"UNKNOWN_VEHICLE_FREE"
]
},
{
"object": "{{P}}PARKING_PRICER",
"mutant": "line 72: > -> <= (rel)",
"status": "killed",
"hidden": "5/10",
"failed_tests": [
"CAR_SHORT_STAY",
"DAILY_CAPS",
"JUST_AFTER_GRACE",
"MOTORCYCLE_AND_VAN_RATES",
"STARTED_HOUR_ROUNDS_UP"
]
},
{
"object": "{{P}}PARKING_PRICER",
"mutant": "line 108: <> -> = (rel)",
"status": "killed",
"hidden": "6/10",
"failed_tests": [
"CAR_SHORT_STAY",
"JUST_AFTER_GRACE",
"MOTORCYCLE_AND_VAN_RATES",
"STARTED_HOUR_ROUNDS_UP"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,112 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
CONSTANTS:
c_grace_minutes TYPE i VALUE 15,
c_minutes_per_hour TYPE i VALUE 60,
c_no_fee TYPE ty_fee VALUE '0.00',
c_car_rate TYPE ty_fee VALUE '2.00',
c_car_cap TYPE ty_fee VALUE '20.00',
c_car_lost_fee TYPE ty_fee VALUE '25.00',
c_moto_rate TYPE ty_fee VALUE '1.00',
c_moto_cap TYPE ty_fee VALUE '10.00',
c_moto_lost_fee TYPE ty_fee VALUE '15.00',
c_van_rate TYPE ty_fee VALUE '3.00',
c_van_cap TYPE ty_fee VALUE '24.00',
c_van_lost_fee TYPE ty_fee VALUE '35.00',
c_default_lost_fee TYPE ty_fee VALUE '25.00'.
TYPES:
BEGIN OF ty_tariff,
vehicle TYPE ty_vehicle,
rate TYPE ty_fee,
cap TYPE ty_fee,
lost_fee TYPE ty_fee,
END OF ty_tariff,
tt_tariff TYPE HASHED TABLE OF ty_tariff WITH UNIQUE KEY vehicle.
METHODS get_tariff
IMPORTING iv_vehicle TYPE ty_vehicle
RETURNING VALUE(rs_tariff) TYPE ty_tariff.
METHODS all_tariffs
RETURNING VALUE(rt_tariff) TYPE tt_tariff.
METHODS started_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA(ls_tariff) = get_tariff( iv_vehicle ).
IF iv_lost_ticket = abap_true.
rv_fee = ls_tariff-lost_fee.
RETURN.
ENDIF.
IF iv_minutes <= c_grace_minutes.
rv_fee = c_no_fee.
RETURN.
ENDIF.
rv_fee = started_hours( iv_minutes ) * ls_tariff-rate.
IF rv_fee > ls_tariff-cap.
rv_fee = ls_tariff-cap.
ENDIF.
ENDMETHOD.
METHOD get_tariff.
DATA(lt_tariff) = all_tariffs( ).
ASSIGN lt_tariff[ vehicle = iv_vehicle ] TO FIELD-SYMBOL(<ls_tariff>).
IF sy-subrc = 0.
rs_tariff = <ls_tariff>.
ELSE.
rs_tariff = VALUE #( vehicle = iv_vehicle
rate = c_no_fee
cap = c_no_fee
lost_fee = c_default_lost_fee ).
ENDIF.
ENDMETHOD.
METHOD all_tariffs.
rt_tariff = VALUE #(
( vehicle = c_vehicle_car
rate = c_car_rate
cap = c_car_cap
lost_fee = c_car_lost_fee )
( vehicle = c_vehicle_motorcycle
rate = c_moto_rate
cap = c_moto_cap
lost_fee = c_moto_lost_fee )
( vehicle = c_vehicle_van
rate = c_van_rate
cap = c_van_cap
lost_fee = c_van_lost_fee ) ).
ENDMETHOD.
METHOD started_hours.
rv_hours = iv_minutes DIV c_minutes_per_hour.
IF iv_minutes MOD c_minutes_per_hour <> 0.
rv_hours = rv_hours + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,72 @@
CLASS ltc_parking_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}parking_pricer.
METHODS setup.
METHODS assert_fee
IMPORTING iv_expected TYPE {{p}}parking_pricer=>ty_fee
iv_minutes TYPE i
iv_vehicle TYPE {{p}}parking_pricer=>ty_vehicle
iv_lost TYPE abap_bool DEFAULT abap_false.
METHODS car_short_stay FOR TESTING.
METHODS grace_period_free FOR TESTING.
METHODS started_hour_rounds_up FOR TESTING.
METHODS daily_cap_applies FOR TESTING.
METHODS lost_ticket_is_flat FOR TESTING.
METHODS unknown_vehicle_is_free FOR TESTING.
ENDCLASS.
CLASS ltc_parking_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}parking_pricer( ).
ENDMETHOD.
METHOD assert_fee.
cl_abap_unit_assert=>assert_equals(
exp = iv_expected
act = mo_cut->calculate_fee( iv_minutes = iv_minutes
iv_vehicle = iv_vehicle
iv_lost_ticket = iv_lost ) ).
ENDMETHOD.
METHOD car_short_stay.
assert_fee( iv_expected = '4.00'
iv_minutes = 90
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD grace_period_free.
assert_fee( iv_expected = '0.00'
iv_minutes = 10
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD started_hour_rounds_up.
assert_fee( iv_expected = '4.00'
iv_minutes = 61
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD daily_cap_applies.
assert_fee( iv_expected = '20.00'
iv_minutes = 900
iv_vehicle = {{p}}parking_pricer=>c_vehicle_car ).
ENDMETHOD.
METHOD lost_ticket_is_flat.
assert_fee( iv_expected = '15.00'
iv_minutes = 10
iv_vehicle = {{p}}parking_pricer=>c_vehicle_motorcycle
iv_lost = abap_true ).
ENDMETHOD.
METHOD unknown_vehicle_is_free.
assert_fee( iv_expected = '0.00'
iv_minutes = 120
iv_vehicle = 'X' ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,91 @@
CLASS {{p}}parking_pricer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_vehicle TYPE c LENGTH 1.
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
c_vehicle_car TYPE ty_vehicle VALUE 'C',
c_vehicle_motorcycle TYPE ty_vehicle VALUE 'M',
c_vehicle_van TYPE ty_vehicle VALUE 'V'.
METHODS calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
PRIVATE SECTION.
METHODS lost_ticket_fee
IMPORTING iv_vehicle TYPE ty_vehicle
EXPORTING ev_fee TYPE ty_fee.
ENDCLASS.
CLASS {{p}}parking_pricer IMPLEMENTATION.
METHOD calculate_fee.
DATA lv_minutes TYPE i.
DATA lv_hours TYPE i.
DATA lv_rate TYPE ty_fee.
DATA lv_cap TYPE ty_fee.
IF iv_lost_ticket = abap_true.
" a lost ticket is charged with a flat fee
lost_ticket_fee( EXPORTING iv_vehicle = iv_vehicle
IMPORTING ev_fee = rv_fee ).
ELSE.
IF iv_minutes < 0.
lv_minutes = 0.
ELSE.
lv_minutes = iv_minutes.
ENDIF.
IF lv_minutes <= 15.
" the first 15 minutes are free
rv_fee = 0.
ELSE.
lv_hours = lv_minutes DIV 60.
IF lv_minutes MOD 60 <> 0.
lv_hours = lv_hours + 1.
ENDIF.
IF lv_hours < 1.
lv_hours = 1.
ENDIF.
IF iv_vehicle = 'C'.
lv_rate = '2.00'.
lv_cap = '20.00'.
ELSEIF iv_vehicle = 'M'.
lv_rate = '1.00'.
lv_cap = '10.00'.
ELSEIF iv_vehicle = 'V'.
lv_rate = '3.00'.
lv_cap = '24.00'.
ELSE.
lv_rate = '0.00'.
lv_cap = '0.00'.
ENDIF.
rv_fee = lv_hours * lv_rate.
IF rv_fee > lv_cap.
rv_fee = lv_cap.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD lost_ticket_fee.
IF iv_vehicle = 'C'.
ev_fee = '25.00'.
ELSEIF iv_vehicle = 'M'.
ev_fee = '15.00'.
ELSEIF iv_vehicle = 'V'.
ev_fee = '35.00'.
ELSE.
ev_fee = '25.00'.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,50 @@
# 1. Goal
Refactor the legacy class {{P}}PARKING_PRICER in package $TMP. A car park
operator uses the class to price a parking session. The class must keep its
public interface and must return the same fee as before for every input.
# 2. Open questions
None.
# 3. Context
- The class {{P}}PARKING_PRICER exists in package $TMP. It is active.
- The class is the contract object of this task. Refactor it in place. Keep the
class name, the package and the public interface.
- A checkout terminal calls the method calculate_fee for each parking session
and prints the returned fee.
- The legacy implementation contains the business rules. Read the legacy code
before you change it.
# 4. Contract
- Class {{P}}PARKING_PRICER in package $TMP. Public, final, create public.
- Public type ty_vehicle (c length 1).
- Public type ty_fee (p length 8, 2 decimals).
- Public constants:
c_vehicle_car = 'C', c_vehicle_motorcycle = 'M', c_vehicle_van = 'V'.
- Public method:
calculate_fee
IMPORTING iv_minutes TYPE i
iv_vehicle TYPE ty_vehicle
iv_lost_ticket TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE ty_fee.
- Do not add other public methods. Do not change the signature.
# 5. Business rules
The behavior stays the same. The legacy implementation in package $TMP is the
only source of the rules. For every combination of iv_minutes, iv_vehicle and
iv_lost_ticket the refactored class must return the same fee as the legacy
class.
# 6. Constraints
- Release target: SAP_BASIS 816 (ABAP Platform 2025).
- Coding standards: Clean ABAP. Methods below 40 statements. No magic numbers.
No deep nesting. No duplicated code. No comment that restates the code. No
global variables.
- Out of scope: the public interface of {{P}}PARKING_PRICER. Do not rename,
remove or add public types, constants or methods.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.
- No ATC priority 1 or priority 2 finding.

View File

@@ -0,0 +1,52 @@
{
"id": "G1062",
"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}}PARKING_PRICER",
"file": "seed/parking_pricer.clas.abap",
"description": "Legacy parking fee pricer with magic numbers, deep nesting and duplicated vehicle branches"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}PARKING_PRICER"
}
],
"out_of_scope": [
"Public interface of {{P}}PARKING_PRICER"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}PARKING_HIDDEN",
"file": "hidden/parking_hidden.clas.abap",
"description": "Behavior tests for the parking fee"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}PARKING_PRICER",
"file": "reference/parking_pricer.clas.abap",
"description": "Refactored parking fee pricer",
"testclasses_file": "reference/parking_pricer.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"magic_number",
"nesting_depth",
"duplicate_code"
]
}