Fix Issue 980 and add test code

This commit is contained in:
Christian Günter 2017-10-10 09:37:31 +00:00
parent 4c0d697a91
commit 4f012b0950
2 changed files with 232 additions and 31 deletions

View File

@ -169,6 +169,11 @@ CLASS lcl_oo_serializer DEFINITION.
IMPORTING is_clskey TYPE seoclskey IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt
RAISING zcx_abapgit_exception. RAISING zcx_abapgit_exception.
METHODS calculate_skip_testclass
IMPORTING
it_source TYPE zif_abapgit_definitions=>ty_string_tt
RETURNING
VALUE(rv_skip_testclass) TYPE abap_bool.
PRIVATE SECTION. PRIVATE SECTION.
DATA mv_skip_testclass TYPE abap_bool. DATA mv_skip_testclass TYPE abap_bool.
METHODS serialize_abap_old METHODS serialize_abap_old
@ -341,39 +346,10 @@ CLASS lcl_oo_serializer IMPLEMENTATION.
METHOD serialize_testclasses. METHOD serialize_testclasses.
DATA: lv_line1 LIKE LINE OF rt_source,
lv_line2 LIKE LINE OF rt_source.
rt_source = read_include( is_clskey = is_clskey rt_source = read_include( is_clskey = is_clskey
iv_type = seop_ext_class_testclasses ). iv_type = seop_ext_class_testclasses ).
* when creating classes in Eclipse it automatically generates the mv_skip_testclass = calculate_skip_testclass( rt_source ).
* testclass include, but it is not needed, so skip to avoid
* creating an extra file in the repository.
* Also remove it if the content is manually removed, but
* the class still thinks it contains tests
"@TODO: Put under test
mv_skip_testclass = abap_false.
IF lines( rt_source ) = 2.
READ TABLE rt_source INDEX 1 INTO lv_line1.
ASSERT sy-subrc = 0.
READ TABLE rt_source INDEX 2 INTO lv_line2.
ASSERT sy-subrc = 0.
IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL.
mv_skip_testclass = abap_true.
ENDIF.
ELSEIF lines( rt_source ) = 1.
READ TABLE rt_source INDEX 1 INTO lv_line1.
ASSERT sy-subrc = 0.
IF lv_line1 IS INITIAL
OR ( strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' )
OR ( strlen( lv_line1 ) = 1 AND lv_line1(1) = '*' ).
mv_skip_testclass = abap_true.
ENDIF.
ELSEIF lines( rt_source ) = 0.
mv_skip_testclass = abap_true.
ENDIF.
ENDMETHOD. "serialize_test ENDMETHOD. "serialize_test
@ -385,10 +361,46 @@ CLASS lcl_oo_serializer IMPLEMENTATION.
reduce( CHANGING ct_source = rt_source ). reduce( CHANGING ct_source = rt_source ).
ENDMETHOD. "serialize_macro ENDMETHOD. "serialize_macro
METHOD are_test_classes_skipped. METHOD are_test_classes_skipped.
rv_return = mv_skip_testclass. rv_return = mv_skip_testclass.
ENDMETHOD. ENDMETHOD.
METHOD calculate_skip_testclass.
DATA: lv_line1 LIKE LINE OF it_source,
lv_line2 LIKE LINE OF it_source.
* when creating classes in Eclipse it automatically generates the
* testclass include, but it is not needed, so skip to avoid
* creating an extra file in the repository.
* Also remove it if the content is manually removed, but
* the class still thinks it contains tests
rv_skip_testclass = abap_false.
IF lines( it_source ) = 2.
READ TABLE it_source INDEX 1 INTO lv_line1.
ASSERT sy-subrc = 0.
READ TABLE it_source INDEX 2 INTO lv_line2.
ASSERT sy-subrc = 0.
IF strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' AND lv_line2 IS INITIAL.
rv_skip_testclass = abap_true.
ENDIF.
ELSEIF lines( it_source ) = 1.
READ TABLE it_source INDEX 1 INTO lv_line1.
ASSERT sy-subrc = 0.
IF lv_line1 IS INITIAL
OR ( strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' )
OR ( strlen( lv_line1 ) = 1 AND lv_line1(1) = '*' ).
rv_skip_testclass = abap_true.
ENDIF.
ELSEIF lines( it_source ) = 0.
rv_skip_testclass = abap_true.
ENDIF.
ENDMETHOD.
ENDCLASS. ENDCLASS.
CLASS lcl_oo_base DEFINITION ABSTRACT. CLASS lcl_oo_base DEFINITION ABSTRACT.

View File

@ -38,6 +38,11 @@ DEFINE _append_result.
<result>-filename = &8. <result>-filename = &8.
END-OF-DEFINITION. END-OF-DEFINITION.
DEFINE _given_source_is.
APPEND INITIAL LINE TO mt_source ASSIGNING <source>.
<source> = &1.
END-OF-DEFINITION.
* todo, should the tests be in the same include as the classes * todo, should the tests be in the same include as the classes
* they are testing? * they are testing?
@ -816,7 +821,7 @@ CLASS ltcl_url IMPLEMENTATION.
TRY. TRY.
lcl_url=>host( 'not a real url' ). "#EC NOTEXT lcl_url=>host( 'not a real url' ). "#EC NOTEXT
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception. "#EC NO_HANDLER CATCH zcx_abapgit_exception. "#EC NO_HANDLER
ENDTRY. ENDTRY.
ENDMETHOD. "repo_error ENDMETHOD. "repo_error
@ -2601,5 +2606,189 @@ CLASS ltcl_persistence_settings IMPLEMENTATION.
ENDCLASS. ENDCLASS.
CLASS ltcl_oo_serialize DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
setup,
empty_include FOR TESTING RAISING cx_static_check,
one_line_include FOR TESTING RAISING cx_static_check,
one_line_include_2 FOR TESTING RAISING cx_static_check,
one_line_include_3 FOR TESTING RAISING cx_static_check,
two_line_include FOR TESTING RAISING cx_static_check,
two_line_include_2 FOR TESTING RAISING cx_static_check,
two_line_include_3 FOR TESTING RAISING cx_static_check,
more_than_two_lines FOR TESTING RAISING cx_static_check,
_given_empty_test_include,
_when_skip_is_calculated,
_then_should_be_skipped,
_then_should_not_be_skipped.
DATA: mo_oo_serializer TYPE REF TO lcl_oo_serializer,
mt_source TYPE zif_abapgit_definitions=>ty_string_tt,
mv_skip_testclass TYPE abap_bool.
ENDCLASS.
CLASS ltcl_oo_serialize IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_oo_serializer.
ENDMETHOD.
METHOD empty_include.
_given_empty_test_include( ).
_when_skip_is_calculated( ).
_then_should_be_skipped( ).
ENDMETHOD.
METHOD one_line_include.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
`*"* use this source file for your ABAP unit test classes`.
_when_skip_is_calculated( ).
_then_should_be_skipped( ).
ENDMETHOD.
METHOD one_line_include_2.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
`*`.
_when_skip_is_calculated( ).
_then_should_be_skipped( ).
ENDMETHOD.
METHOD one_line_include_3.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
`write: 'This is ABAP'.`.
_when_skip_is_calculated( ).
_then_should_not_be_skipped( ).
ENDMETHOD.
METHOD two_line_include.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
`*"* use this source file for your ABAP unit test classes`,
``.
_when_skip_is_calculated( ).
_then_should_be_skipped( ).
ENDMETHOD.
METHOD two_line_include_2.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
`*"* use this source file for your ABAP unit test classes`,
`write: 'This is ABAP'.`.
_when_skip_is_calculated( ).
_then_should_not_be_skipped( ).
ENDMETHOD.
METHOD two_line_include_3.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
` `,
`*"* use this source file for your ABAP unit test classes`.
_when_skip_is_calculated( ).
_then_should_not_be_skipped( ).
ENDMETHOD.
METHOD more_than_two_lines.
FIELD-SYMBOLS: <source> LIKE LINE OF mt_source.
_given_source_is:
'*"* use this source file for your ABAP unit test classes',
`CLASS ltcl_test DEFINITION FINAL FOR TESTING`,
` DURATION SHORT`,
` RISK LEVEL HARMLESS.`,
` PRIVATE SECTION.`,
` METHODS:`,
` first_test FOR TESTING RAISING cx_static_check.`,
`ENDCLASS.`,
` `,
`CLASS ltcl_test IMPLEMENTATION.`,
` METHOD first_test.`,
` cl_abap_unit_assert=>fail( 'This is a real test' ).`,
` ENDMETHOD.`,
`ENDCLASS.`.
_when_skip_is_calculated( ).
_then_should_not_be_skipped( ).
ENDMETHOD.
METHOD _given_empty_test_include.
ENDMETHOD.
METHOD _when_skip_is_calculated.
mv_skip_testclass = mo_oo_serializer->calculate_skip_testclass( mt_source ).
ENDMETHOD.
METHOD _then_should_be_skipped.
cl_abap_unit_assert=>assert_true( act = mv_skip_testclass
msg = |Testclass should be skipped| ).
ENDMETHOD.
METHOD _then_should_not_be_skipped.
cl_abap_unit_assert=>assert_false( act = mv_skip_testclass
msg = |Testclass should not be skipped| ).
ENDMETHOD.
ENDCLASS.
INCLUDE zabapgit_unit_test_clas_intf. INCLUDE zabapgit_unit_test_clas_intf.
INCLUDE zabapgit_unit_test_transport. INCLUDE zabapgit_unit_test_transport.