From 8c4e1b683264035859b176c059c9357d936ccb4c Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Fri, 9 Dec 2016 00:00:30 +0100 Subject: 40129: revert 39611, add code comments and test cases for _arguments --- Test/Y03arguments.ztst | 251 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 237 insertions(+), 14 deletions(-) (limited to 'Test/Y03arguments.ztst') diff --git a/Test/Y03arguments.ztst b/Test/Y03arguments.ztst index d59ed5424..b5a5a4be9 100644 --- a/Test/Y03arguments.ztst +++ b/Test/Y03arguments.ztst @@ -40,6 +40,15 @@ >NO:{a} >NO:{b} +# it ought to be possible to include the quoted backslash here + 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 -- othervalue} + tst_arguments ':desc1:(arg1)' ':desc2:(arg2)' ':desc3:(arg3)' comptest $'tst \t\t\t\C-w\C-w\C-w\C-d' 0:three arguments @@ -81,6 +90,74 @@ >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 @@ -99,6 +176,11 @@ >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 @@ -110,9 +192,10 @@ >NO:{a1} tst_arguments '-o:*a:a:(a)' ':A:(A)' ':B:(B)' - comptest $'tst A -o a \t' + 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' @@ -129,6 +212,40 @@ 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 @@ -140,14 +257,14 @@ >line: {tst -e ,last }{ last arg1} >line: {tst -e ,last ,last,,last }{ last arg1} - tst_arguments -s '-d+:msg1:' '*::msg2:{compadd $CURRENT}' + 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' + tst_arguments -s '-a' '-b' '-c' ':words:compadd - abyyy abzzz' comptest $'tst ab\t' 0:options and words (zsh-workers:12257) >line: {tst ab}{} @@ -155,6 +272,12 @@ >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 -x :word comptest $'tst -- -\t' 0:option after -- @@ -175,15 +298,15 @@ 0:option after a word >line: {tst word -x }{} - tst_arguments -A '-*' -x :word + tst_arguments -A'-*' -x :word comptest $'tst word -\t' -0:option after word that doesn't match -A pattern +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 +0:option before a word that doesn't match -A pattern, separate -A from pattern >line: {tst -}{ word} >DESCRIPTION:{word} >NO:{-word} @@ -195,12 +318,68 @@ 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 }{} + +# necessary to exclude the rest arguments for the other set because +# it is currently any unknown option rather than options from another +# set that causes a set to be excluded 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 }{} +>line: {tst -a -x m}{} +#>line: {tst -a -x more }{} + + tst_arguments - '(help)' -h -V - other -a '*:rest:(1 2 3)' + comptest $'tst -h \t' +0:unknown option disables whole set (without -A) +>line: {tst -h }{} +>MESSAGE:{no arguments} + + tst_arguments -A "-*" - '(help)' -h -V - other -a '*:rest:(1 2 3)' + comptest $'tst -h \t' +0:unknown option disables whole set (with -A) +>line: {tst -h }{} +>MESSAGE:{no arguments} - tst_arguments '(-v)-a' '(set1--m -a)-b' - '(set1)' -m -n - set2 -v -w + 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 -}{} @@ -214,19 +393,36 @@ >NO:{-n} >NO:{-v} >NO:{-w} ->line: {tst -m -}{} +>line: {tst -m -b }{} +>line: {tst -v -}{} >DESCRIPTION:{option} >NO:{-a} >NO:{-b} >NO:{-v} ->NO:{-w} ->line: {tst -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 }{} + +# the following two tests only verify the current questionable behaviour + 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:{-a} ->NO:{-b} >NO:{-m} >NO:{-n} ->NO:{-w} + + tst_arguments - set2 -a -t -u - set1 '(set2)-a' -m -n + 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 '(-)-h' -a -b -c comptest $'tst -h -\t' @@ -243,6 +439,33 @@ >NO:{-a} >NO:{-b} +# ideally, would handle exclusion within the current word + tst_arguments -s : '(-d)-a' -b -c -d + comptest $'tst -ab\t -\t\eb\eb \C-b-\t' +0:exclusion with clumped options, in, after and before +>line: {tst -ab}{} +>DESCRIPTION:{option} +>NO:{-c} +>NO:{-d} +>line: {tst -ab -c }{} +>line: {tst -}{ -ab -c} +>DESCRIPTION:{option} +>NO:{-a} +>NO:{-b} +>NO:{-c} +>NO:{-d} + + 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} +# seems we don't handle this case, ideal result would be as follows +#>line: {tst -a -c -}{} +#>DESCRIPTION:{option} +#>NO:{-b} +#>NO:{-c} + tst_arguments --abc --aah :arg: comptesteval 'setopt bashautolist automenu' comptest $'tst --a\t\t\t' -- cgit 1.4.1