CLASS {{p}}t14_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. METHODS fee_for IMPORTING iv_km TYPE decfloat34 iv_class TYPE i iv_axles TYPE i RETURNING VALUE(rv_fee) TYPE decfloat34. METHODS is_rejected IMPORTING iv_km TYPE decfloat34 iv_class TYPE i iv_axles TYPE i RETURNING VALUE(rv_rejected) TYPE abap_bool. METHODS fee_two_axles FOR TESTING. METHODS fee_three_axles FOR TESTING. METHODS fee_four_axles FOR TESTING. METHODS fee_five_axles FOR TESTING. METHODS rounding_half_up FOR TESTING. METHODS minimum_fee FOR TESTING. METHODS rejects_negative_km FOR TESTING. METHODS rejects_bad_class FOR TESTING. METHODS rejects_bad_axles FOR TESTING. METHODS func_returns_fee FOR TESTING. METHODS func_rejects_input FOR TESTING. ENDCLASS. CLASS {{p}}t14_hidden IMPLEMENTATION. METHOD fee_for. TRY. rv_fee = NEW {{p}}toll_calc( )->calculate( iv_distance_km = iv_km iv_weight_class = iv_class iv_axles = iv_axles ). CATCH cx_abap_invalid_value. rv_fee = -1. ENDTRY. ENDMETHOD. METHOD is_rejected. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = iv_km iv_class = iv_class iv_axles = iv_axles ). rv_rejected = boolc( lv_fee < 0 ). ENDMETHOD. METHOD fee_two_axles. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = 100 iv_class = 1 iv_axles = 2 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '10.00' ) act = lv_fee ). ENDMETHOD. METHOD fee_three_axles. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = 100 iv_class = 2 iv_axles = 3 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '14.70' ) act = lv_fee ). ENDMETHOD. METHOD fee_four_axles. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = 100 iv_class = 3 iv_axles = 4 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '19.80' ) act = lv_fee ). ENDMETHOD. METHOD fee_five_axles. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = 100 iv_class = 4 iv_axles = 5 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '25.30' ) act = lv_fee ). ENDMETHOD. METHOD rounding_half_up. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = 25 iv_class = 1 iv_axles = 3 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '2.63' ) act = lv_fee ). ENDMETHOD. METHOD minimum_fee. DATA lv_fee TYPE decfloat34. lv_fee = fee_for( iv_km = 5 iv_class = 1 iv_axles = 2 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ). lv_fee = fee_for( iv_km = 0 iv_class = 1 iv_axles = 2 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ). ENDMETHOD. METHOD rejects_negative_km. DATA lv_rejected TYPE abap_bool. lv_rejected = is_rejected( iv_km = -1 iv_class = 1 iv_axles = 2 ). cl_abap_unit_assert=>assert_true( act = lv_rejected ). ENDMETHOD. METHOD rejects_bad_class. DATA lv_rejected TYPE abap_bool. lv_rejected = is_rejected( iv_km = 100 iv_class = 0 iv_axles = 2 ). cl_abap_unit_assert=>assert_true( act = lv_rejected ). lv_rejected = is_rejected( iv_km = 100 iv_class = 5 iv_axles = 2 ). cl_abap_unit_assert=>assert_true( act = lv_rejected ). ENDMETHOD. METHOD rejects_bad_axles. DATA lv_rejected TYPE abap_bool. lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 1 ). cl_abap_unit_assert=>assert_true( act = lv_rejected ). lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 6 ). cl_abap_unit_assert=>assert_true( act = lv_rejected ). ENDMETHOD. METHOD func_returns_fee. DATA lv_fee TYPE decfloat34. CALL FUNCTION '{{P}}TOLL_FEE' EXPORTING iv_distance_km = 100 iv_weight_class = 3 iv_axles = 4 IMPORTING ev_fee = lv_fee EXCEPTIONS invalid_input = 1 OTHERS = 2. cl_abap_unit_assert=>assert_subrc( exp = 0 ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '19.80' ) act = lv_fee ). ENDMETHOD. METHOD func_rejects_input. DATA lv_fee TYPE decfloat34. CALL FUNCTION '{{P}}TOLL_FEE' EXPORTING iv_distance_km = -1 iv_weight_class = 1 iv_axles = 2 IMPORTING ev_fee = lv_fee EXCEPTIONS invalid_input = 1 OTHERS = 2. cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ). cl_abap_unit_assert=>assert_initial( act = lv_fee ). ENDMETHOD. ENDCLASS.