CLASS ltcl_file_status DEFINITION DEFERRED. CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status. DEFINE _append_state. APPEND INITIAL LINE TO lt_state ASSIGNING . -path = '/'. -filename = &1. -sha1 = &2. END-OF-DEFINITION. DEFINE _append_local. APPEND INITIAL LINE TO lt_local ASSIGNING . -item-obj_type = &1. -item-obj_name = &2. -item-devclass = '$Z$'. -file-path = '/'. -file-filename = &3. -file-sha1 = &4. END-OF-DEFINITION. DEFINE _append_remote. APPEND INITIAL LINE TO lt_remote ASSIGNING . -path = '/'. -filename = &1. -sha1 = &2. END-OF-DEFINITION. DEFINE _append_result. APPEND INITIAL LINE TO lt_results ASSIGNING . -obj_type = &1. -obj_name = &2. -match = &3. -lstate = &4. -rstate = &5. -package = &6. -path = &7. -filename = &8. END-OF-DEFINITION. CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL INHERITING FROM cl_aunit_assert. PUBLIC SECTION. METHODS calculate_status FOR TESTING RAISING zcx_abapgit_exception. ENDCLASS. "ltcl_file_status CLASS ltcl_file_status IMPLEMENTATION. METHOD calculate_status. DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, lt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt, lt_results TYPE zif_abapgit_definitions=>ty_results_tt, lt_results_exp TYPE zif_abapgit_definitions=>ty_results_tt, lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. FIELD-SYMBOLS: LIKE LINE OF lt_local, LIKE LINE OF lt_remote, LIKE LINE OF lt_results, LIKE LINE OF lt_state. "STATE FILE SHA1 _append_state '$$zclass1.clas.xml' 'C1_F1'. " class1 testclasses is new locally, abap is new remotely " class2 is completely new remotely _append_state '$$zdoma1.doma.xml' 'D1'. _append_state '$$zdoma2.doma.xml' 'D2'. _append_state '$$zdoma3.doma.xml' 'D3'. " doma4 is new locally " doma5 is new remotely _append_state '$$zdoma6.doma.xml' 'D6'. " doma7 is not in state - emulate brocken cache " doma8 is not in state - emulate brocken cache _append_state '$$zdoma9.doma.xml' 'D9'. _append_state 'num01.doma.xml' 'NUM01'. " another from different package _append_state 'xfeld.doma.xml' 'XFELD'. " from different package "LOCAL TYPE NAME FILE SHA1 _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.testclasses.abap' 'C1_F3'. _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.xml' 'C1_F1'. _append_local 'DOMA' '$$ZDOMA1' '$$zdoma1.doma.xml' 'D1'. _append_local 'DOMA' '$$ZDOMA2' '$$zdoma2.doma.xml' 'D2_CHANGED_L'. _append_local 'DOMA' '$$ZDOMA3' '$$zdoma3.doma.xml' 'D3'. _append_local 'DOMA' '$$ZDOMA4' '$$zdoma4.doma.xml' 'D4'. _append_local 'DOMA' '$$ZDOMA6' '$$zdoma6.doma.xml' 'D6_CHANGED_L'. _append_local 'DOMA' '$$ZDOMA7' '$$zdoma7.doma.xml' 'D7'. _append_local 'DOMA' '$$ZDOMA8' '$$zdoma8.doma.xml' 'D8'. " dome9 was deleted from local system. Can be found by existing state "REMOTE FILE SHA1 _append_remote 'textfile.txt' 'T1'. _append_remote '$$zclass1.clas.abap' 'C1_F2'. " Must be before xml for tougher test _append_remote '$$zclass1.clas.xml' 'C1_F1'. _append_remote '$$zclass2.clas.abap' 'C1_F2'. " Must be before xml for tougher test _append_remote '$$zclass2.clas.xml' 'C1_F1'. _append_remote '$$zdoma1.doma.xml' 'D1'. _append_remote '$$zdoma2.doma.xml' 'D2'. _append_remote '$$zdoma3.doma.xml' 'D3_CHANGED_R'. _append_remote '$$zdoma5.doma.xml' 'D5'. _append_remote '$$zdoma6.doma.xml' 'D6_CHANGED_R'. _append_remote '$$zdoma7.doma.xml' 'D7'. _append_remote '$$zdoma8.doma.xml' 'D8_CHANGED_R'. " This one is changed _append_remote '$$zdoma9.doma.xml' 'D9'. " This one is deleted locally _append_remote 'xfeld.doma.xml' 'XFELD'. " Object from different package _append_remote 'num01.doma.xml' 'NUM01_CHANGED'. " Changed object from different package "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result '' '' ' ' ' ' 'A' '' '/' 'textfile.txt'. _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' ' ' 'A' ' ' '$Z$' '/' '$$zclass1.clas.testclasses.abap'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.abap'. _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. _append_result 'DOMA' '$$ZDOMA3' ' ' ' ' 'M' '$Z$' '/' '$$zdoma3.doma.xml'. _append_result 'DOMA' '$$ZDOMA4' ' ' 'A' ' ' '$Z$' '/' '$$zdoma4.doma.xml'. _append_result 'DOMA' '$$ZDOMA5' ' ' ' ' 'A' '' '/' '$$zdoma5.doma.xml'. _append_result 'DOMA' '$$ZDOMA6' ' ' 'M' 'M' '$Z$' '/' '$$zdoma6.doma.xml'. _append_result 'DOMA' '$$ZDOMA7' 'X' ' ' ' ' '$Z$' '/' '$$zdoma7.doma.xml'. _append_result 'DOMA' '$$ZDOMA8' ' ' 'M' 'M' '$Z$' '/' '$$zdoma8.doma.xml'. _append_result 'DOMA' '$$ZDOMA9' ' ' 'D' ' ' '' '/' '$$zdoma9.doma.xml'. _append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'. _append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'. lt_results_exp = lt_results. lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). * lo_dot->set_starting_folder( 'SRC' ). * lo_dot->set_folder_logic( lcl_dot_abapgit=>c_folder_logic-prefix ). lt_results = zcl_abapgit_file_status=>calculate_status( iv_devclass = '$Z$' io_dot = lo_dot it_local = lt_local it_remote = lt_remote it_cur_state = lt_state ). assert_equals( act = lt_results exp = lt_results_exp ). ENDMETHOD. "calculate_status ENDCLASS. "ltcl_file_status CLASS ltcl_file_status2 DEFINITION DEFERRED. CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status2. CLASS ltcl_file_status2 DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL INHERITING FROM cl_aunit_assert. PUBLIC SECTION. METHODS check FOR TESTING RAISING zcx_abapgit_exception. ENDCLASS. "ltcl_sap_package CLASS ltcl_file_status2 IMPLEMENTATION. METHOD check. DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, lo_log TYPE REF TO zcl_abapgit_log. FIELD-SYMBOLS: LIKE LINE OF lt_results. *** 0 Positive CLEAR lt_results. CREATE OBJECT lo_log. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. zcl_abapgit_file_status=>run_checks( io_log = lo_log it_results = lt_results io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). assert_equals( act = lo_log->count( ) exp = 0 ). *** 1 Negative, different path for same object CLEAR lt_results. CREATE OBJECT lo_log. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/sub' 'zclass1.clas.xml'. _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. zcl_abapgit_file_status=>run_checks( io_log = lo_log it_results = lt_results io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). " This one is not pure - incorrect path also triggers path vs package check assert_equals( act = lo_log->count( ) exp = 2 ). assert_equals( act = lo_log->has_rc( '1' ) exp = abap_true ). *** 2 Negative, incorrect path vs package CLEAR lt_results. CREATE OBJECT lo_log. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/sub' '$$zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. zcl_abapgit_file_status=>run_checks( io_log = lo_log it_results = lt_results io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). assert_equals( act = lo_log->count( ) exp = 1 ). assert_equals( act = lo_log->has_rc( '2' ) exp = abap_true ). *** 3 Negative, similar filenames CLEAR lt_results. CREATE OBJECT lo_log. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. zcl_abapgit_file_status=>run_checks( io_log = lo_log it_results = lt_results io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). assert_equals( act = lo_log->count( ) exp = 1 ). assert_equals( act = lo_log->has_rc( '3' ) exp = abap_true ). *** 4 Negative, empty filenames CLEAR lt_results. CREATE OBJECT lo_log. "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' ''. zcl_abapgit_file_status=>run_checks( io_log = lo_log it_results = lt_results io_dot = zcl_abapgit_dot_abapgit=>build_default( ) iv_top = '$Z$' ). assert_equals( act = lo_log->count( ) exp = 1 ). assert_equals( act = lo_log->has_rc( '4' ) exp = abap_true ). ENDMETHOD. " check. ENDCLASS. "ltcl_sap_package