| #define USE_THE_REPOSITORY_VARIABLE | |
| #include "unit-test.h" | |
| #include "lib-oid.h" | |
| #include "oid-array.h" | |
| #include "hex.h" | |
| static void fill_array(struct oid_array *array, const char *hexes[], size_t n) | |
| { | |
| for (size_t i = 0; i < n; i++) { | |
| struct object_id oid; | |
| cl_parse_any_oid(hexes[i], &oid); | |
| oid_array_append(array, &oid); | |
| } | |
| cl_assert_equal_i(array->nr, n); | |
| } | |
| static int add_to_oid_array(const struct object_id *oid, void *data) | |
| { | |
| struct oid_array *array = data; | |
| oid_array_append(array, oid); | |
| return 0; | |
| } | |
| static void t_enumeration(const char **input_args, size_t input_sz, | |
| const char **expect_args, size_t expect_sz) | |
| { | |
| struct oid_array input = OID_ARRAY_INIT, expect = OID_ARRAY_INIT, | |
| actual = OID_ARRAY_INIT; | |
| size_t i; | |
| fill_array(&input, input_args, input_sz); | |
| fill_array(&expect, expect_args, expect_sz); | |
| oid_array_for_each_unique(&input, add_to_oid_array, &actual); | |
| cl_assert_equal_i(actual.nr, expect.nr); | |
| for (i = 0; i < actual.nr; i++) | |
| cl_assert(oideq(&actual.oid[i], &expect.oid[i])); | |
| oid_array_clear(&actual); | |
| oid_array_clear(&input); | |
| oid_array_clear(&expect); | |
| } | |
| #define TEST_ENUMERATION(input, expect) \ | |
| t_enumeration(input, ARRAY_SIZE(input), expect, ARRAY_SIZE(expect)); | |
| static void t_lookup(const char **input_hexes, size_t n, const char *query_hex, | |
| int lower_bound, int upper_bound) | |
| { | |
| struct oid_array array = OID_ARRAY_INIT; | |
| struct object_id oid_query; | |
| int ret; | |
| cl_parse_any_oid(query_hex, &oid_query); | |
| fill_array(&array, input_hexes, n); | |
| ret = oid_array_lookup(&array, &oid_query); | |
| cl_assert(ret <= upper_bound); | |
| cl_assert(ret >= lower_bound); | |
| oid_array_clear(&array); | |
| } | |
| #define TEST_LOOKUP(input_hexes, query, lower_bound, upper_bound) \ | |
| t_lookup(input_hexes, ARRAY_SIZE(input_hexes), query, \ | |
| lower_bound, upper_bound); | |
| void test_oid_array__initialize(void) | |
| { | |
| /* The hash algo is used by oid_array_lookup() internally */ | |
| int algo = cl_setup_hash_algo(); | |
| repo_set_hash_algo(the_repository, algo); | |
| } | |
| static const char *arr_input[] = { "88", "44", "aa", "55" }; | |
| static const char *arr_input_dup[] = { "88", "44", "aa", "55", | |
| "88", "44", "aa", "55", | |
| "88", "44", "aa", "55" }; | |
| static const char *res_sorted[] = { "44", "55", "88", "aa" }; | |
| void test_oid_array__enumerate_unique(void) | |
| { | |
| TEST_ENUMERATION(arr_input, res_sorted); | |
| } | |
| void test_oid_array__enumerate_duplicate(void) | |
| { | |
| TEST_ENUMERATION(arr_input_dup, res_sorted); | |
| } | |
| void test_oid_array__lookup(void) | |
| { | |
| TEST_LOOKUP(arr_input, "55", 1, 1); | |
| } | |
| void test_oid_array__lookup_non_existent(void) | |
| { | |
| TEST_LOOKUP(arr_input, "33", INT_MIN, -1); | |
| } | |
| void test_oid_array__lookup_duplicates(void) | |
| { | |
| TEST_LOOKUP(arr_input_dup, "55", 3, 5); | |
| } | |
| void test_oid_array__lookup_non_existent_dup(void) | |
| { | |
| TEST_LOOKUP(arr_input_dup, "66", INT_MIN, -1); | |
| } | |
| void test_oid_array__lookup_almost_dup(void) | |
| { | |
| const char *nearly_55; | |
| nearly_55 = cl_setup_hash_algo() == GIT_HASH_SHA1 ? | |
| "5500000000000000000000000000000000000001" : | |
| "5500000000000000000000000000000000000000000000000000000000000001"; | |
| TEST_LOOKUP(((const char *[]){ "55", nearly_55 }), "55", 0, 0); | |
| } | |
| void test_oid_array__lookup_single_dup(void) | |
| { | |
| TEST_LOOKUP(((const char *[]){ "55", "55" }), "55", 0, 1); | |
| } |