#! /bin/sh

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

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

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


# --- tests ---

tests="$tests no_args"
no_args () {
	[ -x "$cmd" ] && ! "$cmd" >"$stdout" 2>"$stderr" && \
	[ ! -s "$stdout" ] && cmp -s ref/help "$stderr"
}

tests="$tests no_archives_findrc"
no_archives_findrc () {
	HOME="$PWD"
	if [ -f .archives-findrc ]; then
		rm .archives-findrc
	fi
	[ -x "$cmd" ] && ! "$cmd" -n dummy >"$stdout" 2>"$stderr" && \
	[ ! -s "$stdout" ] && cmp -s ref/no-archives-findrc "$stderr"
}

tests="$tests no_rc_entries"
no_rc_entries () {
	HOME="$PWD"
	echo >.archives-findrc
	[ -x "$cmd" ] && ! "$cmd" -n dummy >"$stdout" 2>"$stderr" && \
	[ ! -s "$stdout" ] && cmp -s ref/no-rcfile-entries "$stderr"
}

tests="$tests by_name_no_result"
by_name_no_result () {
	HOME="$PWD"
	init_md5
	[ -x "$cmd" ] && ! "$cmd" -n dummy >"$stdout" 2>"$stderr" && \
	[ ! -s "$stdout" ] && [ ! -s "$stderr" ]
}

tests="$tests by_name"
by_name () {
	HOME="$PWD"
	init_md5
	"$cmd" -n info >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/by-name - && [ ! -s "$stderr" ]
}

tests="$tests by_name_long"
by_name_long () {
	HOME="$PWD"
	init_md5
	"$cmd" --name info >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/by-name - && [ ! -s "$stderr" ]
}

tests="$tests by_name_multi"
by_name_multi () {
	HOME="$PWD"
	init_md5
	"$cmd" -n COPYING AUTHORS info >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/by-name-multi - && [ ! -s "$stderr" ]
}

tests="$tests by_file_not_found"
by_file_not_found () {
	HOME="$PWD"
	init_md5
	[ -x "$cmd" ] && ! "$cmd" -f dummy >"$stdout" 2>"$stderr" && \
	[ ! -s "$stdout" ] && cmp -s ref/by-file-not-found "$stderr"
}

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

tests="$tests by_file"
by_file () {
	HOME="$PWD"
	init_md5
	"$cmd" -f ../COPYING >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/by-file - && [ ! -s "$stderr" ]
}

tests="$tests by_file_long"
by_file_long () {
	HOME="$PWD"
	init_md5
	"$cmd" --file ../COPYING >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/by-file - && [ ! -s "$stderr" ]
}

tests="$tests by_file_multi"
by_file_multi () {
	HOME="$PWD"
	init_md5
	"$cmd" -f ../COPYING ../archives-find ../archives-find.texinfo \
	       >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/by-file-multi - && [ ! -s "$stderr" ]
}

tests="$tests automatic_name"
automatic_name () {
	HOME="$PWD"
	init_md5
	if [ -f info ]; then
		rm info
	fi
	"$cmd" info >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/automatic-name - && [ ! -s "$stderr" ]
}

tests="$tests automatic_file"
automatic_file () {
	local result=1
	HOME="$PWD"
	init_md5
	cp ../COPYING info && \
	"$cmd" info >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/automatic-file - && [ ! -s "$stderr" ] && \
	result=0
	rm info
	return $result
}

tests="$tests automatic_multi"
automatic_multi () {
	local result=1
	HOME="$PWD"
	init_md5
	cp ../COPYING info && \
	"$cmd" info texinfo >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/automatic-multi - && [ ! -s "$stderr" ] && \
	result=0
	rm info
	return $result
}

tests="$tests rc_file"
rc_file () {
	HOME="$PWD"
	echo 'files.md5sum' >.archives-findrc
	"$cmd" -f ../COPYING >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/rc-file - && [ ! -s "$stderr" ]
}

tests="$tests rc_dir"
rc_dir () {
	HOME="$PWD"
	echo 'filedir' >.archives-findrc
	"$cmd" -f ../COPYING >"$stdout" 2>"$stderr" && \
	sort "$stdout" | \
	cmp -s ref/rc-dir - && [ ! -s "$stderr" ]
}

tests="$tests rc_entry_not_found"
rc_entry_not_found () {
	HOME="$PWD"
	echo 'dummy' >.archives-findrc
	[ -x "$cmd" ] && ! "$cmd" -f ../COPYING >"$stdout" 2>"$stderr" && \
	[ ! -s "$stdout" ] && cmp -s ref/rc-entry-not-found "$stderr"
}

tests="$tests generate"
generate () {
	"$cmd" -g .. >"$stdout" 2>"$stderr" && \
	sed <"$stdout" -n 's/\.md5sum$//; t; s/\.archives-findrc$//; t; p' | \
	sort | \
	cmp -s files.md5sum - && [ ! -s "$stderr" ]
}

tests="$tests generate_long"
generate_long () {
	"$cmd" --generate .. >"$stdout" 2>"$stderr" && \
	sed <"$stdout" -n 's/\.md5sum$//; t; s/\.archives-findrc$//; t; p' | \
	sort | \
	cmp -s files.md5sum - && [ ! -s "$stderr" ]
}

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

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

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

tests="$tests help"
help () {
	"$cmd" -h >"$stdout" 2>"$stderr" && \
	cmp -s ref/help "$stdout" && [ ! -s "$stderr" ]
}

tests="$tests help_long"
help_long () {
	"$cmd" --help >"$stdout" 2>"$stderr" && \
	cmp -s ref/help "$stdout" && [ ! -s "$stderr" ]
}



# --- main ---

result='ok'
count=0

stdout="$(mktemp)"
stderr="$(mktemp)"
if [ ! -f "$stdout" -o ! -f "$stderr" ]; then
	echo "$script: unable to create temporary file" >&2
	if [ -f "$stdout" ]; then rm "$stdout"; fi
	if [ -f "$stderr" ]; then rm "$stderr"; fi
	exit 1
fi

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

for func in $tests; do
	if "$func"; then
		rc="ok"
	else
		rc='failed'
		count="$(($count+1))"
		result='failed'
	fi
	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 "------------------------------"

rm "$stdout" "$stderr"

if [ -f .archives-findrc ]; then
	rm .archives-findrc
fi

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
	exit 1
fi


# --- end ---

