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,65 @@
FUNCTION {{p}}bike_rebalance
IMPORTING
iv_dry_run TYPE abap_bool
EXPORTING
ev_applied TYPE i
ev_rejected TYPE i.
DATA lt_state TYPE STANDARD TABLE OF {{p}}station.
DATA lt_moves TYPE STANDARD TABLE OF {{p}}move.
SELECT station_id, station_name, capacity, bikes
FROM {{p}}station
INTO TABLE @lt_state.
SELECT move_no, source_id, target_id, quantity
FROM {{p}}move
INTO TABLE @lt_moves.
SORT lt_state BY station_id.
SORT lt_moves BY move_no.
ev_applied = 0.
ev_rejected = 0.
LOOP AT lt_moves INTO DATA(ls_move).
IF ls_move-quantity <= 0
OR ls_move-source_id = ls_move-target_id.
ev_rejected = ev_rejected + 1.
CONTINUE.
ENDIF.
READ TABLE lt_state ASSIGNING FIELD-SYMBOL(<ls_source>)
WITH KEY station_id = ls_move-source_id BINARY SEARCH.
IF sy-subrc <> 0.
ev_rejected = ev_rejected + 1.
CONTINUE.
ENDIF.
READ TABLE lt_state ASSIGNING FIELD-SYMBOL(<ls_target>)
WITH KEY station_id = ls_move-target_id BINARY SEARCH.
IF sy-subrc <> 0.
ev_rejected = ev_rejected + 1.
CONTINUE.
ENDIF.
IF <ls_source>-bikes < ls_move-quantity
OR <ls_target>-capacity - <ls_target>-bikes < ls_move-quantity.
ev_rejected = ev_rejected + 1.
CONTINUE.
ENDIF.
<ls_source>-bikes = <ls_source>-bikes - ls_move-quantity.
<ls_target>-bikes = <ls_target>-bikes + ls_move-quantity.
ev_applied = ev_applied + 1.
ENDLOOP.
IF iv_dry_run = abap_false.
LOOP AT lt_state INTO DATA(ls_state).
UPDATE {{p}}station
SET bikes = @ls_state-bikes
WHERE station_id = @ls_state-station_id.
ENDLOOP.
ENDIF.
ENDFUNCTION.

View File

@@ -0,0 +1,130 @@
CLASS {{p}}t31_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_stations TYPE STANDARD TABLE OF {{p}}station.
TYPES ty_moves TYPE STANDARD TABLE OF {{p}}move.
TYPES ty_id TYPE {{p}}station-station_id.
METHODS given
IMPORTING it_stations TYPE ty_stations
it_moves TYPE ty_moves.
METHODS rebalance
IMPORTING iv_dry_run TYPE abap_bool DEFAULT abap_false
EXPORTING ev_applied TYPE i
ev_rejected TYPE i.
METHODS bikes_of
IMPORTING iv_id TYPE ty_id
RETURNING VALUE(rv_bikes) TYPE i.
METHODS applies_move FOR TESTING.
METHODS rejects_move FOR TESTING.
METHODS dry_run FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_test IMPLEMENTATION.
METHOD given.
DATA(lt_stations) = it_stations.
DATA(lt_moves) = it_moves.
LOOP AT lt_stations ASSIGNING FIELD-SYMBOL(<ls_station>).
<ls_station>-client = sy-mandt.
ENDLOOP.
LOOP AT lt_moves ASSIGNING FIELD-SYMBOL(<ls_move>).
<ls_move>-client = sy-mandt.
ENDLOOP.
DELETE FROM {{p}}station.
DELETE FROM {{p}}move.
INSERT {{p}}station FROM TABLE @lt_stations.
INSERT {{p}}move FROM TABLE @lt_moves.
ENDMETHOD.
METHOD rebalance.
CALL FUNCTION '{{P}}BIKE_REBALANCE'
EXPORTING
iv_dry_run = iv_dry_run
IMPORTING
ev_applied = ev_applied
ev_rejected = ev_rejected
EXCEPTIONS
OTHERS = 1.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
ENDMETHOD.
METHOD bikes_of.
SELECT SINGLE bikes FROM {{p}}station
INTO @rv_bikes
WHERE station_id = @iv_id.
ENDMETHOD.
METHOD applies_move.
DATA lt_stations TYPE ty_stations.
DATA lt_moves TYPE ty_moves.
DATA lv_applied TYPE i.
DATA lv_rejected TYPE i.
lt_stations = VALUE #(
( station_id = 'S001' station_name = 'Alpha' capacity = 10 bikes = 5 )
( station_id = 'S002' station_name = 'Beta' capacity = 10 bikes = 0 ) ).
lt_moves = VALUE #(
( move_no = 1 source_id = 'S001' target_id = 'S002' quantity = 3 ) ).
given( it_stations = lt_stations it_moves = lt_moves ).
rebalance( IMPORTING ev_applied = lv_applied ev_rejected = lv_rejected ).
cl_abap_unit_assert=>assert_equals( act = lv_applied exp = 1 ).
cl_abap_unit_assert=>assert_equals( act = lv_rejected exp = 0 ).
cl_abap_unit_assert=>assert_equals( act = bikes_of( 'S001' ) exp = 2 ).
cl_abap_unit_assert=>assert_equals( act = bikes_of( 'S002' ) exp = 3 ).
ENDMETHOD.
METHOD rejects_move.
DATA lt_stations TYPE ty_stations.
DATA lt_moves TYPE ty_moves.
DATA lv_applied TYPE i.
DATA lv_rejected TYPE i.
lt_stations = VALUE #(
( station_id = 'S001' station_name = 'Alpha' capacity = 10 bikes = 1 )
( station_id = 'S002' station_name = 'Beta' capacity = 10 bikes = 0 ) ).
lt_moves = VALUE #(
( move_no = 1 source_id = 'S001' target_id = 'S002' quantity = 4 ) ).
given( it_stations = lt_stations it_moves = lt_moves ).
rebalance( IMPORTING ev_applied = lv_applied ev_rejected = lv_rejected ).
cl_abap_unit_assert=>assert_equals( act = lv_applied exp = 0 ).
cl_abap_unit_assert=>assert_equals( act = lv_rejected exp = 1 ).
cl_abap_unit_assert=>assert_equals( act = bikes_of( 'S001' ) exp = 1 ).
cl_abap_unit_assert=>assert_equals( act = bikes_of( 'S002' ) exp = 0 ).
ENDMETHOD.
METHOD dry_run.
DATA lt_stations TYPE ty_stations.
DATA lt_moves TYPE ty_moves.
DATA lv_applied TYPE i.
DATA lv_rejected TYPE i.
lt_stations = VALUE #(
( station_id = 'S001' station_name = 'Alpha' capacity = 10 bikes = 5 )
( station_id = 'S002' station_name = 'Beta' capacity = 10 bikes = 0 ) ).
lt_moves = VALUE #(
( move_no = 1 source_id = 'S001' target_id = 'S002' quantity = 2 ) ).
given( it_stations = lt_stations it_moves = lt_moves ).
rebalance( EXPORTING iv_dry_run = abap_true
IMPORTING ev_applied = lv_applied ev_rejected = lv_rejected ).
cl_abap_unit_assert=>assert_equals( act = lv_applied exp = 1 ).
cl_abap_unit_assert=>assert_equals( act = lv_rejected exp = 0 ).
cl_abap_unit_assert=>assert_equals( act = bikes_of( 'S001' ) exp = 5 ).
cl_abap_unit_assert=>assert_equals( act = bikes_of( 'S002' ) exp = 0 ).
ENDMETHOD.
ENDCLASS.