summaryrefslogtreecommitdiff
path: root/tests/libgit2/iterator/iterator_helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libgit2/iterator/iterator_helpers.c')
-rw-r--r--tests/libgit2/iterator/iterator_helpers.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/tests/libgit2/iterator/iterator_helpers.c b/tests/libgit2/iterator/iterator_helpers.c
new file mode 100644
index 000000000..b210dbb0c
--- /dev/null
+++ b/tests/libgit2/iterator/iterator_helpers.c
@@ -0,0 +1,143 @@
+#include "clar_libgit2.h"
+#include "iterator.h"
+#include "repository.h"
+#include "futils.h"
+#include "iterator_helpers.h"
+#include <stdarg.h>
+
+static void assert_at_end(git_iterator *i, bool verbose)
+{
+ const git_index_entry *end;
+ int error = git_iterator_advance(&end, i);
+
+ if (verbose && error != GIT_ITEROVER)
+ fprintf(stderr, "Expected end of iterator, got '%s'\n", end->path);
+
+ cl_git_fail_with(GIT_ITEROVER, error);
+}
+
+void expect_iterator_items(
+ git_iterator *i,
+ size_t expected_flat,
+ const char **expected_flat_paths,
+ size_t expected_total,
+ const char **expected_total_paths)
+{
+ const git_index_entry *entry;
+ size_t count;
+ int no_trees = !(git_iterator_flags(i) & GIT_ITERATOR_INCLUDE_TREES);
+ bool v = false;
+ int error;
+
+ if (v) fprintf(stderr, "== %s ==\n", no_trees ? "notrees" : "trees");
+
+ count = 0;
+
+ while (!git_iterator_advance(&entry, i)) {
+ if (v) fprintf(stderr, " %s %07o\n", entry->path, (int)entry->mode);
+
+ if (no_trees)
+ cl_assert(entry->mode != GIT_FILEMODE_TREE);
+
+ if (expected_flat_paths) {
+ const char *expect_path = expected_flat_paths[count];
+ size_t expect_len = strlen(expect_path);
+
+ cl_assert_equal_s(expect_path, entry->path);
+
+ if (expect_path[expect_len - 1] == '/')
+ cl_assert_equal_i(GIT_FILEMODE_TREE, entry->mode);
+ else
+ cl_assert(entry->mode != GIT_FILEMODE_TREE);
+ }
+
+ cl_assert(++count <= expected_flat);
+ }
+
+ assert_at_end(i, v);
+ cl_assert_equal_i(expected_flat, count);
+
+ cl_git_pass(git_iterator_reset(i));
+
+ count = 0;
+ cl_git_pass(git_iterator_current(&entry, i));
+
+ if (v) fprintf(stderr, "-- %s --\n", no_trees ? "notrees" : "trees");
+
+ while (entry != NULL) {
+ if (v) fprintf(stderr, " %s %07o\n", entry->path, (int)entry->mode);
+
+ if (no_trees)
+ cl_assert(entry->mode != GIT_FILEMODE_TREE);
+
+ if (expected_total_paths) {
+ const char *expect_path = expected_total_paths[count];
+ size_t expect_len = strlen(expect_path);
+
+ cl_assert_equal_s(expect_path, entry->path);
+
+ if (expect_path[expect_len - 1] == '/')
+ cl_assert_equal_i(GIT_FILEMODE_TREE, entry->mode);
+ else
+ cl_assert(entry->mode != GIT_FILEMODE_TREE);
+ }
+
+ if (entry->mode == GIT_FILEMODE_TREE) {
+ error = git_iterator_advance_into(&entry, i);
+
+ /* could return NOTFOUND if directory is empty */
+ cl_assert(!error || error == GIT_ENOTFOUND);
+
+ if (error == GIT_ENOTFOUND) {
+ error = git_iterator_advance(&entry, i);
+ cl_assert(!error || error == GIT_ITEROVER);
+ }
+ } else {
+ error = git_iterator_advance(&entry, i);
+ cl_assert(!error || error == GIT_ITEROVER);
+ }
+
+ if (++count >= expected_total)
+ break;
+ }
+
+ assert_at_end(i, v);
+ cl_assert_equal_i(expected_total, count);
+}
+
+
+void expect_advance_over(
+ git_iterator *i,
+ const char *expected_path,
+ git_iterator_status_t expected_status)
+{
+ const git_index_entry *entry;
+ git_iterator_status_t status;
+ int error;
+
+ cl_git_pass(git_iterator_current(&entry, i));
+ cl_assert_equal_s(expected_path, entry->path);
+
+ error = git_iterator_advance_over(&entry, &status, i);
+ cl_assert(!error || error == GIT_ITEROVER);
+ cl_assert_equal_i(expected_status, status);
+}
+
+void expect_advance_into(
+ git_iterator *i,
+ const char *expected_path)
+{
+ const git_index_entry *entry;
+ int error;
+
+ cl_git_pass(git_iterator_current(&entry, i));
+ cl_assert_equal_s(expected_path, entry->path);
+
+ if (S_ISDIR(entry->mode))
+ error = git_iterator_advance_into(&entry, i);
+ else
+ error = git_iterator_advance(&entry, i);
+
+ cl_assert(!error || error == GIT_ITEROVER);
+}
+