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,54 @@
CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34
RAISING
cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'.
CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'.
CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'.
ENDCLASS.
CLASS {{p}}glaz_calc IMPLEMENTATION.
METHOD calculate.
IF iv_width_mm <= 0 AND iv_height_mm <= 0.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
DATA lv_rate TYPE decfloat34.
CASE iv_glass.
WHEN 'SIMPLE'.
lv_rate = 45.
WHEN 'SAFETY'.
lv_rate = 90.
WHEN 'INSULATED'.
lv_rate = 140.
WHEN OTHERS.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDCASE.
DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor.
DATA(lv_fee) = lv_area * lv_rate.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
IF iv_urgent = abap_true.
lv_fee = lv_fee * c_urgent_factor.
ENDIF.
IF lv_fee > c_max_fee.
lv_fee = c_max_fee.
ENDIF.
rv_fee = round( val = lv_fee dec = 2 mode = cl_abap_math=>round_half_up ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,54 @@
CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34
RAISING
cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'.
CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'.
CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'.
ENDCLASS.
CLASS {{p}}glaz_calc IMPLEMENTATION.
METHOD calculate.
IF iv_width_mm <= 0 OR iv_height_mm <= 0.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
DATA lv_rate TYPE decfloat34.
CASE iv_glass.
WHEN 'SIMPLE'.
lv_rate = 45.
WHEN 'SAFETY'.
lv_rate = 90.
WHEN 'INSULATED'.
lv_rate = 140.
WHEN OTHERS.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDCASE.
DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor.
DATA(lv_fee) = lv_area * lv_rate.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
IF iv_urgent = abap_false.
lv_fee = lv_fee * c_urgent_factor.
ENDIF.
IF lv_fee > c_max_fee.
lv_fee = c_max_fee.
ENDIF.
rv_fee = round( val = lv_fee dec = 2 mode = cl_abap_math=>round_half_up ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,54 @@
CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34
RAISING
cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'.
CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'.
CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'.
ENDCLASS.
CLASS {{p}}glaz_calc IMPLEMENTATION.
METHOD calculate.
IF iv_width_mm <= 0 OR iv_height_mm <= 0.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
DATA lv_rate TYPE decfloat34.
CASE iv_glass.
WHEN 'SIMPLE'.
lv_rate = 45.
WHEN 'SAFETY'.
lv_rate = 90.
WHEN 'INSULATED'.
lv_rate = 140.
WHEN OTHERS.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDCASE.
DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor.
DATA(lv_fee) = lv_area * lv_rate.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
IF iv_urgent = abap_true.
lv_fee = lv_fee / c_urgent_factor.
ENDIF.
IF lv_fee > c_max_fee.
lv_fee = c_max_fee.
ENDIF.
rv_fee = round( val = lv_fee dec = 2 mode = cl_abap_math=>round_half_up ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,54 @@
CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34
RAISING
cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'.
CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'.
CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'.
ENDCLASS.
CLASS {{p}}glaz_calc IMPLEMENTATION.
METHOD calculate.
IF iv_width_mm <= 0 OR iv_height_mm <= 0.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
DATA lv_rate TYPE decfloat34.
CASE iv_glass.
WHEN 'SIMPLE'.
lv_rate = 45.
WHEN 'SAFETY'.
lv_rate = 90.
WHEN 'INSULATED'.
lv_rate = 140.
WHEN OTHERS.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDCASE.
DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor.
DATA(lv_fee) = lv_area * lv_rate.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
IF iv_urgent = abap_true.
lv_fee = lv_fee * c_urgent_factor.
ENDIF.
IF lv_fee <= c_max_fee.
lv_fee = c_max_fee.
ENDIF.
rv_fee = round( val = lv_fee dec = 2 mode = cl_abap_math=>round_half_up ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,54 @@
CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34
RAISING
cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'.
CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'.
CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'.
ENDCLASS.
CLASS {{p}}glaz_calc IMPLEMENTATION.
METHOD calculate.
IF iv_width_mm <= 0 OR iv_height_mm <= 0.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
DATA lv_rate TYPE decfloat34.
CASE iv_glass.
WHEN 'SIMPLE'.
lv_rate = 45.
WHEN 'SAFETY'.
lv_rate = 90.
WHEN 'INSULATED'.
lv_rate = 140.
WHEN OTHERS.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDCASE.
DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor.
DATA(lv_fee) = lv_area * lv_rate.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
IF iv_urgent = abap_true.
lv_fee = lv_fee * c_urgent_factor.
ENDIF.
IF lv_fee > c_max_fee.
lv_fee = c_max_fee.
ENDIF.
rv_fee = round( val = lv_fee dec = 3 mode = cl_abap_math=>round_half_up ).
ENDMETHOD.
ENDCLASS.

View File

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

View File

@@ -0,0 +1,129 @@
CLASS {{p}}t31_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS call
IMPORTING
iv_width TYPE i
iv_height TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool DEFAULT abap_false
EXPORTING
ev_fee TYPE decfloat34
ev_subrc TYPE sysubrc.
METHODS simple_pane_fee FOR TESTING.
METHODS minimum_fee FOR TESTING.
METHODS safety_pane_fee FOR TESTING.
METHODS insulated_pane_fee FOR TESTING.
METHODS rounding_half_up FOR TESTING.
METHODS urgent_surcharge FOR TESTING.
METHODS urgent_after_minimum FOR TESTING.
METHODS maximum_fee FOR TESTING.
METHODS invalid_size_rejected FOR TESTING.
METHODS invalid_glass_rejected FOR TESTING.
METHODS class_calculates_fee FOR TESTING.
METHODS class_rejects_bad_size FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_hidden IMPLEMENTATION.
METHOD call.
CALL FUNCTION '{{P}}GLAZ_FEE'
EXPORTING
iv_width_mm = iv_width
iv_height_mm = iv_height
iv_glass = iv_glass
iv_urgent = iv_urgent
IMPORTING
ev_fee = ev_fee
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
ev_subrc = sy-subrc.
ENDMETHOD.
METHOD simple_pane_fee.
call( EXPORTING iv_width = 1000 iv_height = 1000 iv_glass = `SIMPLE`
IMPORTING ev_fee = DATA(lv_fee) ev_subrc = DATA(lv_rc) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rc ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '45.00' ) act = lv_fee ).
ENDMETHOD.
METHOD minimum_fee.
call( EXPORTING iv_width = 500 iv_height = 400 iv_glass = `SIMPLE`
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '35.00' ) act = lv_fee ).
ENDMETHOD.
METHOD safety_pane_fee.
call( EXPORTING iv_width = 1200 iv_height = 800 iv_glass = `SAFETY`
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '86.40' ) act = lv_fee ).
ENDMETHOD.
METHOD insulated_pane_fee.
call( EXPORTING iv_width = 2000 iv_height = 1500 iv_glass = `INSULATED`
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '420.00' ) act = lv_fee ).
ENDMETHOD.
METHOD rounding_half_up.
call( EXPORTING iv_width = 1000 iv_height = 1001 iv_glass = `SIMPLE`
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '45.05' ) act = lv_fee ).
ENDMETHOD.
METHOD urgent_surcharge.
call( EXPORTING iv_width = 1000 iv_height = 1000 iv_glass = `SIMPLE` iv_urgent = abap_true
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '67.50' ) act = lv_fee ).
ENDMETHOD.
METHOD urgent_after_minimum.
call( EXPORTING iv_width = 500 iv_height = 400 iv_glass = `SIMPLE` iv_urgent = abap_true
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '52.50' ) act = lv_fee ).
ENDMETHOD.
METHOD maximum_fee.
call( EXPORTING iv_width = 2000 iv_height = 1500 iv_glass = `INSULATED` iv_urgent = abap_true
IMPORTING ev_fee = DATA(lv_fee) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '480.00' ) act = lv_fee ).
ENDMETHOD.
METHOD invalid_size_rejected.
call( EXPORTING iv_width = 0 iv_height = 1000 iv_glass = `SIMPLE`
IMPORTING ev_subrc = DATA(lv_rc) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ).
call( EXPORTING iv_width = 1000 iv_height = -5 iv_glass = `SIMPLE`
IMPORTING ev_subrc = DATA(lv_rc2) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc2 ).
ENDMETHOD.
METHOD invalid_glass_rejected.
call( EXPORTING iv_width = 1000 iv_height = 1000 iv_glass = `TINTED`
IMPORTING ev_subrc = DATA(lv_rc) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ).
ENDMETHOD.
METHOD class_calculates_fee.
DATA(lo_calc) = NEW {{p}}glaz_calc( ).
TRY.
DATA(lv_fee) = lo_calc->calculate( iv_width_mm = 1200 iv_height_mm = 800
iv_glass = `SAFETY` iv_urgent = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '86.40' ) act = lv_fee ).
CATCH cx_abap_invalid_value.
cl_abap_unit_assert=>fail( msg = `valid input was rejected` ).
ENDTRY.
ENDMETHOD.
METHOD class_rejects_bad_size.
DATA(lo_calc) = NEW {{p}}glaz_calc( ).
TRY.
lo_calc->calculate( iv_width_mm = 1000 iv_height_mm = 0
iv_glass = `SIMPLE` iv_urgent = abap_false ).
cl_abap_unit_assert=>fail( msg = `invalid size was accepted` ).
CATCH cx_abap_invalid_value.
cl_abap_unit_assert=>assert_true( abap_true ).
ENDTRY.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,73 @@
{
"task": "G1083",
"mutants": [
{
"object": "{{P}}GLAZ_CALC",
"mutant": "line 23: OR -> AND (logic)",
"status": "killed",
"hidden": "10/12",
"failed_tests": [
"CLASS_REJECTS_BAD_SIZE",
"INVALID_SIZE_REJECTED"
]
},
{
"object": "{{P}}GLAZ_CALC",
"mutant": "line 45: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "3/12",
"failed_tests": [
"CLASS_CALCULATES_FEE",
"INSULATED_PANE_FEE",
"MAXIMUM_FEE",
"MINIMUM_FEE",
"ROUNDING_HALF_UP",
"SAFETY_PANE_FEE",
"SIMPLE_PANE_FEE",
"URGENT_AFTER_MINIMUM",
"URGENT_SURCHARGE"
]
},
{
"object": "{{P}}GLAZ_CALC",
"mutant": "line 46: * -> / (arith)",
"status": "killed",
"hidden": "9/12",
"failed_tests": [
"MAXIMUM_FEE",
"URGENT_AFTER_MINIMUM",
"URGENT_SURCHARGE"
]
},
{
"object": "{{P}}GLAZ_CALC",
"mutant": "line 48: > -> <= (rel)",
"status": "killed",
"hidden": "3/12",
"failed_tests": [
"CLASS_CALCULATES_FEE",
"INSULATED_PANE_FEE",
"MAXIMUM_FEE",
"MINIMUM_FEE",
"ROUNDING_HALF_UP",
"SAFETY_PANE_FEE",
"SIMPLE_PANE_FEE",
"URGENT_AFTER_MINIMUM",
"URGENT_SURCHARGE"
]
},
{
"object": "{{P}}GLAZ_CALC",
"mutant": "line 52: 2 -> 3 (const)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"ROUNDING_HALF_UP"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,54 @@
CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34
RAISING
cx_abap_invalid_value.
PRIVATE SECTION.
CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'.
CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'.
CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'.
CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'.
ENDCLASS.
CLASS {{p}}glaz_calc IMPLEMENTATION.
METHOD calculate.
IF iv_width_mm <= 0 OR iv_height_mm <= 0.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
DATA lv_rate TYPE decfloat34.
CASE iv_glass.
WHEN 'SIMPLE'.
lv_rate = 45.
WHEN 'SAFETY'.
lv_rate = 90.
WHEN 'INSULATED'.
lv_rate = 140.
WHEN OTHERS.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDCASE.
DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor.
DATA(lv_fee) = lv_area * lv_rate.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
IF iv_urgent = abap_true.
lv_fee = lv_fee * c_urgent_factor.
ENDIF.
IF lv_fee > c_max_fee.
lv_fee = c_max_fee.
ENDIF.
rv_fee = round( val = lv_fee dec = 2 mode = cl_abap_math=>round_half_up ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,73 @@
CLASS ltc_glaz_calc DEFINITION FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS fee_for
IMPORTING
iv_width TYPE i
iv_height TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING
VALUE(rv_fee) TYPE decfloat34.
METHODS simple_fee FOR TESTING.
METHODS minimum_fee FOR TESTING.
METHODS urgent_fee FOR TESTING.
METHODS invalid_size FOR TESTING.
METHODS invalid_glass FOR TESTING.
ENDCLASS.
CLASS ltc_glaz_calc IMPLEMENTATION.
METHOD fee_for.
DATA(lo_calc) = NEW {{p}}glaz_calc( ).
TRY.
rv_fee = lo_calc->calculate(
iv_width_mm = iv_width
iv_height_mm = iv_height
iv_glass = iv_glass
iv_urgent = iv_urgent ).
CATCH cx_abap_invalid_value.
cl_abap_unit_assert=>fail( msg = `unexpected invalid value` ).
ENDTRY.
ENDMETHOD.
METHOD simple_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '45.00' )
act = fee_for( iv_width = 1000 iv_height = 1000 iv_glass = `SIMPLE` iv_urgent = abap_false ) ).
ENDMETHOD.
METHOD minimum_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '35.00' )
act = fee_for( iv_width = 500 iv_height = 400 iv_glass = `SIMPLE` iv_urgent = abap_false ) ).
ENDMETHOD.
METHOD urgent_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '67.50' )
act = fee_for( iv_width = 1000 iv_height = 1000 iv_glass = `SIMPLE` iv_urgent = abap_true ) ).
ENDMETHOD.
METHOD invalid_size.
DATA(lo_calc) = NEW {{p}}glaz_calc( ).
TRY.
lo_calc->calculate( iv_width_mm = 0 iv_height_mm = 100
iv_glass = `SIMPLE` iv_urgent = abap_false ).
cl_abap_unit_assert=>fail( msg = `invalid size was accepted` ).
CATCH cx_abap_invalid_value.
cl_abap_unit_assert=>assert_true( abap_true ).
ENDTRY.
ENDMETHOD.
METHOD invalid_glass.
DATA(lo_calc) = NEW {{p}}glaz_calc( ).
TRY.
lo_calc->calculate( iv_width_mm = 100 iv_height_mm = 100
iv_glass = `TINTED` iv_urgent = abap_false ).
cl_abap_unit_assert=>fail( msg = `invalid glass type was accepted` ).
CATCH cx_abap_invalid_value.
cl_abap_unit_assert=>assert_true( abap_true ).
ENDTRY.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,25 @@
FUNCTION {{p}}glaz_fee
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
EXPORTING
ev_fee TYPE decfloat34
EXCEPTIONS
invalid_input.
DATA lo_calc TYPE REF TO {{p}}glaz_calc.
lo_calc = NEW #( ).
TRY.
ev_fee = lo_calc->calculate(
iv_width_mm = iv_width_mm
iv_height_mm = iv_height_mm
iv_glass = iv_glass
iv_urgent = iv_urgent ).
CATCH cx_abap_invalid_value.
RAISE invalid_input.
ENDTRY.
ENDFUNCTION.

View File

@@ -0,0 +1,68 @@
CLASS {{p}}t31_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS fee_for
IMPORTING
iv_width TYPE i
iv_height TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rv_fee) TYPE decfloat34.
METHODS simple_fee FOR TESTING.
METHODS minimum_fee FOR TESTING.
METHODS urgent_fee FOR TESTING.
METHODS invalid_input FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_test IMPLEMENTATION.
METHOD fee_for.
CALL FUNCTION '{{P}}GLAZ_FEE'
EXPORTING
iv_width_mm = iv_width
iv_height_mm = iv_height
iv_glass = iv_glass
iv_urgent = iv_urgent
IMPORTING
ev_fee = rv_fee
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
ENDMETHOD.
METHOD simple_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '45.00' )
act = fee_for( iv_width = 1000 iv_height = 1000 iv_glass = `SIMPLE` ) ).
ENDMETHOD.
METHOD minimum_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '35.00' )
act = fee_for( iv_width = 400 iv_height = 400 iv_glass = `SIMPLE` ) ).
ENDMETHOD.
METHOD urgent_fee.
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '67.50' )
act = fee_for( iv_width = 1000 iv_height = 1000 iv_glass = `SIMPLE` iv_urgent = abap_true ) ).
ENDMETHOD.
METHOD invalid_input.
DATA lv_fee TYPE decfloat34.
CALL FUNCTION '{{P}}GLAZ_FEE'
EXPORTING
iv_width_mm = 0
iv_height_mm = 1000
iv_glass = `SIMPLE`
iv_urgent = abap_false
IMPORTING
ev_fee = lv_fee
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,14 @@
FUNCTION {{p}}glaz_sample
IMPORTING
iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
EXPORTING
ev_fee TYPE decfloat34
EXCEPTIONS
invalid_input.
ev_fee = 0.
ENDFUNCTION.

View File

@@ -0,0 +1,74 @@
# 1. Goal
A glazier workshop replaces window panes. For each pane of a job, the quotation
program calls one function module. The function module returns the fee of the
pane. Other programs of the workshop reuse the same calculation, so the
calculation must also be available as a method of a new class.
# 2. Open questions
None.
# 3. Context
- Function group {{P}}FG_GLAZ is in package $TMP.
- Function module {{P}}GLAZ_SAMPLE is in this function group. It is the sample
module. All pane fee modules use the interface of the sample module.
- The quotation program calls {{P}}GLAZ_FEE for each pane of a job.
# 4. Contract
- Create the function module {{P}}GLAZ_FEE in function group {{P}}FG_GLAZ.
Use exactly the interface of {{P}}GLAZ_SAMPLE: the same parameter names, the
same parameter kinds, the same types and the same exceptions.
- Create the class {{P}}GLAZ_CALC in package $TMP. The class is public and
final. The class has a public constructor without parameters. The class has
this public method:
METHOD calculate
IMPORTING iv_width_mm TYPE i
iv_height_mm TYPE i
iv_glass TYPE string
iv_urgent TYPE abap_bool
RETURNING VALUE(rv_fee) TYPE decfloat34
RAISING cx_abap_invalid_value.
- For the same input, {{P}}GLAZ_FEE returns the same fee as the method
calculate.
# 5. Business rules
The input of the calculation is:
- iv_width_mm: the width of the pane in millimetres.
- iv_height_mm: the height of the pane in millimetres.
- iv_glass: the code of the glass type.
- iv_urgent: the urgent flag.
1. The width and the height must be greater than 0. If not, the input is
invalid.
2. The glass type code must be SIMPLE, SAFETY or INSULATED. If not, the input
is invalid.
3. The area of the pane in square metres is the width multiplied by the height
and divided by 1 000 000.
4. The price of one square metre is 45.00 for SIMPLE, 90.00 for SAFETY and
140.00 for INSULATED.
5. The fee is the area multiplied by the price of one square metre.
6. If the fee is less than 35.00, the fee is 35.00.
7. If iv_urgent is true, the fee is multiplied by 1.5.
8. If the fee is more than 480.00, the fee is 480.00.
9. Round the fee half up to 2 decimals. This is the last step.
10. For invalid input, the method calculate raises cx_abap_invalid_value and
{{P}}GLAZ_FEE raises the exception invalid_input.
# 6. Constraints
- Release target: SAP_BASIS 816 (ABAP Platform 2025).
- Coding standards: Clean ABAP. A method has fewer than 40 statements.
- Out of scope: do not change {{P}}GLAZ_SAMPLE.
# 7. Acceptance
- {{P}}GLAZ_FEE and {{P}}GLAZ_CALC are active and have no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests: local test classes for {{P}}GLAZ_CALC and a global
test class for {{P}}GLAZ_FEE.

View File

@@ -0,0 +1,96 @@
{
"id": "G1083",
"category": "A",
"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_GLAZ",
"description": "Pane fee modules"
},
{
"type": "FUNC",
"name": "{{P}}GLAZ_SAMPLE",
"functionGroup": "{{P}}FG_GLAZ",
"file": "seed/glaz_sample.func.abap",
"description": "Sample pane module with the interface that all pane fee modules use"
}
],
"contract": [
{
"type": "FUNC",
"name": "{{P}}GLAZ_FEE",
"functionGroup": "{{P}}FG_GLAZ",
"params": [
{
"name": "iv_width_mm",
"type": "i"
},
{
"name": "iv_height_mm",
"type": "i"
},
{
"name": "iv_glass",
"type": "string"
},
{
"name": "iv_urgent",
"type": "abap_bool"
},
{
"name": "ev_fee",
"type": "decfloat34"
}
]
},
{
"type": "CLAS",
"name": "{{P}}GLAZ_CALC",
"description": "Pane fee calculation with the public method calculate"
}
],
"out_of_scope": [
"{{P}}GLAZ_SAMPLE"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T31_HIDDEN",
"file": "hidden/t31_hidden.clas.abap",
"description": "T31 hidden tests"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}GLAZ_CALC",
"file": "reference/glaz_calc.clas.abap",
"testclasses_file": "reference/glaz_calc.clas.testclasses.abap",
"description": "Pane fee calculation"
},
{
"type": "FUNC",
"name": "{{P}}GLAZ_FEE",
"functionGroup": "{{P}}FG_GLAZ",
"file": "reference/glaz_fee.func.abap",
"description": "Pane fee module"
},
{
"type": "CLAS",
"name": "{{P}}T31_TEST",
"file": "reference/t31_test.clas.abap",
"description": "T31 own tests for the function module"
}
],
"craft_checks": [
"method_length"
]
}