improve of cmpl.
[bush.git] / tests / glob.tests
blobf09d3685bc80d6147487667e3eb00a6d2c5d153f
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 export LC_COLLATE=C
16 # test the shell globbing
18 expect()
20 :       # if needed, change me to echo expect "$@"
23 # First, a test that bush-2.01.1 fails
24 ${THIS_SH} ./glob1.sub
25 ${THIS_SH} ./glob2.sub
26 ${THIS_SH} ./glob3.sub
27 ${THIS_SH} ./glob4.sub
28 ${THIS_SH} ./glob5.sub
29 ${THIS_SH} ./glob6.sub
30 ${THIS_SH} ./glob7.sub
31 ${THIS_SH} ./glob8.sub
32 ${THIS_SH} ./glob9.sub
34 MYDIR=$PWD      # save where we are
36 TESTDIR=$TMPDIR/glob-test-$$
37 mkdir $TESTDIR
38 builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; }
39 rm -rf *
41 touch a b c d abc abd abe bb bcd ca cb dd de Beware
42 mkdir bdir
44 # see if `regular' globbing works right
45 expect '<a> <abc> <abd> <abe> <X*>'
46 recho a* X*
48 expect '<a> <abc> <abd> <abe>'
49 recho \a*
51 # see if null glob expansion works
52 shopt -s nullglob
54 expect '<a> <abc> <abd> <abe>'
55 recho a* X*
57 shopt -u nullglob
59 # see if the failglob option works
61 mkdir tmp
62 touch tmp/l1 tmp/l2 tmp/l3
63 builtin echo tmp/l[12] tmp/*4 tmp/*3
64 shopt -s failglob
65 builtin echo tmp/l[12] tmp/*4 tmp/*3
66 rm -r tmp
67 shopt -u failglob
69 # see if the code that expands directories only works
70 expect '<bdir/>'
71 recho b*/
73 # Test quoted and unquoted globbing characters
74 expect '<*>'
75 recho \*
77 expect '<a*>'
78 recho 'a*'
80 expect '<a*>'
81 recho a\*
83 expect '<c> <ca> <cb> <a*> <*q*>'
84 recho c* a\* *q*
86 expect '<**>'
87 recho "*"*
89 expect '<**>'
90 recho \**
92 expect '<\.\./*/>'
93 recho "\.\./*/"
95 expect '<s/\..*//>'
96 recho 's/\..*//'
98 # Pattern from Larry Wall's Configure that caused bush to blow up
99 expect '</^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/>'
100 recho "/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*"'$'"/\1/"
102 # Make sure character classes work properly
104 expect '<abc> <abd> <abe> <bb> <cb>'
105 recho [a-c]b*
107 expect '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>'
108 recho [a-y]*[^c]
110 expect '<abd> <abe>'
111 recho a*[^c]
113 touch a-b aXb
114 expect '<a-b> <aXb>'
115 recho a[X-]b
117 touch .x .y
118 expect '<Beware> <d> <dd> <de>'
119 recho [^a-c]*
121 # Make sure that filenames with embedded globbing characters are handled
122 # properly
123 mkdir a\*b
124 > a\*b/ooo
126 expect '<a*b/ooo>'
127 recho a\*b/*
129 expect '<a*b/ooo>'
130 recho a\*?/*
132 expect '<no match>'
133 cmd='echo !7'
134 case "$cmd" in
135 *\\!*) echo match ;;
136 *) echo no match ;;
137 esac
139 expect '<not there>'
140 file='r.*'
141 case $file in
142 *.\*) echo not there ;;
143 *) echo there ;;
144 esac
146 # examples from the Posix.2 spec (d11.2, p. 243)
147 expect '<abc>'
148 recho a[b]c
150 expect '<abc>'
151 recho a["b"]c
153 expect '<abc>'
154 recho a[\b]c
156 expect '<abc>'
157 recho a?c
159 expect '<match 1>'
160 case abc in
161 a"b"c)  echo 'match 1' ;;
162 *)      echo 'BAD match 1' ;;
163 esac
165 expect '<match 2>'
166 case abc in
167 a*c)    echo 'match 2' ;;
168 *)      echo 'BAD match 2' ;;
169 esac
171 expect '<ok 1>'
172 case abc in
173 "a?c")  echo 'bad 1' ;;
174 *)      echo 'ok 1' ;;
175 esac
177 expect '<ok 2>'
178 case abc in
179 a\*c)   echo 'bad 2' ;;
180 *)      echo 'ok 2' ;;
181 esac
183 expect '<ok 3>'
184 case abc in
185 a\[b]c) echo 'bad 3' ;;
186 *)      echo 'ok 3' ;;
187 esac
189 expect '<ok 4>'
190 case "$nosuchvar" in
191 "")     echo 'ok 4' ;;
192 *)      echo 'bad 4' ;;
193 esac
195 # This is very odd, but sh and ksh seem to agree
196 expect '<ok 5>'
197 case abc in
198 a["\b"]c) echo 'ok 5' ;;
199 *)      echo 'bad 5' ;;
200 esac
202 mkdir man
203 mkdir man/man1
204 touch man/man1/bush.1
205 expect '<man/man1/bush.1>'
206 recho */man*/bush.*
207 expect '<man/man1/bush.1>'
208 recho $(echo */man*/bush.*)
209 expect '<man/man1/bush.1>'
210 recho "$(echo */man*/bush.*)"
212 # tests with multiple `*'s
213 case abc in
214 a***c)  echo ok 1;;
215 esac
217 case abc in
218 a*****?c)       echo ok 2;;
219 esac
221 case abc in
222 ?*****??)       echo ok 3;;
223 esac
225 case abc in
226 *****??)        echo ok 4;;
227 esac
229 case abc in
230 *****??c)       echo ok 5;;
231 esac
233 case abc in
234 ?*****?c)       echo ok 6;;
235 esac
237 case abc in
238 ?***?****c)     echo ok 7;;
239 esac
241 case abc in
242 ?***?****?)     echo ok 8;;
243 esac
245 case abc in
246 ?***?****)      echo ok 9;;
247 esac
249 case abc in
250 *******c)       echo ok 10;;
251 esac
253 case abc in
254 *******?)       echo ok 11;;
255 esac
257 case abcdecdhjk in
258 a*cd**?**??k)   echo ok 20;;
259 esac
261 case abcdecdhjk in
262 a**?**cd**?**??k)       echo ok 21;;
263 esac
265 case abcdecdhjk in
266 a**?**cd**?**??k***)    echo ok 22;;
267 esac
269 case abcdecdhjk in
270 a**?**cd**?**??***k)    echo ok 23;;
271 esac
273 case abcdecdhjk in
274 a**?**cd**?**??***k**)  echo ok 24;;
275 esac
277 case abcdecdhjk in
278 a****c**?**??*****)     echo ok 25;;
279 esac
281 case '-' in
282 [-abc]) echo ok 26 ;;
283 esac
285 case '-' in
286 [abc-]) echo ok 27 ;;
287 esac
289 case '\' in
290 \\)     echo ok 28 ;;
291 esac
293 case '\' in
294 [\\])   echo ok 29 ;;
295 esac
297 case '\' in
298 '\')    echo ok 30 ;;
299 esac
301 case '[' in
302 [[])    echo ok 31 ;;
303 esac
305 # a `[' without a closing `]' is just another character to match, in the
306 # bush implementation
307 case '[' in
308 [)      echo ok 32 ;;
309 esac
311 case '[abc' in
312 [*)     echo 'ok 33';;
313 esac
315 # a right bracket shall lose its special meaning and represent itself in
316 # a bracket expression if it occurs first in the list.  -- POSIX.2 2.8.3.2
317 case ']' in
318 []])    echo ok 34 ;;
319 esac
321 case '-' in
322 []-])   echo ok 35 ;;
323 esac
325 # a backslash should just escape the next character in this context
326 case p in
327 [a-\z]) echo ok 36 ;;
328 esac
330 # this was a bug in all versions up to bush-2.04-release
331 case "/tmp" in
332 [/\\]*) echo ok 37 ;;
333 esac
335 # none of these should output anything
337 case abc in
338 ??**********?****?)     echo bad 1;;
339 esac
341 case abc in
342 ??**********?****c)     echo bad 2;;
343 esac
345 case abc in
346 ?************c****?****)        echo bad 3;;
347 esac
349 case abc in
350 *c*?**) echo bad 4;;
351 esac
353 case abc in
354 a*****c*?**)    echo bad 5;;
355 esac
357 case abc in
358 a********???*******)    echo bad 6;;
359 esac
361 case 'a' in
362 [])     echo bad 7 ;;
363 esac
365 case '[' in
366 [abc)   echo bad 8;;
367 esac
369 # let's start testing the case-insensitive globbing code
370 recho b*
372 shopt -s nocaseglob
373 recho b*
375 recho [b]*
376 shopt -u nocaseglob
378 # make sure set -f works right
379 set -f
380 recho *
381 set +f
383 # test out the GLOBIGNORE code
384 GLOBIGNORE='.*:*c:*e:?'
385 recho *
387 GLOBIGNORE='.*:*b:*d:?'
388 recho *
390 # see if GLOBIGNORE can substitute for `set -f'
391 GLOBIGNORE='.*:*'
392 recho *
394 unset GLOBIGNORE
395 expect '<man/man1/bush.1>'
396 recho */man*/bush.*
398 # make sure null values for GLOBIGNORE have no effect
399 GLOBIGNORE=
400 expect '<man/man1/bush.1>'
401 recho */man*/bush.*
403 # this is for the benefit of pure coverage, so it writes the pcv file
404 # in the right place, and for gprof
405 builtin cd $MYDIR
407 rm -rf $TESTDIR
409 exit 0