CLASS ltc_refill_planner DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}refill_planner. METHODS setup. METHODS adds_machine FOR TESTING. METHODS replaces_machine FOR TESTING. METHODS accumulates_refill FOR TESTING. METHODS rejects_bad_quantity FOR TESTING. METHODS ignores_unknown_machine FOR TESTING. METHODS sorts_low_fill_level FOR TESTING. METHODS ranks_largest_refills FOR TESTING. METHODS sums_per_district FOR TESTING. ENDCLASS. CLASS ltc_refill_planner IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}refill_planner( ). ENDMETHOD. METHOD adds_machine. mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). DATA(lt_machines) = mo_cut->machines_below( 50 ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_machines ) ). ENDMETHOD. METHOD replaces_machine. mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D2' iv_fill_level = 20 ). DATA(lt_machines) = mo_cut->machines_below( 50 ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_machines ) ). LOOP AT lt_machines INTO DATA(ls_machine). cl_abap_unit_assert=>assert_equals( exp = 'D2' act = ls_machine-district ). ENDLOOP. ENDMETHOD. METHOD accumulates_refill. mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). mo_cut->add_refill( iv_machine_id = 'M1' iv_quantity = 5 ). mo_cut->add_refill( iv_machine_id = 'M1' iv_quantity = 7 ). cl_abap_unit_assert=>assert_equals( exp = 12 act = mo_cut->get_refill( 'M1' ) ). ENDMETHOD. METHOD rejects_bad_quantity. mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). cl_abap_unit_assert=>assert_equals( exp = abap_false act = mo_cut->add_refill( iv_machine_id = 'M1' iv_quantity = 0 ) ). ENDMETHOD. METHOD ignores_unknown_machine. cl_abap_unit_assert=>assert_equals( exp = abap_false act = mo_cut->add_refill( iv_machine_id = 'M9' iv_quantity = 5 ) ). ENDMETHOD. METHOD sorts_low_fill_level. DATA lv_position TYPE i. mo_cut->add_machine( iv_machine_id = 'M2' iv_district = 'D1' iv_fill_level = 20 ). mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). DATA(lt_machines) = mo_cut->machines_below( 25 ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_machines ) ). LOOP AT lt_machines INTO DATA(ls_machine). lv_position = lv_position + 1. IF lv_position = 1. cl_abap_unit_assert=>assert_equals( exp = 'M1' act = ls_machine-machine_id ). ENDIF. ENDLOOP. ENDMETHOD. METHOD ranks_largest_refills. mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). mo_cut->add_machine( iv_machine_id = 'M2' iv_district = 'D1' iv_fill_level = 10 ). mo_cut->add_refill( iv_machine_id = 'M1' iv_quantity = 3 ). mo_cut->add_refill( iv_machine_id = 'M2' iv_quantity = 8 ). DATA(lt_refills) = mo_cut->top_refills( 1 ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_refills ) ). LOOP AT lt_refills INTO DATA(ls_refill). cl_abap_unit_assert=>assert_equals( exp = 'M2' act = ls_refill-machine_id ). ENDLOOP. ENDMETHOD. METHOD sums_per_district. mo_cut->add_machine( iv_machine_id = 'M1' iv_district = 'D1' iv_fill_level = 10 ). mo_cut->add_machine( iv_machine_id = 'M2' iv_district = 'D1' iv_fill_level = 10 ). mo_cut->add_refill( iv_machine_id = 'M1' iv_quantity = 3 ). mo_cut->add_refill( iv_machine_id = 'M2' iv_quantity = 8 ). DATA(lt_summary) = mo_cut->district_summary( ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_summary ) ). LOOP AT lt_summary INTO DATA(ls_row). cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_row-machines ). cl_abap_unit_assert=>assert_equals( exp = 11 act = ls_row-quantity ). ENDLOOP. ENDMETHOD. ENDCLASS.