git-commit-vandalism/contrib/diff-highlight/t/t9400-diff-highlight.sh
Jeff King fbcf99e4ac diff-highlight: test graphs with --color
Our tests send git's output directly to files or pipes, so
there will never be any color. Let's do at least one --color
test to make sure that we can handle this case (which we
currently can, but will be an easy thing to mess up when we
touch the graph code in a future patch).

We'll just cover the --graph case, since this is much more
complex than the earlier cases (i.e., if it manages to
highlight, then the non-graph case definitely would).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-03-21 10:24:19 -07:00

314 lines
6.0 KiB
Bash
Executable File

#!/bin/sh
test_description='Test diff-highlight'
CURR_DIR=$(pwd)
TEST_OUTPUT_DIRECTORY=$(pwd)
TEST_DIRECTORY="$CURR_DIR"/../../../t
DIFF_HIGHLIGHT="$CURR_DIR"/../diff-highlight
CW="$(printf "\033[7m")" # white
CR="$(printf "\033[27m")" # reset
. "$TEST_DIRECTORY"/test-lib.sh
if ! test_have_prereq PERL
then
skip_all='skipping diff-highlight tests; perl not available'
test_done
fi
# dh_test is a test helper function which takes 3 file names as parameters. The
# first 2 files are used to generate diff and commit output, which is then
# piped through diff-highlight. The 3rd file should contain the expected output
# of diff-highlight (minus the diff/commit header, ie. everything after and
# including the first @@ line).
dh_test () {
a="$1" b="$2" &&
cat >patch.exp &&
{
cat "$a" >file &&
git add file &&
git commit -m "Add a file" &&
cat "$b" >file &&
git diff file >diff.raw &&
git commit -a -m "Update a file" &&
git show >commit.raw
} >/dev/null &&
"$DIFF_HIGHLIGHT" <diff.raw | test_strip_patch_header >diff.act &&
"$DIFF_HIGHLIGHT" <commit.raw | test_strip_patch_header >commit.act &&
test_cmp patch.exp diff.act &&
test_cmp patch.exp commit.act
}
test_strip_patch_header () {
sed -n '/^@@/,$p' $*
}
# dh_test_setup_history generates a contrived graph such that we have at least
# 1 nesting (E) and 2 nestings (F).
#
# A---B master
# /
# D---E---F branch
#
# git log --all --graph
# * commit
# | B
# | * commit
# | | F
# * | commit
# | | A
# | * commit
# |/
# | E
# * commit
# D
#
dh_test_setup_history () {
echo file1 >file &&
git add file &&
test_tick &&
git commit -m "D" &&
git checkout -b branch &&
echo file2 >file &&
test_tick &&
git commit -a -m "E" &&
git checkout master &&
echo file2 >file &&
test_tick &&
git commit -a -m "A" &&
git checkout branch &&
echo file3 >file &&
test_tick &&
git commit -a -m "F" &&
git checkout master &&
echo file3 >file &&
test_tick &&
git commit -a -m "B"
}
left_trim () {
"$PERL_PATH" -pe 's/^\s+//'
}
trim_graph () {
# graphs start with * or |
# followed by a space or / or \
"$PERL_PATH" -pe 's@^((\*|\|)( |/|\\))+@@'
}
test_expect_success 'diff-highlight highlights the beginning of a line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
0bb
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-${CW}b${CR}bb
+${CW}0${CR}bb
ccc
EOF
'
test_expect_success 'diff-highlight highlights the end of a line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
bb0
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-bb${CW}b${CR}
+bb${CW}0${CR}
ccc
EOF
'
test_expect_success 'diff-highlight highlights the middle of a line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
b0b
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-b${CW}b${CR}b
+b${CW}0${CR}b
ccc
EOF
'
test_expect_success 'diff-highlight does not highlight whole line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
000
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-bbb
+000
ccc
EOF
'
test_expect_failure 'diff-highlight highlights mismatched hunk size' '
cat >a <<-\EOF &&
aaa
bbb
EOF
cat >b <<-\EOF &&
aaa
b0b
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-b${CW}b${CR}b
+b${CW}0${CR}b
+ccc
EOF
'
# These two code points share the same leading byte in UTF-8 representation;
# a naive byte-wise diff would highlight only the second byte.
#
# - U+00f3 ("o" with acute)
o_accent=$(printf '\303\263')
# - U+00f8 ("o" with stroke)
o_stroke=$(printf '\303\270')
test_expect_success 'diff-highlight treats multibyte utf-8 as a unit' '
echo "unic${o_accent}de" >a &&
echo "unic${o_stroke}de" >b &&
dh_test a b <<-EOF
@@ -1 +1 @@
-unic${CW}${o_accent}${CR}de
+unic${CW}${o_stroke}${CR}de
EOF
'
# Unlike the UTF-8 above, these are combining code points which are meant
# to modify the character preceding them:
#
# - U+0301 (combining acute accent)
combine_accent=$(printf '\314\201')
# - U+0302 (combining circumflex)
combine_circum=$(printf '\314\202')
test_expect_failure 'diff-highlight treats combining code points as a unit' '
echo "unico${combine_accent}de" >a &&
echo "unico${combine_circum}de" >b &&
dh_test a b <<-EOF
@@ -1 +1 @@
-unic${CW}o${combine_accent}${CR}de
+unic${CW}o${combine_circum}${CR}de
EOF
'
test_expect_success 'diff-highlight works with the --graph option' '
dh_test_setup_history &&
# date-order so that the commits are interleaved for both
# trim graph elements so we can do a diff
# trim leading space because our trim_graph is not perfect
git log --branches -p --date-order |
"$DIFF_HIGHLIGHT" | left_trim >graph.exp &&
git log --branches -p --date-order --graph |
"$DIFF_HIGHLIGHT" | trim_graph | left_trim >graph.act &&
test_cmp graph.exp graph.act
'
# Just reuse the previous graph test, but with --color. Our trimming
# doesn't know about color, so just sanity check that something got
# highlighted.
test_expect_success 'diff-highlight works with color graph' '
git log --branches -p --date-order --graph --color |
"$DIFF_HIGHLIGHT" | trim_graph | left_trim >graph &&
grep "\[7m" graph
'
# Most combined diffs won't meet diff-highlight's line-number filter. So we
# create one here where one side drops a line and the other modifies it. That
# should result in a diff like:
#
# - modified content
# ++resolved content
#
# which naively looks like one side added "+resolved".
test_expect_success 'diff-highlight ignores combined diffs' '
echo "content" >file &&
git add file &&
git commit -m base &&
>file &&
git commit -am master &&
git checkout -b other HEAD^ &&
echo "modified content" >file &&
git commit -am other &&
test_must_fail git merge master &&
echo "resolved content" >file &&
git commit -am resolved &&
cat >expect <<-\EOF &&
--- a/file
+++ b/file
@@@ -1,1 -1,0 +1,1 @@@
- modified content
++resolved content
EOF
git show -c | "$DIFF_HIGHLIGHT" >actual.raw &&
sed -n "/^---/,\$p" <actual.raw >actual &&
test_cmp expect actual
'
test_done