html event abstraction, phase 5 - case insensitive query and form_data (#4007)

* case-insensitive string map

* refactor gui_event and its UTs

* remove query uppercased in pages

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Alexander Tsybulsky 2020-10-11 11:47:37 +03:00 committed by GitHub
parent 45bc9ed91d
commit 4b6c424465
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 138 additions and 108 deletions

View File

@ -16,9 +16,7 @@ CLASS zcl_abapgit_gui_event DEFINITION
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
DATA mo_query TYPE REF TO zcl_abapgit_string_map. DATA mo_query TYPE REF TO zcl_abapgit_string_map.
DATA mo_query_upper_cased TYPE REF TO zcl_abapgit_string_map.
DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
DATA mo_form_data_upper_cased TYPE REF TO zcl_abapgit_string_map.
METHODS fields_to_map METHODS fields_to_map
IMPORTING IMPORTING
@ -28,17 +26,6 @@ CLASS zcl_abapgit_gui_event DEFINITION
RAISING RAISING
zcx_abapgit_exception. zcx_abapgit_exception.
METHODS fields_to_map_macro
IMPORTING
it_fields TYPE tihttpnvp
iv_upper_cased TYPE abap_bool
CHANGING
co_string_map_lower TYPE REF TO zcl_abapgit_string_map
co_string_map_upper TYPE REF TO zcl_abapgit_string_map
co_string_map_return TYPE REF TO zcl_abapgit_string_map
RAISING
zcx_abapgit_exception.
ENDCLASS. ENDCLASS.
@ -59,7 +46,7 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION.
METHOD fields_to_map. METHOD fields_to_map.
FIELD-SYMBOLS <ls_field> LIKE LINE OF it_fields. FIELD-SYMBOLS <ls_field> LIKE LINE OF it_fields.
CREATE OBJECT ro_string_map. CREATE OBJECT ro_string_map EXPORTING iv_case_insensitive = abap_true.
LOOP AT it_fields ASSIGNING <ls_field>. LOOP AT it_fields ASSIGNING <ls_field>.
ro_string_map->set( ro_string_map->set(
iv_key = <ls_field>-name iv_key = <ls_field>-name
@ -68,53 +55,26 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD fields_to_map_macro.
FIELD-SYMBOLS <lo_map> TYPE REF TO zcl_abapgit_string_map.
IF iv_upper_cased = abap_true.
ASSIGN co_string_map_upper TO <lo_map>.
ELSE.
ASSIGN co_string_map_lower TO <lo_map>.
ENDIF.
IF <lo_map> IS NOT BOUND.
<lo_map> = fields_to_map( it_fields ).
<lo_map>->freeze( ).
ENDIF.
co_string_map_return = <lo_map>.
ENDMETHOD.
METHOD zif_abapgit_gui_event~form_data. METHOD zif_abapgit_gui_event~form_data.
fields_to_map_macro( IF mo_form_data IS NOT BOUND.
EXPORTING mo_form_data = fields_to_map(
iv_upper_cased = iv_upper_cased zcl_abapgit_html_action_utils=>parse_post_form_data( zif_abapgit_gui_event~mt_postdata ) ).
it_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( mo_form_data->freeze( ).
it_post_data = zif_abapgit_gui_event~mt_postdata ENDIF.
iv_upper_cased = iv_upper_cased ) ro_string_map = mo_form_data.
CHANGING
co_string_map_upper = mo_form_data_upper_cased
co_string_map_lower = mo_form_data
co_string_map_return = ro_string_map ).
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_gui_event~query. METHOD zif_abapgit_gui_event~query.
fields_to_map_macro( IF mo_query IS NOT BOUND.
EXPORTING mo_query = fields_to_map(
iv_upper_cased = iv_upper_cased zcl_abapgit_html_action_utils=>parse_fields( zif_abapgit_gui_event~mv_getdata ) ).
it_fields = zcl_abapgit_html_action_utils=>parse_fields( mo_query->freeze( ).
iv_string = zif_abapgit_gui_event~mv_getdata ENDIF.
iv_upper_cased = iv_upper_cased ) ro_string_map = mo_query.
CHANGING
co_string_map_upper = mo_query_upper_cased
co_string_map_lower = mo_query
co_string_map_return = ro_string_map ).
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -6,18 +6,20 @@ CLASS ltcl_event DEFINITION
PRIVATE SECTION. PRIVATE SECTION.
METHODS query_wrong_data FOR TESTING RAISING zcx_abapgit_exception.
METHODS form_wrong_data FOR TESTING RAISING zcx_abapgit_exception.
METHODS query FOR TESTING RAISING zcx_abapgit_exception. METHODS query FOR TESTING RAISING zcx_abapgit_exception.
METHODS form_data FOR TESTING RAISING zcx_abapgit_exception. METHODS form_data FOR TESTING RAISING zcx_abapgit_exception.
METHODS immutability FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS. ENDCLASS.
CLASS ltcl_event IMPLEMENTATION. CLASS ltcl_event IMPLEMENTATION.
METHOD query. METHOD query_wrong_data.
DATA li_cut TYPE REF TO zif_abapgit_gui_event. DATA li_cut TYPE REF TO zif_abapgit_gui_event.
DATA lo_map TYPE REF TO zcl_abapgit_string_map. DATA lo_map TYPE REF TO zcl_abapgit_string_map.
DATA lo_x TYPE REF TO zcx_abapgit_exception.
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
EXPORTING EXPORTING
@ -29,6 +31,30 @@ CLASS ltcl_event IMPLEMENTATION.
act = lo_map->size( ) act = lo_map->size( )
exp = 0 ). exp = 0 ).
ENDMETHOD.
METHOD form_wrong_data.
DATA li_cut TYPE REF TO zif_abapgit_gui_event.
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
EXPORTING
iv_action = 'XXX'.
lo_map = li_cut->form_data( ).
cl_abap_unit_assert=>assert_equals(
act = lo_map->size( )
exp = 0 ).
ENDMETHOD.
METHOD query.
DATA li_cut TYPE REF TO zif_abapgit_gui_event.
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
DATA lo_x TYPE REF TO zcx_abapgit_exception.
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
EXPORTING EXPORTING
iv_action = 'XXX' iv_action = 'XXX'
@ -39,10 +65,11 @@ CLASS ltcl_event IMPLEMENTATION.
act = li_cut->form_data( )->size( ) act = li_cut->form_data( )->size( )
exp = 0 ). exp = 0 ).
lo_map = li_cut->query( iv_upper_cased = abap_false ). lo_map = li_cut->query( ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_map->size( ) act = lo_map->size( )
exp = 2 ). exp = 2 ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_map->get( 'a' ) act = lo_map->get( 'a' )
exp = 'b' ). exp = 'b' ).
@ -50,10 +77,7 @@ CLASS ltcl_event IMPLEMENTATION.
act = lo_map->get( 'b' ) act = lo_map->get( 'b' )
exp = 'c' ). exp = 'c' ).
lo_map = li_cut->query( iv_upper_cased = abap_true ). " Case insensitivity
cl_abap_unit_assert=>assert_equals(
act = lo_map->size( )
exp = 2 ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_map->get( 'A' ) act = lo_map->get( 'A' )
exp = 'b' ). exp = 'b' ).
@ -61,22 +85,6 @@ CLASS ltcl_event IMPLEMENTATION.
act = lo_map->get( 'B' ) act = lo_map->get( 'B' )
exp = 'c' ). exp = 'c' ).
" Check defaults
cl_abap_unit_assert=>assert_equals(
act = li_cut->query( )->get( 'A' )
exp = 'b' ).
TRY.
lo_map->set(
iv_key = 'x'
iv_val = 'y' ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lo_x.
cl_abap_unit_assert=>assert_char_cp(
act = lo_x->get_text( )
exp = '*immutable*' ).
ENDTRY.
ENDMETHOD. ENDMETHOD.
METHOD form_data. METHOD form_data.
@ -86,15 +94,6 @@ CLASS ltcl_event IMPLEMENTATION.
DATA lo_x TYPE REF TO zcx_abapgit_exception. DATA lo_x TYPE REF TO zcx_abapgit_exception.
DATA lt_postdata TYPE cnht_post_data_tab. DATA lt_postdata TYPE cnht_post_data_tab.
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
EXPORTING
iv_action = 'XXX'.
lo_map = li_cut->form_data( ).
cl_abap_unit_assert=>assert_equals(
act = lo_map->size( )
exp = 0 ).
APPEND 'a=b&b=c' TO lt_postdata. APPEND 'a=b&b=c' TO lt_postdata.
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
EXPORTING EXPORTING
@ -106,10 +105,11 @@ CLASS ltcl_event IMPLEMENTATION.
act = li_cut->query( )->size( ) act = li_cut->query( )->size( )
exp = 0 ). exp = 0 ).
lo_map = li_cut->form_data( iv_upper_cased = abap_false ). lo_map = li_cut->form_data( ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_map->size( ) act = lo_map->size( )
exp = 2 ). exp = 2 ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_map->get( 'a' ) act = lo_map->get( 'a' )
exp = 'b' ). exp = 'b' ).
@ -117,7 +117,7 @@ CLASS ltcl_event IMPLEMENTATION.
act = lo_map->get( 'b' ) act = lo_map->get( 'b' )
exp = 'c' ). exp = 'c' ).
lo_map = li_cut->form_data( iv_upper_cased = abap_true ). " Case insensitivity
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_map->size( ) act = lo_map->size( )
exp = 2 ). exp = 2 ).
@ -128,13 +128,31 @@ CLASS ltcl_event IMPLEMENTATION.
act = lo_map->get( 'B' ) act = lo_map->get( 'B' )
exp = 'c' ). exp = 'c' ).
" Check defaults ENDMETHOD.
cl_abap_unit_assert=>assert_equals(
act = li_cut->form_data( )->get( 'a' ) METHOD immutability.
exp = 'b' ).
DATA li_cut TYPE REF TO zif_abapgit_gui_event.
DATA lo_x TYPE REF TO zcx_abapgit_exception.
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
EXPORTING
iv_getdata = 'a=b&b=c'
iv_action = 'XXX'.
TRY. TRY.
lo_map->set( li_cut->form_data( )->set(
iv_key = 'x'
iv_val = 'y' ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lo_x.
cl_abap_unit_assert=>assert_char_cp(
act = lo_x->get_text( )
exp = '*immutable*' ).
ENDTRY.
TRY.
li_cut->query( )->set(
iv_key = 'x' iv_key = 'x'
iv_val = 'y' ). iv_val = 'y' ).
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
@ -145,4 +163,5 @@ CLASS ltcl_event IMPLEMENTATION.
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -7,16 +7,12 @@ INTERFACE zif_abapgit_gui_event
DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services READ-ONLY. DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services READ-ONLY.
METHODS query METHODS query
IMPORTING
iv_upper_cased TYPE abap_bool DEFAULT abap_true
RETURNING RETURNING
VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
RAISING RAISING
zcx_abapgit_exception. zcx_abapgit_exception.
METHODS form_data METHODS form_data
IMPORTING
iv_upper_cased TYPE abap_bool DEFAULT abap_false
RETURNING RETURNING
VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
RAISING RAISING

View File

@ -56,7 +56,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION.
DATA lo_map TYPE REF TO zcl_abapgit_string_map. DATA lo_map TYPE REF TO zcl_abapgit_string_map.
lo_map = ii_event->form_data( iv_upper_cased = abap_true ). lo_map = ii_event->form_data( ).
rs_content-type = lo_map->get( 'TYPE' ). rs_content-type = lo_map->get( 'TYPE' ).
rs_content-value = lo_map->get( 'VALUE' ). rs_content-value = lo_map->get( 'VALUE' ).
rs_content-data_str = lo_map->get( 'XMLDATA' ). rs_content-data_str = lo_map->get( 'XMLDATA' ).

View File

@ -181,7 +181,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION.
DATA lo_map TYPE REF TO zcl_abapgit_string_map. DATA lo_map TYPE REF TO zcl_abapgit_string_map.
lo_map = ii_event->form_data( iv_upper_cased = abap_true ). lo_map = ii_event->form_data( ).
lo_map->to_abap( CHANGING cs_container = rs_commit ). lo_map->to_abap( CHANGING cs_container = rs_commit ).
REPLACE ALL OCCURRENCES REPLACE ALL OCCURRENCES
OF zif_abapgit_definitions=>c_crlf OF zif_abapgit_definitions=>c_crlf

View File

@ -94,7 +94,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_actions-select. WHEN c_actions-select.
lv_key = ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ). lv_key = ii_event->query( )->get( 'KEY' ).
zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ). zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ).
TRY. TRY.
@ -134,7 +134,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
WHEN zif_abapgit_definitions=>c_action-repo_settings. WHEN zif_abapgit_definitions=>c_action-repo_settings.
lv_key = ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ). lv_key = ii_event->query( )->get( 'KEY' ).
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_sett CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_sett
EXPORTING EXPORTING
io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).

View File

@ -120,7 +120,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION.
FIELD-SYMBOLS: FIELD-SYMBOLS:
<ls_conflict> TYPE zif_abapgit_definitions=>ty_merge_conflict. <ls_conflict> TYPE zif_abapgit_definitions=>ty_merge_conflict.
lv_merge_content = ii_event->form_data( iv_upper_cased = abap_true )->get( 'MERGE_CONTENT' ). lv_merge_content = ii_event->form_data( )->get( 'MERGE_CONTENT' ).
REPLACE ALL OCCURRENCES REPLACE ALL OCCURRENCES
OF zif_abapgit_definitions=>c_crlf IN lv_merge_content WITH zif_abapgit_definitions=>c_newline. OF zif_abapgit_definitions=>c_crlf IN lv_merge_content WITH zif_abapgit_definitions=>c_newline.

View File

@ -1177,7 +1177,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW IMPLEMENTATION.
WHEN zif_abapgit_definitions=>c_action-go_repo. " Switch to another repo WHEN zif_abapgit_definitions=>c_action-go_repo. " Switch to another repo
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_view CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_view
EXPORTING EXPORTING
iv_key = |{ ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ) }|. iv_key = |{ ii_event->query( )->get( 'KEY' ) }|.
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
WHEN c_actions-toggle_hide_files. " Toggle file diplay WHEN c_actions-toggle_hide_files. " Toggle file diplay

View File

@ -609,7 +609,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
zcl_abapgit_path=>split_file_location( zcl_abapgit_path=>split_file_location(
EXPORTING EXPORTING
iv_fullpath = <ls_item>-k iv_fullpath = to_lower( <ls_item>-k ) " filename is lower cased
IMPORTING IMPORTING
ev_path = ls_file-path ev_path = ls_file-path
ev_filename = ls_file-filename ). ev_filename = ls_file-filename ).

View File

@ -14,9 +14,13 @@ CLASS zcl_abapgit_string_map DEFINITION
ty_entries TYPE SORTED TABLE OF ty_entry WITH UNIQUE KEY k. ty_entries TYPE SORTED TABLE OF ty_entry WITH UNIQUE KEY k.
CLASS-METHODS create CLASS-METHODS create
IMPORTING
iv_case_insensitive TYPE abap_bool DEFAULT abap_false
RETURNING RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map. VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map.
METHODS constructor. METHODS constructor
IMPORTING
iv_case_insensitive TYPE abap_bool DEFAULT abap_false.
METHODS get METHODS get
IMPORTING IMPORTING
iv_key TYPE string iv_key TYPE string
@ -67,6 +71,7 @@ CLASS zcl_abapgit_string_map DEFINITION
PRIVATE SECTION. PRIVATE SECTION.
DATA mv_read_only TYPE abap_bool. DATA mv_read_only TYPE abap_bool.
DATA mv_is_strict TYPE abap_bool. DATA mv_is_strict TYPE abap_bool.
DATA mv_case_insensitive TYPE abap_bool.
ENDCLASS. ENDCLASS.
@ -85,11 +90,14 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
METHOD constructor. METHOD constructor.
mv_is_strict = abap_true. mv_is_strict = abap_true.
mv_case_insensitive = iv_case_insensitive.
ENDMETHOD. ENDMETHOD.
METHOD create. METHOD create.
CREATE OBJECT ro_instance. CREATE OBJECT ro_instance
EXPORTING
iv_case_insensitive = iv_case_insensitive.
ENDMETHOD. ENDMETHOD.
@ -111,8 +119,16 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
METHOD get. METHOD get.
DATA lv_key LIKE iv_key.
FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries. FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = iv_key.
IF mv_case_insensitive = abap_true.
lv_key = to_upper( iv_key ).
ELSE.
lv_key = iv_key.
ENDIF.
READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = lv_key.
IF sy-subrc IS INITIAL. IF sy-subrc IS INITIAL.
rv_val = <ls_entry>-v. rv_val = <ls_entry>-v.
ENDIF. ENDIF.
@ -135,6 +151,7 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
METHOD set. METHOD set.
DATA lv_key LIKE iv_key.
DATA ls_entry LIKE LINE OF mt_entries. DATA ls_entry LIKE LINE OF mt_entries.
FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries. FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
@ -142,11 +159,17 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
zcx_abapgit_exception=>raise( 'Cannot set. This string map is immutable' ). zcx_abapgit_exception=>raise( 'Cannot set. This string map is immutable' ).
ENDIF. ENDIF.
READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = iv_key. IF mv_case_insensitive = abap_true.
lv_key = to_upper( iv_key ).
ELSE.
lv_key = iv_key.
ENDIF.
READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = lv_key.
IF sy-subrc IS INITIAL. IF sy-subrc IS INITIAL.
<ls_entry>-v = iv_val. <ls_entry>-v = iv_val.
ELSE. ELSE.
ls_entry-k = iv_key. ls_entry-k = lv_key.
ls_entry-v = iv_val. ls_entry-v = iv_val.
INSERT ls_entry INTO TABLE mt_entries. INSERT ls_entry INTO TABLE mt_entries.
ENDIF. ENDIF.

View File

@ -15,6 +15,7 @@ CLASS ltcl_sm_test DEFINITION
METHODS simple FOR TESTING RAISING zcx_abapgit_exception. METHODS simple FOR TESTING RAISING zcx_abapgit_exception.
METHODS freeze FOR TESTING RAISING zcx_abapgit_exception. METHODS freeze FOR TESTING RAISING zcx_abapgit_exception.
METHODS strict FOR TESTING RAISING zcx_abapgit_exception. METHODS strict FOR TESTING RAISING zcx_abapgit_exception.
METHODS case_insensitive FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS. ENDCLASS.
@ -143,4 +144,35 @@ CLASS ltcl_sm_test IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD case_insensitive.
DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
lo_cut = zcl_abapgit_string_map=>create( iv_case_insensitive = abap_true ).
lo_cut->set(
iv_key = 'A'
iv_val = 'avalue' ).
lo_cut->set(
iv_key = 'b'
iv_val = 'bvalue' ).
cl_abap_unit_assert=>assert_equals(
exp = 'avalue'
act = lo_cut->get( 'A' ) ).
cl_abap_unit_assert=>assert_equals(
exp = 'avalue'
act = lo_cut->get( 'a' ) ).
cl_abap_unit_assert=>assert_equals(
exp = 'bvalue'
act = lo_cut->get( 'B' ) ).
cl_abap_unit_assert=>assert_equals(
exp = 'bvalue'
act = lo_cut->get( 'b' ) ).
ENDMETHOD.
ENDCLASS. ENDCLASS.