CLASS ltc_oil_settlement DEFINITION FINAL 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 ignores_invalid_records FOR TESTING. METHODS normalises_restaurant FOR TESTING. METHODS keeps_latest_date FOR TESTING. METHODS sorts_result 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 ltc_oil_settlement 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 = '20240115' 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 ignores_invalid_records. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'R001' collected_on = '20240110' litres = 0 ) ( restaurant = space collected_on = '20240110' litres = 20 ) ( 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 normalises_restaurant. DATA(lt_result) = mo_cut->settle( VALUE #( ( restaurant = 'r001' collected_on = '20240110' litres = 10 ) ( restaurant = ' R001 ' collected_on = '20240111' litres = 20 ) ) ). 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 = 30 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 ) ) ). 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_result. 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 ) ) ). 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 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.