Snapshot: new training tasks (balanced generation), docs

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 22:08:59 +02:00
parent eb13453097
commit 6984fc7917
572 changed files with 30024 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
@EndUserText.label : 'Cider pressing batch'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}cider {
key client : abap.clnt not null;
batch_id : abap.char(10) not null;
orchard_id : abap.char(6) not null;
apple_variety : abap.char(20);
pressed_on : abap.dats;
bin_count : abap.int4;
apple_kg : abap.dec(13,3);
juice_l : abap.dec(13,3);
@Semantics.amount.currencyCode : '{{p}}cider.currency_code'
press_fee : abap.curr(15,2);
currency_code : abap.cuky;
grade : abap.char(2);
}

View File

@@ -0,0 +1,19 @@
@EndUserText.label : 'Cider pressing batch'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}cider {
key client : abap.clnt not null;
key batch_id : abap.char(10) not null;
orchard_id : abap.numc(6) not null;
apple_variety : abap.char(20);
pressed_on : abap.dats;
bin_count : abap.int4;
apple_kg : abap.dec(13,3);
juice_l : abap.dec(13,3);
@Semantics.amount.currencyCode : '{{p}}cider.currency_code'
press_fee : abap.curr(15,2);
currency_code : abap.cuky;
grade : abap.char(2);
}

View File

@@ -0,0 +1,19 @@
@EndUserText.label : 'Cider pressing batch'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}cider {
key client : abap.clnt not null;
key batch_id : abap.char(10) not null;
orchard_id : abap.char(5) not null;
apple_variety : abap.char(20);
pressed_on : abap.dats;
bin_count : abap.int4;
apple_kg : abap.dec(13,3);
juice_l : abap.dec(13,3);
@Semantics.amount.currencyCode : '{{p}}cider.currency_code'
press_fee : abap.curr(15,2);
currency_code : abap.cuky;
grade : abap.char(2);
}

View File

@@ -0,0 +1,19 @@
@EndUserText.label : 'Cider pressing batch'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}cider {
key client : abap.clnt not null;
key batch_id : abap.char(10) not null;
orchard_id : abap.char(6) not null;
apple_variety : abap.char(19);
pressed_on : abap.dats;
bin_count : abap.int4;
apple_kg : abap.dec(13,3);
juice_l : abap.dec(13,3);
@Semantics.amount.currencyCode : '{{p}}cider.currency_code'
press_fee : abap.curr(15,2);
currency_code : abap.cuky;
grade : abap.char(2);
}

View File

@@ -0,0 +1,19 @@
@EndUserText.label : 'Cider pressing batch'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}cider {
key client : abap.clnt not null;
key batch_id : abap.char(10) not null;
orchard_id : abap.char(6) not null;
apple_variety : abap.char(20);
pressed_on : abap.dats;
bin_count : abap.int4;
apple_kg : abap.dec(13,3);
juice_l : abap.dec(13,3);
@Semantics.amount.currencyCode : '{{p}}cider.currency_code'
press_fee : abap.curr(15,3);
currency_code : abap.cuky;
grade : abap.char(2);
}

View File

@@ -0,0 +1,19 @@
{
"id": "G1910",
"pool": "train",
"object_type": "TABL",
"category": "B",
"attempts": [
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,157 @@
CLASS {{p}}cider_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_name TYPE c LENGTH 30.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS setup.
METHODS field_of
IMPORTING iv_name TYPE ty_name
RETURNING VALUE(rs_field) TYPE dfies.
METHODS field_names FOR TESTING.
METHODS key_fields FOR TESTING.
METHODS not_null_fields FOR TESTING.
METHODS char_lengths FOR TESTING.
METHODS numeric_types FOR TESTING.
METHODS decimals FOR TESTING.
METHODS insert_and_read FOR TESTING.
METHODS duplicate_key FOR TESTING.
ENDCLASS.
CLASS {{p}}cider_hidden IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}CIDER' ) ) ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD setup.
go_env->clear_doubles( ).
ENDMETHOD.
METHOD field_of.
DATA(lo_struct) = CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( '{{P}}CIDER' ) ).
DATA(lt_fields) = lo_struct->get_ddic_field_list( ).
READ TABLE lt_fields INTO rs_field WITH KEY fieldname = iv_name.
cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc
msg = |Field { iv_name } is missing| ).
ENDMETHOD.
METHOD field_names.
DATA(lo_struct) = CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( '{{P}}CIDER' ) ).
DATA(lt_fields) = lo_struct->get_ddic_field_list( ).
cl_abap_unit_assert=>assert_equals( exp = 11 act = lines( lt_fields ) ).
DATA lt_expected TYPE STANDARD TABLE OF ty_name WITH EMPTY KEY.
lt_expected = VALUE #(
( 'CLIENT' ) ( 'BATCH_ID' ) ( 'ORCHARD_ID' ) ( 'APPLE_VARIETY' )
( 'PRESSED_ON' ) ( 'BIN_COUNT' ) ( 'APPLE_KG' ) ( 'JUICE_L' )
( 'PRESS_FEE' ) ( 'CURRENCY_CODE' ) ( 'GRADE' ) ).
LOOP AT lt_expected INTO DATA(lv_name).
READ TABLE lt_fields TRANSPORTING NO FIELDS WITH KEY fieldname = lv_name.
cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc
msg = |Field { lv_name } is missing| ).
ENDLOOP.
ENDMETHOD.
METHOD key_fields.
cl_abap_unit_assert=>assert_equals( exp = 'X' act = field_of( 'CLIENT' )-keyflag ).
cl_abap_unit_assert=>assert_equals( exp = 'X' act = field_of( 'BATCH_ID' )-keyflag ).
cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( 'ORCHARD_ID' )-keyflag ).
cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( 'PRESS_FEE' )-keyflag ).
ENDMETHOD.
METHOD not_null_fields.
DATA lt_expected TYPE STANDARD TABLE OF ty_name WITH EMPTY KEY.
lt_expected = VALUE #( ( 'CLIENT' ) ( 'BATCH_ID' ) ( 'ORCHARD_ID' ) ).
LOOP AT lt_expected INTO DATA(lv_name).
DATA(ls_field) = field_of( lv_name ).
ASSIGN COMPONENT 'NOT_NULL' OF STRUCTURE ls_field TO FIELD-SYMBOL(<lv_flag>).
IF sy-subrc = 0.
cl_abap_unit_assert=>assert_equals( exp = 'X' act = <lv_flag>
msg = |Field { lv_name } must be not null| ).
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD char_lengths.
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( field_of( 'CLIENT' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 10 act = CONV i( field_of( 'BATCH_ID' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 6 act = CONV i( field_of( 'ORCHARD_ID' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 20 act = CONV i( field_of( 'APPLE_VARIETY' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 5 act = CONV i( field_of( 'CURRENCY_CODE' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = CONV i( field_of( 'GRADE' )-leng ) ).
ENDMETHOD.
METHOD numeric_types.
cl_abap_unit_assert=>assert_equals( exp = 'CLNT' act = field_of( 'CLIENT' )-datatype ).
cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = field_of( 'BATCH_ID' )-datatype ).
cl_abap_unit_assert=>assert_equals( exp = 'DATS' act = field_of( 'PRESSED_ON' )-datatype ).
cl_abap_unit_assert=>assert_equals( exp = 'INT4' act = field_of( 'BIN_COUNT' )-datatype ).
cl_abap_unit_assert=>assert_equals( exp = 'CURR' act = field_of( 'PRESS_FEE' )-datatype ).
cl_abap_unit_assert=>assert_equals( exp = 'CUKY' act = field_of( 'CURRENCY_CODE' )-datatype ).
ENDMETHOD.
METHOD decimals.
cl_abap_unit_assert=>assert_equals( exp = 13 act = CONV i( field_of( 'APPLE_KG' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( field_of( 'APPLE_KG' )-decimals ) ).
cl_abap_unit_assert=>assert_equals( exp = 13 act = CONV i( field_of( 'JUICE_L' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( field_of( 'JUICE_L' )-decimals ) ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = CONV i( field_of( 'PRESS_FEE' )-leng ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = CONV i( field_of( 'PRESS_FEE' )-decimals ) ).
ENDMETHOD.
METHOD insert_and_read.
DATA lt_batch TYPE STANDARD TABLE OF {{p}}cider WITH EMPTY KEY.
lt_batch = VALUE #(
( batch_id = 'B000000001' orchard_id = 'OR0001' apple_variety = 'ELSTAR'
pressed_on = '20250801' bin_count = 12 apple_kg = '480.500'
juice_l = '320.250' press_fee = '125.50' currency_code = 'EUR'
grade = 'A1' )
( batch_id = 'B000000002' orchard_id = 'OR0002' apple_variety = 'GALA'
pressed_on = '20250802' bin_count = 8 apple_kg = '310.000'
juice_l = '205.000' press_fee = '80.00' currency_code = 'EUR'
grade = 'B2' ) ).
INSERT {{p}}cider FROM TABLE @lt_batch.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
SELECT SINGLE orchard_id, bin_count, apple_kg, press_fee, currency_code, grade
FROM {{p}}cider
WHERE batch_id = 'B000000001'
INTO @DATA(ls_row).
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 'OR0001' act = ls_row-orchard_id ).
cl_abap_unit_assert=>assert_equals( exp = 12 act = ls_row-bin_count ).
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '480.5' ) act = CONV decfloat34( ls_row-apple_kg ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '125.50' ) act = CONV decfloat34( ls_row-press_fee ) ).
cl_abap_unit_assert=>assert_equals( exp = 'EUR' act = ls_row-currency_code ).
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = ls_row-grade ).
ENDMETHOD.
METHOD duplicate_key.
DATA ls_batch TYPE {{p}}cider.
ls_batch-batch_id = 'B000000009'.
ls_batch-orchard_id = 'OR0009'.
INSERT {{p}}cider FROM @ls_batch.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
INSERT {{p}}cider FROM @ls_batch.
cl_abap_unit_assert=>assert_equals( exp = 4 act = sy-subrc ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,56 @@
{
"task": "G1910",
"mutants": [
{
"object": "{{P}}CIDER",
"mutant": "line 8: key batch_id : -> batch_id : (key)",
"status": "killed",
"hidden": "6/8",
"failed_tests": [
"INSERT_AND_READ",
"KEY_FIELDS"
]
},
{
"object": "{{P}}CIDER",
"mutant": "line 9: abap.char(6) -> abap.numc(6) (type)",
"status": "killed",
"hidden": "7/8",
"failed_tests": [
"INSERT_AND_READ"
]
},
{
"object": "{{P}}CIDER",
"mutant": "line 9: abap.char(6) -> abap.char(5) (length)",
"status": "killed",
"hidden": "6/8",
"failed_tests": [
"CHAR_LENGTHS",
"INSERT_AND_READ"
]
},
{
"object": "{{P}}CIDER",
"mutant": "line 10: abap.char(20) -> abap.char(19) (length)",
"status": "killed",
"hidden": "7/8",
"failed_tests": [
"CHAR_LENGTHS"
]
},
{
"object": "{{P}}CIDER",
"mutant": "line 16: abap.curr(15,2) -> abap.curr(15,3) (decimals)",
"status": "killed",
"hidden": "7/8",
"failed_tests": [
"DECIMALS"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,19 @@
@EndUserText.label : 'Cider pressing batch'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}cider {
key client : abap.clnt not null;
key batch_id : abap.char(10) not null;
orchard_id : abap.char(6) not null;
apple_variety : abap.char(20);
pressed_on : abap.dats;
bin_count : abap.int4;
apple_kg : abap.dec(13,3);
juice_l : abap.dec(13,3);
@Semantics.amount.currencyCode : '{{p}}cider.currency_code'
press_fee : abap.curr(15,2);
currency_code : abap.cuky;
grade : abap.char(2);
}

View File

@@ -0,0 +1,58 @@
CLASS {{p}}cider_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS setup.
METHODS stores_batch FOR TESTING.
METHODS rejects_duplicate FOR TESTING.
ENDCLASS.
CLASS {{p}}cider_test IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}CIDER' ) ) ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD setup.
go_env->clear_doubles( ).
ENDMETHOD.
METHOD stores_batch.
DATA ls_batch TYPE {{p}}cider.
ls_batch-batch_id = 'B000000001'.
ls_batch-orchard_id = 'OR0001'.
ls_batch-apple_kg = '480.500'.
ls_batch-press_fee = '125.50'.
ls_batch-currency_code = 'EUR'.
INSERT {{p}}cider FROM @ls_batch.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
SELECT SINGLE orchard_id, apple_kg FROM {{p}}cider
WHERE batch_id = 'B000000001'
INTO @DATA(ls_read).
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 'OR0001' act = ls_read-orchard_id ).
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat34( '480.5' ) act = CONV decfloat34( ls_read-apple_kg ) ).
ENDMETHOD.
METHOD rejects_duplicate.
DATA ls_batch TYPE {{p}}cider.
ls_batch-batch_id = 'B000000002'.
INSERT {{p}}cider FROM @ls_batch.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
INSERT {{p}}cider FROM @ls_batch.
cl_abap_unit_assert=>assert_equals( exp = 4 act = sy-subrc ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,51 @@
# 1. Goal
The cider press house of a fruit cooperative records each pressing batch of
apple deliveries. Create the database table that stores these batches. A press
terminal writes the batches and a reporting tool reads them. The field names,
the data types and the key must be exactly as agreed.
# 2. Open questions
None.
# 3. Context
- The table is in package $TMP.
- The press house receives apples from the member orchards.
- One pressing batch comes from one orchard.
- The press house charges a fee for each pressing. The fee is money.
# 4. Contract
- Create the transparent database table {{P}}CIDER in package $TMP as a DDL
source.
- The table has these fields, with these names: CLIENT, BATCH_ID, ORCHARD_ID,
APPLE_VARIETY, PRESSED_ON, BIN_COUNT, APPLE_KG, JUICE_L, PRESS_FEE,
CURRENCY_CODE, GRADE.
- The table has no other fields.
- The key of the table is CLIENT and BATCH_ID.
# 5. Business rules
1. CLIENT is the client field of the table (CLNT, 3 characters). It is a key
field. It is not null.
2. BATCH_ID is the number of the pressing batch (CHAR 10). It is a key field.
It is not null.
3. ORCHARD_ID is the number of the orchard that delivered the apples (CHAR 6).
It is not null.
4. APPLE_VARIETY is the name of the apple variety (CHAR 20).
5. PRESSED_ON is the date of the pressing (DATS, 8 characters).
6. BIN_COUNT is the number of apple bins of the batch (INT4).
7. APPLE_KG is the weight of the apples in kilograms (DEC 13,3).
8. JUICE_L is the volume of the juice in litres (DEC 13,3).
9. PRESS_FEE is the fee of the pressing (CURR 15,2). It is an amount in the
currency that CURRENCY_CODE gives.
10. CURRENCY_CODE is the currency key (CUKY, 5 characters).
11. GRADE is the quality grade of the juice (CHAR 2).
# 6. Constraints
- Release target: 8.16 (SAP_BASIS 816).
- Coding standards: Clean ABAP.
- Out of scope: do not create other tables, views, classes or programs. Create
only the table and your own test class.
# 7. Acceptance
- The table is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests with CL_OSQL_TEST_ENVIRONMENT in a global test class.

View File

@@ -0,0 +1,56 @@
{
"id": "G1910",
"category": "B",
"object_type": "TABL",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [],
"contract": [
{
"type": "TABL",
"name": "{{P}}CIDER",
"fields": [
"client",
"batch_id",
"orchard_id",
"apple_variety",
"pressed_on",
"bin_count",
"apple_kg",
"juice_l",
"press_fee",
"currency_code",
"grade"
]
}
],
"out_of_scope": [],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}CIDER_HIDDEN",
"file": "hidden/cider_hidden.clas.abap",
"description": "Hidden tests for the cider pressing batch table"
}
],
"reference": [
{
"type": "TABL",
"name": "{{P}}CIDER",
"file": "reference/cider.tabl.asabap",
"description": "Cider pressing batch table"
},
{
"type": "CLAS",
"name": "{{P}}CIDER_TEST",
"file": "reference/cider_test.clas.abap",
"description": "Own tests for the table"
}
],
"craft_checks": []
}