CLASS {{p}}t20_hidden 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 fields_exist FOR TESTING. METHODS key_fields FOR TESTING. METHODS field_lengths FOR TESTING. METHODS field_types FOR TESTING. METHODS insert_and_read FOR TESTING. METHODS decimal_roundtrip FOR TESTING. METHODS duplicate_key FOR TESTING. METHODS other_key_allowed FOR TESTING. METHODS get_fields RETURNING VALUE(rt_fields) TYPE ddfields. METHODS field_of IMPORTING it_fields TYPE ddfields iv_name TYPE string RETURNING VALUE(rs_field) TYPE dfies. METHODS assert_has_field IMPORTING it_fields TYPE ddfields iv_name TYPE string. ENDCLASS. CLASS {{p}}t20_hidden IMPLEMENTATION. METHOD class_setup. go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}STOCK' ) ) ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD setup. go_env->clear_doubles( ). ENDMETHOD. METHOD get_fields. DATA(lo_descr) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( '{{P}}STOCK' ) ). rt_fields = lo_descr->get_ddic_field_list( ). ENDMETHOD. METHOD field_of. LOOP AT it_fields INTO DATA(ls_field). IF to_upper( ls_field-fieldname ) = to_upper( iv_name ). rs_field = ls_field. RETURN. ENDIF. ENDLOOP. ENDMETHOD. METHOD assert_has_field. cl_abap_unit_assert=>assert_true( act = boolc( field_of( it_fields = it_fields iv_name = iv_name )-fieldname IS NOT INITIAL ) msg = |Field { iv_name } is missing| ). ENDMETHOD. METHOD fields_exist. DATA(lt_fields) = get_fields( ). cl_abap_unit_assert=>assert_equals( exp = 8 act = lines( lt_fields ) ). assert_has_field( it_fields = lt_fields iv_name = 'CLIENT' ). assert_has_field( it_fields = lt_fields iv_name = 'BIN_ID' ). assert_has_field( it_fields = lt_fields iv_name = 'ARTICLE_ID' ). assert_has_field( it_fields = lt_fields iv_name = 'QUANTITY' ). assert_has_field( it_fields = lt_fields iv_name = 'UNIT_OF_MEASURE' ). assert_has_field( it_fields = lt_fields iv_name = 'SHELF_NO' ). assert_has_field( it_fields = lt_fields iv_name = 'LAST_COUNT_DATE' ). assert_has_field( it_fields = lt_fields iv_name = 'BLOCKED' ). ENDMETHOD. METHOD key_fields. DATA(lt_fields) = get_fields( ). cl_abap_unit_assert=>assert_equals( exp = 'X' act = field_of( it_fields = lt_fields iv_name = 'CLIENT' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = 'X' act = field_of( it_fields = lt_fields iv_name = 'BIN_ID' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = 'X' act = field_of( it_fields = lt_fields iv_name = 'ARTICLE_ID' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( it_fields = lt_fields iv_name = 'QUANTITY' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( it_fields = lt_fields iv_name = 'UNIT_OF_MEASURE' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( it_fields = lt_fields iv_name = 'SHELF_NO' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( it_fields = lt_fields iv_name = 'LAST_COUNT_DATE' )-keyflag ). cl_abap_unit_assert=>assert_equals( exp = ' ' act = field_of( it_fields = lt_fields iv_name = 'BLOCKED' )-keyflag ). ENDMETHOD. METHOD field_lengths. DATA(lt_fields) = get_fields( ). cl_abap_unit_assert=>assert_equals( exp = 3 act = field_of( it_fields = lt_fields iv_name = 'CLIENT' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 8 act = field_of( it_fields = lt_fields iv_name = 'BIN_ID' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 12 act = field_of( it_fields = lt_fields iv_name = 'ARTICLE_ID' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 13 act = field_of( it_fields = lt_fields iv_name = 'QUANTITY' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 3 act = field_of( it_fields = lt_fields iv_name = 'UNIT_OF_MEASURE' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 4 act = field_of( it_fields = lt_fields iv_name = 'SHELF_NO' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 8 act = field_of( it_fields = lt_fields iv_name = 'LAST_COUNT_DATE' )-leng ). cl_abap_unit_assert=>assert_equals( exp = 1 act = field_of( it_fields = lt_fields iv_name = 'BLOCKED' )-leng ). ENDMETHOD. METHOD field_types. DATA(lt_fields) = get_fields( ). cl_abap_unit_assert=>assert_equals( exp = 'CLNT' act = field_of( it_fields = lt_fields iv_name = 'CLIENT' )-datatype ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = field_of( it_fields = lt_fields iv_name = 'BIN_ID' )-datatype ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = field_of( it_fields = lt_fields iv_name = 'ARTICLE_ID' )-datatype ). cl_abap_unit_assert=>assert_equals( exp = 'P' act = field_of( it_fields = lt_fields iv_name = 'QUANTITY' )-inttype ). cl_abap_unit_assert=>assert_equals( exp = 3 act = field_of( it_fields = lt_fields iv_name = 'QUANTITY' )-decimals ). cl_abap_unit_assert=>assert_equals( exp = 'UNIT' act = field_of( it_fields = lt_fields iv_name = 'UNIT_OF_MEASURE' )-datatype ). cl_abap_unit_assert=>assert_equals( exp = 'NUMC' act = field_of( it_fields = lt_fields iv_name = 'SHELF_NO' )-datatype ). cl_abap_unit_assert=>assert_equals( exp = 'DATS' act = field_of( it_fields = lt_fields iv_name = 'LAST_COUNT_DATE' )-datatype ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = field_of( it_fields = lt_fields iv_name = 'BLOCKED' )-datatype ). ENDMETHOD. METHOD insert_and_read. DATA ls_row TYPE {{p}}stock. DATA ls_read TYPE {{p}}stock. DATA lv_subrc TYPE sy-subrc. ls_row-client = sy-mandt. ls_row-bin_id = 'BIN-0001'. ls_row-article_id = 'ART-000001'. ls_row-quantity = '12.500'. ls_row-unit_of_measure = 'ST'. ls_row-shelf_no = '0042'. ls_row-last_count_date = '20250115'. ls_row-blocked = 'X'. INSERT {{p}}stock FROM @ls_row. lv_subrc = sy-subrc. cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_subrc ). SELECT SINGLE * FROM {{p}}stock WHERE bin_id = 'BIN-0001' AND article_id = 'ART-000001' INTO @ls_read. cl_abap_unit_assert=>assert_equals( exp = ls_row-quantity act = ls_read-quantity ). cl_abap_unit_assert=>assert_equals( exp = ls_row-unit_of_measure act = ls_read-unit_of_measure ). cl_abap_unit_assert=>assert_equals( exp = ls_row-shelf_no act = ls_read-shelf_no ). cl_abap_unit_assert=>assert_equals( exp = ls_row-last_count_date act = ls_read-last_count_date ). cl_abap_unit_assert=>assert_equals( exp = ls_row-blocked act = ls_read-blocked ). cl_abap_unit_assert=>assert_equals( exp = ls_row-client act = ls_read-client ). ENDMETHOD. METHOD decimal_roundtrip. DATA ls_row TYPE {{p}}stock. DATA lv_quantity TYPE {{p}}stock-quantity. ls_row-client = sy-mandt. ls_row-bin_id = 'BIN-0002'. ls_row-article_id = 'ART-000002'. ls_row-quantity = '0.125'. ls_row-unit_of_measure = 'KG'. INSERT {{p}}stock FROM @ls_row. SELECT SINGLE quantity FROM {{p}}stock WHERE bin_id = 'BIN-0002' AND article_id = 'ART-000002' INTO @lv_quantity. cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '0.125' ) act = CONV decfloat34( lv_quantity ) ). ENDMETHOD. METHOD duplicate_key. DATA ls_row TYPE {{p}}stock. DATA lv_subrc TYPE sy-subrc. ls_row-client = sy-mandt. ls_row-bin_id = 'BIN-0003'. ls_row-article_id = 'ART-000003'. INSERT {{p}}stock FROM @ls_row. lv_subrc = sy-subrc. cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_subrc ). INSERT {{p}}stock FROM @ls_row. lv_subrc = sy-subrc. cl_abap_unit_assert=>assert_equals( exp = 4 act = lv_subrc ). ENDMETHOD. METHOD other_key_allowed. DATA ls_row TYPE {{p}}stock. DATA lv_subrc TYPE sy-subrc. DATA lv_count TYPE i. ls_row-client = sy-mandt. ls_row-bin_id = 'BIN-0004'. ls_row-article_id = 'ART-000004'. INSERT {{p}}stock FROM @ls_row. ls_row-article_id = 'ART-000005'. INSERT {{p}}stock FROM @ls_row. lv_subrc = sy-subrc. cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_subrc ). SELECT COUNT(*) FROM {{p}}stock INTO @lv_count. cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ). ENDMETHOD. ENDCLASS.