#include "clar_libgit2.h" #include #include #include #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) \ structname structname##_macro_latest = macroinit; \ structname structname##_func_latest; \ 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."); \ \ int structname##_curr_ver = structver - 1; \ while (structname##_curr_ver > 0) \ { \ structname macro; \ cl_git_pass(funcinitname(¯o, structname##_curr_ver)); \ structname##_curr_ver--; \ } 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_opts, GIT_CHECKOUT_OPTS_VERSION, \ GIT_CHECKOUT_OPTS_INIT, git_checkout_init_opts); /* 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_tree */ CHECK_MACRO_FUNC_INIT_EQUAL( \ git_merge_tree_opts, GIT_MERGE_TREE_OPTS_VERSION, \ GIT_MERGE_TREE_OPTS_INIT, git_merge_tree_init_opts); /* merge */ CHECK_MACRO_FUNC_INIT_EQUAL( \ git_merge_opts, GIT_MERGE_OPTS_VERSION, \ GIT_MERGE_OPTS_INIT, git_merge_init_opts); /* 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_opts, GIT_REVERT_OPTS_VERSION, \ GIT_REVERT_OPTS_INIT, git_revert_init_opts); /* 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); }