CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES ty_id TYPE c LENGTH 10. TYPES ty_district TYPE c LENGTH 4. TYPES ty_weight TYPE p LENGTH 8 DECIMALS 2. DATA mo_cut TYPE REF TO {{p}}dispatch_planner. METHODS setup. METHODS make_delivery IMPORTING iv_id TYPE ty_id iv_district TYPE ty_district iv_parcels TYPE i iv_weight TYPE ty_weight iv_urgency TYPE i RETURNING VALUE(rs_delivery) TYPE {{p}}dispatch_planner=>ty_delivery. METHODS make_line IMPORTING iv_district TYPE ty_district iv_deliveries TYPE i iv_parcels TYPE i iv_weight TYPE ty_weight iv_urgency TYPE i RETURNING VALUE(rs_line) TYPE {{p}}dispatch_planner=>ty_district. METHODS empty_input FOR TESTING. METHODS one_delivery FOR TESTING. METHODS groups_districts FOR TESTING. METHODS ignores_zero_parcels FOR TESTING. METHODS sums_parcels_weight FOR TESTING. METHODS top_urgency_is_min FOR TESTING. METHODS result_is_sorted FOR TESTING. METHODS merge_adds_values FOR TESTING. METHODS merge_single_district FOR TESTING. METHODS merge_urgency_min FOR TESTING. METHODS merge_sorted FOR TESTING. METHODS merge_empty FOR TESTING. ENDCLASS. CLASS {{p}}t02_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}dispatch_planner( ). ENDMETHOD. METHOD make_delivery. rs_delivery = VALUE #( delivery_id = iv_id district = iv_district parcels = iv_parcels weight = iv_weight urgency = iv_urgency ). ENDMETHOD. METHOD make_line. rs_line = VALUE #( district = iv_district deliveries = iv_deliveries parcels = iv_parcels weight = iv_weight top_urgency = iv_urgency ). ENDMETHOD. METHOD 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 one_delivery. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( make_delivery( iv_id = 'D1' iv_district = 'NORD' iv_parcels = 3 iv_weight = '10.50' iv_urgency = 2 ) ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). DATA(ls_line) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_line-deliveries ). cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-parcels ). DATA lv_weight TYPE ty_weight. lv_weight = '10.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 groups_districts. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( make_delivery( iv_id = 'D1' iv_district = 'NORD' iv_parcels = 2 iv_weight = '5.00' iv_urgency = 1 ) ) ( make_delivery( iv_id = 'D2' iv_district = 'SUED' iv_parcels = 4 iv_weight = '7.00' iv_urgency = 3 ) ) ( make_delivery( iv_id = 'D3' iv_district = 'NORD' iv_parcels = 1 iv_weight = '2.00' iv_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' ]. DATA(ls_sued) = lt_result[ district = 'SUED' ]. cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_nord-deliveries ). cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_sued-deliveries ). ENDMETHOD. METHOD ignores_zero_parcels. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( make_delivery( iv_id = 'D1' iv_district = 'NORD' iv_parcels = 0 iv_weight = '5.00' iv_urgency = 1 ) ) ( make_delivery( iv_id = 'D2' iv_district = 'OST' iv_parcels = -2 iv_weight = '3.00' iv_urgency = 2 ) ) ( make_delivery( iv_id = 'D3' iv_district = 'WEST' iv_parcels = 2 iv_weight = '3.00' iv_urgency = 2 ) ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). READ TABLE lt_result WITH KEY district = 'NORD' TRANSPORTING NO FIELDS. cl_abap_unit_assert=>assert_subrc( exp = 4 msg = 'NORD must not be in the result' ). READ TABLE lt_result WITH KEY district = 'OST' TRANSPORTING NO FIELDS. cl_abap_unit_assert=>assert_subrc( exp = 4 msg = 'OST must not be in the result' ). DATA(ls_line) = lt_result[ 1 ]. cl_abap_unit_assert=>assert_equals( exp = 'WEST' act = ls_line-district ). ENDMETHOD. METHOD sums_parcels_weight. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( make_delivery( iv_id = 'D1' iv_district = 'NORD' iv_parcels = 2 iv_weight = '10.25' iv_urgency = 1 ) ) ( make_delivery( iv_id = 'D2' iv_district = 'NORD' iv_parcels = 3 iv_weight = '4.75' iv_urgency = 1 ) ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). DATA(ls_line) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-deliveries ). 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 ). ENDMETHOD. METHOD top_urgency_is_min. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( make_delivery( iv_id = 'D1' iv_district = 'NORD' iv_parcels = 1 iv_weight = '1.00' iv_urgency = 5 ) ) ( make_delivery( iv_id = 'D2' iv_district = 'NORD' iv_parcels = 1 iv_weight = '1.00' iv_urgency = 2 ) ) ( make_delivery( iv_id = 'D3' iv_district = 'NORD' iv_parcels = 1 iv_weight = '1.00' iv_urgency = 4 ) ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). DATA(ls_line) = lt_result[ district = 'NORD' ]. cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-top_urgency ). ENDMETHOD. METHOD result_is_sorted. DATA lt_delivery TYPE {{p}}dispatch_planner=>tt_delivery. lt_delivery = VALUE #( ( make_delivery( iv_id = 'D1' iv_district = 'WEST' iv_parcels = 1 iv_weight = '1.00' iv_urgency = 1 ) ) ( make_delivery( iv_id = 'D2' iv_district = 'NORD' iv_parcels = 1 iv_weight = '1.00' iv_urgency = 1 ) ) ( make_delivery( iv_id = 'D3' iv_district = 'OST' iv_parcels = 1 iv_weight = '1.00' iv_urgency = 1 ) ) ). DATA(lt_result) = mo_cut->plan( lt_delivery ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_result ) ). DATA(ls_first) = lt_result[ 1 ]. DATA(ls_second) = lt_result[ 2 ]. DATA(ls_third) = lt_result[ 3 ]. cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = ls_first-district ). cl_abap_unit_assert=>assert_equals( exp = 'OST' act = ls_second-district ). cl_abap_unit_assert=>assert_equals( exp = 'WEST' act = ls_third-district ). 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 #( ( make_line( iv_district = 'NORD' iv_deliveries = 2 iv_parcels = 5 iv_weight = '10.00' iv_urgency = 3 ) ) ). lt_right = VALUE #( ( make_line( iv_district = 'NORD' iv_deliveries = 1 iv_parcels = 4 iv_weight = '2.50' iv_urgency = 2 ) ) ). DATA(lt_result) = mo_cut->merge( it_left = lt_left it_right = lt_right ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). 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 ). ENDMETHOD. METHOD merge_single_district. DATA lt_left TYPE {{p}}dispatch_planner=>tt_district. DATA lt_right TYPE {{p}}dispatch_planner=>tt_district. lt_left = VALUE #( ( make_line( iv_district = 'NORD' iv_deliveries = 2 iv_parcels = 5 iv_weight = '10.00' iv_urgency = 3 ) ) ). lt_right = VALUE #( ( make_line( iv_district = 'SUED' iv_deliveries = 4 iv_parcels = 8 iv_weight = '6.00' iv_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 = 8 act = ls_sued-parcels ). 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 #( ( make_line( iv_district = 'NORD' iv_deliveries = 1 iv_parcels = 1 iv_weight = '1.00' iv_urgency = 4 ) ) ). lt_right = VALUE #( ( make_line( iv_district = 'NORD' iv_deliveries = 1 iv_parcels = 1 iv_weight = '1.00' iv_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_sorted. DATA lt_left TYPE {{p}}dispatch_planner=>tt_district. DATA lt_right TYPE {{p}}dispatch_planner=>tt_district. lt_left = VALUE #( ( make_line( iv_district = 'WEST' iv_deliveries = 1 iv_parcels = 1 iv_weight = '1.00' iv_urgency = 1 ) ) ). lt_right = VALUE #( ( make_line( iv_district = 'OST' iv_deliveries = 1 iv_parcels = 1 iv_weight = '1.00' iv_urgency = 1 ) ) ( make_line( iv_district = 'NORD' iv_deliveries = 1 iv_parcels = 1 iv_weight = '1.00' iv_urgency = 1 ) ) ). DATA(lt_result) = mo_cut->merge( it_left = lt_left it_right = lt_right ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_result ) ). DATA(ls_first) = lt_result[ 1 ]. DATA(ls_second) = lt_result[ 2 ]. DATA(ls_third) = lt_result[ 3 ]. cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = ls_first-district ). cl_abap_unit_assert=>assert_equals( exp = 'OST' act = ls_second-district ). cl_abap_unit_assert=>assert_equals( exp = 'WEST' act = ls_third-district ). 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.