CLASS {{p}}t60_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES tt_show TYPE RANGE OF {{p}}visit-show_id. METHODS run IMPORTING iv_from TYPE d it_show TYPE tt_show OPTIONAL RETURNING VALUE(rr_data) TYPE REF TO data. METHODS value_of IMPORTING ir_data TYPE REF TO data iv_row TYPE i iv_col TYPE string RETURNING VALUE(rv_value) TYPE string. METHODS canon IMPORTING iv_text TYPE string RETURNING VALUE(rv_canon) TYPE string. METHODS lines_of IMPORTING ir_data TYPE REF TO data RETURNING VALUE(rv_lines) TYPE i. METHODS all_shows FOR TESTING. METHODS sorted_by_revenue FOR TESTING. METHODS revenue_values FOR TESTING. METHODS ticket_sums FOR TESTING. METHODS tie_break_by_show FOR TESTING. METHODS date_filter FOR TESTING. METHODS date_boundary FOR TESTING. METHODS show_filter FOR TESTING. METHODS zero_tickets_excluded FOR TESTING. METHODS no_data FOR TESTING. ENDCLASS. CLASS {{p}}t60_hidden IMPLEMENTATION. METHOD run. cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ). SUBMIT {{p}}planetarium WITH p_from = iv_from WITH s_show IN it_show AND RETURN. TRY. cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = rr_data ). CATCH cx_salv_bs_sc_runtime_info. ENDTRY. cl_salv_bs_runtime_info=>clear_all( ). ENDMETHOD. METHOD lines_of. FIELD-SYMBOLS TYPE STANDARD TABLE. DATA lv_lines TYPE i. IF ir_data IS BOUND. ASSIGN ir_data->* TO . lv_lines = lines( ). ENDIF. rv_lines = lv_lines. ENDMETHOD. METHOD value_of. FIELD-SYMBOLS: TYPE STANDARD TABLE, TYPE any, TYPE any. DATA: lv_index TYPE i, lv_text TYPE string. ASSIGN ir_data->* TO . lv_index = iv_row. READ TABLE ASSIGNING INDEX lv_index. cl_abap_unit_assert=>assert_subrc( exp = 0 msg = 'Row is missing' ). ASSIGN COMPONENT iv_col OF STRUCTURE TO . cl_abap_unit_assert=>assert_subrc( exp = 0 msg = 'Column is missing' ). lv_text = . CONDENSE lv_text. rv_value = lv_text. ENDMETHOD. METHOD canon. DATA: lv_len TYPE i, lv_pos TYPE i, lv_ch TYPE c LENGTH 1, lv_int TYPE string, lv_frac TYPE string, lv_after TYPE c LENGTH 1, lv_sign TYPE string, lv_tail TYPE i. lv_len = strlen( iv_text ). DO lv_len TIMES. lv_pos = sy-index - 1. lv_ch = iv_text+lv_pos(1). IF lv_ch CA '0123456789'. IF lv_after = 'X'. CONCATENATE lv_frac lv_ch INTO lv_frac. ELSE. CONCATENATE lv_int lv_ch INTO lv_int. ENDIF. ELSEIF lv_ch = '.' OR lv_ch = ','. lv_after = 'X'. ELSEIF lv_ch = '-'. lv_sign = '-'. ENDIF. ENDDO. WHILE strlen( lv_int ) > 1 AND lv_int(1) = '0'. lv_int = lv_int+1. ENDWHILE. IF lv_int IS INITIAL. lv_int = '0'. ENDIF. lv_tail = strlen( lv_frac ). WHILE lv_tail > 0. lv_pos = lv_tail - 1. IF lv_frac+lv_pos(1) <> '0'. EXIT. ENDIF. lv_tail = lv_tail - 1. ENDWHILE. lv_frac = lv_frac(lv_tail). CONCATENATE lv_sign lv_int '.' lv_frac INTO rv_canon. ENDMETHOD. METHOD all_shows. DATA: lr_data TYPE REF TO data, lv_lines TYPE i. lr_data = run( '20260101' ). lv_lines = lines_of( lr_data ). cl_abap_unit_assert=>assert_equals( exp = 5 act = lv_lines ). ENDMETHOD. METHOD sorted_by_revenue. DATA: lr_data TYPE REF TO data, lv_val TYPE string. lr_data = run( '20260101' ). lv_val = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'ROCK' act = lv_val ). lv_val = value_of( ir_data = lr_data iv_row = 2 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'PLNT' act = lv_val ). lv_val = value_of( ir_data = lr_data iv_row = 3 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'KIDS' act = lv_val ). ENDMETHOD. METHOD revenue_values. DATA: lr_data TYPE REF TO data, lv_val TYPE string. lr_data = run( '20260101' ). lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '190.00' ) act = lv_val ). lv_val = canon( value_of( ir_data = lr_data iv_row = 2 iv_col = 'REVENUE' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '180.00' ) act = lv_val ). lv_val = canon( value_of( ir_data = lr_data iv_row = 3 iv_col = 'REVENUE' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '150.00' ) act = lv_val ). ENDMETHOD. METHOD ticket_sums. DATA: lr_data TYPE REF TO data, lv_val TYPE string. lr_data = run( '20260101' ). lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'TICKETS' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '20' ) act = lv_val ). lv_val = canon( value_of( ir_data = lr_data iv_row = 2 iv_col = 'TICKETS' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '15' ) act = lv_val ). lv_val = canon( value_of( ir_data = lr_data iv_row = 3 iv_col = 'TICKETS' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '30' ) act = lv_val ). ENDMETHOD. METHOD tie_break_by_show. DATA: lr_data TYPE REF TO data, lv_val TYPE string. lr_data = run( '20260101' ). lv_val = value_of( ir_data = lr_data iv_row = 4 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'LASR' act = lv_val ). lv_val = value_of( ir_data = lr_data iv_row = 5 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'MAGI' act = lv_val ). ENDMETHOD. METHOD date_filter. DATA: lr_data TYPE REF TO data, lv_lines TYPE i, lv_val TYPE string. lr_data = run( '20260109' ). lv_lines = lines_of( lr_data ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_lines ). lv_val = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'KIDS' act = lv_val ). lv_val = value_of( ir_data = lr_data iv_row = 2 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'MAGI' act = lv_val ). ENDMETHOD. METHOD date_boundary. DATA: lr_data TYPE REF TO data, lv_lines TYPE i, lv_val TYPE string. lr_data = run( '20260106' ). lv_lines = lines_of( lr_data ). cl_abap_unit_assert=>assert_equals( exp = 5 act = lv_lines ). lv_val = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'ROCK' act = lv_val ). lv_val = value_of( ir_data = lr_data iv_row = 2 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'KIDS' act = lv_val ). lv_val = value_of( ir_data = lr_data iv_row = 5 iv_col = 'SHOW_ID' ). cl_abap_unit_assert=>assert_equals( exp = 'PLNT' act = lv_val ). lv_val = canon( value_of( ir_data = lr_data iv_row = 5 iv_col = 'TICKETS' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '5' ) act = lv_val ). ENDMETHOD. METHOD show_filter. DATA: lr_data TYPE REF TO data, lt_show TYPE tt_show, ls_show TYPE LINE OF tt_show, lv_lines TYPE i, lv_val TYPE string. ls_show-sign = 'I'. ls_show-option = 'EQ'. ls_show-low = 'ROCK'. APPEND ls_show TO lt_show. lr_data = run( iv_from = '20260101' it_show = lt_show ). lv_lines = lines_of( lr_data ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_lines ). lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'TICKETS' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '20' ) act = lv_val ). lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ) ). cl_abap_unit_assert=>assert_equals( exp = canon( '190.00' ) act = lv_val ). ENDMETHOD. METHOD zero_tickets_excluded. DATA: lr_data TYPE REF TO data, lt_show TYPE tt_show, ls_show TYPE LINE OF tt_show, lv_lines TYPE i. ls_show-sign = 'I'. ls_show-option = 'EQ'. ls_show-low = 'OPER'. APPEND ls_show TO lt_show. lr_data = run( iv_from = '20260101' it_show = lt_show ). lv_lines = lines_of( lr_data ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_lines ). ENDMETHOD. METHOD no_data. DATA: lr_data TYPE REF TO data, lv_lines TYPE i. lr_data = run( '20260201' ). lv_lines = lines_of( lr_data ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_lines ). ENDMETHOD. ENDCLASS.