CLASS {{p}}move_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. METHODS call IMPORTING iv_order_no TYPE string iv_move_date TYPE d iv_work_hours TYPE decfloat34 iv_box_count TYPE i iv_calc_mode TYPE string EXPORTING ev_fee TYPE decfloat34 ev_msg TYPE string ev_subrc TYPE sysubrc. METHODS eco_base_fee FOR TESTING. METHODS std_base_fee FOR TESTING. METHODS box_fee_added FOR TESTING. METHODS exp_surcharge FOR TESTING. METHODS rounds_half_up FOR TESTING. METHODS rejects_empty_order FOR TESTING. METHODS rejects_empty_date FOR TESTING. METHODS rejects_bad_hours FOR TESTING. METHODS rejects_negative_boxes FOR TESTING. METHODS rejects_unknown_mode FOR TESTING. METHODS first_error_wins FOR TESTING. ENDCLASS. CLASS {{p}}move_hidden IMPLEMENTATION. METHOD call. ev_fee = 0. ev_msg = ''. CALL FUNCTION '{{P}}MOVE_FEE' EXPORTING iv_order_no = iv_order_no iv_move_date = iv_move_date iv_work_hours = iv_work_hours iv_box_count = iv_box_count iv_calc_mode = iv_calc_mode IMPORTING ev_fee = ev_fee ev_msg = ev_msg EXCEPTIONS invalid_order = 1 invalid_date = 2 invalid_hours = 3 invalid_count = 4 unknown_mode = 5 OTHERS = 6. ev_subrc = sy-subrc. ENDMETHOD. METHOD eco_base_fee. call( EXPORTING iv_order_no = `A1` iv_move_date = '20250101' iv_work_hours = 3 iv_box_count = 0 iv_calc_mode = `ECO` IMPORTING ev_fee = DATA(lv_fee) ev_msg = DATA(lv_msg) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 135 ) act = lv_fee ). cl_abap_unit_assert=>assert_equals( exp = `OK` act = lv_msg ). ENDMETHOD. METHOD std_base_fee. call( EXPORTING iv_order_no = `A2` iv_move_date = '20250201' iv_work_hours = 2 iv_box_count = 0 iv_calc_mode = `STD` IMPORTING ev_fee = DATA(lv_fee) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 120 ) act = lv_fee ). ENDMETHOD. METHOD box_fee_added. call( EXPORTING iv_order_no = `A3` iv_move_date = '20250201' iv_work_hours = 1 iv_box_count = 4 iv_calc_mode = `STD` IMPORTING ev_fee = DATA(lv_fee) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 66 ) act = lv_fee ). ENDMETHOD. METHOD exp_surcharge. call( EXPORTING iv_order_no = `A4` iv_move_date = '20250201' iv_work_hours = 1 iv_box_count = 2 iv_calc_mode = `EXP` IMPORTING ev_fee = DATA(lv_fee) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '93.6' ) act = lv_fee ). ENDMETHOD. METHOD rounds_half_up. call( EXPORTING iv_order_no = `A5` iv_move_date = '20250201' iv_work_hours = '1.005' iv_box_count = 0 iv_calc_mode = `ECO` IMPORTING ev_fee = DATA(lv_fee) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '45.23' ) act = lv_fee ). ENDMETHOD. METHOD rejects_empty_order. call( EXPORTING iv_order_no = `` iv_move_date = '20250101' iv_work_hours = 1 iv_box_count = 0 iv_calc_mode = `STD` IMPORTING ev_msg = DATA(lv_msg) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = `Order number is missing` act = lv_msg ). ENDMETHOD. METHOD rejects_empty_date. call( EXPORTING iv_order_no = `A6` iv_move_date = '00000000' iv_work_hours = 1 iv_box_count = 0 iv_calc_mode = `STD` IMPORTING ev_msg = DATA(lv_msg) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = `Move date is missing` act = lv_msg ). ENDMETHOD. METHOD rejects_bad_hours. call( EXPORTING iv_order_no = `A7` iv_move_date = '20250101' iv_work_hours = 0 iv_box_count = 0 iv_calc_mode = `STD` IMPORTING ev_msg = DATA(lv_msg) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = `Work hours are not positive` act = lv_msg ). ENDMETHOD. METHOD rejects_negative_boxes. call( EXPORTING iv_order_no = `A8` iv_move_date = '20250101' iv_work_hours = 1 iv_box_count = -1 iv_calc_mode = `STD` IMPORTING ev_msg = DATA(lv_msg) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 4 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = `Box count is negative` act = lv_msg ). ENDMETHOD. METHOD rejects_unknown_mode. call( EXPORTING iv_order_no = `A9` iv_move_date = '20250101' iv_work_hours = 1 iv_box_count = 0 iv_calc_mode = `FIX` IMPORTING ev_msg = DATA(lv_msg) ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 5 act = lv_rc ). cl_abap_unit_assert=>assert_equals( exp = `Calculation mode is unknown` act = lv_msg ). ENDMETHOD. METHOD first_error_wins. call( EXPORTING iv_order_no = `` iv_move_date = '00000000' iv_work_hours = -2 iv_box_count = -1 iv_calc_mode = `FIX` IMPORTING ev_subrc = DATA(lv_rc) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ). ENDMETHOD. ENDCLASS.