CLASS ltc_meter_consumption DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}if_meter_reading. METHODS setup. METHODS two_readings FOR TESTING. METHODS empty_input FOR TESTING. METHODS negative_ignored FOR TESTING. METHODS duplicate_date FOR TESTING. METHODS rollover_is_zero FOR TESTING. METHODS sorted_result FOR TESTING. ENDCLASS. CLASS ltc_meter_consumption IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}meter_consumption( ). 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 ) ). cl_abap_unit_assert=>assert_equals( exp = 100 act = lt_result[ 1 ]-opening_value ). cl_abap_unit_assert=>assert_equals( exp = 175 act = lt_result[ 1 ]-closing_value ). cl_abap_unit_assert=>assert_equals( exp = 75 act = lt_result[ 1 ]-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_initial( act = 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 = '20240120' reading_value = -7 ) ( 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 ) ). cl_abap_unit_assert=>assert_equals( exp = 100 act = lt_result[ 1 ]-consumption ). 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 = 130 ) ( meter_id = 'M0001' reading_date = '20240110' reading_value = 110 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 210 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). cl_abap_unit_assert=>assert_equals( exp = 130 act = lt_result[ 1 ]-opening_value ). cl_abap_unit_assert=>assert_equals( exp = 80 act = lt_result[ 1 ]-consumption ). ENDMETHOD. METHOD rollover_is_zero. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0001' reading_date = '20240110' reading_value = 900 ) ( meter_id = 'M0001' reading_date = '20240210' reading_value = 100 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_result[ 1 ]-consumption ). ENDMETHOD. METHOD sorted_result. DATA lt_readings TYPE {{p}}if_meter_reading=>tt_readings. lt_readings = VALUE #( ( meter_id = 'M0002' reading_date = '20240110' reading_value = 20 ) ( meter_id = 'M0001' reading_date = '20240110' reading_value = 10 ) ). DATA(lt_result) = mo_cut->calculate( lt_readings ). cl_abap_unit_assert=>assert_equals( exp = 2 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 ). ENDMETHOD. ENDCLASS.