| #include "clar_libgit2.h" |
| #include <git2/sys/config.h> |
| #include <git2/sys/odb_backend.h> |
| #include <git2/sys/refdb_backend.h> |
| |
| #define STRINGIFY(s) #s |
| |
| /* Checks two conditions for the specified structure: |
| * 1. That the initializers for the latest version produces the same |
| * in-memory representation. |
| * 2. That the function-based initializer supports all versions from 1...n, |
| * where n is the latest version (often represented by GIT_*_VERSION). |
| * |
| * Parameters: |
| * structname: The name of the structure to test, e.g. git_blame_options. |
| * structver: The latest version of the specified structure. |
| * macroinit: The macro that initializes the latest version of the structure. |
| * funcinitname: The function that initializes the structure. Must have the |
| * signature "int (structname* instance, int version)". |
| */ |
| #define CHECK_MACRO_FUNC_INIT_EQUAL(structname, structver, macroinit, funcinitname) \ |
| do { \ |
| structname structname##_macro_latest = macroinit; \ |
| structname structname##_func_latest; \ |
| int structname##_curr_ver = structver - 1; \ |
| cl_git_pass(funcinitname(&structname##_func_latest, structver)); \ |
| cl_check_( \ |
| memcmp(&structname##_macro_latest, &structname##_func_latest, \ |
| sizeof(structname)) == 0, \ |
| "Macro-based and function-based initializer for " STRINGIFY(structname) \ |
| " are not equivalent."); \ |
| \ |
| while (structname##_curr_ver > 0) \ |
| { \ |
| structname macro; \ |
| cl_git_pass(funcinitname(¯o, structname##_curr_ver)); \ |
| structname##_curr_ver--; \ |
| }\ |
| } while(0) |
| |
| void test_structinit_structinit__compare(void) |
| { |
| /* blame */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_blame_options, GIT_BLAME_OPTIONS_VERSION, \ |
| GIT_BLAME_OPTIONS_INIT, git_blame_init_options); |
| |
| /* checkout */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, \ |
| GIT_CHECKOUT_OPTIONS_INIT, git_checkout_init_options); |
| |
| /* clone */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_clone_options, GIT_CLONE_OPTIONS_VERSION, \ |
| GIT_CLONE_OPTIONS_INIT, git_clone_init_options); |
| |
| /* diff */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_diff_options, GIT_DIFF_OPTIONS_VERSION, \ |
| GIT_DIFF_OPTIONS_INIT, git_diff_init_options); |
| |
| /* diff_find */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_diff_find_options, GIT_DIFF_FIND_OPTIONS_VERSION, \ |
| GIT_DIFF_FIND_OPTIONS_INIT, git_diff_find_init_options); |
| |
| /* merge_file_input */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_merge_file_input, GIT_MERGE_FILE_INPUT_VERSION, \ |
| GIT_MERGE_FILE_INPUT_INIT, git_merge_file_init_input); |
| |
| /* merge_file */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_merge_file_options, GIT_MERGE_FILE_OPTIONS_VERSION, \ |
| GIT_MERGE_FILE_OPTIONS_INIT, git_merge_file_init_options); |
| |
| /* merge_tree */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_merge_options, GIT_MERGE_OPTIONS_VERSION, \ |
| GIT_MERGE_OPTIONS_INIT, git_merge_init_options); |
| |
| /* push */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_push_options, GIT_PUSH_OPTIONS_VERSION, \ |
| GIT_PUSH_OPTIONS_INIT, git_push_init_options); |
| |
| /* remote */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_remote_callbacks, GIT_REMOTE_CALLBACKS_VERSION, \ |
| GIT_REMOTE_CALLBACKS_INIT, git_remote_init_callbacks); |
| |
| /* repository_init */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_repository_init_options, GIT_REPOSITORY_INIT_OPTIONS_VERSION, \ |
| GIT_REPOSITORY_INIT_OPTIONS_INIT, git_repository_init_init_options); |
| |
| /* revert */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_revert_options, GIT_REVERT_OPTIONS_VERSION, \ |
| GIT_REVERT_OPTIONS_INIT, git_revert_init_options); |
| |
| /* status */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_status_options, GIT_STATUS_OPTIONS_VERSION, \ |
| GIT_STATUS_OPTIONS_INIT, git_status_init_options); |
| |
| /* transport */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_transport, GIT_TRANSPORT_VERSION, \ |
| GIT_TRANSPORT_INIT, git_transport_init); |
| |
| /* config_backend */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_config_backend, GIT_CONFIG_BACKEND_VERSION, \ |
| GIT_CONFIG_BACKEND_INIT, git_config_init_backend); |
| |
| /* odb_backend */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_odb_backend, GIT_ODB_BACKEND_VERSION, \ |
| GIT_ODB_BACKEND_INIT, git_odb_init_backend); |
| |
| /* refdb_backend */ |
| CHECK_MACRO_FUNC_INIT_EQUAL( \ |
| git_refdb_backend, GIT_REFDB_BACKEND_VERSION, \ |
| GIT_REFDB_BACKEND_INIT, git_refdb_init_backend); |
| } |