Stage 2 summary at 50 accepted trajectories
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
97
tasks_gen/train/G1090/faulty/m1_ski_lift_old.prog.abap
Normal file
97
tasks_gen/train/G1090/faulty/m1_ski_lift_old.prog.abap
Normal 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.
|
||||
97
tasks_gen/train/G1090/faulty/m2_ski_lift_old.prog.abap
Normal file
97
tasks_gen/train/G1090/faulty/m2_ski_lift_old.prog.abap
Normal 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.
|
||||
19
tasks_gen/train/G1090/generation.json
Normal file
19
tasks_gen/train/G1090/generation.json
Normal 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
|
||||
}
|
||||
97
tasks_gen/train/G1090/hidden/ski_hidden.clas.abap
Normal file
97
tasks_gen/train/G1090/hidden/ski_hidden.clas.abap
Normal 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.
|
||||
44
tasks_gen/train/G1090/mutation.json
Normal file
44
tasks_gen/train/G1090/mutation.json
Normal 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
|
||||
}
|
||||
97
tasks_gen/train/G1090/reference/ski_lift_old.prog.abap
Normal file
97
tasks_gen/train/G1090/reference/ski_lift_old.prog.abap
Normal 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.
|
||||
78
tasks_gen/train/G1090/seed/ski_lift_old.prog.abap
Normal file
78
tasks_gen/train/G1090/seed/ski_lift_old.prog.abap
Normal 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.
|
||||
18
tasks_gen/train/G1090/seed/ski_seed.clas.abap
Normal file
18
tasks_gen/train/G1090/seed/ski_seed.clas.abap
Normal 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.
|
||||
13
tasks_gen/train/G1090/seed/skiride.tabl.asabap
Normal file
13
tasks_gen/train/G1090/seed/skiride.tabl.asabap
Normal 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);
|
||||
}
|
||||
48
tasks_gen/train/G1090/spec.md
Normal file
48
tasks_gen/train/G1090/spec.md
Normal 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.
|
||||
67
tasks_gen/train/G1090/task.json
Normal file
67
tasks_gen/train/G1090/task.json
Normal 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"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user