CLASS {{p}}t41_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. METHODS setup. METHODS call IMPORTING iv_max_priority TYPE i EXPORTING ev_count TYPE i ev_duplicates TYPE i ev_first_call_id TYPE string ev_first_district TYPE string ev_last_call_id TYPE string ev_subrc TYPE sysubrc. METHODS add_a IMPORTING iv_id TYPE {{P}}ALERT_A-CALL_ID iv_prio TYPE {{P}}ALERT_A-PRIORITY iv_date TYPE {{P}}ALERT_A-CALL_DATE iv_time TYPE {{P}}ALERT_A-CALL_TIME iv_district TYPE {{P}}ALERT_A-DISTRICT. METHODS add_b IMPORTING iv_id TYPE {{P}}ALERT_B-CALL_ID iv_prio TYPE {{P}}ALERT_B-PRIORITY iv_date TYPE {{P}}ALERT_B-CALL_DATE iv_time TYPE {{P}}ALERT_B-CALL_TIME iv_district TYPE {{P}}ALERT_B-DISTRICT. METHODS merges_both_tables FOR TESTING. METHODS keeps_earliest_call FOR TESTING. METHODS keeps_a_on_tie FOR TESTING. METHODS sorts_by_priority FOR TESTING. METHODS sorts_by_time FOR TESTING. METHODS sorts_by_call_id FOR TESTING. METHODS filters_by_priority FOR TESTING. METHODS counts_duplicates FOR TESTING. METHODS empty_tables FOR TESTING. METHODS rejects_bad_max FOR TESTING. METHODS rejects_bad_priority FOR TESTING. ENDCLASS. CLASS {{p}}t41_hidden IMPLEMENTATION. METHOD setup. DELETE FROM {{P}}ALERT_A. DELETE FROM {{P}}ALERT_B. ENDMETHOD. METHOD call. CALL FUNCTION '{{P}}ALERT_MERGE' EXPORTING iv_max_priority = iv_max_priority IMPORTING ev_count = ev_count ev_duplicates = ev_duplicates ev_first_call_id = ev_first_call_id ev_first_district = ev_first_district ev_last_call_id = ev_last_call_id EXCEPTIONS invalid_priority = 1 OTHERS = 2. ev_subrc = sy-subrc. ENDMETHOD. METHOD add_a. DATA ls_call TYPE {{P}}ALERT_A. ls_call-call_id = iv_id. ls_call-priority = iv_prio. ls_call-call_date = iv_date. ls_call-call_time = iv_time. ls_call-district = iv_district. MODIFY {{P}}ALERT_A FROM @ls_call. ENDMETHOD. METHOD add_b. DATA ls_call TYPE {{P}}ALERT_B. ls_call-call_id = iv_id. ls_call-priority = iv_prio. ls_call-call_date = iv_date. ls_call-call_time = iv_time. ls_call-district = iv_district. MODIFY {{P}}ALERT_B FROM @ls_call. ENDMETHOD. METHOD merges_both_tables. add_a( iv_id = 'C1' iv_prio = 2 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). add_b( iv_id = 'C2' iv_prio = 1 iv_date = '20240101' iv_time = '090000' iv_district = 'SUED' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_count = DATA(lv_count) ev_first_call_id = DATA(lv_first) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 'C2' act = lv_first ). cl_abap_unit_assert=>assert_equals( exp = 'C1' act = lv_last ). ENDMETHOD. METHOD keeps_earliest_call. add_a( iv_id = 'C1' iv_prio = 2 iv_date = '20240101' iv_time = '100000' iv_district = 'NORD' ). add_b( iv_id = 'C1' iv_prio = 2 iv_date = '20240101' iv_time = '090000' iv_district = 'SUED' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_count = DATA(lv_count) ev_duplicates = DATA(lv_dup) ev_first_district = DATA(lv_district) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_dup ). cl_abap_unit_assert=>assert_equals( exp = 'SUED' act = lv_district ). ENDMETHOD. METHOD keeps_a_on_tie. add_a( iv_id = 'C1' iv_prio = 2 iv_date = '20240101' iv_time = '090000' iv_district = 'NORD' ). add_b( iv_id = 'C1' iv_prio = 3 iv_date = '20240101' iv_time = '090000' iv_district = 'SUED' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_count = DATA(lv_count) ev_first_call_id = DATA(lv_first) ev_first_district = DATA(lv_district) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 'C1' act = lv_first ). cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = lv_district ). ENDMETHOD. METHOD sorts_by_priority. add_a( iv_id = 'C3' iv_prio = 3 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). add_a( iv_id = 'C1' iv_prio = 1 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). add_a( iv_id = 'C2' iv_prio = 2 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_count = DATA(lv_count) ev_first_call_id = DATA(lv_first) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 'C1' act = lv_first ). cl_abap_unit_assert=>assert_equals( exp = 'C3' act = lv_last ). ENDMETHOD. METHOD sorts_by_time. add_a( iv_id = 'C1' iv_prio = 1 iv_date = '20240102' iv_time = '080000' iv_district = 'NORD' ). add_a( iv_id = 'C2' iv_prio = 1 iv_date = '20240101' iv_time = '120000' iv_district = 'NORD' ). add_a( iv_id = 'C3' iv_prio = 1 iv_date = '20240101' iv_time = '060000' iv_district = 'NORD' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_first_call_id = DATA(lv_first) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 'C3' act = lv_first ). cl_abap_unit_assert=>assert_equals( exp = 'C1' act = lv_last ). ENDMETHOD. METHOD sorts_by_call_id. add_a( iv_id = 'C9' iv_prio = 1 iv_date = '20240101' iv_time = '060000' iv_district = 'NORD' ). add_a( iv_id = 'C0' iv_prio = 1 iv_date = '20240101' iv_time = '060000' iv_district = 'NORD' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_first_call_id = DATA(lv_first) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 'C0' act = lv_first ). cl_abap_unit_assert=>assert_equals( exp = 'C9' act = lv_last ). ENDMETHOD. METHOD filters_by_priority. add_a( iv_id = 'C1' iv_prio = 1 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). add_a( iv_id = 'C2' iv_prio = 2 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). add_a( iv_id = 'C3' iv_prio = 3 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). call( EXPORTING iv_max_priority = 2 IMPORTING ev_count = DATA(lv_count) ev_duplicates = DATA(lv_dup) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_dup ). cl_abap_unit_assert=>assert_equals( exp = 'C2' act = lv_last ). ENDMETHOD. METHOD counts_duplicates. add_a( iv_id = 'C1' iv_prio = 1 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). add_a( iv_id = 'C2' iv_prio = 2 iv_date = '20240102' iv_time = '080000' iv_district = 'NORD' ). add_b( iv_id = 'C2' iv_prio = 2 iv_date = '20240101' iv_time = '080000' iv_district = 'SUED' ). add_b( iv_id = 'C3' iv_prio = 3 iv_date = '20240103' iv_time = '080000' iv_district = 'NORD' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_count = DATA(lv_count) ev_duplicates = DATA(lv_dup) ev_first_call_id = DATA(lv_first) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_dup ). cl_abap_unit_assert=>assert_equals( exp = 'C1' act = lv_first ). cl_abap_unit_assert=>assert_equals( exp = 'C3' act = lv_last ). ENDMETHOD. METHOD empty_tables. call( EXPORTING iv_max_priority = 5 IMPORTING ev_count = DATA(lv_count) ev_duplicates = DATA(lv_dup) ev_first_call_id = DATA(lv_first) ev_last_call_id = DATA(lv_last) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_count ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_dup ). cl_abap_unit_assert=>assert_initial( act = lv_first ). cl_abap_unit_assert=>assert_initial( act = lv_last ). ENDMETHOD. METHOD rejects_bad_max. call( EXPORTING iv_max_priority = 0 IMPORTING ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ). call( EXPORTING iv_max_priority = 6 IMPORTING ev_subrc = DATA(lv_rc6) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc6 ). ENDMETHOD. METHOD rejects_bad_priority. add_a( iv_id = 'C1' iv_prio = 9 iv_date = '20240101' iv_time = '080000' iv_district = 'NORD' ). call( EXPORTING iv_max_priority = 5 IMPORTING ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ). ENDMETHOD. ENDCLASS.