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,145 @@
CLASS {{p}}pool_ticket DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_zone TYPE c LENGTH 2.
TYPES ty_rate TYPE c LENGTH 1.
TYPES ty_day TYPE c LENGTH 2.
TYPES ty_flag TYPE c LENGTH 1.
TYPES ty_status TYPE c LENGTH 2.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
BEGIN OF c_status,
ok TYPE ty_status VALUE 'OK',
zone TYPE ty_status VALUE 'ZN',
rate TYPE ty_status VALUE 'RT',
day TYPE ty_status VALUE 'DY',
END OF c_status.
CONSTANTS:
BEGIN OF c_flag,
member TYPE ty_flag VALUE 'X',
guest TYPE ty_flag VALUE ' ',
END OF c_flag.
METHODS check_booking
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
RETURNING VALUE(rv_status) TYPE ty_status.
METHODS ticket_price
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
iv_member TYPE ty_flag
RETURNING VALUE(rv_price) TYPE ty_amount.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_base_price,
zone TYPE ty_zone,
rate TYPE ty_rate,
base TYPE ty_amount,
END OF ty_base_price,
tt_base_price TYPE HASHED TABLE OF ty_base_price WITH UNIQUE KEY zone rate.
CONSTANTS c_weekend_surcharge TYPE ty_amount VALUE '2.50'.
CONSTANTS c_member_share TYPE i VALUE 80.
METHODS base_prices
RETURNING VALUE(rt_price) TYPE tt_base_price.
METHODS weekend_surcharge
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
METHODS is_known_zone
IMPORTING iv_zone TYPE ty_zone
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_rate
IMPORTING iv_rate TYPE ty_rate
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_day
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_known) TYPE abap_bool.
ENDCLASS.
CLASS {{p}}pool_ticket IMPLEMENTATION.
METHOD check_booking.
IF is_known_zone( iv_zone ) = abap_false.
rv_status = c_status-zone.
RETURN.
ENDIF.
IF is_known_rate( iv_rate ) = abap_false.
rv_status = c_status-rate.
RETURN.
ENDIF.
IF is_known_day( iv_day ) = abap_true.
rv_status = c_status-day.
RETURN.
ENDIF.
rv_status = c_status-ok.
ENDMETHOD.
METHOD ticket_price.
IF check_booking( iv_zone = iv_zone
iv_rate = iv_rate
iv_day = iv_day ) <> c_status-ok.
rv_price = 0.
RETURN.
ENDIF.
DATA(lt_price) = base_prices( ).
READ TABLE lt_price INTO DATA(ls_price)
WITH TABLE KEY zone = iv_zone rate = iv_rate.
IF sy-subrc <> 0.
rv_price = 0.
RETURN.
ENDIF.
rv_price = ls_price-base + weekend_surcharge( iv_day ).
IF iv_member = c_flag-member.
rv_price = rv_price * c_member_share / 100.
ENDIF.
ENDMETHOD.
METHOD base_prices.
rt_price = VALUE #(
( zone = 'IN' rate = 'A' base = '10.00' )
( zone = 'IN' rate = 'C' base = '5.00' )
( zone = 'IN' rate = 'S' base = '7.50' )
( zone = 'OU' rate = 'A' base = '7.50' )
( zone = 'OU' rate = 'C' base = '3.75' )
( zone = 'OU' rate = 'S' base = '5.00' )
( zone = 'SA' rate = 'A' base = '15.00' )
( zone = 'SA' rate = 'C' base = '7.50' )
( zone = 'SA' rate = 'S' base = '11.25' )
( zone = 'AL' rate = 'A' base = '20.00' )
( zone = 'AL' rate = 'C' base = '10.00' )
( zone = 'AL' rate = 'S' base = '15.00' ) ).
ENDMETHOD.
METHOD weekend_surcharge.
IF iv_day = 'SA' OR iv_day = 'SU'.
rv_surcharge = c_weekend_surcharge.
ENDIF.
ENDMETHOD.
METHOD is_known_zone.
rv_known = xsdbool( iv_zone = 'IN' OR iv_zone = 'OU'
OR iv_zone = 'SA' OR iv_zone = 'AL' ).
ENDMETHOD.
METHOD is_known_rate.
rv_known = xsdbool( iv_rate = 'A' OR iv_rate = 'C' OR iv_rate = 'S' ).
ENDMETHOD.
METHOD is_known_day.
rv_known = xsdbool( iv_day = 'MO' OR iv_day = 'TU' OR iv_day = 'WE'
OR iv_day = 'TH' OR iv_day = 'FR' OR iv_day = 'SA'
OR iv_day = 'SU' ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,145 @@
CLASS {{p}}pool_ticket DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_zone TYPE c LENGTH 2.
TYPES ty_rate TYPE c LENGTH 1.
TYPES ty_day TYPE c LENGTH 2.
TYPES ty_flag TYPE c LENGTH 1.
TYPES ty_status TYPE c LENGTH 2.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
BEGIN OF c_status,
ok TYPE ty_status VALUE 'OK',
zone TYPE ty_status VALUE 'ZN',
rate TYPE ty_status VALUE 'RT',
day TYPE ty_status VALUE 'DY',
END OF c_status.
CONSTANTS:
BEGIN OF c_flag,
member TYPE ty_flag VALUE 'X',
guest TYPE ty_flag VALUE ' ',
END OF c_flag.
METHODS check_booking
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
RETURNING VALUE(rv_status) TYPE ty_status.
METHODS ticket_price
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
iv_member TYPE ty_flag
RETURNING VALUE(rv_price) TYPE ty_amount.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_base_price,
zone TYPE ty_zone,
rate TYPE ty_rate,
base TYPE ty_amount,
END OF ty_base_price,
tt_base_price TYPE HASHED TABLE OF ty_base_price WITH UNIQUE KEY zone rate.
CONSTANTS c_weekend_surcharge TYPE ty_amount VALUE '2.50'.
CONSTANTS c_member_share TYPE i VALUE 80.
METHODS base_prices
RETURNING VALUE(rt_price) TYPE tt_base_price.
METHODS weekend_surcharge
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
METHODS is_known_zone
IMPORTING iv_zone TYPE ty_zone
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_rate
IMPORTING iv_rate TYPE ty_rate
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_day
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_known) TYPE abap_bool.
ENDCLASS.
CLASS {{p}}pool_ticket IMPLEMENTATION.
METHOD check_booking.
IF is_known_zone( iv_zone ) = abap_false.
rv_status = c_status-zone.
RETURN.
ENDIF.
IF is_known_rate( iv_rate ) = abap_false.
rv_status = c_status-rate.
RETURN.
ENDIF.
IF is_known_day( iv_day ) = abap_false.
rv_status = c_status-day.
RETURN.
ENDIF.
rv_status = c_status-ok.
ENDMETHOD.
METHOD ticket_price.
IF check_booking( iv_zone = iv_zone
iv_rate = iv_rate
iv_day = iv_day ) = c_status-ok.
rv_price = 0.
RETURN.
ENDIF.
DATA(lt_price) = base_prices( ).
READ TABLE lt_price INTO DATA(ls_price)
WITH TABLE KEY zone = iv_zone rate = iv_rate.
IF sy-subrc <> 0.
rv_price = 0.
RETURN.
ENDIF.
rv_price = ls_price-base + weekend_surcharge( iv_day ).
IF iv_member = c_flag-member.
rv_price = rv_price * c_member_share / 100.
ENDIF.
ENDMETHOD.
METHOD base_prices.
rt_price = VALUE #(
( zone = 'IN' rate = 'A' base = '10.00' )
( zone = 'IN' rate = 'C' base = '5.00' )
( zone = 'IN' rate = 'S' base = '7.50' )
( zone = 'OU' rate = 'A' base = '7.50' )
( zone = 'OU' rate = 'C' base = '3.75' )
( zone = 'OU' rate = 'S' base = '5.00' )
( zone = 'SA' rate = 'A' base = '15.00' )
( zone = 'SA' rate = 'C' base = '7.50' )
( zone = 'SA' rate = 'S' base = '11.25' )
( zone = 'AL' rate = 'A' base = '20.00' )
( zone = 'AL' rate = 'C' base = '10.00' )
( zone = 'AL' rate = 'S' base = '15.00' ) ).
ENDMETHOD.
METHOD weekend_surcharge.
IF iv_day = 'SA' OR iv_day = 'SU'.
rv_surcharge = c_weekend_surcharge.
ENDIF.
ENDMETHOD.
METHOD is_known_zone.
rv_known = xsdbool( iv_zone = 'IN' OR iv_zone = 'OU'
OR iv_zone = 'SA' OR iv_zone = 'AL' ).
ENDMETHOD.
METHOD is_known_rate.
rv_known = xsdbool( iv_rate = 'A' OR iv_rate = 'C' OR iv_rate = 'S' ).
ENDMETHOD.
METHOD is_known_day.
rv_known = xsdbool( iv_day = 'MO' OR iv_day = 'TU' OR iv_day = 'WE'
OR iv_day = 'TH' OR iv_day = 'FR' OR iv_day = 'SA'
OR iv_day = 'SU' ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,145 @@
CLASS {{p}}pool_ticket DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_zone TYPE c LENGTH 2.
TYPES ty_rate TYPE c LENGTH 1.
TYPES ty_day TYPE c LENGTH 2.
TYPES ty_flag TYPE c LENGTH 1.
TYPES ty_status TYPE c LENGTH 2.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
BEGIN OF c_status,
ok TYPE ty_status VALUE 'OK',
zone TYPE ty_status VALUE 'ZN',
rate TYPE ty_status VALUE 'RT',
day TYPE ty_status VALUE 'DY',
END OF c_status.
CONSTANTS:
BEGIN OF c_flag,
member TYPE ty_flag VALUE 'X',
guest TYPE ty_flag VALUE ' ',
END OF c_flag.
METHODS check_booking
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
RETURNING VALUE(rv_status) TYPE ty_status.
METHODS ticket_price
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
iv_member TYPE ty_flag
RETURNING VALUE(rv_price) TYPE ty_amount.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_base_price,
zone TYPE ty_zone,
rate TYPE ty_rate,
base TYPE ty_amount,
END OF ty_base_price,
tt_base_price TYPE HASHED TABLE OF ty_base_price WITH UNIQUE KEY zone rate.
CONSTANTS c_weekend_surcharge TYPE ty_amount VALUE '2.50'.
CONSTANTS c_member_share TYPE i VALUE 80.
METHODS base_prices
RETURNING VALUE(rt_price) TYPE tt_base_price.
METHODS weekend_surcharge
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
METHODS is_known_zone
IMPORTING iv_zone TYPE ty_zone
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_rate
IMPORTING iv_rate TYPE ty_rate
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_day
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_known) TYPE abap_bool.
ENDCLASS.
CLASS {{p}}pool_ticket IMPLEMENTATION.
METHOD check_booking.
IF is_known_zone( iv_zone ) = abap_false.
rv_status = c_status-zone.
RETURN.
ENDIF.
IF is_known_rate( iv_rate ) = abap_false.
rv_status = c_status-rate.
RETURN.
ENDIF.
IF is_known_day( iv_day ) = abap_false.
rv_status = c_status-day.
RETURN.
ENDIF.
rv_status = c_status-ok.
ENDMETHOD.
METHOD ticket_price.
IF check_booking( iv_zone = iv_zone
iv_rate = iv_rate
iv_day = iv_day ) <> c_status-ok.
rv_price = 0.
RETURN.
ENDIF.
DATA(lt_price) = base_prices( ).
READ TABLE lt_price INTO DATA(ls_price)
WITH TABLE KEY zone = iv_zone rate = iv_rate.
IF sy-subrc <> 0.
rv_price = 0.
RETURN.
ENDIF.
rv_price = ls_price-base - weekend_surcharge( iv_day ).
IF iv_member = c_flag-member.
rv_price = rv_price * c_member_share / 100.
ENDIF.
ENDMETHOD.
METHOD base_prices.
rt_price = VALUE #(
( zone = 'IN' rate = 'A' base = '10.00' )
( zone = 'IN' rate = 'C' base = '5.00' )
( zone = 'IN' rate = 'S' base = '7.50' )
( zone = 'OU' rate = 'A' base = '7.50' )
( zone = 'OU' rate = 'C' base = '3.75' )
( zone = 'OU' rate = 'S' base = '5.00' )
( zone = 'SA' rate = 'A' base = '15.00' )
( zone = 'SA' rate = 'C' base = '7.50' )
( zone = 'SA' rate = 'S' base = '11.25' )
( zone = 'AL' rate = 'A' base = '20.00' )
( zone = 'AL' rate = 'C' base = '10.00' )
( zone = 'AL' rate = 'S' base = '15.00' ) ).
ENDMETHOD.
METHOD weekend_surcharge.
IF iv_day = 'SA' OR iv_day = 'SU'.
rv_surcharge = c_weekend_surcharge.
ENDIF.
ENDMETHOD.
METHOD is_known_zone.
rv_known = xsdbool( iv_zone = 'IN' OR iv_zone = 'OU'
OR iv_zone = 'SA' OR iv_zone = 'AL' ).
ENDMETHOD.
METHOD is_known_rate.
rv_known = xsdbool( iv_rate = 'A' OR iv_rate = 'C' OR iv_rate = 'S' ).
ENDMETHOD.
METHOD is_known_day.
rv_known = xsdbool( iv_day = 'MO' OR iv_day = 'TU' OR iv_day = 'WE'
OR iv_day = 'TH' OR iv_day = 'FR' OR iv_day = 'SA'
OR iv_day = 'SU' ).
ENDMETHOD.
ENDCLASS.

View File

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

View File

@@ -0,0 +1,113 @@
CLASS {{p}}t31_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}pool_ticket.
DATA mv_member TYPE {{p}}pool_ticket=>ty_flag.
DATA mv_guest TYPE {{p}}pool_ticket=>ty_flag.
METHODS setup.
METHODS valid_booking_is_ok FOR TESTING.
METHODS unknown_zone FOR TESTING.
METHODS unknown_rate FOR TESTING.
METHODS unknown_day FOR TESTING.
METHODS zone_checked_first FOR TESTING.
METHODS lower_case_zone FOR TESTING.
METHODS price_indoor_adult FOR TESTING.
METHODS price_outdoor_child_weekend FOR TESTING.
METHODS price_sauna_senior_member FOR TESTING.
METHODS price_all_areas_weekend_member FOR TESTING.
METHODS price_member_weekday_child FOR TESTING.
METHODS price_invalid_booking FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}pool_ticket( ).
mv_member = {{p}}pool_ticket=>c_flag-member.
mv_guest = {{p}}pool_ticket=>c_flag-guest.
ENDMETHOD.
METHOD valid_booking_is_ok.
DATA lv_status TYPE {{p}}pool_ticket=>ty_status.
lv_status = mo_cut->check_booking( iv_zone = 'IN' iv_rate = 'A' iv_day = 'MO' ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}pool_ticket=>c_status-ok
act = lv_status ).
ENDMETHOD.
METHOD unknown_zone.
DATA(lv_zone) = CONV {{p}}pool_ticket=>ty_zone( 'XX' ).
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-zone
act = mo_cut->check_booking( iv_zone = lv_zone iv_rate = 'A' iv_day = 'MO' ) ).
ENDMETHOD.
METHOD unknown_rate.
DATA(lv_rate) = CONV {{p}}pool_ticket=>ty_rate( 'X' ).
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-rate
act = mo_cut->check_booking( iv_zone = 'IN' iv_rate = lv_rate iv_day = 'XX' ) ).
ENDMETHOD.
METHOD unknown_day.
DATA(lv_day) = CONV {{p}}pool_ticket=>ty_day( 'XX' ).
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-day
act = mo_cut->check_booking( iv_zone = 'IN' iv_rate = 'A' iv_day = lv_day ) ).
ENDMETHOD.
METHOD zone_checked_first.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-zone
act = mo_cut->check_booking( iv_zone = 'XX' iv_rate = 'X' iv_day = 'XX' ) ).
ENDMETHOD.
METHOD lower_case_zone.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-zone
act = mo_cut->check_booking( iv_zone = 'in' iv_rate = 'A' iv_day = 'MO' ) ).
ENDMETHOD.
METHOD price_indoor_adult.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '10.00' )
act = mo_cut->ticket_price( iv_zone = 'IN' iv_rate = 'A' iv_day = 'MO'
iv_member = mv_guest ) ).
ENDMETHOD.
METHOD price_outdoor_child_weekend.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '6.25' )
act = mo_cut->ticket_price( iv_zone = 'OU' iv_rate = 'C' iv_day = 'SA'
iv_member = mv_guest ) ).
ENDMETHOD.
METHOD price_sauna_senior_member.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '9.00' )
act = mo_cut->ticket_price( iv_zone = 'SA' iv_rate = 'S' iv_day = 'MO'
iv_member = mv_member ) ).
ENDMETHOD.
METHOD price_all_areas_weekend_member.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '18.00' )
act = mo_cut->ticket_price( iv_zone = 'AL' iv_rate = 'A' iv_day = 'SU'
iv_member = mv_member ) ).
ENDMETHOD.
METHOD price_member_weekday_child.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '4.00' )
act = mo_cut->ticket_price( iv_zone = 'IN' iv_rate = 'C' iv_day = 'WE'
iv_member = mv_member ) ).
ENDMETHOD.
METHOD price_invalid_booking.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '0.00' )
act = mo_cut->ticket_price( iv_zone = 'XX' iv_rate = 'A' iv_day = 'MO'
iv_member = mv_guest ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,61 @@
{
"task": "G1135",
"mutants": [
{
"object": "{{P}}POOL_TICKET",
"mutant": "line 80: abap_false -> abap_true (bool)",
"status": "killed",
"hidden": "5/12",
"failed_tests": [
"PRICE_ALL_AREAS_WEEKEND_MEMBER",
"PRICE_INDOOR_ADULT",
"PRICE_MEMBER_WEEKDAY_CHILD",
"PRICE_OUTDOOR_CHILD_WEEKEND",
"PRICE_SAUNA_SENIOR_MEMBER",
"UNKNOWN_DAY",
"VALID_BOOKING_IS_OK"
]
},
{
"object": "{{P}}POOL_TICKET",
"mutant": "line 88: = -> <> (eq)",
"status": "invalid",
"hidden": "0/0",
"failed_tests": []
},
{
"object": "{{P}}POOL_TICKET",
"mutant": "line 90: <> -> = (rel)",
"status": "killed",
"hidden": "7/12",
"failed_tests": [
"PRICE_ALL_AREAS_WEEKEND_MEMBER",
"PRICE_INDOOR_ADULT",
"PRICE_MEMBER_WEEKDAY_CHILD",
"PRICE_OUTDOOR_CHILD_WEEKEND",
"PRICE_SAUNA_SENIOR_MEMBER"
]
},
{
"object": "{{P}}POOL_TICKET",
"mutant": "line 103: + -> - (arith)",
"status": "killed",
"hidden": "10/12",
"failed_tests": [
"PRICE_ALL_AREAS_WEEKEND_MEMBER",
"PRICE_OUTDOOR_CHILD_WEEKEND"
]
},
{
"object": "{{P}}POOL_TICKET",
"mutant": "line 142: OR -> AND (logic)",
"status": "survived",
"hidden": "12/12",
"failed_tests": []
}
],
"valid": 4,
"killed": 3,
"kill_rate": 0.75,
"ok": true
}

View File

@@ -0,0 +1,145 @@
CLASS {{p}}pool_ticket DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_zone TYPE c LENGTH 2.
TYPES ty_rate TYPE c LENGTH 1.
TYPES ty_day TYPE c LENGTH 2.
TYPES ty_flag TYPE c LENGTH 1.
TYPES ty_status TYPE c LENGTH 2.
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
BEGIN OF c_status,
ok TYPE ty_status VALUE 'OK',
zone TYPE ty_status VALUE 'ZN',
rate TYPE ty_status VALUE 'RT',
day TYPE ty_status VALUE 'DY',
END OF c_status.
CONSTANTS:
BEGIN OF c_flag,
member TYPE ty_flag VALUE 'X',
guest TYPE ty_flag VALUE ' ',
END OF c_flag.
METHODS check_booking
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
RETURNING VALUE(rv_status) TYPE ty_status.
METHODS ticket_price
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
iv_member TYPE ty_flag
RETURNING VALUE(rv_price) TYPE ty_amount.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_base_price,
zone TYPE ty_zone,
rate TYPE ty_rate,
base TYPE ty_amount,
END OF ty_base_price,
tt_base_price TYPE HASHED TABLE OF ty_base_price WITH UNIQUE KEY zone rate.
CONSTANTS c_weekend_surcharge TYPE ty_amount VALUE '2.50'.
CONSTANTS c_member_share TYPE i VALUE 80.
METHODS base_prices
RETURNING VALUE(rt_price) TYPE tt_base_price.
METHODS weekend_surcharge
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
METHODS is_known_zone
IMPORTING iv_zone TYPE ty_zone
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_rate
IMPORTING iv_rate TYPE ty_rate
RETURNING VALUE(rv_known) TYPE abap_bool.
METHODS is_known_day
IMPORTING iv_day TYPE ty_day
RETURNING VALUE(rv_known) TYPE abap_bool.
ENDCLASS.
CLASS {{p}}pool_ticket IMPLEMENTATION.
METHOD check_booking.
IF is_known_zone( iv_zone ) = abap_false.
rv_status = c_status-zone.
RETURN.
ENDIF.
IF is_known_rate( iv_rate ) = abap_false.
rv_status = c_status-rate.
RETURN.
ENDIF.
IF is_known_day( iv_day ) = abap_false.
rv_status = c_status-day.
RETURN.
ENDIF.
rv_status = c_status-ok.
ENDMETHOD.
METHOD ticket_price.
IF check_booking( iv_zone = iv_zone
iv_rate = iv_rate
iv_day = iv_day ) <> c_status-ok.
rv_price = 0.
RETURN.
ENDIF.
DATA(lt_price) = base_prices( ).
READ TABLE lt_price INTO DATA(ls_price)
WITH TABLE KEY zone = iv_zone rate = iv_rate.
IF sy-subrc <> 0.
rv_price = 0.
RETURN.
ENDIF.
rv_price = ls_price-base + weekend_surcharge( iv_day ).
IF iv_member = c_flag-member.
rv_price = rv_price * c_member_share / 100.
ENDIF.
ENDMETHOD.
METHOD base_prices.
rt_price = VALUE #(
( zone = 'IN' rate = 'A' base = '10.00' )
( zone = 'IN' rate = 'C' base = '5.00' )
( zone = 'IN' rate = 'S' base = '7.50' )
( zone = 'OU' rate = 'A' base = '7.50' )
( zone = 'OU' rate = 'C' base = '3.75' )
( zone = 'OU' rate = 'S' base = '5.00' )
( zone = 'SA' rate = 'A' base = '15.00' )
( zone = 'SA' rate = 'C' base = '7.50' )
( zone = 'SA' rate = 'S' base = '11.25' )
( zone = 'AL' rate = 'A' base = '20.00' )
( zone = 'AL' rate = 'C' base = '10.00' )
( zone = 'AL' rate = 'S' base = '15.00' ) ).
ENDMETHOD.
METHOD weekend_surcharge.
IF iv_day = 'SA' OR iv_day = 'SU'.
rv_surcharge = c_weekend_surcharge.
ENDIF.
ENDMETHOD.
METHOD is_known_zone.
rv_known = xsdbool( iv_zone = 'IN' OR iv_zone = 'OU'
OR iv_zone = 'SA' OR iv_zone = 'AL' ).
ENDMETHOD.
METHOD is_known_rate.
rv_known = xsdbool( iv_rate = 'A' OR iv_rate = 'C' OR iv_rate = 'S' ).
ENDMETHOD.
METHOD is_known_day.
rv_known = xsdbool( iv_day = 'MO' OR iv_day = 'TU' OR iv_day = 'WE'
OR iv_day = 'TH' OR iv_day = 'FR' OR iv_day = 'SA'
OR iv_day = 'SU' ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,75 @@
CLASS ltc_pool_ticket DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}pool_ticket.
METHODS setup.
METHODS valid_booking FOR TESTING.
METHODS unknown_zone FOR TESTING.
METHODS unknown_rate FOR TESTING.
METHODS unknown_day FOR TESTING.
METHODS price_indoor_adult FOR TESTING.
METHODS price_weekend_surcharge FOR TESTING.
METHODS price_member_discount FOR TESTING.
METHODS price_invalid_booking FOR TESTING.
ENDCLASS.
CLASS ltc_pool_ticket IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}pool_ticket( ).
ENDMETHOD.
METHOD valid_booking.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-ok
act = mo_cut->check_booking( iv_zone = 'AL' iv_rate = 'S' iv_day = 'SU' ) ).
ENDMETHOD.
METHOD unknown_zone.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-zone
act = mo_cut->check_booking( iv_zone = 'ZZ' iv_rate = 'A' iv_day = 'MO' ) ).
ENDMETHOD.
METHOD unknown_rate.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-rate
act = mo_cut->check_booking( iv_zone = 'OU' iv_rate = 'B' iv_day = 'MO' ) ).
ENDMETHOD.
METHOD unknown_day.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}pool_ticket=>c_status-day
act = mo_cut->check_booking( iv_zone = 'OU' iv_rate = 'C' iv_day = 'XX' ) ).
ENDMETHOD.
METHOD price_indoor_adult.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '10.00' )
act = mo_cut->ticket_price( iv_zone = 'IN' iv_rate = 'A' iv_day = 'TU'
iv_member = {{p}}pool_ticket=>c_flag-guest ) ).
ENDMETHOD.
METHOD price_weekend_surcharge.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '12.50' )
act = mo_cut->ticket_price( iv_zone = 'IN' iv_rate = 'A' iv_day = 'SU'
iv_member = {{p}}pool_ticket=>c_flag-guest ) ).
ENDMETHOD.
METHOD price_member_discount.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '6.00' )
act = mo_cut->ticket_price( iv_zone = 'OU' iv_rate = 'A' iv_day = 'FR'
iv_member = {{p}}pool_ticket=>c_flag-member ) ).
ENDMETHOD.
METHOD price_invalid_booking.
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}pool_ticket=>ty_amount( '0.00' )
act = mo_cut->ticket_price( iv_zone = 'IN' iv_rate = 'A' iv_day = 'XX'
iv_member = {{p}}pool_ticket=>c_flag-member ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,70 @@
# 1. Goal
A leisure centre prices the entry tickets of its swimming pool. The ticket
desk calls the class for each visitor and prints the price. The desk also needs
one status code for each booking request.
# 2. Open questions
None.
# 3. Context
- No object of this task exists yet. Create everything that the contract lists.
- The leisure centre has four areas. Their area codes are IN (indoor pool),
OU (outdoor pool), SA (sauna area) and AL (all areas).
- The visitor rates are A (adult), C (child) and S (senior).
- The day keys are MO, TU, WE, TH, FR, SA and SU.
# 4. Contract
- Create the class {{P}}POOL_TICKET in package $TMP.
- The class is public and final. It has a public constructor without parameters.
- The class has these public types:
ty_zone TYPE c LENGTH 2, ty_rate TYPE c LENGTH 1, ty_day TYPE c LENGTH 2,
ty_flag TYPE c LENGTH 1, ty_status TYPE c LENGTH 2,
ty_amount TYPE p LENGTH 8 DECIMALS 2.
- The class has the public constant structure c_status with the components
ok = 'OK', zone = 'ZN', rate = 'RT', day = 'DY'.
- The class has the public constant structure c_flag with the components
member = 'X', guest = ' '.
- The class has these public methods:
check_booking
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
RETURNING VALUE(rv_status) TYPE ty_status.
ticket_price
IMPORTING iv_zone TYPE ty_zone
iv_rate TYPE ty_rate
iv_day TYPE ty_day
iv_member TYPE ty_flag
RETURNING VALUE(rv_price) TYPE ty_amount.
- Do not add other public methods.
# 5. Business rules
1. An area code is known if it is IN, OU, SA or AL. Compare the codes exactly.
Do not convert the codes to upper case.
2. A rate code is known if it is A, C or S.
3. A day key is known if it is MO, TU, WE, TH, FR, SA or SU.
4. check_booking checks the area code, then the rate code, then the day key.
It returns the status of the first check that fails. If all three checks
pass, it returns OK.
5. ticket_price returns 0 if check_booking does not return OK.
6. Else the price is the base price of the area and the rate, plus the weekend
surcharge, minus the member discount.
7. The base price in euro:
IN: A 10.00, C 5.00, S 7.50
OU: A 7.50, C 3.75, S 5.00
SA: A 15.00, C 7.50, S 11.25
AL: A 20.00, C 10.00, S 15.00
8. The weekend surcharge is 2.50. It applies when the day key is SA or SU.
9. The member discount is 20 per cent. It applies when iv_member is X. Apply
the discount to the sum of the base price and the surcharge.
# 6. Constraints
- Release target: SAP_BASIS 816 (ABAP Platform 2025).
- Coding standards: Clean ABAP. Method length below 40 statements. No global
variables. No comment that restates the code.
- Out of scope: do not change or create other objects.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,42 @@
{
"id": "G1135",
"category": "A",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [],
"contract": [
{
"type": "CLAS",
"name": "{{P}}POOL_TICKET"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T31_HIDDEN",
"file": "hidden/t31_hidden.clas.abap",
"description": "T31 hidden tests"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}POOL_TICKET",
"file": "reference/pool_ticket.clas.abap",
"description": "Swimming pool ticket price",
"testclasses_file": "reference/pool_ticket.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"no_global_variables",
"named_types_in_signature"
]
}