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:
Kral
2026-10-03 12:10:52 +02:00
parent d3250acfb8
commit 39769afce8
741 changed files with 40573 additions and 317 deletions

View 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.

View 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.

View 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.

View 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.

View 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
}

View 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.

View 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
}

View 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.

View 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.

View 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.

View 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.

View 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.

View 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"
]
}