1# Tests for globbing
2
3%prep
4  mkdir glob.tmp
5  mkdir glob.tmp/dir{1,2,3,4}
6  mkdir glob.tmp/dir3/subdir
7  : >glob.tmp/{,{dir1,dir2}/}{a,b,c}
8
9  globtest () {
10    $ZTST_testdir/../Src/zsh -f $ZTST_srcdir/../Misc/$1
11  }
12
13  regress_absolute_path_and_core_dump() {
14    local absolute_dir=$(cd glob.tmp && pwd -P)
15    [[ -n $absolute_dir ]] || return 1
16    setopt localoptions extendedglob nullglob
17    print $absolute_dir/**/*~/*
18    setopt nonullglob nomatch
19    print glob.tmp/**/*~(.)#
20  }
21
22%test
23
24  globtest globtests
250:zsh globbing
26>0:  [[ foo~ = foo~ ]]
27>0:  [[ foo~ = (foo~) ]]
28>0:  [[ foo~ = (foo~|) ]]
29>0:  [[ foo.c = *.c~boo* ]]
30>1:  [[ foo.c = *.c~boo*~foo* ]]
31>0:  [[ fofo = (fo#)# ]]
32>0:  [[ ffo = (fo#)# ]]
33>0:  [[ foooofo = (fo#)# ]]
34>0:  [[ foooofof = (fo#)# ]]
35>0:  [[ fooofoofofooo = (fo#)# ]]
36>1:  [[ foooofof = (fo##)# ]]
37>1:  [[ xfoooofof = (fo#)# ]]
38>1:  [[ foooofofx = (fo#)# ]]
39>0:  [[ ofxoofxo = ((ofo#x)#o)# ]]
40>1:  [[ ofooofoofofooo = (fo#)# ]]
41>0:  [[ foooxfooxfoxfooox = (fo#x)# ]]
42>1:  [[ foooxfooxofoxfooox = (fo#x)# ]]
43>0:  [[ foooxfooxfxfooox = (fo#x)# ]]
44>0:  [[ ofxoofxo = ((ofo#x)#o)# ]]
45>0:  [[ ofoooxoofxo = ((ofo#x)#o)# ]]
46>0:  [[ ofoooxoofxoofoooxoofxo = ((ofo#x)#o)# ]]
47>0:  [[ ofoooxoofxoofoooxoofxoo = ((ofo#x)#o)# ]]
48>1:  [[ ofoooxoofxoofoooxoofxofo = ((ofo#x)#o)# ]]
49>0:  [[ ofoooxoofxoofoooxoofxooofxofxo = ((ofo#x)#o)# ]]
50>0:  [[ aac = ((a))#a(c) ]]
51>0:  [[ ac = ((a))#a(c) ]]
52>1:  [[ c = ((a))#a(c) ]]
53>0:  [[ aaac = ((a))#a(c) ]]
54>1:  [[ baaac = ((a))#a(c) ]]
55>0:  [[ abcd = ?(a|b)c#d ]]
56>0:  [[ abcd = (ab|ab#)c#d ]]
57>0:  [[ acd = (ab|ab#)c#d ]]
58>0:  [[ abbcd = (ab|ab#)c#d ]]
59>0:  [[ effgz = (bc##d|ef#g?|(h|)i(j|k)) ]]
60>0:  [[ efgz = (bc##d|ef#g?|(h|)i(j|k)) ]]
61>0:  [[ egz = (bc##d|ef#g?|(h|)i(j|k)) ]]
62>0:  [[ egzefffgzbcdij = (bc##d|ef#g?|(h|)i(j|k))# ]]
63>1:  [[ egz = (bc##d|ef##g?|(h|)i(j|k)) ]]
64>0:  [[ ofoofo = (ofo##)# ]]
65>0:  [[ oxfoxoxfox = (oxf(ox)##)# ]]
66>1:  [[ oxfoxfox = (oxf(ox)##)# ]]
67>0:  [[ ofoofo = (ofo##|f)# ]]
68>0:  [[ foofoofo = (foo|f|fo)(f|ofo##)# ]]
69>0:  [[ oofooofo = (of|oofo##)# ]]
70>0:  [[ fffooofoooooffoofffooofff = (f#o#)# ]]
71>1:  [[ fffooofoooooffoofffooofffx = (f#o#)# ]]
72>0:  [[ fofoofoofofoo = (fo|foo)# ]]
73>0:  [[ foo = ((^x)) ]]
74>0:  [[ foo = ((^x)*) ]]
75>1:  [[ foo = ((^foo)) ]]
76>0:  [[ foo = ((^foo)*) ]]
77>0:  [[ foobar = ((^foo)) ]]
78>0:  [[ foobar = ((^foo)*) ]]
79>1:  [[ foot = z*~*x ]]
80>0:  [[ zoot = z*~*x ]]
81>1:  [[ foox = z*~*x ]]
82>1:  [[ zoox = z*~*x ]]
83>0:  [[ moo.cow = (*~*.*).(*~*.*) ]]
84>1:  [[ mad.moo.cow = (*~*.*).(*~*.*) ]]
85>0:  [[ moo.cow = (^*.*).(^*.*) ]]
86>1:  [[ sane.moo.cow = (^*.*).(^*.*) ]]
87>1:  [[ mucca.pazza = mu(^c#)?.pa(^z#)? ]]
88>1:  [[ _foo~ = _(|*[^~]) ]]
89>0:  [[ fff = ((^f)) ]]
90>0:  [[ fff = ((^f)#) ]]
91>0:  [[ fff = ((^f)##) ]]
92>0:  [[ ooo = ((^f)) ]]
93>0:  [[ ooo = ((^f)#) ]]
94>0:  [[ ooo = ((^f)##) ]]
95>0:  [[ foo = ((^f)) ]]
96>0:  [[ foo = ((^f)#) ]]
97>0:  [[ foo = ((^f)##) ]]
98>1:  [[ f = ((^f)) ]]
99>1:  [[ f = ((^f)#) ]]
100>1:  [[ f = ((^f)##) ]]
101>0:  [[ foot = (^z*|*x) ]]
102>1:  [[ zoot = (^z*|*x) ]]
103>0:  [[ foox = (^z*|*x) ]]
104>0:  [[ zoox = (^z*|*x) ]]
105>0:  [[ foo = (^foo)# ]]
106>1:  [[ foob = (^foo)b* ]]
107>0:  [[ foobb = (^foo)b* ]]
108>1:  [[ foob = (*~foo)b* ]]
109>0:  [[ foobb = (*~foo)b* ]]
110>1:  [[ zsh = ^z* ]]
111>0:  [[ a%1X = [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]] ]]
112>1:  [[ a%1 = [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]] ]]
113>0:  [[ [: = [[:]# ]]
114>0:  [[ :] = []:]# ]]
115>0:  [[ :] = [:]]# ]]
116>0:  [[ [ = [[] ]]
117>0:  [[ ] = []] ]]
118>0:  [[ [] = [^]]] ]]
119>0:  [[ fooxx = (#i)FOOXX ]]
120>1:  [[ fooxx = (#l)FOOXX ]]
121>0:  [[ FOOXX = (#l)fooxx ]]
122>1:  [[ fooxx = (#i)FOO(#I)X(#i)X ]]
123>0:  [[ fooXx = (#i)FOO(#I)X(#i)X ]]
124>0:  [[ fooxx = ((#i)FOOX)x ]]
125>1:  [[ fooxx = ((#i)FOOX)X ]]
126>1:  [[ BAR = (bar|(#i)foo) ]]
127>0:  [[ FOO = (bar|(#i)foo) ]]
128>0:  [[ Modules = (#i)*m* ]]
129>0:  [[ fooGRUD = (#i)(bar|(#I)foo|(#i)rod)grud ]]
130>1:  [[ FOOGRUD = (#i)(bar|(#I)foo|(#i)rod)grud ]]
131>0:  [[ readme = (#i)readme~README|readme ]]
132>0:  [[ readme = (#i)readme~README|readme~README ]]
133>0:  [[ 633 = <1-1000>33 ]]
134>0:  [[ 633 = <-1000>33 ]]
135>0:  [[ 633 = <1->33 ]]
136>0:  [[ 633 = <->33 ]]
137>0:  [[ 12345678901234567890123456789012345678901234567890123456789012345678901234567890foo = <42->foo ]]
138>0:  [[ READ.ME = (#ia1)readme ]]
139>1:  [[ READ..ME = (#ia1)readme ]]
140>0:  [[ README = (#ia1)readm ]]
141>0:  [[ READM = (#ia1)readme ]]
142>0:  [[ README = (#ia1)eadme ]]
143>0:  [[ EADME = (#ia1)readme ]]
144>0:  [[ READEM = (#ia1)readme ]]
145>1:  [[ ADME = (#ia1)readme ]]
146>1:  [[ README = (#ia1)read ]]
147>0:  [[ bob = (#a1)[b][b] ]]
148>1:  [[ bob = (#a1)[b][b]a ]]
149>0:  [[ bob = (#a1)[b]o[b]a ]]
150>1:  [[ bob = (#a1)[c]o[b] ]]
151>0:  [[ abcd = (#a2)XbcX ]]
152>0:  [[ abcd = (#a2)ad ]]
153>0:  [[ ad = (#a2)abcd ]]
154>0:  [[ abcd = (#a2)bd ]]
155>0:  [[ bd = (#a2)abcd ]]
156>0:  [[ badc = (#a2)abcd ]]
157>0:  [[ adbc = (#a2)abcd ]]
158>1:  [[ dcba = (#a2)abcd ]]
159>0:  [[ dcba = (#a3)abcd ]]
160>0:  [[ aabaXaaabY = (#a1)(a#b)#Y ]]
161>0:  [[ aabaXaaabY = (#a1)(a#b)(a#b)Y ]]
162>0:  [[ aaXaaaaabY = (#a1)(a#b)(a#b)Y ]]
163>0:  [[ aaaXaaabY = (#a1)(a##b)##Y ]]
164>0:  [[ aaaXbaabY = (#a1)(a##b)##Y ]]
165>1:  [[ read.me = (#ia1)README~READ.ME ]]
166>0:  [[ read.me = (#ia1)README~READ_ME ]]
167>1:  [[ read.me = (#ia1)README~(#a1)READ_ME ]]
168>0:  [[ test = *((#s)|/)test((#e)|/)* ]]
169>0:  [[ test/path = *((#s)|/)test((#e)|/)* ]]
170>0:  [[ path/test = *((#s)|/)test((#e)|/)* ]]
171>0:  [[ path/test/ohyes = *((#s)|/)test((#e)|/)* ]]
172>1:  [[ atest = *((#s)|/)test((#e)|/)* ]]
173>1:  [[ testy = *((#s)|/)test((#e)|/)* ]]
174>1:  [[ testy/path = *((#s)|/)test((#e)|/)* ]]
175>1:  [[ path/atest = *((#s)|/)test((#e)|/)* ]]
176>1:  [[ atest/path = *((#s)|/)test((#e)|/)* ]]
177>1:  [[ path/testy = *((#s)|/)test((#e)|/)* ]]
178>1:  [[ path/testy/ohyes = *((#s)|/)test((#e)|/)* ]]
179>1:  [[ path/atest/ohyes = *((#s)|/)test((#e)|/)* ]]
180>0:  [[ XabcdabcY = X(ab|c|d)(#c5)Y ]]
181>0:  [[ XabcdabcY = X(ab|c|d)(#c1,5)Y ]]
182>0:  [[ XabcdabcY = X(ab|c|d)(#c5,8)Y ]]
183>0:  [[ XabcdabcY = X(ab|c|d)(#c4,)Y ]]
184>1:  [[ XabcdabcY = X(ab|c|d)(#c6,)Y ]]
185>1:  [[ XabcdabcY = X(ab|c|d)(#c1,4)Y ]]
186>0:  [[ ZX = Z(|)(#c1)X ]]
187>0:  [[ froofroo = (fro(#c2))(#c2) ]]
188>1:  [[ froofroofroo = (fro(#c2))(#c2) ]]
189>1:  [[ froofro = (fro(#c2))(#c2) ]]
190>0:  [[ ax = ?(#c1,2)x ]]
191>0:  [[ ax = ?(#c1,)x ]]
192>0:  [[ ax = ?(#c0,1)x ]]
193>1:  [[ ax = ?(#c0,0)x ]]
194>1:  [[ ax = ?(#c2,)x ]]
195>0:  [[ aa = a(#c1,2)a ]]
196>0:  [[ aa = a(#c1,)a ]]
197>0:  [[ aa = a(#c0,1)a ]]
198>1:  [[ aa = a(#c0,0)a ]]
199>1:  [[ aa = a(#c2,)a ]]
200>0:  [[ test.zsh = *.?(#c1)sh ]]
201>0:  [[ test.bash = *.?(#c2)sh ]]
202>0:  [[ test.bash = *.?(#c1,2)sh ]]
203>0:  [[ test.bash = *.?(#c1,)sh ]]
204>0:  [[ test.zsh = *.?(#c1,)sh ]]
205>0 tests failed.
206
207  globtest globtests.ksh
2080:ksh compatibility
209>0:  [[ fofo = *(f*(o)) ]]
210>0:  [[ ffo = *(f*(o)) ]]
211>0:  [[ foooofo = *(f*(o)) ]]
212>0:  [[ foooofof = *(f*(o)) ]]
213>0:  [[ fooofoofofooo = *(f*(o)) ]]
214>1:  [[ foooofof = *(f+(o)) ]]
215>1:  [[ xfoooofof = *(f*(o)) ]]
216>1:  [[ foooofofx = *(f*(o)) ]]
217>0:  [[ ofxoofxo = *(*(of*(o)x)o) ]]
218>1:  [[ ofooofoofofooo = *(f*(o)) ]]
219>0:  [[ foooxfooxfoxfooox = *(f*(o)x) ]]
220>1:  [[ foooxfooxofoxfooox = *(f*(o)x) ]]
221>0:  [[ foooxfooxfxfooox = *(f*(o)x) ]]
222>0:  [[ ofxoofxo = *(*(of*(o)x)o) ]]
223>0:  [[ ofoooxoofxo = *(*(of*(o)x)o) ]]
224>0:  [[ ofoooxoofxoofoooxoofxo = *(*(of*(o)x)o) ]]
225>0:  [[ ofoooxoofxoofoooxoofxoo = *(*(of*(o)x)o) ]]
226>1:  [[ ofoooxoofxoofoooxoofxofo = *(*(of*(o)x)o) ]]
227>0:  [[ ofoooxoofxoofoooxoofxooofxofxo = *(*(of*(o)x)o) ]]
228>0:  [[ aac = *(@(a))a@(c) ]]
229>0:  [[ ac = *(@(a))a@(c) ]]
230>1:  [[ c = *(@(a))a@(c) ]]
231>0:  [[ aaac = *(@(a))a@(c) ]]
232>1:  [[ baaac = *(@(a))a@(c) ]]
233>0:  [[ abcd = ?@(a|b)*@(c)d ]]
234>0:  [[ abcd = @(ab|a*@(b))*(c)d ]]
235>0:  [[ acd = @(ab|a*(b))*(c)d ]]
236>0:  [[ abbcd = @(ab|a*(b))*(c)d ]]
237>0:  [[ effgz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
238>0:  [[ efgz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
239>0:  [[ egz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
240>0:  [[ egzefffgzbcdij = *(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
241>1:  [[ egz = @(b+(c)d|e+(f)g?|?(h)i@(j|k)) ]]
242>0:  [[ ofoofo = *(of+(o)) ]]
243>0:  [[ oxfoxoxfox = *(oxf+(ox)) ]]
244>1:  [[ oxfoxfox = *(oxf+(ox)) ]]
245>0:  [[ ofoofo = *(of+(o)|f) ]]
246>0:  [[ foofoofo = @(foo|f|fo)*(f|of+(o)) ]]
247>0:  [[ oofooofo = *(of|oof+(o)) ]]
248>0:  [[ fffooofoooooffoofffooofff = *(*(f)*(o)) ]]
249>1:  [[ fffooofoooooffoofffooofffx = *(*(f)*(o)) ]]
250>0:  [[ fofoofoofofoo = *(fo|foo) ]]
251>0:  [[ foo = !(x) ]]
252>0:  [[ foo = !(x)* ]]
253>1:  [[ foo = !(foo) ]]
254>0:  [[ foo = !(foo)* ]]
255>0:  [[ foobar = !(foo) ]]
256>0:  [[ foobar = !(foo)* ]]
257>0:  [[ moo.cow = !(*.*).!(*.*) ]]
258>1:  [[ mad.moo.cow = !(*.*).!(*.*) ]]
259>1:  [[ mucca.pazza = mu!(*(c))?.pa!(*(z))? ]]
260>1:  [[ _foo~ = _?(*[^~]) ]]
261>0:  [[ fff = !(f) ]]
262>0:  [[ fff = *(!(f)) ]]
263>0:  [[ fff = +(!(f)) ]]
264>0:  [[ ooo = !(f) ]]
265>0:  [[ ooo = *(!(f)) ]]
266>0:  [[ ooo = +(!(f)) ]]
267>0:  [[ foo = !(f) ]]
268>0:  [[ foo = *(!(f)) ]]
269>0:  [[ foo = +(!(f)) ]]
270>1:  [[ f = !(f) ]]
271>1:  [[ f = *(!(f)) ]]
272>1:  [[ f = +(!(f)) ]]
273>0:  [[ foot = @(!(z*)|*x) ]]
274>1:  [[ zoot = @(!(z*)|*x) ]]
275>0:  [[ foox = @(!(z*)|*x) ]]
276>0:  [[ zoox = @(!(z*)|*x) ]]
277>0:  [[ foo = *(!(foo)) ]]
278>1:  [[ foob = !(foo)b* ]]
279>0:  [[ foobb = !(foo)b* ]]
280>0:  [[ fooxx = (#i)FOOXX ]]
281>1:  [[ fooxx = (#l)FOOXX ]]
282>0:  [[ FOOXX = (#l)fooxx ]]
283>1:  [[ fooxx = (#i)FOO@(#I)X@(#i)X ]]
284>0:  [[ fooXx = (#i)FOO@(#I)X@(#i)X ]]
285>0:  [[ fooxx = @((#i)FOOX)x ]]
286>1:  [[ fooxx = @((#i)FOOX)X ]]
287>1:  [[ BAR = @(bar|(#i)foo) ]]
288>0:  [[ FOO = @(bar|(#i)foo) ]]
289>0:  [[ Modules = (#i)*m* ]]
290>0 tests failed.
291
292 (unsetopt multibyte
293 [[ bj�rn = *[������]* ]])
2940:single byte match with top bit set
295
296  ( regress_absolute_path_and_core_dump )
2970:exclusions regression test
298>
299>glob.tmp/a glob.tmp/b glob.tmp/c glob.tmp/dir1 glob.tmp/dir1/a glob.tmp/dir1/b glob.tmp/dir1/c glob.tmp/dir2 glob.tmp/dir2/a glob.tmp/dir2/b glob.tmp/dir2/c glob.tmp/dir3 glob.tmp/dir3/subdir glob.tmp/dir4
300
301 print glob.tmp/*(/)
3020:Just directories
303>glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir3 glob.tmp/dir4
304
305 print glob.tmp/*(.)
3060:Just files
307>glob.tmp/a glob.tmp/b glob.tmp/c
308
309 print glob.tmp/*(.e^'reply=( glob.tmp/*/${REPLY:t} )'^:t)
3100:Globbing used recursively (inside e glob qualifier)
311>a a b b c c
312
313 print glob.tmp/*/*(e:'reply=( glob.tmp/**/*([1]) )'::t)
3140:Recursive globbing used recursively (inside e glob qualifier)
315>a a a a a a a
316
317 print glob.tmp/**/(:h) 
3180:Head modifier
319>. glob.tmp glob.tmp glob.tmp glob.tmp glob.tmp/dir3
320
321 print glob.tmp(:r)
3220:Remove extension modifier
323>glob
324
325 print glob.tmp/*(:s/./_/)
3260:Substitute modifier
327>glob_tmp/a glob_tmp/b glob_tmp/c glob_tmp/dir1 glob_tmp/dir2 glob_tmp/dir3 glob_tmp/dir4
328
329 print glob.tmp/*(F)
3300:Just full dirs
331>glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir3
332
333 print glob.tmp/*(^F)
3340:Omit full dirs
335>glob.tmp/a glob.tmp/b glob.tmp/c glob.tmp/dir4
336
337 print glob.tmp/*(/^F)
3380:Just empty dirs
339>glob.tmp/dir4
340
341 setopt extendedglob
342 print glob.tmp/**/*~*/dir3(/*|(#e))(/)
3430:Exclusions with complicated path specifications
344>glob.tmp/dir1 glob.tmp/dir2 glob.tmp/dir4
345
346 print -l -- glob.tmp/*(P:-f:)
3470:Prepending words to each argument
348>-f
349>glob.tmp/a
350>-f
351>glob.tmp/b
352>-f
353>glob.tmp/c
354>-f
355>glob.tmp/dir1
356>-f
357>glob.tmp/dir2
358>-f
359>glob.tmp/dir3
360>-f
361>glob.tmp/dir4
362
363 print -l -- glob.tmp/*(P:one word:P:another word:)
3640:Prepending two words to each argument
365>one word
366>another word
367>glob.tmp/a
368>one word
369>another word
370>glob.tmp/b
371>one word
372>another word
373>glob.tmp/c
374>one word
375>another word
376>glob.tmp/dir1
377>one word
378>another word
379>glob.tmp/dir2
380>one word
381>another word
382>glob.tmp/dir3
383>one word
384>another word
385>glob.tmp/dir4
386
387 [[ "" = "" ]] && echo OK
3880:Empty strings
389>OK
390
391 foo="this string has a : colon in it"
392 print ${foo%% #:*}
3930:Must-match arguments in complex patterns
394>this string has a
395
396 mkdir glob.tmp/ra=1.0_et=3.5
397 touch glob.tmp/ra=1.0_et=3.5/foo
398 print glob.tmp/ra=1.0_et=3.5/???
3990:Bug with intermediate paths with plain strings but tokenized characters
400>glob.tmp/ra=1.0_et=3.5/foo
401
402 doesmatch() {
403   setopt localoptions extendedglob
404   print -n $1 $2\ 
405   if [[ $1 = $~2 ]]; then print yes; else print no; fi;
406 }
407 doesmatch MY_IDENTIFIER '[[:IDENT:]]##'
408 doesmatch YOUR:IDENTIFIER '[[:IDENT:]]##'
409 IFS=$'\n' doesmatch $'\n' '[[:IFS:]]'
410 IFS=' ' doesmatch $'\n' '[[:IFS:]]'
411 IFS=':' doesmatch : '[[:IFSSPACE:]]'
412 IFS=' ' doesmatch ' ' '[[:IFSSPACE:]]'
413 WORDCHARS="" doesmatch / '[[:WORD:]]'
414 WORDCHARS="/" doesmatch / '[[:WORD:]]'
4150:Named character sets handled internally
416>MY_IDENTIFIER [[:IDENT:]]## yes
417>YOUR:IDENTIFIER [[:IDENT:]]## no
418>
419> [[:IFS:]] yes
420>
421> [[:IFS:]] no
422>: [[:IFSSPACE:]] no
423>  [[:IFSSPACE:]] yes
424>/ [[:WORD:]] no
425>/ [[:WORD:]] yes
426
427 [[ foo = (#c0)foo ]]
4282:Misplaced (#c...) flag
429?(eval):1: bad pattern: (#c0)foo
430
431 mkdir glob.tmp/dir5
432 touch glob.tmp/dir5/N123
433 print glob.tmp/dir5/N<->(N)
4340:Numeric glob is not usurped by process substitution.
435>glob.tmp/dir5/N123
436
437 tpd() {
438   [[ $1 = $~2 ]]
439  print -r "$1, $2: $?"
440 }
441 test_pattern_disables() {
442   emulate -L zsh
443   tpd 'forthcoming' 'f*g'
444   disable -p '*'
445   tpd 'forthcoming' 'f*g'
446   tpd 'f*g' 'f*g'
447   tpd '[frog]' '[frog]'
448   tpd '[frog]' '\[[f]rog\]'
449   disable -p '['
450   tpd '[frog]' '[frog]'
451   tpd '[frog]' '\[[f]rog\]'
452   setopt extendedglob
453   tpd 'foo' '^bar'
454   disable -p '^'
455   tpd 'foo' '^bar'
456   tpd '^bar' '^bar'
457   tpd 'rumble' '(rumble|bluster)'
458   tpd '(thunder)' '(thunder)'
459   disable -p '('
460   tpd 'rumble' '(rumble|bluster)'
461   tpd '(thunder)' '(thunder)'
462   setopt kshglob
463   tpd 'scramble' '@(panic|frenzy|scramble)'
464   tpd '@(scrimf)' '@(scrimf)'
465   disable -p '@('
466   tpd 'scramble' '@(panic|frenzy|scramble)'
467   tpd '@(scrimf)' '@(scrimf)'
468   disable -p
469 }
470 test_pattern_disables
471 print Nothing should be disabled.
472 disable -p
4730:disable -p
474>forthcoming, f*g: 0
475>forthcoming, f*g: 1
476>f*g, f*g: 0
477>[frog], [frog]: 1
478>[frog], \[[f]rog\]: 0
479>[frog], [frog]: 0
480>[frog], \[[f]rog\]: 1
481>foo, ^bar: 0
482>foo, ^bar: 1
483>^bar, ^bar: 0
484>rumble, (rumble|bluster): 0
485>(thunder), (thunder): 1
486>rumble, (rumble|bluster): 1
487>(thunder), (thunder): 0
488>scramble, @(panic|frenzy|scramble): 0
489>@(scrimf), @(scrimf): 1
490>scramble, @(panic|frenzy|scramble): 1
491>@(scrimf), @(scrimf): 0
492>'(' '*' '[' '^' '@('
493>Nothing should be disabled.
494
495  (
496   setopt nomatch
497   x=( '' )
498   print $^x(N)
499  )
5000:No error with empty null glob with (N).
501>
502
503  (setopt kshglob
504   test_array=(
505     '+fours'    '+*'
506     '@titude'   '@*'
507     '!bang'     '!*'
508     # and check they work in the real kshglob cases too...
509     '+bus+bus'  '+(+bus|-car)'
510     '@sinhats'  '@(@sinhats|wrensinfens)'
511     '!kerror'   '!(!somethingelse)'
512     # and these don't match, to be sure
513     '+more'      '+(+less)'
514     '@all@all'   '@(@all)'
515     '!goesitall' '!(!goesitall)'
516   )
517   for str pat in $test_array; do
518     eval "[[ $str = $pat ]]" && print "$str matches $pat"
519   done
520   true
521  )
5220:kshglob option does not break +, @, ! without following open parenthesis
523>+fours matches +*
524>@titude matches @*
525>!bang matches !*
526>+bus+bus matches +(+bus|-car)
527>@sinhats matches @(@sinhats|wrensinfens)
528>!kerror matches !(!somethingelse)
529