#! /bin/sh

#
# archives-find-test                                            (jh,07.11.2005)
#

#
#   Copyright (C) 2004, 2005  Jochen Hepp <jochen.hepp@gmx.de>
#
#   This file is part of archives-find.
#
#   archives-find is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation in version 2 of the License.
#
#   archives-find is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#

script="${0##*/}"
cmd="$PWD/../${script%-test}"
tests=


# --- make_tmpdir ---

make_tmpdir () {
	local dir

	dir="$(mktemp -d -t $script.XXXXXX)"
	if [ -z "$dir" ]; then
		echo "$script: can't create temporary directory" >&2
		exit 1
	fi
	echo "$dir"
}


# --- init_md5 ---

init_md5 () {
	echo 'files.md5sum' >.archives-findrc
}


# --- clean ---

clean () {
	if [ -f .archives-findrc ]; then
		rm .archives-findrc
	fi
}


# --- diff_sort2nd ---

diff_sort2nd () {
	LC_ALL=C sort <"$3" | \
	diff "$1" "$2" -
}


# --- tests ---

tests="$tests no_args"
no_args () {
	[ -x "$cmd" ] && ! "$cmd" >"$out" 2>"$err" && \
	[ ! -s "$out" ] && diff -u ref/help "$err" >"$diff"
}

tests="$tests no_archives_findrc"
no_archives_findrc () {
	if [ -f .archives-findrc ]; then
		rm .archives-findrc
	fi
	[ -x "$cmd" ] && ! "$cmd" -n dummy >"$out" 2>"$err" && \
	[ ! -s "$out" ] && diff -u ref/no-archives-findrc "$err" >"$diff"
}

tests="$tests no_rc_entries"
no_rc_entries () {
	echo >.archives-findrc
	[ -x "$cmd" ] && ! "$cmd" -n dummy >"$out" 2>"$err" && \
	[ ! -s "$out" ] && diff -u ref/no-rcfile-entries "$err" >"$diff"
}

tests="$tests by_name_no_result"
by_name_no_result () {
	init_md5
	[ -x "$cmd" ] && ! "$cmd" -n dummy >"$out" 2>"$err" && \
	[ ! -s "$out" ] && [ ! -s "$err" ]
}

tests="$tests by_name"
by_name () {
	init_md5
	"$cmd" -n info >"$out" 2>"$err" && \
	diff_sort2nd -u ref/by-name "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests by_name_long"
by_name_long () {
	init_md5
	"$cmd" --name info >"$out" 2>"$err" && \
	diff_sort2nd -u ref/by-name "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests by_name_multi"
by_name_multi () {
	init_md5
	"$cmd" -n COPYING AUTHORS info >"$out" 2>"$err" && \
	diff_sort2nd -u ref/by-name-multi "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests by_file_not_found"
by_file_not_found () {
	init_md5
	[ -x "$cmd" ] && ! "$cmd" -f dummy >"$out" 2>"$err" && \
	[ ! -s "$out" ] && diff -u ref/by-file-not-found "$err" >"$diff"
}

tests="$tests by_file_no_result"
by_file_no_result () {
	init_md5
	[ -x "$cmd" ] && ! "$cmd" -f files.md5sum >"$out" 2>"$err" && \
	[ ! -s "$out" ] && [ ! -s "$err" ]
}

tests="$tests by_file"
by_file () {
	init_md5
	"$cmd" -f ../COPYING >"$out" 2>"$err" && \
	diff_sort2nd -u ref/by-file "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests by_file_long"
by_file_long () {
	init_md5
	"$cmd" --file ../COPYING >"$out" 2>"$err" && \
	diff_sort2nd -u ref/by-file "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests by_file_multi"
by_file_multi () {
	init_md5
	"$cmd" -f ../COPYING ../archives-find ../archives-find.texinfo \
	       >"$out" 2>"$err" && \
	diff_sort2nd -u ref/by-file-multi "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests automatic_name"
automatic_name () {
	init_md5
	if [ -f info ]; then
		rm info
	fi
	"$cmd" info >"$out" 2>"$err" && \
	diff_sort2nd -u ref/automatic-name "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests automatic_file"
automatic_file () {
	local result=1
	init_md5
	cp ../COPYING info && \
	"$cmd" info >"$out" 2>"$err" && \
	diff_sort2nd -u ref/automatic-file "$out" >"$diff" && [ ! -s "$err" ] && \
	result=0
	rm info
	return $result
}

tests="$tests automatic_multi"
automatic_multi () {
	local result=1
	init_md5
	cp ../COPYING info && \
	"$cmd" info texinfo >"$out" 2>"$err" && \
	diff_sort2nd -u ref/automatic-multi "$out" >"$diff" && [ ! -s "$err" ] && \
	result=0
	rm info
	return $result
}

tests="$tests rc_file"
rc_file () {
	echo 'files.md5sum' >.archives-findrc
	"$cmd" -f ../COPYING >"$out" 2>"$err" && \
	diff_sort2nd -u ref/rc-file "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests rc_dir"
rc_dir () {
	echo 'filedir' >.archives-findrc
	"$cmd" -f ../COPYING >"$out" 2>"$err" && \
	diff_sort2nd -u ref/rc-dir "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests rc_entry_not_found"
rc_entry_not_found () {
	echo 'dummy' >.archives-findrc
	[ -x "$cmd" ] && ! "$cmd" -f ../COPYING >"$out" 2>"$err" && \
	[ ! -s "$out" ] && diff -u ref/rc-entry-not-found "$err" >"$diff"
}

tests="$tests generate"
generate () {
	"$cmd" -g .. >"$out" 2>"$err" && \
	sed '/\.md5sum$/d; /^\.archives-findrc$/d' <"$out" | \
	LC_ALL=C sort | \
	diff -u files.md5sum - >"$diff" && [ ! -s "$err" ]
}

tests="$tests generate_long"
generate_long () {
	"$cmd" --generate .. >"$out" 2>"$err" && \
	sed '/\.md5sum$/d; /^\.archives-findrc$/d' <"$out" | \
	LC_ALL=C sort | \
	diff -u files.md5sum - >"$diff" && [ ! -s "$err" ]
}

tests="$tests generate_empty"
generate_empty () {
	"$cmd" -g emptydir >"$out" 2>"$err" && \
	[ ! -s "$out" ] && [ ! -s "$err" ]
}

tests="$tests version"
version () {
	"$cmd" -V >"$out" 2>"$err" && \
	sed '1 s/ .*$//' <"$out" | \
	diff -u ref/version - >"$diff" && [ ! -s "$err" ]
}

tests="$tests version_long"
version_long () {
	"$cmd" --version >"$out" 2>"$err" && \
	sed '1 s/ .*$//' <"$out" | \
	diff -u ref/version - >"$diff" && [ ! -s "$err" ]
}

tests="$tests help"
help () {
	"$cmd" -h >"$out" 2>"$err" && \
	diff -u ref/help "$out" >"$diff" && [ ! -s "$err" ]
}

tests="$tests help_long"
help_long () {
	"$cmd" --help >"$out" 2>"$err" && \
	diff -u ref/help "$out" >"$diff" && [ ! -s "$err" ]
}


# --- error_report ---

error_report () { # name file
	local name="$1"
	local file="$2"

	if [ -f "$file" ]; then
		if [ -s "$file" ]; then
			echo "$name:"
			cat "$file"
		else
			echo "$name: (none)"
		fi
	fi
}


# --- main ---

result='ok'
count=0

tmpdir="$(make_tmpdir)"
out="$tmpdir/stdout"
err="$tmpdir/stderr"
diff="$tmpdir/diff"
errorlog="$tmpdir/error.log"
home="$HOME"
export HOME="$PWD"

if [ -e 'error.log' ]; then
	rm -f error.log
fi

echo "testsuite ${script%-test}"
echo "------------------------------"

for func in $tests; do
	if "$func" && [ ! -e "$diff" -o ! -s "$diff" ]; then
		rc='ok'
	else
		rc='failed'
		count="$(($count+1))"
		result='failed'
		{
			echo "test: $func"
			error_report 'stdout' "$out"
			error_report 'stderr' "$err"
			error_report 'diff'   "$diff"
			echo
		} >>"$errorlog"
	fi
	rm -f "$out" "$err" "$diff"
	clean
	awk -v n="$func" -v r="$rc" 'BEGIN { \
			l=length(n)+1+length(r); \
			while (l<30) { l++; n=n "." }; print n " " r }'
done

echo "------------------------------"

export HOME="$home"

if [ -e "$errorlog" ]; then
	mv "$errorlog" error.log
fi
rm -rf "$tmpdir"

if [ "$result" = 'ok' ]; then
	echo "all tests passed."
	exit 0
else
	if [ "$test" = 1 ]; then
		echo '1 test failed.'
	else
		echo "$count tests failed."
	fi
	echo "see file 'error.log' for details."
	exit 1
fi


# --- end ---

