#!/bin/sh
# Copyright 2008 by Denys Vlasenko
# Licensed under GPLv2, see file LICENSE in this source tree.

. ./testing.sh

# testing "test name" "commands" "expected result" "file input" "stdin"

# diff outputs date/time in the header, which should not be analysed
# NB: sed has tab character in s command!
TRIM_TAB="sed 's/	.*//'"

testing "diff of stdin" \
	"diff -u - input | $TRIM_TAB" \
"\
--- -
+++ input
@@ -1 +1,3 @@
+qwe
 asd
+zxc
" \
	"qwe\nasd\nzxc\n" \
	"asd\n"

testing "diff of stdin, no newline in the file" \
	"diff -u - input | $TRIM_TAB" \
"\
--- -
+++ input
@@ -1 +1,3 @@
+qwe
 asd
+zxc
\\ No newline at end of file
" \
	"qwe\nasd\nzxc" \
	"asd\n"

# we also test that stdin is in fact NOT read
testing "diff of stdin, twice" \
	'diff - -; echo $?; wc -c' \
	"0\n5\n" \
	"" \
	"stdin"

testing "diff of empty file against stdin" \
	"diff -u - input | $TRIM_TAB" \
"\
--- -
+++ input
@@ -1 +0,0 @@
-a
" \
	"" \
	"a\n"

testing "diff of empty file against nonempty one" \
	"diff -u - input | $TRIM_TAB" \
"\
--- -
+++ input
@@ -0,0 +1 @@
+a
" \
	"a\n" \
	""

testing "diff -b treats EOF as whitespace" \
	'diff -ub - input; echo $?' \
	"0\n" \
	"abc" \
	"abc "

testing "diff -b treats all spaces as equal" \
	'diff -ub - input; echo $?' \
	"0\n" \
	"a \t c\n" \
	"a\t \tc\n"

testing "diff -B ignores changes whose lines are all blank" \
	'diff -uB - input; echo $?' \
	"0\n" \
	"a\n" \
	"\na\n\n"

testing "diff -B does not ignore changes whose lines are not all blank" \
	"diff -uB - input | $TRIM_TAB" \
"\
--- -
+++ input
@@ -1,3 +1 @@
-
-b
-
+a
" \
	"a\n" \
	"\nb\n\n"

testing "diff -B ignores blank single line change" \
	'diff -qB - input; echo $?' \
	"0\n" \
	"\n1\n" \
	"1\n"

testing "diff -B does not ignore non-blank single line change" \
	'diff -qB - input; echo $?' \
	"Files - and input differ\n1\n" \
	"0\n" \
	"1\n"

testing "diff always takes context from old file" \
	"diff -ub - input | $TRIM_TAB" \
"\
--- -
+++ input
@@ -1 +1,3 @@
+abc
 a c
+def
" \
	"abc\na  c\ndef\n" \
	"a c\n"

# testing "test name" "commands" "expected result" "file input" "stdin"

# clean up
rm -rf diff1 diff2

mkdir diff1 diff2 diff2/subdir
echo qwe >diff1/-
echo asd >diff2/subdir/-
optional FEATURE_DIFF_DIR
testing "diff diff1 diff2/subdir" \
	"diff -ur diff1 diff2/subdir | $TRIM_TAB" \
"\
--- diff1/-
+++ diff2/subdir/-
@@ -1 +1 @@
-qwe
+asd
" \
	"" ""
SKIP=

# using directory structure from prev test...
optional FEATURE_DIFF_DIR
testing "diff dir dir2/file/-" \
	"diff -ur diff1 diff2/subdir/- | $TRIM_TAB" \
"\
--- diff1/-
+++ diff2/subdir/-
@@ -1 +1 @@
-qwe
+asd
" \
	"" ""
SKIP=

# using directory structure from prev test...
mkdir diff1/test
mkfifo diff2/subdir/test
optional FEATURE_DIFF_DIR
testing "diff of dir and fifo" \
	"diff -ur diff1 diff2/subdir | $TRIM_TAB" \
"\
--- diff1/-
+++ diff2/subdir/-
@@ -1 +1 @@
-qwe
+asd
Only in diff2/subdir: test
" \
	"" ""
SKIP=

# using directory structure from prev test...
rmdir diff1/test
echo >diff1/test
optional FEATURE_DIFF_DIR
testing "diff of file and fifo" \
	"diff -ur diff1 diff2/subdir | $TRIM_TAB" \
"\
--- diff1/-
+++ diff2/subdir/-
@@ -1 +1 @@
-qwe
+asd
File diff2/subdir/test is not a regular file or directory and was skipped
" \
	"" ""
SKIP=

# using directory structure from prev test...
mkfifo diff1/test2
optional FEATURE_DIFF_DIR
testing "diff -rN does not read non-regular files" \
	"diff -urN diff1 diff2/subdir | $TRIM_TAB" \
"\
--- diff1/-
+++ diff2/subdir/-
@@ -1 +1 @@
-qwe
+asd
File diff2/subdir/test is not a regular file or directory and was skipped
File diff1/test2 is not a regular file or directory and was skipped
" \
	"" ""
SKIP=

# clean up
rm -rf diff1 diff2

# NOT using directory structure from prev test...
mkdir diff1 diff2
echo qwe >diff1/-
echo rty >diff2/-
optional FEATURE_DIFF_DIR
testing "diff diff1 diff2/" \
	"diff -ur diff1 diff2/ | $TRIM_TAB; diff -ur .///diff1 diff2//// | $TRIM_TAB" \
"\
--- diff1/-
+++ diff2/-
@@ -1 +1 @@
-qwe
+rty
--- .///diff1/-
+++ diff2////-
@@ -1 +1 @@
-qwe
+rty
" \
	"" ""
SKIP=

# clean up
rm -rf diff1 diff2

exit $FAILCOUNT