#! /bin/sh

# Runs a set of test scripts given on stdin in <keyword>:<desc>:<cmd>
# tuples

usage()
{
    echo "Usage: `basename $0` [--pretend] [--filter <keyword>] [-h] [--help] <file>*" 1>&2
    exit 1
}

# set some global vars
log="/tmp/test-$$.log"
pretend=0
filter=""
files=""
errors=0
IFS=':'

# colours
colour=1
if [ $colour ]; then
    GOOD=$'\e[32;01m'
    WARN=$'\e[33;01m'
    BAD=$'\e[31;01m'
    NORMAL=$'\e[0m'
else
    GOOD=""
    WARN=""
    BAD=""
    NORMAL=""
fi

# scan the command line
while [ $# -gt 0 ]
do
    case "$1" in
        --pretend)
	    pretend=1
	    ;;

	--filter)
	    filter=$2
	    shift
	    ;;

	-h)
	    usage;;

	--help)
	    usage;;

        *) files="$files $1"
            ;;
    esac
    shift
done

if [ -z $files ]; then
    files="-"
fi

echo "cat $files" |
/bin/sh |
grep -v "^[ \t]*\#" |		# strip comments
grep -v "^[ \t]*$" |		# strip blank lines
{
    errors=0
    while read keywords desc cmd; do
	if [ $filter ] && echo $keywords | grep -v -q $filter; then
	    continue
	fi

	printf "%-50s" "$desc ..."
	echo "--- BEGIN ---" >> $log
	echo $cmd >> $log

	if [ $pretend -eq 1 ]; then
	    echo "[${WARN}pretend${NORMAL}]"
	else
	    if echo -n $cmd | sh >> $log 2>&1; then
		echo "[${GOOD}ok${NORMAL}]"
	    else
		errors=`expr $errors + 1`
		echo "[${BAD}failed${NORMAL}]"
	    fi
	fi
	echo -e "--- DONE ---\n" >> $log
    done
    exit $errors
}
errors=$?

if [ $errors -eq 0 ]; then
    echo "${GOOD}All tests passed${NORMAL}"
else
    echo "${BAD}$errors tests failed${NORMAL}, see $log for more details"
fi

if [ -f $log ]; then
    declare -i warn=`grep "WARN" $log | wc -l`
    if [ $warn -gt 0 ]; then
        echo "${WARN}$warn warnings{NORMAL}, see $log for more details"
    fi
fi
