summaryrefslogtreecommitdiff
path: root/tests-clar/diff/tree.c
diff options
context:
space:
mode:
authorRussell Belfer <arrbee@arrbee.com>2012-02-07 15:30:18 -0800
committerRussell Belfer <arrbee@arrbee.com>2012-03-02 15:49:29 -0800
commitcaf71ec081fe4067fff5f1a172e7a2e4bbe7eb0f (patch)
treeb97a9808ceb0e126cf61741dd227439e84caadf8 /tests-clar/diff/tree.c
parenta2e895be820a2fd77285ef4576afe53f68c96ca2 (diff)
downloadlibgit2-caf71ec081fe4067fff5f1a172e7a2e4bbe7eb0f.tar.gz
Add tests and fix bugs for diff whitespace options
Once I added tests for the whitespace handling options of diff, I realized that there were some bugs. This fixes those and adds the new tests into the test suite.
Diffstat (limited to 'tests-clar/diff/tree.c')
-rw-r--r--tests-clar/diff/tree.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/tests-clar/diff/tree.c b/tests-clar/diff/tree.c
index 836db576..eb4092af 100644
--- a/tests-clar/diff/tree.c
+++ b/tests-clar/diff/tree.c
@@ -84,3 +84,90 @@ void test_diff_tree__0(void)
git_tree_free(b);
git_tree_free(c);
}
+
+void test_diff_tree__options(void)
+{
+ /* grabbed a couple of commit oids from the history of the attr repo */
+ const char *a_commit = "6bab5c79cd5140d0";
+ const char *b_commit = "605812ab7fe421fdd";
+ const char *c_commit = "f5b0af1fb4f5";
+ const char *d_commit = "a97cc019851";
+
+ git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit);
+ git_tree *b = resolve_commit_oid_to_tree(g_repo, b_commit);
+ git_tree *c = resolve_commit_oid_to_tree(g_repo, c_commit);
+ git_tree *d = resolve_commit_oid_to_tree(g_repo, d_commit);
+
+ git_diff_options opts = {0};
+ git_diff_list *diff = NULL;
+ diff_expects exp;
+ int test_ab_or_cd[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1 };
+ git_diff_options test_options[] = {
+ /* a vs b tests */
+ { GIT_DIFF_NORMAL, 1, 1, NULL, NULL, {0} },
+ { GIT_DIFF_NORMAL, 3, 1, NULL, NULL, {0} },
+ { GIT_DIFF_REVERSE, 2, 1, NULL, NULL, {0} },
+ { GIT_DIFF_FORCE_TEXT, 2, 1, NULL, NULL, {0} },
+ /* c vs d tests */
+ { GIT_DIFF_NORMAL, 3, 1, NULL, NULL, {0} },
+ { GIT_DIFF_IGNORE_WHITESPACE, 3, 1, NULL, NULL, {0} },
+ { GIT_DIFF_IGNORE_WHITESPACE_CHANGE, 3, 1, NULL, NULL, {0} },
+ { GIT_DIFF_IGNORE_WHITESPACE_EOL, 3, 1, NULL, NULL, {0} },
+ { GIT_DIFF_IGNORE_WHITESPACE | GIT_DIFF_REVERSE, 1, 1, NULL, NULL, {0} },
+ };
+ /* to generate these values:
+ * - cd to tests/resources/attr,
+ * - mv .gitted .git
+ * - git diff [options] 6bab5c79cd5140d0 605812ab7fe421fdd
+ * - mv .git .gitted
+ */
+ diff_expects test_expects[] = {
+ /* a vs b tests */
+ { 5, 3, 0, 2, 4, 0, 0, 51, 2, 46, 3 },
+ { 5, 3, 0, 2, 4, 0, 0, 53, 4, 46, 3 },
+ { 5, 0, 3, 2, 4, 0, 0, 52, 3, 3, 46 },
+ { 5, 3, 0, 2, 5, 0, 0, 54, 3, 48, 3 },
+ /* c vs d tests */
+ { 1, 0, 0, 1, 1, 0, 0, 22, 9, 10, 3 },
+ { 1, 0, 0, 1, 1, 0, 0, 19, 12, 7, 0 },
+ { 1, 0, 0, 1, 1, 0, 0, 20, 11, 8, 1 },
+ { 1, 0, 0, 1, 1, 0, 0, 20, 11, 8, 1 },
+ { 1, 0, 0, 1, 1, 0, 0, 18, 11, 0, 7 },
+ { 0 },
+ };
+ int i;
+
+ cl_assert(a);
+ cl_assert(b);
+
+ for (i = 0; test_expects[i].files > 0; i++) {
+ memset(&exp, 0, sizeof(exp)); /* clear accumulator */
+ opts = test_options[i];
+
+ if (test_ab_or_cd[i] == 0)
+ cl_git_pass(git_diff_tree_to_tree(g_repo, &opts, a, b, &diff));
+ else
+ cl_git_pass(git_diff_tree_to_tree(g_repo, &opts, c, d, &diff));
+
+ cl_git_pass(git_diff_foreach(
+ diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn));
+
+ cl_assert(exp.files == test_expects[i].files);
+ cl_assert(exp.file_adds == test_expects[i].file_adds);
+ cl_assert(exp.file_dels == test_expects[i].file_dels);
+ cl_assert(exp.file_mods == test_expects[i].file_mods);
+ cl_assert(exp.hunks == test_expects[i].hunks);
+ cl_assert(exp.lines == test_expects[i].lines);
+ cl_assert(exp.line_ctxt == test_expects[i].line_ctxt);
+ cl_assert(exp.line_adds == test_expects[i].line_adds);
+ cl_assert(exp.line_dels == test_expects[i].line_dels);
+
+ git_diff_list_free(diff);
+ diff = NULL;
+ }
+
+ git_tree_free(a);
+ git_tree_free(b);
+ git_tree_free(c);
+ git_tree_free(d);
+}