CLASS {{p}}bowl_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 field_names FOR TESTING. METHODS key_fields FOR TESTING. METHODS char_fields FOR TESTING. METHODS numc_fields FOR TESTING. METHODS decimal_fields FOR TESTING. METHODS date_and_count FOR TESTING. METHODS no_reserved_names FOR TESTING. METHODS insert_and_read FOR TESTING. METHODS duplicate_booking FOR TESTING. METHODS get_field IMPORTING iv_name TYPE string RETURNING VALUE(rs_field) TYPE dfies. ENDCLASS. CLASS {{p}}bowl_hidden IMPLEMENTATION. METHOD class_setup. go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOWL' ) ) ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD setup. go_env->clear_doubles( ). ENDMETHOD. METHOD get_field. DATA lo_struct TYPE REF TO cl_abap_structdescr. lo_struct ?= cl_abap_typedescr=>describe_by_name( '{{P}}BOWL' ). 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 ). ENDMETHOD. METHOD field_names. DATA lo_struct TYPE REF TO cl_abap_structdescr. lo_struct ?= cl_abap_typedescr=>describe_by_name( '{{P}}BOWL' ). DATA(lt_fields) = lo_struct->get_ddic_field_list( ). cl_abap_unit_assert=>assert_equals( exp = 10 act = lines( lt_fields ) ). DATA lt_names TYPE STANDARD TABLE OF string WITH EMPTY KEY. lt_names = VALUE #( FOR ls_field IN lt_fields ( to_upper( ls_field-fieldname ) ) ). DATA lt_expected TYPE STANDARD TABLE OF string WITH EMPTY KEY. lt_expected = VALUE #( ( `CLIENT` ) ( `BOOKING_ID` ) ( `LANE_NO` ) ( `PLAY_HOURS` ) ( `GAME_MODE` ) ( `ORDER_NO` ) ( `PLAY_DATE` ) ( `PLAYER_COUNT` ) ( `LEAGUE_CODE` ) ( `PRICE_VALUE` ) ). LOOP AT lt_expected INTO DATA(lv_name). READ TABLE lt_names TRANSPORTING NO FIELDS WITH KEY table_line = lv_name. cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc msg = |Field { lv_name } is missing| ). ENDLOOP. ENDMETHOD. METHOD key_fields. DATA lo_struct TYPE REF TO cl_abap_structdescr. lo_struct ?= cl_abap_typedescr=>describe_by_name( '{{P}}BOWL' ). DATA(lt_fields) = lo_struct->get_ddic_field_list( ). LOOP AT lt_fields INTO DATA(ls_field). DATA(lv_name) = to_upper( ls_field-fieldname ). IF lv_name = 'CLIENT' OR lv_name = 'BOOKING_ID' OR lv_name = 'LANE_NO'. cl_abap_unit_assert=>assert_equals( exp = 'X' act = ls_field-keyflag ). ELSE. cl_abap_unit_assert=>assert_equals( exp = ' ' act = ls_field-keyflag ). ENDIF. ENDLOOP. ENDMETHOD. METHOD char_fields. DATA(ls_field) = get_field( 'BOOKING_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 10 act = ls_field-leng ). ls_field = get_field( 'ORDER_NO' ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 10 act = ls_field-leng ). ls_field = get_field( 'LEAGUE_CODE' ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_field-leng ). ls_field = get_field( 'GAME_MODE' ). cl_abap_unit_assert=>assert_equals( exp = 'CHAR' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_field-leng ). ENDMETHOD. METHOD numc_fields. DATA(ls_field) = get_field( 'LANE_NO' ). cl_abap_unit_assert=>assert_equals( exp = 'NUMC' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_field-leng ). ENDMETHOD. METHOD decimal_fields. DATA(ls_field) = get_field( 'PLAY_HOURS' ). cl_abap_unit_assert=>assert_equals( exp = 'DEC' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_field-leng ). cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_field-decimals ). ls_field = get_field( 'PRICE_VALUE' ). cl_abap_unit_assert=>assert_equals( exp = 'DEC' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 11 act = ls_field-leng ). cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_field-decimals ). ENDMETHOD. METHOD date_and_count. DATA(ls_field) = get_field( 'PLAY_DATE' ). cl_abap_unit_assert=>assert_equals( exp = 'DATS' act = ls_field-datatype ). cl_abap_unit_assert=>assert_equals( exp = 8 act = ls_field-leng ). ls_field = get_field( 'PLAYER_COUNT' ). cl_abap_unit_assert=>assert_equals( exp = 'INT4' act = ls_field-datatype ). ENDMETHOD. METHOD no_reserved_names. DATA lo_struct TYPE REF TO cl_abap_structdescr. lo_struct ?= cl_abap_typedescr=>describe_by_name( '{{P}}BOWL' ). DATA(lt_fields) = lo_struct->get_ddic_field_list( ). DATA lt_reserved TYPE STANDARD TABLE OF string WITH EMPTY KEY. lt_reserved = VALUE #( ( `HOURS` ) ( `MODE` ) ( `ORDER` ) ( `DATE` ) ( `COUNT` ) ( `GROUP` ) ( `VALUE` ) ( `NUMBER` ) ). LOOP AT lt_fields INTO DATA(ls_field). DATA(lv_name) = to_upper( ls_field-fieldname ). READ TABLE lt_reserved TRANSPORTING NO FIELDS WITH KEY table_line = lv_name. cl_abap_unit_assert=>assert_subrc( exp = 4 act = sy-subrc msg = |Field name { lv_name } is a reserved word| ). ENDLOOP. ENDMETHOD. METHOD insert_and_read. DATA lv_lane TYPE {{p}}bowl-lane_no. DATA ls_booking TYPE {{p}}bowl. ls_booking-client = sy-mandt. ls_booking-booking_id = 'B-0001'. ls_booking-lane_no = '01'. ls_booking-play_hours = '12.50'. ls_booking-game_mode = 'N'. ls_booking-order_no = 'ORD-0001'. ls_booking-play_date = '20240115'. ls_booking-player_count = 4. ls_booking-league_code = 'L-01'. ls_booking-price_value = '1234.50'. INSERT {{p}}bowl FROM @ls_booking. cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc ). SELECT SINGLE * FROM {{p}}bowl WHERE booking_id = 'B-0001' AND lane_no = '01' INTO @DATA(ls_read). cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc ). lv_lane = '01'. cl_abap_unit_assert=>assert_equals( exp = lv_lane act = ls_read-lane_no ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '12.50' ) act = CONV decfloat34( ls_read-play_hours ) ). cl_abap_unit_assert=>assert_equals( exp = 'N' act = ls_read-game_mode ). cl_abap_unit_assert=>assert_equals( exp = 'ORD-0001' act = ls_read-order_no ). cl_abap_unit_assert=>assert_equals( exp = CONV d( '20240115' ) act = ls_read-play_date ). cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_read-player_count ). cl_abap_unit_assert=>assert_equals( exp = 'L-01' act = ls_read-league_code ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1234.50' ) act = CONV decfloat34( ls_read-price_value ) ). ENDMETHOD. METHOD duplicate_booking. DATA ls_booking TYPE {{p}}bowl. ls_booking-client = sy-mandt. ls_booking-booking_id = 'B-0002'. ls_booking-lane_no = '02'. ls_booking-game_mode = 'L'. INSERT {{p}}bowl FROM @ls_booking. cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc ). ls_booking-game_mode = 'N'. INSERT {{p}}bowl FROM @ls_booking. cl_abap_unit_assert=>assert_equals( exp = 4 act = sy-subrc ). SELECT SINGLE game_mode FROM {{p}}bowl WHERE booking_id = 'B-0002' AND lane_no = '02' INTO @DATA(lv_mode). cl_abap_unit_assert=>assert_subrc( exp = 0 act = sy-subrc ). cl_abap_unit_assert=>assert_equals( exp = 'L' act = lv_mode ). ENDMETHOD. ENDCLASS.