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,39 @@
FUNCTION {{p}}dlv_price
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_true.
IF iv_weight <= 0.
RAISE invalid_weight.
ENDIF.
IF iv_distance > 300.
ev_skip = abap_true.
RETURN.
ENDIF.
CASE iv_service.
WHEN 'EX'.
cv_price = round( val = 12 + iv_distance * '0.60' + iv_weight * '1.50'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN 'ST'.
cv_price = round( val = 5 + iv_distance * '0.30' + iv_weight * '0.80'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN OTHERS.
ev_skip = abap_true.
cv_price = 0.
ENDCASE.
ENDFUNCTION.

View File

@@ -0,0 +1,39 @@
FUNCTION {{p}}dlv_price
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_false.
IF iv_weight <= 0.
RAISE invalid_weight.
ENDIF.
IF iv_distance > 300.
ev_skip = abap_true.
RETURN.
ENDIF.
CASE iv_service.
WHEN 'EX'.
cv_price = round( val = 13 + iv_distance * '0.60' + iv_weight * '1.50'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN 'ST'.
cv_price = round( val = 5 + iv_distance * '0.30' + iv_weight * '0.80'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN OTHERS.
ev_skip = abap_true.
cv_price = 0.
ENDCASE.
ENDFUNCTION.

View File

@@ -0,0 +1,39 @@
FUNCTION {{p}}dlv_price
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_false.
IF iv_weight <= 0.
RAISE invalid_weight.
ENDIF.
IF iv_distance > 300.
ev_skip = abap_true.
RETURN.
ENDIF.
CASE iv_service.
WHEN 'EX'.
cv_price = round( val = 12 + iv_distance * '0.60' + iv_weight * '1.50'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price >= 6.
cv_price = 6.
ENDIF.
WHEN 'ST'.
cv_price = round( val = 5 + iv_distance * '0.30' + iv_weight * '0.80'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN OTHERS.
ev_skip = abap_true.
cv_price = 0.
ENDCASE.
ENDFUNCTION.

View File

@@ -0,0 +1,39 @@
FUNCTION {{p}}dlv_price
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_false.
IF iv_weight <= 0.
RAISE invalid_weight.
ENDIF.
IF iv_distance > 300.
ev_skip = abap_true.
RETURN.
ENDIF.
CASE iv_service.
WHEN 'EX'.
cv_price = round( val = 12 + iv_distance * '0.60' + iv_weight * '1.50'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN 'ST'.
cv_price = round( val = 6 + iv_distance * '0.30' + iv_weight * '0.80'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN OTHERS.
ev_skip = abap_true.
cv_price = 0.
ENDCASE.
ENDFUNCTION.

View File

@@ -0,0 +1,39 @@
FUNCTION {{p}}dlv_price
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_false.
IF iv_weight <= 0.
RAISE invalid_weight.
ENDIF.
IF iv_distance > 300.
ev_skip = abap_true.
RETURN.
ENDIF.
CASE iv_service.
WHEN 'EX'.
cv_price = round( val = 12 + iv_distance * '0.60' + iv_weight * '1.50'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN 'ST'.
cv_price = round( val = 5 + iv_distance * '0.30' + iv_weight / '0.80'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN OTHERS.
ev_skip = abap_true.
cv_price = 0.
ENDCASE.
ENDFUNCTION.

View File

@@ -0,0 +1,19 @@
{
"id": "G1085",
"pool": "train",
"object_type": "FUNC",
"category": "F",
"attempts": [
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,83 @@
CLASS {{p}}t14_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS call
IMPORTING iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
iv_price TYPE decfloat34 DEFAULT 7
EXPORTING ev_skip TYPE abap_bool
ev_price TYPE decfloat34
ev_subrc TYPE sysubrc.
METHODS express_price FOR TESTING.
METHODS standard_price FOR TESTING.
METHODS price_rounding FOR TESTING.
METHODS minimum_charge FOR TESTING.
METHODS unknown_service FOR TESTING.
METHODS out_of_area FOR TESTING.
METHODS invalid_weight FOR TESTING.
METHODS skip_false_normal FOR TESTING.
ENDCLASS.
CLASS {{p}}t14_hidden IMPLEMENTATION.
METHOD call.
ev_price = iv_price.
CALL FUNCTION '{{P}}DLV_PRICE'
EXPORTING iv_service = iv_service iv_weight = iv_weight iv_distance = iv_distance
IMPORTING ev_skip = ev_skip
CHANGING cv_price = ev_price
EXCEPTIONS invalid_weight = 1 OTHERS = 2.
ev_subrc = sy-subrc.
ENDMETHOD.
METHOD express_price.
call( EXPORTING iv_service = `EX` iv_weight = 2 iv_distance = 10
IMPORTING ev_price = DATA(lv_price) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 21 ) act = lv_price ).
ENDMETHOD.
METHOD standard_price.
call( EXPORTING iv_service = `ST` iv_weight = 5 iv_distance = 20
IMPORTING ev_price = DATA(lv_price) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 15 ) act = lv_price ).
ENDMETHOD.
METHOD price_rounding.
call( EXPORTING iv_service = `EX` iv_weight = '1.25' iv_distance = '7.7'
IMPORTING ev_price = DATA(lv_price) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '18.50' ) act = lv_price ).
ENDMETHOD.
METHOD minimum_charge.
call( EXPORTING iv_service = `ST` iv_weight = '0.5' iv_distance = 1
IMPORTING ev_price = DATA(lv_price) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 6 ) act = lv_price ).
ENDMETHOD.
METHOD unknown_service.
call( EXPORTING iv_service = `XX` iv_weight = 2 iv_distance = 10
IMPORTING ev_skip = DATA(lv_skip) ev_price = DATA(lv_price) ).
cl_abap_unit_assert=>assert_equals( exp = abap_true act = lv_skip ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = lv_price ).
ENDMETHOD.
METHOD out_of_area.
call( EXPORTING iv_service = `EX` iv_weight = 2 iv_distance = 400 iv_price = 7
IMPORTING ev_skip = DATA(lv_skip) ev_price = DATA(lv_price) ).
cl_abap_unit_assert=>assert_equals( exp = abap_true act = lv_skip ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 7 ) act = lv_price ).
ENDMETHOD.
METHOD invalid_weight.
call( EXPORTING iv_service = `EX` iv_weight = 0 iv_distance = 10
IMPORTING ev_subrc = DATA(lv_rc) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ).
ENDMETHOD.
METHOD skip_false_normal.
call( EXPORTING iv_service = `EX` iv_weight = 2 iv_distance = 10
IMPORTING ev_skip = DATA(lv_skip) ).
cl_abap_unit_assert=>assert_equals( exp = abap_false act = lv_skip ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,57 @@
{
"task": "G1085",
"mutants": [
{
"object": "{{P}}DLV_PRICE",
"mutant": "line 13: abap_false -> abap_true (bool)",
"status": "killed",
"hidden": "7/8",
"failed_tests": [
"SKIP_FALSE_NORMAL"
]
},
{
"object": "{{P}}DLV_PRICE",
"mutant": "line 23: 12 -> 13 (const)",
"status": "killed",
"hidden": "6/8",
"failed_tests": [
"EXPRESS_PRICE",
"PRICE_ROUNDING"
]
},
{
"object": "{{P}}DLV_PRICE",
"mutant": "line 25: < -> >= (rel)",
"status": "killed",
"hidden": "6/8",
"failed_tests": [
"EXPRESS_PRICE",
"PRICE_ROUNDING"
]
},
{
"object": "{{P}}DLV_PRICE",
"mutant": "line 29: 5 -> 6 (const)",
"status": "killed",
"hidden": "6/8",
"failed_tests": [
"MINIMUM_CHARGE",
"STANDARD_PRICE"
]
},
{
"object": "{{P}}DLV_PRICE",
"mutant": "line 29: * -> / (arith)",
"status": "killed",
"hidden": "7/8",
"failed_tests": [
"STANDARD_PRICE"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,39 @@
FUNCTION {{p}}dlv_price
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_false.
IF iv_weight <= 0.
RAISE invalid_weight.
ENDIF.
IF iv_distance > 300.
ev_skip = abap_true.
RETURN.
ENDIF.
CASE iv_service.
WHEN 'EX'.
cv_price = round( val = 12 + iv_distance * '0.60' + iv_weight * '1.50'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN 'ST'.
cv_price = round( val = 5 + iv_distance * '0.30' + iv_weight * '0.80'
dec = 2 mode = cl_abap_math=>round_half_up ).
IF cv_price < 6.
cv_price = 6.
ENDIF.
WHEN OTHERS.
ev_skip = abap_true.
cv_price = 0.
ENDCASE.
ENDFUNCTION.

View File

@@ -0,0 +1,55 @@
CLASS {{p}}t14_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS price_for
IMPORTING iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
RETURNING VALUE(rv_price) TYPE decfloat34.
METHODS express_price FOR TESTING.
METHODS standard_price FOR TESTING.
METHODS minimum_charge FOR TESTING.
METHODS out_of_area_skips FOR TESTING.
ENDCLASS.
CLASS {{p}}t14_test IMPLEMENTATION.
METHOD price_for.
DATA lv_skip TYPE abap_bool.
CALL FUNCTION '{{P}}DLV_PRICE'
EXPORTING iv_service = iv_service iv_weight = iv_weight iv_distance = iv_distance
IMPORTING ev_skip = lv_skip
CHANGING cv_price = rv_price
EXCEPTIONS invalid_weight = 1 OTHERS = 2.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
ENDMETHOD.
METHOD express_price.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( 21 )
act = price_for( iv_service = `EX` iv_weight = 2 iv_distance = 10 ) ).
ENDMETHOD.
METHOD standard_price.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( 15 )
act = price_for( iv_service = `ST` iv_weight = 5 iv_distance = 20 ) ).
ENDMETHOD.
METHOD minimum_charge.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( 6 )
act = price_for( iv_service = `ST` iv_weight = '0.5' iv_distance = 1 ) ).
ENDMETHOD.
METHOD out_of_area_skips.
DATA lv_skip TYPE abap_bool.
DATA lv_price TYPE decfloat34 VALUE 7.
CALL FUNCTION '{{P}}DLV_PRICE'
EXPORTING iv_service = `EX` iv_weight = 2 iv_distance = 400
IMPORTING ev_skip = lv_skip
CHANGING cv_price = lv_price.
cl_abap_unit_assert=>assert_true( lv_skip ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 7 ) act = lv_price ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,18 @@
FUNCTION {{p}}dlv_sample
IMPORTING
iv_service TYPE string
iv_weight TYPE decfloat34
iv_distance TYPE decfloat34
EXPORTING
ev_skip TYPE abap_bool
CHANGING
cv_price TYPE decfloat34
EXCEPTIONS
invalid_weight.
ev_skip = abap_false.
IF iv_service IS INITIAL OR iv_weight < 0 OR iv_distance < 0.
RAISE invalid_weight.
ENDIF.
ENDFUNCTION.

View File

@@ -0,0 +1,45 @@
# 1. Goal
Calculate the price of a same-day delivery for a courier company. The dispatch
program calls one event module for each delivery order. The event module must
have the same interface as the sample event module, because the dispatch program
calls all event modules in the same way.
# 2. Open questions
None.
# 3. Context
- Function group {{P}}FG_DLV exists in package $TMP.
- Function module {{P}}DLV_SAMPLE exists in this group. It is the sample event
module. Its interface is the interface that all event modules must use. Read
the interface of {{P}}DLV_SAMPLE before you start.
# 4. Contract
- Create the function module {{P}}DLV_PRICE in function group {{P}}FG_DLV.
- Use exactly the interface of {{P}}DLV_SAMPLE: the same parameter names, kinds,
types, and exceptions.
# 5. Business rules
1. If the weight is less than or equal to 0, raise the exception INVALID_WEIGHT.
2. If the distance is more than 300 km, the delivery is out of the service area.
Set the skip flag to true. Do not change the price. Stop here. Do not apply
rules 3 to 8.
3. Set the skip flag to false.
4. Service EX (express): the price is 12.00 plus 0.60 for each km plus 1.50 for
each kg.
5. Service ST (standard): the price is 5.00 plus 0.30 for each km plus 0.80 for
each kg.
6. Any other service: set the skip flag to true and set the price to 0. Do not
apply rules 7 and 8.
7. Round the price half up to 2 decimals.
8. The minimum price is 6.00.
# 6. Constraints
- Release target: ABAP Platform 2025 (SAP_BASIS 816).
- Coding standards: Clean ABAP. Methods below 40 statements. No ATC priority 1
or 2 findings.
- Out of scope: do not change {{P}}DLV_SAMPLE.
# 7. Acceptance
- The function module {{P}}DLV_PRICE is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests for the function module in a global test class.

View File

@@ -0,0 +1,84 @@
{
"id": "G1085",
"category": "F",
"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_DLV",
"description": "Delivery fee events"
},
{
"type": "FUNC",
"name": "{{P}}DLV_SAMPLE",
"functionGroup": "{{P}}FG_DLV",
"file": "seed/dlv_sample.func.abap",
"description": "Sample delivery event module"
}
],
"contract": [
{
"type": "FUNC",
"name": "{{P}}DLV_PRICE",
"functionGroup": "{{P}}FG_DLV",
"params": [
{
"name": "iv_service",
"type": "string"
},
{
"name": "iv_weight",
"type": "decfloat34"
},
{
"name": "iv_distance",
"type": "decfloat34"
},
{
"name": "ev_skip",
"type": "abap_bool"
},
{
"name": "cv_price",
"type": "decfloat34"
}
]
}
],
"out_of_scope": [
"{{P}}DLV_SAMPLE"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T14_HIDDEN",
"file": "hidden/t14_hidden.clas.abap",
"description": "T14 hidden tests"
}
],
"reference": [
{
"type": "FUNC",
"name": "{{P}}DLV_PRICE",
"functionGroup": "{{P}}FG_DLV",
"file": "reference/dlv_price.func.abap",
"description": "Delivery price event module"
},
{
"type": "CLAS",
"name": "{{P}}T14_TEST",
"file": "reference/t14_test.clas.abap",
"description": "T14 own tests"
}
],
"craft_checks": [
"method_length"
]
}