|  | #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); | 
|  | } |