CLASS {{p}}t_oil_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}oil_settlement. METHODS setup. METHODS sums_same_restaurant FOR TESTING. METHODS separates_restaurants FOR TESTING. METHODS ignores_zero_litres FOR TESTING. METHODS ignores_negative_litres FOR TESTING. METHODS ignores_empty_name FOR TESTING. METHODS normalises_name FOR TESTING. METHODS keeps_latest_date FOR TESTING. METHODS sorts_by_restaurant FOR TESTING. METHODS empty_input FOR TESTING. METHODS all_invalid FOR TESTING. METHODS find_row IMPORTING it_result TYPE {{p}}oil_settlement=>tt_settlements iv_restaurant TYPE {{p}}oil_settlement=>ty_restaurant RETURNING VALUE(rs_row) TYPE {{p}}oil_settlement=>ty_settlement. ENDCLASS. CLASS {{p}}t_oil_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}oil_settlement( ). ENDMETHOD. METHOD sums_same_restaurant. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = 100 ) ( restaurant = 'R001' collected_on = '20240112' litres = 50 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). DATA(ls_row) = find_row( it_result = lt_result iv_restaurant = 'R001' ). cl_abap_unit_assert=>assert_equals( exp = 150 act = ls_row-total_litres ). cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_row-round_count ). ENDMETHOD. METHOD separates_restaurants. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = 100 ) ( restaurant = 'R002' collected_on = '20240110' litres = 200 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ). DATA(ls_r001) = find_row( it_result = lt_result iv_restaurant = 'R001' ). cl_abap_unit_assert=>assert_equals( exp = 100 act = ls_r001-total_litres ). DATA(ls_r002) = find_row( it_result = lt_result iv_restaurant = 'R002' ). cl_abap_unit_assert=>assert_equals( exp = 200 act = ls_r002-total_litres ). ENDMETHOD. METHOD ignores_zero_litres. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = 0 ) ( restaurant = 'R002' collected_on = '20240110' litres = 30 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). DATA(ls_row) = find_row( it_result = lt_result iv_restaurant = 'R002' ). cl_abap_unit_assert=>assert_equals( exp = 30 act = ls_row-total_litres ). cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_row-round_count ). ENDMETHOD. METHOD ignores_negative_litres. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = -5 ) ( restaurant = 'R001' collected_on = '20240111' litres = 40 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). DATA(ls_row) = find_row( it_result = lt_result iv_restaurant = 'R001' ). cl_abap_unit_assert=>assert_equals( exp = 40 act = ls_row-total_litres ). cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_row-round_count ). ENDMETHOD. METHOD ignores_empty_name. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = space collected_on = '20240110' litres = 100 ) ( restaurant = ' ' collected_on = '20240110' litres = 100 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ). ENDMETHOD. METHOD normalises_name. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'r001' collected_on = '20240110' litres = 100 ) ( restaurant = ' R001 ' collected_on = '20240111' litres = 50 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). DATA(ls_row) = find_row( it_result = lt_result iv_restaurant = 'R001' ). cl_abap_unit_assert=>assert_equals( exp = 150 act = ls_row-total_litres ). cl_abap_unit_assert=>assert_equals( exp = 'R001' act = ls_row-restaurant ). ENDMETHOD. METHOD keeps_latest_date. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = 10 ) ( restaurant = 'R001' collected_on = '20240305' litres = 10 ) ( restaurant = 'R001' collected_on = '20240201' litres = 10 ) ) ). DATA lv_expected TYPE d. lv_expected = '20240305'. DATA(ls_row) = find_row( it_result = lt_result iv_restaurant = 'R001' ). cl_abap_unit_assert=>assert_equals( exp = lv_expected act = ls_row-last_collection ). ENDMETHOD. METHOD sorts_by_restaurant. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R003' collected_on = '20240110' litres = 10 ) ( restaurant = 'R001' collected_on = '20240110' litres = 10 ) ( restaurant = 'R002' collected_on = '20240110' litres = 10 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_result ) ). DATA lv_order TYPE string. LOOP AT lt_result INTO DATA(ls_row). lv_order = lv_order && ls_row-restaurant+0(4). ENDLOOP. cl_abap_unit_assert=>assert_equals( exp = 'R001R002R003' act = lv_order ). ENDMETHOD. METHOD empty_input. DATA lt_empty TYPE {{p}}oil_settlement=>tt_collections. DATA(lt_result) = mo_cut->settle( lt_empty ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ). ENDMETHOD. METHOD all_invalid. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = 0 ) ( restaurant = space collected_on = '20240110' litres = 50 ) ) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ). ENDMETHOD. METHOD find_row. DATA ls_row TYPE {{p}}oil_settlement=>ty_settlement. DATA lv_found TYPE abap_bool. LOOP AT it_result INTO ls_row WHERE restaurant = iv_restaurant. rs_row = ls_row. lv_found = abap_true. EXIT. ENDLOOP. cl_abap_unit_assert=>assert_equals( exp = abap_true act = lv_found ). ENDMETHOD. ENDCLASS.