Skip to content

Instantly share code, notes, and snippets.

@ilyakaznacheev
Last active November 21, 2018 16:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ilyakaznacheev/2ef42ffc597257a1dfb95ef573fc41f0 to your computer and use it in GitHub Desktop.
Save ilyakaznacheev/2ef42ffc597257a1dfb95ef573fc41f0 to your computer and use it in GitHub Desktop.
Taxi ride hancler class test example
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.
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.
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.
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