diff options
Diffstat (limited to 'Test/ztst.zsh')
-rwxr-xr-x | Test/ztst.zsh | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/Test/ztst.zsh b/Test/ztst.zsh index 5b00ff62f..ef9560593 100755 --- a/Test/ztst.zsh +++ b/Test/ztst.zsh @@ -14,7 +14,8 @@ # Produce verbose messages if non-zero. # If 1, produce reports of tests executed; if 2, also report on progress. -ZTST_verbose=0 +# Defined in such a way that any value from the environment is used. +: ${ZTST_verbose:=0} # We require all options to be reset, not just emulation options. # Unfortunately, due to the crud which may be in /etc/zshenv this might @@ -42,19 +43,19 @@ ZTST_mainopts=(${(kv)options}) ZTST_testdir=$PWD ZTST_testname=$1 +: ${TMPPREFIX:=/tmp/zsh} # Temporary files for redirection inside tests. -ZTST_in=${TMPPREFIX-:/tmp/zsh}.ztst.in.$$ +ZTST_in=${TMPPREFIX}.ztst.in.$$ # hold the expected output -ZTST_out=${TMPPREFIX-:/tmp/zsh}.ztst.out.$$ -ZTST_err=${TMPPREFIX-:/tmp/zsh}.ztst.err.$$ +ZTST_out=${TMPPREFIX}.ztst.out.$$ +ZTST_err=${TMPPREFIX}.ztst.err.$$ # hold the actual output from the test -ZTST_tout=${TMPPREFIX-:/tmp/zsh}.ztst.tout.$$ -ZTST_terr=${TMPPREFIX-:/tmp/zsh}.ztst.terr.$$ +ZTST_tout=${TMPPREFIX}.ztst.tout.$$ +ZTST_terr=${TMPPREFIX}.ztst.terr.$$ ZTST_cleanup() { cd $ZTST_testdir - rm -rf $ZTST_testdir/dummy.tmp $ZTST_testdir/*.tmp \ - $ZTST_in $ZTST_out $ZTST_err $ZTST_tout $ZTST_terr + rm -rf $ZTST_testdir/dummy.tmp $ZTST_testdir/*.tmp ${TMPPREFIX}.ztst*$$ } # This cleanup always gets performed, even if we abort. Later, @@ -72,6 +73,7 @@ ZTST_testfailed() { if [[ -n $ZTST_message ]]; then print "Was testing: $ZTST_message" fi + print "$ZTST_testname: test failed." ZTST_cleanup exit 1 } @@ -80,7 +82,7 @@ ZTST_testfailed() { ZTST_verbose() { local lev=$1 shift - [[ -n $ZTST_verbose && $ZTST_verbose -ge $lev ]] && print $* >&8 + [[ -n $ZTST_verbose && $ZTST_verbose -ge $lev ]] && print -- $* >&8 } [[ ! -r $ZTST_testname ]] && ZTST_testfailed "can't read test file." @@ -98,7 +100,7 @@ ZTST_cursect='' ZTST_getline() { local IFS= while true; do - read ZTST_curline <&9 || return 1 + read -r ZTST_curline <&9 || return 1 [[ $ZTST_curline == \#* ]] || return 0 done } @@ -145,7 +147,7 @@ $ZTST_code" # Read in a piece for redirection. ZTST_getredir() { - local char=${ZTST_curline[1]} + local char=${ZTST_curline[1]} fn ZTST_redir=${ZTST_curline[2,-1]} while ZTST_getline; do [[ $ZTST_curline[1] = $char ]] || break @@ -154,6 +156,22 @@ ${ZTST_curline[2,-1]}" done ZTST_verbose 2 "ZTST_getredir: read redir for '$char': $ZTST_redir" + +case $char in + '<') fn=$ZTST_in + ;; + '>') fn=$ZTST_out + ;; + '?') fn=$ZTST_err + ;; + *) ZTST_testfailed "bad redir operator: $char" + ;; +esac +if [[ $ZTST_flags = *q* ]]; then + print -r -- "${(e)ZTST_redir}" >>$fn +else + print -r -- "$ZTST_redir" >>$fn +fi } # Execute an indented chunk. Redirections will already have @@ -210,27 +228,24 @@ $ZTST_curline" fi ;; [[:space:]]##[^[:space:]]*) ZTST_getchunk - [[ $ZTST_curline != [-0-9]* ]] && - ZTST_testfailed "expecting test status at: -$ZTST_curline" - ZTST_xstatus=$ZTST_curline - if [[ $ZTST_curline == (#b)([^:]##):(*) ]]; then + if [[ $ZTST_curline == (#b)([-0-9]##)([[:alpha:]]#)(:*)# ]]; then ZTST_xstatus=$match[1] - ZTST_message=$match[2] + ZTST_flags=$match[2] + ZTST_message=${match[3]:+${match[3][2,-1]}} + else + ZTST_testfailed "expecting test status at: +$ZTST_curline" fi ZTST_getline found=1 ;; '<'*) ZTST_getredir - print -r "${(e)ZTST_redir}" >>$ZTST_in found=1 ;; '>'*) ZTST_getredir - print -r "${(e)ZTST_redir}" >>$ZTST_out found=1 ;; '?'*) ZTST_getredir - print -r "${(e)ZTST_redir}" >>$ZTST_err found=1 ;; *) ZTST_testfailed "bad line in test block: @@ -241,8 +256,7 @@ $ZTST_curline" # If we found some code to execute... if [[ -n $ZTST_code ]]; then - ZTST_verbose 1 "Running test: -$ZTST_message" + ZTST_verbose 1 "Running test: $ZTST_message" ZTST_verbose 2 "ZTST_test: expecting status: $ZTST_xstatus" ZTST_execchunk <$ZTST_in >$ZTST_tout 2>$ZTST_terr @@ -250,7 +264,9 @@ $ZTST_message" # First check we got the right status, if specified. if [[ $ZTST_xstatus != - && $ZTST_xstatus != $ZTST_status ]]; then ZTST_testfailed "bad status $ZTST_status, expected $ZTST_xstatus from: -$ZTST_code" +$ZTST_code${$(<$ZTST_terr):+ +Error output: +$(<$ZTST_terr)}" fi ZTST_verbose 2 "ZTST_test: test produced standard output: @@ -259,11 +275,13 @@ ZTST_test: and standard error: $(<$ZTST_terr)" # Now check output and error. - if ! diff -c $ZTST_out $ZTST_tout; then + if [[ $ZTST_flags != *d* ]] && ! diff -c $ZTST_out $ZTST_tout; then ZTST_testfailed "output differs from expected as shown above for: -$ZTST_code" +$ZTST_code${$(<$ZTST_terr):+ +Error output: +$(<$ZTST_terr)}" fi - if ! diff -c $ZTST_err $ZTST_terr; then + if [[ $ZTST_flags != *D* ]] && ! diff -c $ZTST_err $ZTST_terr; then ZTST_testfailed "error output differs from expected as shown above for: $ZTST_code" fi |