String map improvements (#3696)

* string map freeze and UT

* linter

* linter

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Alexander Tsybulsky 2020-08-01 15:52:59 +03:00 committed by GitHub
parent b34f5c36b5
commit c6b4cb1a70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 130 additions and 13 deletions

View File

@ -9,54 +9,58 @@ CLASS zcl_abapgit_string_map DEFINITION
BEGIN OF ty_entry,
k TYPE string,
v TYPE string,
END OF ty_entry,
tty_entries TYPE STANDARD TABLE OF ty_entry WITH KEY k,
END OF ty_entry.
TYPES:
tty_entries TYPE STANDARD TABLE OF ty_entry WITH KEY k.
TYPES:
tts_entries TYPE SORTED TABLE OF ty_entry WITH UNIQUE KEY k.
CLASS-METHODS create
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map.
METHODS get
IMPORTING
iv_key TYPE string
RETURNING
VALUE(rv_val) TYPE string.
METHODS has
IMPORTING
iv_key TYPE string
RETURNING
VALUE(rv_has) TYPE abap_bool.
METHODS set
IMPORTING
iv_key TYPE string
iv_val TYPE string OPTIONAL.
iv_val TYPE string OPTIONAL
RETURNING
VALUE(ro_map) TYPE REF TO zcl_abapgit_string_map
RAISING
zcx_abapgit_exception.
METHODS size
RETURNING
VALUE(rv_size) TYPE i.
METHODS is_empty
RETURNING
VALUE(rv_yes) TYPE abap_bool.
METHODS delete
IMPORTING
iv_key TYPE string.
METHODS clear.
iv_key TYPE string
RAISING
zcx_abapgit_exception.
METHODS clear
RAISING
zcx_abapgit_exception.
METHODS to_abap
CHANGING
!cs_container TYPE any
RAISING
zcx_abapgit_exception.
METHODS freeze.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mt_entries TYPE tts_entries.
DATA mv_read_only TYPE abap_bool.
ENDCLASS.
@ -66,6 +70,9 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
METHOD clear.
IF mv_read_only = abap_true.
zcx_abapgit_exception=>raise( 'Cannot clear. This string map is immutable' ).
ENDIF.
CLEAR mt_entries.
ENDMETHOD.
@ -77,11 +84,20 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
METHOD delete.
IF mv_read_only = abap_true.
zcx_abapgit_exception=>raise( 'Cannot delete. This string map is immutable' ).
ENDIF.
DELETE mt_entries WHERE k = iv_key.
ENDMETHOD.
METHOD freeze.
mv_read_only = abap_true.
ENDMETHOD.
METHOD get.
FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
@ -111,6 +127,10 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
DATA ls_entry LIKE LINE OF mt_entries.
FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
IF mv_read_only = abap_true.
zcx_abapgit_exception=>raise( 'Cannot set. This string map is immutable' ).
ENDIF.
READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = iv_key.
IF sy-subrc IS INITIAL.
<ls_entry>-v = iv_val.
@ -120,6 +140,8 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
INSERT ls_entry INTO TABLE mt_entries.
ENDIF.
ro_map = me.
ENDMETHOD.

View File

@ -0,0 +1,94 @@
CLASS ltcl_sm_test DEFINITION
FINAL
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS simple FOR TESTING RAISING zcx_abapgit_exception.
METHODS freeze FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ltcl_sm_test IMPLEMENTATION.
METHOD simple.
DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
lo_cut = zcl_abapgit_string_map=>create( ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->is_empty( )
exp = abap_true ).
lo_cut->set(
iv_key = 'A'
iv_val = '1' ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->is_empty( )
exp = abap_false ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->has( 'A' )
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->get( 'A' )
exp = '1' ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->has( 'B' )
exp = abap_false ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->get( 'B' )
exp = '' ).
lo_cut->delete( 'A' ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->is_empty( )
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->has( 'A' )
exp = abap_false ).
cl_abap_unit_assert=>assert_equals(
act = lo_cut->get( 'A' )
exp = '' ).
ENDMETHOD.
METHOD freeze.
DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
lo_cut = zcl_abapgit_string_map=>create( ).
lo_cut->set(
iv_key = 'A'
iv_val = '1' )->freeze( ).
TRY.
lo_cut->set(
iv_key = 'B'
iv_val = '2' ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lo_cut->delete( 'A' ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lo_cut->clear( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception.
ENDTRY.
ENDMETHOD.
ENDCLASS.

View File

@ -10,6 +10,7 @@
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>