Fix coverage with several contract classes; table annotation and file path checks; clean task dir on write

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 08:44:35 +02:00
parent fb576b0954
commit 03ab36149e
388 changed files with 28620 additions and 339 deletions

View File

@@ -0,0 +1,108 @@
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_hotel_rate.
PRIVATE SECTION.
CONSTANTS:
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
METHODS validate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
METHODS room_count
IMPORTING iv_guests TYPE i
RETURNING VALUE(rv_rooms) TYPE i.
METHODS nightly_rate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS discount_percent
IMPORTING iv_nights TYPE i
RETURNING VALUE(rv_percent) TYPE i.
METHODS net_room_total
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS extras
IMPORTING iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
ENDCLASS.
CLASS {{p}}hotel_rate IMPLEMENTATION.
METHOD {{p}}if_hotel_rate~calculate.
rs_result-reason = validate( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests ).
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
rs_result-price = 0.
RETURN.
ENDIF.
rs_result-price = net_room_total( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests )
+ extras( iv_nights = iv_nights
iv_guests = iv_guests
iv_breakfast = iv_breakfast ).
ENDMETHOD.
METHOD validate.
IF iv_nights < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
ELSEIF iv_guests < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
ELSEIF iv_category = {{p}}if_hotel_rate=>c_category-basic
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
ELSE.
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD room_count.
rv_rooms = ( iv_guests + 1 ) DIV 2.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_category.
WHEN {{p}}if_hotel_rate=>c_category-basic.
rv_amount = '90.00'.
WHEN {{p}}if_hotel_rate=>c_category-comfort.
rv_amount = '140.00'.
WHEN {{p}}if_hotel_rate=>c_category-suite.
rv_amount = '260.00'.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_nights >= 28.
rv_percent = 20.
ELSEIF iv_nights >= 14.
rv_percent = 15.
ELSEIF iv_nights >= 7.
rv_percent = 10.
ENDIF.
ENDMETHOD.
METHOD net_room_total.
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
rv_total = lv_total - lv_discount.
ENDMETHOD.
METHOD extras.
DATA(lv_guest_nights) = iv_guests * iv_nights.
rv_extras = lv_guest_nights * c_city_tax.
IF iv_breakfast = abap_true.
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,108 @@
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_hotel_rate.
PRIVATE SECTION.
CONSTANTS:
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
METHODS validate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
METHODS room_count
IMPORTING iv_guests TYPE i
RETURNING VALUE(rv_rooms) TYPE i.
METHODS nightly_rate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS discount_percent
IMPORTING iv_nights TYPE i
RETURNING VALUE(rv_percent) TYPE i.
METHODS net_room_total
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS extras
IMPORTING iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
ENDCLASS.
CLASS {{p}}hotel_rate IMPLEMENTATION.
METHOD {{p}}if_hotel_rate~calculate.
rs_result-reason = validate( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests ).
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
rs_result-price = 0.
RETURN.
ENDIF.
rs_result-price = net_room_total( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests )
+ extras( iv_nights = iv_nights
iv_guests = iv_guests
iv_breakfast = iv_breakfast ).
ENDMETHOD.
METHOD validate.
IF iv_nights < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
ELSEIF iv_guests < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
OR iv_category <> {{p}}if_hotel_rate=>c_category-suite.
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
ELSE.
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD room_count.
rv_rooms = ( iv_guests + 1 ) DIV 2.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_category.
WHEN {{p}}if_hotel_rate=>c_category-basic.
rv_amount = '90.00'.
WHEN {{p}}if_hotel_rate=>c_category-comfort.
rv_amount = '140.00'.
WHEN {{p}}if_hotel_rate=>c_category-suite.
rv_amount = '260.00'.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_nights >= 28.
rv_percent = 20.
ELSEIF iv_nights >= 14.
rv_percent = 15.
ELSEIF iv_nights >= 7.
rv_percent = 10.
ENDIF.
ENDMETHOD.
METHOD net_room_total.
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
rv_total = lv_total - lv_discount.
ENDMETHOD.
METHOD extras.
DATA(lv_guest_nights) = iv_guests * iv_nights.
rv_extras = lv_guest_nights * c_city_tax.
IF iv_breakfast = abap_true.
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,108 @@
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_hotel_rate.
PRIVATE SECTION.
CONSTANTS:
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
METHODS validate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
METHODS room_count
IMPORTING iv_guests TYPE i
RETURNING VALUE(rv_rooms) TYPE i.
METHODS nightly_rate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS discount_percent
IMPORTING iv_nights TYPE i
RETURNING VALUE(rv_percent) TYPE i.
METHODS net_room_total
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS extras
IMPORTING iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
ENDCLASS.
CLASS {{p}}hotel_rate IMPLEMENTATION.
METHOD {{p}}if_hotel_rate~calculate.
rs_result-reason = validate( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests ).
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
rs_result-price = 0.
RETURN.
ENDIF.
rs_result-price = net_room_total( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests )
+ extras( iv_nights = iv_nights
iv_guests = iv_guests
iv_breakfast = iv_breakfast ).
ENDMETHOD.
METHOD validate.
IF iv_nights < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
ELSEIF iv_guests < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
ELSE.
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD room_count.
rv_rooms = ( iv_guests + 2 ) DIV 2.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_category.
WHEN {{p}}if_hotel_rate=>c_category-basic.
rv_amount = '90.00'.
WHEN {{p}}if_hotel_rate=>c_category-comfort.
rv_amount = '140.00'.
WHEN {{p}}if_hotel_rate=>c_category-suite.
rv_amount = '260.00'.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_nights >= 28.
rv_percent = 20.
ELSEIF iv_nights >= 14.
rv_percent = 15.
ELSEIF iv_nights >= 7.
rv_percent = 10.
ENDIF.
ENDMETHOD.
METHOD net_room_total.
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
rv_total = lv_total - lv_discount.
ENDMETHOD.
METHOD extras.
DATA(lv_guest_nights) = iv_guests * iv_nights.
rv_extras = lv_guest_nights * c_city_tax.
IF iv_breakfast = abap_true.
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,108 @@
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_hotel_rate.
PRIVATE SECTION.
CONSTANTS:
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
METHODS validate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
METHODS room_count
IMPORTING iv_guests TYPE i
RETURNING VALUE(rv_rooms) TYPE i.
METHODS nightly_rate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS discount_percent
IMPORTING iv_nights TYPE i
RETURNING VALUE(rv_percent) TYPE i.
METHODS net_room_total
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS extras
IMPORTING iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
ENDCLASS.
CLASS {{p}}hotel_rate IMPLEMENTATION.
METHOD {{p}}if_hotel_rate~calculate.
rs_result-reason = validate( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests ).
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
rs_result-price = 0.
RETURN.
ENDIF.
rs_result-price = net_room_total( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests )
+ extras( iv_nights = iv_nights
iv_guests = iv_guests
iv_breakfast = iv_breakfast ).
ENDMETHOD.
METHOD validate.
IF iv_nights < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
ELSEIF iv_guests < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
ELSE.
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD room_count.
rv_rooms = ( iv_guests + 1 ) DIV 2.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_category.
WHEN {{p}}if_hotel_rate=>c_category-basic.
rv_amount = '90.00'.
WHEN {{p}}if_hotel_rate=>c_category-comfort.
rv_amount = '140.00'.
WHEN {{p}}if_hotel_rate=>c_category-suite.
rv_amount = '260.00'.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_nights >= 28.
rv_percent = 20.
ELSEIF iv_nights >= 14.
rv_percent = 15.
ELSEIF iv_nights >= 7.
rv_percent = 10.
ENDIF.
ENDMETHOD.
METHOD net_room_total.
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
rv_total = lv_total + lv_discount.
ENDMETHOD.
METHOD extras.
DATA(lv_guest_nights) = iv_guests * iv_nights.
rv_extras = lv_guest_nights * c_city_tax.
IF iv_breakfast = abap_true.
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,108 @@
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_hotel_rate.
PRIVATE SECTION.
CONSTANTS:
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
METHODS validate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
METHODS room_count
IMPORTING iv_guests TYPE i
RETURNING VALUE(rv_rooms) TYPE i.
METHODS nightly_rate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS discount_percent
IMPORTING iv_nights TYPE i
RETURNING VALUE(rv_percent) TYPE i.
METHODS net_room_total
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS extras
IMPORTING iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
ENDCLASS.
CLASS {{p}}hotel_rate IMPLEMENTATION.
METHOD {{p}}if_hotel_rate~calculate.
rs_result-reason = validate( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests ).
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
rs_result-price = 0.
RETURN.
ENDIF.
rs_result-price = net_room_total( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests )
+ extras( iv_nights = iv_nights
iv_guests = iv_guests
iv_breakfast = iv_breakfast ).
ENDMETHOD.
METHOD validate.
IF iv_nights < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
ELSEIF iv_guests < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
ELSE.
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD room_count.
rv_rooms = ( iv_guests + 1 ) DIV 2.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_category.
WHEN {{p}}if_hotel_rate=>c_category-basic.
rv_amount = '90.00'.
WHEN {{p}}if_hotel_rate=>c_category-comfort.
rv_amount = '140.00'.
WHEN {{p}}if_hotel_rate=>c_category-suite.
rv_amount = '260.00'.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_nights >= 28.
rv_percent = 20.
ELSEIF iv_nights >= 14.
rv_percent = 15.
ELSEIF iv_nights >= 7.
rv_percent = 10.
ENDIF.
ENDMETHOD.
METHOD net_room_total.
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
rv_total = lv_total - lv_discount.
ENDMETHOD.
METHOD extras.
DATA(lv_guest_nights) = iv_guests * iv_nights.
rv_extras = lv_guest_nights * c_city_tax.
IF iv_breakfast = abap_false.
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

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

View File

@@ -0,0 +1,145 @@
CLASS {{p}}t13_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_hotel_rate.
METHODS setup.
METHODS expect_price
IMPORTING iv_expected TYPE {{p}}if_hotel_rate=>ty_amount
iv_actual TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS rejects_zero_nights FOR TESTING.
METHODS rejects_zero_guests FOR TESTING.
METHODS rejects_unknown_category FOR TESTING.
METHODS validation_order FOR TESTING.
METHODS single_standard_night FOR TESTING.
METHODS two_guests_one_room FOR TESTING.
METHODS three_guests_two_rooms FOR TESTING.
METHODS breakfast_per_guest FOR TESTING.
METHODS discount_starts_at_seven FOR TESTING.
METHODS discount_fifteen_percent FOR TESTING.
METHODS discount_twenty_percent FOR TESTING.
ENDCLASS.
CLASS {{p}}t13_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}hotel_rate( ).
ENDMETHOD.
METHOD expect_price.
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ).
ENDMETHOD.
METHOD rejects_zero_nights.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 0
iv_guests = 2
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-nights
act = ls_result-reason ).
expect_price( iv_expected = '0.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD rejects_zero_guests.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 3
iv_guests = 0
iv_breakfast = abap_true ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-guests
act = ls_result-reason ).
expect_price( iv_expected = '0.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD rejects_unknown_category.
DATA(ls_result) = mo_cut->calculate( iv_category = 'X'
iv_nights = 2
iv_guests = 1
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-category
act = ls_result-reason ).
expect_price( iv_expected = '0.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD validation_order.
DATA(ls_result) = mo_cut->calculate( iv_category = 'X'
iv_nights = 0
iv_guests = 0
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-nights
act = ls_result-reason ).
ls_result = mo_cut->calculate( iv_category = 'X'
iv_nights = 2
iv_guests = 0
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-guests
act = ls_result-reason ).
ls_result = mo_cut->calculate( iv_category = 'X'
iv_nights = 2
iv_guests = 2
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-category
act = ls_result-reason ).
ENDMETHOD.
METHOD single_standard_night.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 1
iv_guests = 1
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-ok
act = ls_result-reason ).
expect_price( iv_expected = '93.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD two_guests_one_room.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
iv_nights = 3
iv_guests = 2
iv_breakfast = abap_false ).
expect_price( iv_expected = '438.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD three_guests_two_rooms.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
iv_nights = 2
iv_guests = 3
iv_breakfast = abap_false ).
expect_price( iv_expected = '578.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD breakfast_per_guest.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 2
iv_guests = 2
iv_breakfast = abap_true ).
expect_price( iv_expected = '242.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD discount_starts_at_seven.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 6
iv_guests = 1
iv_breakfast = abap_false ).
expect_price( iv_expected = '558.00' iv_actual = ls_result-price ).
ls_result = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 7
iv_guests = 1
iv_breakfast = abap_false ).
expect_price( iv_expected = '588.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD discount_fifteen_percent.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
iv_nights = 14
iv_guests = 2
iv_breakfast = abap_false ).
expect_price( iv_expected = '1750.00' iv_actual = ls_result-price ).
ENDMETHOD.
METHOD discount_twenty_percent.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-suite
iv_nights = 28
iv_guests = 1
iv_breakfast = abap_false ).
expect_price( iv_expected = '5908.00' iv_actual = ls_result-price ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,74 @@
{
"task": "G0102",
"mutants": [
{
"object": "{{P}}HOTEL_RATE",
"mutant": "line 59: <> -> = (rel)",
"status": "killed",
"hidden": "6/11",
"failed_tests": [
"BREAKFAST_PER_GUEST",
"DISCOUNT_STARTS_AT_SEVEN",
"REJECTS_UNKNOWN_CATEGORY",
"SINGLE_STANDARD_NIGHT",
"VALIDATION_ORDER"
]
},
{
"object": "{{P}}HOTEL_RATE",
"mutant": "line 61: AND -> OR (logic)",
"status": "killed",
"hidden": "4/11",
"failed_tests": [
"BREAKFAST_PER_GUEST",
"DISCOUNT_FIFTEEN_PERCENT",
"DISCOUNT_STARTS_AT_SEVEN",
"DISCOUNT_TWENTY_PERCENT",
"SINGLE_STANDARD_NIGHT",
"THREE_GUESTS_TWO_ROOMS",
"TWO_GUESTS_ONE_ROOM"
]
},
{
"object": "{{P}}HOTEL_RATE",
"mutant": "line 69: 1 -> 2 (const)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"BREAKFAST_PER_GUEST",
"DISCOUNT_FIFTEEN_PERCENT",
"TWO_GUESTS_ONE_ROOM"
]
},
{
"object": "{{P}}HOTEL_RATE",
"mutant": "line 98: - -> + (arith)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"DISCOUNT_FIFTEEN_PERCENT",
"DISCOUNT_STARTS_AT_SEVEN",
"DISCOUNT_TWENTY_PERCENT"
]
},
{
"object": "{{P}}HOTEL_RATE",
"mutant": "line 104: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "4/11",
"failed_tests": [
"BREAKFAST_PER_GUEST",
"DISCOUNT_FIFTEEN_PERCENT",
"DISCOUNT_STARTS_AT_SEVEN",
"DISCOUNT_TWENTY_PERCENT",
"SINGLE_STANDARD_NIGHT",
"THREE_GUESTS_TWO_ROOMS",
"TWO_GUESTS_ONE_ROOM"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,108 @@
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_hotel_rate.
PRIVATE SECTION.
CONSTANTS:
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
METHODS validate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
METHODS room_count
IMPORTING iv_guests TYPE i
RETURNING VALUE(rv_rooms) TYPE i.
METHODS nightly_rate
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS discount_percent
IMPORTING iv_nights TYPE i
RETURNING VALUE(rv_percent) TYPE i.
METHODS net_room_total
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
iv_nights TYPE i
iv_guests TYPE i
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
METHODS extras
IMPORTING iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
ENDCLASS.
CLASS {{p}}hotel_rate IMPLEMENTATION.
METHOD {{p}}if_hotel_rate~calculate.
rs_result-reason = validate( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests ).
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
rs_result-price = 0.
RETURN.
ENDIF.
rs_result-price = net_room_total( iv_category = iv_category
iv_nights = iv_nights
iv_guests = iv_guests )
+ extras( iv_nights = iv_nights
iv_guests = iv_guests
iv_breakfast = iv_breakfast ).
ENDMETHOD.
METHOD validate.
IF iv_nights < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
ELSEIF iv_guests < 1.
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
ELSE.
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
ENDIF.
ENDMETHOD.
METHOD room_count.
rv_rooms = ( iv_guests + 1 ) DIV 2.
ENDMETHOD.
METHOD nightly_rate.
CASE iv_category.
WHEN {{p}}if_hotel_rate=>c_category-basic.
rv_amount = '90.00'.
WHEN {{p}}if_hotel_rate=>c_category-comfort.
rv_amount = '140.00'.
WHEN {{p}}if_hotel_rate=>c_category-suite.
rv_amount = '260.00'.
ENDCASE.
ENDMETHOD.
METHOD discount_percent.
IF iv_nights >= 28.
rv_percent = 20.
ELSEIF iv_nights >= 14.
rv_percent = 15.
ELSEIF iv_nights >= 7.
rv_percent = 10.
ENDIF.
ENDMETHOD.
METHOD net_room_total.
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
rv_total = lv_total - lv_discount.
ENDMETHOD.
METHOD extras.
DATA(lv_guest_nights) = iv_guests * iv_nights.
rv_extras = lv_guest_nights * c_city_tax.
IF iv_breakfast = abap_true.
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,76 @@
CLASS ltc_hotel_rate DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_hotel_rate.
METHODS setup.
METHODS basic_room FOR TESTING.
METHODS invalid_nights FOR TESTING.
METHODS invalid_guests FOR TESTING.
METHODS invalid_category FOR TESTING.
METHODS breakfast_and_tax FOR TESTING.
METHODS long_stay_discount FOR TESTING.
ENDCLASS.
CLASS ltc_hotel_rate IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}hotel_rate( ).
ENDMETHOD.
METHOD basic_room.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 1
iv_guests = 1
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-ok
act = ls_result-reason ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '93.00' )
act = ls_result-price ).
ENDMETHOD.
METHOD invalid_nights.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
iv_nights = 0
iv_guests = 2
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-nights
act = ls_result-reason ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '0.00' )
act = ls_result-price ).
ENDMETHOD.
METHOD invalid_guests.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 4
iv_guests = 0
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-guests
act = ls_result-reason ).
ENDMETHOD.
METHOD invalid_category.
DATA(ls_result) = mo_cut->calculate( iv_category = 'Z'
iv_nights = 4
iv_guests = 2
iv_breakfast = abap_true ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-category
act = ls_result-reason ).
ENDMETHOD.
METHOD breakfast_and_tax.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
iv_nights = 2
iv_guests = 2
iv_breakfast = abap_true ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '242.00' )
act = ls_result-price ).
ENDMETHOD.
METHOD long_stay_discount.
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
iv_nights = 14
iv_guests = 2
iv_breakfast = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '1750.00' )
act = ls_result-price ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,29 @@
INTERFACE {{p}}if_hotel_rate PUBLIC.
TYPES ty_category TYPE c LENGTH 1.
TYPES ty_reason TYPE c LENGTH 10.
TYPES ty_amount TYPE p LENGTH 10 DECIMALS 2.
TYPES:
BEGIN OF ty_result,
reason TYPE ty_reason,
price TYPE ty_amount,
END OF ty_result.
CONSTANTS:
BEGIN OF c_reason,
ok TYPE ty_reason VALUE 'OK',
nights TYPE ty_reason VALUE 'NIGHTS',
guests TYPE ty_reason VALUE 'GUESTS',
category TYPE ty_reason VALUE 'CATEGORY',
END OF c_reason.
CONSTANTS:
BEGIN OF c_category,
basic TYPE ty_category VALUE 'S',
comfort TYPE ty_category VALUE 'C',
suite TYPE ty_category VALUE 'U',
END OF c_category.
METHODS calculate
IMPORTING iv_category TYPE ty_category
iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rs_result) TYPE ty_result.
ENDINTERFACE.

View File

@@ -0,0 +1,71 @@
# 1. Goal
Calculate the price of a hotel stay. A booking program calls the calculation
before it shows the price to the guest. The program needs one reason code for
each invalid input.
# 2. Open questions
None.
# 3. Context
- The interface {{P}}IF_HOTEL_RATE exists in package $TMP. It is active.
- The interface has these types:
- TY_CATEGORY: character, length 1.
- TY_REASON: character, length 10.
- TY_AMOUNT: packed number, length 10, 2 decimals.
- TY_RESULT: structure with the components REASON (TY_REASON) and
PRICE (TY_AMOUNT).
- The interface has these constants:
- C_REASON: OK, NIGHTS, GUESTS, CATEGORY.
- C_CATEGORY: BASIC 'S', COMFORT 'C', SUITE 'U'.
- The interface has one method:
CALCULATE
IMPORTING iv_category TYPE ty_category
iv_nights TYPE i
iv_guests TYPE i
iv_breakfast TYPE abap_bool
RETURNING VALUE(rs_result) TYPE ty_result.
# 4. Contract
- Create the class {{P}}HOTEL_RATE in package $TMP.
- The class is public, final, and has a public constructor without parameters.
- The class implements {{P}}IF_HOTEL_RATE.
- Do not add other public methods.
# 5. Business rules
Check the input in this sequence. Return the reason of the first check that
fails and the price 0.
1. If IV_NIGHTS is less than 1, return NIGHTS.
2. If IV_GUESTS is less than 1, return GUESTS.
3. If IV_CATEGORY is not BASIC, COMFORT or SUITE, return CATEGORY.
4. Else return OK and calculate the price.
Calculate the price in this sequence:
1. One room takes at most 2 guests. The number of rooms is the number of guests
divided by 2, rounded up.
2. The price of one room for one night is 90.00 for BASIC, 140.00 for COMFORT
and 260.00 for SUITE.
3. The room total is the number of rooms multiplied by the number of nights
multiplied by the price of one room for one night.
4. Long stay discount on the room total:
- 28 nights or more: 20 %
- 14 nights or more: 15 %
- 7 nights or more: 10 %
- less than 7 nights: no discount
The discounted room total is the room total minus the discount.
5. Breakfast costs 12.50 for one guest for one night. Add it if IV_BREAKFAST is
true.
6. City tax costs 3.00 for one guest for one night. Add it always.
7. The price is the discounted room total plus breakfast plus city tax.
All amounts are exact to two decimals.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP. Method length below 40 statements. No global
variables. No comment that restates the code.
- Out of scope: do not change {{P}}IF_HOTEL_RATE.
# 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,51 @@
{
"id": "G0102",
"category": "A",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "INTF",
"name": "{{P}}IF_HOTEL_RATE",
"file": "seed/if_hotel_rate.intf.abap",
"description": "Hotel rate contract: types, reason codes, category codes and the calculate signature"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}HOTEL_RATE",
"implements": "{{P}}IF_HOTEL_RATE"
}
],
"out_of_scope": [
"{{P}}IF_HOTEL_RATE"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T13_HIDDEN",
"file": "hidden/t13_hidden.clas.abap",
"description": "T13 hidden tests for the hotel rate calculation"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}HOTEL_RATE",
"file": "reference/hotel_rate.clas.abap",
"description": "Hotel rate calculator",
"testclasses_file": "reference/hotel_rate.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"db_operation_in_loop"
]
}