-
-
Save ilyakaznacheev/2ef42ffc597257a1dfb95ef573fc41f0 to your computer and use it in GitHub Desktop.
Taxi ride hancler class test example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CLASS ltc_ride_handler DEFINITION FOR TESTING | |
DURATION SHORT | |
RISK LEVEL HARMLESS | |
FINAL. | |
PRIVATE SECTION. | |
DATA: | |
go_ride_calculator TYPE REF TO zcl_test_taxi_ride_calculator. | |
METHODS setup. | |
METHODS check_good_ride FOR TESTING RAISING cx_static_check. | |
METHODS check_bad_ride FOR TESTING RAISING cx_static_check. | |
METHODS check_ride_sequence FOR TESTING RAISING cx_static_check. | |
ENDCLASS. | |
CLASS ltc_ride_handler IMPLEMENTATION. | |
METHOD setup. | |
DATA(lo_geo_double) = CAST zif_test_taxi_geo_service( | |
cl_abap_testdouble=>create( 'zif_test_taxi_geo_service' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_geo_double | |
)->ignore_all_parameters( | |
)->returning( 1 ). | |
lo_geo_double->get_path_length( | |
iv_from = VALUE #( ) | |
iv_to = VALUE #( ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_geo_double | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_geo_double->is_path_available( | |
iv_from = VALUE #( ) | |
iv_to = VALUE #( ) | |
). | |
go_ride_calculator = NEW #( | |
iv_minimun_price = 100 | |
iv_meter_cost = 1 | |
io_geo_service = lo_geo_double | |
). | |
ENDMETHOD. | |
METHOD check_good_ride. | |
* create ride mock 1 | |
DATA(lo_ride_1) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_1 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 1 y = 1 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 2 y = 2 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>basic | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = 'test name' | |
). | |
lo_ride_1->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_1 | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_ride_1->request_payment( 1 ). | |
* create ride mock 2 | |
DATA(lo_ride_2) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_2 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 2 y = 2 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 22 y = 22 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>business | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = 'test name 2' | |
). | |
lo_ride_2->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_2 | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_ride_2->request_payment( 1 ). | |
* create ride mock 3 | |
DATA(lo_ride_3) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_3 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 22 y = 22 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 33 y = 3 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>vip | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = 'test name 3' | |
). | |
lo_ride_3->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_3 | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_ride_3->request_payment( 1 ). | |
* create cut instance and execute test | |
DATA(lo_cut_1) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
lo_cut_1->handle_ride( lo_ride_1 ). | |
DATA(lv_act_price_1) = lo_cut_1->get_revenue( ). | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_act_price_1 | |
exp = 100 | |
msg = |Wrong ride price { lv_act_price_1 } but expected { 100 }| | |
). | |
DATA(lo_cut_2) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
lo_cut_2->handle_ride( lo_ride_2 ). | |
DATA(lv_act_price_2) = lo_cut_2->get_revenue( ). | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_act_price_2 | |
exp = 200 | |
msg = |Wrong ride price { lv_act_price_1 } but expected { 200 }| | |
). | |
DATA(lo_cut_3) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
lo_cut_3->handle_ride( lo_ride_3 ). | |
DATA(lv_act_price_3) = lo_cut_3->get_revenue( ). | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_act_price_3 | |
exp = 300 | |
msg = |Wrong ride price { lv_act_price_1 } but expected { 300 }| | |
). | |
ENDMETHOD. | |
METHOD check_bad_ride. | |
DATA: | |
lv_name_1 TYPE string, | |
lv_name_2 TYPE string, | |
lv_name_3 TYPE string, | |
lo_error TYPE REF TO cx_root. | |
DATA(lt_names) = VALUE string_table( | |
( |good passenger| ) | |
( |bad passenger| ) | |
( |ugly passenger| ) | |
). | |
* create ride mock 1 | |
DATA(lo_ride_1) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_1 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 1 y = 1 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 2 y = 2 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>basic | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = lt_names[ 1 ] | |
). | |
lo_ride_1->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_1 | |
)->ignore_all_parameters( | |
)->returning( abap_false ). | |
lo_ride_1->request_payment( 1 ). | |
* create ride mock 2 | |
DATA(lo_ride_2) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_2 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 2 y = 2 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 22 y = 22 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>business | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = lt_names[ 2 ] | |
). | |
lo_ride_2->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_2 | |
)->ignore_all_parameters( | |
)->returning( abap_false ). | |
lo_ride_2->request_payment( 1 ). | |
* create ride mock 3 | |
DATA(lo_ride_3) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_3 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 22 y = 22 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 33 y = 3 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>vip | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = lt_names[ 3 ] | |
). | |
lo_ride_3->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_3 | |
)->ignore_all_parameters( | |
)->returning( abap_false ). | |
lo_ride_3->request_payment( 1 ). | |
* create cut instance and execute test | |
DATA(lo_cut_1) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
TRY. | |
lo_cut_1->handle_ride( lo_ride_1 ). | |
CATCH zcx_taxi_ride_payment_denial INTO lo_error. | |
lv_name_1 = lo_error->get_text( ). | |
ENDTRY. | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_name_1 | |
exp = lt_names[ 1 ] | |
msg = |Wrong error message text { lv_name_1 } but expected { lt_names[ 1 ] }| | |
). | |
DATA(lo_cut_2) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
TRY. | |
lo_cut_2->handle_ride( lo_ride_2 ). | |
CATCH zcx_taxi_ride_payment_denial INTO lo_error. | |
lv_name_2 = lo_error->get_text( ). | |
ENDTRY. | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_name_2 | |
exp = lt_names[ 2 ] | |
msg = |Wrong error message text { lv_name_2 } but expected { lt_names[ 2 ] }| | |
). | |
DATA(lo_cut_3) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
TRY. | |
lo_cut_3->handle_ride( lo_ride_3 ). | |
CATCH zcx_taxi_ride_payment_denial INTO lo_error. | |
lv_name_3 = lo_error->get_text( ). | |
ENDTRY. | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_name_3 | |
exp = lt_names[ 3 ] | |
msg = |Wrong error message text { lv_name_3 } but expected { lt_names[ 3 ] }| | |
). | |
ENDMETHOD. | |
METHOD check_ride_sequence. | |
* create ride mock 1 | |
DATA(lo_ride_1) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_1 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 1 y = 1 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 2 y = 2 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>basic | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = 'test name' | |
). | |
lo_ride_1->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_1 | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_ride_1->request_payment( 1 ). | |
* create ride mock 2 | |
DATA(lo_ride_2) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_2 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 2 y = 2 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 22 y = 22 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>business | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = 'test name 2' | |
). | |
lo_ride_2->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_2 | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_ride_2->request_payment( 1 ). | |
* create ride mock 3 | |
DATA(lo_ride_3) = CAST zif_test_taxi_ride( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_3 | |
)->set_parameter( | |
name = 'ev_from' | |
value = VALUE geo_point( x = 22 y = 22 ) | |
)->set_parameter( | |
name = 'ev_to' | |
value = VALUE geo_point( x = 33 y = 3 ) | |
)->set_parameter( | |
name = 'ev_rate' | |
value = zif_test_taxi_ride=>vip | |
)->set_parameter( | |
name = 'ev_passenger_name' | |
value = 'test name 3' | |
). | |
lo_ride_3->get_info( ). | |
cl_abap_testdouble=>configure_call( | |
lo_ride_3 | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_ride_3->request_payment( 1 ). | |
* create cut instance and execute test | |
DATA(lo_cut) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
lo_cut->handle_ride( lo_ride_1 ). | |
lo_cut->handle_ride( lo_ride_2 ). | |
lo_cut->handle_ride( lo_ride_3 ). | |
DATA(lv_act_price) = lo_cut->get_revenue( ). | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_act_price | |
exp = 600 | |
msg = |Wrong ride price { lv_act_price } but expected { 600 }| | |
). | |
ENDMETHOD. | |
ENDCLASS. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CLASS ltc_ride_handler_tab DEFINITION FOR TESTING | |
DURATION SHORT | |
RISK LEVEL HARMLESS | |
FINAL. | |
PRIVATE SECTION. | |
TYPES: | |
BEGIN OF ts_params, | |
name TYPE abap_parmname, | |
value TYPE REF TO data, | |
END OF ts_params, | |
BEGIN OF ts_test_case, | |
number TYPE i, | |
params TYPE TABLE OF ts_params WITH DEFAULT KEY, | |
object TYPE REF TO zif_test_taxi_ride, | |
exp_price TYPE i, | |
END OF ts_test_case, | |
tt_test_case TYPE TABLE OF ts_test_case WITH KEY number. | |
DATA: | |
go_ride_calculator TYPE REF TO zcl_test_taxi_ride_calculator. | |
METHODS setup. | |
METHODS check_ride_list FOR TESTING RAISING cx_static_check. | |
ENDCLASS. | |
CLASS ltc_ride_handler_tab IMPLEMENTATION. | |
METHOD setup. | |
DATA(lo_geo_double) = CAST zif_test_taxi_geo_service( | |
cl_abap_testdouble=>create( 'zif_test_taxi_geo_service' ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_geo_double | |
)->ignore_all_parameters( | |
)->returning( 1 ). | |
lo_geo_double->get_path_length( | |
iv_from = VALUE #( ) | |
iv_to = VALUE #( ) | |
). | |
cl_abap_testdouble=>configure_call( | |
lo_geo_double | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
lo_geo_double->is_path_available( | |
iv_from = VALUE #( ) | |
iv_to = VALUE #( ) | |
). | |
go_ride_calculator = NEW #( | |
iv_minimun_price = 100 | |
iv_meter_cost = 1 | |
io_geo_service = lo_geo_double | |
). | |
ENDMETHOD. | |
METHOD check_ride_list. | |
FIELD-SYMBOLS: | |
<lv_value> TYPE any. | |
* prepare test case table | |
DATA(lt_cases) = VALUE tt_test_case( | |
( | |
number = 1 | |
params = VALUE #( | |
( name = 'ev_from' value = NEW geo_point( x = 2 y = 22 ) ) | |
( name = 'ev_to' value = NEW geo_point( x = 3 y = 33 ) ) | |
( name = 'ev_rate' value = REF #( zif_test_taxi_ride=>basic ) ) | |
( name = 'ev_passenger_name' value = REF #( 'test name 1' ) ) | |
) | |
exp_price = '100' | |
) | |
( | |
number = 2 | |
params = VALUE #( | |
( name = 'ev_from' value = NEW geo_point( x = 2 y = 22 ) ) | |
( name = 'ev_to' value = NEW geo_point( x = 3 y = 33 ) ) | |
( name = 'ev_rate' value = REF #( zif_test_taxi_ride=>business ) ) | |
( name = 'ev_passenger_name' value = REF #( 'test name 2' ) ) | |
) | |
exp_price = '200' | |
) | |
( | |
number = 3 | |
params = VALUE #( | |
( name = 'ev_from' value = NEW geo_point( x = 2 y = 22 ) ) | |
( name = 'ev_to' value = NEW geo_point( x = 3 y = 33 ) ) | |
( name = 'ev_rate' value = REF #( zif_test_taxi_ride=>vip ) ) | |
( name = 'ev_passenger_name' value = REF #( 'test name 3' ) ) | |
) | |
exp_price = '300' | |
) | |
). | |
LOOP AT lt_cases ASSIGNING FIELD-SYMBOL(<ls_case>). | |
* build mock-object | |
<ls_case>-object = CAST #( | |
cl_abap_testdouble=>create( 'zif_test_taxi_ride' ) | |
). | |
* setup first method | |
DATA(lo_conf) = cl_abap_testdouble=>configure_call( <ls_case>-object ). | |
LOOP AT <ls_case>-params ASSIGNING FIELD-SYMBOL(<ls_param>). | |
ASSIGN <ls_param>-value->* TO <lv_value>. | |
CHECK sy-subrc = 0. | |
lo_conf->set_parameter( | |
name = <ls_param>-name | |
value = <lv_value> | |
). | |
ENDLOOP. | |
<ls_case>-object->get_info( ). | |
* setup second method | |
cl_abap_testdouble=>configure_call( | |
<ls_case>-object | |
)->ignore_all_parameters( | |
)->returning( abap_true ). | |
<ls_case>-object->request_payment( 0 ). | |
* create cut instance and execute test | |
DATA(lo_cut) = NEW zcl_test_taxi_ride_handler( go_ride_calculator ). | |
lo_cut->handle_ride( <ls_case>-object ). | |
DATA(lv_act_price) = lo_cut->get_revenue( ). | |
* assert results | |
cl_abap_unit_assert=>assert_equals( | |
act = lv_act_price | |
exp = <ls_case>-exp_price | |
msg = |[{ <ls_case>-number }]: Wrong ride price { lv_act_price } but expected { <ls_case>-exp_price }| | |
). | |
ENDLOOP. | |
ENDMETHOD. | |
ENDCLASS. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CLASS zcl_test_taxi_ride_handler DEFINITION | |
PUBLIC | |
FINAL | |
CREATE PUBLIC . | |
PUBLIC SECTION. | |
METHODS constructor | |
IMPORTING | |
io_ride_calculator TYPE REF TO zcl_test_taxi_ride_calculator. | |
METHODS handle_ride | |
IMPORTING | |
io_ride TYPE REF TO zif_test_taxi_ride | |
RAISING | |
zcx_taxi_ride_payment_denial | |
zcx_taxi_ride_not_possible. | |
METHODS get_revenue | |
RETURNING | |
VALUE(rv_amount) TYPE paymnt. | |
PRIVATE SECTION. | |
DATA: | |
go_ride_calculator TYPE REF TO zcl_test_taxi_ride_calculator, | |
gv_revenue TYPE paymnt. | |
ENDCLASS. | |
CLASS zcl_test_taxi_ride_handler IMPLEMENTATION. | |
METHOD constructor. | |
go_ride_calculator = io_ride_calculator. | |
ENDMETHOD. | |
METHOD handle_ride. | |
io_ride->get_info( | |
IMPORTING | |
ev_from = DATA(lv_from) | |
ev_to = DATA(lv_to) | |
ev_rate = DATA(lv_rate) | |
ev_passenger_name = DATA(lv_name) | |
). | |
DATA(lv_price) = go_ride_calculator->get_ride_price( | |
iv_from = lv_from | |
iv_to = lv_to | |
). | |
* recalculate price with rate chosen | |
DATA(lv_rated_price) = lv_price * SWITCH int1( lv_rate | |
WHEN zif_test_taxi_ride=>basic THEN 1 | |
WHEN zif_test_taxi_ride=>business THEN 2 | |
WHEN zif_test_taxi_ride=>vip THEN 3 | |
). | |
* request payment, if passenger does not want to pay, raise an error | |
IF NOT io_ride->request_payment( iv_ride_cost = CONV #( lv_rated_price ) ). | |
RAISE EXCEPTION TYPE zcx_taxi_ride_payment_denial | |
EXPORTING | |
textid = zcx_taxi_ride_payment_denial=>zcx_taxi_ride_payment_denial | |
passenger_name = lv_name. | |
ENDIF. | |
gv_revenue = gv_revenue + lv_rated_price. | |
ENDMETHOD. | |
METHOD get_revenue. | |
rv_amount = gv_revenue. | |
ENDMETHOD. | |
ENDCLASS. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
INTERFACE zif_test_taxi_ride | |
PUBLIC . | |
TYPES: | |
BEGIN OF ENUM ts_rates, | |
basic, | |
business, | |
vip, | |
END OF ENUM ts_rates. | |
METHODS get_info | |
EXPORTING | |
ev_from TYPE geo_point | |
ev_to TYPE geo_point | |
ev_rate TYPE ts_rates | |
ev_passenger_name TYPE string. | |
METHODS request_payment | |
IMPORTING | |
iv_ride_cost TYPE paymnt | |
RETURNING | |
VALUE(rv_status) TYPE bool. | |
ENDINTERFACE. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment