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,74 @@
CLASS {{p}}meter_consumption DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_meter_reading.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_meter,
meter_id TYPE {{p}}if_meter_reading=>ty_meter_id,
opening_date TYPE {{p}}if_meter_reading=>ty_reading_date,
opening_value TYPE {{p}}if_meter_reading=>ty_value,
closing_date TYPE {{p}}if_meter_reading=>ty_reading_date,
closing_value TYPE {{p}}if_meter_reading=>ty_value,
END OF ty_meter,
tt_meter TYPE HASHED TABLE OF ty_meter WITH UNIQUE KEY meter_id.
METHODS collect
IMPORTING it_readings TYPE {{p}}if_meter_reading=>tt_readings
RETURNING VALUE(rt_meter) TYPE tt_meter.
METHODS to_result
IMPORTING it_meter TYPE tt_meter
RETURNING VALUE(rt_result) TYPE {{p}}if_meter_reading=>tt_result.
ENDCLASS.
CLASS {{p}}meter_consumption IMPLEMENTATION.
METHOD {{p}}if_meter_reading~calculate.
rt_result = to_result( collect( it_readings ) ).
ENDMETHOD.
METHOD collect.
LOOP AT it_readings INTO DATA(ls_reading).
IF ls_reading-reading_value < 0.
CONTINUE.
ENDIF.
READ TABLE rt_meter ASSIGNING FIELD-SYMBOL(<ls_meter>)
WITH TABLE KEY meter_id = ls_reading-meter_id.
IF sy-subrc <> 0.
INSERT VALUE #( meter_id = ls_reading-meter_id
opening_date = ls_reading-reading_date
opening_value = ls_reading-reading_value
closing_date = ls_reading-reading_date
closing_value = ls_reading-reading_value )
INTO TABLE rt_meter ASSIGNING <ls_meter>.
ENDIF.
IF ls_reading-reading_date < <ls_meter>-opening_date
OR ( ls_reading-reading_date = <ls_meter>-opening_date
AND ls_reading-reading_value > <ls_meter>-opening_value ).
<ls_meter>-opening_date = ls_reading-reading_date.
<ls_meter>-opening_value = ls_reading-reading_value.
ENDIF.
IF ls_reading-reading_date > <ls_meter>-closing_date
OR ( ls_reading-reading_date = <ls_meter>-closing_date
AND ls_reading-reading_value > <ls_meter>-closing_value ).
<ls_meter>-closing_date = ls_reading-reading_date.
<ls_meter>-closing_value = ls_reading-reading_value.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD to_result.
LOOP AT it_meter ASSIGNING FIELD-SYMBOL(<ls_meter>).
DATA(lv_consumption) = <ls_meter>-closing_value - <ls_meter>-opening_value.
IF lv_consumption < 0.
lv_consumption = 0.
ENDIF.
INSERT VALUE #( meter_id = <ls_meter>-meter_id
opening_value = <ls_meter>-opening_value
closing_value = <ls_meter>-closing_value
consumption = lv_consumption )
INTO TABLE rt_result.
ENDLOOP.
SORT rt_result BY meter_id.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,75 @@
CLASS ltc_meter_consumption DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_meter_reading.
METHODS setup.
METHODS two_readings FOR TESTING.
METHODS empty_input FOR TESTING.
METHODS negative_ignored FOR TESTING.
METHODS duplicate_date FOR TESTING.
METHODS rollover_is_zero FOR TESTING.
METHODS sorted_result FOR TESTING.
ENDCLASS.
CLASS ltc_meter_consumption IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}meter_consumption( ).
ENDMETHOD.
METHOD two_readings.
DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings.
lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 )
( meter_id = 'M0001' reading_date = '20240210' reading_value = 175 ) ).
DATA(lt_result) = mo_cut->calculate( lt_readings ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 100 act = lt_result[ 1 ]-opening_value ).
cl_abap_unit_assert=>assert_equals( exp = 175 act = lt_result[ 1 ]-closing_value ).
cl_abap_unit_assert=>assert_equals( exp = 75 act = lt_result[ 1 ]-consumption ).
ENDMETHOD.
METHOD empty_input.
DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings.
DATA(lt_result) = mo_cut->calculate( lt_readings ).
cl_abap_unit_assert=>assert_initial( act = lt_result ).
ENDMETHOD.
METHOD negative_ignored.
DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings.
lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 )
( meter_id = 'M0001' reading_date = '20240120' reading_value = -7 )
( meter_id = 'M0001' reading_date = '20240210' reading_value = 200 ) ).
DATA(lt_result) = mo_cut->calculate( lt_readings ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 100 act = lt_result[ 1 ]-consumption ).
ENDMETHOD.
METHOD duplicate_date.
DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings.
lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 130 )
( meter_id = 'M0001' reading_date = '20240110' reading_value = 110 )
( meter_id = 'M0001' reading_date = '20240210' reading_value = 210 ) ).
DATA(lt_result) = mo_cut->calculate( lt_readings ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 130 act = lt_result[ 1 ]-opening_value ).
cl_abap_unit_assert=>assert_equals( exp = 80 act = lt_result[ 1 ]-consumption ).
ENDMETHOD.
METHOD rollover_is_zero.
DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings.
lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 900 )
( meter_id = 'M0001' reading_date = '20240210' reading_value = 100 ) ).
DATA(lt_result) = mo_cut->calculate( lt_readings ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_result[ 1 ]-consumption ).
ENDMETHOD.
METHOD sorted_result.
DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings.
lt_readings = VALUE #( ( meter_id = 'M0002' reading_date = '20240110' reading_value = 20 )
( meter_id = 'M0001' reading_date = '20240110' reading_value = 10 ) ).
DATA(lt_result) = mo_cut->calculate( lt_readings ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 'M0001' act = lt_result[ 1 ]-meter_id ).
cl_abap_unit_assert=>assert_equals( exp = 'M0002' act = lt_result[ 2 ]-meter_id ).
ENDMETHOD.
ENDCLASS.