CLASS ltc_dispatch_planner DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES ty_weight TYPE p LENGTH 8 DECIMALS 2. DATA mo_cut TYPE REF TO {{p}}dispatch_planner. METHODS setup. METHODS plan_groups_districts FOR TESTING. METHODS plan_ignores_zero FOR TESTING. METHODS plan_sums_values FOR TESTING. METHODS plan_sorts_result FOR TESTING. METHODS plan_empty_input FOR TESTING. METHODS merge_adds_values FOR TESTING. METHODS merge_keeps_single FOR TESTING. METHODS merge_urgency_min FOR TESTING. METHODS merge_empty FOR TESTING. ENDCLASS. CLASS ltc_dispatch_planner IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}dispatch_planner( ). ENDMETHOD. METHOD plan_groups_districts. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( delivery_id = 'D1' district = 'NORD' parcels = 2 weight = '5.00' urgency = 1 ) ( delivery_id = 'D2' district = 'SUED' parcels = 4 weight = '7.00' urgency = 3 ) ( delivery_id = 'D3' district = 'NORD' parcels = 1 weight = '2.00' urgency = 5 ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ). DATA(ls_nord) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_nord-deliveries ). cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_nord-parcels ). ENDMETHOD. METHOD plan_ignores_zero. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( delivery_id = 'D1' district = 'NORD' parcels = 0 weight = '5.00' urgency = 1 ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). cl_abap_unit_assert=>assert_initial( act = lt_result ). ENDMETHOD. METHOD plan_sums_values. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( delivery_id = 'D1' district = 'NORD' parcels = 2 weight = '10.25' urgency = 1 ) ( delivery_id = 'D2' district = 'NORD' parcels = 3 weight = '4.75' urgency = 4 ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). DATA(ls_line) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 5 act = ls_line-parcels ). DATA lv_weight TYPE ty_weight. lv_weight = '15.00'. cl_abap_unit_assert=>assert_equals( exp = lv_weight act = ls_line-weight ). cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_line-top_urgency ). ENDMETHOD. METHOD plan_sorts_result. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( delivery_id = 'D1' district = 'WEST' parcels = 1 weight = '1.00' urgency = 1 ) ( delivery_id = 'D2' district = 'NORD' parcels = 1 weight = '1.00' urgency = 1 ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). DATA(ls_first) = lt_result[ 1 ]. cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = ls_first-district ). ENDMETHOD. METHOD plan_empty_input. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. DATA(lt_result) = mo_cut->plan( lt_delivery ). cl_abap_unit_assert=>assert_initial( act = lt_result ). ENDMETHOD. METHOD merge_adds_values. DATA lt_left TYPE {{p}}dispatch_planner=>tt_district. DATA lt_right TYPE {{p}}dispatch_planner=>tt_district. lt_left = VALUE #( ( district = 'NORD' deliveries = 2 parcels = 5 weight = '10.00' top_urgency = 3 ) ). lt_right = VALUE #( ( district = 'NORD' deliveries = 1 parcels = 4 weight = '2.50' top_urgency = 2 ) ). DATA(lt_result) = mo_cut->merge( it_left = lt_left it_right = lt_right ). DATA(ls_line) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-deliveries ). cl_abap_unit_assert=>assert_equals( exp = 9 act = ls_line-parcels ). DATA lv_weight TYPE ty_weight. lv_weight = '12.50'. cl_abap_unit_assert=>assert_equals( exp = lv_weight act = ls_line-weight ). cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-top_urgency ). ENDMETHOD. METHOD merge_keeps_single. DATA lt_left TYPE {{p}}dispatch_planner=>tt_district. DATA lt_right TYPE {{p}}dispatch_planner=>tt_district. lt_left = VALUE #( ( district = 'NORD' deliveries = 2 parcels = 5 weight = '10.00' top_urgency = 3 ) ). lt_right = VALUE #( ( district = 'SUED' deliveries = 4 parcels = 8 weight = '6.00' top_urgency = 1 ) ). DATA(lt_result) = mo_cut->merge( it_left = lt_left it_right = lt_right ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ). DATA(ls_sued) = lt_result[ district = 'SUED' ]. cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_sued-deliveries ). cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_sued-top_urgency ). ENDMETHOD. METHOD merge_urgency_min. DATA lt_left TYPE {{p}}dispatch_planner=>tt_district. DATA lt_right TYPE {{p}}dispatch_planner=>tt_district. lt_left = VALUE #( ( district = 'NORD' deliveries = 1 parcels = 1 weight = '1.00' top_urgency = 4 ) ). lt_right = VALUE #( ( district = 'NORD' deliveries = 1 parcels = 1 weight = '1.00' top_urgency = 7 ) ). DATA(lt_result) = mo_cut->merge( it_left = lt_left it_right = lt_right ). DATA(ls_line) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-top_urgency ). ENDMETHOD. METHOD merge_empty. DATA lt_left TYPE {{p}}dispatch_planner=>tt_district. DATA lt_right TYPE {{p}}dispatch_planner=>tt_district. DATA(lt_result) = mo_cut->merge( it_left = lt_left it_right = lt_right ). cl_abap_unit_assert=>assert_initial( act = lt_result ). ENDMETHOD. ENDCLASS.