*&---------------------------------------------------------------------* *& Include ZABAPGIT_UNIT_TEST *&---------------------------------------------------------------------* * todo, should the tests be in the same include as the classes * they are testing? *----------------------------------------------------------------------* * CLASS ltcl_convert DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_convert DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS convert_int FOR TESTING RAISING lcx_exception. ENDCLASS. "ltcl_convert DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_convert IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_convert IMPLEMENTATION. METHOD convert_int. DATA: lv_xstring TYPE xstring, lv_input TYPE i, lv_result TYPE i. DO 1000 TIMES. lv_input = sy-index. lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_input iv_length = 4 ). lv_result = lcl_convert=>xstring_to_int( lv_xstring ). cl_abap_unit_assert=>assert_equals( exp = lv_input act = lv_result ). ENDDO. ENDMETHOD. "convert_int ENDCLASS. "ltcl_convert IMPLEMENTATION *----------------------------------------------------------------------* * CLASS ltcl_dangerous DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_dangerous DEFINITION FOR TESTING RISK LEVEL CRITICAL DURATION LONG FINAL. * if this test class does not run, parameters in transaction SAUNIT_CLIENT_SETUP * might need to be adjusted PRIVATE SECTION. CLASS-METHODS: class_setup. METHODS: run FOR TESTING RAISING lcx_exception. CONSTANTS: c_package TYPE devclass VALUE '$ABAPGIT_UNIT_TEST'. ENDCLASS. "ltcl_dangerous DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_dangerous IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_dangerous IMPLEMENTATION. METHOD class_setup. DATA: lv_text TYPE c LENGTH 100, lv_answer TYPE c LENGTH 1. lv_text = 'Objects will be created and deleted, do not run in customer system!'. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING titlebar = 'Warning' text_question = lv_text text_button_1 = 'Run' text_button_2 = 'Cancel' default_button = '2' display_cancel_button = abap_false IMPORTING answer = lv_answer. IF lv_answer = '2'. cl_abap_unit_assert=>fail( 'Cancelled' ). ENDIF. ENDMETHOD. "class_setup METHOD run. DATA: lo_repo TYPE REF TO lcl_repo_online, lt_tadir TYPE ty_tadir_tt, lv_msg TYPE string, lt_results TYPE ty_results_tt, lt_types TYPE lcl_objects=>ty_types_tt. FIELD-SYMBOLS: LIKE LINE OF lt_results, LIKE LINE OF lt_tadir, LIKE LINE OF lt_types. lcl_sap_package=>create_local( c_package ). lt_types = lcl_objects=>supported_list( ). lo_repo = lcl_app=>repo_srv( )->new_online( iv_url = 'https://github.com/larshp/abapGit-Unit-Test.git' iv_branch_name = 'refs/heads/master' iv_package = c_package ). lo_repo->status( ). lo_repo->deserialize( ). lt_tadir = lcl_tadir=>read( c_package ). LOOP AT lt_types ASSIGNING . READ TABLE lt_tadir WITH KEY object = TRANSPORTING NO FIELDS. IF sy-subrc <> 0. lv_msg = |Missing object type { }|. cl_abap_unit_assert=>fail( msg = lv_msg level = if_aunit_constants=>tolerable quit = if_aunit_constants=>no ). ENDIF. ENDLOOP. lt_results = lo_repo->status( ). LOOP AT lt_results ASSIGNING WHERE match = abap_false. lv_msg = |Does not match { -obj_type } { -obj_name }|. cl_abap_unit_assert=>fail( msg = lv_msg quit = if_aunit_constants=>no ). ENDLOOP. lcl_objects=>delete( lt_tadir ). lt_tadir = lcl_tadir=>read( c_package ). LOOP AT lt_tadir ASSIGNING . lv_msg = |Not deleted properly { -object } { -obj_name }|. cl_abap_unit_assert=>fail( msg = lv_msg quit = if_aunit_constants=>no ). ENDLOOP. lcl_app=>repo_srv( )->delete( lo_repo ). COMMIT WORK. ENDMETHOD. "run ENDCLASS. "ltcl_dangerous IMPLEMENTATION *----------------------------------------------------------------------* * CLASS ltcl_diff DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_diff DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. DATA: mt_local TYPE TABLE OF string, mt_remote TYPE TABLE OF string, mt_expected TYPE lcl_diff=>ty_diffs_tt, ms_expected LIKE LINE OF mt_expected. METHODS: setup. METHODS: test. METHODS: diff01 FOR TESTING, diff02 FOR TESTING, diff03 FOR TESTING, diff04 FOR TESTING, diff05 FOR TESTING, diff06 FOR TESTING. ENDCLASS. "ltcl_diff DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_diff IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_diff IMPLEMENTATION. DEFINE _local. APPEND &1 TO mt_local. END-OF-DEFINITION. DEFINE _remote. APPEND &1 TO mt_remote. END-OF-DEFINITION. DEFINE _expected. CLEAR ms_expected. ms_expected-local = &1. ms_expected-result = &2. ms_expected-remote = &3. APPEND ms_expected TO mt_expected. END-OF-DEFINITION. METHOD setup. CLEAR mt_local. CLEAR mt_remote. CLEAR mt_expected. ENDMETHOD. "setup METHOD test. DATA: lv_local TYPE string, lv_xlocal TYPE xstring, lv_remote TYPE string, lv_xremote TYPE xstring, lo_diff TYPE REF TO lcl_diff, lt_diff TYPE lcl_diff=>ty_diffs_tt. FIELD-SYMBOLS: LIKE LINE OF lt_diff. CONCATENATE LINES OF mt_local INTO lv_local SEPARATED BY gc_newline. CONCATENATE LINES OF mt_remote INTO lv_remote SEPARATED BY gc_newline. lv_xlocal = lcl_convert=>string_to_xstring_utf8( lv_local ). lv_xremote = lcl_convert=>string_to_xstring_utf8( lv_remote ). CREATE OBJECT lo_diff EXPORTING iv_local = lv_xlocal iv_remote = lv_xremote. lt_diff = lo_diff->get( ). LOOP AT lt_diff ASSIGNING . CLEAR -local_line. CLEAR -remote_line. CLEAR -short. ENDLOOP. cl_abap_unit_assert=>assert_equals( act = lt_diff exp = mt_expected ). ENDMETHOD. "test METHOD diff01. * insert _local '1'. _expected '1' lcl_diff=>c_diff-insert ''. test( ). ENDMETHOD. "diff01 METHOD diff02. * identical _local '1'. _remote '1'. _expected '1' '' '1'. test( ). ENDMETHOD. "diff02 METHOD diff03. * delete _remote '1'. _expected '' lcl_diff=>c_diff-delete '1'. test( ). ENDMETHOD. "diff03 METHOD diff04. * update _local '1+'. _remote '1'. _expected '1+' lcl_diff=>c_diff-update '1'. test( ). ENDMETHOD. "diff04 METHOD diff05. * identical _local '1'. _local '2'. _remote '1'. _remote '2'. _expected '1' '' '1'. _expected '2' '' '2'. test( ). ENDMETHOD. "diff05 METHOD diff06. _local '1'. _local '2'. _local 'inserted'. _local '3'. _local '4 update'. _remote '1'. _remote '2'. _remote '3'. _remote '4'. _expected '1' '' '1'. _expected '2' '' '2'. _expected 'inserted' lcl_diff=>c_diff-insert ''. _expected '3' '' '3'. _expected '4 update' lcl_diff=>c_diff-update '4'. test( ). ENDMETHOD. "diff06 ENDCLASS. "ltcl_diff IMPLEMENTATION CLASS ltcl_dot_abapgit DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: identity FOR TESTING RAISING lcx_exception, ignore FOR TESTING. ENDCLASS. CLASS ltcl_dot_abapgit IMPLEMENTATION. METHOD identity. DATA: lo_dot TYPE REF TO lcl_dot_abapgit, ls_before TYPE lcl_dot_abapgit=>ty_dot_abapgit, ls_after TYPE lcl_dot_abapgit=>ty_dot_abapgit. lo_dot = lcl_dot_abapgit=>build_default( gc_english ). ls_before = lo_dot->ms_data. lo_dot = lcl_dot_abapgit=>deserialize( lo_dot->serialize( ) ). ls_after = lo_dot->ms_data. cl_abap_unit_assert=>assert_equals( act = ls_after exp = ls_before ). ENDMETHOD. METHOD ignore. CONSTANTS: lc_path TYPE string VALUE '/', lc_filename TYPE string VALUE 'foobar.txt'. DATA: lv_ignored TYPE abap_bool, lo_dot TYPE REF TO lcl_dot_abapgit. lo_dot = lcl_dot_abapgit=>build_default( gc_english ). lv_ignored = lo_dot->is_ignored( iv_path = lc_path iv_filename = lc_filename ). cl_abap_unit_assert=>assert_equals( act = lv_ignored exp = abap_false ). lo_dot->add_ignore( iv_path = lc_path iv_filename = lc_filename ). lv_ignored = lo_dot->is_ignored( iv_path = lc_path iv_filename = lc_filename ). cl_abap_unit_assert=>assert_equals( act = lv_ignored exp = abap_true ). lo_dot->remove_ignore( iv_path = lc_path iv_filename = lc_filename ). lv_ignored = lo_dot->is_ignored( iv_path = lc_path iv_filename = lc_filename ). cl_abap_unit_assert=>assert_equals( act = lv_ignored exp = abap_false ). ENDMETHOD. ENDCLASS. CLASS ltcl_git_porcelain DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: setup, append IMPORTING iv_path TYPE string iv_name TYPE string, single_file FOR TESTING RAISING lcx_exception, two_files_same_path FOR TESTING RAISING lcx_exception, root_empty FOR TESTING RAISING lcx_exception, sub FOR TESTING RAISING lcx_exception. DATA: mt_expanded TYPE lcl_git_porcelain=>ty_expanded_tt, mt_trees TYPE lcl_git_porcelain=>ty_trees_tt. ENDCLASS. CLASS ltcl_git_porcelain IMPLEMENTATION. METHOD setup. CLEAR mt_expanded. CLEAR mt_trees. ENDMETHOD. METHOD append. FIELD-SYMBOLS: LIKE LINE OF mt_expanded. APPEND INITIAL LINE TO mt_expanded ASSIGNING . -path = iv_path. -name = iv_name. -sha1 = 'a'. -chmod = gc_chmod-file. ENDMETHOD. METHOD single_file. append( iv_path = '/' iv_name = 'foobar.txt' ). mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). cl_abap_unit_assert=>assert_equals( act = lines( mt_trees ) exp = 1 ). ENDMETHOD. METHOD two_files_same_path. append( iv_path = '/' iv_name = 'foo.txt' ). append( iv_path = '/' iv_name = 'bar.txt' ). mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). cl_abap_unit_assert=>assert_equals( act = lines( mt_trees ) exp = 1 ). ENDMETHOD. METHOD sub. append( iv_path = '/' iv_name = 'foo.txt' ). append( iv_path = '/sub/' iv_name = 'bar.txt' ). mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). cl_abap_unit_assert=>assert_equals( act = lines( mt_trees ) exp = 2 ). ENDMETHOD. METHOD root_empty. append( iv_path = '/sub/' iv_name = 'bar.txt' ). mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). * so 2 total trees are expected: '/' and '/sub/' cl_abap_unit_assert=>assert_equals( act = lines( mt_trees ) exp = 2 ). ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * CLASS ltcl_zlib DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_zlib DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: decompress FOR TESTING RAISING cx_dynamic_check. ENDCLASS. "ltcl_zlib DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_zlib IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_zlib IMPLEMENTATION. METHOD decompress. DATA: ls_data TYPE lcl_zlib=>ty_decompress. CONSTANTS: lc_raw TYPE xstring VALUE '48656C6C6F20576F726C64210D0A', lc_compressed TYPE xstring VALUE 'F348CDC9C95708CF2FCA4951E4E5020024E90455'. ls_data = lcl_zlib=>decompress( lc_compressed ). cl_abap_unit_assert=>assert_not_initial( ls_data-raw ). cl_abap_unit_assert=>assert_equals( act = ls_data-raw exp = lc_raw ). ENDMETHOD. "decompress ENDCLASS. "ltcl_zlib IMPLEMENTATION CLASS ltcl_xml DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PUBLIC SECTION. METHODS: up FOR TESTING RAISING lcx_exception, down FOR TESTING RAISING lcx_exception. TYPES: BEGIN OF st_old, foo TYPE i, bar TYPE c LENGTH 1, END OF st_old. TYPES: BEGIN OF st_new, foo TYPE i, bar TYPE c LENGTH 1, moo TYPE f, END OF st_new. ENDCLASS. CLASS ltcl_xml IMPLEMENTATION. METHOD up. DATA: ls_old TYPE st_old, ls_new TYPE st_new, lv_xml TYPE string, lo_input TYPE REF TO lcl_xml_input, lo_output TYPE REF TO lcl_xml_output. ls_old-foo = 2. ls_old-bar = 'A'. CREATE OBJECT lo_output. lo_output->add( iv_name = 'DATA' ig_data = ls_old ). lv_xml = lo_output->render( ). CREATE OBJECT lo_input EXPORTING iv_xml = lv_xml. lo_input->read( EXPORTING iv_name = 'DATA' CHANGING cg_data = ls_new ). cl_abap_unit_assert=>assert_equals( act = ls_new-foo exp = ls_old-foo ). cl_abap_unit_assert=>assert_equals( act = ls_new-bar exp = ls_old-bar ). ENDMETHOD. METHOD down. DATA: ls_old TYPE st_old, ls_new TYPE st_new, lv_xml TYPE string, lo_input TYPE REF TO lcl_xml_input, lo_output TYPE REF TO lcl_xml_output. ls_new-foo = 2. ls_new-bar = 'A'. ls_new-moo = 5. CREATE OBJECT lo_output. lo_output->add( iv_name = 'DATA' ig_data = ls_new ). lv_xml = lo_output->render( ). CREATE OBJECT lo_input EXPORTING iv_xml = lv_xml. lo_input->read( EXPORTING iv_name = 'DATA' CHANGING cg_data = ls_old ). cl_abap_unit_assert=>assert_equals( act = ls_old-foo exp = ls_new-foo ). cl_abap_unit_assert=>assert_equals( act = ls_old-bar exp = ls_new-bar ). ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * CLASS ltcl_url DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_url DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: repo_host FOR TESTING RAISING lcx_exception, repo_name1 FOR TESTING RAISING lcx_exception, repo_name2 FOR TESTING RAISING lcx_exception, repo_error FOR TESTING. ENDCLASS. "ltcl_url DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_url IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_url IMPLEMENTATION. METHOD repo_error. TRY. lcl_url=>host( 'not a real url' ). "#EC NOTEXT cl_abap_unit_assert=>fail( ). CATCH lcx_exception. "#EC NO_HANDLER ENDTRY. ENDMETHOD. "repo_error METHOD repo_host. DATA: lv_host TYPE string. lv_host = lcl_url=>host( 'https://github.com/larshp/Foobar.git' ). cl_abap_unit_assert=>assert_equals( exp = 'https://github.com' act = lv_host ). ENDMETHOD. "repo_url METHOD repo_name1. DATA: lv_name TYPE string. lv_name = lcl_url=>name( 'https://github.com/larshp/Foobar.git' ). cl_abap_unit_assert=>assert_equals( exp = 'Foobar' act = lv_name ). ENDMETHOD. METHOD repo_name2. DATA: lv_name TYPE string. lv_name = lcl_url=>name( 'https://git.hanatrial.ondemand.com/p12345trial/yay' ). cl_abap_unit_assert=>assert_equals( exp = 'yay' act = lv_name ). ENDMETHOD. ENDCLASS. "ltcl_url IMPLEMENTATION *----------------------------------------------------------------------* * CLASS ltcl_object_types DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_object_types DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: is_supported FOR TESTING, not_exist FOR TESTING RAISING lcx_exception. ENDCLASS. "ltcl_object_types DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_object_types IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_object_types IMPLEMENTATION. METHOD is_supported. DATA: ls_item TYPE ty_item, lv_supported TYPE abap_bool, lt_types TYPE lcl_objects=>ty_types_tt. FIELD-SYMBOLS: LIKE LINE OF lt_types. lt_types = lcl_objects=>supported_list( ). LOOP AT lt_types ASSIGNING . CLEAR ls_item. ls_item-obj_type = . lv_supported = lcl_objects=>is_supported( ls_item ). cl_abap_unit_assert=>assert_equals( act = lv_supported exp = abap_true msg = ls_item-obj_type quit = if_aunit_constants=>no ). ENDLOOP. ENDMETHOD. "is_supported METHOD not_exist. DATA: ls_item TYPE ty_item, lv_exists TYPE abap_bool, lt_types TYPE lcl_objects=>ty_types_tt. FIELD-SYMBOLS: LIKE LINE OF lt_types. lt_types = lcl_objects=>supported_list( ). LOOP AT lt_types ASSIGNING . CLEAR ls_item. ls_item-obj_name = 'ZABAPGIT_FOOBAR'. ls_item-obj_type = . lv_exists = lcl_objects=>exists( ls_item ). cl_abap_unit_assert=>assert_equals( act = lv_exists exp = abap_false msg = ls_item-obj_type quit = if_aunit_constants=>no ). ENDLOOP. ENDMETHOD. "not_exist ENDCLASS. "ltcl_object_types IMPLEMENTATION CLASS ltcl_git_pack_decode_commit DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PUBLIC SECTION. METHODS: decode1 FOR TESTING RAISING lcx_exception, decode2 FOR TESTING RAISING lcx_exception, decode3 FOR TESTING RAISING lcx_exception. PRIVATE SECTION. DATA: ms_raw TYPE lcl_git_pack=>ty_commit, mv_str TYPE string. METHODS: setup, decode RAISING lcx_exception, add IMPORTING iv_string TYPE string. ENDCLASS. CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. METHOD setup. CLEAR ms_raw. CLEAR mv_str. ENDMETHOD. METHOD add. CONCATENATE mv_str iv_string gc_newline INTO mv_str. ENDMETHOD. METHOD decode. DATA: lv_xstr TYPE xstring. lv_xstr = lcl_convert=>string_to_xstring_utf8( mv_str ). ms_raw = lcl_git_pack=>decode_commit( lv_xstr ). ENDMETHOD. METHOD decode1. add( 'tree tree' ). add( 'parent parent1' ). add( 'parent parent2' ). add( 'author author' ). add( 'committer committer' ). add( '' ). add( 'comment' ). decode( ). cl_abap_unit_assert=>assert_equals( act = ms_raw-tree exp = 'tree' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-author exp = 'author' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-committer exp = 'committer' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-body exp = 'comment' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent exp = 'parent1' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent2 exp = 'parent2' ). ENDMETHOD. METHOD decode2. add( 'tree tree' ). add( 'author author' ). add( 'committer committer' ). add( '' ). add( 'comment' ). decode( ). cl_abap_unit_assert=>assert_equals( act = ms_raw-tree exp = 'tree' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-author exp = 'author' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-committer exp = 'committer' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-body exp = 'comment' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent exp = '' ). ENDMETHOD. METHOD decode3. add( 'tree tree' ). add( 'parent parent1' ). add( 'author author' ). add( 'committer committer' ). add( '' ). add( 'comment' ). decode( ). cl_abap_unit_assert=>assert_equals( act = ms_raw-tree exp = 'tree' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-author exp = 'author' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-committer exp = 'committer' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-body exp = 'comment' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent exp = 'parent1' ). ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * CLASS test DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: tree FOR TESTING RAISING lcx_exception, commit FOR TESTING RAISING lcx_exception, pack_short FOR TESTING RAISING lcx_exception, pack_long FOR TESTING RAISING lcx_exception, pack_multiple FOR TESTING RAISING lcx_exception, sort_tree1 FOR TESTING, sort_tree2 FOR TESTING. METHODS: object_blob IMPORTING iv_data TYPE xstring RETURNING VALUE(rs_object) TYPE ty_object RAISING lcx_exception. ENDCLASS. "test DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_git_pack IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_git_pack IMPLEMENTATION. METHOD sort_tree1. DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt. FIELD-SYMBOLS: LIKE LINE OF lt_tree. APPEND INITIAL LINE TO lt_tree ASSIGNING . -chmod = gc_chmod-file. -name = 'b.txt'. -sha1 = '0123'. APPEND INITIAL LINE TO lt_tree ASSIGNING . -chmod = gc_chmod-file. -name = 'a.txt'. -sha1 = '0123'. lt_tree = lcl_git_pack=>sort_tree( lt_tree ). READ TABLE lt_tree INDEX 1 ASSIGNING . cl_abap_unit_assert=>assert_subrc( ). cl_abap_unit_assert=>assert_equals( act = -name exp = 'a.txt' ). ENDMETHOD. METHOD sort_tree2. DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt. FIELD-SYMBOLS: LIKE LINE OF lt_tree. APPEND INITIAL LINE TO lt_tree ASSIGNING . -chmod = gc_chmod-file. -name = 'foo.txt'. -sha1 = '0123'. APPEND INITIAL LINE TO lt_tree ASSIGNING . -chmod = gc_chmod-dir. -name = 'foo'. -sha1 = '0123'. lt_tree = lcl_git_pack=>sort_tree( lt_tree ). READ TABLE lt_tree INDEX 1 ASSIGNING . cl_abap_unit_assert=>assert_subrc( ). cl_abap_unit_assert=>assert_equals( act = -name exp = 'foo.txt' ). ENDMETHOD. METHOD pack_multiple. CONSTANTS: lc_data TYPE x LENGTH 15 VALUE '123456789ABCDEF545794254754554', lc_sha TYPE ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'. DATA: lt_objects TYPE ty_objects_tt, ls_object LIKE LINE OF lt_objects, lt_nodes TYPE lcl_git_pack=>ty_nodes_tt, ls_node LIKE LINE OF lt_nodes, ls_commit TYPE lcl_git_pack=>ty_commit, lt_result TYPE ty_objects_tt, lv_data TYPE xstring. * blob lv_data = lc_data. CLEAR ls_object. ls_object-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = lv_data ). ls_object-type = gc_type-blob. ls_object-data = lv_data. APPEND ls_object TO lt_objects. * commit CLEAR ls_commit. ls_commit-tree = lc_sha. ls_commit-parent = lc_sha. ls_commit-author = 'John Foobar'. ls_commit-committer = 'John Foobar'. ls_commit-body = 'body'. lv_data = lcl_git_pack=>encode_commit( ls_commit ). CLEAR ls_object. ls_object-sha1 = lcl_hash=>sha1( iv_type = gc_type-commit iv_data = lv_data ). ls_object-type = gc_type-commit. ls_object-data = lv_data. APPEND ls_object TO lt_objects. * tree CLEAR ls_node. ls_node-chmod = '12456'. ls_node-name = 'foobar.abap'. ls_node-sha1 = lc_sha. APPEND ls_node TO lt_nodes. lv_data = lcl_git_pack=>encode_tree( lt_nodes ). CLEAR ls_object. ls_object-sha1 = lcl_hash=>sha1( iv_type = gc_type-tree iv_data = lv_data ). ls_object-type = gc_type-tree. ls_object-data = lv_data. APPEND ls_object TO lt_objects. CLEAR lv_data. lv_data = lcl_git_pack=>encode( lt_objects ). lt_result = lcl_git_pack=>decode( lv_data ). cl_abap_unit_assert=>assert_equals( exp = lt_objects act = lt_result ). ENDMETHOD. "encode_decode_pack_multiple METHOD object_blob. rs_object-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = iv_data ). rs_object-type = gc_type-blob. rs_object-data = iv_data. ENDMETHOD. "object_blob METHOD pack_short. CONSTANTS: lc_data TYPE x LENGTH 8 VALUE '0123456789ABCDEF'. DATA: lt_objects TYPE ty_objects_tt, ls_object LIKE LINE OF lt_objects, lt_result TYPE ty_objects_tt, lv_data TYPE xstring. lv_data = lc_data. ls_object = object_blob( lv_data ). APPEND ls_object TO lt_objects. CLEAR lv_data. lv_data = lcl_git_pack=>encode( lt_objects ). lt_result = lcl_git_pack=>decode( lv_data ). cl_abap_unit_assert=>assert_equals( exp = lt_objects act = lt_result ). ENDMETHOD. "encode_decode_pack METHOD pack_long. CONSTANTS: lc_data TYPE x LENGTH 8 VALUE '0123456789ABCDEF'. DATA: lt_objects TYPE ty_objects_tt, ls_object LIKE LINE OF lt_objects, lv_xstring TYPE xstring, lt_result TYPE ty_objects_tt, lv_data TYPE xstring. lv_xstring = lc_data. DO 20 TIMES. CONCATENATE lv_xstring lv_data INTO lv_data IN BYTE MODE. ENDDO. ls_object = object_blob( lv_data ). APPEND ls_object TO lt_objects. CLEAR lv_data. lv_data = lcl_git_pack=>encode( lt_objects ). lt_result = lcl_git_pack=>decode( lv_data ). cl_abap_unit_assert=>assert_equals( exp = lt_objects act = lt_result ). ENDMETHOD. "encode_decode_pack_long METHOD tree. CONSTANTS: lc_sha TYPE ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'. DATA: lt_nodes TYPE lcl_git_pack=>ty_nodes_tt, ls_node LIKE LINE OF lt_nodes, lv_data TYPE xstring, lt_result TYPE lcl_git_pack=>ty_nodes_tt. CLEAR ls_node. ls_node-chmod = gc_chmod-file. ls_node-name = 'foobar.txt'. ls_node-sha1 = lc_sha. APPEND ls_node TO lt_nodes. lv_data = lcl_git_pack=>encode_tree( lt_nodes ). lt_result = lcl_git_pack=>decode_tree( lv_data ). cl_abap_unit_assert=>assert_equals( exp = lt_nodes act = lt_result ). ENDMETHOD. "tree METHOD commit. CONSTANTS: lc_tree TYPE ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc', lc_parent TYPE ty_sha1 VALUE '1236cb3c4b7f0b3600b64f744cde614a283a88dc'. DATA: ls_commit TYPE lcl_git_pack=>ty_commit, ls_result TYPE lcl_git_pack=>ty_commit, lv_data TYPE xstring. ls_commit-tree = lc_tree. ls_commit-parent = lc_parent. ls_commit-author = 'larshp 1387823471 +0100'. ls_commit-committer = 'larshp 1387823471 +0100'. ls_commit-body = 'very informative'. lv_data = lcl_git_pack=>encode_commit( ls_commit ). ls_result = lcl_git_pack=>decode_commit( lv_data ). cl_abap_unit_assert=>assert_equals( exp = ls_commit act = ls_result ). ENDMETHOD. "commit ENDCLASS. "lcl_abap_unit IMPLEMENTATION CLASS ltcl_html_helper DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. DATA: mo_html TYPE REF TO lcl_html_helper. METHODS: indent1 FOR TESTING RAISING lcx_exception, indent2 FOR TESTING RAISING lcx_exception, indent3 FOR TESTING RAISING lcx_exception, indent4 FOR TESTING RAISING lcx_exception, style1 FOR TESTING RAISING lcx_exception. METHODS: setup, last_line RETURNING VALUE(rv_line) TYPE string. ENDCLASS. CLASS ltcl_html_helper IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_html. ENDMETHOD. METHOD indent1. mo_html->add( '' ). mo_html->add( 'hello world' ). mo_html->add( '' ). cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '' ). ENDMETHOD. METHOD indent2. mo_html->add( '' ). mo_html->add( '' ). mo_html->add( '' ). cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '' ). ENDMETHOD. METHOD indent3. mo_html->add( '' ). mo_html->add( '' ). mo_html->add( '' ). cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '' ). ENDMETHOD. METHOD indent4. mo_html->add( '' ). mo_html->add( 'foo
bar' ). mo_html->add( '' ). cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '' ). ENDMETHOD. METHOD last_line. DATA: lt_strings TYPE STANDARD TABLE OF string WITH DEFAULT KEY. SPLIT mo_html->mv_html AT gc_newline INTO TABLE lt_strings. READ TABLE lt_strings INDEX lines( lt_strings ) INTO rv_line. ENDMETHOD. METHOD style1. mo_html->add( '' ). cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '' ). ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * CLASS ltcl_serialize DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_serialize DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. METHODS: check IMPORTING is_item TYPE ty_item RAISING lcx_exception, serialize_tabl FOR TESTING RAISING lcx_exception, serialize_enqu FOR TESTING RAISING lcx_exception, serialize_shlp FOR TESTING RAISING lcx_exception, serialize_view FOR TESTING RAISING lcx_exception, serialize_auth FOR TESTING RAISING lcx_exception, serialize_clas FOR TESTING RAISING lcx_exception, serialize_doma FOR TESTING RAISING lcx_exception, serialize_dtel FOR TESTING RAISING lcx_exception, serialize_fugr FOR TESTING RAISING lcx_exception, serialize_msag FOR TESTING RAISING lcx_exception, serialize_prog FOR TESTING RAISING lcx_exception, serialize_tran FOR TESTING RAISING lcx_exception, serialize_ttyp FOR TESTING RAISING lcx_exception. ENDCLASS. "ltcl_serialize DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_serialize IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_serialize IMPLEMENTATION. METHOD serialize_enqu. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'ENQU'. ls_item-obj_name = 'E_USR04'. check( ls_item ). ENDMETHOD. "lcl_abap_unit METHOD serialize_shlp. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'SHLP'. ls_item-obj_name = 'USER_LOGON'. check( ls_item ). ENDMETHOD. "lcl_abap_unit METHOD serialize_view. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'VIEW'. ls_item-obj_name = 'VUSR02_HEADER'. check( ls_item ). ENDMETHOD. "lcl_abap_unit METHOD serialize_tabl. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'TABL'. ls_item-obj_name = 'USR02'. check( ls_item ). ENDMETHOD. "serialize_table METHOD serialize_auth. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'AUTH'. ls_item-obj_name = 'AREA'. check( ls_item ). ENDMETHOD. "serialize_auth METHOD serialize_clas. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'CLAS'. ls_item-obj_name = 'CL_GUI_FRONTEND_SERVICES'. check( ls_item ). ENDMETHOD. "serialize_clas METHOD serialize_doma. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'DOMA'. ls_item-obj_name = 'PGMID'. check( ls_item ). ENDMETHOD. "serialize_doma METHOD serialize_dtel. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'DTEL'. ls_item-obj_name = 'PGMID'. check( ls_item ). ENDMETHOD. "serialize_dtel METHOD serialize_fugr. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'FUGR'. ls_item-obj_name = 'SRFC'. check( ls_item ). ENDMETHOD. "serialize_fugr METHOD serialize_msag. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'MSAG'. ls_item-obj_name = '00'. check( ls_item ). ENDMETHOD. "serialize_msag METHOD serialize_prog. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'PROG'. ls_item-obj_name = 'SAPLWBABAP'. check( ls_item ). ENDMETHOD. "serialize_prog METHOD serialize_tran. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'TRAN'. ls_item-obj_name = 'SE38'. check( ls_item ). ENDMETHOD. "serialize_tran METHOD serialize_ttyp. DATA: ls_item TYPE ty_item. ls_item-obj_type = 'TTYP'. ls_item-obj_name = 'ABAPPROG'. check( ls_item ). ENDMETHOD. "serialize_ttyp METHOD check. DATA: lt_files TYPE ty_files_tt. lt_files = lcl_objects=>serialize( is_item = is_item iv_language = gc_english ). cl_abap_unit_assert=>assert_not_initial( lt_files ). ENDMETHOD. "check ENDCLASS. "ltcl_serialize IMPLEMENTATION CLASS ltcl_login_manager DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. CONSTANTS: c_username TYPE string VALUE 'Aladdin' ##NO_TEXT, c_password TYPE string VALUE 'OpenSesame' ##NO_TEXT. METHODS: setup, teardown, encoding FOR TESTING RAISING lcx_exception, same_server FOR TESTING RAISING lcx_exception. ENDCLASS. CLASS ltcl_login_manager IMPLEMENTATION. METHOD setup. lcl_login_manager=>clear( ). ENDMETHOD. METHOD teardown. lcl_login_manager=>clear( ). ENDMETHOD. METHOD encoding. DATA: lv_auth TYPE string. lv_auth = lcl_login_manager=>set( iv_uri = 'https://github.com/larshp/abapGit.git' iv_username = c_username iv_password = c_password ). cl_abap_unit_assert=>assert_equals( act = lv_auth exp = 'Basic QWxhZGRpbjpPcGVuU2VzYW1l' ). ENDMETHOD. METHOD same_server. CONSTANTS: lc_github1 TYPE string VALUE 'https://github.com/larshp/abapGit.git', lc_github2 TYPE string VALUE 'https://github.com/larshp/Foobar.git'. DATA: lv_auth1 TYPE string, lv_auth2 TYPE string. lcl_login_manager=>set( iv_uri = lc_github1 iv_username = c_username iv_password = c_password ). lv_auth1 = lcl_login_manager=>load( lc_github1 ). lv_auth2 = lcl_login_manager=>load( lc_github2 ). cl_abap_unit_assert=>assert_equals( act = lv_auth1 exp = lv_auth2 ). ENDMETHOD. ENDCLASS. CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL INHERITING FROM CL_AUNIT_ASSERT. PUBLIC SECTION. METHODS add_field FOR TESTING. METHODS get_field FOR TESTING. ENDCLASS. "ltcl_html_action_utils CLASS ltcl_html_action_utils IMPLEMENTATION. METHOD add_field. DATA: lt_fields TYPE tihttpnvp, lt_answer TYPE tihttpnvp, ls_field LIKE LINE OF lt_fields. ls_field-name = 'NAME'. ls_field-value = 'TEST'. APPEND ls_field TO lt_answer. ls_field-name = 'VALUE'. ls_field-value = 'TEST'. APPEND ls_field TO lt_answer. lcl_html_action_utils=>add_field( EXPORTING name = 'NAME' iv = 'TEST' CHANGING ct = lt_fields ). lcl_html_action_utils=>add_field( EXPORTING name = 'VALUE' iv = ls_field CHANGING ct = lt_fields ). assert_equals( act = lt_fields exp = lt_answer ). ENDMETHOD. "add_field METHOD get_field. DATA: lt_fields TYPE tihttpnvp, ls_answer LIKE LINE OF lt_fields, ls_field LIKE LINE OF lt_fields. ls_answer-name = 'NAME'. ls_answer-value = 'TEST'. APPEND ls_answer TO lt_fields. lcl_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ls_field-value ). lcl_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ls_field ). ls_answer-name = 'TEST'. ls_answer-value = 'TEST'. assert_equals( act = ls_field exp = ls_answer ). " Both field are filled! ENDMETHOD. "get_field ENDCLASS. "ltcl_html_action_utils CLASS ltcl_path DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL INHERITING FROM CL_AUNIT_ASSERT. PUBLIC SECTION. METHODS is_root FOR TESTING. METHODS split_file_location FOR TESTING. METHODS is_subdir FOR TESTING. METHODS change_dir FOR TESTING. ENDCLASS. "ltcl_path CLASS ltcl_path IMPLEMENTATION. METHOD is_root. assert_equals( exp = abap_true act = lcl_path=>is_root( '/' ) ). assert_equals( exp = abap_false act = lcl_path=>is_root( '' ) ). assert_equals( exp = abap_false act = lcl_path=>is_root( 'somedir' ) ). assert_equals( exp = abap_false act = lcl_path=>is_root( '/somedir' ) ). ENDMETHOD. METHOD split_file_location. DATA: lv_path TYPE string, lv_name TYPE string. lcl_path=>split_file_location( EXPORTING iv_fullpath = '' IMPORTING ev_path = lv_path ev_filename = lv_name ). assert_equals( act = lv_path exp = '' ). assert_equals( act = lv_name exp = '' ). lcl_path=>split_file_location( EXPORTING iv_fullpath = 'somefile' IMPORTING ev_path = lv_path ev_filename = lv_name ). assert_equals( act = lv_path exp = '' ). assert_equals( act = lv_name exp = 'somefile' ). lcl_path=>split_file_location( EXPORTING iv_fullpath = '/' IMPORTING ev_path = lv_path ev_filename = lv_name ). assert_equals( act = lv_path exp = '/' ). assert_equals( act = lv_name exp = '' ). lcl_path=>split_file_location( EXPORTING iv_fullpath = '/somefile' IMPORTING ev_path = lv_path ev_filename = lv_name ). assert_equals( act = lv_path exp = '/' ). assert_equals( act = lv_name exp = 'somefile' ). lcl_path=>split_file_location( EXPORTING iv_fullpath = '/somedir/' IMPORTING ev_path = lv_path ev_filename = lv_name ). assert_equals( act = lv_path exp = '/somedir/' ). assert_equals( act = lv_name exp = '' ). lcl_path=>split_file_location( EXPORTING iv_fullpath = '/somedir/somefile' IMPORTING ev_path = lv_path ev_filename = lv_name ). assert_equals( act = lv_path exp = '/somedir/' ). assert_equals( act = lv_name exp = 'somefile' ). ENDMETHOD. METHOD is_subdir. DATA lv_yes TYPE abap_bool. lv_yes = lcl_path=>is_subdir( iv_path = '/dir/subdir' iv_parent = '/dir' ). assert_equals( act = lv_yes exp = abap_true ). lv_yes = lcl_path=>is_subdir( iv_path = '/dir/subdir' iv_parent = '/dir/' ). assert_equals( act = lv_yes exp = abap_true ). lv_yes = lcl_path=>is_subdir( iv_path = '/another' iv_parent = '/dir' ). assert_equals( act = lv_yes exp = abap_false ). lv_yes = lcl_path=>is_subdir( iv_path = '/dir' iv_parent = '/dir' ). assert_equals( act = lv_yes exp = abap_false ). lv_yes = lcl_path=>is_subdir( iv_path = '/dir' iv_parent = '/' ). assert_equals( act = lv_yes exp = abap_true ). lv_yes = lcl_path=>is_subdir( iv_path = '/dir2' iv_parent = '/dir' ). assert_equals( act = lv_yes exp = abap_false ). ENDMETHOD. METHOD change_dir. DATA lv_path TYPE string. lv_path = lcl_path=>change_dir( iv_cur_dir = '' iv_cd = '' ). assert_equals( act = lv_path exp = '' ). lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' iv_cd = '' ). assert_equals( act = lv_path exp = '/dir' ). lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' iv_cd = '.' ). assert_equals( act = lv_path exp = '/dir' ). lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' iv_cd = '..' ). assert_equals( act = lv_path exp = '/' ). lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir/sub' iv_cd = '..' ). assert_equals( act = lv_path exp = '/dir/' ). lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir/' iv_cd = 'sub' ). assert_equals( act = lv_path exp = '/dir/sub' ). lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' iv_cd = 'sub' ). assert_equals( act = lv_path exp = '/dir/sub' ). ENDMETHOD. ENDCLASS. "ltcl_path