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,75 @@
CLASS {{p}}seed_lot_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_lot,
lot_no TYPE c LENGTH 10,
germination TYPE i,
moisture TYPE p LENGTH 4 DECIMALS 1,
harvest_date TYPE d,
END OF ty_lot.
METHODS check_lot
IMPORTING is_lot TYPE ty_lot
iv_check_date TYPE d
RAISING {{p}}cx_seed_lot.
PRIVATE SECTION.
CONSTANTS:
c_min_germination TYPE i VALUE 85,
c_max_moisture TYPE p LENGTH 4 DECIMALS 1 VALUE '12.0',
c_max_age_days TYPE i VALUE 365.
METHODS check_lot_no
IMPORTING is_lot TYPE ty_lot
RAISING {{p}}cx_seed_lot.
METHODS check_harvest_date
IMPORTING is_lot TYPE ty_lot
iv_check_date TYPE d
RAISING {{p}}cx_seed_lot.
METHODS check_germination
IMPORTING is_lot TYPE ty_lot
RAISING {{p}}cx_seed_lot.
METHODS check_moisture
IMPORTING is_lot TYPE ty_lot
RAISING {{p}}cx_seed_lot.
ENDCLASS.
CLASS {{p}}seed_lot_checker IMPLEMENTATION.
METHOD check_lot.
check_lot_no( is_lot ).
check_harvest_date( is_lot = is_lot iv_check_date = iv_check_date ).
check_germination( is_lot ).
check_moisture( is_lot ).
ENDMETHOD.
METHOD check_lot_no.
DATA(lv_letters) = substring( val = is_lot-lot_no len = 4 ).
DATA(lv_digits) = substring( val = is_lot-lot_no off = 4 len = 6 ).
IF lv_letters CN 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' OR lv_digits CN '0123456789'.
RAISE EXCEPTION TYPE {{p}}cx_lot_format.
ENDIF.
ENDMETHOD.
METHOD check_harvest_date.
IF is_lot-harvest_date IS INITIAL.
RAISE EXCEPTION TYPE {{p}}cx_lot_date.
ENDIF.
DATA(lv_age_in_days) = iv_check_date - is_lot-harvest_date.
IF lv_age_in_days < 0 OR lv_age_in_days > c_max_age_days.
RAISE EXCEPTION TYPE {{p}}cx_lot_date.
ENDIF.
ENDMETHOD.
METHOD check_germination.
IF is_lot-germination < c_min_germination.
RAISE EXCEPTION TYPE {{p}}cx_lot_germination.
ENDIF.
ENDMETHOD.
METHOD check_moisture.
IF is_lot-moisture > c_max_moisture.
RAISE EXCEPTION TYPE {{p}}cx_lot_moisture.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,109 @@
CLASS ltc_seed_lot_checker DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CONSTANTS c_check_date TYPE d VALUE '20250601'.
DATA mo_cut TYPE REF TO {{p}}seed_lot_checker.
METHODS setup.
METHODS valid_lot
RETURNING VALUE(rs_lot) TYPE {{p}}seed_lot_checker=>ty_lot.
METHODS releases_valid_lot FOR TESTING.
METHODS rejects_bad_lot_no FOR TESTING.
METHODS rejects_old_harvest FOR TESTING.
METHODS rejects_low_germination FOR TESTING.
METHODS rejects_high_moisture FOR TESTING.
METHODS accepts_limit_values FOR TESTING.
ENDCLASS.
CLASS ltc_seed_lot_checker IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}seed_lot_checker( ).
ENDMETHOD.
METHOD valid_lot.
rs_lot = VALUE #( lot_no = 'WHEA123456'
germination = 90
moisture = '11.0'
harvest_date = '20250501' ).
ENDMETHOD.
METHOD releases_valid_lot.
TRY.
mo_cut->check_lot( is_lot = valid_lot( ) iv_check_date = c_check_date ).
CATCH {{p}}cx_seed_lot INTO DATA(lo_ex).
cl_abap_unit_assert=>fail( msg = lo_ex->get_message( ) ).
ENDTRY.
ENDMETHOD.
METHOD rejects_bad_lot_no.
DATA(ls_lot) = valid_lot( ).
ls_lot-lot_no = 'AB12345678'.
TRY.
mo_cut->check_lot( is_lot = ls_lot iv_check_date = c_check_date ).
cl_abap_unit_assert=>fail( msg = `CX_LOT_FORMAT expected` ).
CATCH {{p}}cx_lot_format INTO DATA(lo_format).
cl_abap_unit_assert=>assert_equals(
exp = 'The lot number has an invalid format.'
act = lo_format->get_message( ) ).
CATCH {{p}}cx_seed_lot.
cl_abap_unit_assert=>fail( msg = `CX_LOT_FORMAT expected` ).
ENDTRY.
ENDMETHOD.
METHOD rejects_old_harvest.
DATA(ls_lot) = valid_lot( ).
ls_lot-harvest_date = '20240531'.
TRY.
mo_cut->check_lot( is_lot = ls_lot iv_check_date = c_check_date ).
cl_abap_unit_assert=>fail( msg = `CX_LOT_DATE expected` ).
CATCH {{p}}cx_lot_date INTO DATA(lo_date).
cl_abap_unit_assert=>assert_equals(
exp = 'The harvest date is not valid for the release check.'
act = lo_date->get_message( ) ).
CATCH {{p}}cx_seed_lot.
cl_abap_unit_assert=>fail( msg = `CX_LOT_DATE expected` ).
ENDTRY.
ENDMETHOD.
METHOD rejects_low_germination.
DATA(ls_lot) = valid_lot( ).
ls_lot-germination = 84.
TRY.
mo_cut->check_lot( is_lot = ls_lot iv_check_date = c_check_date ).
cl_abap_unit_assert=>fail( msg = `CX_LOT_GERMINATION expected` ).
CATCH {{p}}cx_lot_germination INTO DATA(lo_germ).
cl_abap_unit_assert=>assert_equals(
exp = 'The germination rate is below the minimum of 85 percent.'
act = lo_germ->get_message( ) ).
CATCH {{p}}cx_seed_lot.
cl_abap_unit_assert=>fail( msg = `CX_LOT_GERMINATION expected` ).
ENDTRY.
ENDMETHOD.
METHOD rejects_high_moisture.
DATA(ls_lot) = valid_lot( ).
ls_lot-moisture = '12.1'.
TRY.
mo_cut->check_lot( is_lot = ls_lot iv_check_date = c_check_date ).
cl_abap_unit_assert=>fail( msg = `CX_LOT_MOISTURE expected` ).
CATCH {{p}}cx_lot_moisture INTO DATA(lo_moist).
cl_abap_unit_assert=>assert_equals(
exp = 'The moisture is above the maximum of 12.0 percent.'
act = lo_moist->get_message( ) ).
CATCH {{p}}cx_seed_lot.
cl_abap_unit_assert=>fail( msg = `CX_LOT_MOISTURE expected` ).
ENDTRY.
ENDMETHOD.
METHOD accepts_limit_values.
DATA(ls_lot) = valid_lot( ).
ls_lot-germination = 85.
ls_lot-moisture = '12.0'.
ls_lot-harvest_date = '20240601'.
TRY.
mo_cut->check_lot( is_lot = ls_lot iv_check_date = c_check_date ).
CATCH {{p}}cx_seed_lot INTO DATA(lo_ex).
cl_abap_unit_assert=>fail( msg = lo_ex->get_message( ) ).
ENDTRY.
ENDMETHOD.
ENDCLASS.