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,102 @@
CLASS {{p}}canteen_planner DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_canteen_plan.
PRIVATE SECTION.
TYPES tt_demand TYPE SORTED TABLE OF {{p}}if_canteen_plan=>ty_order
WITH UNIQUE KEY ingredient.
TYPES tt_master TYPE HASHED TABLE OF {{p}}if_canteen_plan=>ty_master
WITH UNIQUE KEY ingredient.
METHODS collect_orders
IMPORTING it_orders TYPE {{p}}if_canteen_plan=>tt_order
CHANGING ct_demand TYPE tt_demand.
METHODS collect_demand
IMPORTING it_orders TYPE {{p}}if_canteen_plan=>tt_order
RETURNING VALUE(rt_demand) TYPE tt_demand.
METHODS to_master
IMPORTING it_catalogue TYPE {{p}}if_canteen_plan=>tt_master
RETURNING VALUE(rt_master) TYPE tt_master.
METHODS packs_needed
IMPORTING iv_quantity TYPE {{p}}if_canteen_plan=>ty_quantity
iv_pack_size TYPE {{p}}if_canteen_plan=>ty_quantity
RETURNING VALUE(rv_packs) TYPE i.
ENDCLASS.
CLASS {{p}}canteen_planner IMPLEMENTATION.
METHOD {{p}}if_canteen_plan~merge_orders.
DATA(lt_demand) = collect_demand( it_orders_a ).
collect_orders( EXPORTING it_orders = it_orders_b
CHANGING ct_demand = lt_demand ).
rt_demand = lt_demand.
ENDMETHOD.
METHOD {{p}}if_canteen_plan~pack_requirement.
DATA(lt_master) = to_master( it_catalogue ).
DATA(lt_demand) = collect_demand( it_demand ).
DATA ls_master TYPE {{p}}if_canteen_plan=>ty_master.
LOOP AT lt_demand INTO DATA(ls_demand).
IF NOT line_exists( lt_master[ ingredient = ls_demand-ingredient ] ).
CONTINUE.
ENDIF.
ls_master = lt_master[ ingredient = ls_demand-ingredient ].
INSERT VALUE #( ingredient = ls_demand-ingredient
packs = packs_needed( iv_quantity = ls_demand-quantity
iv_pack_size = ls_master-pack_size ) )
INTO TABLE rt_packs.
ENDLOOP.
ENDMETHOD.
METHOD {{p}}if_canteen_plan~missing_ingredients.
DATA(lt_master) = to_master( it_catalogue ).
DATA(lt_demand) = collect_demand( it_demand ).
LOOP AT lt_demand INTO DATA(ls_demand).
IF NOT line_exists( lt_master[ ingredient = ls_demand-ingredient ] ).
APPEND ls_demand-ingredient TO rt_missing.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD collect_orders.
LOOP AT it_orders INTO DATA(ls_order).
IF ls_order-quantity <= 0.
CONTINUE.
ENDIF.
READ TABLE ct_demand ASSIGNING FIELD-SYMBOL(<ls_demand>)
WITH TABLE KEY ingredient = ls_order-ingredient.
IF sy-subrc = 0.
<ls_demand>-quantity = <ls_demand>-quantity + ls_order-quantity.
ELSE.
INSERT VALUE #( ingredient = ls_order-ingredient
quantity = ls_order-quantity ) INTO TABLE ct_demand.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD collect_demand.
DATA(lt_demand) = VALUE tt_demand( ).
collect_orders( EXPORTING it_orders = it_orders
CHANGING ct_demand = lt_demand ).
rt_demand = lt_demand.
ENDMETHOD.
METHOD to_master.
LOOP AT it_catalogue INTO DATA(ls_catalogue).
INSERT VALUE #( ingredient = ls_catalogue-ingredient
pack_size = ls_catalogue-pack_size ) INTO TABLE rt_master.
ENDLOOP.
ENDMETHOD.
METHOD packs_needed.
rv_packs = iv_quantity DIV iv_pack_size.
IF iv_quantity MOD iv_pack_size <> 0.
rv_packs = rv_packs + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,73 @@
CLASS ltc_canteen_planner DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_canteen_plan.
METHODS setup.
METHODS merges_two_lists FOR TESTING.
METHODS sorts_by_ingredient FOR TESTING.
METHODS rounds_packs_up FOR TESTING.
METHODS lists_unknown FOR TESTING.
ENDCLASS.
CLASS ltc_canteen_planner IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}canteen_planner( ).
ENDMETHOD.
METHOD merges_two_lists.
DATA(lt_a) = VALUE {{p}}if_canteen_plan=>tt_order(
( ingredient = 'FLOUR' quantity = 2 ) ).
DATA(lt_b) = VALUE {{p}}if_canteen_plan=>tt_order(
( ingredient = 'FLOUR' quantity = 3 ) ).
DATA(lt_demand) = mo_cut->merge_orders( it_orders_a = lt_a
it_orders_b = lt_b ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_demand ) ).
DATA lv_expected TYPE {{p}}if_canteen_plan=>ty_quantity.
lv_expected = 5.
cl_abap_unit_assert=>assert_equals( exp = lv_expected
act = lt_demand[ 1 ]-quantity ).
ENDMETHOD.
METHOD sorts_by_ingredient.
DATA(lt_a) = VALUE {{p}}if_canteen_plan=>tt_order(
( ingredient = 'SUGAR' quantity = 1 )
( ingredient = 'FLOUR' quantity = 1 ) ).
DATA(lt_demand) = mo_cut->merge_orders(
it_orders_a = lt_a
it_orders_b = VALUE {{p}}if_canteen_plan=>tt_order( ) ).
cl_abap_unit_assert=>assert_equals( exp = 'FLOUR'
act = lt_demand[ 1 ]-ingredient ).
cl_abap_unit_assert=>assert_equals( exp = 'SUGAR'
act = lt_demand[ 2 ]-ingredient ).
ENDMETHOD.
METHOD rounds_packs_up.
DATA(lt_demand) = VALUE {{p}}if_canteen_plan=>tt_order(
( ingredient = 'FLOUR' quantity = 25 ) ).
DATA(lt_catalogue) = VALUE {{p}}if_canteen_plan=>tt_master(
( ingredient = 'FLOUR' pack_size = 10 ) ).
DATA(lt_packs) = mo_cut->pack_requirement( it_demand = lt_demand
it_catalogue = lt_catalogue ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_packs ) ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lt_packs[ 1 ]-packs ).
ENDMETHOD.
METHOD lists_unknown.
DATA(lt_demand) = VALUE {{p}}if_canteen_plan=>tt_order(
( ingredient = 'COCOA' quantity = 1 ) ).
DATA(lt_catalogue) = VALUE {{p}}if_canteen_plan=>tt_master(
( ingredient = 'FLOUR' pack_size = 10 ) ).
DATA(lt_missing) = mo_cut->missing_ingredients( it_demand = lt_demand
it_catalogue = lt_catalogue ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_missing ) ).
cl_abap_unit_assert=>assert_equals( exp = 'COCOA' act = lt_missing[ 1 ] ).
ENDMETHOD.
ENDCLASS.