diff options
Diffstat (limited to 'Test')
-rw-r--r-- | Test/11glob.ztst | 12 | ||||
-rwxr-xr-x | Test/ztst.zsh | 93 |
2 files changed, 76 insertions, 29 deletions
diff --git a/Test/11glob.ztst b/Test/11glob.ztst index f5819595b..3a64b8c22 100644 --- a/Test/11glob.ztst +++ b/Test/11glob.ztst @@ -162,6 +162,18 @@ >1: [[ read.me = (#ia1)README~READ.ME ]] >0: [[ read.me = (#ia1)README~READ_ME ]] >1: [[ read.me = (#ia1)README~(#a1)READ_ME ]] +>0: [[ test = *((#s)|/)test((#e)|/)* ]] +>0: [[ test/path = *((#s)|/)test((#e)|/)* ]] +>0: [[ path/test = *((#s)|/)test((#e)|/)* ]] +>0: [[ path/test/ohyes = *((#s)|/)test((#e)|/)* ]] +>1: [[ atest = *((#s)|/)test((#e)|/)* ]] +>1: [[ testy = *((#s)|/)test((#e)|/)* ]] +>1: [[ testy/path = *((#s)|/)test((#e)|/)* ]] +>1: [[ path/atest = *((#s)|/)test((#e)|/)* ]] +>1: [[ atest/path = *((#s)|/)test((#e)|/)* ]] +>1: [[ path/testy = *((#s)|/)test((#e)|/)* ]] +>1: [[ path/testy/ohyes = *((#s)|/)test((#e)|/)* ]] +>1: [[ path/atest/ohyes = *((#s)|/)test((#e)|/)* ]] >0 tests failed. globtest globtests.ksh diff --git a/Test/ztst.zsh b/Test/ztst.zsh index d3d03e883..c9e5a0294 100755 --- a/Test/ztst.zsh +++ b/Test/ztst.zsh @@ -14,16 +14,21 @@ # 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 # still not be good enough. Maybe we should trick it somehow. emulate -R zsh +# Set the module load path to correspond to this build of zsh. +# This Modules directory should have been created by "make check". +[[ -d Modules/zsh ]] && module_path=( $PWD/Modules ) + # We need to be able to save and restore the options used in the test. # We use the $options variable of the parameter module for this. -zmodload -i parameter +zmodload -i zsh/parameter # Note that both the following are regular arrays, since we only use them # in whole array assignments to/from $options. @@ -42,18 +47,31 @@ ZTST_mainopts=(${(kv)options}) ZTST_testdir=$PWD ZTST_testname=$1 +# The source directory is not necessarily the current directory, +# but if $0 doesn't contain a `/' assume it is. +if [[ $0 = */* ]]; then + ZTST_srcdir=${0%/*} +else + ZTST_srcdir=$PWD +fi +[[ $ZTST_srcdir = /* ]] || ZTST_srcdir="$ZTST_testdir/$ZTST_srcdir" + +# Set the function autoload paths to correspond to this build of zsh. +fpath=( $ZTST_srcdir/../(Completion|Functions)/*~*/CVS(/) ) + +: ${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() { - rm -rf $ZTST_testdir/dummy.tmp $ZTST_testdir/*.tmp \ - $ZTST_in $ZTST_out $ZTST_err $ZTST_tout $ZTST_terr + cd $ZTST_testdir + rm -rf $ZTST_testdir/dummy.tmp $ZTST_testdir/*.tmp ${TMPPREFIX}.ztst*$$ } # This cleanup always gets performed, even if we abort. Later, @@ -67,10 +85,11 @@ rm -rf dummy.tmp *.tmp # Report failure. Note that all output regarding the tests goes to stdout. # That saves an unpleasant mixture of stdout and stderr to sort out. ZTST_testfailed() { - print "Test $ZTST_testname failed: $1" + print -r "Test $ZTST_testname failed: $1" if [[ -n $ZTST_message ]]; then - print "Was testing: $ZTST_message" + print -r "Was testing: $ZTST_message" fi + print -r "$ZTST_testname: test failed." ZTST_cleanup exit 1 } @@ -79,7 +98,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." @@ -97,7 +116,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 } @@ -144,7 +163,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 @@ -153,6 +172,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 @@ -209,27 +244,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: @@ -240,8 +272,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 @@ -249,7 +280,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: @@ -258,11 +291,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 |