1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-12-29 16:25:35 +01:00
zsh/Test/Y03arguments.ztst
Oliver Kiddle c2b7c5abbe 40269: handle option exclusion within current word for clumped options
This replaces the change made in 13999 with an alternative approach.
2017-01-05 13:31:13 +01:00

608 lines
15 KiB
Text

# Tests for _arguments.
%prep
if [[ $OSTYPE = cygwin ]]; then
ZTST_unimplemented="the zsh/zpty module does not work on Cygwin"
elif ( zmodload zsh/zpty 2>/dev/null ); then
. $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)*}} }" }
}
else
ZTST_unimplemented="the zsh/zpty module is not available"
fi
%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 ':desc2:((a\:a\ value b\:other\\\\value))'
comptest $'tst \t'
0:a and b with descriptions
>line: {tst }{}
>DESCRIPTION:{desc2}
>NO:{a -- a value}
>NO:{b -- other\value}
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 -a '2:desc2:(arg2)'
comptest $'tst a1\t \t'
0:second argument but no first argument
>line: {tst a1}{}
>MESSAGE:{no more arguments}
>line: {tst a1 arg2 }{}
tst_arguments '2:desc2:(arg2)' '*:rest:(rest)'
comptest $'tst \t\t\t'
0:second and rest arguments but no first argument
>line: {tst rest }{}
>line: {tst rest arg2 }{}
>line: {tst rest arg2 rest }{}
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
comptest $'tst \t'
0:option beginning with + and -, specified the other way around
>line: {tst }{}
>DESCRIPTION:{option}
>NO:{+o}
>NO:{-o}
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:(ok)'
comptest $'tst -x \t'
0:option argument to ignored option
>line: {tst -x ok }{}
tst_arguments '!-a' -b
comptest $'tst -\t'
0:ignored option not completed
>line: {tst -b }{}
tst_arguments +x +y '!+z' ':arg:(x)'
comptest $'tst +z \t'
0:ignored option is not taken to be the normal argument
>line: {tst +z x }{}
tst_arguments --known --other
comptest $'tst --unknown -\t'
0:unrecognised option has no effect on proceedings with no normal arguments
>line: {tst --unknown --}{}
tst_arguments +x +y ':arg:(x)'
comptest $'tst +z \t'
0:unrecognised option is taken to be the normal argument
>line: {tst +z +}{}
tst_arguments '*-a:value:(1)'
comptest $'tst -a\t\t -a=\t'
0:option argument follows in next argument
>line: {tst -a }{}
>line: {tst -a 1 }{}
>line: {tst -a 1 -a=}{}
>MESSAGE:{no arguments}
tst_arguments '*-a+:value:(1)'
comptest $'tst -a\t -a \t -a=\t'
0:option argument either direct or in following argument
>line: {tst -a1 }{}
>line: {tst -a1 -a 1 }{}
>line: {tst -a1 -a 1 -a=}{}
tst_arguments '*-a-:value:(1)'
comptest $'tst -a\t -a \t=\t'
0:option argument follows directly
>line: {tst -a1 }{}
>line: {tst -a1 -a -a}{}
>line: {tst -a1 -a -a=}{}
tst_arguments '*-a=:value:(1)'
comptest $'tst -a\t\t -a \t'
0:option argument follows optional equals
>line: {tst -a=}{}
>line: {tst -a=1 }{}
>line: {tst -a=1 -a 1 }{}
tst_arguments -s '*-a=:value:(1)'
comptest $'tst -a\t-a=\t -a \t'
0:option argument follows optional equals, with -s
>line: {tst -a1 }{}
>line: {tst -a1 -a=1 }{}
>line: {tst -a1 -a=1 -a 1 }{}
tst_arguments '*-a=-:value:(1)'
comptest $'tst -a\t\t-a \t'
0:option argument follows mandatory equals
>line: {tst -a=}{}
>line: {tst -a=1 }{}
>line: {tst -a=1 -a -a=}{}
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 -}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{-x}
tst_arguments '-x' ": :_guard '[0-9]#' number"
comptest $'tst -\t'
0:argument beginning with minus, guard on rest argument
>line: {tst -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\C-W\C-w-a -b -c a \t'
0:variable length option arguments
>line: {tst A -o a B }{}
>line: {tst A -o -a -b -c 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:one: :two' ':descr:{compadd -Q - $opt_args[-a]}'
comptest $'tst -a 1:x \\2 \t'
0:opt_args with multiple arguments and quoting of colons and backslashes
>line: {tst -a 1:x \2 1\:x:\\2 }{}
tst_arguments -a -b
comptest $'tst rest -\t\C-w\eb\C-b-\t'
0:option completion with rest arguments on the line but not in the specs
>line: {tst rest -}{}
>line: {tst -}{ rest }
>DESCRIPTION:{option}
>NO:{-a}
>NO:{-b}
tst_arguments '-a' '*::rest:{compadd - -b}'
comptest $'tst arg -\t'
0:rest arguments
>line: {tst arg -b }{}
tst_arguments -a :more '*:rest:{ compadd - $words }'
comptest $'tst x -a rest \t'
0:rest arguments with single colon
>line: {tst x -a rest }{}
>NO:{-a}
>NO:{rest}
>NO:{tst}
>NO:{x}
tst_arguments -a :more '*::rest:{ compadd - $words }'
comptest $'tst x -a rest \t\eb\eb\eb\et\C-E \t'
0:rest arguments with two colons
>line: {tst x -a rest rest }{}
>line: {tst -a x rest rest }{}
>NO:{rest}
>NO:{x}
tst_arguments -a -b :more '*:::rest:{ compadd - $words }'
comptest $'tst -b x -a -x rest \t'
0:rest arguments with three colons
>line: {tst -b x -a -x rest }{}
>NO:{-x}
>NO:{rest}
tst_arguments -a ::more '*:::rest:{ compadd - $words }'
comptest $'tst -a opt rest \t'
0:rest arguments with three colons following optional argument
>line: {tst -a opt rest rest }{}
tst_arguments -a::arg '*:::rest:{ compadd - $words }'
comptest $'tst -a opt rest \t'
0:rest arguments with three colons following optional argument to an option
>line: {tst -a opt rest rest }{}
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}
tst_arguments -M 'm:{j}={y}' -y -n ':yes/no:(y n)'
comptest $'tst j\t\eb-\C-e\t'
0:matcher applies to options but not rest arguments
>line: {tst j}{}
>line: {tst -y }{}
tst_arguments -M 'm:{j}={y}' -y -n - set1 -i - set2 -k
comptest $'tst -k -j\t'
0:matcher in combination with sets (implies separate cadef structure)
>line: {tst -k -y }{}
tst_arguments -x :word
comptest $'tst -- -\t'
0:option after --
>line: {tst -- -x }{}
tst_arguments -S -x ':word:()'
comptest $'tst -- -\t'
0:disallowed option after --
>line: {tst -- -}{}
tst_arguments -S -x ':word:()'
comptest $'tst - --\eB\C-b\t'
0:allowed option before --
>line: {tst -x }{ --}
tst_arguments -x :word
comptest $'tst word -\t'
0:option after a word
>line: {tst word -x }{}
tst_arguments -A'-*' -x :word
comptest $'tst word -\t'
0:option after word that doesn't match -A pattern, no space before pattern
>line: {tst word -}{}
>MESSAGE:{no more arguments}
tst_arguments -A '-*' -x ':word:(-word)'
comptest $'tst word\eB\C-b-\t'
0:option before a word that doesn't match -A pattern, separate -A from pattern
>line: {tst -}{ word}
>DESCRIPTION:{word}
>NO:{-word}
>DESCRIPTION:{option}
>NO:{-x}
tst_arguments -A '-*' -h -V -a '*: :(-x more)'
comptest $'tst -a -x m\t'
0:continue completion after rest argument that looks like an option
>line: {tst -a -x more }{}
tst_arguments '*-v'
comptest $'tst -v -\t'
0:repeatable options
>line: {tst -v -v }{}
tst_arguments -A '-*' - help -h -V - other -a '*: :(-x more)'
comptest $'tst -a -x m\t'
0:continue completion after rest argument that looks like an option (with sets)
>line: {tst -a -x more }{}
tst_arguments - '(help)' -h -V - other -a '*:rest:(1 2 3)'
comptest $'tst -h \t-a \t'
0:foreign option disables whole set (without -A)
>line: {tst -h }{}
>MESSAGE:{no arguments}
>line: {tst -h -a }{}
tst_arguments -A "-*" - '(help)' -h -V - other -a '*:rest:(1 2 3)'
comptest $'tst -h \t-a \t'
0:foreign option disables whole set (with -A)
>line: {tst -h }{}
>MESSAGE:{no arguments}
>line: {tst -h -a }{}
tst_arguments '(-C)-a' - set1 -C -v - set2 '(-a)-C' -w
comptest $'tst -a -\t' $'\C-w\C-w-C -\t'
0:exclude option common to two sets and from one common option
>line: {tst -a -}{}
>DESCRIPTION:{option}
>NO:{-v}
>NO:{-w}
>line: {tst -C -}{}
>DESCRIPTION:{option}
>NO:{-a}
>NO:{-v}
>NO:{-w}
# _arguments doesn't know what rest arguments might be so any non-option
# might apply: for the one set, it accepts "a"
tst_arguments -e - one -o '*:number:(1 2)' - two '(-e)*:letter:(a b)'
comptest $'tst \t' $'a -\t'
0:rest argument rule in two sets
>line: {tst }{}
>DESCRIPTION:{letter}
>NO:{a}
>NO:{b}
>DESCRIPTION:{number}
>NO:{1}
>NO:{2}
>line: {tst a -}{}
>DESCRIPTION:{option}
>NO:{-e}
>NO:{-o}
tst_arguments '(set1-: set2-* set3-1)-a' - set1 '1: :(1)' '2: :(2)' - set2 '*:rest:(rest)' - set3 '1:num:(num)' '*: :(allowable)' - set4 ': :(allowed)'
comptest $'tst -a \t'
0:exclude various forms of rest argument in set specific form
>line: {tst -a allow}{}
tst_arguments '(-v)-a' '(set1--m -a)-b' - '(set1)' '( -a )-m' '( )-n' - set2 '(-w)*-v' -w
comptest $'tst -a -\t' $'\C-w\C-w-'{b,m,v}$' -\t'
0:exclusion lists
>line: {tst -a -}{}
>DESCRIPTION:{option}
>NO:{-b}
>NO:{-m}
>NO:{-n}
>NO:{-w}
>line: {tst -b -}{}
>DESCRIPTION:{option}
>NO:{-n}
>NO:{-v}
>NO:{-w}
>line: {tst -m -b }{}
>line: {tst -v -}{}
>DESCRIPTION:{option}
>NO:{-a}
>NO:{-b}
>NO:{-v}
tst_arguments -a - set1 -d - set2 '(set2)-m' -n -o ':arg:(x)' - set2 -x
comptest $'tst -m \t'
0:exclude own set from an option
>line: {tst -m -a }{}
tst_arguments - set1 '(set2)-a' -m -n - set2 -a -t -u
comptest $'tst -a -\t'
0:exclude later set from an option common to both
>line: {tst -a -}{}
>DESCRIPTION:{option}
>NO:{-m}
>NO:{-n}
>NO:{-t}
>NO:{-u}
tst_arguments - set2 -a -t -u - set1 '(set2)-a' -m -n
comptest $'tst -a -\t'
0:exclude earlier set from an option common to both
>line: {tst -a -}{}
>DESCRIPTION:{option}
>NO:{-m}
>NO:{-n}
>NO:{-t}
>NO:{-u}
tst_arguments -x - '(set1)' -a -b - '(set2)' -m -n
comptest $'tst -m -\t'
0:single option sets are still mutually exclusive
>line: {tst -m -x }{}
tst_arguments '(-)-h' -a -b -c
comptest $'tst -h -\t'
0:exclude all other options
>line: {tst -h -}{}
>MESSAGE:{no arguments}
tst_arguments -a '(-a)-b'
comptest $'tst - -b\C-b\C-b\C-b\t'
0:exclusion only applies to later words
>line: {tst -}{ -b}
>DESCRIPTION:{option}
>NO:{-a}
>NO:{-b}
F:shouldn't offer -b as it is already on the command-line
tst_arguments -s : '(-d)-a' -b -c -d
comptest $'tst -ab\t\C-h -\t\eb\eb \C-b-\t'
0:exclusion with clumped options, in, after and before
>line: {tst -abc}{}
>line: {tst -ab -c }{}
>line: {tst -}{ -ab -c}
>DESCRIPTION:{option}
>NO:{-a}
>NO:{-b}
>NO:{-c}
>NO:{-d}
tst_arguments -s '(-conf)-c' '-conf' '-f' '(-)--long' --longer
comptest $'tst -c\t\C-h-long\t'
0:don't prematurely exclude option that current word is a prefix of
>line: {tst -c}{}
>DESCRIPTION:{option}
>NO:{-conf}
>NO:{-f}
>line: {tst --long}{}
>DESCRIPTION:{option}
>NO:{--long}
>NO:{--longer}
tst_arguments -s '(set)-c' - set '-conf' '-f'
comptest $'tst -c\t'
0:don't prematurely exclude option that current word is a prefix of (with sets)
>line: {tst -conf }{}
tst_arguments -s : -ad '(-d)-a' -b -ca -d
comptest $'tst -ad\t-b\t'
0:option clumping mixed with real option that looks like clump
>line: {tst -ad }{}
>line: {tst -ad -b}{}
>DESCRIPTION:{option}
>NO:{-a}
>NO:{-d}
tst_arguments -s : '(-d)-a+:arg:(b)' '(-c)-b' -c -d
comptest $'tst -ab\t-\t'
0:option clumping mixed with direct argument
>line: {tst -ab }{}
>line: {tst -ab -}{}
>DESCRIPTION:{option}
>NO:{-b}
>NO:{-c}
tst_arguments '-a:arg' -b '(-b)-c'
comptest $'tst -a -c -\t'
0:exclusion with option argument that looks like an option
>line: {tst -a -c -}{}
>MESSAGE:{no arguments}
F:The current behaviour is wrong; the correct expected output is:
F:>line: {tst -a -c -}{}
F:>DESCRIPTION:{option}
F:>NO:{-b}
F:>NO:{-c}
tst_arguments --abc --aah :arg:
comptesteval 'setopt bashautolist automenu'
comptest $'tst --a\t\t\t'
0:with message and bashautolist, a third tab will get menu completion
>line: {tst --a}{}
>line: {tst --a}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{--aah}
>NO:{--abc}
>line: {tst --aah}{}
tst_arguments --abc --aah :arg:
comptesteval 'setopt bashautolist noautomenu'
comptest $'tst --a\t\t\t'
0:with message and bashautolist, a third tab is needed to display the list
>line: {tst --a}{}
>line: {tst --a}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{--aah}
>NO:{--abc}
>line: {tst --a}{}
tst_arguments --abc --aah :arg:
comptesteval 'setopt nobashautolist noautomenu'
comptest $'tst --\t\t'
0:with message and noautomenu second tab redisplays the list
>line: {tst --}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{--aah}
>NO:{--abc}
>line: {tst --}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{--aah}
>NO:{--abc}
tst_arguments --abc --aah :arg:
comptesteval 'setopt nobashautolist automenu'
comptest $'tst --\t\t'
0:with message two tabs will start menu completion
>line: {tst --}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{--aah}
>NO:{--abc}
>line: {tst --aah}{}
tst_arguments --abc --aah :arg:
comptesteval 'zstyle ":completion:*::::" completer _oldlist _complete'
comptest $'tst --\t\t'
0:with message and _oldlist, two tabs will start menu completion
>line: {tst --}{}
>DESCRIPTION:{arg}
>DESCRIPTION:{option}
>NO:{--aah}
>NO:{--abc}
>line: {tst --aah}{}
tst_arguments '--prefix=: :(one two)' '--prop=: :(three four)' --pre
comptest $'tst --pre=o\t --=\t'
0:partial completion of option with an argument
>line: {tst --prefix=one }{}
>line: {tst --prefix=one --prop=}{}
%clean
zmodload -ui zsh/zpty