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,91 @@
FUNCTION {{p}}lift_stats
IMPORTING
iv_scans TYPE string
iv_lifts TYPE string
EXPORTING
ev_rides TYPE i
ev_passes TYPE i
ev_report TYPE string
EXCEPTIONS
no_lifts.
TYPES: BEGIN OF ty_lift,
lift TYPE string,
area TYPE string,
END OF ty_lift,
BEGIN OF ty_scan,
pass TYPE string,
lift TYPE string,
END OF ty_scan,
BEGIN OF ty_pass_area,
pass TYPE string,
area TYPE string,
END OF ty_pass_area,
BEGIN OF ty_pass,
pass TYPE string,
rides TYPE i,
areas TYPE i,
END OF ty_pass,
ty_lines TYPE STANDARD TABLE OF string WITH EMPTY KEY.
DATA lt_lift_lines TYPE ty_lines.
DATA lt_scan_lines TYPE ty_lines.
DATA lt_lifts TYPE HASHED TABLE OF ty_lift WITH UNIQUE KEY lift.
DATA lt_scans TYPE SORTED TABLE OF ty_scan WITH UNIQUE KEY pass lift.
DATA lt_pass_areas TYPE SORTED TABLE OF ty_pass_area WITH UNIQUE KEY pass area.
DATA lt_passes TYPE SORTED TABLE OF ty_pass WITH UNIQUE KEY pass.
DATA ls_lift TYPE ty_lift.
DATA ls_scan TYPE ty_scan.
DATA ls_pass_area TYPE ty_pass_area.
DATA lv_line TYPE string.
DATA lv_key TYPE string.
DATA lv_value TYPE string.
DATA lv_sep TYPE string.
SPLIT iv_lifts AT cl_abap_char_utilities=>newline INTO TABLE lt_lift_lines.
LOOP AT lt_lift_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL AND lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
INSERT VALUE #( lift = lv_key area = lv_value ) INTO TABLE lt_lifts.
ENDLOOP.
IF lines( lt_lifts ) = 0.
RAISE no_lifts.
ENDIF.
SPLIT iv_scans AT cl_abap_char_utilities=>newline INTO TABLE lt_scan_lines.
LOOP AT lt_scan_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
IF NOT line_exists( lt_lifts[ lift = lv_value ] ).
CONTINUE.
ENDIF.
INSERT VALUE #( pass = lv_key lift = lv_value ) INTO TABLE lt_scans.
ENDLOOP.
LOOP AT lt_scans INTO ls_scan.
READ TABLE lt_lifts INTO ls_lift WITH TABLE KEY lift = ls_scan-lift.
INSERT VALUE #( pass = ls_scan-pass ) INTO TABLE lt_passes.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_pass>) WITH TABLE KEY pass = ls_scan-pass.
<ls_pass>-rides = <ls_pass>-rides + 1.
INSERT VALUE #( pass = ls_scan-pass area = ls_lift-area ) INTO TABLE lt_pass_areas.
ENDLOOP.
LOOP AT lt_pass_areas INTO ls_pass_area.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_area_pass>) WITH TABLE KEY pass = ls_pass_area-pass.
<ls_area_pass>-areas = <ls_area_pass>-areas + 1.
ENDLOOP.
LOOP AT lt_passes ASSIGNING FIELD-SYMBOL(<ls_out>).
ev_report = ev_report && lv_sep && |{ <ls_out>-pass };{ <ls_out>-rides };{ <ls_out>-areas }|.
lv_sep = cl_abap_char_utilities=>newline.
ENDLOOP.
ev_rides = lines( lt_scans ).
ev_passes = lines( lt_passes ).
ENDFUNCTION.

View File

@@ -0,0 +1,91 @@
FUNCTION {{p}}lift_stats
IMPORTING
iv_scans TYPE string
iv_lifts TYPE string
EXPORTING
ev_rides TYPE i
ev_passes TYPE i
ev_report TYPE string
EXCEPTIONS
no_lifts.
TYPES: BEGIN OF ty_lift,
lift TYPE string,
area TYPE string,
END OF ty_lift,
BEGIN OF ty_scan,
pass TYPE string,
lift TYPE string,
END OF ty_scan,
BEGIN OF ty_pass_area,
pass TYPE string,
area TYPE string,
END OF ty_pass_area,
BEGIN OF ty_pass,
pass TYPE string,
rides TYPE i,
areas TYPE i,
END OF ty_pass,
ty_lines TYPE STANDARD TABLE OF string WITH EMPTY KEY.
DATA lt_lift_lines TYPE ty_lines.
DATA lt_scan_lines TYPE ty_lines.
DATA lt_lifts TYPE HASHED TABLE OF ty_lift WITH UNIQUE KEY lift.
DATA lt_scans TYPE SORTED TABLE OF ty_scan WITH UNIQUE KEY pass lift.
DATA lt_pass_areas TYPE SORTED TABLE OF ty_pass_area WITH UNIQUE KEY pass area.
DATA lt_passes TYPE SORTED TABLE OF ty_pass WITH UNIQUE KEY pass.
DATA ls_lift TYPE ty_lift.
DATA ls_scan TYPE ty_scan.
DATA ls_pass_area TYPE ty_pass_area.
DATA lv_line TYPE string.
DATA lv_key TYPE string.
DATA lv_value TYPE string.
DATA lv_sep TYPE string.
SPLIT iv_lifts AT cl_abap_char_utilities=>newline INTO TABLE lt_lift_lines.
LOOP AT lt_lift_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL AND lv_value CA ';'.
CONTINUE.
ENDIF.
INSERT VALUE #( lift = lv_key area = lv_value ) INTO TABLE lt_lifts.
ENDLOOP.
IF lines( lt_lifts ) = 0.
RAISE no_lifts.
ENDIF.
SPLIT iv_scans AT cl_abap_char_utilities=>newline INTO TABLE lt_scan_lines.
LOOP AT lt_scan_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
IF NOT line_exists( lt_lifts[ lift = lv_value ] ).
CONTINUE.
ENDIF.
INSERT VALUE #( pass = lv_key lift = lv_value ) INTO TABLE lt_scans.
ENDLOOP.
LOOP AT lt_scans INTO ls_scan.
READ TABLE lt_lifts INTO ls_lift WITH TABLE KEY lift = ls_scan-lift.
INSERT VALUE #( pass = ls_scan-pass ) INTO TABLE lt_passes.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_pass>) WITH TABLE KEY pass = ls_scan-pass.
<ls_pass>-rides = <ls_pass>-rides + 1.
INSERT VALUE #( pass = ls_scan-pass area = ls_lift-area ) INTO TABLE lt_pass_areas.
ENDLOOP.
LOOP AT lt_pass_areas INTO ls_pass_area.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_area_pass>) WITH TABLE KEY pass = ls_pass_area-pass.
<ls_area_pass>-areas = <ls_area_pass>-areas + 1.
ENDLOOP.
LOOP AT lt_passes ASSIGNING FIELD-SYMBOL(<ls_out>).
ev_report = ev_report && lv_sep && |{ <ls_out>-pass };{ <ls_out>-rides };{ <ls_out>-areas }|.
lv_sep = cl_abap_char_utilities=>newline.
ENDLOOP.
ev_rides = lines( lt_scans ).
ev_passes = lines( lt_passes ).
ENDFUNCTION.

View File

@@ -0,0 +1,91 @@
FUNCTION {{p}}lift_stats
IMPORTING
iv_scans TYPE string
iv_lifts TYPE string
EXPORTING
ev_rides TYPE i
ev_passes TYPE i
ev_report TYPE string
EXCEPTIONS
no_lifts.
TYPES: BEGIN OF ty_lift,
lift TYPE string,
area TYPE string,
END OF ty_lift,
BEGIN OF ty_scan,
pass TYPE string,
lift TYPE string,
END OF ty_scan,
BEGIN OF ty_pass_area,
pass TYPE string,
area TYPE string,
END OF ty_pass_area,
BEGIN OF ty_pass,
pass TYPE string,
rides TYPE i,
areas TYPE i,
END OF ty_pass,
ty_lines TYPE STANDARD TABLE OF string WITH EMPTY KEY.
DATA lt_lift_lines TYPE ty_lines.
DATA lt_scan_lines TYPE ty_lines.
DATA lt_lifts TYPE HASHED TABLE OF ty_lift WITH UNIQUE KEY lift.
DATA lt_scans TYPE SORTED TABLE OF ty_scan WITH UNIQUE KEY pass lift.
DATA lt_pass_areas TYPE SORTED TABLE OF ty_pass_area WITH UNIQUE KEY pass area.
DATA lt_passes TYPE SORTED TABLE OF ty_pass WITH UNIQUE KEY pass.
DATA ls_lift TYPE ty_lift.
DATA ls_scan TYPE ty_scan.
DATA ls_pass_area TYPE ty_pass_area.
DATA lv_line TYPE string.
DATA lv_key TYPE string.
DATA lv_value TYPE string.
DATA lv_sep TYPE string.
SPLIT iv_lifts AT cl_abap_char_utilities=>newline INTO TABLE lt_lift_lines.
LOOP AT lt_lift_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
INSERT VALUE #( lift = lv_key area = lv_value ) INTO TABLE lt_lifts.
ENDLOOP.
IF lines( lt_lifts ) = 0.
RAISE no_lifts.
ENDIF.
SPLIT iv_scans AT cl_abap_char_utilities=>newline INTO TABLE lt_scan_lines.
LOOP AT lt_scan_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL AND lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
IF NOT line_exists( lt_lifts[ lift = lv_value ] ).
CONTINUE.
ENDIF.
INSERT VALUE #( pass = lv_key lift = lv_value ) INTO TABLE lt_scans.
ENDLOOP.
LOOP AT lt_scans INTO ls_scan.
READ TABLE lt_lifts INTO ls_lift WITH TABLE KEY lift = ls_scan-lift.
INSERT VALUE #( pass = ls_scan-pass ) INTO TABLE lt_passes.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_pass>) WITH TABLE KEY pass = ls_scan-pass.
<ls_pass>-rides = <ls_pass>-rides + 1.
INSERT VALUE #( pass = ls_scan-pass area = ls_lift-area ) INTO TABLE lt_pass_areas.
ENDLOOP.
LOOP AT lt_pass_areas INTO ls_pass_area.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_area_pass>) WITH TABLE KEY pass = ls_pass_area-pass.
<ls_area_pass>-areas = <ls_area_pass>-areas + 1.
ENDLOOP.
LOOP AT lt_passes ASSIGNING FIELD-SYMBOL(<ls_out>).
ev_report = ev_report && lv_sep && |{ <ls_out>-pass };{ <ls_out>-rides };{ <ls_out>-areas }|.
lv_sep = cl_abap_char_utilities=>newline.
ENDLOOP.
ev_rides = lines( lt_scans ).
ev_passes = lines( lt_passes ).
ENDFUNCTION.

View File

@@ -0,0 +1,91 @@
FUNCTION {{p}}lift_stats
IMPORTING
iv_scans TYPE string
iv_lifts TYPE string
EXPORTING
ev_rides TYPE i
ev_passes TYPE i
ev_report TYPE string
EXCEPTIONS
no_lifts.
TYPES: BEGIN OF ty_lift,
lift TYPE string,
area TYPE string,
END OF ty_lift,
BEGIN OF ty_scan,
pass TYPE string,
lift TYPE string,
END OF ty_scan,
BEGIN OF ty_pass_area,
pass TYPE string,
area TYPE string,
END OF ty_pass_area,
BEGIN OF ty_pass,
pass TYPE string,
rides TYPE i,
areas TYPE i,
END OF ty_pass,
ty_lines TYPE STANDARD TABLE OF string WITH EMPTY KEY.
DATA lt_lift_lines TYPE ty_lines.
DATA lt_scan_lines TYPE ty_lines.
DATA lt_lifts TYPE HASHED TABLE OF ty_lift WITH UNIQUE KEY lift.
DATA lt_scans TYPE SORTED TABLE OF ty_scan WITH UNIQUE KEY pass lift.
DATA lt_pass_areas TYPE SORTED TABLE OF ty_pass_area WITH UNIQUE KEY pass area.
DATA lt_passes TYPE SORTED TABLE OF ty_pass WITH UNIQUE KEY pass.
DATA ls_lift TYPE ty_lift.
DATA ls_scan TYPE ty_scan.
DATA ls_pass_area TYPE ty_pass_area.
DATA lv_line TYPE string.
DATA lv_key TYPE string.
DATA lv_value TYPE string.
DATA lv_sep TYPE string.
SPLIT iv_lifts AT cl_abap_char_utilities=>newline INTO TABLE lt_lift_lines.
LOOP AT lt_lift_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
INSERT VALUE #( lift = lv_key area = lv_value ) INTO TABLE lt_lifts.
ENDLOOP.
IF lines( lt_lifts ) = 0.
RAISE no_lifts.
ENDIF.
SPLIT iv_scans AT cl_abap_char_utilities=>newline INTO TABLE lt_scan_lines.
LOOP AT lt_scan_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
IF NOT line_exists( lt_lifts[ lift = lv_value ] ).
CONTINUE.
ENDIF.
INSERT VALUE #( pass = lv_key lift = lv_value ) INTO TABLE lt_scans.
ENDLOOP.
LOOP AT lt_scans INTO ls_scan.
READ TABLE lt_lifts INTO ls_lift WITH TABLE KEY lift = ls_scan-lift.
INSERT VALUE #( pass = ls_scan-pass ) INTO TABLE lt_passes.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_pass>) WITH TABLE KEY pass = ls_scan-pass.
<ls_pass>-rides = <ls_pass>-rides - 1.
INSERT VALUE #( pass = ls_scan-pass area = ls_lift-area ) INTO TABLE lt_pass_areas.
ENDLOOP.
LOOP AT lt_pass_areas INTO ls_pass_area.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_area_pass>) WITH TABLE KEY pass = ls_pass_area-pass.
<ls_area_pass>-areas = <ls_area_pass>-areas + 1.
ENDLOOP.
LOOP AT lt_passes ASSIGNING FIELD-SYMBOL(<ls_out>).
ev_report = ev_report && lv_sep && |{ <ls_out>-pass };{ <ls_out>-rides };{ <ls_out>-areas }|.
lv_sep = cl_abap_char_utilities=>newline.
ENDLOOP.
ev_rides = lines( lt_scans ).
ev_passes = lines( lt_passes ).
ENDFUNCTION.

View File

@@ -0,0 +1,29 @@
{
"id": "G0123",
"pool": "eval",
"object_type": "FUNC",
"category": "C",
"attempts": [
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 4,
"killed": 2,
"ok": false
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 4,
"killed": 4,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,125 @@
CLASS {{p}}t21_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS call IMPORTING iv_scans TYPE string iv_lifts TYPE string
EXPORTING ev_rides TYPE i ev_passes TYPE i ev_report TYPE string
ev_subrc TYPE sysubrc.
METHODS empty_scans FOR TESTING.
METHODS one_scan FOR TESTING.
METHODS duplicate_scan FOR TESTING.
METHODS unknown_lift FOR TESTING.
METHODS invalid_lines FOR TESTING.
METHODS sorted_report FOR TESTING.
METHODS distinct_areas FOR TESTING.
METHODS duplicate_lift FOR TESTING.
METHODS two_passes FOR TESTING.
METHODS missing_lift_list FOR TESTING.
METHODS bad_lift_line FOR TESTING.
METHODS empty_lift_name FOR TESTING.
ENDCLASS.
CLASS {{p}}t21_hidden IMPLEMENTATION.
METHOD call.
CALL FUNCTION '{{P}}LIFT_STATS'
EXPORTING
iv_scans = iv_scans
iv_lifts = iv_lifts
IMPORTING
ev_rides = ev_rides
ev_passes = ev_passes
ev_report = ev_report
EXCEPTIONS
no_lifts = 1
OTHERS = 2.
ev_subrc = sy-subrc.
ENDMETHOD.
METHOD empty_scans.
call( EXPORTING iv_scans = `` iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = `` act = lv_report ).
ENDMETHOD.
METHOD one_scan.
call( EXPORTING iv_scans = `P1;L1` iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = `P1;1;1` act = lv_report ).
ENDMETHOD.
METHOD duplicate_scan.
call( EXPORTING iv_scans = |P1;L1\nP1;L1| iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = `P1;1;1` act = lv_report ).
ENDMETHOD.
METHOD unknown_lift.
call( EXPORTING iv_scans = `P1;L9` iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = `` act = lv_report ).
ENDMETHOD.
METHOD invalid_lines.
call( EXPORTING iv_scans = |P1;L1\nP1L1\n;L1\nP1;\nP1;L1;X\nP2;L1| iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = |P1;1;1\nP2;1;1| act = lv_report ).
ENDMETHOD.
METHOD sorted_report.
call( EXPORTING iv_scans = |P3;L1\nP1;L1\nP2;L1| iv_lifts = `L1;North`
IMPORTING ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = |P1;1;1\nP2;1;1\nP3;1;1| act = lv_report ).
ENDMETHOD.
METHOD distinct_areas.
call( EXPORTING iv_scans = |P1;L1\nP1;L2\nP1;L3| iv_lifts = |L1;North\nL2;North\nL3;South|
IMPORTING ev_rides = DATA(lv_rides) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = `P1;3;2` act = lv_report ).
ENDMETHOD.
METHOD duplicate_lift.
call( EXPORTING iv_scans = |P1;L1\nP1;L2| iv_lifts = |L1;North\nL2;North\nL1;South|
IMPORTING ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = `P1;2;1` act = lv_report ).
ENDMETHOD.
METHOD two_passes.
call( EXPORTING iv_scans = |P1;L1\nP1;L2\nP2;L2| iv_lifts = |L1;North\nL2;South|
IMPORTING ev_rides = DATA(lv_rides) ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = |P1;2;2\nP2;1;1| act = lv_report ).
ENDMETHOD.
METHOD missing_lift_list.
call( EXPORTING iv_scans = `P1;L1` iv_lifts = ``
IMPORTING ev_subrc = DATA(lv_subrc) ).
cl_abap_unit_assert=>assert_equals( exp = CONV sysubrc( 1 ) act = lv_subrc ).
ENDMETHOD.
METHOD bad_lift_line.
call( EXPORTING iv_scans = |P1;L1\nP1;L2| iv_lifts = |L1\nL2;South|
IMPORTING ev_rides = DATA(lv_rides) ev_passes = DATA(lv_passes) ev_report = DATA(lv_report) ev_subrc = DATA(lv_subrc) ).
cl_abap_unit_assert=>assert_equals( exp = CONV sysubrc( 0 ) act = lv_subrc ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_passes ).
cl_abap_unit_assert=>assert_equals( exp = `P1;1;1` act = lv_report ).
ENDMETHOD.
METHOD empty_lift_name.
call( EXPORTING iv_scans = `P1;L1` iv_lifts = `;North`
IMPORTING ev_subrc = DATA(lv_subrc) ).
cl_abap_unit_assert=>assert_equals( exp = CONV sysubrc( 1 ) act = lv_subrc ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,60 @@
{
"task": "G0123",
"mutants": [
{
"object": "{{P}}LIFT_STATS",
"mutant": "line 48: OR -> AND (logic)",
"status": "killed",
"hidden": "10/12",
"failed_tests": [
"BAD_LIFT_LINE",
"EMPTY_LIFT_NAME"
]
},
{
"object": "{{P}}LIFT_STATS",
"mutant": "line 48: OR -> AND (logic)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"BAD_LIFT_LINE"
]
},
{
"object": "{{P}}LIFT_STATS",
"mutant": "line 61: OR -> AND (logic)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"INVALID_LINES"
]
},
{
"object": "{{P}}LIFT_STATS",
"mutant": "line 64: = -> <> (eq)",
"status": "invalid",
"hidden": "0/0",
"failed_tests": []
},
{
"object": "{{P}}LIFT_STATS",
"mutant": "line 74: + -> - (arith)",
"status": "killed",
"hidden": "4/12",
"failed_tests": [
"BAD_LIFT_LINE",
"DISTINCT_AREAS",
"DUPLICATE_LIFT",
"DUPLICATE_SCAN",
"INVALID_LINES",
"ONE_SCAN",
"SORTED_REPORT",
"TWO_PASSES"
]
}
],
"valid": 4,
"killed": 4,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,91 @@
FUNCTION {{p}}lift_stats
IMPORTING
iv_scans TYPE string
iv_lifts TYPE string
EXPORTING
ev_rides TYPE i
ev_passes TYPE i
ev_report TYPE string
EXCEPTIONS
no_lifts.
TYPES: BEGIN OF ty_lift,
lift TYPE string,
area TYPE string,
END OF ty_lift,
BEGIN OF ty_scan,
pass TYPE string,
lift TYPE string,
END OF ty_scan,
BEGIN OF ty_pass_area,
pass TYPE string,
area TYPE string,
END OF ty_pass_area,
BEGIN OF ty_pass,
pass TYPE string,
rides TYPE i,
areas TYPE i,
END OF ty_pass,
ty_lines TYPE STANDARD TABLE OF string WITH EMPTY KEY.
DATA lt_lift_lines TYPE ty_lines.
DATA lt_scan_lines TYPE ty_lines.
DATA lt_lifts TYPE HASHED TABLE OF ty_lift WITH UNIQUE KEY lift.
DATA lt_scans TYPE SORTED TABLE OF ty_scan WITH UNIQUE KEY pass lift.
DATA lt_pass_areas TYPE SORTED TABLE OF ty_pass_area WITH UNIQUE KEY pass area.
DATA lt_passes TYPE SORTED TABLE OF ty_pass WITH UNIQUE KEY pass.
DATA ls_lift TYPE ty_lift.
DATA ls_scan TYPE ty_scan.
DATA ls_pass_area TYPE ty_pass_area.
DATA lv_line TYPE string.
DATA lv_key TYPE string.
DATA lv_value TYPE string.
DATA lv_sep TYPE string.
SPLIT iv_lifts AT cl_abap_char_utilities=>newline INTO TABLE lt_lift_lines.
LOOP AT lt_lift_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
INSERT VALUE #( lift = lv_key area = lv_value ) INTO TABLE lt_lifts.
ENDLOOP.
IF lines( lt_lifts ) = 0.
RAISE no_lifts.
ENDIF.
SPLIT iv_scans AT cl_abap_char_utilities=>newline INTO TABLE lt_scan_lines.
LOOP AT lt_scan_lines INTO lv_line.
SPLIT lv_line AT ';' INTO lv_key lv_value.
IF lv_key IS INITIAL OR lv_value IS INITIAL OR lv_value CA ';'.
CONTINUE.
ENDIF.
IF NOT line_exists( lt_lifts[ lift = lv_value ] ).
CONTINUE.
ENDIF.
INSERT VALUE #( pass = lv_key lift = lv_value ) INTO TABLE lt_scans.
ENDLOOP.
LOOP AT lt_scans INTO ls_scan.
READ TABLE lt_lifts INTO ls_lift WITH TABLE KEY lift = ls_scan-lift.
INSERT VALUE #( pass = ls_scan-pass ) INTO TABLE lt_passes.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_pass>) WITH TABLE KEY pass = ls_scan-pass.
<ls_pass>-rides = <ls_pass>-rides + 1.
INSERT VALUE #( pass = ls_scan-pass area = ls_lift-area ) INTO TABLE lt_pass_areas.
ENDLOOP.
LOOP AT lt_pass_areas INTO ls_pass_area.
READ TABLE lt_passes ASSIGNING FIELD-SYMBOL(<ls_area_pass>) WITH TABLE KEY pass = ls_pass_area-pass.
<ls_area_pass>-areas = <ls_area_pass>-areas + 1.
ENDLOOP.
LOOP AT lt_passes ASSIGNING FIELD-SYMBOL(<ls_out>).
ev_report = ev_report && lv_sep && |{ <ls_out>-pass };{ <ls_out>-rides };{ <ls_out>-areas }|.
lv_sep = cl_abap_char_utilities=>newline.
ENDLOOP.
ev_rides = lines( lt_scans ).
ev_passes = lines( lt_passes ).
ENDFUNCTION.

View File

@@ -0,0 +1,53 @@
CLASS {{p}}t21_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS stats IMPORTING iv_scans TYPE string iv_lifts TYPE string
EXPORTING ev_rides TYPE i ev_passes TYPE i ev_report TYPE string.
METHODS one_pass FOR TESTING.
METHODS duplicates FOR TESTING.
METHODS unknown_lift FOR TESTING.
METHODS sorted_report FOR TESTING.
ENDCLASS.
CLASS {{p}}t21_test IMPLEMENTATION.
METHOD stats.
CALL FUNCTION '{{P}}LIFT_STATS'
EXPORTING
iv_scans = iv_scans
iv_lifts = iv_lifts
IMPORTING
ev_rides = ev_rides
ev_passes = ev_passes
ev_report = ev_report
EXCEPTIONS
no_lifts = 1
OTHERS = 2.
ENDMETHOD.
METHOD one_pass.
stats( EXPORTING iv_scans = `P1;L1` iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = `P1;1;1` act = lv_report ).
ENDMETHOD.
METHOD duplicates.
stats( EXPORTING iv_scans = |P1;L1\nP1;L1| iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rides ).
ENDMETHOD.
METHOD unknown_lift.
stats( EXPORTING iv_scans = `P1;L9` iv_lifts = `L1;North`
IMPORTING ev_rides = DATA(lv_rides) ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rides ).
cl_abap_unit_assert=>assert_equals( exp = `` act = lv_report ).
ENDMETHOD.
METHOD sorted_report.
stats( EXPORTING iv_scans = |P2;L1\nP1;L1| iv_lifts = `L1;North`
IMPORTING ev_report = DATA(lv_report) ).
cl_abap_unit_assert=>assert_equals( exp = |P1;1;1\nP2;1;1| act = lv_report ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,55 @@
# 1. Goal
Summarise the lift pass scans of one day at a ski resort. The operations team
needs one function module. The function module reads the scans and the lift
list. It returns the statistics and a report.
# 2. Open questions
None.
# 3. Context
- Function group {{P}}FG_LIFT exists in package $TMP.
- The turnstile system sends the scans of the day as a text. Each line of this
text has the format `pass;lift`.
- The resort keeps a list of its lifts. Each line of this list has the format
`lift;area`.
- The lines of both texts are separated by the newline character
(cl_abap_char_utilities=>newline).
# 4. Contract
- Create the function module {{P}}LIFT_STATS in function group {{P}}FG_LIFT.
- Interface:
- Importing: iv_scans TYPE string, iv_lifts TYPE string
- Exporting: ev_rides TYPE i, ev_passes TYPE i, ev_report TYPE string
- Exceptions: no_lifts
# 5. Business rules
1. A line of a text is valid if it contains exactly one `;` and the text
before and the text after this `;` are both not empty. Ignore every other
line.
2. If iv_lifts contains no valid line, raise the exception no_lifts. Do not
change the exporting parameters in this case.
3. The lift list gives the area of a lift. If a lift occurs more than once,
the first line wins.
4. Ignore a scan if its lift is not in the lift list.
5. Count a scan once for a pass and a lift. If the same pass and the same lift
occur more than once, they count once.
6. For each pass, count its rides and its areas. The rides are the number of
the distinct lifts of the pass. The areas are the number of the distinct
areas of these lifts.
7. ev_rides is the total number of counted scans. ev_passes is the number of
passes.
8. ev_report has one line for each pass. Sort the lines by pass in ascending
order. A line has the format `pass;rides;areas`. Separate the lines by the
newline character. Do not put a newline character after the last line. If
there is no pass, ev_report is empty.
# 6. Constraints
- Release target: 8.16.
- Package: $TMP. Do not use transports.
- Coding standard: Clean ABAP. Keep every procedure below 40 statements.
- Out of scope: none.
# 7. Acceptance
- The function module is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests for the function module in a global test class.

View File

@@ -0,0 +1,76 @@
{
"id": "G0123",
"category": "C",
"object_type": "FUNC",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [
{
"type": "FUGR",
"name": "{{P}}FG_LIFT",
"description": "Function group for the lift statistics"
}
],
"contract": [
{
"type": "FUNC",
"name": "{{P}}LIFT_STATS",
"functionGroup": "{{P}}FG_LIFT",
"params": [
{
"name": "iv_scans",
"type": "string"
},
{
"name": "iv_lifts",
"type": "string"
},
{
"name": "ev_rides",
"type": "i"
},
{
"name": "ev_passes",
"type": "i"
},
{
"name": "ev_report",
"type": "string"
}
]
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T21_HIDDEN",
"file": "hidden/t21_hidden.clas.abap",
"description": "T21 hidden tests"
}
],
"reference": [
{
"type": "FUNC",
"name": "{{P}}LIFT_STATS",
"functionGroup": "{{P}}FG_LIFT",
"file": "reference/lift_stats.func.abap",
"description": "Lift statistics"
},
{
"type": "CLAS",
"name": "{{P}}T21_TEST",
"file": "reference/t21_test.clas.abap",
"description": "T21 own tests"
}
],
"craft_checks": [
"method_length",
"no_nested_loops"
]
}