Harness: runner, generator, tasks T01 T13 T14 T15, CLAUDE.md

This commit is contained in:
Kral
2026-10-02 21:42:51 +02:00
commit 1c6c85492e
54 changed files with 3732 additions and 0 deletions

View File

@@ -0,0 +1,143 @@
CLASS {{P}}TOUR_PLANNER DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_status TYPE c LENGTH 10.
TYPES ty_tour_id TYPE c LENGTH 4.
TYPES ty_customer TYPE c LENGTH 10.
TYPES ty_weight TYPE p LENGTH 8 DECIMALS 2.
CONSTANTS:
BEGIN OF c_status,
ok TYPE ty_status VALUE 'OK',
invalid TYPE ty_status VALUE 'INVALID',
duplicate TYPE ty_status VALUE 'DUPLICATE',
END OF c_status.
TYPES:
BEGIN OF ty_item,
tour_id TYPE ty_tour_id,
stop_no TYPE i,
customer TYPE ty_customer,
packages TYPE i,
weight TYPE ty_weight,
END OF ty_item,
tt_item TYPE STANDARD TABLE OF ty_item WITH EMPTY KEY,
BEGIN OF ty_tour,
tour_id TYPE ty_tour_id,
stops TYPE i,
packages TYPE i,
weight TYPE ty_weight,
END OF ty_tour,
tt_tour TYPE STANDARD TABLE OF ty_tour WITH EMPTY KEY.
METHODS add_item
IMPORTING iv_tour_id TYPE ty_tour_id
iv_stop_no TYPE i
iv_customer TYPE ty_customer
iv_packages TYPE i
iv_weight TYPE ty_weight
RETURNING VALUE(rv_status) TYPE ty_status.
METHODS remove_tour
IMPORTING iv_tour_id TYPE ty_tour_id
RETURNING VALUE(rv_count) TYPE i.
METHODS items
RETURNING VALUE(rt_item) TYPE tt_item.
METHODS stops_of_tour
IMPORTING iv_tour_id TYPE ty_tour_id
RETURNING VALUE(rt_item) TYPE tt_item.
METHODS find_stop
IMPORTING iv_tour_id TYPE ty_tour_id
iv_stop_no TYPE i
RETURNING VALUE(rs_item) TYPE ty_item.
METHODS tour_summary
RETURNING VALUE(rt_tour) TYPE tt_tour.
PRIVATE SECTION.
TYPES tt_stop TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY tour_id stop_no.
DATA mt_stop TYPE tt_stop.
METHODS is_invalid
IMPORTING iv_tour_id TYPE ty_tour_id
iv_stop_no TYPE i
iv_packages TYPE i
iv_weight TYPE ty_weight
RETURNING VALUE(rv_invalid) TYPE abap_bool.
ENDCLASS.
CLASS {{P}}TOUR_PLANNER IMPLEMENTATION.
METHOD add_item.
IF is_invalid( iv_tour_id = iv_tour_id
iv_stop_no = iv_stop_no
iv_packages = iv_packages
iv_weight = iv_weight ) = abap_true.
rv_status = c_status-invalid.
RETURN.
ENDIF.
DATA(ls_stop) = VALUE ty_item( tour_id = iv_tour_id
stop_no = iv_stop_no
customer = iv_customer
packages = iv_packages
weight = iv_weight ).
INSERT ls_stop INTO TABLE mt_stop.
IF sy-subrc <> 0.
rv_status = c_status-duplicate.
RETURN.
ENDIF.
rv_status = c_status-ok.
ENDMETHOD.
METHOD remove_tour.
DELETE mt_stop WHERE tour_id = iv_tour_id.
rv_count = sy-dbcnt.
ENDMETHOD.
METHOD items.
rt_item = mt_stop.
ENDMETHOD.
METHOD stops_of_tour.
rt_item = VALUE #( FOR ls_stop IN mt_stop WHERE ( tour_id = iv_tour_id ) ( ls_stop ) ).
ENDMETHOD.
METHOD find_stop.
READ TABLE mt_stop WITH KEY tour_id = iv_tour_id
stop_no = iv_stop_no INTO rs_item.
IF sy-subrc <> 0.
CLEAR rs_item.
ENDIF.
ENDMETHOD.
METHOD tour_summary.
DATA lt_tour TYPE SORTED TABLE OF ty_tour WITH UNIQUE KEY tour_id.
LOOP AT mt_stop INTO DATA(ls_stop).
READ TABLE lt_tour WITH KEY tour_id = ls_stop-tour_id ASSIGNING FIELD-SYMBOL(<ls_tour>).
IF sy-subrc <> 0.
INSERT VALUE ty_tour( tour_id = ls_stop-tour_id )
INTO TABLE lt_tour ASSIGNING <ls_tour>.
ENDIF.
<ls_tour>-stops = <ls_tour>-stops + 1.
<ls_tour>-packages = <ls_tour>-packages + ls_stop-packages.
<ls_tour>-weight = <ls_tour>-weight + ls_stop-weight.
ENDLOOP.
rt_tour = lt_tour.
ENDMETHOD.
METHOD is_invalid.
rv_invalid = xsdbool( iv_tour_id IS INITIAL
OR iv_stop_no < 1
OR iv_packages < 0
OR iv_weight < 0 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,93 @@
CLASS ltc_tour_planner DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{P}}TOUR_PLANNER.
METHODS setup.
METHODS add_and_read_item FOR TESTING.
METHODS duplicate_is_rejected FOR TESTING.
METHODS invalid_input_is_rejected FOR TESTING.
METHODS summary_totals FOR TESTING.
METHODS remove_tour_works FOR TESTING.
ENDCLASS.
CLASS ltc_tour_planner IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{P}}TOUR_PLANNER( ).
ENDMETHOD.
METHOD add_and_read_item.
DATA(lv_status) = mo_cut->add_item( iv_tour_id = 'T001'
iv_stop_no = 1
iv_customer = 'CUST01'
iv_packages = 3
iv_weight = '12.50' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-ok act = lv_status ).
DATA(lt_item) = mo_cut->items( ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_item ) ).
cl_abap_unit_assert=>assert_equals( exp = 'CUST01' act = lt_item[ 1 ]-customer ).
ENDMETHOD.
METHOD duplicate_is_rejected.
DATA(lv_status) = mo_cut->add_item( iv_tour_id = 'T001'
iv_stop_no = 1
iv_customer = 'CUST01'
iv_packages = 3
iv_weight = '12.50' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-ok act = lv_status ).
lv_status = mo_cut->add_item( iv_tour_id = 'T001'
iv_stop_no = 1
iv_customer = 'CUST02'
iv_packages = 1
iv_weight = '1.00' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-duplicate act = lv_status ).
ENDMETHOD.
METHOD invalid_input_is_rejected.
DATA(lv_status) = mo_cut->add_item( iv_tour_id = ''
iv_stop_no = 1
iv_customer = 'CUST01'
iv_packages = 1
iv_weight = '1.00' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-invalid act = lv_status ).
DATA(lt_item) = mo_cut->items( ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_item ) ).
ENDMETHOD.
METHOD summary_totals.
DATA(lv_status) = mo_cut->add_item( iv_tour_id = 'T001'
iv_stop_no = 1
iv_customer = 'CUST01'
iv_packages = 2
iv_weight = '10.00' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-ok act = lv_status ).
lv_status = mo_cut->add_item( iv_tour_id = 'T001'
iv_stop_no = 2
iv_customer = 'CUST02'
iv_packages = 3
iv_weight = '20.00' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-ok act = lv_status ).
DATA(lt_tour) = mo_cut->tour_summary( ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_tour ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_tour[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 5 act = lt_tour[ 1 ]-packages ).
ENDMETHOD.
METHOD remove_tour_works.
DATA(lv_status) = mo_cut->add_item( iv_tour_id = 'T001'
iv_stop_no = 1
iv_customer = 'CUST01'
iv_packages = 1
iv_weight = '1.00' ).
cl_abap_unit_assert=>assert_equals( exp = {{P}}TOUR_PLANNER=>c_status-ok act = lv_status ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = mo_cut->remove_tour( 'T001' ) ).
DATA(lt_item) = mo_cut->items( ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_item ) ).
ENDMETHOD.
ENDCLASS.