Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,97 @@
REPORT {{p}}ski_lift_old.
DATA gv_lift TYPE {{p}}skiride-lift_id.
PARAMETERS p_season TYPE c LENGTH 4 OBLIGATORY.
SELECT-OPTIONS s_lift FOR gv_lift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES ty_season TYPE c LENGTH 4.
TYPES tt_lift TYPE RANGE OF {{p}}skiride-lift_id.
TYPES: BEGIN OF ty_line,
lift_id TYPE {{p}}skiride-lift_id,
rides TYPE i,
tickets TYPE i,
revenue TYPE {{p}}skiride-fare,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.
METHODS collect
IMPORTING iv_season TYPE ty_season
it_lift TYPE tt_lift
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD collect.
SELECT lift_id,
COUNT( * ) AS rides,
SUM( tickets ) AS tickets,
SUM( tickets * fare ) AS revenue
FROM {{p}}skiride
WHERE season <> @iv_season
AND lift_id IN @it_lift
GROUP BY lift_id
ORDER BY revenue DESCENDING
INTO CORRESPONDING FIELDS OF TABLE @rt_lines.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_lines) = go_report->collect( iv_season = p_season it_lift = s_lift[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_lift FOR TESTING.
METHODS lift_filter FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}SKIRIDE' ) ) ).
DATA lt_ride TYPE STANDARD TABLE OF {{p}}skiride WITH EMPTY KEY.
lt_ride = VALUE #( ( ride_id = 1 lift_id = 'NORD' season = '2026' tickets = 10 fare = 25 )
( ride_id = 2 lift_id = 'NORD' season = '2026' tickets = 6 fare = 25 )
( ride_id = 3 lift_id = 'SUED' season = '2026' tickets = 20 fare = 30 ) ).
go_env->insert_test_data( lt_ride ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_lift.
DATA(lt_lines) = NEW lcl_report( )->collect( iv_season = '2026' it_lift = VALUE #( ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'SUED' act = lt_lines[ 1 ]-lift_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 600 ) act = lt_lines[ 1 ]-revenue ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_lines[ 2 ]-rides ).
cl_abap_unit_assert=>assert_equals( exp = 16 act = lt_lines[ 2 ]-tickets ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 2 ]-revenue ).
ENDMETHOD.
METHOD lift_filter.
DATA(lt_lines) = NEW lcl_report( )->collect(
iv_season = '2026' it_lift = VALUE #( ( sign = 'I' option = 'EQ' low = 'NORD' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = lt_lines[ 1 ]-lift_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 1 ]-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,97 @@
REPORT {{p}}ski_lift_old.
DATA gv_lift TYPE {{p}}skiride-lift_id.
PARAMETERS p_season TYPE c LENGTH 4 OBLIGATORY.
SELECT-OPTIONS s_lift FOR gv_lift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES ty_season TYPE c LENGTH 4.
TYPES tt_lift TYPE RANGE OF {{p}}skiride-lift_id.
TYPES: BEGIN OF ty_line,
lift_id TYPE {{p}}skiride-lift_id,
rides TYPE i,
tickets TYPE i,
revenue TYPE {{p}}skiride-fare,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.
METHODS collect
IMPORTING iv_season TYPE ty_season
it_lift TYPE tt_lift
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD collect.
SELECT lift_id,
COUNT( * ) AS rides,
SUM( tickets ) AS tickets,
SUM( tickets * fare ) AS revenue
FROM {{p}}skiride
WHERE season = @iv_season
OR lift_id IN @it_lift
GROUP BY lift_id
ORDER BY revenue DESCENDING
INTO CORRESPONDING FIELDS OF TABLE @rt_lines.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_lines) = go_report->collect( iv_season = p_season it_lift = s_lift[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_lift FOR TESTING.
METHODS lift_filter FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}SKIRIDE' ) ) ).
DATA lt_ride TYPE STANDARD TABLE OF {{p}}skiride WITH EMPTY KEY.
lt_ride = VALUE #( ( ride_id = 1 lift_id = 'NORD' season = '2026' tickets = 10 fare = 25 )
( ride_id = 2 lift_id = 'NORD' season = '2026' tickets = 6 fare = 25 )
( ride_id = 3 lift_id = 'SUED' season = '2026' tickets = 20 fare = 30 ) ).
go_env->insert_test_data( lt_ride ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_lift.
DATA(lt_lines) = NEW lcl_report( )->collect( iv_season = '2026' it_lift = VALUE #( ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'SUED' act = lt_lines[ 1 ]-lift_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 600 ) act = lt_lines[ 1 ]-revenue ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_lines[ 2 ]-rides ).
cl_abap_unit_assert=>assert_equals( exp = 16 act = lt_lines[ 2 ]-tickets ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 2 ]-revenue ).
ENDMETHOD.
METHOD lift_filter.
DATA(lt_lines) = NEW lcl_report( )->collect(
iv_season = '2026' it_lift = VALUE #( ( sign = 'I' option = 'EQ' low = 'NORD' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = lt_lines[ 1 ]-lift_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 1 ]-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,19 @@
{
"id": "G1090",
"pool": "train",
"object_type": "PROG",
"category": "E",
"attempts": [
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 2,
"killed": 2,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,97 @@
CLASS {{p}}ski_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_season TYPE c LENGTH 4.
TYPES tt_lift TYPE RANGE OF {{p}}skiride-lift_id.
METHODS run IMPORTING iv_season TYPE ty_season
it_lift TYPE tt_lift OPTIONAL
RETURNING VALUE(rr_data) TYPE REF TO data.
METHODS value_of IMPORTING ir_data TYPE REF TO data
iv_row TYPE i
iv_col TYPE string
RETURNING VALUE(rv_value) TYPE string.
METHODS lines_of IMPORTING ir_data TYPE REF TO data
RETURNING VALUE(rv_lines) TYPE i.
METHODS all_lifts FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS totals_per_lift FOR TESTING.
METHODS season_filter FOR TESTING.
METHODS lift_filter FOR TESTING.
METHODS multi_lift_filter FOR TESTING.
ENDCLASS.
CLASS {{p}}ski_hidden IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}ski_lift_old WITH p_season = iv_season WITH s_lift IN it_lift AND RETURN.
TRY.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = rr_data ).
CATCH cx_salv_bs_sc_runtime_info.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
ENDMETHOD.
METHOD lines_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
IF ir_data IS BOUND.
ASSIGN ir_data->* TO <lt_data>.
rv_lines = lines( <lt_data> ).
ENDIF.
ENDMETHOD.
METHOD value_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
ASSIGN ir_data->* TO <lt_data>.
ASSIGN <lt_data>[ iv_row ] TO FIELD-SYMBOL(<ls_line>).
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = |Row { iv_row } missing| ).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO FIELD-SYMBOL(<lv_value>).
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = |Column { iv_col } missing| ).
rv_value = condense( CONV string( <lv_value> ) ).
ENDMETHOD.
METHOD all_lifts.
cl_abap_unit_assert=>assert_equals( exp = 3 act = lines_of( run( '2026' ) ) ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA(lr_data) = run( '2026' ).
cl_abap_unit_assert=>assert_equals( exp = `SUED` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LIFT_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `NORD` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `LIFT_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `OST` act = value_of( ir_data = lr_data iv_row = 3 iv_col = `LIFT_ID` ) ).
ENDMETHOD.
METHOD totals_per_lift.
DATA(lr_data) = run( '2026' ).
cl_abap_unit_assert=>assert_equals( exp = `2` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `RIDES` ) ).
cl_abap_unit_assert=>assert_equals( exp = `25` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TICKETS` ) ).
cl_abap_unit_assert=>assert_equals( exp = `750.00` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `REVENUE` ) ).
cl_abap_unit_assert=>assert_equals( exp = `2` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `RIDES` ) ).
cl_abap_unit_assert=>assert_equals( exp = `16` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `TICKETS` ) ).
cl_abap_unit_assert=>assert_equals( exp = `400.00` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `REVENUE` ) ).
ENDMETHOD.
METHOD season_filter.
DATA(lr_data) = run( '2025' ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `WEST` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LIFT_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `4000.00` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `REVENUE` ) ).
ENDMETHOD.
METHOD lift_filter.
DATA(lr_data) = run( iv_season = '2026'
it_lift = VALUE #( ( sign = 'I' option = 'EQ' low = 'NORD' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `2` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `RIDES` ) ).
cl_abap_unit_assert=>assert_equals( exp = `400.00` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `REVENUE` ) ).
ENDMETHOD.
METHOD multi_lift_filter.
DATA(lr_data) = run( iv_season = '2026'
it_lift = VALUE #( ( sign = 'I' option = 'EQ' low = 'NORD' )
( sign = 'I' option = 'EQ' low = 'OST' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `NORD` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LIFT_ID` ) ).
cl_abap_unit_assert=>assert_equals( exp = `OST` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `LIFT_ID` ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,44 @@
{
"task": "G1090",
"mutants": [
{
"object": "{{P}}SKI_LIFT_OLD",
"mutant": "line 32: * -> / (arith)",
"status": "invalid",
"hidden": "0/0",
"failed_tests": []
},
{
"object": "{{P}}SKI_LIFT_OLD",
"mutant": "line 34: = -> <> (eq)",
"status": "killed",
"hidden": "0/6",
"failed_tests": [
"ALL_LIFTS",
"LIFT_FILTER",
"MULTI_LIFT_FILTER",
"SEASON_FILTER",
"SORTED_BY_REVENUE",
"TOTALS_PER_LIFT"
]
},
{
"object": "{{P}}SKI_LIFT_OLD",
"mutant": "line 35: AND -> OR (logic)",
"status": "killed",
"hidden": "0/6",
"failed_tests": [
"ALL_LIFTS",
"LIFT_FILTER",
"MULTI_LIFT_FILTER",
"SEASON_FILTER",
"SORTED_BY_REVENUE",
"TOTALS_PER_LIFT"
]
}
],
"valid": 2,
"killed": 2,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,97 @@
REPORT {{p}}ski_lift_old.
DATA gv_lift TYPE {{p}}skiride-lift_id.
PARAMETERS p_season TYPE c LENGTH 4 OBLIGATORY.
SELECT-OPTIONS s_lift FOR gv_lift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES ty_season TYPE c LENGTH 4.
TYPES tt_lift TYPE RANGE OF {{p}}skiride-lift_id.
TYPES: BEGIN OF ty_line,
lift_id TYPE {{p}}skiride-lift_id,
rides TYPE i,
tickets TYPE i,
revenue TYPE {{p}}skiride-fare,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.
METHODS collect
IMPORTING iv_season TYPE ty_season
it_lift TYPE tt_lift
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD collect.
SELECT lift_id,
COUNT( * ) AS rides,
SUM( tickets ) AS tickets,
SUM( tickets * fare ) AS revenue
FROM {{p}}skiride
WHERE season = @iv_season
AND lift_id IN @it_lift
GROUP BY lift_id
ORDER BY revenue DESCENDING
INTO CORRESPONDING FIELDS OF TABLE @rt_lines.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_lines) = go_report->collect( iv_season = p_season it_lift = s_lift[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_lift FOR TESTING.
METHODS lift_filter FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}SKIRIDE' ) ) ).
DATA lt_ride TYPE STANDARD TABLE OF {{p}}skiride WITH EMPTY KEY.
lt_ride = VALUE #( ( ride_id = 1 lift_id = 'NORD' season = '2026' tickets = 10 fare = 25 )
( ride_id = 2 lift_id = 'NORD' season = '2026' tickets = 6 fare = 25 )
( ride_id = 3 lift_id = 'SUED' season = '2026' tickets = 20 fare = 30 ) ).
go_env->insert_test_data( lt_ride ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_lift.
DATA(lt_lines) = NEW lcl_report( )->collect( iv_season = '2026' it_lift = VALUE #( ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'SUED' act = lt_lines[ 1 ]-lift_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 600 ) act = lt_lines[ 1 ]-revenue ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_lines[ 2 ]-rides ).
cl_abap_unit_assert=>assert_equals( exp = 16 act = lt_lines[ 2 ]-tickets ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 2 ]-revenue ).
ENDMETHOD.
METHOD lift_filter.
DATA(lt_lines) = NEW lcl_report( )->collect(
iv_season = '2026' it_lift = VALUE #( ( sign = 'I' option = 'EQ' low = 'NORD' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = lt_lines[ 1 ]-lift_id ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 1 ]-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,78 @@
REPORT {{p}}ski_lift_old.
DATA: gv_lift TYPE {{p}}skiride-lift_id.
PARAMETERS p_season TYPE c LENGTH 4 OBLIGATORY.
SELECT-OPTIONS s_lift FOR gv_lift.
TYPES: BEGIN OF ty_line,
lift_id TYPE {{p}}skiride-lift_id,
rides TYPE i,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
DATA: gt_rides TYPE STANDARD TABLE OF {{p}}skiride,
gt_lines TYPE STANDARD TABLE OF ty_line,
gs_ride TYPE {{p}}skiride,
gs_line TYPE ty_line,
gv_index TYPE i,
gv_found TYPE c LENGTH 1,
gv_rev TYPE p LENGTH 15 DECIMALS 2.
START-OF-SELECTION.
PERFORM read_rides.
PERFORM build_lines.
PERFORM sort_lines.
PERFORM show_lines.
FORM read_rides.
SELECT * FROM {{p}}skiride INTO TABLE gt_rides
WHERE season = p_season
AND lift_id IN s_lift.
ENDFORM.
FORM build_lines.
LOOP AT gt_rides INTO gs_ride.
CLEAR: gv_found, gs_line.
LOOP AT gt_lines INTO gs_line.
IF gs_line-lift_id = gs_ride-lift_id.
gv_found = 'X'.
gv_index = sy-tabix.
EXIT.
ENDIF.
ENDLOOP.
IF gv_found = 'X'.
READ TABLE gt_lines INTO gs_line INDEX gv_index.
gs_line-rides = gs_line-rides + 1.
gs_line-tickets = gs_line-tickets + gs_ride-tickets.
COMPUTE gv_rev = gs_ride-tickets * gs_ride-fare.
gs_line-revenue = gs_line-revenue + gv_rev.
MODIFY gt_lines FROM gs_line INDEX gv_index.
ELSE.
CLEAR gs_line.
gs_line-lift_id = gs_ride-lift_id.
gs_line-rides = 1.
gs_line-tickets = gs_ride-tickets.
COMPUTE gs_line-revenue = gs_ride-tickets * gs_ride-fare.
APPEND gs_line TO gt_lines.
ENDIF.
ENDLOOP.
ENDFORM.
FORM sort_lines.
SORT gt_lines BY revenue DESCENDING.
ENDFORM.
FORM show_lines.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_msg TYPE REF TO cx_salv_msg.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING r_salv_table = lo_alv
CHANGING t_table = gt_lines.
CALL METHOD lo_alv->display.
CATCH cx_salv_msg INTO lx_msg.
MESSAGE lx_msg TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDFORM.

View File

@@ -0,0 +1,18 @@
CLASS {{p}}ski_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}ski_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DELETE FROM {{p}}skiride.
INSERT {{p}}skiride FROM TABLE @( VALUE #(
( ride_id = 1 lift_id = 'NORD' season = '2026' tickets = 10 fare = '25.00' )
( ride_id = 2 lift_id = 'NORD' season = '2026' tickets = 6 fare = '25.00' )
( ride_id = 3 lift_id = 'SUED' season = '2026' tickets = 20 fare = '30.00' )
( ride_id = 4 lift_id = 'SUED' season = '2026' tickets = 5 fare = '30.00' )
( ride_id = 5 lift_id = 'OST' season = '2026' tickets = 3 fare = '20.00' )
( ride_id = 6 lift_id = 'WEST' season = '2025' tickets = 100 fare = '40.00' ) ) ).
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,13 @@
@EndUserText.label : 'Rides of the ski lifts'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}skiride {
key client : abap.clnt not null;
key ride_id : abap.int4 not null;
lift_id : abap.char(4);
season : abap.char(4);
tickets : abap.int4;
fare : abap.dec(15,2);
}

View File

@@ -0,0 +1,48 @@
# 1. Goal
Refactor the legacy report {{P}}SKI_LIFT_OLD in package $TMP. The report shows
the rides and the revenue of each lift of a ski resort for one season. The
operations team uses the report to compare the lifts. The behavior of the
report stays the same.
# 2. Open questions
None.
# 3. Context
- The executable program {{P}}SKI_LIFT_OLD exists in package $TMP. It is
active. The legacy code of this program is the specification of its
behavior.
- The table {{P}}SKIRIDE exists in package $TMP. It contains data.
Fields: RIDE_ID (INT4, key), LIFT_ID (CHAR 4), SEASON (CHAR 4),
TICKETS (INT4), FARE (DEC 15,2).
- One row of {{P}}SKIRIDE is one ride of one lift. FARE is the price of one
ticket of this ride.
# 4. Contract
- Refactor the executable program {{P}}SKI_LIFT_OLD in package $TMP. The name
stays the same.
- The selection screen stays the same:
- Parameter P_SEASON, type CHAR 4, mandatory.
- Select-option S_LIFT for the lift.
- Show the result with CL_SALV_TABLE. The output table has these columns, with
these names: LIFT_ID, RIDES, TICKETS, REVENUE.
# 5. Business rules
1. The behavior of the report stays the same. The legacy code in
{{P}}SKI_LIFT_OLD is the specification. Read the legacy code. Do not guess.
2. The selection screen, the filter, the totals and the sort order do not
change.
3. The report must stay fast when the table {{P}}SKIRIDE grows. Do not read the
same data more than one time.
4. The code must be easy to maintain.
# 6. Constraints
- Release target: 8.16.
- Coding standards: Clean ABAP. No method has more than 40 statements. No
database access in a loop.
- Out of scope: do not change {{P}}SKIRIDE and {{P}}SKI_SEED.
# 7. Acceptance
- The program is active and has no syntax error.
- The behavior is the same as the behavior of the legacy code.
- The hidden tests pass.
- Write ABAP Unit tests as local test classes in the program.

View File

@@ -0,0 +1,67 @@
{
"id": "G1090",
"category": "E",
"object_type": "PROG",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "TABL",
"name": "{{P}}SKIRIDE",
"file": "seed/skiride.tabl.asabap",
"description": "Rides of the ski lifts"
},
{
"type": "PROG",
"name": "{{P}}SKI_LIFT_OLD",
"file": "seed/ski_lift_old.prog.abap",
"description": "Legacy ski lift revenue report"
},
{
"type": "CLAS",
"name": "{{P}}SKI_SEED",
"file": "seed/ski_seed.clas.abap",
"description": "Ski ride seed data",
"run": true
}
],
"contract": [
{
"type": "PROG",
"name": "{{P}}SKI_LIFT_OLD",
"parameters": [
"p_season",
"s_lift"
]
}
],
"out_of_scope": [
"{{P}}SKIRIDE",
"{{P}}SKI_SEED"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}SKI_HIDDEN",
"file": "hidden/ski_hidden.clas.abap",
"description": "Hidden tests for the ski lift report"
}
],
"reference": [
{
"type": "PROG",
"name": "{{P}}SKI_LIFT_OLD",
"file": "reference/ski_lift_old.prog.abap",
"description": "Refactored ski lift report"
}
],
"craft_checks": [
"db_operation_in_loop",
"method_length"
]
}