Step F first pass: 81/92 accepted; budget floor 60 calls; rejected slots moved for regeneration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
55
tasks_gen/eval/G0134/faulty/m1_grain_check.func.abap
Normal file
55
tasks_gen/eval/G0134/faulty/m1_grain_check.func.abap
Normal file
@@ -0,0 +1,55 @@
|
||||
FUNCTION {{p}}grain_check
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
EXPORTING
|
||||
ev_accepted TYPE abap_bool
|
||||
ev_drying_cost TYPE decfloat34
|
||||
RAISING
|
||||
{{p}}cx_grain.
|
||||
|
||||
CONSTANTS lc_rate TYPE decfloat34 VALUE '0.75'.
|
||||
|
||||
ev_accepted = abap_false.
|
||||
ev_drying_cost = 0.
|
||||
|
||||
IF iv_weight_kg > 0.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'WEIGHT'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_supplier IS INITIAL.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'SUPPLIER'.
|
||||
ENDIF.
|
||||
|
||||
DATA lv_max_moisture TYPE decfloat34.
|
||||
CASE iv_grain_type.
|
||||
WHEN 'WHEAT'.
|
||||
lv_max_moisture = '14.5'.
|
||||
WHEN 'BARLEY'.
|
||||
lv_max_moisture = '14.0'.
|
||||
WHEN 'RYE'.
|
||||
lv_max_moisture = '15.0'.
|
||||
WHEN OTHERS.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'GRAIN_TYPE'.
|
||||
ENDCASE.
|
||||
|
||||
IF iv_moisture_pct < 0 OR iv_moisture_pct > 100.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE_RANGE'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_moisture_pct > lv_max_moisture.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE'.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_target) = lv_max_moisture - 2.
|
||||
IF iv_moisture_pct > lv_target.
|
||||
ev_drying_cost = round( val = iv_weight_kg * ( iv_moisture_pct - lv_target ) * lc_rate
|
||||
dec = 2
|
||||
mode = cl_abap_math=>round_half_up ).
|
||||
ENDIF.
|
||||
|
||||
ev_accepted = abap_true.
|
||||
|
||||
ENDFUNCTION.
|
||||
55
tasks_gen/eval/G0134/faulty/m2_grain_check.func.abap
Normal file
55
tasks_gen/eval/G0134/faulty/m2_grain_check.func.abap
Normal file
@@ -0,0 +1,55 @@
|
||||
FUNCTION {{p}}grain_check
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
EXPORTING
|
||||
ev_accepted TYPE abap_bool
|
||||
ev_drying_cost TYPE decfloat34
|
||||
RAISING
|
||||
{{p}}cx_grain.
|
||||
|
||||
CONSTANTS lc_rate TYPE decfloat34 VALUE '0.75'.
|
||||
|
||||
ev_accepted = abap_false.
|
||||
ev_drying_cost = 0.
|
||||
|
||||
IF iv_weight_kg <= 0.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'WEIGHT'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_supplier IS INITIAL.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'SUPPLIER'.
|
||||
ENDIF.
|
||||
|
||||
DATA lv_max_moisture TYPE decfloat34.
|
||||
CASE iv_grain_type.
|
||||
WHEN 'WHEAT'.
|
||||
lv_max_moisture = '14.5'.
|
||||
WHEN 'BARLEY'.
|
||||
lv_max_moisture = '14.0'.
|
||||
WHEN 'RYE'.
|
||||
lv_max_moisture = '15.0'.
|
||||
WHEN OTHERS.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'GRAIN_TYPE'.
|
||||
ENDCASE.
|
||||
|
||||
IF iv_moisture_pct < 0 AND iv_moisture_pct > 100.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE_RANGE'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_moisture_pct > lv_max_moisture.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE'.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_target) = lv_max_moisture - 2.
|
||||
IF iv_moisture_pct > lv_target.
|
||||
ev_drying_cost = round( val = iv_weight_kg * ( iv_moisture_pct - lv_target ) * lc_rate
|
||||
dec = 2
|
||||
mode = cl_abap_math=>round_half_up ).
|
||||
ENDIF.
|
||||
|
||||
ev_accepted = abap_true.
|
||||
|
||||
ENDFUNCTION.
|
||||
55
tasks_gen/eval/G0134/faulty/m3_grain_check.func.abap
Normal file
55
tasks_gen/eval/G0134/faulty/m3_grain_check.func.abap
Normal file
@@ -0,0 +1,55 @@
|
||||
FUNCTION {{p}}grain_check
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
EXPORTING
|
||||
ev_accepted TYPE abap_bool
|
||||
ev_drying_cost TYPE decfloat34
|
||||
RAISING
|
||||
{{p}}cx_grain.
|
||||
|
||||
CONSTANTS lc_rate TYPE decfloat34 VALUE '0.75'.
|
||||
|
||||
ev_accepted = abap_false.
|
||||
ev_drying_cost = 0.
|
||||
|
||||
IF iv_weight_kg <= 0.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'WEIGHT'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_supplier IS INITIAL.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'SUPPLIER'.
|
||||
ENDIF.
|
||||
|
||||
DATA lv_max_moisture TYPE decfloat34.
|
||||
CASE iv_grain_type.
|
||||
WHEN 'WHEAT'.
|
||||
lv_max_moisture = '14.5'.
|
||||
WHEN 'BARLEY'.
|
||||
lv_max_moisture = '14.0'.
|
||||
WHEN 'RYE'.
|
||||
lv_max_moisture = '15.0'.
|
||||
WHEN OTHERS.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'GRAIN_TYPE'.
|
||||
ENDCASE.
|
||||
|
||||
IF iv_moisture_pct < 0 OR iv_moisture_pct > 100.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE_RANGE'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_moisture_pct > lv_max_moisture.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE'.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_target) = lv_max_moisture - 2.
|
||||
IF iv_moisture_pct > lv_target.
|
||||
ev_drying_cost = round( val = iv_weight_kg * ( iv_moisture_pct + lv_target ) * lc_rate
|
||||
dec = 2
|
||||
mode = cl_abap_math=>round_half_up ).
|
||||
ENDIF.
|
||||
|
||||
ev_accepted = abap_true.
|
||||
|
||||
ENDFUNCTION.
|
||||
55
tasks_gen/eval/G0134/faulty/m4_grain_check.func.abap
Normal file
55
tasks_gen/eval/G0134/faulty/m4_grain_check.func.abap
Normal file
@@ -0,0 +1,55 @@
|
||||
FUNCTION {{p}}grain_check
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
EXPORTING
|
||||
ev_accepted TYPE abap_bool
|
||||
ev_drying_cost TYPE decfloat34
|
||||
RAISING
|
||||
{{p}}cx_grain.
|
||||
|
||||
CONSTANTS lc_rate TYPE decfloat34 VALUE '0.75'.
|
||||
|
||||
ev_accepted = abap_false.
|
||||
ev_drying_cost = 0.
|
||||
|
||||
IF iv_weight_kg <= 0.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'WEIGHT'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_supplier IS INITIAL.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'SUPPLIER'.
|
||||
ENDIF.
|
||||
|
||||
DATA lv_max_moisture TYPE decfloat34.
|
||||
CASE iv_grain_type.
|
||||
WHEN 'WHEAT'.
|
||||
lv_max_moisture = '14.5'.
|
||||
WHEN 'BARLEY'.
|
||||
lv_max_moisture = '14.0'.
|
||||
WHEN 'RYE'.
|
||||
lv_max_moisture = '15.0'.
|
||||
WHEN OTHERS.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'GRAIN_TYPE'.
|
||||
ENDCASE.
|
||||
|
||||
IF iv_moisture_pct < 0 OR iv_moisture_pct > 100.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE_RANGE'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_moisture_pct > lv_max_moisture.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE'.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_target) = lv_max_moisture - 2.
|
||||
IF iv_moisture_pct > lv_target.
|
||||
ev_drying_cost = round( val = iv_weight_kg * ( iv_moisture_pct - lv_target ) * lc_rate
|
||||
dec = 3
|
||||
mode = cl_abap_math=>round_half_up ).
|
||||
ENDIF.
|
||||
|
||||
ev_accepted = abap_true.
|
||||
|
||||
ENDFUNCTION.
|
||||
19
tasks_gen/eval/G0134/generation.json
Normal file
19
tasks_gen/eval/G0134/generation.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"id": "G0134",
|
||||
"pool": "eval",
|
||||
"object_type": "FUNC",
|
||||
"category": "D",
|
||||
"attempts": [
|
||||
{
|
||||
"stage": "validate",
|
||||
"oracle": 100.0,
|
||||
"null": 0,
|
||||
"mutation": {
|
||||
"valid": 5,
|
||||
"killed": 4,
|
||||
"ok": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"accepted": true
|
||||
}
|
||||
123
tasks_gen/eval/G0134/hidden/t14_hidden.clas.abap
Normal file
123
tasks_gen/eval/G0134/hidden/t14_hidden.clas.abap
Normal file
@@ -0,0 +1,123 @@
|
||||
CLASS {{p}}t14_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||
PRIVATE SECTION.
|
||||
METHODS call
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
EXPORTING
|
||||
ev_accepted TYPE abap_bool
|
||||
ev_drying_cost TYPE decfloat34
|
||||
ev_reason TYPE string
|
||||
ev_text TYPE string.
|
||||
METHODS accepts_valid_delivery FOR TESTING.
|
||||
METHODS rejects_bad_weight FOR TESTING.
|
||||
METHODS rejects_missing_supplier FOR TESTING.
|
||||
METHODS rejects_unknown_grain FOR TESTING.
|
||||
METHODS rejects_moisture_out_of_range FOR TESTING.
|
||||
METHODS rejects_wheat_too_wet FOR TESTING.
|
||||
METHODS accepts_barley_at_limit FOR TESTING.
|
||||
METHODS accepts_rye_at_limit FOR TESTING.
|
||||
METHODS calculates_drying_cost FOR TESTING.
|
||||
METHODS sets_message_text FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}t14_hidden IMPLEMENTATION.
|
||||
METHOD call.
|
||||
ev_accepted = abap_false.
|
||||
ev_drying_cost = 0.
|
||||
ev_reason = ``.
|
||||
ev_text = ``.
|
||||
TRY.
|
||||
CALL FUNCTION '{{P}}GRAIN_CHECK'
|
||||
EXPORTING
|
||||
iv_grain_type = iv_grain_type
|
||||
iv_weight_kg = iv_weight_kg
|
||||
iv_moisture_pct = iv_moisture_pct
|
||||
iv_supplier = iv_supplier
|
||||
IMPORTING
|
||||
ev_accepted = ev_accepted
|
||||
ev_drying_cost = ev_drying_cost.
|
||||
CATCH {{p}}cx_grain INTO DATA(lo_ex).
|
||||
ev_reason = lo_ex->mv_reason.
|
||||
ev_text = lo_ex->mv_text.
|
||||
ENDTRY.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD accepts_valid_delivery.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 1000 iv_moisture_pct = '12.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_accepted = DATA(lv_accepted) ev_drying_cost = DATA(lv_cost)
|
||||
ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_initial( act = lv_reason msg = 'no exception expected' ).
|
||||
cl_abap_unit_assert=>assert_true( act = lv_accepted ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = lv_cost ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rejects_bad_weight.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 0 iv_moisture_pct = '12.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'WEIGHT' act = lv_reason ).
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = -5 iv_moisture_pct = '12.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_reason = DATA(lv_reason2) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'WEIGHT' act = lv_reason2 ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rejects_missing_supplier.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 100 iv_moisture_pct = '12.0' iv_supplier = ''
|
||||
IMPORTING ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'SUPPLIER' act = lv_reason ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rejects_unknown_grain.
|
||||
call( EXPORTING iv_grain_type = 'OATS' iv_weight_kg = 100 iv_moisture_pct = '12.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'GRAIN_TYPE' act = lv_reason ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rejects_moisture_out_of_range.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 100 iv_moisture_pct = '120' iv_supplier = 'S1'
|
||||
IMPORTING ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'MOISTURE_RANGE' act = lv_reason ).
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 100 iv_moisture_pct = '-1' iv_supplier = 'S1'
|
||||
IMPORTING ev_reason = DATA(lv_reason2) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'MOISTURE_RANGE' act = lv_reason2 ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rejects_wheat_too_wet.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 100 iv_moisture_pct = '14.6' iv_supplier = 'S1'
|
||||
IMPORTING ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'MOISTURE' act = lv_reason ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD accepts_barley_at_limit.
|
||||
call( EXPORTING iv_grain_type = 'BARLEY' iv_weight_kg = 100 iv_moisture_pct = '14.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_accepted = DATA(lv_accepted) ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_initial( act = lv_reason msg = 'no exception expected' ).
|
||||
cl_abap_unit_assert=>assert_true( act = lv_accepted ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD accepts_rye_at_limit.
|
||||
call( EXPORTING iv_grain_type = 'RYE' iv_weight_kg = 100 iv_moisture_pct = '15.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_accepted = DATA(lv_accepted) ev_reason = DATA(lv_reason) ).
|
||||
cl_abap_unit_assert=>assert_initial( act = lv_reason msg = 'no exception expected' ).
|
||||
cl_abap_unit_assert=>assert_true( act = lv_accepted ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD calculates_drying_cost.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 1000 iv_moisture_pct = '13.5' iv_supplier = 'S1'
|
||||
IMPORTING ev_drying_cost = DATA(lv_cost) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '750' ) act = lv_cost ).
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 1 iv_moisture_pct = '12.53' iv_supplier = 'S1'
|
||||
IMPORTING ev_drying_cost = DATA(lv_cost2) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '0.02' ) act = lv_cost2 ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD sets_message_text.
|
||||
call( EXPORTING iv_grain_type = 'WHEAT' iv_weight_kg = 0 iv_moisture_pct = '12.0' iv_supplier = 'S1'
|
||||
IMPORTING ev_text = DATA(lv_text) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'Weight must be greater than zero' act = lv_text ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
61
tasks_gen/eval/G0134/mutation.json
Normal file
61
tasks_gen/eval/G0134/mutation.json
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"task": "G0134",
|
||||
"mutants": [
|
||||
{
|
||||
"object": "{{P}}GRAIN_CHECK",
|
||||
"mutant": "line 15: abap_false -> abap_true (bool)",
|
||||
"status": "survived",
|
||||
"hidden": "10/10",
|
||||
"failed_tests": []
|
||||
},
|
||||
{
|
||||
"object": "{{P}}GRAIN_CHECK",
|
||||
"mutant": "line 18: <= -> > (rel)",
|
||||
"status": "killed",
|
||||
"hidden": "0/10",
|
||||
"failed_tests": [
|
||||
"ACCEPTS_BARLEY_AT_LIMIT",
|
||||
"ACCEPTS_RYE_AT_LIMIT",
|
||||
"ACCEPTS_VALID_DELIVERY",
|
||||
"CALCULATES_DRYING_COST",
|
||||
"REJECTS_BAD_WEIGHT",
|
||||
"REJECTS_MISSING_SUPPLIER",
|
||||
"REJECTS_MOISTURE_OUT_OF_RANGE",
|
||||
"REJECTS_UNKNOWN_GRAIN",
|
||||
"REJECTS_WHEAT_TOO_WET",
|
||||
"SETS_MESSAGE_TEXT"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}GRAIN_CHECK",
|
||||
"mutant": "line 38: OR -> AND (logic)",
|
||||
"status": "killed",
|
||||
"hidden": "9/10",
|
||||
"failed_tests": [
|
||||
"REJECTS_MOISTURE_OUT_OF_RANGE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}GRAIN_CHECK",
|
||||
"mutant": "line 48: - -> + (arith)",
|
||||
"status": "killed",
|
||||
"hidden": "9/10",
|
||||
"failed_tests": [
|
||||
"CALCULATES_DRYING_COST"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}GRAIN_CHECK",
|
||||
"mutant": "line 49: 2 -> 3 (const)",
|
||||
"status": "killed",
|
||||
"hidden": "9/10",
|
||||
"failed_tests": [
|
||||
"CALCULATES_DRYING_COST"
|
||||
]
|
||||
}
|
||||
],
|
||||
"valid": 5,
|
||||
"killed": 4,
|
||||
"kill_rate": 0.8,
|
||||
"ok": true
|
||||
}
|
||||
28
tasks_gen/eval/G0134/reference/cx_grain.clas.abap
Normal file
28
tasks_gen/eval/G0134/reference/cx_grain.clas.abap
Normal file
@@ -0,0 +1,28 @@
|
||||
CLASS {{p}}cx_grain DEFINITION PUBLIC FINAL CREATE PUBLIC INHERITING FROM cx_static_check.
|
||||
PUBLIC SECTION.
|
||||
DATA mv_reason TYPE string READ-ONLY.
|
||||
DATA mv_text TYPE string READ-ONLY.
|
||||
METHODS constructor IMPORTING iv_reason TYPE string.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}cx_grain IMPLEMENTATION.
|
||||
METHOD constructor.
|
||||
super->constructor( ).
|
||||
mv_reason = iv_reason.
|
||||
CASE iv_reason.
|
||||
WHEN 'WEIGHT'.
|
||||
mv_text = 'Weight must be greater than zero'.
|
||||
WHEN 'SUPPLIER'.
|
||||
mv_text = 'Supplier is not filled'.
|
||||
WHEN 'GRAIN_TYPE'.
|
||||
mv_text = 'Grain type is not supported'.
|
||||
WHEN 'MOISTURE_RANGE'.
|
||||
mv_text = 'Moisture is outside the range 0 to 100'.
|
||||
WHEN 'MOISTURE'.
|
||||
mv_text = 'Moisture is above the limit of the grain type'.
|
||||
WHEN OTHERS.
|
||||
mv_text = 'Unknown reason'.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
55
tasks_gen/eval/G0134/reference/grain_check.func.abap
Normal file
55
tasks_gen/eval/G0134/reference/grain_check.func.abap
Normal file
@@ -0,0 +1,55 @@
|
||||
FUNCTION {{p}}grain_check
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
EXPORTING
|
||||
ev_accepted TYPE abap_bool
|
||||
ev_drying_cost TYPE decfloat34
|
||||
RAISING
|
||||
{{p}}cx_grain.
|
||||
|
||||
CONSTANTS lc_rate TYPE decfloat34 VALUE '0.75'.
|
||||
|
||||
ev_accepted = abap_false.
|
||||
ev_drying_cost = 0.
|
||||
|
||||
IF iv_weight_kg <= 0.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'WEIGHT'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_supplier IS INITIAL.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'SUPPLIER'.
|
||||
ENDIF.
|
||||
|
||||
DATA lv_max_moisture TYPE decfloat34.
|
||||
CASE iv_grain_type.
|
||||
WHEN 'WHEAT'.
|
||||
lv_max_moisture = '14.5'.
|
||||
WHEN 'BARLEY'.
|
||||
lv_max_moisture = '14.0'.
|
||||
WHEN 'RYE'.
|
||||
lv_max_moisture = '15.0'.
|
||||
WHEN OTHERS.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'GRAIN_TYPE'.
|
||||
ENDCASE.
|
||||
|
||||
IF iv_moisture_pct < 0 OR iv_moisture_pct > 100.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE_RANGE'.
|
||||
ENDIF.
|
||||
|
||||
IF iv_moisture_pct > lv_max_moisture.
|
||||
RAISE EXCEPTION TYPE {{p}}cx_grain EXPORTING iv_reason = 'MOISTURE'.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_target) = lv_max_moisture - 2.
|
||||
IF iv_moisture_pct > lv_target.
|
||||
ev_drying_cost = round( val = iv_weight_kg * ( iv_moisture_pct - lv_target ) * lc_rate
|
||||
dec = 2
|
||||
mode = cl_abap_math=>round_half_up ).
|
||||
ENDIF.
|
||||
|
||||
ev_accepted = abap_true.
|
||||
|
||||
ENDFUNCTION.
|
||||
69
tasks_gen/eval/G0134/reference/t14_test.clas.abap
Normal file
69
tasks_gen/eval/G0134/reference/t14_test.clas.abap
Normal file
@@ -0,0 +1,69 @@
|
||||
CLASS {{p}}t14_test DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||
PRIVATE SECTION.
|
||||
METHODS reason_for
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
iv_weight_kg TYPE decfloat34
|
||||
iv_moisture_pct TYPE decfloat34
|
||||
iv_supplier TYPE string
|
||||
RETURNING VALUE(rv_reason) TYPE string.
|
||||
METHODS valid_delivery FOR TESTING.
|
||||
METHODS weight_rule FOR TESTING.
|
||||
METHODS grain_rules FOR TESTING.
|
||||
METHODS drying_cost FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}t14_test IMPLEMENTATION.
|
||||
METHOD reason_for.
|
||||
rv_reason = ``.
|
||||
TRY.
|
||||
CALL FUNCTION '{{P}}GRAIN_CHECK'
|
||||
EXPORTING
|
||||
iv_grain_type = iv_grain_type
|
||||
iv_weight_kg = iv_weight_kg
|
||||
iv_moisture_pct = iv_moisture_pct
|
||||
iv_supplier = iv_supplier.
|
||||
CATCH {{p}}cx_grain INTO DATA(lo_ex).
|
||||
rv_reason = lo_ex->mv_reason.
|
||||
ENDTRY.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD valid_delivery.
|
||||
cl_abap_unit_assert=>assert_initial(
|
||||
act = reason_for( iv_grain_type = 'RYE' iv_weight_kg = 500 iv_moisture_pct = '13.0' iv_supplier = 'S9' ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD weight_rule.
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
exp = 'WEIGHT'
|
||||
act = reason_for( iv_grain_type = 'WHEAT' iv_weight_kg = 0 iv_moisture_pct = '12.0' iv_supplier = 'S1' ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD grain_rules.
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
exp = 'GRAIN_TYPE'
|
||||
act = reason_for( iv_grain_type = 'MAIZE' iv_weight_kg = 10 iv_moisture_pct = '12.0' iv_supplier = 'S1' ) ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
exp = 'MOISTURE'
|
||||
act = reason_for( iv_grain_type = 'RYE' iv_weight_kg = 10 iv_moisture_pct = '15.5' iv_supplier = 'S1' ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD drying_cost.
|
||||
DATA lv_cost TYPE decfloat34.
|
||||
TRY.
|
||||
CALL FUNCTION '{{P}}GRAIN_CHECK'
|
||||
EXPORTING
|
||||
iv_grain_type = 'BARLEY'
|
||||
iv_weight_kg = 200
|
||||
iv_moisture_pct = '14.0'
|
||||
iv_supplier = 'S1'
|
||||
IMPORTING
|
||||
ev_drying_cost = lv_cost.
|
||||
CATCH {{p}}cx_grain.
|
||||
cl_abap_unit_assert=>fail( msg = 'no exception expected' ).
|
||||
ENDTRY.
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '300' ) act = lv_cost ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
18
tasks_gen/eval/G0134/seed/grain_sample.func.abap
Normal file
18
tasks_gen/eval/G0134/seed/grain_sample.func.abap
Normal file
@@ -0,0 +1,18 @@
|
||||
FUNCTION {{p}}grain_sample
|
||||
IMPORTING
|
||||
iv_grain_type TYPE string
|
||||
EXPORTING
|
||||
ev_grain_name TYPE string.
|
||||
|
||||
CASE iv_grain_type.
|
||||
WHEN 'WHEAT'.
|
||||
ev_grain_name = 'Wheat'.
|
||||
WHEN 'BARLEY'.
|
||||
ev_grain_name = 'Barley'.
|
||||
WHEN 'RYE'.
|
||||
ev_grain_name = 'Rye'.
|
||||
WHEN OTHERS.
|
||||
ev_grain_name = 'Unknown'.
|
||||
ENDCASE.
|
||||
|
||||
ENDFUNCTION.
|
||||
71
tasks_gen/eval/G0134/spec.md
Normal file
71
tasks_gen/eval/G0134/spec.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# 1. Goal
|
||||
A grain cooperative accepts deliveries of grain at its silo. The weighbridge
|
||||
program calls one function module for each delivery. The function module checks
|
||||
the delivery before the silo accepts it. The function module rejects a delivery
|
||||
that breaks a quality rule. Each rejection is a class-based exception with a
|
||||
reason and a text.
|
||||
|
||||
# 2. Open questions
|
||||
None.
|
||||
|
||||
# 3. Context
|
||||
- Function group {{P}}FG_GRAIN is in package $TMP.
|
||||
- Function module {{P}}GRAIN_SAMPLE is in this group. It translates a grain type
|
||||
into a name. It shows the style of the group.
|
||||
- The weighbridge program calls the check module for each delivery.
|
||||
|
||||
# 4. Contract
|
||||
Create the exception class {{P}}CX_GRAIN in package $TMP.
|
||||
- Superclass: CX_STATIC_CHECK.
|
||||
- Public read-only attribute MV_REASON of type string.
|
||||
- Public read-only attribute MV_TEXT of type string.
|
||||
- Constructor with importing parameter IV_REASON of type string.
|
||||
|
||||
Create the function module {{P}}GRAIN_CHECK in function group {{P}}FG_GRAIN.
|
||||
- Importing parameter IV_GRAIN_TYPE of type string.
|
||||
- Importing parameter IV_WEIGHT_KG of type decfloat34.
|
||||
- Importing parameter IV_MOISTURE_PCT of type decfloat34.
|
||||
- Importing parameter IV_SUPPLIER of type string.
|
||||
- Exporting parameter EV_ACCEPTED of type abap_bool.
|
||||
- Exporting parameter EV_DRYING_COST of type decfloat34.
|
||||
- Raising exception {{P}}CX_GRAIN.
|
||||
|
||||
# 5. Business rules
|
||||
The function module checks the rules in the given order. It raises the exception
|
||||
for the first rule that matches.
|
||||
|
||||
1. IV_WEIGHT_KG is less than or equal to 0: raise {{P}}CX_GRAIN with reason
|
||||
'WEIGHT'.
|
||||
2. IV_SUPPLIER is initial: raise {{P}}CX_GRAIN with reason 'SUPPLIER'.
|
||||
3. IV_GRAIN_TYPE is not 'WHEAT', 'BARLEY' or 'RYE': raise {{P}}CX_GRAIN with
|
||||
reason 'GRAIN_TYPE'.
|
||||
4. IV_MOISTURE_PCT is less than 0 or greater than 100: raise {{P}}CX_GRAIN with
|
||||
reason 'MOISTURE_RANGE'.
|
||||
5. The maximum moisture is 14.5 for WHEAT, 14.0 for BARLEY and 15.0 for RYE.
|
||||
IV_MOISTURE_PCT is greater than the maximum moisture of the grain type:
|
||||
raise {{P}}CX_GRAIN with reason 'MOISTURE'.
|
||||
6. No rule above matches: set EV_ACCEPTED to true.
|
||||
7. The target moisture of a grain type is 2.0 below its maximum moisture.
|
||||
IV_MOISTURE_PCT is greater than the target moisture: EV_DRYING_COST is
|
||||
IV_WEIGHT_KG multiplied by the difference between IV_MOISTURE_PCT and the
|
||||
target moisture, multiplied by 0.75. Round the result half up to 2 decimals.
|
||||
Otherwise EV_DRYING_COST is 0.
|
||||
8. The constructor of {{P}}CX_GRAIN sets MV_REASON to IV_REASON. The constructor
|
||||
also sets MV_TEXT to the text of the reason:
|
||||
- 'WEIGHT': Weight must be greater than zero
|
||||
- 'SUPPLIER': Supplier is not filled
|
||||
- 'GRAIN_TYPE': Grain type is not supported
|
||||
- 'MOISTURE_RANGE': Moisture is outside the range 0 to 100
|
||||
- 'MOISTURE': Moisture is above the limit of the grain type
|
||||
|
||||
# 6. Constraints
|
||||
- Release target: 8.16.
|
||||
- Use class-based exceptions. Do not use the classic EXCEPTIONS list.
|
||||
- Follow Clean ABAP. Keep each method below 40 statements.
|
||||
- Out of scope: do not change {{P}}GRAIN_SAMPLE.
|
||||
|
||||
# 7. Acceptance
|
||||
- The exception class and the function module are active and have no syntax
|
||||
error.
|
||||
- The hidden tests pass.
|
||||
- Write ABAP Unit tests for the function module in a global test class.
|
||||
98
tasks_gen/eval/G0134/task.json
Normal file
98
tasks_gen/eval/G0134/task.json
Normal file
@@ -0,0 +1,98 @@
|
||||
{
|
||||
"id": "G0134",
|
||||
"category": "D",
|
||||
"object_type": "FUNC",
|
||||
"difficulty": 2,
|
||||
"release_target": "v816",
|
||||
"expected_outcome": "implement",
|
||||
"budget": {
|
||||
"max_tool_calls": 60,
|
||||
"max_activations": 15
|
||||
},
|
||||
"seed": [
|
||||
{
|
||||
"type": "FUGR",
|
||||
"name": "{{P}}FG_GRAIN",
|
||||
"description": "Grain delivery checks"
|
||||
},
|
||||
{
|
||||
"type": "FUNC",
|
||||
"name": "{{P}}GRAIN_SAMPLE",
|
||||
"functionGroup": "{{P}}FG_GRAIN",
|
||||
"file": "seed/grain_sample.func.abap",
|
||||
"description": "Sample module that names a grain type"
|
||||
}
|
||||
],
|
||||
"contract": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}CX_GRAIN"
|
||||
},
|
||||
{
|
||||
"type": "FUNC",
|
||||
"name": "{{P}}GRAIN_CHECK",
|
||||
"functionGroup": "{{P}}FG_GRAIN",
|
||||
"params": [
|
||||
{
|
||||
"name": "iv_grain_type",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "iv_weight_kg",
|
||||
"type": "decfloat34"
|
||||
},
|
||||
{
|
||||
"name": "iv_moisture_pct",
|
||||
"type": "decfloat34"
|
||||
},
|
||||
{
|
||||
"name": "iv_supplier",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "ev_accepted",
|
||||
"type": "abap_bool"
|
||||
},
|
||||
{
|
||||
"name": "ev_drying_cost",
|
||||
"type": "decfloat34"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"out_of_scope": [
|
||||
"{{P}}GRAIN_SAMPLE"
|
||||
],
|
||||
"hidden_tests": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}T14_HIDDEN",
|
||||
"file": "hidden/t14_hidden.clas.abap",
|
||||
"description": "T14 hidden tests"
|
||||
}
|
||||
],
|
||||
"reference": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}CX_GRAIN",
|
||||
"file": "reference/cx_grain.clas.abap",
|
||||
"description": "Exception class for a rejected grain delivery"
|
||||
},
|
||||
{
|
||||
"type": "FUNC",
|
||||
"name": "{{P}}GRAIN_CHECK",
|
||||
"functionGroup": "{{P}}FG_GRAIN",
|
||||
"file": "reference/grain_check.func.abap",
|
||||
"description": "Grain delivery check module"
|
||||
},
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}T14_TEST",
|
||||
"file": "reference/t14_test.clas.abap",
|
||||
"description": "T14 own tests"
|
||||
}
|
||||
],
|
||||
"craft_checks": [
|
||||
"method_length"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user