#!/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 }