Pipeline controller: plan 2 (hard +, error +50 %), backlog throttle, 2 trajectory workers, stop rules, summaries every 50; budget reserve

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 13:35:54 +02:00
parent 1c4667a0fc
commit 13360292dd
781 changed files with 50211 additions and 22 deletions

View File

@@ -0,0 +1,52 @@
CLASS {{p}}balloon_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS check_flight
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i
RAISING {{p}}cx_balloon_flight.
PRIVATE SECTION.
CONSTANTS:
c_max_passengers TYPE i VALUE 8,
c_max_weight_kg TYPE i VALUE 640,
c_max_wind_kmh TYPE i VALUE 18,
c_min_cloud_base_m TYPE i VALUE 300.
ENDCLASS.
CLASS {{p}}balloon_checker IMPLEMENTATION.
METHOD check_flight.
IF iv_passengers <= c_max_passengers.
RAISE EXCEPTION TYPE {{p}}cx_balloon_crew
EXPORTING
iv_passengers = iv_passengers
iv_limit = c_max_passengers.
ENDIF.
IF iv_weight_kg > c_max_weight_kg.
RAISE EXCEPTION TYPE {{p}}cx_balloon_weight
EXPORTING
iv_weight_kg = iv_weight_kg
iv_limit_kg = c_max_weight_kg.
ENDIF.
IF iv_wind_kmh > c_max_wind_kmh.
RAISE EXCEPTION TYPE {{p}}cx_balloon_wind
EXPORTING
iv_wind_kmh = iv_wind_kmh
iv_limit_kmh = c_max_wind_kmh.
ENDIF.
IF iv_cloud_base_m < c_min_cloud_base_m.
RAISE EXCEPTION TYPE {{p}}cx_balloon_cloud
EXPORTING
iv_cloud_base_m = iv_cloud_base_m
iv_limit_m = c_min_cloud_base_m.
ENDIF.
rv_free_kg = c_max_weight_kg - iv_weight_kg.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,52 @@
CLASS {{p}}balloon_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS check_flight
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i
RAISING {{p}}cx_balloon_flight.
PRIVATE SECTION.
CONSTANTS:
c_max_passengers TYPE i VALUE 8,
c_max_weight_kg TYPE i VALUE 640,
c_max_wind_kmh TYPE i VALUE 18,
c_min_cloud_base_m TYPE i VALUE 300.
ENDCLASS.
CLASS {{p}}balloon_checker IMPLEMENTATION.
METHOD check_flight.
IF iv_passengers > c_max_passengers.
RAISE EXCEPTION TYPE {{p}}cx_balloon_crew
EXPORTING
iv_passengers = iv_passengers
iv_limit = c_max_passengers.
ENDIF.
IF iv_weight_kg <= c_max_weight_kg.
RAISE EXCEPTION TYPE {{p}}cx_balloon_weight
EXPORTING
iv_weight_kg = iv_weight_kg
iv_limit_kg = c_max_weight_kg.
ENDIF.
IF iv_wind_kmh > c_max_wind_kmh.
RAISE EXCEPTION TYPE {{p}}cx_balloon_wind
EXPORTING
iv_wind_kmh = iv_wind_kmh
iv_limit_kmh = c_max_wind_kmh.
ENDIF.
IF iv_cloud_base_m < c_min_cloud_base_m.
RAISE EXCEPTION TYPE {{p}}cx_balloon_cloud
EXPORTING
iv_cloud_base_m = iv_cloud_base_m
iv_limit_m = c_min_cloud_base_m.
ENDIF.
rv_free_kg = c_max_weight_kg - iv_weight_kg.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,52 @@
CLASS {{p}}balloon_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS check_flight
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i
RAISING {{p}}cx_balloon_flight.
PRIVATE SECTION.
CONSTANTS:
c_max_passengers TYPE i VALUE 8,
c_max_weight_kg TYPE i VALUE 640,
c_max_wind_kmh TYPE i VALUE 18,
c_min_cloud_base_m TYPE i VALUE 300.
ENDCLASS.
CLASS {{p}}balloon_checker IMPLEMENTATION.
METHOD check_flight.
IF iv_passengers > c_max_passengers.
RAISE EXCEPTION TYPE {{p}}cx_balloon_crew
EXPORTING
iv_passengers = iv_passengers
iv_limit = c_max_passengers.
ENDIF.
IF iv_weight_kg > c_max_weight_kg.
RAISE EXCEPTION TYPE {{p}}cx_balloon_weight
EXPORTING
iv_weight_kg = iv_weight_kg
iv_limit_kg = c_max_weight_kg.
ENDIF.
IF iv_wind_kmh <= c_max_wind_kmh.
RAISE EXCEPTION TYPE {{p}}cx_balloon_wind
EXPORTING
iv_wind_kmh = iv_wind_kmh
iv_limit_kmh = c_max_wind_kmh.
ENDIF.
IF iv_cloud_base_m < c_min_cloud_base_m.
RAISE EXCEPTION TYPE {{p}}cx_balloon_cloud
EXPORTING
iv_cloud_base_m = iv_cloud_base_m
iv_limit_m = c_min_cloud_base_m.
ENDIF.
rv_free_kg = c_max_weight_kg - iv_weight_kg.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,52 @@
CLASS {{p}}balloon_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS check_flight
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i
RAISING {{p}}cx_balloon_flight.
PRIVATE SECTION.
CONSTANTS:
c_max_passengers TYPE i VALUE 8,
c_max_weight_kg TYPE i VALUE 640,
c_max_wind_kmh TYPE i VALUE 18,
c_min_cloud_base_m TYPE i VALUE 300.
ENDCLASS.
CLASS {{p}}balloon_checker IMPLEMENTATION.
METHOD check_flight.
IF iv_passengers > c_max_passengers.
RAISE EXCEPTION TYPE {{p}}cx_balloon_crew
EXPORTING
iv_passengers = iv_passengers
iv_limit = c_max_passengers.
ENDIF.
IF iv_weight_kg > c_max_weight_kg.
RAISE EXCEPTION TYPE {{p}}cx_balloon_weight
EXPORTING
iv_weight_kg = iv_weight_kg
iv_limit_kg = c_max_weight_kg.
ENDIF.
IF iv_wind_kmh > c_max_wind_kmh.
RAISE EXCEPTION TYPE {{p}}cx_balloon_wind
EXPORTING
iv_wind_kmh = iv_wind_kmh
iv_limit_kmh = c_max_wind_kmh.
ENDIF.
IF iv_cloud_base_m >= c_min_cloud_base_m.
RAISE EXCEPTION TYPE {{p}}cx_balloon_cloud
EXPORTING
iv_cloud_base_m = iv_cloud_base_m
iv_limit_m = c_min_cloud_base_m.
ENDIF.
rv_free_kg = c_max_weight_kg - iv_weight_kg.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,52 @@
CLASS {{p}}balloon_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS check_flight
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i
RAISING {{p}}cx_balloon_flight.
PRIVATE SECTION.
CONSTANTS:
c_max_passengers TYPE i VALUE 8,
c_max_weight_kg TYPE i VALUE 640,
c_max_wind_kmh TYPE i VALUE 18,
c_min_cloud_base_m TYPE i VALUE 300.
ENDCLASS.
CLASS {{p}}balloon_checker IMPLEMENTATION.
METHOD check_flight.
IF iv_passengers > c_max_passengers.
RAISE EXCEPTION TYPE {{p}}cx_balloon_crew
EXPORTING
iv_passengers = iv_passengers
iv_limit = c_max_passengers.
ENDIF.
IF iv_weight_kg > c_max_weight_kg.
RAISE EXCEPTION TYPE {{p}}cx_balloon_weight
EXPORTING
iv_weight_kg = iv_weight_kg
iv_limit_kg = c_max_weight_kg.
ENDIF.
IF iv_wind_kmh > c_max_wind_kmh.
RAISE EXCEPTION TYPE {{p}}cx_balloon_wind
EXPORTING
iv_wind_kmh = iv_wind_kmh
iv_limit_kmh = c_max_wind_kmh.
ENDIF.
IF iv_cloud_base_m < c_min_cloud_base_m.
RAISE EXCEPTION TYPE {{p}}cx_balloon_cloud
EXPORTING
iv_cloud_base_m = iv_cloud_base_m
iv_limit_m = c_min_cloud_base_m.
ENDIF.
rv_free_kg = c_max_weight_kg + iv_weight_kg.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,24 @@
{
"id": "G1004",
"pool": "train",
"object_type": "CLAS",
"category": "D",
"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,169 @@
CLASS {{p}}balloon_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}balloon_checker.
METHODS setup.
METHODS free_payload
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i.
METHODS valid_flight_is_released FOR TESTING.
METHODS crew_above_limit FOR TESTING.
METHODS weight_above_limit FOR TESTING.
METHODS wind_above_limit FOR TESTING.
METHODS cloud_base_below_limit FOR TESTING.
METHODS crew_is_checked_first FOR TESTING.
METHODS weight_is_checked_second FOR TESTING.
METHODS wind_is_checked_third FOR TESTING.
METHODS limits_are_accepted FOR TESTING.
METHODS free_payload_is_returned FOR TESTING.
ENDCLASS.
CLASS {{p}}balloon_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}balloon_checker( ).
ENDMETHOD.
METHOD free_payload.
TRY.
rv_free_kg = mo_cut->check_flight( iv_passengers = iv_passengers
iv_weight_kg = iv_weight_kg
iv_wind_kmh = iv_wind_kmh
iv_cloud_base_m = iv_cloud_base_m ).
CATCH {{p}}cx_balloon_flight.
rv_free_kg = -1.
ENDTRY.
ENDMETHOD.
METHOD valid_flight_is_released.
cl_abap_unit_assert=>assert_equals(
exp = 140
act = free_payload( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 10 iv_cloud_base_m = 2000 ) ).
ENDMETHOD.
METHOD crew_above_limit.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 9 iv_weight_kg = 500
iv_wind_kmh = 10 iv_cloud_base_m = 2000 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_crew INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Passengers 9 exceeds the limit 8'
act = lv_text ).
ENDMETHOD.
METHOD weight_above_limit.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 4 iv_weight_kg = 700
iv_wind_kmh = 10 iv_cloud_base_m = 2000 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_weight INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Weight 700 kg exceeds the limit 640 kg'
act = lv_text ).
ENDMETHOD.
METHOD wind_above_limit.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 25 iv_cloud_base_m = 2000 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_wind INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Wind 25 km/h exceeds the limit 18 km/h'
act = lv_text ).
ENDMETHOD.
METHOD cloud_base_below_limit.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 10 iv_cloud_base_m = 200 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_cloud INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Cloud base 200 m is below the limit 300 m'
act = lv_text ).
ENDMETHOD.
METHOD crew_is_checked_first.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 9 iv_weight_kg = 700
iv_wind_kmh = 25 iv_cloud_base_m = 100 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_crew INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Passengers 9 exceeds the limit 8'
act = lv_text ).
ENDMETHOD.
METHOD weight_is_checked_second.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 4 iv_weight_kg = 700
iv_wind_kmh = 25 iv_cloud_base_m = 100 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_weight INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Weight 700 kg exceeds the limit 640 kg'
act = lv_text ).
ENDMETHOD.
METHOD wind_is_checked_third.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 25 iv_cloud_base_m = 100 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_wind INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Wind 25 km/h exceeds the limit 18 km/h'
act = lv_text ).
ENDMETHOD.
METHOD limits_are_accepted.
cl_abap_unit_assert=>assert_equals(
exp = 0
act = free_payload( iv_passengers = 8 iv_weight_kg = 640
iv_wind_kmh = 18 iv_cloud_base_m = 300 ) ).
ENDMETHOD.
METHOD free_payload_is_returned.
cl_abap_unit_assert=>assert_equals(
exp = 40
act = free_payload( iv_passengers = 2 iv_weight_kg = 600
iv_wind_kmh = 12 iv_cloud_base_m = 1200 ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,80 @@
{
"task": "G1004",
"mutants": [
{
"object": "{{P}}BALLOON_CHECKER",
"mutant": "line 22: > -> <= (rel)",
"status": "killed",
"hidden": "0/10",
"failed_tests": [
"CLOUD_BASE_BELOW_LIMIT",
"CREW_ABOVE_LIMIT",
"CREW_IS_CHECKED_FIRST",
"FREE_PAYLOAD_IS_RETURNED",
"LIMITS_ARE_ACCEPTED",
"VALID_FLIGHT_IS_RELEASED",
"WEIGHT_ABOVE_LIMIT",
"WEIGHT_IS_CHECKED_SECOND",
"WIND_ABOVE_LIMIT",
"WIND_IS_CHECKED_THIRD"
]
},
{
"object": "{{P}}BALLOON_CHECKER",
"mutant": "line 29: > -> <= (rel)",
"status": "killed",
"hidden": "2/10",
"failed_tests": [
"CLOUD_BASE_BELOW_LIMIT",
"FREE_PAYLOAD_IS_RETURNED",
"LIMITS_ARE_ACCEPTED",
"VALID_FLIGHT_IS_RELEASED",
"WEIGHT_ABOVE_LIMIT",
"WEIGHT_IS_CHECKED_SECOND",
"WIND_ABOVE_LIMIT",
"WIND_IS_CHECKED_THIRD"
]
},
{
"object": "{{P}}BALLOON_CHECKER",
"mutant": "line 36: > -> <= (rel)",
"status": "killed",
"hidden": "4/10",
"failed_tests": [
"CLOUD_BASE_BELOW_LIMIT",
"FREE_PAYLOAD_IS_RETURNED",
"LIMITS_ARE_ACCEPTED",
"VALID_FLIGHT_IS_RELEASED",
"WIND_ABOVE_LIMIT",
"WIND_IS_CHECKED_THIRD"
]
},
{
"object": "{{P}}BALLOON_CHECKER",
"mutant": "line 43: < -> >= (rel)",
"status": "killed",
"hidden": "6/10",
"failed_tests": [
"CLOUD_BASE_BELOW_LIMIT",
"FREE_PAYLOAD_IS_RETURNED",
"LIMITS_ARE_ACCEPTED",
"VALID_FLIGHT_IS_RELEASED"
]
},
{
"object": "{{P}}BALLOON_CHECKER",
"mutant": "line 50: - -> + (arith)",
"status": "killed",
"hidden": "7/10",
"failed_tests": [
"FREE_PAYLOAD_IS_RETURNED",
"LIMITS_ARE_ACCEPTED",
"VALID_FLIGHT_IS_RELEASED"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,52 @@
CLASS {{p}}balloon_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS check_flight
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i
RAISING {{p}}cx_balloon_flight.
PRIVATE SECTION.
CONSTANTS:
c_max_passengers TYPE i VALUE 8,
c_max_weight_kg TYPE i VALUE 640,
c_max_wind_kmh TYPE i VALUE 18,
c_min_cloud_base_m TYPE i VALUE 300.
ENDCLASS.
CLASS {{p}}balloon_checker IMPLEMENTATION.
METHOD check_flight.
IF iv_passengers > c_max_passengers.
RAISE EXCEPTION TYPE {{p}}cx_balloon_crew
EXPORTING
iv_passengers = iv_passengers
iv_limit = c_max_passengers.
ENDIF.
IF iv_weight_kg > c_max_weight_kg.
RAISE EXCEPTION TYPE {{p}}cx_balloon_weight
EXPORTING
iv_weight_kg = iv_weight_kg
iv_limit_kg = c_max_weight_kg.
ENDIF.
IF iv_wind_kmh > c_max_wind_kmh.
RAISE EXCEPTION TYPE {{p}}cx_balloon_wind
EXPORTING
iv_wind_kmh = iv_wind_kmh
iv_limit_kmh = c_max_wind_kmh.
ENDIF.
IF iv_cloud_base_m < c_min_cloud_base_m.
RAISE EXCEPTION TYPE {{p}}cx_balloon_cloud
EXPORTING
iv_cloud_base_m = iv_cloud_base_m
iv_limit_m = c_min_cloud_base_m.
ENDIF.
rv_free_kg = c_max_weight_kg - iv_weight_kg.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,89 @@
CLASS ltc_balloon_checker DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}balloon_checker.
METHODS setup.
METHODS free_payload
IMPORTING iv_passengers TYPE i
iv_weight_kg TYPE i
iv_wind_kmh TYPE i
iv_cloud_base_m TYPE i
RETURNING VALUE(rv_free_kg) TYPE i.
METHODS released_flight FOR TESTING.
METHODS crew_limit FOR TESTING.
METHODS weight_limit FOR TESTING.
METHODS wind_limit FOR TESTING.
METHODS cloud_limit FOR TESTING.
METHODS check_sequence FOR TESTING.
ENDCLASS.
CLASS ltc_balloon_checker IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}balloon_checker( ).
ENDMETHOD.
METHOD free_payload.
TRY.
rv_free_kg = mo_cut->check_flight( iv_passengers = iv_passengers
iv_weight_kg = iv_weight_kg
iv_wind_kmh = iv_wind_kmh
iv_cloud_base_m = iv_cloud_base_m ).
CATCH {{p}}cx_balloon_flight.
rv_free_kg = -1.
ENDTRY.
ENDMETHOD.
METHOD released_flight.
cl_abap_unit_assert=>assert_equals(
exp = 140
act = free_payload( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 10 iv_cloud_base_m = 2000 ) ).
ENDMETHOD.
METHOD crew_limit.
cl_abap_unit_assert=>assert_equals(
exp = -1
act = free_payload( iv_passengers = 9 iv_weight_kg = 500
iv_wind_kmh = 10 iv_cloud_base_m = 2000 ) ).
ENDMETHOD.
METHOD weight_limit.
cl_abap_unit_assert=>assert_equals(
exp = -1
act = free_payload( iv_passengers = 4 iv_weight_kg = 700
iv_wind_kmh = 10 iv_cloud_base_m = 2000 ) ).
ENDMETHOD.
METHOD wind_limit.
cl_abap_unit_assert=>assert_equals(
exp = -1
act = free_payload( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 25 iv_cloud_base_m = 2000 ) ).
ENDMETHOD.
METHOD cloud_limit.
cl_abap_unit_assert=>assert_equals(
exp = -1
act = free_payload( iv_passengers = 4 iv_weight_kg = 500
iv_wind_kmh = 10 iv_cloud_base_m = 200 ) ).
ENDMETHOD.
METHOD check_sequence.
DATA lv_text TYPE string.
TRY.
mo_cut->check_flight( iv_passengers = 9 iv_weight_kg = 700
iv_wind_kmh = 25 iv_cloud_base_m = 100 ).
cl_abap_unit_assert=>fail( msg = 'No exception was raised' ).
CATCH {{p}}cx_balloon_crew INTO DATA(lo_exc).
lv_text = lo_exc->mv_text.
CATCH {{p}}cx_balloon_flight.
cl_abap_unit_assert=>fail( msg = 'Wrong exception type' ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = 'Passengers 9 exceeds the limit 8'
act = lv_text ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,16 @@
CLASS {{p}}cx_balloon_cloud DEFINITION PUBLIC INHERITING FROM {{p}}cx_balloon_flight FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor
IMPORTING iv_cloud_base_m TYPE i
iv_limit_m TYPE i.
PRIVATE SECTION.
CONSTANTS c_dummy TYPE i VALUE 0.
ENDCLASS.
CLASS {{p}}cx_balloon_cloud IMPLEMENTATION.
METHOD constructor.
super->constructor( iv_text = |Cloud base { iv_cloud_base_m } m is below the limit { iv_limit_m } m| ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,16 @@
CLASS {{p}}cx_balloon_crew DEFINITION PUBLIC INHERITING FROM {{p}}cx_balloon_flight FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor
IMPORTING iv_passengers TYPE i
iv_limit TYPE i.
PRIVATE SECTION.
CONSTANTS c_dummy TYPE i VALUE 0.
ENDCLASS.
CLASS {{p}}cx_balloon_crew IMPLEMENTATION.
METHOD constructor.
super->constructor( iv_text = |Passengers { iv_passengers } exceeds the limit { iv_limit }| ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,16 @@
CLASS {{p}}cx_balloon_weight DEFINITION PUBLIC INHERITING FROM {{p}}cx_balloon_flight FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor
IMPORTING iv_weight_kg TYPE i
iv_limit_kg TYPE i.
PRIVATE SECTION.
CONSTANTS c_dummy TYPE i VALUE 0.
ENDCLASS.
CLASS {{p}}cx_balloon_weight IMPLEMENTATION.
METHOD constructor.
super->constructor( iv_text = |Weight { iv_weight_kg } kg exceeds the limit { iv_limit_kg } kg| ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,16 @@
CLASS {{p}}cx_balloon_wind DEFINITION PUBLIC INHERITING FROM {{p}}cx_balloon_flight FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor
IMPORTING iv_wind_kmh TYPE i
iv_limit_kmh TYPE i.
PRIVATE SECTION.
CONSTANTS c_dummy TYPE i VALUE 0.
ENDCLASS.
CLASS {{p}}cx_balloon_wind IMPLEMENTATION.
METHOD constructor.
super->constructor( iv_text = |Wind { iv_wind_kmh } km/h exceeds the limit { iv_limit_kmh } km/h| ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,18 @@
CLASS {{p}}cx_balloon_flight DEFINITION PUBLIC INHERITING FROM cx_static_check CREATE PUBLIC.
PUBLIC SECTION.
DATA mv_text TYPE string READ-ONLY.
METHODS constructor
IMPORTING iv_text TYPE string.
PRIVATE SECTION.
CONSTANTS c_dummy TYPE i VALUE 0.
ENDCLASS.
CLASS {{p}}cx_balloon_flight IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
mv_text = iv_text.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,76 @@
# 1. Goal
Check a hot-air balloon flight before the launch. The flight office calls the
check for each planned flight. The check must stop a flight when a limit is
exceeded. The caller needs one exception for each reason.
# 2. Open questions
None.
# 3. Context
- The exception class {{P}}CX_BALLOON_FLIGHT exists in package $TMP. It is
active. It inherits from CX_STATIC_CHECK. It has the public read-only
attribute MV_TEXT (type string) and a constructor with the importing
parameter IV_TEXT (type string). The constructor writes IV_TEXT to MV_TEXT.
- The flight office knows four figures of a flight: the number of passengers,
the total take-off weight in kilograms, the wind speed in kilometres per
hour, and the height of the cloud base in metres.
# 4. Contract
- Create the class {{P}}BALLOON_CHECKER in package $TMP.
- The class is public and final. It can be created without constructor
parameters.
- The class has the public method CHECK_FLIGHT with these parameters:
- importing IV_PASSENGERS type i
- importing IV_WEIGHT_KG type i
- importing IV_WIND_KMH type i
- importing IV_CLOUD_BASE_M type i
- returning RV_FREE_KG type i
- raising {{P}}CX_BALLOON_FLIGHT
- Do not add other public methods.
- Create these exception classes in package $TMP. Each class inherits from
{{P}}CX_BALLOON_FLIGHT.
- {{P}}CX_BALLOON_CREW with the constructor importing IV_PASSENGERS type i
and IV_LIMIT type i.
- {{P}}CX_BALLOON_WEIGHT with the constructor importing IV_WEIGHT_KG type i
and IV_LIMIT_KG type i.
- {{P}}CX_BALLOON_WIND with the constructor importing IV_WIND_KMH type i and
IV_LIMIT_KMH type i.
- {{P}}CX_BALLOON_CLOUD with the constructor importing IV_CLOUD_BASE_M type i
and IV_LIMIT_M type i.
- Each constructor writes the message text to MV_TEXT. Rule 1 to rule 4 of the
business rules give the text of each exception.
# 5. Business rules
The method CHECK_FLIGHT applies the rules in this sequence. It raises the
exception of the first rule that fails. If no rule fails, the method returns the
free payload.
1. Passengers. The limit is 8. If IV_PASSENGERS is greater than 8, raise
{{P}}CX_BALLOON_CREW. The message text is
"Passengers <passengers> exceeds the limit <limit>". Example: 12 passengers
give the text "Passengers 12 exceeds the limit 8".
2. Weight. The limit is 640 kilograms. If IV_WEIGHT_KG is greater than 640,
raise {{P}}CX_BALLOON_WEIGHT. The message text is
"Weight <weight> kg exceeds the limit <limit> kg". Example: 700 kilograms
give the text "Weight 700 kg exceeds the limit 640 kg".
3. Wind. The limit is 18 kilometres per hour. If IV_WIND_KMH is greater than 18,
raise {{P}}CX_BALLOON_WIND. The message text is
"Wind <wind> km/h exceeds the limit <limit> km/h". Example: 25 kilometres per
hour give the text "Wind 25 km/h exceeds the limit 18 km/h".
4. Cloud base. The limit is 300 metres. If IV_CLOUD_BASE_M is less than 300,
raise {{P}}CX_BALLOON_CLOUD. The message text is
"Cloud base <cloud base> m is below the limit <limit> m". Example: 200 metres
give the text "Cloud base 200 m is below the limit 300 m".
5. Free payload. If no rule fails, the free payload is 640 minus IV_WEIGHT_KG.
Return the free payload in RV_FREE_KG.
# 6. Constraints
- Release target: ABAP Platform 2025 (SAP_BASIS 816).
- Coding standards: Clean ABAP. Method length below 40 statements. No global
variables. No comment that restates the code.
- Out of scope: do not change {{P}}CX_BALLOON_FLIGHT.
# 7. Acceptance
- The classes are active and have no syntax error.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,90 @@
{
"id": "G1004",
"category": "D",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 70,
"max_activations": 18
},
"seed": [
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_FLIGHT",
"file": "seed/cx_balloon_flight.clas.abap",
"description": "Base exception class of a rejected balloon flight"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}BALLOON_CHECKER"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_CREW"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_WEIGHT"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_WIND"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_CLOUD"
}
],
"out_of_scope": [
"{{P}}CX_BALLOON_FLIGHT"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}BALLOON_HIDDEN",
"file": "hidden/balloon_hidden.clas.abap",
"description": "Hidden tests for the balloon flight check"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_CREW",
"file": "reference/cx_balloon_crew.clas.abap",
"description": "Too many passengers"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_WEIGHT",
"file": "reference/cx_balloon_weight.clas.abap",
"description": "Weight above the limit"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_WIND",
"file": "reference/cx_balloon_wind.clas.abap",
"description": "Wind above the limit"
},
{
"type": "CLAS",
"name": "{{P}}CX_BALLOON_CLOUD",
"file": "reference/cx_balloon_cloud.clas.abap",
"description": "Cloud base below the limit"
},
{
"type": "CLAS",
"name": "{{P}}BALLOON_CHECKER",
"file": "reference/balloon_checker.clas.abap",
"description": "Balloon flight check with class-based exceptions",
"testclasses_file": "reference/balloon_checker.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"db_operation_in_loop"
]
}