Skip to content

Commit 4ef340c

Browse files
pokrakamlucasborin
andauthored
Handle functional operand in assert check (#462)
* Functional operand check * Fix unit test and nesting syntax * Lint * Update exemption unit test * Fix unit test * Add functional operand fix #460 to changelog * removing static test, and adding more test cases Co-authored-by: Lucas Borin <5233413+lucasborin@users.noreply.github.com>
1 parent e8552da commit 4ef340c

File tree

3 files changed

+108
-44
lines changed

3 files changed

+108
-44
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Whenever you upgrade code pal for ABAP, it is highly recommended to execute the
2020
+ Prefer Pragmas to Pseudo Comments (#421)
2121
+ COLLECT restriction (#441)
2222
* RAP needs CREATE OBJECT ... FOR TESTING (#444)
23+
* Filter functional operands in "Unit Test Assert" check (#460)
2324

2425
2021-08-12 v.1.15.0
2526
------------------

src/checks/y_check_unit_test_assert.clas.abap

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@ CLASS y_check_unit_test_assert DEFINITION PUBLIC INHERITING FROM y_check_base CR
66
METHODS inspect_tokens REDEFINITION.
77

88
PRIVATE SECTION.
9-
METHODS get_parameter_reference IMPORTING statement TYPE sstmnt
10-
parameter TYPE string
9+
METHODS get_parameter_reference IMPORTING statement TYPE sstmnt
10+
parameter TYPE string
1111
RETURNING VALUE(result) TYPE string
12-
RAISING cx_sy_itab_line_not_found.
12+
RAISING cx_sy_itab_line_not_found.
1313

14-
METHODS is_variable IMPORTING token TYPE stokesx
14+
METHODS is_variable IMPORTING token TYPE stokesx
1515
RETURNING VALUE(result) TYPE abap_bool.
1616

17+
METHODS contains_functional_operand IMPORTING expression TYPE string
18+
RETURNING VALUE(result) TYPE abap_bool.
19+
1720
METHODS is_internal_table IMPORTING position TYPE i
1821
RETURNING VALUE(result) TYPE abap_bool.
1922

@@ -64,7 +67,7 @@ CLASS y_check_unit_test_assert IMPLEMENTATION.
6467
RETURN.
6568
ENDIF.
6669

67-
IF act <> exp.
70+
IF act <> exp OR contains_functional_operand( act ).
6871
RETURN.
6972
ENDIF.
7073

@@ -110,9 +113,9 @@ CLASS y_check_unit_test_assert IMPLEMENTATION.
110113
CONTINUE.
111114
ENDIF.
112115

113-
IF token-str CP '*(*'.
116+
IF token-str CP '*( *'.
114117
depth = depth + 1.
115-
ELSEIF token-str CP '*)*'.
118+
ELSEIF token-str CP '* )*'.
116119
depth = depth - 1.
117120
ENDIF.
118121

@@ -144,6 +147,12 @@ CLASS y_check_unit_test_assert IMPLEMENTATION.
144147
ENDMETHOD.
145148

146149

150+
METHOD contains_functional_operand.
151+
FIND REGEX `[A-Z_][A-Z0-9_]*\(` IN expression.
152+
result = xsdbool( sy-subrc = 0 ).
153+
ENDMETHOD.
154+
155+
147156
METHOD is_internal_table.
148157
TRY.
149158
DATA(previous_token) = ref_scan_manager->tokens[ position - 1 ].

src/checks/y_check_unit_test_assert.clas.testclasses.abap

Lines changed: 91 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -491,41 +491,53 @@ ENDCLASS.
491491

492492

493493

494-
CLASS ltc_call_static DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
494+
CLASS ltc_assert_fail DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
495495
PROTECTED SECTION.
496-
METHODS get_code_with_issue REDEFINITION.
496+
METHODS get_code_without_issue REDEFINITION.
497497
ENDCLASS.
498498

499-
CLASS ltc_call_static IMPLEMENTATION.
499+
CLASS ltc_assert_fail IMPLEMENTATION.
500500

501-
METHOD get_code_with_issue.
501+
METHOD get_code_without_issue.
502502
result = VALUE #(
503503
( ' REPORT y_example. ' )
504504

505-
( ' CLASS y_fake DEFINITION. ' )
505+
( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' )
506506
( ' PUBLIC SECTION. ' )
507-
( ' CLASS-METHODS get_fullname IMPORTING name TYPE string ' )
508-
( ' surname TYPE string ' )
509-
( ' RETURNING VALUE(result) TYPE string. ' )
507+
( ' METHODS example FOR TESTING. ' )
510508
( ' ENDCLASS. ' )
511509

512-
( ' CLASS y_fake IMPLEMENTATION. ' )
513-
( ' METHOD get_fullname. ' )
514-
( ' result = |{ name } { surname }|. ' )
510+
( ' CLASS y_example IMPLEMENTATION. ' )
511+
( ' METHOD example. ' )
512+
( | cl_aunit_assert=>fail( 'Not Allowed' ). | )
515513
( ' ENDMETHOD. ' )
516514
( ' ENDCLASS. ' )
515+
).
516+
ENDMETHOD.
517+
518+
ENDCLASS.
517519

518520

521+
522+
CLASS ltc_assert_empty DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
523+
PROTECTED SECTION.
524+
METHODS get_code_with_issue REDEFINITION.
525+
ENDCLASS.
526+
527+
CLASS ltc_assert_empty IMPLEMENTATION.
528+
529+
METHOD get_code_with_issue.
530+
result = VALUE #(
531+
( ' REPORT y_example. ' )
532+
519533
( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' )
520534
( ' PUBLIC SECTION. ' )
521535
( ' METHODS example FOR TESTING. ' )
522536
( ' ENDCLASS. ' )
523537

524538
( ' CLASS y_example IMPLEMENTATION. ' )
525539
( ' METHOD example. ' )
526-
( | cl_aunit_assert=>assert_equals( act = y_fake=>get_fullname( name = 'code pal' surname = 'for ABAP' ) | )
527-
( | exp = y_fake=>get_fullname( name = 'code pal' | )
528-
( | surname = 'for ABAP' ) ). | )
540+
( | cl_aunit_assert=>assert_equals( act = '' exp = '' ). | )
529541
( ' ENDMETHOD. ' )
530542
( ' ENDCLASS. ' )
531543
).
@@ -535,12 +547,12 @@ ENDCLASS.
535547

536548

537549

538-
CLASS ltc_assert_fail DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
550+
CLASS ltc_internal_table DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
539551
PROTECTED SECTION.
540552
METHODS get_code_without_issue REDEFINITION.
541553
ENDCLASS.
542554

543-
CLASS ltc_assert_fail IMPLEMENTATION.
555+
CLASS ltc_internal_table IMPLEMENTATION.
544556

545557
METHOD get_code_without_issue.
546558
result = VALUE #(
@@ -553,7 +565,9 @@ CLASS ltc_assert_fail IMPLEMENTATION.
553565

554566
( ' CLASS y_example IMPLEMENTATION. ' )
555567
( ' METHOD example. ' )
556-
( | cl_aunit_assert=>fail( 'Not Allowed' ). | )
568+
( ' DATA itab TYPE TABLE OF tadir. ' )
569+
( ' cl_abap_unit_assert=>assert_equals( exp = itab[ 5 ]-devclass act = itab[ 6 ]-devclass ). ' )
570+
( ' cl_abap_unit_assert=>assert_equals( exp = itab[ 7 ]-devclass act = itab[ 8 ]-devclass ). ' )
557571
( ' ENDMETHOD. ' )
558572
( ' ENDCLASS. ' )
559573
).
@@ -562,56 +576,96 @@ CLASS ltc_assert_fail IMPLEMENTATION.
562576
ENDCLASS.
563577

564578

565-
566-
CLASS ltc_assert_empty DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
579+
CLASS ltc_functional_operand DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
567580
PROTECTED SECTION.
581+
METHODS get_cut REDEFINITION.
568582
METHODS get_code_with_issue REDEFINITION.
583+
METHODS get_code_without_issue REDEFINITION.
584+
methods get_code_with_exemption REDEFINITION.
569585
ENDCLASS.
570586

571-
CLASS ltc_assert_empty IMPLEMENTATION.
587+
CLASS ltc_functional_operand IMPLEMENTATION.
588+
589+
METHOD get_cut.
590+
result ?= NEW y_check_unit_test_assert( ).
591+
ENDMETHOD.
572592

573593
METHOD get_code_with_issue.
574594
result = VALUE #(
575595
( ' REPORT y_example. ' )
576596

577597
( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' )
578598
( ' PUBLIC SECTION. ' )
579-
( ' METHODS example FOR TESTING. ' )
599+
( ' METHODS test FOR TESTING. ' )
600+
( ' PRIVATE SECTION.' )
601+
( ' METHODS get_val RETURNING VALUE(result) type string.' )
580602
( ' ENDCLASS. ' )
581603

582604
( ' CLASS y_example IMPLEMENTATION. ' )
583-
( ' METHOD example. ' )
584-
( | cl_aunit_assert=>assert_equals( act = '' exp = '' ). | )
605+
( ' METHOD test. ' )
606+
( ' DATA(first) = `abc`.' )
607+
( ' DATA(second) = `def`.' )
608+
( ' cl_abap_unit_assert=>assert_equals( act = first && second+2(1)' )
609+
( ' exp = first && second+2(1) ).' )
610+
( ' ENDMETHOD. ' )
611+
( ' METHOD get_val.' )
612+
( ' result = `Foo`.' )
585613
( ' ENDMETHOD. ' )
586614
( ' ENDCLASS. ' )
587615
).
588616
ENDMETHOD.
589617

590-
ENDCLASS.
591-
592-
618+
METHOD get_code_without_issue.
619+
result = VALUE #(
620+
( ' REPORT y_example. ' )
593621

594-
CLASS ltc_internal_table DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
595-
PROTECTED SECTION.
596-
METHODS get_code_without_issue REDEFINITION.
597-
ENDCLASS.
622+
( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' )
623+
( ' PUBLIC SECTION. ' )
624+
( ' METHODS test FOR TESTING. ' )
625+
( ' PRIVATE SECTION.' )
626+
( ' METHODS get_val RETURNING VALUE(result) type string.' )
627+
( ' ENDCLASS. ' )
598628

599-
CLASS ltc_internal_table IMPLEMENTATION.
629+
( ' CLASS y_example IMPLEMENTATION. ' )
630+
( ' METHOD test. ' )
631+
( ' DATA(first) = `abc`.' )
632+
( ' DATA(second) = `def`.' )
633+
( ' cl_abap_unit_assert=>assert_equals( act = first && get_val( ) && second+2(1)' )
634+
( ' exp = first && get_val( ) && second+2(1) ).' )
635+
( ' cl_abap_unit_assert=>assert_equals( act = first && get_val( ) && second+2(1)' )
636+
( ' exp = first && second+2(1) ).' )
637+
( ' cl_abap_unit_assert=>assert_equals( act = first && second+2(1)' )
638+
( ' exp = first && get_val( ) && second+2(1) ).' )
639+
( ' cl_abap_unit_assert=>assert_equals( act = get_val( )' )
640+
( ' exp = get_val( ) ).' )
641+
( ' ENDMETHOD. ' )
642+
( ' METHOD get_val.' )
643+
( ' result = `Foo`.' )
644+
( ' ENDMETHOD. ' )
645+
( ' ENDCLASS. ' )
646+
).
647+
ENDMETHOD.
600648

601-
METHOD get_code_without_issue.
649+
METHOD get_code_with_exemption.
602650
result = VALUE #(
603651
( ' REPORT y_example. ' )
604652

605653
( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' )
606654
( ' PUBLIC SECTION. ' )
607-
( ' METHODS example FOR TESTING. ' )
655+
( ' METHODS test FOR TESTING. ' )
656+
( ' PRIVATE SECTION.' )
657+
( ' METHODS get_val RETURNING VALUE(result) type string.' )
608658
( ' ENDCLASS. ' )
609659

610660
( ' CLASS y_example IMPLEMENTATION. ' )
611-
( ' METHOD example. ' )
612-
( ' DATA itab TYPE TABLE OF tadir. ' )
613-
( ' cl_abap_unit_assert=>assert_equals( exp = itab[ 5 ]-devclass act = itab[ 6 ]-devclass ). ' )
614-
( ' cl_abap_unit_assert=>assert_equals( exp = itab[ 7 ]-devclass act = itab[ 8 ]-devclass ). ' )
661+
( ' METHOD test. ' )
662+
( ' DATA(first) = `abc`.' )
663+
( ' DATA(second) = `def`.' )
664+
( ' cl_abap_unit_assert=>assert_equals( act = first && second+2(1)' )
665+
( ' exp = first && second+2(1) ). "#EC UT_ASSERT' )
666+
( ' ENDMETHOD. ' )
667+
( ' METHOD get_val.' )
668+
( ' result = `Foo`.' )
615669
( ' ENDMETHOD. ' )
616670
( ' ENDCLASS. ' )
617671
).

0 commit comments

Comments
 (0)