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,56 @@
FUNCTION {{p}}meal_bill
IMPORTING
iv_week TYPE string
EXPORTING
ev_meals TYPE decfloat34
ev_pupils TYPE decfloat34
ev_amount TYPE decfloat34
ev_discount TYPE decfloat34
EXCEPTIONS
invalid_price.
TYPES:
BEGIN OF ty_pupil_sum,
pupil TYPE string,
meals TYPE i,
gross TYPE decfloat34,
amount TYPE decfloat34,
END OF ty_pupil_sum.
DATA lt_pupil TYPE SORTED TABLE OF ty_pupil_sum WITH UNIQUE KEY pupil.
SELECT pupil, price, cancelled
FROM {{P}}MEALBK
WHERE week_key = @iv_week
INTO TABLE @DATA(lt_book).
LOOP AT lt_book INTO DATA(ls_book).
IF ls_book-price < 0.
RAISE invalid_price.
ENDIF.
IF ls_book-cancelled = 'X' OR ls_book-price = 0.
CONTINUE.
ENDIF.
READ TABLE lt_pupil ASSIGNING FIELD-SYMBOL(<ls_pupil>) WITH TABLE KEY pupil = ls_book-pupil.
IF sy-subrc <> 0.
INSERT VALUE #( pupil = ls_book-pupil ) INTO TABLE lt_pupil ASSIGNING <ls_pupil>.
ENDIF.
<ls_pupil>-meals = <ls_pupil>-meals + 1.
<ls_pupil>-gross = <ls_pupil>-gross + ls_book-price.
ENDLOOP.
LOOP AT lt_pupil ASSIGNING <ls_pupil>.
<ls_pupil>-amount = <ls_pupil>-gross.
IF <ls_pupil>-meals >= 5.
<ls_pupil>-amount = round( val = <ls_pupil>-gross * 9 / 10
dec = 2
mode = cl_abap_math=>round_half_up ).
ENDIF.
ev_meals = ev_meals + <ls_pupil>-meals.
ev_amount = ev_amount + <ls_pupil>-amount.
ev_discount = ev_discount + <ls_pupil>-gross - <ls_pupil>-amount.
ENDLOOP.
ev_pupils = lines( lt_pupil ).
ENDFUNCTION.

View File

@@ -0,0 +1,135 @@
CLASS {{p}}t14_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS prepare
IMPORTING iv_week TYPE string
it_book TYPE STANDARD TABLE OF {{P}}MEALBK.
METHODS cleanup
IMPORTING iv_week TYPE string.
METHODS bill
IMPORTING iv_week TYPE string
EXPORTING ev_meals TYPE decfloat34
ev_pupils TYPE decfloat34
ev_amount TYPE decfloat34
ev_discount TYPE decfloat34.
METHODS sums_two_pupils FOR TESTING.
METHODS skips_cancelled FOR TESTING.
METHODS discount_from_five FOR TESTING.
METHODS rejects_negative_price FOR TESTING.
ENDCLASS.
CLASS {{p}}t14_test IMPLEMENTATION.
METHOD prepare.
cleanup( iv_week ).
INSERT {{P}}MEALBK FROM TABLE @it_book.
ENDMETHOD.
METHOD cleanup.
DELETE FROM {{P}}MEALBK WHERE week_key = @iv_week.
ENDMETHOD.
METHOD bill.
CALL FUNCTION '{{P}}MEAL_BILL'
EXPORTING
iv_week = iv_week
IMPORTING
ev_meals = ev_meals
ev_pupils = ev_pupils
ev_amount = ev_amount
ev_discount = ev_discount
EXCEPTIONS
invalid_price = 1
OTHERS = 2.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
ENDMETHOD.
METHOD sums_two_pupils.
DATA lv_week TYPE string VALUE 'R-SUM1'.
prepare( iv_week = lv_week
it_book = VALUE #(
( week_key = 'R-SUM1' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '2.50' )
( week_key = 'R-SUM1' pupil = 'A' meal_no = 2 meal = 'LUNCH' price = '3.00' )
( week_key = 'R-SUM1' pupil = 'B' meal_no = 1 meal = 'LUNCH' price = '4.00' ) ) ).
bill( EXPORTING iv_week = lv_week
IMPORTING ev_meals = DATA(lv_meals)
ev_pupils = DATA(lv_pupils)
ev_amount = DATA(lv_amount)
ev_discount = DATA(lv_discount) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 3 ) act = lv_meals ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 2 ) act = lv_pupils ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '9.50' ) act = lv_amount ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = lv_discount ).
cleanup( lv_week ).
ENDMETHOD.
METHOD skips_cancelled.
DATA lv_week TYPE string VALUE 'R-CANC'.
prepare( iv_week = lv_week
it_book = VALUE #(
( week_key = 'R-CANC' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '2.00' )
( week_key = 'R-CANC' pupil = 'A' meal_no = 2 meal = 'LUNCH' price = '5.00' cancelled = 'X' ) ) ).
bill( EXPORTING iv_week = lv_week
IMPORTING ev_meals = DATA(lv_meals)
ev_pupils = DATA(lv_pupils)
ev_amount = DATA(lv_amount)
ev_discount = DATA(lv_discount) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 1 ) act = lv_meals ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '2.00' ) act = lv_amount ).
cleanup( lv_week ).
ENDMETHOD.
METHOD discount_from_five.
DATA lv_week TYPE string VALUE 'R-DISC'.
prepare( iv_week = lv_week
it_book = VALUE #(
( week_key = 'R-DISC' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '9.99' )
( week_key = 'R-DISC' pupil = 'A' meal_no = 2 meal = 'LUNCH' price = '9.99' )
( week_key = 'R-DISC' pupil = 'A' meal_no = 3 meal = 'LUNCH' price = '9.99' )
( week_key = 'R-DISC' pupil = 'A' meal_no = 4 meal = 'LUNCH' price = '9.99' )
( week_key = 'R-DISC' pupil = 'A' meal_no = 5 meal = 'LUNCH' price = '9.99' ) ) ).
bill( EXPORTING iv_week = lv_week
IMPORTING ev_meals = DATA(lv_meals)
ev_pupils = DATA(lv_pupils)
ev_amount = DATA(lv_amount)
ev_discount = DATA(lv_discount) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 5 ) act = lv_meals ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '44.96' ) act = lv_amount ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '4.99' ) act = lv_discount ).
cleanup( lv_week ).
ENDMETHOD.
METHOD rejects_negative_price.
DATA lv_week TYPE string VALUE 'R-NEG'.
DATA lv_amount TYPE decfloat34.
prepare( iv_week = lv_week
it_book = VALUE #(
( week_key = 'R-NEG' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '-1.00' ) ) ).
CALL FUNCTION '{{P}}MEAL_BILL'
EXPORTING
iv_week = lv_week
IMPORTING
ev_amount = lv_amount
EXCEPTIONS
invalid_price = 1
OTHERS = 2.
cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ).
cleanup( lv_week ).
ENDMETHOD.
ENDCLASS.