diff --git a/src/utils/zcl_abapgit_version.clas.abap b/src/utils/zcl_abapgit_version.clas.abap index bca47e2e8..6f03dba44 100644 --- a/src/utils/zcl_abapgit_version.clas.abap +++ b/src/utils/zcl_abapgit_version.clas.abap @@ -38,14 +38,6 @@ CLASS zcl_abapgit_version DEFINITION VALUE(rv_version) TYPE string RAISING zcx_abapgit_exception. - CLASS-METHODS parse_version_from_source - IMPORTING - it_source TYPE string_table - iv_component_name TYPE csequence - RETURNING - VALUE(rv_version) TYPE string - RAISING - zcx_abapgit_exception. PROTECTED SECTION. PRIVATE SECTION. @@ -281,94 +273,4 @@ CLASS zcl_abapgit_version IMPLEMENTATION. ENDIF. ENDMETHOD. - METHOD parse_version_from_source. - TYPES: ty_statement TYPE c LENGTH 40. - CONSTANTS: BEGIN OF c_token_types, - identifier TYPE stokes-type VALUE 'I', - literal TYPE stokes-type VALUE 'S', - END OF c_token_types. - DATA: lt_keyword_filter TYPE STANDARD TABLE OF ty_statement, - lt_statements TYPE sstmnt_tab, - lt_tokens TYPE stokes_tab, - lt_structures TYPE sstruc_tab, - lv_found_token_index TYPE i, - lv_component_name TYPE string, - lv_version_length TYPE i. - FIELD-SYMBOLS: TYPE sstruc, - TYPE sstmnt, - TYPE stokes. - - IF iv_component_name CA '-'. - zcx_abapgit_exception=>raise( 'Structured version constants are not supported' ). - ENDIF. - - lv_component_name = condense( to_upper( iv_component_name ) ). - - APPEND 'CONSTANTS' TO lt_keyword_filter. - - SCAN ABAP-SOURCE it_source - KEYWORDS FROM lt_keyword_filter - STATEMENTS INTO lt_statements - TOKENS INTO lt_tokens - STRUCTURES INTO lt_structures. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Source code could not be parsed to extract version (syntax error?)' ). - ENDIF. - - READ TABLE lt_structures ASSIGNING WITH KEY type = 'P'. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Could not find top level structure to parse version constant' ). - ENDIF. - - LOOP AT lt_statements FROM -stmnt_from TO -stmnt_to ASSIGNING . - LOOP AT lt_tokens FROM -from TO -to - TRANSPORTING NO FIELDS - WHERE type = c_token_types-identifier AND str = lv_component_name. - lv_found_token_index = sy-tabix. - EXIT. - ENDLOOP. - - IF sy-subrc = 0. - LOOP AT lt_tokens FROM lv_found_token_index TO -to - TRANSPORTING NO FIELDS - WHERE type = c_token_types-identifier AND str = 'VALUE'. - lv_found_token_index = sy-tabix. - EXIT. - ENDLOOP. - - IF lv_found_token_index + 1 > -to. - zcx_abapgit_exception=>raise( 'Internal error parsing version constant' ). - ENDIF. - - READ TABLE lt_tokens INDEX lv_found_token_index + 1 ASSIGNING . - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Internal error parsing version constant' ). - ENDIF. - - CASE -type. - WHEN c_token_types-identifier. - rv_version = -str. - IF rv_version(1) CA sy-abcde. - zcx_abapgit_exception=>raise( - 'References to other constants are not supported in version constant value' ). - ENDIF. - WHEN c_token_types-literal. - rv_version = -str. - IF rv_version CP '`*`' OR rv_version CP `'*'`. - lv_version_length = strlen( rv_version ). - rv_version = substring( - val = rv_version - off = 1 - len = lv_version_length - 2 ). - ENDIF. - ENDCASE. - - CONDENSE rv_version. - - RETURN. - ENDIF. - ENDLOOP. - - zcx_abapgit_exception=>raise( |Could not parse version constant { iv_component_name }| ). - ENDMETHOD. ENDCLASS. diff --git a/src/utils/zcl_abapgit_version.clas.testclasses.abap b/src/utils/zcl_abapgit_version.clas.testclasses.abap index a7d9c7a9b..27774d574 100644 --- a/src/utils/zcl_abapgit_version.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_version.clas.testclasses.abap @@ -82,269 +82,3 @@ CLASS ltcl_version IMPLEMENTATION. ENDMETHOD. ENDCLASS. - -CLASS ltcl_version_parse DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. - PUBLIC SECTION. - METHODS: - abapgit_version FOR TESTING, - interface1 FOR TESTING, - interface2 FOR TESTING, - class1 FOR TESTING, - class_private FOR TESTING, - structured_constant FOR TESTING, - int4 FOR TESTING, - decfloat34 FOR TESTING, - syntax_error FOR TESTING, - class_data FOR TESTING, - ampersand FOR TESTING, - constant_reference FOR TESTING, - missing_constant FOR TESTING. - PRIVATE SECTION. - DATA: - mt_given_source TYPE string_table, - mv_given_component_name TYPE string, - mv_parsed_version TYPE string, - mo_raised_exception TYPE REF TO zcx_abapgit_exception. - METHODS: - given_the_source IMPORTING it_source TYPE string_table, - given_the_component_name IMPORTING iv_component_name TYPE string, - when_parse_is_called, - then_should_raise_exception, - then_version_should_equal IMPORTING iv_version TYPE string, - teardown. -ENDCLASS. - -CLASS ltcl_version_parse IMPLEMENTATION. - METHOD abapgit_version. - DATA: lt_source TYPE string_table. - - IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true. - TRY. - CALL METHOD cl_abap_unit_assert=>('SKIP') - EXPORTING - msg = 'Test method not supported in standalone version'. - CATCH cx_sy_dyn_call_illegal_method. " NW <= 752 - RETURN. - ENDTRY. - ENDIF. - - READ REPORT 'ZIF_ABAPGIT_VERSION===========IU' INTO lt_source STATE 'A'. - cl_abap_unit_assert=>assert_subrc( ). - - given_the_source( lt_source ). - given_the_component_name( 'C_ABAP_VERSION' ). - when_parse_is_called( ). - then_version_should_equal( zif_abapgit_version=>c_abap_version ). - ENDMETHOD. - - METHOD interface1. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE string VALUE `1.2.3`.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '1.2.3' ). - ENDMETHOD. - - METHOD interface2. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS version TYPE string VALUE `1.2.3`.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '1.2.3' ). - ENDMETHOD. - - METHOD class1. - DATA: lt_source TYPE string_table. - - APPEND 'CLASS version DEFINITION CREATE PRIVATE PUBLIC.' TO lt_source. - APPEND ' PUBLIC SECTION.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE string VALUE `1.2.3`.' TO lt_source. - APPEND 'ENDCLASS.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '1.2.3' ). - ENDMETHOD. - - METHOD class_private. - DATA: lt_source TYPE string_table. - - APPEND 'CLASS version DEFINITION CREATE PRIVATE PUBLIC.' TO lt_source. - APPEND ' PRIVATE SECTION.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE string VALUE `1.2.3`.' TO lt_source. - APPEND 'ENDCLASS.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '1.2.3' ). - ENDMETHOD. - - METHOD structured_constant. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' BEGIN OF structure,' TO lt_source. - APPEND ' BEGIN OF inner_structure,' TO lt_source. - APPEND ' version TYPE string VALUE `1.0.0`,' TO lt_source. - APPEND ' text TYPE string VALUE `inner`,' TO lt_source. - APPEND ' END OF inner_structre,' TO lt_source. - APPEND ' outer_text TYPE string VALUE `outer`,' TO lt_source. - APPEND ' END OF structure.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'STRUCTURE-INNER_STRUCTURE-VERSION' ). - when_parse_is_called( ). - then_should_raise_exception( ). - ENDMETHOD. - - METHOD int4. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version DEFINITION CREATE PRIVATE PUBLIC.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE i VALUE 6.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '6' ). - ENDMETHOD. - - METHOD decfloat34. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version DEFINITION CREATE PRIVATE PUBLIC.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ` version TYPE decfloat34 VALUE '3.14'.` TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '3.14' ). - ENDMETHOD. - - METHOD syntax_error. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE string VAL `1.2.3`.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_should_raise_exception( ). - ENDMETHOD. - - METHOD class_data. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CLASS-DATA:' TO lt_source. - APPEND ' version TYPE string VALUE `1.2.3`.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_should_raise_exception( ). - ENDMETHOD. - - METHOD ampersand. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE string VALUE `1` &' TO lt_source. - APPEND ' `.2` & `.3`.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_version_should_equal( '1.2.3' ). - ENDMETHOD. - - METHOD constant_reference. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' actual_version TYPE string VALUE `1.2.3`,' TO lt_source. - APPEND ' version TYPE string VALUE actual_version.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'VERSION' ). - when_parse_is_called( ). - then_should_raise_exception( ). - ENDMETHOD. - - METHOD missing_constant. - DATA: lt_source TYPE string_table. - - APPEND 'INTERFACE version.' TO lt_source. - APPEND ' CONSTANTS:' TO lt_source. - APPEND ' version TYPE string VALUE `1.2.3`.' TO lt_source. - APPEND 'ENDINTERFACE.' TO lt_source. - - given_the_source( lt_source ). - given_the_component_name( 'SOME_MISSING_CONSTANT' ). - when_parse_is_called( ). - then_should_raise_exception( ). - ENDMETHOD. - - METHOD given_the_source. - mt_given_source = it_source. - ENDMETHOD. - - METHOD given_the_component_name. - mv_given_component_name = iv_component_name. - ENDMETHOD. - - METHOD when_parse_is_called. - TRY. - mv_parsed_version = zcl_abapgit_version=>parse_version_from_source( - it_source = mt_given_source - iv_component_name = mv_given_component_name ). - CATCH zcx_abapgit_exception INTO mo_raised_exception ##NO_HANDLER. - ENDTRY. - ENDMETHOD. - - METHOD then_should_raise_exception. - cl_abap_unit_assert=>assert_bound( mo_raised_exception ). - ENDMETHOD. - - METHOD then_version_should_equal. - cl_abap_unit_assert=>assert_equals( - exp = iv_version - act = mv_parsed_version ). - ENDMETHOD. - - METHOD teardown. - CLEAR mt_given_source. - CLEAR mv_given_component_name. - CLEAR mv_parsed_version. - FREE mo_raised_exception. - ENDMETHOD. -ENDCLASS.