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,33 @@
{
"id": "G1914",
"pool": "train",
"object_type": "INTF",
"category": "A",
"attempts": [
{
"stage": "bundle",
"errors": [
"Too close to task G0137 (similarity spec 0.52, rules 0.16, names 1.00). Choose a different business topic and different object names."
],
"by_check": {
"extra": 1
}
},
{
"stage": "validate",
"oracle": 0,
"null": 0
},
{
"stage": "validate",
"oracle": 96.4,
"null": 0
},
{
"stage": "validate",
"oracle": 96.4,
"null": 0
}
],
"accepted": false
}

View File

@@ -0,0 +1,133 @@
CLASS {{p}}t58_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_rope_check.
METHODS setup.
METHODS ok_level_1_at_limit FOR TESTING.
METHODS ok_level_2_at_limit FOR TESTING.
METHODS ok_level_3_at_limit FOR TESTING.
METHODS ticket_ignores_case FOR TESTING.
METHODS empty_ticket FOR TESTING.
METHODS unknown_ticket FOR TESTING.
METHODS too_young FOR TESTING.
METHODS too_few_hours FOR TESTING.
METHODS too_high FOR TESTING.
METHODS age_checked_before_hours FOR TESTING.
METHODS contract_shape FOR TESTING.
ENDCLASS.
CLASS {{p}}t58_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}rope_checker( ).
ENDMETHOD.
METHOD ok_level_1_at_limit.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_1' iv_height_m = 30
iv_logged_hours = 0 iv_age = 18 ) ).
ENDMETHOD.
METHOD ok_level_2_at_limit.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 60
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
METHOD ok_level_3_at_limit.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 21 ) ).
ENDMETHOD.
METHOD ticket_ignores_case.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = ' level_3 ' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 21 ) ).
ENDMETHOD.
METHOD empty_ticket.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-empty
act = mo_cut->check( iv_ticket = '' iv_height_m = 10
iv_logged_hours = 0 iv_age = 40 ) ).
ENDMETHOD.
METHOD unknown_ticket.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ticket
act = mo_cut->check( iv_ticket = 'LEVEL_9' iv_height_m = 10
iv_logged_hours = 0 iv_age = 40 ) ).
ENDMETHOD.
METHOD too_young.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-age
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 20 ) ).
ENDMETHOD.
METHOD too_few_hours.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-hours
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 60
iv_logged_hours = 499 iv_age = 18 ) ).
ENDMETHOD.
METHOD too_high.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-height
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 61
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
METHOD age_checked_before_hours.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-age
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 200
iv_logged_hours = 0 iv_age = 19 ) ).
ENDMETHOD.
METHOD contract_shape.
DATA lv_reason TYPE {{p}}if_rope_check=>ty_reason.
DATA lv_ticket TYPE {{p}}if_rope_check=>ty_ticket.
DATA lo_descr TYPE REF TO cl_abap_typedescr.
lo_descr = cl_abap_typedescr=>describe_by_data( lv_reason ).
cl_abap_unit_assert=>assert_equals( exp = 10 act = lo_descr->length ).
lo_descr = cl_abap_typedescr=>describe_by_data( lv_ticket ).
cl_abap_unit_assert=>assert_equals( exp = 10 act = lo_descr->length ).
lv_reason = 'OK'.
cl_abap_unit_assert=>assert_equals( exp = lv_reason act = {{p}}if_rope_check=>c_reason-ok ).
lv_reason = 'EMPTY'.
cl_abap_unit_assert=>assert_equals( exp = lv_reason act = {{p}}if_rope_check=>c_reason-empty ).
lv_reason = 'TICKET'.
cl_abap_unit_assert=>assert_equals( exp = lv_reason act = {{p}}if_rope_check=>c_reason-ticket ).
lv_reason = 'AGE'.
cl_abap_unit_assert=>assert_equals( exp = lv_reason act = {{p}}if_rope_check=>c_reason-age ).
lv_reason = 'HOURS'.
cl_abap_unit_assert=>assert_equals( exp = lv_reason act = {{p}}if_rope_check=>c_reason-hours ).
lv_reason = 'HEIGHT'.
cl_abap_unit_assert=>assert_equals( exp = lv_reason act = {{p}}if_rope_check=>c_reason-height ).
lv_ticket = 'LEVEL_1'.
cl_abap_unit_assert=>assert_equals( exp = lv_ticket act = {{p}}if_rope_check=>c_ticket-level_1 ).
lv_ticket = 'LEVEL_2'.
cl_abap_unit_assert=>assert_equals( exp = lv_ticket act = {{p}}if_rope_check=>c_ticket-level_2 ).
lv_ticket = 'LEVEL_3'.
cl_abap_unit_assert=>assert_equals( exp = lv_ticket act = {{p}}if_rope_check=>c_ticket-level_3 ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,28 @@
INTERFACE {{p}}if_rope_check PUBLIC.
TYPES ty_reason TYPE c LENGTH 10.
TYPES ty_ticket TYPE c LENGTH 10.
CONSTANTS:
BEGIN OF c_reason,
ok TYPE ty_reason VALUE 'OK',
empty TYPE ty_reason VALUE 'EMPTY',
ticket TYPE ty_reason VALUE 'TICKET',
age TYPE ty_reason VALUE 'AGE',
hours TYPE ty_reason VALUE 'HOURS',
height TYPE ty_reason VALUE 'HEIGHT',
END OF c_reason.
CONSTANTS:
BEGIN OF c_ticket,
level_1 TYPE ty_ticket VALUE 'LEVEL_1',
level_2 TYPE ty_ticket VALUE 'LEVEL_2',
level_3 TYPE ty_ticket VALUE 'LEVEL_3',
END OF c_ticket.
METHODS check
IMPORTING iv_ticket TYPE ty_ticket
iv_height_m TYPE i
iv_logged_hours TYPE i
iv_age TYPE i
RETURNING VALUE(rv_reason) TYPE ty_reason.
ENDINTERFACE.

View File

@@ -0,0 +1,85 @@
CLASS {{p}}rope_check_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_rope_check.
METHODS setup.
METHODS level_1_ok FOR TESTING.
METHODS level_2_ok FOR TESTING.
METHODS level_3_ok FOR TESTING.
METHODS ticket_case_and_space FOR TESTING.
METHODS empty_ticket FOR TESTING.
METHODS unknown_ticket FOR TESTING.
METHODS too_young FOR TESTING.
METHODS too_few_hours FOR TESTING.
METHODS too_high FOR TESTING.
ENDCLASS.
CLASS {{p}}rope_check_test IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}rope_checker( ).
ENDMETHOD.
METHOD level_1_ok.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_1' iv_height_m = 30
iv_logged_hours = 0 iv_age = 18 ) ).
ENDMETHOD.
METHOD level_2_ok.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 60
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
METHOD level_3_ok.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 21 ) ).
ENDMETHOD.
METHOD ticket_case_and_space.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = ' level_2 ' iv_height_m = 60
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
METHOD empty_ticket.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-empty
act = mo_cut->check( iv_ticket = '' iv_height_m = 10
iv_logged_hours = 0 iv_age = 40 ) ).
ENDMETHOD.
METHOD unknown_ticket.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ticket
act = mo_cut->check( iv_ticket = 'LEVEL_9' iv_height_m = 10
iv_logged_hours = 0 iv_age = 40 ) ).
ENDMETHOD.
METHOD too_young.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-age
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 20 ) ).
ENDMETHOD.
METHOD too_few_hours.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-hours
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 60
iv_logged_hours = 499 iv_age = 18 ) ).
ENDMETHOD.
METHOD too_high.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-height
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 61
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,67 @@
CLASS {{p}}rope_checker DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_rope_check.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_limit,
ticket TYPE {{p}}if_rope_check=>ty_ticket,
min_age TYPE i,
min_hours TYPE i,
max_height TYPE i,
END OF ty_limit,
tt_limit TYPE HASHED TABLE OF ty_limit WITH UNIQUE KEY ticket.
METHODS normalize_ticket
IMPORTING iv_ticket TYPE {{p}}if_rope_check=>ty_ticket
RETURNING VALUE(rv_ticket) TYPE {{p}}if_rope_check=>ty_ticket.
METHODS limits
RETURNING VALUE(rt_limit) TYPE tt_limit.
ENDCLASS.
CLASS {{p}}rope_checker IMPLEMENTATION.
METHOD {{p}}if_rope_check~check.
DATA(lv_ticket) = normalize_ticket( iv_ticket ).
IF lv_ticket IS INITIAL.
rv_reason = {{p}}if_rope_check=>c_reason-empty.
RETURN.
ENDIF.
DATA(lt_limit) = limits( ).
ASSIGN lt_limit[ ticket = lv_ticket ] TO FIELD-SYMBOL(<ls_limit>).
IF sy-subrc <> 0.
rv_reason = {{p}}if_rope_check=>c_reason-ticket.
RETURN.
ENDIF.
IF iv_age < <ls_limit>-min_age.
rv_reason = {{p}}if_rope_check=>c_reason-age.
RETURN.
ENDIF.
IF iv_logged_hours < <ls_limit>-min_hours.
rv_reason = {{p}}if_rope_check=>c_reason-hours.
RETURN.
ENDIF.
IF iv_height_m > <ls_limit>-max_height.
rv_reason = {{p}}if_rope_check=>c_reason-height.
RETURN.
ENDIF.
rv_reason = {{p}}if_rope_check=>c_reason-ok.
ENDMETHOD.
METHOD normalize_ticket.
rv_ticket = to_upper( replace( val = iv_ticket sub = ` ` with = `` occ = 0 ) ).
ENDMETHOD.
METHOD limits.
rt_limit = VALUE #(
( ticket = {{p}}if_rope_check=>c_ticket-level_1 min_age = 18 min_hours = 0 max_height = 30 )
( ticket = {{p}}if_rope_check=>c_ticket-level_2 min_age = 18 min_hours = 500 max_height = 60 )
( ticket = {{p}}if_rope_check=>c_ticket-level_3 min_age = 21 min_hours = 1000 max_height = 120 ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,76 @@
CLASS ltc_rope_checker DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_rope_check.
METHODS setup.
METHODS level_1_ok FOR TESTING.
METHODS level_3_ok FOR TESTING.
METHODS ticket_case_and_space FOR TESTING.
METHODS empty_ticket FOR TESTING.
METHODS unknown_ticket FOR TESTING.
METHODS too_young FOR TESTING.
METHODS too_few_hours FOR TESTING.
METHODS too_high FOR TESTING.
ENDCLASS.
CLASS ltc_rope_checker IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}rope_checker( ).
ENDMETHOD.
METHOD level_1_ok.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_1' iv_height_m = 30
iv_logged_hours = 0 iv_age = 18 ) ).
ENDMETHOD.
METHOD level_3_ok.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 21 ) ).
ENDMETHOD.
METHOD ticket_case_and_space.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ok
act = mo_cut->check( iv_ticket = ' level_2 ' iv_height_m = 60
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
METHOD empty_ticket.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-empty
act = mo_cut->check( iv_ticket = '' iv_height_m = 10
iv_logged_hours = 0 iv_age = 40 ) ).
ENDMETHOD.
METHOD unknown_ticket.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-ticket
act = mo_cut->check( iv_ticket = 'LEVEL_9' iv_height_m = 10
iv_logged_hours = 0 iv_age = 40 ) ).
ENDMETHOD.
METHOD too_young.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-age
act = mo_cut->check( iv_ticket = 'LEVEL_3' iv_height_m = 120
iv_logged_hours = 1000 iv_age = 20 ) ).
ENDMETHOD.
METHOD too_few_hours.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-hours
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 60
iv_logged_hours = 499 iv_age = 18 ) ).
ENDMETHOD.
METHOD too_high.
cl_abap_unit_assert=>assert_equals(
exp = {{p}}if_rope_check=>c_reason-height
act = mo_cut->check( iv_ticket = 'LEVEL_2' iv_height_m = 61
iv_logged_hours = 500 iv_age = 18 ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,63 @@
# 1. Goal
A rope access company checks a work permit before a technician starts a job on a
building. The permit desk calls one check for each job. The check returns one
reason code for each job.
# 2. Open questions
None.
# 3. Context
- All objects are in package $TMP.
- The interface {{P}}IF_ROPE_CHECK does not exist yet. You create it.
- The interface contains the type TY_REASON (character, length 10), the type
TY_TICKET (character, length 10), the constant structure C_REASON with the
components OK, EMPTY, TICKET, AGE, HOURS and HEIGHT, the constant structure
C_TICKET with the components LEVEL_1, LEVEL_2 and LEVEL_3, and one method:
CHECK IMPORTING iv_ticket TYPE ty_ticket iv_height_m TYPE i
iv_logged_hours TYPE i iv_age TYPE i
RETURNING VALUE(rv_reason) TYPE ty_reason.
# 4. Contract
- Create the interface {{P}}IF_ROPE_CHECK in package $TMP with the types, the
constants and the method of section 3.
- Create the class {{P}}ROPE_CHECKER in package $TMP.
- The class is public and final. It has a public constructor without parameters.
- The class implements {{P}}IF_ROPE_CHECK.
- Do not add other public methods to the class.
- The values of the constants:
C_REASON-OK = 'OK'. C_REASON-EMPTY = 'EMPTY'. C_REASON-TICKET = 'TICKET'.
C_REASON-AGE = 'AGE'. C_REASON-HOURS = 'HOURS'.
C_REASON-HEIGHT = 'HEIGHT'.
C_TICKET-LEVEL_1 = 'LEVEL_1'. C_TICKET-LEVEL_2 = 'LEVEL_2'.
C_TICKET-LEVEL_3 = 'LEVEL_3'.
# 5. Business rules
Apply the rules in this sequence. Return the reason code of the first rule that
fails.
1. Remove all spaces from iv_ticket. Convert all letters to upper case. The
result is the ticket.
2. If the ticket is empty, return EMPTY.
3. The ticket must be the value of one component of C_TICKET. If not, return
TICKET.
4. The tickets have these limits:
LEVEL_1: minimum age 18, minimum logged hours 0, maximum height 30.
LEVEL_2: minimum age 18, minimum logged hours 500, maximum height 60.
LEVEL_3: minimum age 21, minimum logged hours 1000, maximum height 120.
If iv_age is less than the minimum age of the ticket, return AGE.
5. If iv_logged_hours is less than the minimum logged hours of the ticket,
return HOURS.
6. If iv_height_m is greater than the maximum height of the ticket, return
HEIGHT.
7. Else return OK.
# 6. Constraints
- Release target: SAP_BASIS 816 (ABAP Platform 2025).
- Coding standards: Clean ABAP. A method has less than 40 statements. No global
variables. No comment that restates the code. Pass large parameters by
reference.
- Out of scope: do not change objects that are not in the contract.
# 7. Acceptance
- The interface and the class 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,61 @@
{
"id": "G1914",
"category": "A",
"object_type": "INTF",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [],
"contract": [
{
"type": "INTF",
"name": "{{P}}IF_ROPE_CHECK"
},
{
"type": "CLAS",
"name": "{{P}}ROPE_CHECKER",
"implements": "{{P}}IF_ROPE_CHECK"
}
],
"out_of_scope": [
"No other object than {{P}}IF_ROPE_CHECK and {{P}}ROPE_CHECKER.",
"No database tables, no reports, no function modules, no CDS views."
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T58_HIDDEN",
"file": "hidden/t58_hidden.clas.abap",
"description": "T58 hidden tests for the rope access permit check"
}
],
"reference": [
{
"type": "INTF",
"name": "{{P}}IF_ROPE_CHECK",
"file": "reference/if_rope_check.intf.abap",
"description": "Rope access permit check contract"
},
{
"type": "CLAS",
"name": "{{P}}ROPE_CHECKER",
"file": "reference/rope_checker.clas.abap",
"description": "Rope access permit check implementation",
"testclasses_file": "reference/rope_checker.testclasses.abap"
},
{
"type": "CLAS",
"name": "{{P}}ROPE_CHECK_TEST",
"file": "reference/rope_check_test.clas.abap",
"description": "Global own tests for the interface and the class"
}
],
"craft_checks": [
"method_length",
"db_operation_in_loop"
]
}