Support direct longtexts in exceptions (#5592)

* Support direct longtexts in exceptions

as opposed to already supported indirect T100-based longtexts

* Lint

* Remove direct longtext variable support

* Add unit tests for exception longtext

* Add longtext message to language mismatch error

* Fix missing preserve_newline handling

* Adjust longtext display in error message box

- Convert newlines to html line breaks
- Indicate if a longtext is available on hover

* Fix duplicate preserve newline handling

* Adjust exception longtext rendering

Render linebreaks as html paragraphs

* Align error message box buttons to bottom right

so they do not move on hover when a longtext is available

* Refactor exception unit tests

* Skip failing transpiled tests

* Adjust longtext indicator for error message

Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Fabian Lupa 2022-06-05 18:40:34 +02:00 committed by GitHub
parent 2855e7e7bf
commit 1052ce6e85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 499 additions and 334 deletions

View File

@ -191,8 +191,9 @@ CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION.
METHOD check_language.
DATA:
lv_main_language TYPE spras,
lv_error_message TYPE string.
lv_main_language TYPE spras,
lv_error_message TYPE string,
lv_error_longtext TYPE string.
" assumes find_remote_dot_abapgit has been called before
lv_main_language = get_dot_abapgit( )->get_main_language( ).
@ -208,11 +209,14 @@ CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION.
" Feature open in main language only exists if abapGit tcode is present
IF zcl_abapgit_services_abapgit=>get_abapgit_tcode( ) IS INITIAL.
lv_error_message = lv_error_message && | Please logon in main language and retry.|.
lv_error_longtext = |For the Advanced menu option 'Open in Main Language' to be available a transaction code| &&
| must be assigned to report { sy-cprog }.|.
ELSE.
lv_error_message = lv_error_message && | Select 'Advanced' > 'Open in Main Language'|.
ENDIF.
zcx_abapgit_exception=>raise( lv_error_message ).
zcx_abapgit_exception=>raise( iv_text = lv_error_message
iv_longtext = lv_error_longtext ).
ENDIF.

View File

@ -10,11 +10,12 @@ CLASS zcx_abapgit_cancel DEFINITION
IMPORTING
!textid LIKE if_t100_message=>t100key OPTIONAL
!previous LIKE previous OPTIONAL
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
!log TYPE REF TO zif_abapgit_log OPTIONAL
!msgv1 TYPE symsgv OPTIONAL
!msgv2 TYPE symsgv OPTIONAL
!msgv3 TYPE symsgv OPTIONAL
!msgv4 TYPE symsgv OPTIONAL.
!msgv4 TYPE symsgv OPTIONAL
!longtext TYPE csequence OPTIONAL.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
@ -27,13 +28,15 @@ CLASS zcx_abapgit_cancel IMPLEMENTATION.
METHOD constructor ##ADT_SUPPRESS_GENERATION.
super->constructor(
previous = previous
ii_log = ii_log
log = log
msgv1 = msgv1
msgv2 = msgv2
msgv3 = msgv3
msgv4 = msgv4 ).
msgv4 = msgv4
longtext = longtext ).
CLEAR me->textid.
IF textid IS INITIAL.
if_t100_message~t100key = if_t100_message=>default_textid.
ELSE.

View File

@ -913,6 +913,12 @@ div.message-panel {
background-color: hsla(0, 42%, 90%, 1);
}
.message-panel-bar {
position: absolute;
bottom: 10px;
right: 10px;
}
.message-panel-commands {
display: none;
margin-right: 2em;

View File

@ -400,11 +400,14 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
METHOD render_error_message_box.
DATA:
lv_error_text TYPE string,
lv_longtext TYPE string,
lv_program_name TYPE sy-repid,
lv_title TYPE string,
lv_text TYPE string.
lv_error_text TYPE string,
lv_longtext TYPE string,
lt_longtext_paragraphs TYPE string_table,
lv_program_name TYPE sy-repid,
lv_title TYPE string,
lv_text TYPE string.
FIELD-SYMBOLS:
<lv_longtext_paragraph> TYPE string.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
@ -412,25 +415,46 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
lv_error_text = ix_error->get_text( ).
lv_longtext = ix_error->if_message~get_longtext( abap_true ).
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-cause }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
IF lv_longtext IS NOT INITIAL.
lv_error_text = |{ lv_error_text } <span class="emphasis">More...</span>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-system_response }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-cause }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-what_to_do }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-system_response }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-sys_admin }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-what_to_do }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE FIRST OCCURRENCE OF REGEX
|({ zcx_abapgit_exception=>c_section_text-sys_admin }{ cl_abap_char_utilities=>newline })|
IN lv_longtext WITH |<h3>$1</h3>|.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf
IN lv_longtext
WITH cl_abap_char_utilities=>newline.
SPLIT lv_longtext AT cl_abap_char_utilities=>newline INTO TABLE lt_longtext_paragraphs.
CLEAR lv_longtext.
LOOP AT lt_longtext_paragraphs ASSIGNING <lv_longtext_paragraph>.
CONDENSE <lv_longtext_paragraph>.
IF <lv_longtext_paragraph> IS INITIAL.
CONTINUE.
ENDIF.
lv_longtext = |{ lv_longtext }<p>{ <lv_longtext_paragraph> }</p>{ cl_abap_char_utilities=>newline }|.
ENDLOOP.
ENDIF.
ri_html->add( |<div id="message" class="message-panel">| ).
ri_html->add( |{ ri_html->icon( 'exclamation-circle/red' ) } { lv_error_text }| ).
ri_html->add( |<div class="float-right">| ).
ri_html->add( |<div class="message-panel-bar">| ).
ri_html->add_a(
iv_txt = `&#x274c;`
@ -440,7 +464,7 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
ri_html->add( |</div>| ).
ri_html->add( |<div class="float-right message-panel-commands">| ).
ri_html->add( |<div class="message-panel-bar message-panel-commands">| ).
IF ix_error->if_t100_message~t100key-msgid IS NOT INITIAL.

View File

@ -26,18 +26,22 @@ CLASS zcx_abapgit_exception DEFINITION
DATA msgv2 TYPE symsgv READ-ONLY .
DATA msgv3 TYPE symsgv READ-ONLY .
DATA msgv4 TYPE symsgv READ-ONLY .
DATA mt_callstack TYPE abap_callstack READ-ONLY .
DATA mv_longtext TYPE string READ-ONLY.
DATA mt_callstack TYPE abap_callstack READ-ONLY.
DATA mi_log TYPE REF TO zif_abapgit_log READ-ONLY.
"! Raise exception with text
"! @parameter iv_text | Text
"! @parameter ix_previous | Previous exception
"! @parameter ii_log | Log
"! @parameter iv_longtext | Longtext
"! @raising zcx_abapgit_exception | Exception
CLASS-METHODS raise
IMPORTING
!iv_text TYPE clike
!ix_previous TYPE REF TO cx_root OPTIONAL
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
!iv_longtext TYPE csequence OPTIONAL
RAISING
zcx_abapgit_exception .
"! Raise exception with T100 message
@ -50,6 +54,9 @@ CLASS zcx_abapgit_exception DEFINITION
"! @parameter iv_msgv2 | Message variable 2
"! @parameter iv_msgv3 | Message variable 3
"! @parameter iv_msgv4 | Message variable 4
"! @parameter ii_log | Log
"! @parameter ix_previous | Previous exception
"! @parameter iv_longtext | Longtext
"! @raising zcx_abapgit_exception | Exception
CLASS-METHODS raise_t100
IMPORTING
@ -61,22 +68,29 @@ CLASS zcx_abapgit_exception DEFINITION
VALUE(iv_msgv4) TYPE symsgv DEFAULT sy-msgv4
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
!ix_previous TYPE REF TO cx_root OPTIONAL
!iv_longtext TYPE csequence OPTIONAL
RAISING
zcx_abapgit_exception .
"! Raise with text from previous exception
"! @parameter ix_previous | Previous exception
"! @parameter iv_longtext | Longtext
"! @raising zcx_abapgit_exception | Exception
CLASS-METHODS raise_with_text
IMPORTING
!ix_previous TYPE REF TO cx_root
!iv_longtext TYPE csequence OPTIONAL
RAISING
zcx_abapgit_exception .
METHODS constructor
IMPORTING
!textid LIKE if_t100_message=>t100key OPTIONAL
!previous LIKE previous OPTIONAL
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
!log TYPE REF TO zif_abapgit_log OPTIONAL
!msgv1 TYPE symsgv OPTIONAL
!msgv2 TYPE symsgv OPTIONAL
!msgv3 TYPE symsgv OPTIONAL
!msgv4 TYPE symsgv OPTIONAL .
!msgv4 TYPE symsgv OPTIONAL
!longtext TYPE csequence OPTIONAL .
METHODS get_source_position
REDEFINITION .
@ -85,7 +99,7 @@ CLASS zcx_abapgit_exception DEFINITION
PROTECTED SECTION.
PRIVATE SECTION.
CONSTANTS c_generic_error_msg TYPE string VALUE `An error occured (ZCX_ABAPGIT_EXCEPTION)` ##NO_TEXT.
CONSTANTS c_generic_error_msg TYPE string VALUE `An error occured (ZCX_ABAPGIT_EXCEPTION)`.
CLASS-METHODS split_text_to_symsg
IMPORTING
@ -110,11 +124,16 @@ CLASS zcx_abapgit_exception DEFINITION
METHODS replace_section_head_with_text
CHANGING
!cs_itf TYPE tline .
CLASS-METHODS remove_newlines_from_string
IMPORTING
iv_string TYPE string
RETURNING
VALUE(rv_result) TYPE string.
ENDCLASS.
CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
CLASS zcx_abapgit_exception IMPLEMENTATION.
METHOD constructor ##ADT_SUPPRESS_GENERATION.
@ -125,9 +144,11 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
me->msgv2 = msgv2.
me->msgv3 = msgv3.
me->msgv4 = msgv4.
me->mi_log = ii_log.
mi_log = log.
mv_longtext = longtext.
CLEAR me->textid.
IF textid IS INITIAL.
if_t100_message~t100key = if_t100_message=>default_textid.
ELSE.
@ -154,7 +175,7 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
IMPORTING
program_name = program_name
include_name = include_name
source_line = source_line ).
source_line = source_line ).
ENDIF.
ENDMETHOD.
@ -202,15 +223,20 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
METHOD if_message~get_longtext.
DATA: lv_preserve_newlines_handled TYPE abap_bool VALUE abap_false.
result = super->get_longtext( ).
IF if_t100_message~t100key IS NOT INITIAL.
IF mv_longtext IS NOT INITIAL.
result = mv_longtext.
ELSEIF if_t100_message~t100key IS NOT INITIAL.
result = itf_to_string( get_t100_longtext_itf( ) ).
ELSE.
result = super->get_longtext( preserve_newlines ).
lv_preserve_newlines_handled = abap_true.
ENDIF.
IF lv_preserve_newlines_handled = abap_false AND preserve_newlines = abap_false.
result = remove_newlines_from_string( result ).
ENDIF.
ENDMETHOD.
@ -306,7 +332,8 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
raise_t100(
ii_log = ii_log
ix_previous = ix_previous ).
ix_previous = ix_previous
iv_longtext = iv_longtext ).
ENDMETHOD.
@ -328,19 +355,21 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
RAISE EXCEPTION TYPE zcx_abapgit_exception
EXPORTING
textid = ls_t100_key
ii_log = ii_log
log = ii_log
msgv1 = iv_msgv1
msgv2 = iv_msgv2
msgv3 = iv_msgv3
msgv4 = iv_msgv4
previous = ix_previous.
previous = ix_previous
longtext = iv_longtext.
ENDMETHOD.
METHOD raise_with_text.
raise(
iv_text = ix_previous->get_text( )
ix_previous = ix_previous ).
iv_text = ix_previous->get_text( )
ix_previous = ix_previous
iv_longtext = iv_longtext ).
ENDMETHOD.
@ -454,4 +483,13 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION.
rs_msg = ls_msg.
ENDMETHOD.
METHOD remove_newlines_from_string.
rv_result = iv_string.
REPLACE ALL OCCURRENCES OF ` ` && cl_abap_char_utilities=>cr_lf IN rv_result WITH ` `.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN rv_result WITH ` `.
REPLACE ALL OCCURRENCES OF ` ` && cl_abap_char_utilities=>newline IN rv_result WITH ` `.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN rv_result WITH ` `.
ENDMETHOD.
ENDCLASS.

View File

@ -1,304 +1,286 @@
CLASS ltcl_test DEFINITION DEFERRED.
CLASS ltcl_split_text DEFINITION DEFERRED.
CLASS zcx_abapgit_exception DEFINITION LOCAL FRIENDS ltcl_test ltcl_split_text.
CLASS ltcl_test DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
CLASS ltcl_base DEFINITION DEFERRED.
CLASS zcx_abapgit_exception DEFINITION LOCAL FRIENDS ltcl_split_text ltcl_base.
CLASS ltcl_base DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT ABSTRACT.
PUBLIC SECTION.
METHODS:
test_direct_text FOR TESTING,
test_t100_text1 FOR TESTING,
test_t100_text2 FOR TESTING,
test_t100_text3 FOR TESTING,
test_t100_text4 FOR TESTING,
test_t100_text5 FOR TESTING,
test_t100_text6 FOR TESTING,
test_t100_text7 FOR TESTING,
test_t100_text8 FOR TESTING,
test_no_text FOR TESTING.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_t100_message,
msgid TYPE symsgid,
msgno TYPE symsgno,
msgv1 TYPE symsgv,
msgv2 TYPE symsgv,
msgv3 TYPE symsgv,
msgv4 TYPE symsgv,
END OF ty_t100_message.
CLASS-METHODS:
get_exc_text IMPORTING ix_ex TYPE REF TO cx_root
RETURNING VALUE(rv_text) TYPE string,
get_t100_text IMPORTING is_message TYPE ty_t100_message
get_t100_text IMPORTING is_message TYPE symsg
RETURNING VALUE(rv_text) TYPE string.
PROTECTED SECTION.
CLASS-DATA:
BEGIN OF gs_test_data,
text TYPE string VALUE `This is a test error message.`,
empty_text TYPE string VALUE ``,
END OF gs_test_data.
DATA:
mo_cut TYPE REF TO zcx_abapgit_exception,
BEGIN OF ms_given,
text TYPE string,
t100_message TYPE symsg,
longtext TYPE string,
previous_exception TYPE REF TO cx_root,
END OF ms_given.
METHODS:
given_the_text IMPORTING iv_text TYPE csequence,
given_the_longtext IMPORTING iv_longtext TYPE csequence,
given_the_t100_message IMPORTING is_message TYPE symsg,
given_the_previous_exception IMPORTING ix_previous_exception TYPE REF TO cx_root,
when_instantiated_using_raise,
when_instan_using_raise_t100,
when_inst_usng_raise_with_text,
then_the_text_should_equal IMPORTING iv_text TYPE csequence,
then_the_longtext_should_equal IMPORTING iv_longtext TYPE csequence,
then_the_prev_exc_should_equal IMPORTING ix_exception TYPE REF TO cx_root.
PRIVATE SECTION.
CLASS-METHODS:
class_teardown.
METHODS:
teardown.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD test_direct_text.
CONSTANTS: lc_text1 TYPE string VALUE `This is a test error message.`,
lc_text2 TYPE string VALUE ``.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lx_previous TYPE REF TO cx_root.
TRY.
CREATE OBJECT lx_previous TYPE cx_sy_dyn_call_illegal_method
EXPORTING
textid = cx_sy_dyn_call_illegal_method=>private_method
classname = 'CLASS'
methodname = 'METHOD'.
zcx_abapgit_exception=>raise_with_text( lx_previous ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lx_previous->get_text( ) ).
cl_abap_unit_assert=>assert_equals( act = lx_ex->previous
exp = lx_previous ).
ENDTRY.
FREE: lx_ex, lx_previous.
TRY.
zcx_abapgit_exception=>raise( lc_text1 ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lc_text1 ).
ENDTRY.
FREE lx_ex.
TRY.
zcx_abapgit_exception=>raise( lc_text2 ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals(
act = get_exc_text( lx_ex )
exp = zcx_abapgit_exception=>c_generic_error_msg ).
ENDTRY.
FREE lx_ex.
ENDMETHOD.
METHOD test_no_text.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception.
TRY.
zcx_abapgit_exception=>raise( space ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals(
act = get_exc_text( lx_ex )
exp = zcx_abapgit_exception=>c_generic_error_msg ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text1.
CONSTANTS: BEGIN OF lc_msg1,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '001',
msgv1 TYPE symsgv VALUE IS INITIAL,
msgv2 TYPE symsgv VALUE IS INITIAL,
msgv3 TYPE symsgv VALUE IS INITIAL,
msgv4 TYPE symsgv VALUE IS INITIAL,
END OF lc_msg1.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg1 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text2.
CONSTANTS: BEGIN OF lc_msg2,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '001',
msgv1 TYPE symsgv VALUE 'Variable 1',
msgv2 TYPE symsgv VALUE IS INITIAL,
msgv3 TYPE symsgv VALUE IS INITIAL,
msgv4 TYPE symsgv VALUE IS INITIAL,
END OF lc_msg2.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg2 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text3.
CONSTANTS: BEGIN OF lc_msg3,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '001',
msgv1 TYPE symsgv VALUE 'Variable 1',
msgv2 TYPE symsgv VALUE 'Variable 2',
msgv3 TYPE symsgv VALUE IS INITIAL,
msgv4 TYPE symsgv VALUE IS INITIAL,
END OF lc_msg3.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg3 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text4.
CONSTANTS: BEGIN OF lc_msg4,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '001',
msgv1 TYPE symsgv VALUE 'Variable 1',
msgv2 TYPE symsgv VALUE 'Variable 2',
msgv3 TYPE symsgv VALUE 'Variable 3',
msgv4 TYPE symsgv VALUE IS INITIAL,
END OF lc_msg4.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg4 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text5.
CONSTANTS: BEGIN OF lc_msg5,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '001',
msgv1 TYPE symsgv VALUE 'Variable 1',
msgv2 TYPE symsgv VALUE 'Variable 2',
msgv3 TYPE symsgv VALUE 'Variable 3',
msgv4 TYPE symsgv VALUE 'Variable 4',
END OF lc_msg5.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg5 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text6.
CONSTANTS: BEGIN OF lc_msg6,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '003',
msgv1 TYPE symsgv VALUE 'Variable 1',
msgv2 TYPE symsgv VALUE 'Variable 2',
msgv3 TYPE symsgv VALUE 'Variable 3',
msgv4 TYPE symsgv VALUE 'Variable 4',
END OF lc_msg6.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg6 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text7.
CONSTANTS: BEGIN OF lc_msg7,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '003',
msgv1 TYPE symsgv VALUE IS INITIAL,
msgv2 TYPE symsgv VALUE IS INITIAL,
msgv3 TYPE symsgv VALUE IS INITIAL,
msgv4 TYPE symsgv VALUE IS INITIAL,
END OF lc_msg7.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg7 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD test_t100_text8.
CONSTANTS: BEGIN OF lc_msg8,
msgid TYPE symsgid VALUE '00',
msgno TYPE symsgno VALUE '002',
msgv1 TYPE symsgv VALUE IS INITIAL,
msgv2 TYPE symsgv VALUE IS INITIAL,
msgv3 TYPE symsgv VALUE IS INITIAL,
msgv4 TYPE symsgv VALUE IS INITIAL,
END OF lc_msg8.
DATA: lx_ex TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string.
TRY.
lv_text = get_t100_text( lc_msg8 ).
zcx_abapgit_exception=>raise_t100( ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO lx_ex.
cl_abap_unit_assert=>assert_equals( act = get_exc_text( lx_ex )
exp = lv_text ).
ENDTRY.
ENDMETHOD.
METHOD get_exc_text.
rv_text = ix_ex->get_text( ).
ENDMETHOD.
CLASS ltcl_base IMPLEMENTATION.
METHOD get_t100_text.
MESSAGE ID is_message-msgid TYPE 'S' NUMBER is_message-msgno
WITH is_message-msgv1 is_message-msgv2 is_message-msgv3 is_message-msgv4
INTO rv_text.
ENDMETHOD.
METHOD given_the_text.
ms_given-text = iv_text.
ENDMETHOD.
METHOD given_the_longtext.
ms_given-longtext = iv_longtext.
ENDMETHOD.
METHOD given_the_t100_message.
ms_given-t100_message = is_message.
ENDMETHOD.
METHOD given_the_previous_exception.
ms_given-previous_exception = ix_previous_exception.
ENDMETHOD.
METHOD when_instantiated_using_raise.
TRY.
zcx_abapgit_exception=>raise( iv_text = ms_given-text
ix_previous = ms_given-previous_exception
iv_longtext = ms_given-longtext ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO mo_cut ##NEEDED.
ENDTRY.
ENDMETHOD.
METHOD when_instan_using_raise_t100.
TRY.
zcx_abapgit_exception=>raise_t100( iv_msgid = ms_given-t100_message-msgid
iv_msgno = ms_given-t100_message-msgno
iv_msgv1 = ms_given-t100_message-msgv1
iv_msgv2 = ms_given-t100_message-msgv2
iv_msgv3 = ms_given-t100_message-msgv3
iv_msgv4 = ms_given-t100_message-msgv4
ix_previous = ms_given-previous_exception
iv_longtext = ms_given-longtext ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO mo_cut ##NEEDED.
ENDTRY.
ENDMETHOD.
METHOD when_inst_usng_raise_with_text.
TRY.
zcx_abapgit_exception=>raise_with_text( ix_previous = ms_given-previous_exception
iv_longtext = ms_given-longtext ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception INTO mo_cut ##NEEDED.
ENDTRY.
ENDMETHOD.
METHOD then_the_text_should_equal.
cl_abap_unit_assert=>assert_equals( exp = iv_text
act = mo_cut->get_text( ) ).
ENDMETHOD.
METHOD then_the_longtext_should_equal.
cl_abap_unit_assert=>assert_equals( exp = iv_longtext
act = mo_cut->get_longtext( abap_true ) ).
ENDMETHOD.
METHOD then_the_prev_exc_should_equal.
cl_abap_unit_assert=>assert_equals( exp = ix_exception
act = mo_cut->previous ).
ENDMETHOD.
METHOD class_teardown.
CLEAR gs_test_data.
ENDMETHOD.
METHOD teardown.
CLEAR ms_given.
FREE mo_cut.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_general DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS INHERITING FROM ltcl_base.
PUBLIC SECTION.
METHODS:
direct_text FOR TESTING,
no_text FOR TESTING,
text_from_exception FOR TESTING.
ENDCLASS.
CLASS ltcl_general IMPLEMENTATION.
METHOD direct_text.
given_the_text( gs_test_data-text ).
when_instantiated_using_raise( ).
then_the_text_should_equal( gs_test_data-text ).
ENDMETHOD.
METHOD no_text.
given_the_text( gs_test_data-empty_text ).
when_instantiated_using_raise( ).
then_the_text_should_equal( zcx_abapgit_exception=>c_generic_error_msg ).
ENDMETHOD.
METHOD text_from_exception.
DATA: lx_previous TYPE REF TO cx_sy_dyn_call_illegal_method.
CREATE OBJECT lx_previous TYPE cx_sy_dyn_call_illegal_method
EXPORTING
textid = cx_sy_dyn_call_illegal_method=>private_method
classname = 'CLASS'
methodname = 'METHOD'.
given_the_previous_exception( lx_previous ).
when_inst_usng_raise_with_text( ).
then_the_text_should_equal( lx_previous->get_text( ) ).
then_the_prev_exc_should_equal( lx_previous ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_t100 DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS INHERITING FROM ltcl_base.
PUBLIC SECTION.
METHODS:
text1 FOR TESTING,
text2 FOR TESTING,
text3 FOR TESTING,
text4 FOR TESTING,
text5 FOR TESTING,
text6 FOR TESTING,
text7 FOR TESTING,
text8 FOR TESTING.
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-DATA:
BEGIN OF gs_t100_test_data,
message1 TYPE symsg,
message2 TYPE symsg,
message3 TYPE symsg,
message4 TYPE symsg,
message5 TYPE symsg,
message6 TYPE symsg,
message7 TYPE symsg,
message8 TYPE symsg,
END OF gs_t100_test_data.
CLASS-METHODS:
class_setup,
class_teardown.
ENDCLASS.
CLASS ltcl_t100 IMPLEMENTATION.
METHOD text1.
given_the_t100_message( gs_t100_test_data-message1 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message1 ) ).
ENDMETHOD.
METHOD text2.
given_the_t100_message( gs_t100_test_data-message2 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message2 ) ).
ENDMETHOD.
METHOD text3.
given_the_t100_message( gs_t100_test_data-message3 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message3 ) ).
ENDMETHOD.
METHOD text4.
given_the_t100_message( gs_t100_test_data-message4 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message4 ) ).
ENDMETHOD.
METHOD text5.
given_the_t100_message( gs_t100_test_data-message5 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message5 ) ).
ENDMETHOD.
METHOD text6.
given_the_t100_message( gs_t100_test_data-message6 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message6 ) ).
ENDMETHOD.
METHOD text7.
given_the_t100_message( gs_t100_test_data-message7 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message7 ) ).
ENDMETHOD.
METHOD text8.
given_the_t100_message( gs_t100_test_data-message8 ).
when_instan_using_raise_t100( ).
then_the_text_should_equal( get_t100_text( gs_t100_test_data-message8 ) ).
ENDMETHOD.
METHOD class_setup.
gs_t100_test_data-message1-msgid = '00'.
gs_t100_test_data-message1-msgno = '001'.
gs_t100_test_data-message2-msgid = '00'.
gs_t100_test_data-message2-msgno = '001'.
gs_t100_test_data-message2-msgv1 = 'Variable 1'.
gs_t100_test_data-message3-msgid = '00'.
gs_t100_test_data-message3-msgno = '001'.
gs_t100_test_data-message3-msgv1 = 'Variable 1'.
gs_t100_test_data-message3-msgv2 = 'Variable 2'.
gs_t100_test_data-message4-msgid = '00'.
gs_t100_test_data-message4-msgno = '001'.
gs_t100_test_data-message4-msgv1 = 'Variable 1'.
gs_t100_test_data-message4-msgv2 = 'Variable 2'.
gs_t100_test_data-message4-msgv3 = 'Variable 3'.
gs_t100_test_data-message5-msgid = '00'.
gs_t100_test_data-message5-msgno = '001'.
gs_t100_test_data-message5-msgv1 = 'Variable 1'.
gs_t100_test_data-message5-msgv2 = 'Variable 2'.
gs_t100_test_data-message5-msgv3 = 'Variable 3'.
gs_t100_test_data-message5-msgv4 = 'Variable 4'.
gs_t100_test_data-message6-msgid = '00'.
gs_t100_test_data-message6-msgno = '003'.
gs_t100_test_data-message6-msgv1 = 'Variable 1'.
gs_t100_test_data-message6-msgv2 = 'Variable 2'.
gs_t100_test_data-message6-msgv3 = 'Variable 3'.
gs_t100_test_data-message6-msgv4 = 'Variable 4'.
gs_t100_test_data-message7-msgid = '00'.
gs_t100_test_data-message7-msgno = '003'.
gs_t100_test_data-message8-msgid = '00'.
gs_t100_test_data-message8-msgno = '002'.
ENDMETHOD.
METHOD class_teardown.
CLEAR gs_t100_test_data.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_get_t100_longtext DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
@ -448,3 +430,106 @@ CLASS ltcl_split_text IMPLEMENTATION.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_longtext DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT INHERITING FROM ltcl_base.
PUBLIC SECTION.
METHODS:
empty_longtext FOR TESTING,
longtext FOR TESTING,
multiline_longtext FOR TESTING,
t100_longtext_override FOR TESTING,
text_from_previous_exception FOR TESTING.
PRIVATE SECTION.
CLASS-DATA:
BEGIN OF gs_longtext_test_data,
longtext_500 TYPE string,
longtext_500_multline TYPE string,
empty_longtext TYPE string VALUE ``,
t100_with_longtext TYPE symsg,
END OF gs_longtext_test_data.
CLASS-METHODS:
class_setup,
class_teardown.
ENDCLASS.
CLASS ltcl_longtext IMPLEMENTATION.
METHOD empty_longtext.
given_the_text( gs_test_data-text ).
given_the_longtext( gs_longtext_test_data-empty_longtext ).
when_instantiated_using_raise( ).
then_the_text_should_equal( gs_test_data-text ).
then_the_longtext_should_equal( gs_longtext_test_data-empty_longtext ).
ENDMETHOD.
METHOD longtext.
given_the_text( gs_test_data-text ).
given_the_longtext( gs_longtext_test_data-longtext_500 ).
when_instantiated_using_raise( ).
then_the_text_should_equal( gs_test_data-text ).
then_the_longtext_should_equal( gs_longtext_test_data-longtext_500 ).
ENDMETHOD.
METHOD multiline_longtext.
given_the_text( gs_test_data-text ).
given_the_longtext( gs_longtext_test_data-longtext_500_multline ).
when_instantiated_using_raise( ).
then_the_text_should_equal( gs_test_data-text ).
then_the_longtext_should_equal( gs_longtext_test_data-longtext_500_multline ).
ENDMETHOD.
METHOD t100_longtext_override.
given_the_longtext( gs_longtext_test_data-longtext_500 ).
given_the_t100_message( gs_longtext_test_data-t100_with_longtext ).
when_instan_using_raise_t100( ).
then_the_longtext_should_equal( gs_longtext_test_data-longtext_500 ).
ENDMETHOD.
METHOD text_from_previous_exception.
DATA: lx_previous TYPE REF TO cx_sy_dyn_call_illegal_method.
CREATE OBJECT lx_previous.
given_the_previous_exception( lx_previous ).
given_the_longtext( gs_longtext_test_data-longtext_500 ).
when_inst_usng_raise_with_text( ).
then_the_text_should_equal( condense( lx_previous->get_text( ) ) ).
then_the_longtext_should_equal( gs_longtext_test_data-longtext_500 ).
then_the_prev_exc_should_equal( lx_previous ).
ENDMETHOD.
METHOD class_setup.
gs_longtext_test_data-longtext_500 =
`Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et` &&
` dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Ste` &&
`t clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, ` &&
`consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,` &&
` sed diam voluptua. At vero eos et accusam et justo duo dolores et e`.
gs_longtext_test_data-longtext_500_multline =
`Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et` &&
` dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.` &&
cl_abap_char_utilities=>newline &&
`Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.` &&
cl_abap_char_utilities=>newline &&
cl_abap_char_utilities=>newline &&
`Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et` &&
` dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores ete`.
gs_longtext_test_data-t100_with_longtext-msgid = '00'.
gs_longtext_test_data-t100_with_longtext-msgno = '002'.
ENDMETHOD.
METHOD class_teardown.
CLEAR gs_longtext_test_data.
ENDMETHOD.
ENDCLASS.

View File

@ -102,8 +102,13 @@
"unknownTypes": "runtimeError",
"extraSetup": "../test/setup.mjs",
"skip": [
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_test", "method": "test_direct_text"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_test", "method": "test_no_text"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_general", "method": "direct_text"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_general", "method": "no_text"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_general", "method": "text_from_exception"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_longtext", "method": "empty_longtext"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_longtext", "method": "longtext"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_longtext", "method": "multiline_longtext"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_longtext", "method": "text_from_previous_exception"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_get_t100_longtext", "method": "test01"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_split_text", "method": "test_set_msg_b"},
{"object": "ZCX_ABAPGIT_EXCEPTION", "class": "ltcl_split_text", "method": "test_set_msg_c"},