improve of cmpl.
[bush.git] / tests / extglob.tests
blob76a605e6dcd703a3bc7d8586437dd37ced2da1f8
1 #   This program is free software: you can redistribute it and/or modify
2 #   it under the terms of the GNU General Public License as published by
3 #   the Free Software Foundation, either version 3 of the License, or
4 #   (at your option) any later version.
6 #   This program is distributed in the hope that it will be useful,
7 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
8 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9 #   GNU General Public License for more details.
11 #   You should have received a copy of the GNU General Public License
12 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
14 # test the ksh-like extended globbing features: [!@*?+](patlist)
16 shopt -s extglob
18 expect()
20         echo expect "$@"
23 case "/dev/udp/129.22.8.102/45" in
24 /dev/@(tcp|udp)/*/*)    echo ok 1;;
25 *)              echo bad 1;;
26 esac
28 # valid numbers
29 case 12 in
30 0|[1-9]*([0-9]))        echo ok 2;;
31 *)                      echo bad 2;;
32 esac
34 case 12abc in
35 0|[1-9]*([0-9]))        echo bad 3;;
36 *)                      echo ok 3;;
37 esac
39 case 1 in
40 0|[1-9]*([0-9]))        echo ok 4;;
41 *)                      echo bad 4;;
42 esac
44 # octal numbers
45 case 07 in
46 +([0-7]))               echo ok 5;;
47 *)                      echo bad 5;;
48 esac
50 case 0377 in
51 +([0-7]))               echo ok 6;;
52 *)                      echo bad 6;;
53 esac
55 case 09 in
56 +([0-7]))               echo bad 7;;
57 *)                      echo ok 7;;
58 esac
60 # stuff from korn's book
61 case paragraph in
62 para@(chute|graph))     echo ok 8;;
63 *)                      echo bad 8;;
64 esac
66 case paramour in
67 para@(chute|graph))     echo bad 9;;
68 *)                      echo ok 9;;
69 esac
71 case para991 in
72 para?([345]|99)1)       echo ok 10;;
73 *)                      echo bad 10;;
74 esac
76 case para381 in
77 para?([345]|99)1)       echo bad 11;;
78 *)                      echo ok 11;;
79 esac
81 case paragraph in
82 para*([0-9]))           echo bad 12;;
83 *)                      echo ok 12;;
84 esac
86 case para in
87 para*([0-9]))           echo ok 13;;
88 *)                      echo bad 13;;
89 esac
91 case para13829383746592 in
92 para*([0-9]))           echo ok 14;;
93 *)                      echo bad 14;;
94 esac
96 case paragraph in
97 para*([0-9]))           echo bad 15;;
98 *)                      echo ok 15;;
99 esac
101 case para in
102 para+([0-9]))           echo bad 16;;
103 *)                      echo ok 16;;
104 esac
106 case para987346523 in
107 para+([0-9]))           echo ok 17;;
108 *)                      echo bad 17;;
109 esac
111 case paragraph in
112 para!(*.[0-9]))         echo ok 18;;
113 *)                      echo bad 18;;
114 esac
116 case para.38 in
117 para!(*.[0-9]))         echo ok 19;;
118 *)                      echo bad 19;;
119 esac
121 case para.graph in
122 para!(*.[0-9]))         echo ok 20;;
123 *)                      echo bad 20;;
124 esac
126 case para39 in
127 para!(*.[0-9]))         echo ok 21;;
128 *)                      echo bad 21;;
129 esac
131 # tests derived from those in rosenblatt's korn shell book
133 case "" in
134 *(0|1|3|5|7|9))         echo ok 22;;
135 *)                      echo bad 22;
136 esac
138 case 137577991 in
139 *(0|1|3|5|7|9))         echo ok 23;;
140 *)                      echo bad 23;
141 esac
143 case 2468 in
144 *(0|1|3|5|7|9))         echo bad 24;;
145 *)                      echo ok 24;
146 esac
148 case file.c in
149 *.c?(c))                echo ok 25;;
150 *)                      echo bad 25;;
151 esac
153 case file.C in
154 *.c?(c))                echo bad 26;;
155 *)                      echo ok 26;;
156 esac
158 case file.cc in
159 *.c?(c))                echo ok 27;;
160 *)                      echo bad 27;;
161 esac
163 case file.ccc in
164 *.c?(c))                echo bad 28;;
165 *)                      echo ok 28;;
166 esac
168 case parse.y in
169 !(*.c|*.h|Makefile.in|config*|README))  echo ok 29;;
170 *)                      echo bad 29;;
171 esac
173 case shell.c in
174 !(*.c|*.h|Makefile.in|config*|README))  echo bad 30;;
175 *)                      echo ok 30;;
176 esac
178 case Makefile in
179 !(*.c|*.h|Makefile.in|config*|README))  echo ok 31;;
180 *)                      echo bad 31;;
181 esac
183 case "VMS.FILE;1" in
184 *\;[1-9]*([0-9]))       echo ok 32;;
185 *)                      echo bad 32;;
186 esac
188 case "VMS.FILE;0" in
189 *\;[1-9]*([0-9]))       echo bad 33;;
190 *)                      echo ok 33;;
191 esac
192 case "VMS.FILE;" in
193 *\;[1-9]*([0-9]))       echo bad 34;;
194 *)                      echo ok 34;;
195 esac
196 case "VMS.FILE;139" in
197 *\;[1-9]*([0-9]))       echo ok 35;;
198 *)                      echo bad 35;;
199 esac
200 case "VMS.FILE;1N" in
201 *\;[1-9]*([0-9]))       echo bad 36;;
202 *)                      echo ok 36;;
203 esac
205 # tests derived from the pd-ksh test suite
207 MYDIR=$PWD      # save where we are
209 : ${TMPDIR:=/var/tmp}
210 TESTDIR=$TMPDIR/eglob-test-$$
211 mkdir $TESTDIR
212 builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; }
213 rm -rf *
215 touch abcx abcz bbc
216 expect '!([*)*'
217 echo !([*)*
219 expect '+(a|b[)*'
220 echo +(a|b[)*
222 expect '[a*(]*z'
223 echo [a*(]*)z
225 rm -f abcx abcz bbc
227 touch abc
229 expect '+()c'
230 echo +()c
231 expect '+()x'
232 echo +()x
233 expect abc
234 echo +(*)c
235 expect '+(*)x'
236 echo +(*)x
238 # extended globbing should not be performed on the output of substitutions
239 x='@(*)'
240 expect '@(*)'
241 echo $x
243 expect 'no-file+(a|b)stuff'
244 echo no-file+(a|b)stuff
245 expect 'no-file+(a*(c)|b)stuff'
246 echo no-file+(a*(c)|b)stuff
248 touch abd acd
250 expect 'abd acd'
251 echo a+(b|c)d
253 expect 'acd'
254 echo a!(@(b|B))d
256 expect 'abd'
257 echo a[b*(foo|bar)]d
259 # simple kleene star tests
260 expect no
261 case foo in *(a|b[)) echo yes;; *) echo no;; esac
263 expect yes
264 case foo in *(a|b[)|f*) echo yes;; *) echo no;; esac
266 # this doesn't work right yet; it is an incorrectly formed pattern
267 expect yes
268 case '*(a|b[)' in *(a|b[)) echo yes;; *) echo no;; esac
270 # check extended globbing in pattern removal -- these don't work right yet
271 x=abcdef
273 expect '1: bcdef'
274 echo 1: ${x#+(a|abc)}
275 expect '2: def'
276 echo 2: ${x##+(a|abc)}
277 expect '3: abcde'
278 echo 3: ${x%+(def|f)}
279 expect '4: abc'
280 echo 4: ${x%%+(f|def)}
282 # these work ok
284 expect '5: ef'
285 echo 5: ${x#*(a|b)cd}
286 expect '6: ef'
287 echo 6: "${x#*(a|b)cd}"
288 expect '7: abcdef'
289 echo 7: ${x#"*(a|b)cd"}
291 # More tests derived from a bug report concerning extended glob patterns
292 # following a *
293 builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; }
294 rm -rf *
296 touch ab abcdef abef abcfef
298 expect 'ab abef'
299 echo ab*(e|f)
301 expect 'abcfef abef'
302 echo ab?*(e|f)
304 expect abcdef
305 echo ab*d+(e|f)
307 expect 'ab abcdef abcfef abef'
308 echo ab**(e|f)
310 expect 'abcdef abcfef abef'
311 echo ab*+(e|f)
313 case 'abcfefg' in
314 ab**(e|f))      echo ok 37;;
315 *)              echo bad 37;;
316 esac
318 case 'abcfefg' in
319 ab**(e|f)g)     echo ok 38;;
320 *a)             echo bad 38;;
321 esac
323 case ab in
324 ab*+(e|f))      echo bad 39;;
325 *)              echo ok 39;;
326 esac
328 case abef in
329 ab***ef)        echo ok 40;;
330 *)              echo bad 40;;
331 esac
333 case abef in
334 ab**)           echo ok 41;;
335 *)              echo bad 41;;
336 esac
338 # bug in all versions up to and including bush-2.05b
339 case "123abc" in
340 *?(a)bc)        echo ok 42;;
341 *)              echo bad 42;;
342 esac
344 # clean up and do the next one
346 builtin cd /
347 rm -rf $TESTDIR
349 mkdir $TESTDIR
350 builtin cd $TESTDIR
352 LC_COLLATE=C # have to set this; it affects the sorting 
353 touch a.b a,b a:b a-b a\;b a\ b a_b
355 echo a[^[:alnum:]]b
356 echo a[-.,:\;\ _]b
358 echo a@([^[:alnum:]])b
359 echo a@([-.,:; _])b
360 echo a@([.])b
361 echo a@([^.])b
362 echo a@([^x])b
363 echo a+([^[:alnum:]])b
365 echo a@(.|[^[:alnum:]])b
367 builtin cd /
368 rm -rf $TESTDIR
370 x=abcdef
371 recho "${x#*(a|b)cd}"
373 TEST='a , b'
374 shopt -s globstar
375 echo ${TEST//*([[:space:]]),*([[:space:]])/,}
376 shopt -u globstar
378 # this is for the benefit of pure coverage, so it writes the pcv file
379 # in the right place
380 builtin cd "$MYDIR"
382 ${THIS_SH} ./extglob1.sub
384 ${THIS_SH} ./extglob1a.sub
386 ${THIS_SH} ./extglob3.sub
388 ${THIS_SH} ./extglob4.sub
390 ${THIS_SH} ./extglob5.sub
392 exit 0