Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM zkata_restaurant.
- CLASS restaurant DEFINITION.
- PUBLIC SECTION.
- METHODS:
- constructor IMPORTING id TYPE string
- name TYPE string,
- id RETURNING value(return) TYPE string,
- name RETURNING value(return) TYPE string.
- PRIVATE SECTION.
- DATA:
- _id TYPE string,
- _name TYPE string.
- ENDCLASS.
- CLASS restaurant IMPLEMENTATION.
- METHOD constructor.
- _id = id.
- _name = name.
- ENDMETHOD.
- METHOD id.
- return = _id.
- ENDMETHOD.
- METHOD name.
- return = _name.
- ENDMETHOD.
- ENDCLASS.
- INTERFACE restaurant_builder.
- METHODS:
- with_name IMPORTING name TYPE string
- RETURNING value(return) TYPE REF TO restaurant_builder,
- build RETURNING value(return) TYPE REF TO restaurant.
- ENDINTERFACE.
- CLASS in_memory_restaurant_builder DEFINITION FOR TESTING.
- PUBLIC SECTION.
- INTERFACES:
- restaurant_builder.
- METHODS:
- constructor IMPORTING id TYPE string.
- PRIVATE SECTION.
- DATA:
- id TYPE string,
- name TYPE string.
- ENDCLASS.
- CLASS in_memory_restaurant_builder IMPLEMENTATION.
- METHOD constructor.
- me->id = id.
- ENDMETHOD.
- METHOD restaurant_builder~build.
- CREATE OBJECT return
- EXPORTING
- id = id
- name = name.
- ENDMETHOD.
- METHOD restaurant_builder~with_name.
- me->name = name.
- return = me.
- ENDMETHOD.
- ENDCLASS.
- INTERFACE restaurant_store.
- METHODS:
- create RETURNING value(return) TYPE REF TO restaurant_builder,
- save IMPORTING restaurant TYPE REF TO restaurant,
- find_by_id IMPORTING id TYPE string
- RETURNING value(return) TYPE REF TO restaurant.
- ENDINTERFACE.
- CLASS in_memory_restaurant_store DEFINITION FOR TESTING.
- PUBLIC SECTION.
- INTERFACES:
- restaurant_store.
- PRIVATE SECTION.
- TYPES:
- BEGIN OF map_entry_type,
- id TYPE string,
- object TYPE REF TO restaurant,
- END OF map_entry_type,
- map_type TYPE HASHED TABLE OF map_entry_type WITH UNIQUE KEY id.
- DATA:
- incremental_id TYPE i,
- map TYPE map_type.
- ENDCLASS.
- CLASS in_memory_restaurant_store IMPLEMENTATION.
- METHOD restaurant_store~create.
- ADD 1 TO incremental_id.
- CREATE OBJECT return TYPE in_memory_restaurant_builder
- EXPORTING
- id = |{ incremental_id }|.
- ENDMETHOD.
- METHOD restaurant_store~find_by_id.
- DATA entry LIKE LINE OF map.
- READ TABLE map INTO entry WITH KEY id = id.
- return = entry-object.
- ENDMETHOD.
- METHOD restaurant_store~save.
- DATA entry LIKE LINE OF map.
- entry-id = restaurant->id( ).
- entry-object = restaurant.
- DELETE map WHERE id = entry-id.
- INSERT entry INTO TABLE map.
- ENDMETHOD.
- ENDCLASS.
- INTERFACE create_restaurant_request.
- METHODS:
- name RETURNING value(return) TYPE string.
- ENDINTERFACE.
- CLASS create_restaurant_request_stub DEFINITION FOR TESTING.
- PUBLIC SECTION.
- INTERFACES:
- create_restaurant_request.
- METHODS:
- with_name IMPORTING name TYPE string.
- PRIVATE SECTION.
- DATA:
- name TYPE string.
- ENDCLASS.
- CLASS create_restaurant_request_stub IMPLEMENTATION.
- METHOD create_restaurant_request~name.
- return = name.
- ENDMETHOD.
- METHOD with_name.
- me->name = name.
- ENDMETHOD.
- ENDCLASS.
- INTERFACE create_restaurant_receiver.
- METHODS:
- created_with_id IMPORTING id TYPE string,
- send_message IMPORTING id TYPE string.
- ENDINTERFACE.
- CLASS create_restaurant_receiver_spy DEFINITION FOR TESTING.
- PUBLIC SECTION.
- INTERFACES:
- create_restaurant_receiver.
- METHODS:
- id RETURNING value(return) TYPE string,
- has_received_messages IMPORTING message_ids TYPE string_table OPTIONAL
- RETURNING value(return) TYPE abap_bool.
- PRIVATE SECTION.
- DATA:
- restaurant_id TYPE string,
- message_ids TYPE string_table.
- ENDCLASS.
- CLASS create_restaurant_receiver_spy IMPLEMENTATION.
- METHOD create_restaurant_receiver~created_with_id.
- restaurant_id = id.
- ENDMETHOD.
- METHOD create_restaurant_receiver~send_message.
- APPEND id TO message_ids.
- ENDMETHOD.
- METHOD id.
- return = restaurant_id.
- ENDMETHOD.
- METHOD has_received_messages.
- IF message_ids IS SUPPLIED.
- return = boolc( message_ids = me->message_ids ).
- ELSE.
- return = boolc( lines( me->message_ids ) > 0 ).
- ENDIF.
- ENDMETHOD.
- ENDCLASS.
- INTERFACE command.
- METHODS:
- execute.
- ENDINTERFACE.
- CLASS create_restaurant_command DEFINITION.
- PUBLIC SECTION.
- INTERFACES:
- command.
- METHODS:
- constructor IMPORTING store TYPE REF TO restaurant_store
- request TYPE REF TO create_restaurant_request
- receiver TYPE REF TO create_restaurant_receiver.
- PRIVATE SECTION.
- DATA:
- store TYPE REF TO restaurant_store,
- request TYPE REF TO create_restaurant_request,
- receiver TYPE REF TO create_restaurant_receiver.
- ENDCLASS.
- CLASS create_restaurant_command IMPLEMENTATION.
- METHOD constructor.
- me->store = store.
- me->request = request.
- me->receiver = receiver.
- ENDMETHOD.
- METHOD command~execute.
- IF request->name( ) IS INITIAL.
- receiver->send_message( 'EMPTY_NAME' ).
- ELSE.
- DATA restaurant TYPE REF TO restaurant.
- restaurant = store->create( )->with_name( request->name( ) )->build( ).
- store->save( restaurant ).
- receiver->created_with_id( restaurant->id( ) ).
- ENDIF.
- ENDMETHOD.
- ENDCLASS.
- CLASS restaurant_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT CREATE PRIVATE FINAL.
- PRIVATE SECTION.
- DATA:
- store TYPE REF TO restaurant_store,
- request_stub TYPE REF TO create_restaurant_request_stub,
- receiver_spy TYPE REF TO create_restaurant_receiver_spy,
- command TYPE REF TO command.
- METHODS:
- setup,
- simple_creation FOR TESTING,
- creating_mutiple FOR TESTING,
- creating_with_empty_name FOR TESTING.
- ENDCLASS.
- CLASS restaurant_test IMPLEMENTATION.
- METHOD setup.
- CREATE OBJECT:
- store TYPE in_memory_restaurant_store,
- request_stub,
- receiver_spy,
- command TYPE create_restaurant_command
- EXPORTING
- store = store
- request = request_stub
- receiver = receiver_spy.
- ENDMETHOD.
- METHOD simple_creation.
- request_stub->with_name( 'Restaurant name' ).
- command->execute( ).
- cl_abap_unit_assert=>assert_equals( exp = 'Restaurant name'
- act = store->find_by_id( receiver_spy->id( ) )->name( ) ).
- cl_abap_unit_assert=>assert_false( receiver_spy->has_received_messages( ) ).
- ENDMETHOD.
- METHOD creating_mutiple.
- request_stub->with_name( 'First name' ).
- command->execute( ).
- request_stub->with_name( 'Restaurant name' ).
- command->execute( ).
- DATA restaurant_id TYPE string.
- restaurant_id = receiver_spy->id( ).
- request_stub->with_name( 'Second name' ).
- command->execute( ).
- cl_abap_unit_assert=>assert_equals( exp = 'Restaurant name'
- act = store->find_by_id( restaurant_id )->name( ) ).
- ENDMETHOD.
- METHOD creating_with_empty_name.
- request_stub->with_name( '' ).
- command->execute( ).
- cl_abap_unit_assert=>assert_not_bound( store->find_by_id( receiver_spy->id( ) ) ).
- DATA message_ids TYPE string_table.
- APPEND 'EMPTY_NAME' TO message_ids.
- cl_abap_unit_assert=>assert_true( receiver_spy->has_received_messages( message_ids ) ).
- ENDMETHOD.
- ENDCLASS.
Advertisement
Add Comment
Please, Sign In to add comment