summaryrefslogtreecommitdiffstats
path: root/Test
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2001-10-16 17:19:18 +0000
committerBart Schaefer <barts@users.sourceforge.net>2001-10-16 17:19:18 +0000
commit5437faa28c0cf86c7241f523909ce33ad4839672 (patch)
tree6f18a5cfe4047d32986ff3a7714ec1178929e3c3 /Test
parentreorder my ChangeLog entries to match the 4.1 branch (diff)
downloadzsh-5437faa28c0cf86c7241f523909ce33ad4839672.tar
zsh-5437faa28c0cf86c7241f523909ce33ad4839672.tar.gz
zsh-5437faa28c0cf86c7241f523909ce33ad4839672.tar.bz2
zsh-5437faa28c0cf86c7241f523909ce33ad4839672.tar.lz
zsh-5437faa28c0cf86c7241f523909ce33ad4839672.tar.xz
zsh-5437faa28c0cf86c7241f523909ce33ad4839672.tar.zst
zsh-5437faa28c0cf86c7241f523909ce33ad4839672.zip
Merge assorted patches from the dev. version, as approved by PWS.
Read ChangeLog for details.
Diffstat (limited to 'Test')
-rw-r--r--Test/A01grammar.ztst321
-rw-r--r--Test/A05execution.ztst159
-rw-r--r--Test/B02typeset.ztst10
-rw-r--r--Test/C02cond.ztst7
-rw-r--r--Test/D04parameter.ztst2
-rw-r--r--Test/E01options.ztst3
-rw-r--r--Test/E02xtrace.ztst91
-rw-r--r--Test/Y01completion.ztst56
-rw-r--r--Test/Y02compmatch.ztst671
-rw-r--r--Test/Y03arguments.ztst151
10 files changed, 1465 insertions, 6 deletions
diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst
new file mode 100644
index 000000000..8b6b403fb
--- /dev/null
+++ b/Test/A01grammar.ztst
@@ -0,0 +1,321 @@
+#
+# This file contains tests corresponding to the `Shell Grammar' texinfo node.
+#
+
+%prep
+
+ mkdir basic.tmp && cd basic.tmp
+
+ touch foo bar
+
+%test
+#
+# Tests for `Simple Commands and Pipelines'
+#
+ echo foo | cat | sed 's/foo/bar/'
+0:Basic pipeline handling
+>bar
+
+ false | true
+0:Exit status of pipeline with builtins (true)
+
+ true | false
+1:Exit status of pipeline with builtins (false)
+
+ fn() { local foo; read foo; print $foo; }
+ coproc fn
+ print -p coproc test output
+ read -p bar
+ print $bar
+0:Basic coprocess handling
+>coproc test output
+
+ true | false && print true || print false
+0:Basic sublist (i)
+>false
+
+ false | true && print true || print false
+0:Basic sublist (ii)
+>true
+
+ (cd /NonExistentDirectory >&/dev/null) || print false
+0:Basic subshell list with error
+>false
+
+ { cd /NonExistentDirectory >&/dev/null } || print false
+0:Basic current shell list with error
+>false
+
+#
+# Tests for `Precommand Modifiers'
+#
+ - $ZTST_testdir/../Src/zsh -fc "[[ \$0 = \"-$ZTST_testdir/../Src/zsh\" ]]"
+0:`-' precommand modifier
+
+ echo f*
+ noglob echo f*
+0:`noglob' precommand modifier
+>foo
+>f*
+
+ (exec /bin/sh; echo bar)
+0:`exec' precommand modifier
+
+ cat() { echo Function cat executed; }
+ command cat && unfunction cat
+0:`command' precommand modifier
+<External command cat executed
+>External command cat executed
+
+ cd() { echo Not cd at all; }
+ builtin cd . && unfunction cd
+0:`builtin' precommand modifier
+
+#
+# Tests for `Complex Commands'
+#
+
+ if true; then
+ print true-1
+ elif true; then
+ print true-2
+ else
+ print false
+ fi
+0:`if ...' (i)
+>true-1
+
+ if false; then
+ print true-1
+ elif true; then
+ print true-2
+ else
+ print false
+ fi
+0:`if ...' (ii)
+>true-2
+
+ if false; then
+ print true-1
+ elif false; then
+ print true-2
+ else
+ print false
+ fi
+0:`if ...' (iii)
+>false
+
+ if true;
+ :
+ fi
+1d:`if ...' (iv)
+?ZTST_execchunk:-1: parse error near `fi'
+
+ for name in word to term; do
+ print $name
+ done
+0:`for' loop
+>word
+>to
+>term
+
+ for name
+ in word to term; do
+ print $name
+ done
+0:`for' loop with newline before in keyword
+>word
+>to
+>term
+
+ for (( name = 0; name < 3; name++ )); do
+ print $name
+ done
+0:arithmetic `for' loop
+>0
+>1
+>2
+
+ name=0
+ while (( name < 3 )); do
+ print $name
+ (( name++ ))
+ done
+0:`while' loop
+>0
+>1
+>2
+
+ name=0
+ until (( name == 3 )); do
+ print $name
+ (( name++ ))
+ done
+0:`until' loop
+>0
+>1
+>2
+
+ repeat 3 do
+ echo over and over
+ done
+0:`repeat' loop
+>over and over
+>over and over
+>over and over
+
+ word=Trinity
+ case $word in
+ Michaelmas) print 0
+ ;;
+ Hilary) print 1
+ ;;
+ Trinity) print 2
+ ;;
+ *) print 3
+ ;;
+ esac
+0:`case', old syntax
+>2
+
+ word=Trinity
+ case $word in
+ (Michaelmas) print 0
+ ;;
+ (Hilary) print 1
+ ;;
+ (Trinity) print 2
+ ;;
+ (*) print 3
+ ;;
+ esac
+0:`case', new syntax
+>2
+
+ word=Hilary
+ case $word in
+ (Michaelmas) print 0
+ ;;
+ (Hilary) print 1
+ ;&
+ (Trinity) print 2
+ ;&
+ (*) print 3
+ ;;
+ esac
+0:`case', new syntax, cascaded
+>1
+>2
+>3
+
+## This doesn't work, because zsh tries to read from the terminal
+## even in a non-interactive shell. The manual implies it always reads
+## from stdin, even in an interactive shell.
+# PS3="input> "
+# select name in one two three; do
+# print $name
+# done
+#0:`select' loop
+#<2
+#>1) one 2) two 3) three
+#>input>
+#>two
+
+ function name1 name2 () { print This is $0; }
+ name2
+ name1 name2() { print This is still $0; }
+ name2
+0:`function' keyword
+>This is name2
+>This is still name2
+
+ (time cat) >&/dev/null
+0:`time' keyword (status only)
+
+ if [[ -f foo && -d . && -n $ZTST_testdir ]]; then
+ true
+ else
+ false
+ fi
+0:basic [[ ... ]] test
+
+#
+# Tests for `Alternate Forms For Complex Commands'
+#
+
+ if (true) { print true-1 } elif (true) { print true-2 } else { print false }
+ if (false) { print true-1 } elif (true) { print true-2 } else { print false }
+ if (false) { print true-1 } elif (false) { print true-2 } else { print false }
+0:Alternate `if' with braces
+>true-1
+>true-2
+>false
+
+ if true; print true
+0:Short form of `if'
+>true
+
+ for name ( word1 word2 word3 ) print $name
+0:Form of `for' with parentheses.
+>word1
+>word2
+>word3
+
+ for name in alpha beta gamma; print $name
+0:Short form of `for'
+>alpha
+>beta
+>gamma
+
+ for (( val = 2; val < 10; val *= val )) print $val
+0:Short arithmetic `for'
+>2
+>4
+
+ foreach name ( verbiage words periphrasis )
+ print $name
+ end
+0:Csh-like `for'
+>verbiage
+>words
+>periphrasis
+
+# see comment with braces used in if loops
+ val=0;
+ while (( val < 2 )) { print $((val++)); }
+0:Alternative `while'
+>0
+>1
+
+ val=2;
+ until (( val == 0 )) { print $((val--)); }
+0:Alternative `until'
+>2
+>1
+
+ repeat 3 print Hip hip hooray
+0:Short `repeat'
+>Hip hip hooray
+>Hip hip hooray
+>Hip hip hooray
+
+ case bravo {
+ (alpha) print schmalpha
+ ;;
+ (bravo) print schmavo
+ ;;
+ (charlie) print schmarlie
+ ;;
+ }
+0:`case' with braces
+>schmavo
+
+ print 'This test hangs the shell when it fails...' >&8
+ name=0
+# The number 4375 here is chosen to produce more than 16384 bytes of output
+ while (( name < 4375 )); do
+ print -n $name
+ (( name++ ))
+ done < /dev/null | { read name; print done }
+0:Bug regression: `while' loop with redirection and pipeline
+>done
diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst
new file mode 100644
index 000000000..202a4bb7a
--- /dev/null
+++ b/Test/A05execution.ztst
@@ -0,0 +1,159 @@
+%prep
+
+ storepath=($path)
+
+ mkdir command.tmp command.tmp/dir1 command.tmp/dir2
+
+ cd command.tmp
+
+ print '#!/bin/sh\necho This is top' >tstcmd
+
+ print '#!/bin/sh\necho This is dir1' >dir1/tstcmd
+
+ print '#!/bin/sh\necho This is dir2' >dir2/tstcmd
+
+ chmod 755 tstcmd dir1/tstcmd dir2/tstcmd
+
+%test
+ ./tstcmd
+0:./prog execution
+>This is top
+
+ path=($ZTST_testdir/command.tmp/dir1
+ $ZTST_testdir/command.tmp/dir2
+ .)
+ tstcmd
+ path=($storepath)
+0:path (1)
+>This is dir1
+
+ path=(. command.tmp/dir{1,2})
+ tstcmd
+ path=($storepath)
+0:path (2)
+>This is top
+
+ functst() { print $# arguments:; print -l $*; }
+ functst "Eines Morgens" "als Gregor Samsa"
+ functst ""
+ functst "aus unrühigen Träumen erwachte"
+ foo="fand er sich in seinem Bett"
+ bar=
+ rod="zu einem ungeheuren Ungeziefer verwandelt."
+ functst $foo $bar $rod
+# set up alias for next test
+ alias foo='print This is alias one'
+0:function argument passing
+>2 arguments:
+>Eines Morgens
+>als Gregor Samsa
+>1 arguments:
+>
+>1 arguments:
+>aus unrühigen Träumen erwachte
+>2 arguments:
+>fand er sich in seinem Bett
+>zu einem ungeheuren Ungeziefer verwandelt.
+
+ alias foo='print This is alias two'
+ fn() { foo; }
+ fn
+0:Aliases in functions
+>This is alias one
+
+ foo='Global foo'
+ traptst() { local foo="Local foo"; trap 'print $foo' EXIT; }
+ traptst
+0:EXIT trap environment
+>Global foo
+
+ functst() { return 0; print Ha ha; return 1; }
+ functst
+0:return (1)
+
+ functst() { return 1; print Ho ho; return 0; }
+ functst
+1:return (2)
+
+ unfunction functst
+ fpath=(.)
+ print "print This is functst." >functst
+ autoload functst
+ functst
+0:autoloading (1)
+>This is functst.
+
+ unfunction functst
+ print "functst() { print This, too, is functst; }; print Hello." >functst
+ typeset -fu functst
+ functst
+ functst
+0:autoloading with initialization
+>Hello.
+>This, too, is functst
+
+ unfunction functst
+ print "print Yet another version" >functst
+ functst() { autoload -X; }
+ functst
+0:autoloading via -X
+>Yet another version
+
+ chpwd() { print Changed to $PWD; }
+ cd .
+ unfunction chpwd
+0q:chpwd
+>Changed to $ZTST_testdir/command.tmp
+
+# Hard to test periodic, precmd and preexec non-interactively.
+
+ fn() { TRAPEXIT() { print Exit; }; }
+ fn
+0:TRAPEXIT
+>Exit
+
+ unfunction fn
+ print 'TRAPDEBUG() {
+ print Line $LINENO
+ }
+ :
+ unfunction TRAPDEBUG
+ ' > fn
+ autoload fn
+ fn
+ rm fn
+0:TRAPDEBUG
+>Line 1
+>Line 1
+
+ unfunction fn
+ print 'trap '\''print Line $LINENO'\'' DEBUG
+ :
+ trap - DEBUG
+ ' > fn
+ autoload fn
+ fn
+ rm fn
+0:trap DEBUG
+>Line 1
+>Line 2
+
+ TRAPZERR() { print Command failed; }
+ true
+ false
+ true
+ false
+ unfunction TRAPZERR
+0:TRAPZERR
+>Command failed
+>Command failed
+
+ trap 'print Command failed again.' ZERR
+ true
+ false
+ true
+ false
+ trap - ZERR
+0:trap ZERR
+>Command failed again.
+>Command failed again.
diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst
index 2dc015d31..da04a79e2 100644
--- a/Test/B02typeset.ztst
+++ b/Test/B02typeset.ztst
@@ -102,7 +102,7 @@
declare +m
1:Differences of declare and typeset
-?(eval):1: bad option: -m
+?ZTST_execchunk:2: bad option: -m
scope10
print $outer
@@ -160,7 +160,7 @@
r=failure
1:Readonly declaration
>success
-?(eval):3: read-only variable: r
+?ZTST_execchunk:2: read-only variable: r
typeset r=success
readonly r
@@ -168,7 +168,7 @@
r=failure
1:Convert to readonly
>success
-?(eval):4: read-only variable: r
+?ZTST_execchunk:2: read-only variable: r
typeset -gU array
print $array
@@ -186,7 +186,7 @@
typeset -T SCALAR array
typeset +T SCALAR
1:Untying is prohibited
-?(eval):typeset:2: use unset to remove tied variables
+?ZTST_execchunk:typeset:2: use unset to remove tied variables
OUTER=outer
scope13
@@ -197,7 +197,7 @@
local array[2]=x
1:Illegal local array element assignment
-?(eval):local:1: array[2]: can't create local array elements
+?ZTST_execchunk:local:2: array[2]: can't create local array elements
local -a array
typeset array[1]=a array[2]=b array[3]=c
diff --git a/Test/C02cond.ztst b/Test/C02cond.ztst
index b575e92be..b320634d5 100644
--- a/Test/C02cond.ztst
+++ b/Test/C02cond.ztst
@@ -85,7 +85,12 @@
fi
0dD:-p cond
- [[ -r zerolength && ! -r unmodish ]]
+ if (( EUID == 0 )); then
+ print -u8 'Warning: Not testing [[ ! -r file ]] (root reads anything)'
+ [[ -r zerolength && -r unmodish ]]
+ else
+ [[ -r zerolength && ! -r unmodish ]]
+ fi
0:-r cond
[[ -s nonzerolength && ! -s zerolength ]]
diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst
index 9506f56e4..7e70691f7 100644
--- a/Test/D04parameter.ztst
+++ b/Test/D04parameter.ztst
@@ -3,7 +3,9 @@
%prep
mkdir parameter.tmp
+
cd parameter.tmp
+
touch boringfile evenmoreboringfile
%test
diff --git a/Test/E01options.ztst b/Test/E01options.ztst
index ee58a5c8a..f93012020 100644
--- a/Test/E01options.ztst
+++ b/Test/E01options.ztst
@@ -82,8 +82,11 @@
%prep
mkdir options.tmp && cd options.tmp
+
mkdir tmpcd
+
touch tmpfile1 tmpfile2
+
mydir=$PWD
mydirt=`print -P %~`
catpath=$(which cat)
diff --git a/Test/E02xtrace.ztst b/Test/E02xtrace.ztst
new file mode 100644
index 000000000..09c8eb6b5
--- /dev/null
+++ b/Test/E02xtrace.ztst
@@ -0,0 +1,91 @@
+# Test that xtrace output is correctly generated
+
+%prep
+ mkdir xtrace.tmp && cd xtrace.tmp
+
+ function xtf {
+ local regression_test_dummy_variable
+ print "$*"
+ }
+ echo 'print "$*"' > xt.in
+
+%test
+
+ set -x
+ print 'Tracing: builtin'
+ print 'Tracing: builtin 2>file' 2>xtrace.err
+ cat <<<'Tracing: external'
+ cat <<<'Tracing: external 2>file' 2>>xtrace.err
+ ( print 'Tracing: ( builtin )' )
+ ( print 'Tracing: ( builtin ) 2>file' ) 2>>xtrace.err
+ ( cat <<<'Tracing: ( external )' )
+ ( cat <<<'Tracing: ( external ) 2>file' ) 2>>xtrace.err
+ { print 'Tracing: { builtin }' }
+ { print 'Tracing: { builtin } 2>file' } 2>>xtrace.err
+ { cat <<<'Tracing: { external }' }
+ { cat <<<'Tracing: { external } 2>file' } 2>>xtrace.err
+ repeat 1 do print 'Tracing: do builtin done'; done
+ repeat 1 do print 'Tracing: do builtin done 2>file'; done 2>>xtrace.err
+ repeat 1 do cat <<<'Tracing: do external done'; done
+ repeat 1 do cat <<<'Tracing: do external done 2>file'; done 2>>xtrace.err
+ xtf 'Tracing: function'
+ xtf 'Tracing: function 2>file' 2>>xtrace.err
+ . ./xt.in 'Tracing: source'
+ . ./xt.in 'Tracing: source 2>file' 2>>xtrace.err
+ set +x
+ cat xtrace.err
+0:xtrace with and without redirection
+>Tracing: builtin
+>Tracing: builtin 2>file
+>Tracing: external
+>Tracing: external 2>file
+>Tracing: ( builtin )
+>Tracing: ( builtin ) 2>file
+>Tracing: ( external )
+>Tracing: ( external ) 2>file
+>Tracing: { builtin }
+>Tracing: { builtin } 2>file
+>Tracing: { external }
+>Tracing: { external } 2>file
+>Tracing: do builtin done
+>Tracing: do builtin done 2>file
+>Tracing: do external done
+>Tracing: do external done 2>file
+>Tracing: function
+>Tracing: function 2>file
+>Tracing: source
+>Tracing: source 2>file
+>+ZTST_execchunk:2> print Tracing: ( builtin ) 2>file
+>+ZTST_execchunk:2> cat
+>+ZTST_execchunk:2> print Tracing: { builtin } 2>file
+>+ZTST_execchunk:2> cat
+>+ZTST_execchunk:2> print Tracing: do builtin done 2>file
+>+ZTST_execchunk:2> cat
+?+ZTST_execchunk:2> print Tracing: builtin
+?+ZTST_execchunk:2> print Tracing: builtin 2>file
+?+ZTST_execchunk:2> cat
+?+ZTST_execchunk:2> cat
+?+ZTST_execchunk:2> print Tracing: ( builtin )
+?+ZTST_execchunk:2> cat
+?+ZTST_execchunk:2> print Tracing: { builtin }
+?+ZTST_execchunk:2> cat
+?+ZTST_execchunk:2> print Tracing: do builtin done
+?+ZTST_execchunk:2> cat
+?+ZTST_execchunk:2> xtf Tracing: function
+?+xtf:0> local regression_test_dummy_variable
+?+xtf:0> print Tracing: function
+?+ZTST_execchunk:2> xtf Tracing: function 2>file
+?+xtf:0> local regression_test_dummy_variable
+?+xtf:0> print Tracing: function 2>file
+?+ZTST_execchunk:2> . ./xt.in Tracing: source
+?+./xt.in:1> print Tracing: source
+?+ZTST_execchunk:2> . ./xt.in Tracing: source 2>file
+?+./xt.in:1> print Tracing: source 2>file
+?+ZTST_execchunk:2> set +x
+
+ typeset -ft xtf
+ xtf 'Tracing: function'
+0:
+>Tracing: function
+?+xtf:0> local regression_test_dummy_variable
+?+xtf:0> print Tracing: function
diff --git a/Test/Y01completion.ztst b/Test/Y01completion.ztst
new file mode 100644
index 000000000..371cad247
--- /dev/null
+++ b/Test/Y01completion.ztst
@@ -0,0 +1,56 @@
+# Tests for completion system.
+
+%prep
+ . $ZTST_srcdir/comptest
+
+ mkdir comp.tmp
+ cd comp.tmp
+
+ comptestinit -z $ZTST_testdir/../Src/zsh &&
+ {
+ mkdir dir1
+ mkdir dir2
+ touch file1
+ touch file2
+ }
+
+%test
+
+ comptest $': \t\t\t\t\t\t\t'
+0:directories and files
+>line: {: }{}
+>DESCRIPTION:{file}
+>DI:{dir1}
+>DI:{dir2}
+>FI:{file1}
+>FI:{file2}
+>line: {: dir1/}{}
+>line: {: dir2/}{}
+>line: {: file1}{}
+>line: {: file2}{}
+>line: {: dir1/}{}
+>line: {: dir2/}{}
+
+ comptesteval '_users () { compadd user1 user2 }'
+ comptest $': ~\t\t\t\t\t'
+0:tilde
+>line: {: ~user}{}
+>line: {: ~user}{}
+>NO:{user1}
+>NO:{user2}
+>line: {: ~user1}{}
+>line: {: ~user2}{}
+>line: {: ~user1}{}
+
+ comptest $'echo ;:\C-b\C-b\t'
+0:tilde
+>line: {echo }{;:}
+>DESCRIPTION:{file}
+>DI:{dir1}
+>DI:{dir2}
+>FI:{file1}
+>FI:{file2}
+
+%clean
+
+ zmodload -ui zsh/zpty
diff --git a/Test/Y02compmatch.ztst b/Test/Y02compmatch.ztst
new file mode 100644
index 000000000..4d4e0c0fa
--- /dev/null
+++ b/Test/Y02compmatch.ztst
@@ -0,0 +1,671 @@
+# Tests for completion system matching control
+
+# Most tests follow this format:
+# test_code $matcher_string selection_list
+# comptest -c "$code" $' tst input_string'
+# test_code generates the string $codem which sets what words the completion
+# should be selecting from. The comptest function actually performs the
+# completion test, using the completion function generated by test_code.
+#
+# This test also tests error conditions that compadd reports, so output also
+# contains the compadd output.
+
+%prep
+ . $ZTST_srcdir/comptest
+
+ mkdir match.tmp
+ cd match.tmp
+
+ comptestinit -z $ZTST_testdir/../Src/zsh &&
+ {
+ list1=(IndianRed IndianRed2 IndianRed3 IndianRed4)
+ test_code () {
+ matcher=$1;
+ list=$2;
+ code="compdef _tst tst ; _tst () { echo -n '<COMPADD>';compadd -M '"
+ code="$code$matcher"
+ code="$code' - ${(P)list} ; echo -n '</COMPADD>'"
+ code="$code; $extra_cmd"
+ code="$code; echo -n '<INSERT_POSITIONS>'"
+ code="$code; echo \$compstate[insert_positions]"
+ code="$code; echo -n '</INSERT_POSITIONS>'"
+ code="$code}"
+ comptesteval "$code"
+ }
+ }
+
+
+%test
+
+ test_code z: list1
+ comptest $'tst \t'
+0:Match Error for "z:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: unknown match specification character `z'}
+>INSERT_POSITIONS:{}
+
+ test_code m: list1
+ comptest $'tst \t'
+0:Match Error for "m:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ test_code M: list1
+ comptest $'tst \t'
+0:Match Error for "M:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ test_code r: list1
+ comptest $'tst \t'
+0:Match Error "r:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ test_code R: list1
+ comptest $'tst \t'
+0:Match Error "R:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ test_code l: list1
+ comptest $'tst \t'
+0:Match Error for "l:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ test_code L: list1
+ comptest $'tst \t'
+0:Match Error for "L:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ test_code 'm:{0-9' list1
+ comptest $'tst \t'
+0:Match Error for "m:{0-9"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: unterminated character class}
+>INSERT_POSITIONS:{}
+
+ test_code 'm:{0-9}' list1
+ comptest $'tst \t'
+0:Match Error for "m:{0-9}"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing word pattern}
+>INSERT_POSITIONS:{}
+
+ test_code 'm:{0-9}={' list1
+ comptest $'tst \t'
+0:Match Error for "m:{0-9}={"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: unterminated character class}
+>INSERT_POSITIONS:{}
+
+ test_code 'm:{0-9}={0-' list1
+ comptest $'tst \t'
+0:Match Error for "m:{0-9}={0-"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: unterminated character class}
+>INSERT_POSITIONS:{}
+
+ test_code 'm:{0-9}={-' list1
+ comptest $'tst \t'
+0:Match Error for "m:{0-9}={-"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: unterminated character class}
+>INSERT_POSITIONS:{}
+
+ test_code r: list1
+ comptest $'tst \t'
+0:Match Error "r:"
+>line: {tst }{}
+>COMPADD:{_tst:compadd: missing patterns}
+>INSERT_POSITIONS:{}
+
+ example1_list=(
+ kshoptionprint shglob
+ listambiguous shinstdin
+ listbeep shnullcmd
+ listpacked shoptionletters
+ listrowsfirst shortloops
+ listtypes shwordsplit
+ )
+ options_matcher='L:|[nN][oO]= M:_= M:{A-Z}={a-z}'
+ test_code $options_matcher example1_list
+ comptest $'tst nolistbee\t'
+0:Documentation example for options, input "nolistbee"
+>line: {tst nolistbeep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{14}
+
+
+ test_code $options_matcher example1_list
+ comptest $'tst list_bee\t'
+0:Documentation example for options, input "list_bee"
+>line: {tst list_beep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{13}
+
+ test_code $options_matcher example1_list
+ comptest $'tst ListBee\t'
+0:Documentation example for options, input "ListBee"
+>line: {tst ListBeep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{12}
+
+ test_code $options_matcher example1_list
+ comptest $'tst NOList\tB\t'
+0:Documentation example for options, input "NOList"
+>line: {tst NOList}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{10}
+>NO:{NOListambiguous}
+>NO:{NOListbeep}
+>NO:{NOListpacked}
+>NO:{NOListrowsfirst}
+>NO:{NOListtypes}
+>line: {tst NOListBeep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{14}
+
+
+ test_code $options_matcher example1_list
+ comptest $'tst NO_List\t__\tB\t'
+0:Documentation example for options, input "NO_List\t__\tB\t"
+>line: {tst NO_List}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{11}
+>NO:{NO_Listambiguous}
+>NO:{NO_Listbeep}
+>NO:{NO_Listpacked}
+>NO:{NO_Listrowsfirst}
+>NO:{NO_Listtypes}
+>line: {tst NO_List__}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{13}
+>NO:{NO_List__ambiguous}
+>NO:{NO_List__beep}
+>NO:{NO_List__packed}
+>NO:{NO_List__rowsfirst}
+>NO:{NO_List__types}
+>line: {tst NO_List__Beep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{17}
+
+ test_code $options_matcher example1_list
+ comptest $'tst __\tN\t__o\t___\tlist_\tbeep__\t'
+0:Documentation example for options, input "__\tN\t__o\t___\tlist_\tbeep__\t"
+>line: {tst __}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{6}
+>NO:{__kshoptionprint}
+>NO:{__listambiguous}
+>NO:{__listbeep}
+>NO:{__listpacked}
+>NO:{__listrowsfirst}
+>NO:{__listtypes}
+>NO:{__shglob}
+>NO:{__shinstdin}
+>NO:{__shnullcmd}
+>NO:{__shoptionletters}
+>NO:{__shortloops}
+>NO:{__shwordsplit}
+>line: {tst __N}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __N__o}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __N__o___}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __N__o___list_}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __N__o___list_beep__}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+
+ test_code $options_matcher example1_list
+ comptest $'tst __\tNo\t___\tlist_\tbeep__\t'
+0:Documentation example for options, input "__\tNo\t___\tlist_\tbeep__\t"
+>line: {tst __}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{6}
+>NO:{__kshoptionprint}
+>NO:{__listambiguous}
+>NO:{__listbeep}
+>NO:{__listpacked}
+>NO:{__listrowsfirst}
+>NO:{__listtypes}
+>NO:{__shglob}
+>NO:{__shinstdin}
+>NO:{__shnullcmd}
+>NO:{__shoptionletters}
+>NO:{__shortloops}
+>NO:{__shwordsplit}
+>line: {tst __No}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __No___}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __No___list_}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+>line: {tst __No___list_beep__}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+
+
+ test_code $options_matcher example1_list
+ comptest $'tst ___\tlist_\tbeep__\t'
+0:Documentation example for options, input "___\tlist_\tbeep__\t"
+>line: {tst ___}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{7}
+>NO:{___kshoptionprint}
+>NO:{___listambiguous}
+>NO:{___listbeep}
+>NO:{___listpacked}
+>NO:{___listrowsfirst}
+>NO:{___listtypes}
+>NO:{___shglob}
+>NO:{___shinstdin}
+>NO:{___shnullcmd}
+>NO:{___shoptionletters}
+>NO:{___shortloops}
+>NO:{___shwordsplit}
+>line: {tst ___list_}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{12}
+>NO:{___list_ambiguous}
+>NO:{___list_beep}
+>NO:{___list_packed}
+>NO:{___list_rowsfirst}
+>NO:{___list_types}
+>line: {tst ___list_beep__ }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{18}
+
+ test_code 'B:[nN][oO]= M:_= M:{A-Z}={a-z}' example1_list
+ comptest $'tst __no_listbe\t'
+0:Documentation example for options, input "__no_listbe"
+>line: {tst __no_listbeep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{17}
+
+ test_code 'B:[nN][oO]= M:_= M:{A-Z}={a-z}' example1_list
+ comptest $'tst nonono_listbe\t'
+0:Documentation example for options, input "nonono_listbe"
+>line: {tst nonono_listbeep }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{19}
+
+ lower_insensitive_M="M:{a-z}={A-Z}"
+ lower_insensitive_m="m:{a-z}={A-Z}"
+ example2_list=(ABC Abc abc)
+ test_code $lower_insensitive_M example2_list
+ comptest $'tst ab\tC\t'
+0:Documentation example for lowercase insenitive M, input "ab\tC\t"
+>line: {tst ab}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{6}
+>NO:{abC}
+>NO:{abc}
+>line: {tst abC }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{7}
+
+ test_code $lower_insensitive_m example2_list
+ comptest $'tst A\t\t'
+0:Documentation example for lowercase insenitive m, input "A\t\t"
+>line: {tst A}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{5}
+>NO:{ABC}
+>NO:{Abc}
+>line: {tst ABC}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{5}
+
+ example3_list=(ABC Abc abc)
+ case_insensitive_M="M:{a-zA-Z}={A-Za-z}"
+ case_insensitive_m="m:{a-zA-Z}={A-Za-z}"
+ test_code $case_insensitive_M example3_list
+ comptest $'tst aB\t\t'
+0:Documentation example for case insenitive M, input "aB\t\t"
+>line: {tst aB}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{6}
+>NO:{aBC}
+>NO:{aBc}
+>line: {tst aBC}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{6}
+
+
+ test_code $case_insensitive_m example3_list
+ comptest $'tst aB\t\t'
+0:Documentation example for case insenitive m, input "aB\t\t"
+>line: {tst a}{BC}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7}
+>line: {tst a}{BC}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7}
+>NO:{ABC}
+>NO:{Abc}
+>NO:{abc}
+
+ example4_matcher='r:|.=* r:|=*'
+ example4_list=(comp.sources.unix comp.sources.misc
+ comp.graphics.algorithms comp.graphics.animation comp.graphics.api
+ comp.graphics.apps comp.graphics.misc comp.graphics.packages
+ comp.graphics.rendering comp.graphics.visualization comp.graphics.apps.alias
+ comp.graphics.apps.gimp comp.graphics.apps.gnuplot
+ comp.graphics.apps.lightwave comp.graphics.apps.pagemaker
+ comp.graphics.apps.paint-shop-pro comp.graphics.apps.photoshop
+ comp.graphics.apps.softimage comp.graphics.apps.ulead
+ comp.graphics.rendering.misc comp.graphics.rendering.raytracing
+ comp.graphics.rendering.renderman)
+ test_code $example4_matcher example4_list
+ comptest $'tst c.s.u\t'
+0:Documentation example using input c.s.u
+>line: {tst comp.sources.unix }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{21}
+
+ test_code $example4_matcher example4_list
+ comptest $'tst c.g.\ta\t.\tp\ta\tg\t'
+0:Documentation example using input c.g.\ta\t.\tp\ta\tg\t
+>line: {tst comp.graphics.}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{18}
+>line: {tst comp.graphics.a}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{19}
+>NO:{comp.graphics.algorithms}
+>NO:{comp.graphics.animation}
+>NO:{comp.graphics.api}
+>NO:{comp.graphics.apps}
+>NO:{comp.graphics.apps.alias}
+>NO:{comp.graphics.apps.gimp}
+>NO:{comp.graphics.apps.gnuplot}
+>NO:{comp.graphics.apps.lightwave}
+>NO:{comp.graphics.apps.pagemaker}
+>NO:{comp.graphics.apps.paint-shop-pro}
+>NO:{comp.graphics.apps.photoshop}
+>NO:{comp.graphics.apps.softimage}
+>NO:{comp.graphics.apps.ulead}
+>line: {tst comp.graphics.apps.}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{23}
+>line: {tst comp.graphics.apps.p}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{24}
+>NO:{comp.graphics.apps.pagemaker}
+>NO:{comp.graphics.apps.paint-shop-pro}
+>NO:{comp.graphics.apps.photoshop}
+>line: {tst comp.graphics.apps.pa}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{25}
+>NO:{comp.graphics.apps.pagemaker}
+>NO:{comp.graphics.apps.paint-shop-pro}
+>line: {tst comp.graphics.apps.pagemaker }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{32}
+
+ test_code $example4_matcher example4_list
+ comptest $'tst c...pag\t'
+0:Documentation example using input c...pag\t
+>line: {tst comp.graphics.apps.pagemaker }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{32}
+
+ test_code $example4_matcher example4_list
+ comptest $'tst c...pa\tg\t'
+0:Documentation example using input c...pa\tg\t
+>line: {tst comp.graphics.apps.pa}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{25}
+>line: {tst comp.graphics.apps.pagemaker }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{32}
+
+ example5_matcher='r:|[.,_-]=* r:|=*'
+ example5_list=(veryverylongfile.c veryverylongheader.h)
+ test_code $example5_matcher example5_list
+ comptest $'tst v.c\tv.h\t'
+0:Documentation example using input v.c\t
+>line: {tst veryverylongfile.c }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{23}
+>line: {tst veryverylongfile.c veryverylongheader.h }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{44}
+
+
+ example6_list=(LikeTHIS FooHoo 5foo123 5bar234)
+ test_code 'r:|[A-Z0-9]=* r:|=*' example6_list
+ comptest $'tst H\t'
+0:Documentation example using "r:|[A-Z0-9]=* r:|=*", input H
+>line: {tst H}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+
+ test_code 'r:|[A-Z0-9]=* r:|=*' example6_list
+ comptest $'tst 2\t'
+0:Documentation example using "r:|[A-Z0-9]=* r:|=*", input 2
+>line: {tst 2}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+
+ test_code 'r:|[A-Z0-9]=** r:|=*' example6_list
+ comptest $'tst H\t'
+0:Documentation example using "r:|[A-Z0-9]=** r:|=*", input H
+>line: {tst H}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{4}
+>NO:{FooHoo}
+>NO:{LikeTHIS}
+
+ test_code 'r:|[A-Z0-9]=** r:|=*' example6_list
+ comptest $'tst 2\t\t'
+0:Documentation example using "r:|[A-Z0-9]=** r:|=*", input 2
+>line: {tst 5}{23}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7}
+>line: {tst 5}{23}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7}
+>NO:{5bar234}
+>NO:{5foo123}
+
+ example7_matcher="r:[^A-Z0-9]||[A-Z0-9]=** r:|=*"
+ example7_list=($example6_list)
+ test_code $example7_matcher example7_list
+ comptest $'tst H\t2\t'
+0:Documentation example using "r:[^A-Z0-9]||[A-Z0-9]=** r:|=*"
+>line: {tst FooHoo }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{10}
+>line: {tst FooHoo 5bar234 }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{18}
+
+
+ workers_7311_matcher="m:{a-z}={A-Z} r:|[.,_-]=* r:|=*"
+ workers_7311_list=(Abc-Def-Ghij.txt Abc-def.ghi.jkl_mno.pqr.txt Abc_def_ghi_jkl_mno_pqr.txt)
+ test_code $workers_7311_matcher workers_7311_list
+ comptest $'tst a-a\t'
+0:Bug from workers 7311
+>line: {tst a-a}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+
+ test_code $workers_7311_matcher workers_7311_list
+ comptest $'tst a\t\t-d.\t'
+0:Bug from workers_7311
+>line: {tst Abc}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{7}
+>line: {tst Abc}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{7}
+>NO:{Abc-Def-Ghij.txt}
+>NO:{Abc-def.ghi.jkl_mno.pqr.txt}
+>NO:{Abc_def_ghi_jkl_mno_pqr.txt}
+>line: {tst Abc-def.ghi.jkl_mno.pqr.txt }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{31}
+
+ workers_10886_matcher="r:|[A-Z0-9]=* r:|=*"
+ workers_10886_list=(BW UWB W)
+ test_code $workers_10886_matcher workers_10886_list
+ comptest $'tst W\t'
+0:Bug from workers 10886
+>line: {tst W }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{5}
+
+ workers_11081_matcher='m:{a-zA-Z}={A-Za-z} r:|[.,_-]=* r:[^A-Z0-9]||[A-Z0-9]=* r:[A-Z0-9]||[^A-Z0-9]=* r:[^0-9]||[0-9]=* r:|=*'
+ workers_11081_list=(build.out build.out1 build.out2)
+ test_code $workers_11081_matcher workers_11081_list
+ comptest $'tst bui\t\t\t'
+0:Bug from workers 11081
+>line: {tst build.out}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{13}
+>line: {tst build.out}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{13}
+>NO:{build.out}
+>NO:{build.out1}
+>NO:{build.out2}
+>line: {tst build.out}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{13}
+
+
+ workers_11388_matcher='r:|[:.]=* r:|=*'
+ workers_11388_list=(a.b:0 c.d:1)
+ test_code $workers_11388_matcher workers_11388_list
+ comptest $'tst :\t'
+0:Non-bug from workers 11388
+>line: {tst :}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{}
+
+ workers_11388_matcher='r:|[:.]=** r:|=*'
+ workers_11388_list=(a.b:0 c.d:1)
+ test_code $workers_11388_matcher workers_11388_list
+ comptest $'tst :\t'
+0:Non-bug from workers 11388
+>line: {tst .:}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{4:5:6}
+
+ workers_11586_matcher='r:|.=** r:[^0-9]||[0-9]=**'
+ workers_11586_list=(c00.abc c01.abc.def.00.0)
+ test_code $workers_11586_matcher workers_11586_list
+ comptest $'tst c00\t.\ta\t'
+0:Bug from workers 11586
+>line: {tst c00}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{6}
+>NO:{c00.abc}
+>NO:{c01.abc.def.00.0}
+>line: {tst c00.}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{7:8}
+>NO:{c00.abc}
+>NO:{c01.abc.def.00.0}
+>line: {tst c00.abc }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{11}
+
+ workers_12995a_matcher='r:|/=* r:|=*'
+ workers_12995a_list=(u1 u1/q1 u1/q1/e1 u2 u2/q1 u2/q1/e2 u2/q1/e2/a1 u2/q1/e2/a2 u3 u3/q1 u4 u4/q u4/q/a1 u4/q/a2)
+ test_code $workers_12995a_matcher workers_12995a_list
+ comptest $'tst u/q/a\t'
+0:First test from workers 12995
+>line: {tst u4/q/a}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{10}
+
+ workers_12995b_matcher='m:{a-z}={A-Z} r:|/=* r:|=*'
+ workers_12995b_list=(../Completion/Core ../Completion/Commands)
+ test_code $workers_12995b_matcher workers_12995b_list
+ comptest $'tst ../com/cor\002\002\002\002\002\002\002\t'
+0:Second test from workers 12995
+>line: {tst ../Completion/Core }{}
+>COMPADD:{}
+>INSERT_POSITIONS:{22}
+
+ workers_13320_matcher='r:|[.,_-]=** r:[^0-9]||[0-9]=**'
+ workers_13320_list=(glibc-2.1.94-3.i386.rpm glibc-devel-2.1.94-3.i386.rpm)
+ workers_13320_list=($workers_13320_list glibc-profile-2.1.94-3.i386.rpm)
+ test_code $workers_13320_matcher workers_13320_list
+ comptest $'tst glibc-2.1\t'
+0:Test from workers 13320
+>line: {tst glibc}{-2.1.94-3.i386.rpm}
+>COMPADD:{}
+>INSERT_POSITIONS:{9:27}
+
+ test_code $workers_13320_matcher workers_13320_list
+ comptest $'tst g-2\t'
+0:Test from workers 13320
+>line: {tst glibc}{-2.1.94-3.i386.rpm}
+>COMPADD:{}
+>INSERT_POSITIONS:{9:27}
+
+ workers_13345a_matcher='r:|[.,_-]=**'
+ workers_13345a_list=(A.B.C A.B.C.D A.C)
+ test_code $workers_13345a_matcher workers_13345a_list
+ comptest $'tst A.C\t'
+0:First test from workers 13345
+>line: {tst A.C}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7}
+>NO:{A.B.C}
+>NO:{A.B.C.D}
+>NO:{A.C}
+
+
+ workers_13345b_matcher='r:|[.,_-]=** r:[^0-9]||[0-9]=**'
+ workers_13345b_list=(a-b_1_2_2 a-b_2_0.gz a-b_2_0.zip)
+ test_code $workers_13345b_matcher workers_13345b_list
+ comptest $'tst a-b_2\t'
+0:Second test from workers 13345
+>line: {tst a-b_2_}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{8:10}
+
+ workers_13382_matcher='r:|.=**'
+ workers_13382_list=(a.b.c a.b.c.d aA.bB.cB.dA aA.bB.cC.dD aD.bC.cB.dA aA.bC.cB.dA)
+ test_code $workers_13382_matcher workers_13382_list
+ comptest $'tst a...\tA\tC\t'
+0:Test for insert positions
+>line: {tst a.b.c.d}{}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7:9:11}
+>line: {tst a.b}{.cB.dA}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:7:13}
+>line: {tst a}{.bC.cB.dA}
+>COMPADD:{}
+>INSERT_POSITIONS:{5:14}
+>NO:{aA.bC.cB.dA}
+>NO:{aD.bC.cB.dA}
+
+
+%clean
+
+ zmodload -ui zsh/zpty
diff --git a/Test/Y03arguments.ztst b/Test/Y03arguments.ztst
new file mode 100644
index 000000000..2ffa11577
--- /dev/null
+++ b/Test/Y03arguments.ztst
@@ -0,0 +1,151 @@
+# Tests for _arguments.
+
+%prep
+ . $ZTST_srcdir/comptest
+
+ mkdir comp.tmp
+ cd comp.tmp
+
+ comptestinit -z $ZTST_testdir/../Src/zsh &&
+ {
+ comptesteval 'compdef _tst tst'
+ tst_arguments () { comptesteval "_tst () { _arguments ${${(@qq)*}} }" }
+ }
+
+%test
+ tst_arguments ':desc1:(arg1)'
+ comptest $'tst \t\C-wa\t\C-war\t\C-warg\t\C-warg1\t\C-wr\t\C-wx\t \ty \t'
+0:one non-option argument
+>line: {tst arg1 }{}
+>line: {tst arg1 }{}
+>line: {tst arg1 }{}
+>line: {tst arg1 }{}
+>line: {tst arg1 }{}
+>line: {tst r}{}
+>line: {tst x}{}
+>line: {tst x }{}
+>MESSAGE:{no more arguments}
+>line: {tst x y }{}
+>MESSAGE:{no more arguments}
+
+ tst_arguments ':desc1:(a b)'
+ comptest $'tst \t'
+0:a and b
+>line: {tst }{}
+>DESCRIPTION:{desc1}
+>NO:{a}
+>NO:{b}
+
+ tst_arguments ':desc1:(arg1)' ':desc2:(arg2)' ':desc3:(arg3)'
+ comptest $'tst \t\t\t\C-w\C-w\C-w\C-d'
+0:three arguments
+>line: {tst arg1 }{}
+>line: {tst arg1 arg2 }{}
+>line: {tst arg1 arg2 arg3 }{}
+>DESCRIPTION:{desc1}
+>NO:{arg1}
+
+ tst_arguments '1:desc1:(arg1)'
+ comptest $'tst \t\t'
+0:first argument
+>line: {tst arg1 }{}
+>line: {tst arg1 }{}
+>MESSAGE:{no more arguments}
+
+ tst_arguments '-\+[opt]'
+ comptest $'tst -\C-d'
+0:-+
+>DESCRIPTION:{option}
+>NO:{-+ -- opt}
+
+ tst_arguments -+o
+ comptest $'tst -\t\t\t\C-w\C-w+\t\t\t'
+0:option beginning with + and -.
+>line: {tst -o }{}
+>line: {tst -o +o }{}
+>line: {tst -o +o }{}
+>MESSAGE:{no arguments}
+>line: {tst +o }{}
+>line: {tst +o -o }{}
+>line: {tst +o -o }{}
+>MESSAGE:{no arguments}
+
+ tst_arguments '-o:1:(a):2:(b)'
+ comptest $'tst \t\t\t'
+0:two option arguments
+>line: {tst -o }{}
+>line: {tst -o a }{}
+>line: {tst -o a b }{}
+
+ tst_arguments '-x:arg:'
+ comptest $'tst -x\t'
+0:sticky option argument
+>line: {tst -x }{}
+
+ tst_arguments '-x[desc]'
+ comptest $'tst -x\t'
+0:end of option sequence
+>line: {tst -x }{}
+
+ tst_arguments '-x' ':arg:'
+ comptest $'tst -\t'
+0:argument beginning with minus
+>line: {tst -}{}
+>MESSAGE:{arg}
+>DESCRIPTION:{option}
+>NO:{-x}
+
+ tst_arguments '-o::optarg:(oa)' ':arg1:(a1)'
+ comptest $'tst -o\t\t'
+0:optional option argument
+>line: {tst -o }{}
+>line: {tst -o }{}
+>DESCRIPTION:{optarg}
+>NO:{oa}
+>DESCRIPTION:{arg1}
+>NO:{a1}
+
+ tst_arguments '-o:*a:a:(a)' ':A:(A)' ':B:(B)'
+ comptest $'tst A -o a \t'
+0:variable length option arguments
+>line: {tst A -o a B }{}
+
+ tst_arguments -s '-a' '-b' ':descr:{compadd - $+opt_args[-a]}'
+ comptest $'tst -ab \t'
+0:opt_args
+>line: {tst -ab 1 }{}
+
+ tst_arguments '-a' '*::rest:{compadd - -b}'
+ comptest $'tst arg -\t'
+0:rest arguments
+>line: {tst arg -b }{}
+
+ tst_arguments '-e:*last:::b:{compadd "${(j:,:)words}"}' ':arg1:(arg1)'
+ comptest $'tst -\t\tla\t\C-hst\t\t\eb\eb\C-b\t\t'
+0:words array in rest arguments
+>line: {tst -e }{}
+>line: {tst -e }{}
+>line: {tst -e la }{}
+>line: {tst -e last }{}
+>line: {tst -e last arg1 }{}
+>line: {tst -e ,last }{ last arg1}
+>line: {tst -e ,last ,last,,last }{ last arg1}
+
+ tst_arguments -s '-d+:msg1:' '*::msg2:{compadd $CURRENT}'
+ comptest $'tst add \t\t\t'
+0:opt_args
+>line: {tst add 2 }{}
+>line: {tst add 2 3 }{}
+>line: {tst add 2 3 4 }{}
+
+ tst_arguments -s '-a' '-b' '-c' ':words:compadd - abyyy abzzz'
+ comptest $'tst ab\t'
+0:options and words (zsh-workers:12257)
+>line: {tst ab}{}
+>DESCRIPTION:{words}
+>NO:{abyyy}
+>NO:{abzzz}
+
+%clean
+
+ zmodload -ui zsh/zpty