CLASS {{p}}t14_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES: BEGIN OF ty_result, time_fee TYPE decfloat34, distance_fee TYPE decfloat34, surcharge TYPE decfloat34, discount TYPE decfloat34, total TYPE decfloat34, END OF ty_result. METHODS price IMPORTING iv_class TYPE string iv_minutes TYPE i iv_km TYPE i iv_member TYPE abap_bool DEFAULT abap_false iv_weekend TYPE abap_bool DEFAULT abap_false EXPORTING es_result TYPE ty_result ev_subrc TYPE sysubrc. METHODS time_fee_blocks FOR TESTING. METHODS distance_fee_free_km FOR TESTING. METHODS weekend_surcharge FOR TESTING. METHODS weekday_no_surcharge FOR TESTING. METHODS member_discount FOR TESTING. METHODS minimum_total FOR TESTING. METHODS minimum_total_member FOR TESTING. METHODS invalid_duration FOR TESTING. METHODS invalid_distance FOR TESTING. METHODS invalid_class FOR TESTING. ENDCLASS. CLASS {{p}}t14_hidden IMPLEMENTATION. METHOD price. CLEAR es_result. CALL FUNCTION '{{P}}RENT_PRICE' EXPORTING iv_vehicle_class = iv_class iv_minutes = iv_minutes iv_km = iv_km iv_member = iv_member iv_weekend = iv_weekend IMPORTING ev_time_fee = es_result-time_fee ev_distance_fee = es_result-distance_fee ev_surcharge = es_result-surcharge ev_discount = es_result-discount ev_total = es_result-total EXCEPTIONS invalid_duration = 1 invalid_distance = 2 invalid_class = 3 OTHERS = 4. ev_subrc = sy-subrc. ENDMETHOD. METHOD time_fee_blocks. price( EXPORTING iv_class = `S` iv_minutes = 15 iv_km = 0 IMPORTING es_result = DATA(ls_15) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 3 ) act = ls_15-time_fee ). price( EXPORTING iv_class = `S` iv_minutes = 16 iv_km = 0 IMPORTING es_result = DATA(ls_16) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 6 ) act = ls_16-time_fee ). price( EXPORTING iv_class = `L` iv_minutes = 61 iv_km = 0 IMPORTING es_result = DATA(ls_61) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 40 ) act = ls_61-time_fee ). ENDMETHOD. METHOD distance_fee_free_km. price( EXPORTING iv_class = `L` iv_minutes = 60 iv_km = 10 IMPORTING es_result = DATA(ls_free) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = ls_free-distance_fee ). price( EXPORTING iv_class = `L` iv_minutes = 60 iv_km = 14 IMPORTING es_result = DATA(ls_paid) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 1 ) act = ls_paid-distance_fee ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 33 ) act = ls_paid-total ). ENDMETHOD. METHOD weekend_surcharge. price( EXPORTING iv_class = `M` iv_minutes = 30 iv_km = 0 iv_weekend = abap_true IMPORTING es_result = DATA(ls) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '2.50' ) act = ls-surcharge ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '12.50' ) act = ls-total ). ENDMETHOD. METHOD weekday_no_surcharge. price( EXPORTING iv_class = `M` iv_minutes = 30 iv_km = 0 IMPORTING es_result = DATA(ls) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = ls-surcharge ). ENDMETHOD. METHOD member_discount. " 6.50 * 15 % = 0.975 -> 0.98 price( EXPORTING iv_class = `M` iv_minutes = 15 iv_km = 11 iv_weekend = abap_true iv_member = abap_true IMPORTING es_result = DATA(ls_half) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '0.98' ) act = ls_half-discount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '5.52' ) act = ls_half-total ). " 10.75 * 15 % = 1.6125 -> 1.61 price( EXPORTING iv_class = `M` iv_minutes = 30 iv_km = 13 iv_member = abap_true IMPORTING es_result = DATA(ls_round) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.61' ) act = ls_round-discount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '9.14' ) act = ls_round-total ). " 7.50 * 15 % = 1.125 -> 1.13 price( EXPORTING iv_class = `S` iv_minutes = 15 iv_km = 28 iv_member = abap_true IMPORTING es_result = DATA(ls_up) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.13' ) act = ls_up-discount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '6.37' ) act = ls_up-total ). ENDMETHOD. METHOD minimum_total. price( EXPORTING iv_class = `S` iv_minutes = 15 iv_km = 0 IMPORTING es_result = DATA(ls) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 3 ) act = ls-time_fee ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = ls-discount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 5 ) act = ls-total ). ENDMETHOD. METHOD minimum_total_member. price( EXPORTING iv_class = `S` iv_minutes = 15 iv_km = 0 iv_member = abap_true IMPORTING es_result = DATA(ls) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '0.45' ) act = ls-discount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 5 ) act = ls-total ). ENDMETHOD. METHOD invalid_duration. price( EXPORTING iv_class = `S` iv_minutes = 0 iv_km = 0 IMPORTING ev_subrc = DATA(lv_subrc) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_subrc ). ENDMETHOD. METHOD invalid_distance. price( EXPORTING iv_class = `S` iv_minutes = 15 iv_km = -1 IMPORTING ev_subrc = DATA(lv_subrc) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_subrc ). ENDMETHOD. METHOD invalid_class. price( EXPORTING iv_class = `X` iv_minutes = 15 iv_km = 0 IMPORTING ev_subrc = DATA(lv_subrc) ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_subrc ). ENDMETHOD. ENDCLASS.