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,96 @@
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_region TYPE c LENGTH 2,
ty_premium TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_premium
IMPORTING iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING VALUE(rv_premium) TYPE ty_premium.
PRIVATE SECTION.
METHODS get_base_premium
IMPORTING iv_region TYPE ty_region
RETURNING VALUE(rv_base) TYPE ty_premium.
METHODS get_age_factor
IMPORTING iv_age TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_power_factor
IMPORTING iv_power_kw TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_discount_factor
IMPORTING iv_claim_free_years TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}insurance_premium IMPLEMENTATION.
METHOD calculate_premium.
IF iv_age < 18 OR iv_age > 99
AND iv_power_kw <= 0
OR iv_claim_free_years < 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_base) = get_base_premium( iv_region ).
IF lv_base = 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_premium) = CONV decfloat34( lv_base )
* get_age_factor( iv_age )
* get_power_factor( iv_power_kw )
* get_discount_factor( iv_claim_free_years ).
rv_premium = lv_premium.
IF rv_premium < 100.
rv_premium = 100.
ENDIF.
ENDMETHOD.
METHOD get_base_premium.
CASE iv_region.
WHEN 'A1'.
rv_base = 150.
WHEN 'B2'.
rv_base = 200.
WHEN 'C3'.
rv_base = 250.
WHEN 'D4'.
rv_base = 300.
WHEN 'E5'.
rv_base = 350.
WHEN OTHERS.
rv_base = 0.
ENDCASE.
ENDMETHOD.
METHOD get_age_factor.
IF iv_age < 25.
rv_factor = '1.5'.
ELSEIF iv_age > 65.
rv_factor = '1.2'.
ELSE.
rv_factor = '1.0'.
ENDIF.
ENDMETHOD.
METHOD get_power_factor.
IF iv_power_kw <= 50.
rv_factor = '0.9'.
ELSEIF iv_power_kw <= 100.
rv_factor = '1.0'.
ELSEIF iv_power_kw <= 150.
rv_factor = '1.3'.
ELSE.
rv_factor = '1.6'.
ENDIF.
ENDMETHOD.
METHOD get_discount_factor.
DATA(lv_discount) = iv_claim_free_years * 5.
IF lv_discount > 30.
lv_discount = 30.
ENDIF.
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,96 @@
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_region TYPE c LENGTH 2,
ty_premium TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_premium
IMPORTING iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING VALUE(rv_premium) TYPE ty_premium.
PRIVATE SECTION.
METHODS get_base_premium
IMPORTING iv_region TYPE ty_region
RETURNING VALUE(rv_base) TYPE ty_premium.
METHODS get_age_factor
IMPORTING iv_age TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_power_factor
IMPORTING iv_power_kw TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_discount_factor
IMPORTING iv_claim_free_years TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}insurance_premium IMPLEMENTATION.
METHOD calculate_premium.
IF iv_age < 18 OR iv_age > 99
OR iv_power_kw <= 0
OR iv_claim_free_years >= 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_base) = get_base_premium( iv_region ).
IF lv_base = 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_premium) = CONV decfloat34( lv_base )
* get_age_factor( iv_age )
* get_power_factor( iv_power_kw )
* get_discount_factor( iv_claim_free_years ).
rv_premium = lv_premium.
IF rv_premium < 100.
rv_premium = 100.
ENDIF.
ENDMETHOD.
METHOD get_base_premium.
CASE iv_region.
WHEN 'A1'.
rv_base = 150.
WHEN 'B2'.
rv_base = 200.
WHEN 'C3'.
rv_base = 250.
WHEN 'D4'.
rv_base = 300.
WHEN 'E5'.
rv_base = 350.
WHEN OTHERS.
rv_base = 0.
ENDCASE.
ENDMETHOD.
METHOD get_age_factor.
IF iv_age < 25.
rv_factor = '1.5'.
ELSEIF iv_age > 65.
rv_factor = '1.2'.
ELSE.
rv_factor = '1.0'.
ENDIF.
ENDMETHOD.
METHOD get_power_factor.
IF iv_power_kw <= 50.
rv_factor = '0.9'.
ELSEIF iv_power_kw <= 100.
rv_factor = '1.0'.
ELSEIF iv_power_kw <= 150.
rv_factor = '1.3'.
ELSE.
rv_factor = '1.6'.
ENDIF.
ENDMETHOD.
METHOD get_discount_factor.
DATA(lv_discount) = iv_claim_free_years * 5.
IF lv_discount > 30.
lv_discount = 30.
ENDIF.
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,96 @@
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_region TYPE c LENGTH 2,
ty_premium TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_premium
IMPORTING iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING VALUE(rv_premium) TYPE ty_premium.
PRIVATE SECTION.
METHODS get_base_premium
IMPORTING iv_region TYPE ty_region
RETURNING VALUE(rv_base) TYPE ty_premium.
METHODS get_age_factor
IMPORTING iv_age TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_power_factor
IMPORTING iv_power_kw TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_discount_factor
IMPORTING iv_claim_free_years TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}insurance_premium IMPLEMENTATION.
METHOD calculate_premium.
IF iv_age < 18 OR iv_age > 99
OR iv_power_kw <= 0
OR iv_claim_free_years < 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_base) = get_base_premium( iv_region ).
IF lv_base <> 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_premium) = CONV decfloat34( lv_base )
* get_age_factor( iv_age )
* get_power_factor( iv_power_kw )
* get_discount_factor( iv_claim_free_years ).
rv_premium = lv_premium.
IF rv_premium < 100.
rv_premium = 100.
ENDIF.
ENDMETHOD.
METHOD get_base_premium.
CASE iv_region.
WHEN 'A1'.
rv_base = 150.
WHEN 'B2'.
rv_base = 200.
WHEN 'C3'.
rv_base = 250.
WHEN 'D4'.
rv_base = 300.
WHEN 'E5'.
rv_base = 350.
WHEN OTHERS.
rv_base = 0.
ENDCASE.
ENDMETHOD.
METHOD get_age_factor.
IF iv_age < 25.
rv_factor = '1.5'.
ELSEIF iv_age > 65.
rv_factor = '1.2'.
ELSE.
rv_factor = '1.0'.
ENDIF.
ENDMETHOD.
METHOD get_power_factor.
IF iv_power_kw <= 50.
rv_factor = '0.9'.
ELSEIF iv_power_kw <= 100.
rv_factor = '1.0'.
ELSEIF iv_power_kw <= 150.
rv_factor = '1.3'.
ELSE.
rv_factor = '1.6'.
ENDIF.
ENDMETHOD.
METHOD get_discount_factor.
DATA(lv_discount) = iv_claim_free_years * 5.
IF lv_discount > 30.
lv_discount = 30.
ENDIF.
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,96 @@
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_region TYPE c LENGTH 2,
ty_premium TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_premium
IMPORTING iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING VALUE(rv_premium) TYPE ty_premium.
PRIVATE SECTION.
METHODS get_base_premium
IMPORTING iv_region TYPE ty_region
RETURNING VALUE(rv_base) TYPE ty_premium.
METHODS get_age_factor
IMPORTING iv_age TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_power_factor
IMPORTING iv_power_kw TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_discount_factor
IMPORTING iv_claim_free_years TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}insurance_premium IMPLEMENTATION.
METHOD calculate_premium.
IF iv_age < 18 OR iv_age > 99
OR iv_power_kw <= 0
OR iv_claim_free_years < 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_base) = get_base_premium( iv_region ).
IF lv_base = 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_premium) = CONV decfloat34( lv_base )
/ get_age_factor( iv_age )
* get_power_factor( iv_power_kw )
* get_discount_factor( iv_claim_free_years ).
rv_premium = lv_premium.
IF rv_premium < 100.
rv_premium = 100.
ENDIF.
ENDMETHOD.
METHOD get_base_premium.
CASE iv_region.
WHEN 'A1'.
rv_base = 150.
WHEN 'B2'.
rv_base = 200.
WHEN 'C3'.
rv_base = 250.
WHEN 'D4'.
rv_base = 300.
WHEN 'E5'.
rv_base = 350.
WHEN OTHERS.
rv_base = 0.
ENDCASE.
ENDMETHOD.
METHOD get_age_factor.
IF iv_age < 25.
rv_factor = '1.5'.
ELSEIF iv_age > 65.
rv_factor = '1.2'.
ELSE.
rv_factor = '1.0'.
ENDIF.
ENDMETHOD.
METHOD get_power_factor.
IF iv_power_kw <= 50.
rv_factor = '0.9'.
ELSEIF iv_power_kw <= 100.
rv_factor = '1.0'.
ELSEIF iv_power_kw <= 150.
rv_factor = '1.3'.
ELSE.
rv_factor = '1.6'.
ENDIF.
ENDMETHOD.
METHOD get_discount_factor.
DATA(lv_discount) = iv_claim_free_years * 5.
IF lv_discount > 30.
lv_discount = 30.
ENDIF.
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,96 @@
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_region TYPE c LENGTH 2,
ty_premium TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_premium
IMPORTING iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING VALUE(rv_premium) TYPE ty_premium.
PRIVATE SECTION.
METHODS get_base_premium
IMPORTING iv_region TYPE ty_region
RETURNING VALUE(rv_base) TYPE ty_premium.
METHODS get_age_factor
IMPORTING iv_age TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_power_factor
IMPORTING iv_power_kw TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_discount_factor
IMPORTING iv_claim_free_years TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}insurance_premium IMPLEMENTATION.
METHOD calculate_premium.
IF iv_age < 18 OR iv_age > 99
OR iv_power_kw <= 0
OR iv_claim_free_years < 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_base) = get_base_premium( iv_region ).
IF lv_base = 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_premium) = CONV decfloat34( lv_base )
* get_age_factor( iv_age )
* get_power_factor( iv_power_kw )
* get_discount_factor( iv_claim_free_years ).
rv_premium = lv_premium.
IF rv_premium < 100.
rv_premium = 100.
ENDIF.
ENDMETHOD.
METHOD get_base_premium.
CASE iv_region.
WHEN 'A1'.
rv_base = 150.
WHEN 'B2'.
rv_base = 200.
WHEN 'C3'.
rv_base = 250.
WHEN 'D4'.
rv_base = 300.
WHEN 'E5'.
rv_base = 350.
WHEN OTHERS.
rv_base = 0.
ENDCASE.
ENDMETHOD.
METHOD get_age_factor.
IF iv_age < 25.
rv_factor = '1.5'.
ELSEIF iv_age > 65.
rv_factor = '1.2'.
ELSE.
rv_factor = '1.0'.
ENDIF.
ENDMETHOD.
METHOD get_power_factor.
IF iv_power_kw <= 50.
rv_factor = '0.9'.
ELSEIF iv_power_kw <= 100.
rv_factor = '1.0'.
ELSEIF iv_power_kw <= 150.
rv_factor = '1.3'.
ELSE.
rv_factor = '1.6'.
ENDIF.
ENDMETHOD.
METHOD get_discount_factor.
DATA(lv_discount) = iv_claim_free_years * 5.
IF lv_discount > 30.
lv_discount = 30.
ENDIF.
rv_factor = CONV decfloat34( 101 - lv_discount ) / 100.
ENDMETHOD.
ENDCLASS.

View File

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

View File

@@ -0,0 +1,111 @@
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}insurance_premium.
METHODS setup.
METHODS standard_premium FOR TESTING.
METHODS young_driver FOR TESTING.
METHODS senior_driver FOR TESTING.
METHODS high_power FOR TESTING.
METHODS very_high_power FOR TESTING.
METHODS low_power FOR TESTING.
METHODS claim_free_discount FOR TESTING.
METHODS claim_free_capped FOR TESTING.
METHODS minimum_premium FOR TESTING.
METHODS all_regions FOR TESTING.
METHODS invalid_region FOR TESTING.
METHODS invalid_inputs FOR TESTING.
ENDCLASS.
CLASS {{p}}t02_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}insurance_premium( ).
ENDMETHOD.
METHOD standard_premium.
cl_abap_unit_assert=>assert_equals(
exp = 150
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD young_driver.
cl_abap_unit_assert=>assert_equals(
exp = 225
act = mo_cut->calculate_premium( iv_age = 22 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD senior_driver.
cl_abap_unit_assert=>assert_equals(
exp = 180
act = mo_cut->calculate_premium( iv_age = 70 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD high_power.
cl_abap_unit_assert=>assert_equals(
exp = 195
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 120 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD very_high_power.
cl_abap_unit_assert=>assert_equals(
exp = 240
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 200 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD low_power.
cl_abap_unit_assert=>assert_equals(
exp = 135
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 40 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD claim_free_discount.
cl_abap_unit_assert=>assert_equals(
exp = 180
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 2 ) ).
ENDMETHOD.
METHOD claim_free_capped.
cl_abap_unit_assert=>assert_equals(
exp = 140
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 10 ) ).
ENDMETHOD.
METHOD minimum_premium.
cl_abap_unit_assert=>assert_equals(
exp = 100
act = mo_cut->calculate_premium( iv_age = 25 iv_power_kw = 50 iv_region = 'A1' iv_claim_free_years = 6 ) ).
ENDMETHOD.
METHOD all_regions.
cl_abap_unit_assert=>assert_equals(
exp = 250 msg = 'C3'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'C3' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 300 msg = 'D4'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'D4' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 350 msg = 'E5'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'E5' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD invalid_region.
cl_abap_unit_assert=>assert_equals(
exp = 0
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'X9' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD invalid_inputs.
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'age too low'
act = mo_cut->calculate_premium( iv_age = 17 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'age too high'
act = mo_cut->calculate_premium( iv_age = 100 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'power too low'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 0 iv_region = 'A1' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'negative claim free years'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = -1 ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,83 @@
{
"task": "G0104",
"mutants": [
{
"object": "{{P}}INSURANCE_PREMIUM",
"mutant": "line 30: OR -> AND (logic)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"INVALID_INPUTS"
]
},
{
"object": "{{P}}INSURANCE_PREMIUM",
"mutant": "line 31: < -> >= (rel)",
"status": "killed",
"hidden": "1/12",
"failed_tests": [
"ALL_REGIONS",
"CLAIM_FREE_CAPPED",
"CLAIM_FREE_DISCOUNT",
"HIGH_POWER",
"INVALID_INPUTS",
"LOW_POWER",
"MINIMUM_PREMIUM",
"SENIOR_DRIVER",
"STANDARD_PREMIUM",
"VERY_HIGH_POWER",
"YOUNG_DRIVER"
]
},
{
"object": "{{P}}INSURANCE_PREMIUM",
"mutant": "line 36: = -> <> (eq)",
"status": "killed",
"hidden": "1/12",
"failed_tests": [
"ALL_REGIONS",
"CLAIM_FREE_CAPPED",
"CLAIM_FREE_DISCOUNT",
"HIGH_POWER",
"INVALID_REGION",
"LOW_POWER",
"MINIMUM_PREMIUM",
"SENIOR_DRIVER",
"STANDARD_PREMIUM",
"VERY_HIGH_POWER",
"YOUNG_DRIVER"
]
},
{
"object": "{{P}}INSURANCE_PREMIUM",
"mutant": "line 41: * -> / (arith)",
"status": "killed",
"hidden": "10/12",
"failed_tests": [
"SENIOR_DRIVER",
"YOUNG_DRIVER"
]
},
{
"object": "{{P}}INSURANCE_PREMIUM",
"mutant": "line 94: 100 -> 101 (const)",
"status": "killed",
"hidden": "3/12",
"failed_tests": [
"ALL_REGIONS",
"CLAIM_FREE_CAPPED",
"CLAIM_FREE_DISCOUNT",
"HIGH_POWER",
"LOW_POWER",
"SENIOR_DRIVER",
"STANDARD_PREMIUM",
"VERY_HIGH_POWER",
"YOUNG_DRIVER"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,96 @@
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_region TYPE c LENGTH 2,
ty_premium TYPE p LENGTH 8 DECIMALS 2.
METHODS calculate_premium
IMPORTING iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING VALUE(rv_premium) TYPE ty_premium.
PRIVATE SECTION.
METHODS get_base_premium
IMPORTING iv_region TYPE ty_region
RETURNING VALUE(rv_base) TYPE ty_premium.
METHODS get_age_factor
IMPORTING iv_age TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_power_factor
IMPORTING iv_power_kw TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
METHODS get_discount_factor
IMPORTING iv_claim_free_years TYPE i
RETURNING VALUE(rv_factor) TYPE decfloat34.
ENDCLASS.
CLASS {{p}}insurance_premium IMPLEMENTATION.
METHOD calculate_premium.
IF iv_age < 18 OR iv_age > 99
OR iv_power_kw <= 0
OR iv_claim_free_years < 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_base) = get_base_premium( iv_region ).
IF lv_base = 0.
rv_premium = 0.
RETURN.
ENDIF.
DATA(lv_premium) = CONV decfloat34( lv_base )
* get_age_factor( iv_age )
* get_power_factor( iv_power_kw )
* get_discount_factor( iv_claim_free_years ).
rv_premium = lv_premium.
IF rv_premium < 100.
rv_premium = 100.
ENDIF.
ENDMETHOD.
METHOD get_base_premium.
CASE iv_region.
WHEN 'A1'.
rv_base = 150.
WHEN 'B2'.
rv_base = 200.
WHEN 'C3'.
rv_base = 250.
WHEN 'D4'.
rv_base = 300.
WHEN 'E5'.
rv_base = 350.
WHEN OTHERS.
rv_base = 0.
ENDCASE.
ENDMETHOD.
METHOD get_age_factor.
IF iv_age < 25.
rv_factor = '1.5'.
ELSEIF iv_age > 65.
rv_factor = '1.2'.
ELSE.
rv_factor = '1.0'.
ENDIF.
ENDMETHOD.
METHOD get_power_factor.
IF iv_power_kw <= 50.
rv_factor = '0.9'.
ELSEIF iv_power_kw <= 100.
rv_factor = '1.0'.
ELSEIF iv_power_kw <= 150.
rv_factor = '1.3'.
ELSE.
rv_factor = '1.6'.
ENDIF.
ENDMETHOD.
METHOD get_discount_factor.
DATA(lv_discount) = iv_claim_free_years * 5.
IF lv_discount > 30.
lv_discount = 30.
ENDIF.
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,110 @@
CLASS ltc_insurance_premium DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}insurance_premium.
METHODS setup.
METHODS standard_premium FOR TESTING.
METHODS young_driver FOR TESTING.
METHODS senior_driver FOR TESTING.
METHODS high_power FOR TESTING.
METHODS very_high_power FOR TESTING.
METHODS low_power FOR TESTING.
METHODS claim_free_discount FOR TESTING.
METHODS claim_free_capped FOR TESTING.
METHODS minimum_premium FOR TESTING.
METHODS all_regions FOR TESTING.
METHODS invalid_region FOR TESTING.
METHODS invalid_inputs FOR TESTING.
ENDCLASS.
CLASS ltc_insurance_premium IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}insurance_premium( ).
ENDMETHOD.
METHOD standard_premium.
cl_abap_unit_assert=>assert_equals(
exp = 150
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD young_driver.
cl_abap_unit_assert=>assert_equals(
exp = 225
act = mo_cut->calculate_premium( iv_age = 22 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD senior_driver.
cl_abap_unit_assert=>assert_equals(
exp = 180
act = mo_cut->calculate_premium( iv_age = 70 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD high_power.
cl_abap_unit_assert=>assert_equals(
exp = 195
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 120 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD very_high_power.
cl_abap_unit_assert=>assert_equals(
exp = 240
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 200 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD low_power.
cl_abap_unit_assert=>assert_equals(
exp = 135
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 40 iv_region = 'A1' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD claim_free_discount.
cl_abap_unit_assert=>assert_equals(
exp = 180
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 2 ) ).
ENDMETHOD.
METHOD claim_free_capped.
cl_abap_unit_assert=>assert_equals(
exp = 140
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 10 ) ).
ENDMETHOD.
METHOD minimum_premium.
cl_abap_unit_assert=>assert_equals(
exp = 100
act = mo_cut->calculate_premium( iv_age = 25 iv_power_kw = 50 iv_region = 'A1' iv_claim_free_years = 6 ) ).
ENDMETHOD.
METHOD all_regions.
cl_abap_unit_assert=>assert_equals(
exp = 250 msg = 'C3'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'C3' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 300 msg = 'D4'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'D4' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 350 msg = 'E5'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'E5' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD invalid_region.
cl_abap_unit_assert=>assert_equals(
exp = 0
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'X9' iv_claim_free_years = 0 ) ).
ENDMETHOD.
METHOD invalid_inputs.
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'age too low'
act = mo_cut->calculate_premium( iv_age = 17 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'age too high'
act = mo_cut->calculate_premium( iv_age = 100 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'power too low'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 0 iv_region = 'A1' iv_claim_free_years = 0 ) ).
cl_abap_unit_assert=>assert_equals(
exp = 0 msg = 'negative claim free years'
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = -1 ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,63 @@
# 1. Goal
Calculate the annual premium of a car insurance policy. An insurance program calls the calculation before it sends an offer to a customer. The program needs one premium for each policy.
# 2. Open questions
None.
# 3. Context
- Package $TMP.
- No other objects are required.
# 4. Contract
- Create the class {{P}}INSURANCE_PREMIUM in package $TMP.
- The class is public, final, and has a public constructor without parameters.
- The class has the public type TY_REGION (CHAR 2) and TY_PREMIUM (P LENGTH 8 DECIMALS 2).
- The class has one public method:
CALCULATE_PREMIUM
IMPORTING
iv_age TYPE i
iv_power_kw TYPE i
iv_region TYPE ty_region
iv_claim_free_years TYPE i
RETURNING
VALUE(rv_premium) TYPE ty_premium.
- Do not add other public methods.
# 5. Business rules
Apply the rules in this sequence.
1. Validate the inputs:
- iv_age must be between 18 and 99.
- iv_power_kw must be greater than 0.
- iv_claim_free_years must not be negative.
- iv_region must be one of the known regions (see rule 2).
If any check fails, return 0.
2. The base premium depends on the region:
A1: 150, B2: 200, C3: 250, D4: 300, E5: 350.
3. The age factor:
- age < 25: 1.5
- 25 <= age <= 65: 1.0
- age > 65: 1.2
4. The power factor:
- power <= 50 kW: 0.9
- 51 <= power <= 100 kW: 1.0
- 101 <= power <= 150 kW: 1.3
- power > 150 kW: 1.6
5. The claim-free discount:
- Each claim-free year gives a 5% discount.
- The maximum discount is 30%.
- The discount factor is 1 minus the discount (e.g., 0 claim-free years: 1.0, 6 or more: 0.7).
6. Calculate the premium:
premium = base premium * age factor * power factor * discount factor.
Calculate with full precision and round the final result to 2 decimals.
7. If the rounded premium is less than 100, return 100.
8. Else return the rounded premium.
# 6. Constraints
- Release target: 7.58.
- Coding standards: Clean ABAP. Method length below 40 statements. No global variables. No comment that restates the code. One statement per line.
- Out of scope: do not create other objects.
# 7. Acceptance
- The class is active and has no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,40 @@
{
"id": "G0104",
"category": "A",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v758",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [],
"contract": [
{
"type": "CLAS",
"name": "{{P}}INSURANCE_PREMIUM"
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T02_HIDDEN",
"file": "hidden/t02_hidden.clas.abap",
"description": "T02 hidden tests"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}INSURANCE_PREMIUM",
"file": "reference/insurance_premium.clas.abap",
"description": "Insurance premium calculator",
"testclasses_file": "reference/insurance_premium.testclasses.abap"
}
],
"craft_checks": [
"method_length"
]
}