Fix coverage with several contract classes; table annotation and file path checks; clean task dir on write

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 08:44:35 +02:00
parent fb576b0954
commit 03ab36149e
388 changed files with 28620 additions and 339 deletions

View File

@@ -0,0 +1,100 @@
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
CONSTANTS:
BEGIN OF c_rate,
class_1 TYPE decfloat34 VALUE '0.10',
class_2 TYPE decfloat34 VALUE '0.14',
class_3 TYPE decfloat34 VALUE '0.18',
class_4 TYPE decfloat34 VALUE '0.22',
END OF c_rate.
CONSTANTS:
BEGIN OF c_surcharge,
axles_2 TYPE decfloat34 VALUE '0',
axles_3 TYPE decfloat34 VALUE '5',
axles_4 TYPE decfloat34 VALUE '10',
axles_5 TYPE decfloat34 VALUE '15',
END OF c_surcharge.
METHODS check_input
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RAISING cx_abap_invalid_value.
METHODS base_rate
IMPORTING iv_weight_class TYPE i
RETURNING VALUE(rv_rate) TYPE decfloat34.
METHODS surcharge
IMPORTING iv_axles TYPE i
RETURNING VALUE(rv_percent) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}toll_calc IMPLEMENTATION.
METHOD calculate.
check_input(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
lv_amount = lv_amount * ( c_percent - surcharge( iv_axles ) ) / c_percent.
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
IF rv_fee < c_min_fee.
rv_fee = c_min_fee.
ENDIF.
ENDMETHOD.
METHOD check_input.
IF iv_distance_km < 0.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_weight_class < 1 OR iv_weight_class > 4.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_axles < 2 OR iv_axles > 5.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
ENDMETHOD.
METHOD base_rate.
CASE iv_weight_class.
WHEN 1.
rv_rate = c_rate-class_1.
WHEN 2.
rv_rate = c_rate-class_2.
WHEN 3.
rv_rate = c_rate-class_3.
WHEN 4.
rv_rate = c_rate-class_4.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD surcharge.
CASE iv_axles.
WHEN 2.
rv_percent = c_surcharge-axles_2.
WHEN 3.
rv_percent = c_surcharge-axles_3.
WHEN 4.
rv_percent = c_surcharge-axles_4.
WHEN 5.
rv_percent = c_surcharge-axles_5.
WHEN OTHERS.
rv_percent = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,100 @@
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
CONSTANTS:
BEGIN OF c_rate,
class_1 TYPE decfloat34 VALUE '0.10',
class_2 TYPE decfloat34 VALUE '0.14',
class_3 TYPE decfloat34 VALUE '0.18',
class_4 TYPE decfloat34 VALUE '0.22',
END OF c_rate.
CONSTANTS:
BEGIN OF c_surcharge,
axles_2 TYPE decfloat34 VALUE '0',
axles_3 TYPE decfloat34 VALUE '5',
axles_4 TYPE decfloat34 VALUE '10',
axles_5 TYPE decfloat34 VALUE '15',
END OF c_surcharge.
METHODS check_input
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RAISING cx_abap_invalid_value.
METHODS base_rate
IMPORTING iv_weight_class TYPE i
RETURNING VALUE(rv_rate) TYPE decfloat34.
METHODS surcharge
IMPORTING iv_axles TYPE i
RETURNING VALUE(rv_percent) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}toll_calc IMPLEMENTATION.
METHOD calculate.
check_input(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
rv_fee = round( val = lv_amount dec = 3 mode = cl_abap_math=>round_half_up ).
IF rv_fee < c_min_fee.
rv_fee = c_min_fee.
ENDIF.
ENDMETHOD.
METHOD check_input.
IF iv_distance_km < 0.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_weight_class < 1 OR iv_weight_class > 4.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_axles < 2 OR iv_axles > 5.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
ENDMETHOD.
METHOD base_rate.
CASE iv_weight_class.
WHEN 1.
rv_rate = c_rate-class_1.
WHEN 2.
rv_rate = c_rate-class_2.
WHEN 3.
rv_rate = c_rate-class_3.
WHEN 4.
rv_rate = c_rate-class_4.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD surcharge.
CASE iv_axles.
WHEN 2.
rv_percent = c_surcharge-axles_2.
WHEN 3.
rv_percent = c_surcharge-axles_3.
WHEN 4.
rv_percent = c_surcharge-axles_4.
WHEN 5.
rv_percent = c_surcharge-axles_5.
WHEN OTHERS.
rv_percent = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,100 @@
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
CONSTANTS:
BEGIN OF c_rate,
class_1 TYPE decfloat34 VALUE '0.10',
class_2 TYPE decfloat34 VALUE '0.14',
class_3 TYPE decfloat34 VALUE '0.18',
class_4 TYPE decfloat34 VALUE '0.22',
END OF c_rate.
CONSTANTS:
BEGIN OF c_surcharge,
axles_2 TYPE decfloat34 VALUE '0',
axles_3 TYPE decfloat34 VALUE '5',
axles_4 TYPE decfloat34 VALUE '10',
axles_5 TYPE decfloat34 VALUE '15',
END OF c_surcharge.
METHODS check_input
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RAISING cx_abap_invalid_value.
METHODS base_rate
IMPORTING iv_weight_class TYPE i
RETURNING VALUE(rv_rate) TYPE decfloat34.
METHODS surcharge
IMPORTING iv_axles TYPE i
RETURNING VALUE(rv_percent) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}toll_calc IMPLEMENTATION.
METHOD calculate.
check_input(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
IF rv_fee >= c_min_fee.
rv_fee = c_min_fee.
ENDIF.
ENDMETHOD.
METHOD check_input.
IF iv_distance_km < 0.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_weight_class < 1 OR iv_weight_class > 4.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_axles < 2 OR iv_axles > 5.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
ENDMETHOD.
METHOD base_rate.
CASE iv_weight_class.
WHEN 1.
rv_rate = c_rate-class_1.
WHEN 2.
rv_rate = c_rate-class_2.
WHEN 3.
rv_rate = c_rate-class_3.
WHEN 4.
rv_rate = c_rate-class_4.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD surcharge.
CASE iv_axles.
WHEN 2.
rv_percent = c_surcharge-axles_2.
WHEN 3.
rv_percent = c_surcharge-axles_3.
WHEN 4.
rv_percent = c_surcharge-axles_4.
WHEN 5.
rv_percent = c_surcharge-axles_5.
WHEN OTHERS.
rv_percent = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,100 @@
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
CONSTANTS:
BEGIN OF c_rate,
class_1 TYPE decfloat34 VALUE '0.10',
class_2 TYPE decfloat34 VALUE '0.14',
class_3 TYPE decfloat34 VALUE '0.18',
class_4 TYPE decfloat34 VALUE '0.22',
END OF c_rate.
CONSTANTS:
BEGIN OF c_surcharge,
axles_2 TYPE decfloat34 VALUE '0',
axles_3 TYPE decfloat34 VALUE '5',
axles_4 TYPE decfloat34 VALUE '10',
axles_5 TYPE decfloat34 VALUE '15',
END OF c_surcharge.
METHODS check_input
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RAISING cx_abap_invalid_value.
METHODS base_rate
IMPORTING iv_weight_class TYPE i
RETURNING VALUE(rv_rate) TYPE decfloat34.
METHODS surcharge
IMPORTING iv_axles TYPE i
RETURNING VALUE(rv_percent) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}toll_calc IMPLEMENTATION.
METHOD calculate.
check_input(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
IF rv_fee < c_min_fee.
rv_fee = c_min_fee.
ENDIF.
ENDMETHOD.
METHOD check_input.
IF iv_distance_km < 0.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_weight_class < 2 OR iv_weight_class > 4.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_axles < 2 OR iv_axles > 5.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
ENDMETHOD.
METHOD base_rate.
CASE iv_weight_class.
WHEN 1.
rv_rate = c_rate-class_1.
WHEN 2.
rv_rate = c_rate-class_2.
WHEN 3.
rv_rate = c_rate-class_3.
WHEN 4.
rv_rate = c_rate-class_4.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD surcharge.
CASE iv_axles.
WHEN 2.
rv_percent = c_surcharge-axles_2.
WHEN 3.
rv_percent = c_surcharge-axles_3.
WHEN 4.
rv_percent = c_surcharge-axles_4.
WHEN 5.
rv_percent = c_surcharge-axles_5.
WHEN OTHERS.
rv_percent = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,100 @@
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
CONSTANTS:
BEGIN OF c_rate,
class_1 TYPE decfloat34 VALUE '0.10',
class_2 TYPE decfloat34 VALUE '0.14',
class_3 TYPE decfloat34 VALUE '0.18',
class_4 TYPE decfloat34 VALUE '0.22',
END OF c_rate.
CONSTANTS:
BEGIN OF c_surcharge,
axles_2 TYPE decfloat34 VALUE '0',
axles_3 TYPE decfloat34 VALUE '5',
axles_4 TYPE decfloat34 VALUE '10',
axles_5 TYPE decfloat34 VALUE '15',
END OF c_surcharge.
METHODS check_input
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RAISING cx_abap_invalid_value.
METHODS base_rate
IMPORTING iv_weight_class TYPE i
RETURNING VALUE(rv_rate) TYPE decfloat34.
METHODS surcharge
IMPORTING iv_axles TYPE i
RETURNING VALUE(rv_percent) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}toll_calc IMPLEMENTATION.
METHOD calculate.
check_input(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
IF rv_fee < c_min_fee.
rv_fee = c_min_fee.
ENDIF.
ENDMETHOD.
METHOD check_input.
IF iv_distance_km < 0.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_weight_class < 1 AND iv_weight_class > 4.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_axles < 2 OR iv_axles > 5.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
ENDMETHOD.
METHOD base_rate.
CASE iv_weight_class.
WHEN 1.
rv_rate = c_rate-class_1.
WHEN 2.
rv_rate = c_rate-class_2.
WHEN 3.
rv_rate = c_rate-class_3.
WHEN 4.
rv_rate = c_rate-class_4.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD surcharge.
CASE iv_axles.
WHEN 2.
rv_percent = c_surcharge-axles_2.
WHEN 3.
rv_percent = c_surcharge-axles_3.
WHEN 4.
rv_percent = c_surcharge-axles_4.
WHEN 5.
rv_percent = c_surcharge-axles_5.
WHEN OTHERS.
rv_percent = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,33 @@
{
"id": "G0105",
"pool": "eval",
"object_type": "FUNC",
"category": "A",
"attempts": [
{
"stage": "validate",
"oracle": 0,
"null": 0
},
{
"stage": "bundle",
"errors": [
"reference/toll_calc.testclasses.abap line 63: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\""
],
"by_check": {
"abaplint": 1
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,140 @@
CLASS {{p}}t14_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS fee_for
IMPORTING iv_km TYPE decfloat34
iv_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34.
METHODS is_rejected
IMPORTING iv_km TYPE decfloat34
iv_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_rejected) TYPE abap_bool.
METHODS fee_two_axles FOR TESTING.
METHODS fee_three_axles FOR TESTING.
METHODS fee_four_axles FOR TESTING.
METHODS fee_five_axles FOR TESTING.
METHODS rounding_half_up FOR TESTING.
METHODS minimum_fee FOR TESTING.
METHODS rejects_negative_km FOR TESTING.
METHODS rejects_bad_class FOR TESTING.
METHODS rejects_bad_axles FOR TESTING.
METHODS func_returns_fee FOR TESTING.
METHODS func_rejects_input FOR TESTING.
ENDCLASS.
CLASS {{p}}t14_hidden IMPLEMENTATION.
METHOD fee_for.
TRY.
rv_fee = NEW {{p}}toll_calc( )->calculate(
iv_distance_km = iv_km
iv_weight_class = iv_class
iv_axles = iv_axles ).
CATCH cx_abap_invalid_value.
rv_fee = -1.
ENDTRY.
ENDMETHOD.
METHOD is_rejected.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = iv_km iv_class = iv_class iv_axles = iv_axles ).
rv_rejected = boolc( lv_fee < 0 ).
ENDMETHOD.
METHOD fee_two_axles.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 100 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '10.00' ) act = lv_fee ).
ENDMETHOD.
METHOD fee_three_axles.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 100 iv_class = 2 iv_axles = 3 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '14.70' ) act = lv_fee ).
ENDMETHOD.
METHOD fee_four_axles.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 100 iv_class = 3 iv_axles = 4 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '19.80' ) act = lv_fee ).
ENDMETHOD.
METHOD fee_five_axles.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 100 iv_class = 4 iv_axles = 5 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '25.30' ) act = lv_fee ).
ENDMETHOD.
METHOD rounding_half_up.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 25 iv_class = 1 iv_axles = 3 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '2.63' ) act = lv_fee ).
ENDMETHOD.
METHOD minimum_fee.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 5 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ).
lv_fee = fee_for( iv_km = 0 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ).
ENDMETHOD.
METHOD rejects_negative_km.
DATA lv_rejected TYPE abap_bool.
lv_rejected = is_rejected( iv_km = -1 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
ENDMETHOD.
METHOD rejects_bad_class.
DATA lv_rejected TYPE abap_bool.
lv_rejected = is_rejected( iv_km = 100 iv_class = 0 iv_axles = 2 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
lv_rejected = is_rejected( iv_km = 100 iv_class = 5 iv_axles = 2 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
ENDMETHOD.
METHOD rejects_bad_axles.
DATA lv_rejected TYPE abap_bool.
lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 1 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 6 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
ENDMETHOD.
METHOD func_returns_fee.
DATA lv_fee TYPE decfloat34.
CALL FUNCTION '{{P}}TOLL_FEE'
EXPORTING
iv_distance_km = 100
iv_weight_class = 3
iv_axles = 4
IMPORTING
ev_fee = lv_fee
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '19.80' ) act = lv_fee ).
ENDMETHOD.
METHOD func_rejects_input.
DATA lv_fee TYPE decfloat34.
CALL FUNCTION '{{P}}TOLL_FEE'
EXPORTING
iv_distance_km = -1
iv_weight_class = 1
iv_axles = 2
IMPORTING
ev_fee = lv_fee
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ).
cl_abap_unit_assert=>assert_initial( act = lv_fee ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,66 @@
{
"task": "G0105",
"mutants": [
{
"object": "{{P}}TOLL_CALC",
"mutant": "line 50: + -> - (arith)",
"status": "killed",
"hidden": "6/11",
"failed_tests": [
"FEE_FIVE_AXLES",
"FEE_FOUR_AXLES",
"FEE_THREE_AXLES",
"FUNC_RETURNS_FEE",
"ROUNDING_HALF_UP"
]
},
{
"object": "{{P}}TOLL_CALC",
"mutant": "line 51: 2 -> 3 (const)",
"status": "killed",
"hidden": "10/11",
"failed_tests": [
"ROUNDING_HALF_UP"
]
},
{
"object": "{{P}}TOLL_CALC",
"mutant": "line 53: < -> >= (rel)",
"status": "killed",
"hidden": "4/11",
"failed_tests": [
"FEE_FIVE_AXLES",
"FEE_FOUR_AXLES",
"FEE_THREE_AXLES",
"FEE_TWO_AXLES",
"FUNC_RETURNS_FEE",
"MINIMUM_FEE",
"ROUNDING_HALF_UP"
]
},
{
"object": "{{P}}TOLL_CALC",
"mutant": "line 62: 1 -> 2 (const)",
"status": "killed",
"hidden": "8/11",
"failed_tests": [
"FEE_TWO_AXLES",
"MINIMUM_FEE",
"ROUNDING_HALF_UP"
]
},
{
"object": "{{P}}TOLL_CALC",
"mutant": "line 62: OR -> AND (logic)",
"status": "killed",
"hidden": "10/11",
"failed_tests": [
"REJECTS_BAD_CLASS"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,62 @@
CLASS {{p}}t14_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS call_fee
IMPORTING iv_km TYPE decfloat34
iv_class TYPE i
iv_axles TYPE i
EXPORTING ev_fee TYPE decfloat34
ev_subrc TYPE sysubrc.
METHODS returns_fee FOR TESTING.
METHODS rejects_input FOR TESTING.
ENDCLASS.
CLASS {{p}}t14_test IMPLEMENTATION.
METHOD call_fee.
CALL FUNCTION '{{P}}TOLL_FEE'
EXPORTING
iv_distance_km = iv_km
iv_weight_class = iv_class
iv_axles = iv_axles
IMPORTING
ev_fee = ev_fee
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
ev_subrc = sy-subrc.
ENDMETHOD.
METHOD returns_fee.
DATA lv_fee TYPE decfloat34.
DATA lv_rc TYPE sysubrc.
call_fee(
EXPORTING
iv_km = 100
iv_class = 2
iv_axles = 3
IMPORTING
ev_fee = lv_fee
ev_subrc = lv_rc ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rc ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '14.70' ) act = lv_fee ).
ENDMETHOD.
METHOD rejects_input.
DATA lv_fee TYPE decfloat34.
DATA lv_rc TYPE sysubrc.
call_fee(
EXPORTING
iv_km = -1
iv_class = 1
iv_axles = 2
IMPORTING
ev_fee = lv_fee
ev_subrc = lv_rc ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ).
cl_abap_unit_assert=>assert_initial( act = lv_fee ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,100 @@
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
CONSTANTS:
BEGIN OF c_rate,
class_1 TYPE decfloat34 VALUE '0.10',
class_2 TYPE decfloat34 VALUE '0.14',
class_3 TYPE decfloat34 VALUE '0.18',
class_4 TYPE decfloat34 VALUE '0.22',
END OF c_rate.
CONSTANTS:
BEGIN OF c_surcharge,
axles_2 TYPE decfloat34 VALUE '0',
axles_3 TYPE decfloat34 VALUE '5',
axles_4 TYPE decfloat34 VALUE '10',
axles_5 TYPE decfloat34 VALUE '15',
END OF c_surcharge.
METHODS check_input
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RAISING cx_abap_invalid_value.
METHODS base_rate
IMPORTING iv_weight_class TYPE i
RETURNING VALUE(rv_rate) TYPE decfloat34.
METHODS surcharge
IMPORTING iv_axles TYPE i
RETURNING VALUE(rv_percent) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}toll_calc IMPLEMENTATION.
METHOD calculate.
check_input(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
IF rv_fee < c_min_fee.
rv_fee = c_min_fee.
ENDIF.
ENDMETHOD.
METHOD check_input.
IF iv_distance_km < 0.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_weight_class < 1 OR iv_weight_class > 4.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
IF iv_axles < 2 OR iv_axles > 5.
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
ENDIF.
ENDMETHOD.
METHOD base_rate.
CASE iv_weight_class.
WHEN 1.
rv_rate = c_rate-class_1.
WHEN 2.
rv_rate = c_rate-class_2.
WHEN 3.
rv_rate = c_rate-class_3.
WHEN 4.
rv_rate = c_rate-class_4.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD surcharge.
CASE iv_axles.
WHEN 2.
rv_percent = c_surcharge-axles_2.
WHEN 3.
rv_percent = c_surcharge-axles_3.
WHEN 4.
rv_percent = c_surcharge-axles_4.
WHEN 5.
rv_percent = c_surcharge-axles_5.
WHEN OTHERS.
rv_percent = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,65 @@
CLASS ltc_toll_calc DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS fee_for
IMPORTING iv_km TYPE decfloat34
iv_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34.
METHODS is_rejected
IMPORTING iv_km TYPE decfloat34
iv_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_rejected) TYPE abap_bool.
METHODS rate_and_surcharge FOR TESTING.
METHODS minimum_fee FOR TESTING.
METHODS rejects_invalid FOR TESTING.
ENDCLASS.
CLASS ltc_toll_calc IMPLEMENTATION.
METHOD fee_for.
TRY.
rv_fee = NEW {{p}}toll_calc( )->calculate(
iv_distance_km = iv_km
iv_weight_class = iv_class
iv_axles = iv_axles ).
CATCH cx_abap_invalid_value.
rv_fee = -1.
ENDTRY.
ENDMETHOD.
METHOD is_rejected.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = iv_km iv_class = iv_class iv_axles = iv_axles ).
rv_rejected = boolc( lv_fee < 0 ).
ENDMETHOD.
METHOD rate_and_surcharge.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 100 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '10.00' ) act = lv_fee ).
lv_fee = fee_for( iv_km = 100 iv_class = 4 iv_axles = 5 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '25.30' ) act = lv_fee ).
ENDMETHOD.
METHOD minimum_fee.
DATA lv_fee TYPE decfloat34.
lv_fee = fee_for( iv_km = 1 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ).
ENDMETHOD.
METHOD rejects_invalid.
DATA lv_rejected TYPE abap_bool.
lv_rejected = is_rejected( iv_km = -1 iv_class = 1 iv_axles = 2 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
lv_rejected = is_rejected( iv_km = 100 iv_class = 5 iv_axles = 2 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 6 ).
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,20 @@
FUNCTION {{p}}toll_fee
IMPORTING
iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
EXPORTING
ev_fee TYPE decfloat34
EXCEPTIONS
invalid_input.
TRY.
ev_fee = NEW {{p}}toll_calc( )->calculate(
iv_distance_km = iv_distance_km
iv_weight_class = iv_weight_class
iv_axles = iv_axles ).
CATCH cx_abap_invalid_value.
RAISE invalid_input.
ENDTRY.
ENDFUNCTION.

View File

@@ -0,0 +1,86 @@
# 1. Goal
A toll operator charges a fee for each truck trip on its road network. The trip
log program calls one function module for each trip. The call happens before
the program stores the trip. The fee depends only on the trip data that the
caller passes.
# 2. Open questions
None.
# 3. Context
- Function group {{P}}FG_TOLL exists in package $TMP.
- All objects of this task are in package $TMP.
- The trip log program is not part of this task.
# 4. Contract
## 4.1 Function module {{P}}TOLL_FEE
Create the function module {{P}}TOLL_FEE in function group {{P}}FG_TOLL.
The interface is exactly:
IMPORTING
iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
EXPORTING
ev_fee TYPE decfloat34
EXCEPTIONS
invalid_input
## 4.2 Class {{P}}TOLL_CALC
Create the global class {{P}}TOLL_CALC in package $TMP. The class is public and
final. The class has a public instance constructor without parameters.
The class has this public method:
METHODS calculate
IMPORTING iv_distance_km TYPE decfloat34
iv_weight_class TYPE i
iv_axles TYPE i
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
# 5. Business rules
1. The distance is the length of the trip in kilometres. A distance below 0
is invalid input.
2. The weight class is 1, 2, 3, or 4. Every other value is invalid input.
3. The number of axles is 2, 3, 4, or 5. Every other value is invalid input.
4. Invalid input raises the exception INVALID_INPUT in {{P}}TOLL_FEE and the
exception CX_ABAP_INVALID_VALUE in {{P}}TOLL_CALC. {{P}}TOLL_FEE does not
set the fee in this case.
5. The base rate per kilometre depends on the weight class:
- Weight class 1: 0.10
- Weight class 2: 0.14
- Weight class 3: 0.18
- Weight class 4: 0.22
6. The number of axles adds a surcharge to the base amount:
- 2 axles: 0 %
- 3 axles: 5 %
- 4 axles: 10 %
- 5 axles: 15 %
7. The base amount is the distance multiplied by the base rate. The fee is the
base amount increased by the surcharge percentage. Round the fee half up to
2 decimals.
8. The minimum fee is 1.00. If the fee from rule 7 is below 1.00, the fee is
1.00.
9. {{P}}TOLL_FEE returns the fee that {{P}}TOLL_CALC calculates.
# 6. Constraints
- Release target: 7.58.
- The calculation is pure logic. It reads no database table and no other
external data.
- Out of scope: the trip log program and every object that is not in the
contract.
# 7. Acceptance
- {{P}}TOLL_FEE and {{P}}TOLL_CALC are active and have no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests. Put local test classes in {{P}}TOLL_CALC. Write a
global test class for {{P}}TOLL_FEE.

View File

@@ -0,0 +1,82 @@
{
"id": "G0105",
"category": "A",
"object_type": "FUNC",
"difficulty": 2,
"release_target": "v758",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [
{
"type": "FUGR",
"name": "{{P}}FG_TOLL",
"description": "Toll fee function group"
}
],
"contract": [
{
"type": "FUNC",
"name": "{{P}}TOLL_FEE",
"functionGroup": "{{P}}FG_TOLL",
"params": [
{
"name": "iv_distance_km",
"type": "decfloat34"
},
{
"name": "iv_weight_class",
"type": "i"
},
{
"name": "iv_axles",
"type": "i"
},
{
"name": "ev_fee",
"type": "decfloat34"
}
]
},
{
"type": "CLAS",
"name": "{{P}}TOLL_CALC"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T14_HIDDEN",
"file": "hidden/t14_hidden.clas.abap",
"description": "T14 hidden tests"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}TOLL_CALC",
"file": "reference/toll_calc.clas.abap",
"testclasses_file": "reference/toll_calc.testclasses.abap",
"description": "Toll fee calculation"
},
{
"type": "FUNC",
"name": "{{P}}TOLL_FEE",
"functionGroup": "{{P}}FG_TOLL",
"file": "reference/toll_fee.func.abap",
"description": "Toll fee function module"
},
{
"type": "CLAS",
"name": "{{P}}T14_TEST",
"file": "reference/t14_test.clas.abap",
"description": "T14 own tests"
}
],
"craft_checks": [
"method_length"
]
}