summaryrefslogtreecommitdiff
path: root/tests-clar/status/worktree.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests-clar/status/worktree.c')
-rw-r--r--tests-clar/status/worktree.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/tests-clar/status/worktree.c b/tests-clar/status/worktree.c
new file mode 100644
index 000000000..d8e62a94d
--- /dev/null
+++ b/tests-clar/status/worktree.c
@@ -0,0 +1,154 @@
+#include "clar_libgit2.h"
+#include "fileops.h"
+#include "ignore.h"
+#include "status_data.h"
+
+
+/**
+ * Test fixtures
+ */
+static git_repository *_repository = NULL;
+
+
+/**
+ * Auxiliary methods
+ */
+static int
+cb_status__normal( const char *path, unsigned int status_flags, void *payload)
+{
+ struct status_entry_counts *counts = payload;
+
+ if (counts->entry_count >= counts->expected_entry_count) {
+ counts->wrong_status_flags_count++;
+ goto exit;
+ }
+
+ if (strcmp(path, counts->expected_paths[counts->entry_count])) {
+ counts->wrong_sorted_path++;
+ goto exit;
+ }
+
+ if (status_flags != counts->expected_statuses[counts->entry_count])
+ counts->wrong_status_flags_count++;
+
+exit:
+ counts->entry_count++;
+ return GIT_SUCCESS;
+}
+
+static int
+cb_status__count(const char *GIT_UNUSED(p), unsigned int GIT_UNUSED(s), void *payload)
+{
+ volatile int *count = (int *)payload;
+
+ GIT_UNUSED_ARG(p);
+ GIT_UNUSED_ARG(s);
+
+ *count++;
+
+ return GIT_SUCCESS;
+}
+
+
+
+/**
+ * Initializer
+ *
+ * This method is called once before starting each
+ * test, and will load the required fixtures
+ */
+void test_status_worktree__initialize(void)
+{
+ /*
+ * Sandbox the `status/` repository from our Fixtures.
+ * This will copy the whole folder to our sandbox,
+ * so now it can be accessed with `./status`
+ */
+ cl_fixture_sandbox("status");
+
+ /*
+ * Rename `status/.gitted` to `status/.git`
+ * We do this because we cannot store a folder named `.git`
+ * inside the fixtures folder in our libgit2 repo.
+ */
+ cl_git_pass(
+ p_rename("status/.gitted", "status/.git")
+ );
+
+ /*
+ * Open the sandboxed "status" repository
+ */
+ cl_git_pass(git_repository_open(&_repository, "status/.git"));
+}
+
+/**
+ * Cleanup
+ *
+ * This will be called once after each test finishes, even
+ * if the test failed
+ */
+void test_status_worktree__cleanup(void)
+{
+ git_repository_free(_repository);
+ _repository = NULL;
+
+ cl_fixture_cleanup("status");
+}
+
+/**
+ * Tests - Status determination on a working tree
+ */
+void test_status_worktree__whole_repository(void)
+{
+ struct status_entry_counts counts;
+
+ memset(&counts, 0x0, sizeof(struct status_entry_counts));
+ counts.expected_entry_count = entry_count0;
+ counts.expected_paths = entry_paths0;
+ counts.expected_statuses = entry_statuses0;
+
+ cl_git_pass(
+ git_status_foreach(_repository, cb_status__normal, &counts)
+ );
+
+ cl_assert(counts.entry_count == counts.expected_entry_count);
+ cl_assert(counts.wrong_status_flags_count == 0);
+ cl_assert(counts.wrong_sorted_path == 0);
+}
+
+void test_status_worktree__empty_repository(void)
+{
+ int count = 0;
+
+ git_status_foreach(_repository, cb_status__count, &count);
+ cl_assert(count == 0);
+}
+
+void test_status_worktree__single_file(void)
+{
+ int i;
+ unsigned int status_flags;
+
+ for (i = 0; i < (int)entry_count0; i++) {
+ cl_git_pass(
+ git_status_file(&status_flags, _repository, entry_paths0[i])
+ );
+ cl_assert(entry_statuses0[i] == status_flags);
+ }
+}
+
+void test_status_worktree__ignores(void)
+{
+ int i, ignored;
+
+ for (i = 0; i < (int)entry_count0; i++) {
+ cl_git_pass(git_status_should_ignore(_repository, entry_paths0[i], &ignored));
+ cl_assert(ignored == (entry_statuses0[i] == GIT_STATUS_IGNORED));
+ }
+
+ cl_git_pass(git_status_should_ignore(_repository, "nonexistent_file", &ignored));
+ cl_assert(!ignored);
+
+ cl_git_pass(git_status_should_ignore(_repository, "ignored_nonexistent_file", &ignored));
+ cl_assert(ignored);
+}