#!/bin/sh

new_tag() {
    for t in $TAGS; do
	if test "$t" = "$1"; then
	    echo "Duplicate tag $t" 1>&2 ; exit 1
	fi
    done
    TAGS="$TAGS $tag"
}

# Usage: run tag program args ...
# Runs 'program args ...' with output to tag.out and tag.err
run() {
    tag=$1; shift
    test -n "$*" || { echo "No command for tag: $tag" 1>&2; exit 1; }
    new_tag $tag
    rm -f $tag.out $tag.err $tag.diff
    "$@" > $tag.out 2> $tag.err || echo "exit status $?" >> $tag.err &
}

# Genereate error report
errors() {
    for tag in "$@"; do
	DIFF=`diff $tag.out $tag.expect 2>&1` || {
	    echo "==== $tag.out != $tag.expect ===="
	    echo $DIFF
	}
	test -s $tag.err && {
	    echo "==== $tag.err ===="
	    cat $tag.err
	}
    done
}

# Wait for processes, verify output.
# Verifies tag.expect == tag.out and ! tag.err for each tag,
# creates errors.txt if there are any discrepancies.
# 
verify() {
    wait
    rm -f errors.txt
    ERRORS=`errors $TAGS`
    if test -n "$ERRORS"; then
	echo "$ERRORS" 1>&2
	return 1
    fi
    return 0
}

