t4051: rewrite, add more tests

Remove the tests that checked against a fixed result and replace them
with more focused checks of desired properties of the created diffs.
That way we get more detailed and meaningful diagnostics.

Store test file contents in files in a subdirectory in order to avoid
cluttering the test script with them.

Use tagged commits to store the changes to test diff -W against instead
of using changes to the worktree.  Use the worktree instead to try and
apply the generated patch in order to validate it.

Document unwanted features: trailing empty lines, too much context for
appended functions, insufficient context at the end with -U0.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe 2016-05-31 22:00:38 +02:00 committed by Junio C Hamano
parent 90f7b16b3a
commit d3621de789
6 changed files with 234 additions and 68 deletions

View file

@ -3,90 +3,158 @@
test_description='diff function context'
. ./test-lib.sh
. "$TEST_DIRECTORY"/diff-lib.sh
dir="$TEST_DIRECTORY/t4051"
cat <<\EOF >hello.c
#include <stdio.h>
static int a(void)
{
/*
* Dummy.
*/
commit_and_tag () {
tag=$1 &&
shift &&
git add "$@" &&
test_tick &&
git commit -m "$tag" &&
git tag "$tag"
}
static int hello_world(void)
{
/* Classic. */
printf("Hello world.\n");
/* Success! */
return 0;
}
static int b(void)
{
/*
* Dummy, too.
*/
first_context_line () {
awk '
found {print; exit}
/^@@/ {found = 1}
'
}
int main(int argc, char **argv)
{
a();
b();
return hello_world();
last_context_line () {
sed -ne \$p
}
check_diff () {
name=$1
desc=$2
options="-W $3"
test_expect_success "$desc" '
git diff $options "$name^" "$name" >"$name.diff"
'
test_expect_success ' diff applies' '
test_when_finished "git reset --hard" &&
git checkout --detach "$name^" &&
git apply --index "$name.diff" &&
git diff --exit-code "$name"
'
}
EOF
test_expect_success 'setup' '
git add hello.c &&
test_tick &&
git commit -m initial &&
cat "$dir/includes.c" "$dir/dummy.c" "$dir/dummy.c" "$dir/hello.c" \
"$dir/dummy.c" "$dir/dummy.c" >file.c &&
commit_and_tag initial file.c &&
grep -v Classic <hello.c >hello.c.new &&
mv hello.c.new hello.c
grep -v "delete me from hello" <file.c >file.c.new &&
mv file.c.new file.c &&
commit_and_tag changed_hello file.c &&
grep -v "delete me from includes" <file.c >file.c.new &&
mv file.c.new file.c &&
commit_and_tag changed_includes file.c &&
cat "$dir/appended1.c" >>file.c &&
commit_and_tag appended file.c &&
cat "$dir/appended2.c" >>file.c &&
commit_and_tag extended file.c &&
grep -v "Begin of second part" <file.c >file.c.new &&
mv file.c.new file.c &&
commit_and_tag long_common_tail file.c
'
cat <<\EOF >expected
diff --git a/hello.c b/hello.c
--- a/hello.c
+++ b/hello.c
@@ -10,8 +10,7 @@ static int a(void)
static int hello_world(void)
{
- /* Classic. */
printf("Hello world.\n");
/* Success! */
return 0;
}
EOF
check_diff changed_hello 'changed function'
test_expect_success 'diff -U0 -W' '
git diff -U0 -W >actual &&
compare_diff_patch actual expected
test_expect_success ' context includes begin' '
grep "^ .*Begin of hello" changed_hello.diff
'
cat <<\EOF >expected
diff --git a/hello.c b/hello.c
--- a/hello.c
+++ b/hello.c
@@ -9,9 +9,8 @@ static int a(void)
static int hello_world(void)
{
- /* Classic. */
printf("Hello world.\n");
/* Success! */
return 0;
}
EOF
test_expect_success ' context includes end' '
grep "^ .*End of hello" changed_hello.diff
'
test_expect_success 'diff -W' '
git diff -W >actual &&
compare_diff_patch actual expected
test_expect_success ' context does not include other functions' '
test $(grep -c "^[ +-].*Begin" changed_hello.diff) -le 1
'
test_expect_success ' context does not include preceding empty lines' '
test "$(first_context_line <changed_hello.diff)" != " "
'
test_expect_failure ' context does not include trailing empty lines' '
test "$(last_context_line <changed_hello.diff)" != " "
'
check_diff changed_includes 'changed includes'
test_expect_success ' context includes begin' '
grep "^ .*Begin.h" changed_includes.diff
'
test_expect_success ' context includes end' '
grep "^ .*End.h" changed_includes.diff
'
test_expect_success ' context does not include other functions' '
test $(grep -c "^[ +-].*Begin" changed_includes.diff) -le 1
'
test_expect_failure ' context does not include trailing empty lines' '
test "$(last_context_line <changed_includes.diff)" != " "
'
check_diff appended 'appended function'
test_expect_success ' context includes begin' '
grep "^[+].*Begin of first part" appended.diff
'
test_expect_success ' context includes end' '
grep "^[+].*End of first part" appended.diff
'
test_expect_failure ' context does not include other functions' '
test $(grep -c "^[ +-].*Begin" appended.diff) -le 1
'
check_diff extended 'appended function part'
test_expect_success ' context includes begin' '
grep "^ .*Begin of first part" extended.diff
'
test_expect_success ' context includes end' '
grep "^[+].*End of second part" extended.diff
'
test_expect_failure ' context does not include other functions' '
test $(grep -c "^[ +-].*Begin" extended.diff) -le 2
'
test_expect_success ' context does not include preceding empty lines' '
test "$(first_context_line <extended.diff)" != " "
'
check_diff long_common_tail 'change with long common tail and no context' -U0
test_expect_success ' context includes begin' '
grep "^ .*Begin of first part" long_common_tail.diff
'
test_expect_failure ' context includes end' '
grep "^ .*End of second part" long_common_tail.diff
'
test_expect_success ' context does not include other functions' '
test $(grep -c "^[ +-].*Begin" long_common_tail.diff) -le 2
'
test_expect_success ' context does not include preceding empty lines' '
test "$(first_context_line <long_common_tail.diff.diff)" != " "
'
test_done

15
t/t4051/appended1.c Normal file
View file

@ -0,0 +1,15 @@
int appended(void) // Begin of first part
{
int i;
char *s = "a string";
printf("%s\n", s);
for (i = 99;
i >= 0;
i--) {
printf("%d bottles of beer on the wall\n", i);
}
printf("End of first part\n");

35
t/t4051/appended2.c Normal file
View file

@ -0,0 +1,35 @@
printf("Begin of second part\n");
/*
* Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
* sed diam nonumy eirmod tempor invidunt ut labore et dolore
* magna aliquyam erat, sed diam voluptua. At vero eos et
* accusam et justo duo dolores et ea rebum. Stet clita kasd
* gubergren, no sea takimata sanctus est Lorem ipsum dolor
* sit amet.
*
* Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
* sed diam nonumy eirmod tempor invidunt ut labore et dolore
* magna aliquyam erat, sed diam voluptua. At vero eos et
* accusam et justo duo dolores et ea rebum. Stet clita kasd
* gubergren, no sea takimata sanctus est Lorem ipsum dolor
* sit amet.
*
* Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
* sed diam nonumy eirmod tempor invidunt ut labore et dolore
* magna aliquyam erat, sed diam voluptua. At vero eos et
* accusam et justo duo dolores et ea rebum. Stet clita kasd
* gubergren, no sea takimata sanctus est Lorem ipsum dolor
* sit amet.
*
* Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
* sed diam nonumy eirmod tempor invidunt ut labore et dolore
* magna aliquyam erat, sed diam voluptua. At vero eos et
* accusam et justo duo dolores et ea rebum. Stet clita kasd
* gubergren, no sea takimata sanctus est Lorem ipsum dolor
* sit amet.
*
*/
return 0;
} // End of second part

7
t/t4051/dummy.c Normal file
View file

@ -0,0 +1,7 @@
static int dummy(void) // Begin of dummy
{
int rc = 0;
return rc;
} // End of dummy

21
t/t4051/hello.c Normal file
View file

@ -0,0 +1,21 @@
static void hello(void) // Begin of hello
{
/*
* Classic.
*/
putchar('H');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar(' ');
/* delete me from hello */
putchar('w');
putchar('o');
putchar('r');
putchar('l');
putchar('d');
putchar('.');
putchar('\n');
} // End of hello

20
t/t4051/includes.c Normal file
View file

@ -0,0 +1,20 @@
#include <Begin.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
/* delete me from includes */
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <assert.h>
#include <regex.h>
#include <utime.h>
#include <syslog.h>
#include <End.h>