Tests::Object::Tag: Add a mechanism to test which tags were returned This patch changes the tag listing test helper to use a struct as input parameter, which tells what we exactly expect. As I don't think, we can rely on the fact that every os and every filesystem will report the tags in the same order, I made this code independent of the order that the tags are retrieved.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
diff --git a/tests-clar/object/tag/list.c b/tests-clar/object/tag/list.c
index ed2cd4f..75feb55 100644
--- a/tests-clar/object/tag/list.c
+++ b/tests-clar/object/tag/list.c
@@ -4,26 +4,56 @@
static git_repository *g_repo;
+#define MAX_USED_TAGS 3
+
+struct pattern_match_t
+{
+ const char* pattern;
+ const size_t expected_matches;
+ const char* expected_results[MAX_USED_TAGS];
+};
+
// Helpers
static void ensure_tag_pattern_match(git_repository *repo,
- const char *pattern,
- const size_t expected_matches)
+ const struct pattern_match_t* data)
{
+ int already_found[MAX_USED_TAGS] = { 0 };
git_strarray tag_list;
int error = 0;
+ size_t sucessfully_found = 0;
+ size_t i, j;
+
+ cl_assert(data->expected_matches <= MAX_USED_TAGS);
- if ((error = git_tag_list_match(&tag_list, pattern, repo)) < 0)
+ if ((error = git_tag_list_match(&tag_list, data->pattern, repo)) < 0)
goto exit;
- if (tag_list.count != expected_matches)
+ if (tag_list.count != data->expected_matches)
+ {
error = GIT_ERROR;
+ goto exit;
+ }
+
+ // we have to be prepared that tags come in any order.
+ for (i = 0; i < tag_list.count; i++)
+ {
+ for (j = 0; j < data->expected_matches; j++)
+ {
+ if (!already_found[j] && !strcmp(data->expected_results[j], tag_list.strings[i]))
+ {
+ already_found[j] = 1;
+ sucessfully_found++;
+ break;
+ }
+ }
+ }
+ cl_assert(sucessfully_found == data->expected_matches);
exit:
git_strarray_free(&tag_list);
cl_git_pass(error);
}
-
// Fixture setup and teardown
void test_object_tag_list__initialize(void)
{
@@ -47,14 +77,20 @@ void test_object_tag_list__list_all(void)
git_strarray_free(&tag_list);
}
+static const struct pattern_match_t matches[] = {
+ { "", 3, { "e90810b", "point_to_blob", "test" } },
+ { "t*", 1, { "test" } },
+ { "*b", 2, { "e90810b", "point_to_blob" } },
+ { "e", 0 },
+ { "e90810b", 1, { "e90810b" } },
+ { "e90810[ab]", 1, { "e90810b" } },
+ { NULL }
+};
+
void test_object_tag_list__list_by_pattern(void)
{
// list all tag names from the repository matching a specified pattern
- ensure_tag_pattern_match(g_repo, "", 3);
- ensure_tag_pattern_match(g_repo, "*", 3);
- ensure_tag_pattern_match(g_repo, "t*", 1);
- ensure_tag_pattern_match(g_repo, "*b", 2);
- ensure_tag_pattern_match(g_repo, "e", 0);
- ensure_tag_pattern_match(g_repo, "e90810b", 1);
- ensure_tag_pattern_match(g_repo, "e90810[ab]", 1);
+ size_t i = 0;
+ while (matches[i].pattern)
+ ensure_tag_pattern_match(g_repo, &matches[i++]);
}