CLASS {{p}}t120_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}photo_pricer. METHODS setup. METHODS studio_quote FOR TESTING. METHODS outdoor_quote FOR TESTING. METHODS studio_ignores_distance FOR TESTING. METHODS rounds_up_minutes FOR TESTING. METHODS free_persons FOR TESTING. METHODS crew_fee_large_group FOR TESTING. METHODS photo_rate_at_50 FOR TESTING. METHODS rejects_unknown_session FOR TESTING. METHODS rejects_bad_minutes FOR TESTING. METHODS rejects_bad_persons FOR TESTING. METHODS rejects_bad_photos FOR TESTING. METHODS rejects_outdoor_no_dist FOR TESTING. METHODS build_request IMPORTING iv_session TYPE {{p}}photo_pricer=>ty_session iv_minutes TYPE i iv_persons TYPE i iv_photos TYPE i iv_distance_km TYPE i RETURNING VALUE(rs_request) TYPE {{p}}photo_pricer=>ty_request. METHODS assert_amount IMPORTING iv_expected TYPE i iv_act TYPE {{p}}photo_pricer=>ty_amount iv_msg TYPE string. ENDCLASS. CLASS {{p}}t120_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}photo_pricer( ). ENDMETHOD. METHOD build_request. rs_request = VALUE #( session = iv_session minutes = iv_minutes persons = iv_persons photos = iv_photos distance_km = iv_distance_km ). ENDMETHOD. METHOD assert_amount. cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}photo_pricer=>ty_amount( iv_expected ) act = iv_act msg = iv_msg ). ENDMETHOD. METHOD studio_quote. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 90 iv_persons = 3 iv_photos = 10 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-ok act = ls_quote-reason ). assert_amount( iv_expected = 120 iv_act = ls_quote-time_fee iv_msg = `time fee` ). assert_amount( iv_expected = 10 iv_act = ls_quote-person_fee iv_msg = `person fee` ). assert_amount( iv_expected = 50 iv_act = ls_quote-photo_fee iv_msg = `photo fee` ). assert_amount( iv_expected = 0 iv_act = ls_quote-travel_fee iv_msg = `travel fee` ). assert_amount( iv_expected = 0 iv_act = ls_quote-crew_fee iv_msg = `crew fee` ). assert_amount( iv_expected = 180 iv_act = ls_quote-total iv_msg = `total` ). ENDMETHOD. METHOD outdoor_quote. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-outdoor iv_minutes = 45 iv_persons = 10 iv_photos = 50 iv_distance_km = 20 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-ok act = ls_quote-reason ). assert_amount( iv_expected = 60 iv_act = ls_quote-time_fee iv_msg = `time fee` ). assert_amount( iv_expected = 80 iv_act = ls_quote-person_fee iv_msg = `person fee` ). assert_amount( iv_expected = 200 iv_act = ls_quote-photo_fee iv_msg = `photo fee` ). assert_amount( iv_expected = 55 iv_act = ls_quote-travel_fee iv_msg = `travel fee` ). assert_amount( iv_expected = 40 iv_act = ls_quote-crew_fee iv_msg = `crew fee` ). assert_amount( iv_expected = 435 iv_act = ls_quote-total iv_msg = `total` ). ENDMETHOD. METHOD studio_ignores_distance. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 1 iv_photos = 0 iv_distance_km = 25 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 0 iv_act = ls_quote-travel_fee iv_msg = `travel fee` ). assert_amount( iv_expected = 40 iv_act = ls_quote-total iv_msg = `total` ). ENDMETHOD. METHOD rounds_up_minutes. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 31 iv_persons = 1 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 60 iv_act = ls_quote-time_fee iv_msg = `31 minutes` ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 480 iv_persons = 1 iv_photos = 0 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 640 iv_act = ls_quote-time_fee iv_msg = `480 minutes` ). ENDMETHOD. METHOD free_persons. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 2 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 0 iv_act = ls_quote-person_fee iv_msg = `two persons` ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 5 iv_photos = 0 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 30 iv_act = ls_quote-person_fee iv_msg = `five persons` ). ENDMETHOD. METHOD crew_fee_large_group. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 8 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 0 iv_act = ls_quote-crew_fee iv_msg = `eight persons` ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 9 iv_photos = 0 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 70 iv_act = ls_quote-person_fee iv_msg = `nine persons` ). assert_amount( iv_expected = 40 iv_act = ls_quote-crew_fee iv_msg = `crew fee` ). assert_amount( iv_expected = 150 iv_act = ls_quote-total iv_msg = `total` ). ENDMETHOD. METHOD photo_rate_at_50. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 1 iv_photos = 49 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 245 iv_act = ls_quote-photo_fee iv_msg = `49 photos` ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 30 iv_persons = 1 iv_photos = 50 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). assert_amount( iv_expected = 200 iv_act = ls_quote-photo_fee iv_msg = `50 photos` ). ENDMETHOD. METHOD rejects_unknown_session. DATA(ls_request) = build_request( iv_session = 'WEDDING' iv_minutes = 5 iv_persons = 2 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-session act = ls_quote-reason ). assert_amount( iv_expected = 0 iv_act = ls_quote-total iv_msg = `total` ). ENDMETHOD. METHOD rejects_bad_minutes. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 29 iv_persons = 2 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-minutes act = ls_quote-reason ). assert_amount( iv_expected = 0 iv_act = ls_quote-total iv_msg = `total` ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 481 iv_persons = 2 iv_photos = 0 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-minutes act = ls_quote-reason ). ENDMETHOD. METHOD rejects_bad_persons. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 60 iv_persons = 0 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-persons act = ls_quote-reason ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 60 iv_persons = 21 iv_photos = 0 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-persons act = ls_quote-reason ). ENDMETHOD. METHOD rejects_bad_photos. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 60 iv_persons = 2 iv_photos = 201 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-photos act = ls_quote-reason ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-studio iv_minutes = 60 iv_persons = 2 iv_photos = -1 iv_distance_km = 0 ). ls_quote = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-photos act = ls_quote-reason ). ENDMETHOD. METHOD rejects_outdoor_no_dist. DATA(ls_request) = build_request( iv_session = {{p}}photo_pricer=>c_session-outdoor iv_minutes = 60 iv_persons = 2 iv_photos = 0 iv_distance_km = 0 ). DATA(ls_quote) = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-distance act = ls_quote-reason ). ls_request = build_request( iv_session = {{p}}photo_pricer=>c_session-outdoor iv_minutes = 60 iv_persons = 2 iv_photos = 0 iv_distance_km = 1 ). ls_quote = mo_cut->calculate( ls_request ). cl_abap_unit_assert=>assert_equals( exp = {{p}}photo_pricer=>c_reason-ok act = ls_quote-reason ). assert_amount( iv_expected = 17 iv_act = ls_quote-travel_fee iv_msg = `travel fee` ). ENDMETHOD. ENDCLASS.