CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}if_meter_reading. METHODS setup. METHODS assert_row IMPORTING iv_index TYPE i iv_meter_id TYPE {{p}}if_meter_reading=>ty_meter_id iv_opening TYPE {{p}}if_meter_reading=>ty_value iv_closing TYPE {{p}}if_meter_reading=>ty_value iv_consumption TYPE {{p}}if_meter_reading=>ty_value it_result TYPE {{p}}if_meter_reading=>tt_result. METHODS empty_input FOR TESTING. METHODS single_reading FOR TESTING. METHODS two_readings FOR TESTING. METHODS negative_ignored FOR TESTING. METHODS only_negative FOR TESTING. METHODS zero_reading FOR TESTING. METHODS duplicate_date FOR TESTING. METHODS sorted_by_meter FOR TESTING. METHODS rollover FOR TESTING. METHODS date_order FOR TESTING. METHODS several_meters FOR TESTING. ENDCLASS. CLASS {{p}}t02_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}meter_consumption( ). ENDMETHOD. METHOD assert_row. DATA(ls_row) = it_result[ iv_index ]. cl_abap_unit_assert=>assert_equals( exp = iv_meter_id act = ls_row-meter_id msg = 'meter id' ). cl_abap_unit_assert=>assert_equals( exp = iv_opening act = ls_row-opening_value msg = 'opening' ). cl_abap_unit_assert=>assert_equals( exp = iv_closing act = ls_row-closing_value msg = 'closing' ). cl_abap_unit_assert=>assert_equals( exp = iv_consumption act = ls_row-consumption msg = 'consumption' ). ENDMETHOD. METHOD empty_input. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ). ENDMETHOD. METHOD single_reading. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 100 iv_closing = 100 iv_consumption = 0 it_result = lt_result ). ENDMETHOD. METHOD two_readings. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 175 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 100 iv_closing = 175 iv_consumption = 75 it_result = lt_result ). ENDMETHOD. METHOD negative_ignored. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 ) ( meter_id = 'M0001' reading_date = '20240115' reading_value = -3 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 200 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 100 iv_closing = 200 iv_consumption = 100 it_result = lt_result ). ENDMETHOD. METHOD only_negative. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = -1 ) ( meter_id = 'M0002' reading_date = '20240110' reading_value = -5 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ). ENDMETHOD. METHOD zero_reading. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 0 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 50 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 0 iv_closing = 50 iv_consumption = 50 it_result = lt_result ). ENDMETHOD. METHOD duplicate_date. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 120 ) ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 180 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 200 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 120 iv_closing = 200 iv_consumption = 80 it_result = lt_result ). ENDMETHOD. METHOD sorted_by_meter. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0003' reading_date = '20240110' reading_value = 30 ) ( meter_id = 'M0001' reading_date = '20240110' reading_value = 10 ) ( meter_id = 'M0002' reading_date = '20240110' reading_value = 20 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_result ) ). cl_abap_unit_assert=>assert_equals( exp = 'M0001' act = lt_result[ 1 ]-meter_id ). cl_abap_unit_assert=>assert_equals( exp = 'M0002' act = lt_result[ 2 ]-meter_id ). cl_abap_unit_assert=>assert_equals( exp = 'M0003' act = lt_result[ 3 ]-meter_id ). ENDMETHOD. METHOD rollover. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 500 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 300 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 500 iv_closing = 300 iv_consumption = 0 it_result = lt_result ). ENDMETHOD. METHOD date_order. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240210' reading_value = 200 ) ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 100 iv_closing = 200 iv_consumption = 100 it_result = lt_result ). ENDMETHOD. METHOD several_meters. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 100 ) ( meter_id = 'M0001' reading_date = '20240310' reading_value = 250 ) ( meter_id = 'M0002' reading_date = '20240105' reading_value = 40 ) ( meter_id = 'M0002' reading_date = '20240205' reading_value = 55 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ). assert_row( iv_index = 1 iv_meter_id = 'M0001' iv_opening = 100 iv_closing = 250 iv_consumption = 150 it_result = lt_result ). assert_row( iv_index = 2 iv_meter_id = 'M0002' iv_opening = 40 iv_closing = 55 iv_consumption = 15 it_result = lt_result ). ENDMETHOD. ENDCLASS.