improve of cmpl.
[bush.git] / tests / new-exp.tests
blob5f2e72b4bc7a24039c3cd3cf026ce1f994896ec3
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 if (( $UID == 0 )); then
15         echo "new-exp.tests: the test suite should not be run as root" >&2
18 # must do this because posix mode causes process substitution to be disabled
19 # and flagged as a syntax error, which causes the shell to exit
20 set +o posix
22 expect()
24         echo expect "$@"
27 HOME=/usr/homes/chet    # to make the check against new-exp.right work
28 expect '<foo bar>'
29 recho "${undef-"foo bar"}"      # should be foo bar
30 expect '<foo>'
31 recho "${und="foo"}"            # should be foo
33 expect "<$HOME>"
34 recho ${HOME-"}"}
35 expect "<$HOME>"
36 recho "${HOME-'}'}"
37 expect "<$HOME>"
38 recho "${HOME-"}"}"
40 expect $0: 'HOME: }: syntax error: operand expected (error token is "}")'
41 recho "${HOME:`echo }`}"        # should be a math error -- bad substring substitution
43 expect unset
44 _ENV=oops
45 x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}
46 echo ${x:-unset}
48 expect "<$HOME>"
49 recho ${HOME}
50 expect "<$HOME>"
51 recho ${HOME:-`echo }`}
52 expect "<$HOME>"
53 recho ${HOME:-`echo "}"`}
54 expect "<$HOME>"
55 recho "${HOME:-`echo "}"`}"
56 expect "<$HOME>"
57 recho "$(echo "${HOME}")"
58 expect "<$HOME>"
59 recho "$(echo "$(echo ${HOME})")"
60 expect "<$HOME>"
61 recho "$(echo "$(echo "${HOME}")")"
63 P=*@*
64 expect '<*@>'
65 recho "${P%"*"}"        # 
66 expect '<*@>'
67 recho "${P%'*'}"        # 
68 expect '<@*>'
69 recho "${P#\*}"         # should be @*
71 expect '<)>'
72 recho "$(echo ")")"     # should be )
73 expect '<")">'
74 recho "$(echo "\")\"")" # should be ")"
76 foo='abcd   '
77 expect '<-abcd> <->'
78 recho -${foo}-          # should be -abcd -
79 expect '<-abcd> <->'
80 recho -${foo% *}-       # should be -abcd -
81 expect '<-abcd->'
82 recho -${foo%% *}-      # should be -abcd-
84 foo=bar
85 expect '<bar foo>'
86 echo -n $foo' ' ; echo foo
88 expect '<bar foo>'
89 echo -n $foo" " ; echo foo
91 expect '<bar foo>'
92 echo -n "$foo " ; echo foo
94 expect '<barfoo>'
95 echo -e "$foo\c " ; echo foo
97 expect '<barfoo>'
98 echo -e $foo"\c " ; echo foo
100 # make sure backslashes are preserved in front of characters that are not
101 # valid backslash escapes
102 expect '<\x>'
103 echo -e '\x'
105 # substring tests
106 z=abcdefghijklmnop
107 expect '<abcd>'
108 recho ${z:0:4}
110 expect '<efg> <nop>'
111 recho ${z:4:3} ${z:${#z}-3:3}
113 expect '<efg> <nop>'
114 recho ${z:4:3} ${z: -3:3}
116 expect '<hijklmnop>'
117 recho ${z:7:30}
119 expect '<abcdefghijklmnop>'
120 recho ${z:0:100}
122 expect '<abcdefghijklmnop>'
123 recho ${z:0:${#z}}
125 set 'ab cd' 'ef' 'gh ij' 'kl mn' 'op'
126 expect '<ab cd> <ef>'
127 recho "${@:1:2}"
129 expect '<gh ij> <kl mn>'
130 recho "${@:3:2}"
132 expect '<gh ij> <kl mn> <op>'
133 recho "${@:3:4}"
135 expect '<ab cd> <ef> <gh ij> <kl mn> <op>'
136 recho "${@:1:$#}"
138 # code to ad-hoc parse arithmetic expressions in substring expansions was
139 # broken until post-2.04
140 base=/home/chet/foo//bar
141 string1=$base/abcabcabc
142 x=1 j=4
144 expect '</home/chet/foo//bar/abcabcabc>'
145 recho ${string1:0}
147 expect '<home/chet/foo//bar/abcabcabc>'
148 recho ${string1:1}
150 expect '<home>'
151 recho ${string1:(j?1:0):j}
153 expect '<home>'
154 recho ${string1:j?1:0:j}
156 expect '<home>'
157 recho ${string1:(j?(x?1:0):0):j}
159 expect '<home>'
160 recho ${string1:j?(x?1:0):0:j}
162 unset base string1 x j
164 # indirect variable references
165 expect '<abcdefghijklmnop>'
166 recho ${!9:-$z}
168 ef=4
169 expect '<4>'
170 recho ${!2}
172 expect '<op>'
173 recho ${!#}
175 set a b c d e
177 expect '<abcdefghijklmnop>'
178 recho ${a:-$z}
179 expect '<abcdefghijklmnop>'
180 recho ${!1:-$z}
182 expect nothing
183 recho ${a-$z}
184 expect nothing
185 recho ${!1-$z}
187 set -- a 'b c' d
188 unset foo
189 foo=@
190 expect '<a> <b> <c> <d>'
191 recho ${!foo}
192 expect '<a> <b c> <d>'
193 recho "${!foo}"
195 set -u
196 expect $0: ABX: unbound variable
197 ( recho ${ABX} )
198 set +u
200 expect $0: '$6: cannot assign in this way'
201 recho ${6="arg6"}
203 v=abcde
205 # sed-like variable substitution
206 expect '<xxcde>'
207 recho ${v/a[a-z]/xx}
208 expect '<axxde>'
209 recho ${v/a??/axx}
210 expect '<abxyz>'
211 recho ${v/c??/xyz}
212 expect '<abbcde>'
213 recho ${v/#a/ab}
214 expect '<abcde>'
215 recho ${v/#d/ab}
216 expect '<abcabe>'
217 recho ${v/d/ab}
218 expect '<abcdlast>'
219 recho ${v/%?/last}
220 expect '<abcde>'
221 recho ${v/%x/last}
223 av=(abcd efgh ijkl mnop qrst uvwx)
225 expect '<xxcd>'
226 recho ${av/??/xx}
227 expect '<abxx>'
228 recho ${av/%??/xx}
229 expect '<xxgh>'
230 recho ${av[1]/??/xx}
231 expect '<efgh>'
232 recho ${av[1]/%ab/xx}
233 expect '<xxfgh>'
234 recho ${av[1]/#?/xx}
235 expect '<zagh>'
236 recho ${av[1]/??/za}
237 expect '<zaza>'
238 recho ${av[1]//??/za}
239 expect '<zagh>'
240 recho ${av[1]/#??/za}
241 expect '<efza>'
242 recho ${av[1]/%??/za}
244 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
245 recho ${av[@]/*/yyy}
246 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
247 recho ${av[@]/#*/yyy}
248 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
249 recho ${av[@]/%*/yyy}
250 expect '<yyy> <efgh> <ijkl> <mnop> <qrst> <uvwx>'
251 recho ${av[@]/a*/yyy}
252 expect '<abxx> <efxx> <ijxx> <mnxx> <qrxx> <uvxx>'
253 recho ${av[@]/%??/xx}
255 set abcd efgh ijkl mnop qrst uvwx
257 expect '<xxcd>'
258 recho ${1/??/xx}
259 expect '<xxcd> <xxgh> <xxkl> <xxop> <xxst> <xxwx>'
260 recho ${@/??/xx}
261 expect '<xxcd> <xxgh> <xxkl> <xxop> <xxst> <xxwx>'
262 recho ${@/%??/xx}
263 expect '<zaza>'
264 recho ${3//??/za}
265 expect '<efza>'
266 recho ${3/%??/za}
267 expect '<zaza> <zaza> <zaza> <zaza> <zaza> <zaza>'
268 recho ${@//??/za}
269 expect '<zacd> <zagh> <zakl> <zaop> <zast> <zawx>'
270 recho ${@/#??/za}
271 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
272 recho ${@//*/yyy}
273 expect '<yyy> <efgh> <ijkl> <mnop> <qrst> <uvwx>'
274 recho ${@//a*/yyy}
275 expect '<abcd> <efgh> <ijkl> <mnop> <qrst> <uvwyyy>'
276 recho ${@/%x*/yyy}
278 expect a newline
279 echo $abmcde
281 # sneaky way to replace a newline in a variable value with something else
282 AVAR=$'This\nstring\nhas\nmultiple\nlines.'
283 echo "${AVAR}"
285 eval BVAR=\"\${AVAR//$'\n'/-}\"
286 echo "$BVAR"
288 unset AVAR BVAR
290 # run process substitution tests in a subshell so that syntax errors
291 # caused by a shell not implementing process substitution (e.g., one
292 # built on a NeXT) will not cause the whole test to exit prematurely
293 ${THIS_SH} ./new-exp1.sub
295 # run the tests of $(<filename) in a subshell to avoid cluttering up
296 # this script
297 ${THIS_SH} ./new-exp2.sub
299 expect '<6>'
300 recho ${#:-foo}
301 expect $0: '${#:}: bad substitution'
302 echo ${#:}
304 expect "<'>"
305 recho "'"
306 expect '<">'
307 recho '"'
308 expect '<"hello">'
309 recho "\"hello\""
311 shift $#
312 unset foo
313 z=abcdef
314 z1='abc def'
316 expect '<>'
317 recho ${foo:-""}
318 expect nothing
319 recho ${foo:-"$@"}
320 expect '<>'
321 recho "${foo:-$@}"
323 # unset var
324 expect '<>'
325 recho ${foo:-"$zbcd"}
326 expect nothing
327 recho ${foo:-$zbcd}
329 # set var
330 expect '<abcdef>'
331 recho ${foo:-"$z"}
332 expect '<abc def>'
333 recho ${foo:-"$z1"}
335 expect '<abcdef>'
336 recho ${foo:-$z}
337 expect '<abc> <def>'
338 recho ${foo:-$z1}
340 expect '<abcdef>'
341 recho "${foo:-$z}"
342 expect '<abc def>'
343 recho "${foo:-$z1}"
345 expect '<abcdef>'
346 recho "${foo:-"$z"}"
347 # this disagrees with sh and ksh, but I think it is right according
348 # to posix.2.
349 expect '<abc def>'
350 recho "${foo:-"$z1"}"
352 set ab cd ef gh
353 expect '<ab> <cd> <ef> <gh>'
354 recho ${foo:-"$@"}
355 expect '<ab> <cd> <ef> <gh>'
356 recho "${foo:-$@}"
357 expect '<ab> <cd> <ef> <gh>'
358 recho "${foo:-"$@"}"
360 shift ${#}
361 expect nothing
362 recho $xxx"$@"
363 expect nothing
364 recho ${foo:-$xxx"$@"}
365 expect '<>'
366 recho "${foo:-$xxx$@}"
367 expect '<>'
368 recho "${foo:-$xxx"$@"}"
370 expect nothing
371 recho $xxx"$@"
372 expect nothing
373 recho "$xxx$@"
374 expect nothing
375 recho "$@"$xxx
377 expect '<>'
378 recho $xxx""
379 expect '<>'
380 recho $xxx''
381 expect '<>'
382 recho ''$xxx
383 expect '<>'
384 recho ""$xxx
386 AB='abcdefghijklmnopqrstuvwxyz'
388 recho ${AB:7:15}
389 recho ${AB:15:7}
391 recho ${AB:20}
393 recho ${AB:0}
394 recho ${AB:0:20}
396 recho ${AB:10:7}
397 recho ${AB:10:3+4}
398 recho ${AB:20/2:3+4}
400 set 1 2 3 4 5 6
401 recho \""${*:2:2}"\"
403 IFS=:
404 recho \""${*:2:2}"\"
406 IFS=$' \t\n'
408 z=123456
410 recho \""${z:2:2}"\"
411 recho \""${z:2}"\"
412 recho \""${z:2:4}"\"
413 recho \""${z:2:6}"\"
415 set $'\1' $'\2' $'\177'
417 recho $*
418 recho $@
420 recho ${*}
421 recho ${@}
423 xx=one/two/two
424 recho ${xx%/*}
425 recho ${xx/\/two}
427 yy=oneonetwo
428 recho ${yy//one}
429 recho ${yy/\/one}
431 xx=oneonetwo
433 recho ${xx/one}
434 recho ${xx//one}
435 recho ${xx/\/one}
437 # out-of-range substrings
438 var=abc
439 c=${var:3}
440 expect nothing
441 recho $c
442 c=${var:4}
443 expect nothing
444 recho $c
445 # as of bush-4.2, negative LENGTH means offset from the end
446 c=${var:0:-2}
447 expect '<a>'
448 recho $c
450 var=abcdefghi
451 c=${var:3:12}
452 recho $c
453 c=${var:4:20}
454 recho $c
456 # make sure null patterns work
457 xxx=endocrine
458 yyy=n
459 unset zzz
461 recho ${xxx/$yyy/*}
462 recho ${xxx//$yyy/*}
464 recho ${xxx/$zzz/*}
465 recho ${xxx//$zzz/*}
467 recho ${xxx//%${zzz}/}
468 recho ${xxx//%${zzz}}
469 recho ${xxx//#${zzz}/}
470 recho ${xxx//#${zzz}}
472 # make sure null strings are replaced appropriately
473 unset var
474 var=
475 echo "${var/#/x}"
476 echo "${var/*/x}"
477 echo "${var//*/x}"
479 var=abc
480 echo "${var/#/x}"
481 echo "${var/*/x}"
482 echo "${var//*/x}"
483 unset var
485 # another case that caused a core dump in bush-2.0
486 XPATH=/usr/bin:/bin:/usr/local/bin:/usr/gnu/bin::/usr/bin/X11:/sbin:/usr/sbin
488 recho ${XPATH//:/ }
490 xx=(ar as at au av aw ax ay az)
492 recho ${xx[@]/a/}
493 recho ${xx[@]//a/}
495 recho ${xx[*]/a/}
496 recho ${xx[*]//a/}
498 recho ${xx[@]%?}
499 recho ${xx[*]%?}
501 recho ${xx[@]#?}
502 recho ${xx[*]#?}
504 set -- ar as at au av aw ax ay az
506 recho ${@/a/}
507 recho ${@//a/}
509 recho ${*/a/}
510 recho ${*//a/}
512 recho ${@%?}
513 recho ${*%?}
515 recho ${@#?}
516 recho ${*#?}
518 shift ${#}
519 set -u
520 ( recho $9 ; echo after 1)
521 ( recho ${9} ; echo after 2)
522 ( recho $UNSET ; echo after 3)
523 ( recho ${UNSET} ; echo after 4)
524 ( recho "$UNSET" ; echo after 5)
525 ( recho "${UNSET}" ; echo after 6)
526 ( recho "${#UNSET}" ; echo after 7)
527 set +u
529 RECEIVED="12345"
530 recho "${RECEIVED:$((${#RECEIVED}-1)):1}"
531 RECEIVED="12345#"
532 recho "${RECEIVED:$((${#RECEIVED}-1)):1}"
533 RECEIVED="#"
534 recho "${RECEIVED:$((${#RECEIVED}-1)):1}"
535 RECEIVED=""
536 recho "${RECEIVED:$((${#RECEIVED}-1)):1}"
538 # tests of new prefix expansion ${!prefix*}
539 ${THIS_SH} ./new-exp3.sub
541 # bug with indirect expansion through bush-2.05b
542 ${THIS_SH} ./new-exp4.sub
544 # these caused errors and core dumps in versions before bush-2.04
545 c=""
546 echo ${c//${$(($#-1))}/x/}
548 set a b c d e f g
549 recho "$@"
551 set -- ${@:1:$(($# - 2))}
552 recho "$@"
554 set a b
555 recho ${@:1:$(($# - 2))}
557 recho ${@:1:0}
558 recho ${@:1:1}
559 recho ${@:1:2}
561 recho "${*:1:0}"
563 # this is an error -- negative expression
564 set a
565 recho ${@:1:$(($# - 2))}
566 set a b c d e
567 recho ${@: -3:-2}
569 XPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
570 set $( IFS=: ; echo $XPATH ) 
572 recho ${@##*/}
573 recho ${@%%[!/]*}
575 recho ${@#/*}
576 recho ${@%*/}
578 set /full/path/to/x16 /another/full/path
580 recho ${1%/*}
581 recho ${1%%[!/]*}
582 recho ${1#*/}
583 recho ${1##*/}
585 ${THIS_SH} ./new-exp5.sub
587 unset var
588 var=blah
590 # these had better agree
591 echo ${var[@]:3}
592 echo ${var:3}
593 echo ${var[@]/#/--}
594 echo ${var/#/--}
595 echo ${var[@]##?}
596 echo ${var##?}
598 unset var
599 var=(abcde abcfg abchi)
601 # problems with anchoring pattern replacements
602 echo ${var[*]//#abc/foo}
603 echo ${var[*]/#abc/foo}
604 unset var
606 ${THIS_SH} ./new-exp6.sub
608 ${THIS_SH} ./new-exp7.sub
610 ${THIS_SH} ./new-exp8.sub
612 # tests to check whether things like indirect expansion of a variable whose
613 # value is 'anothervar[@]' stop working
614 ${THIS_SH} ./new-exp9.sub
616 # new parameter transformation `@' expansion operator
617 ${THIS_SH} ./new-exp10.sub
619 # parameter substring replacement and removal operators with multibyte chars
620 ${THIS_SH} ./new-exp11.sub
622 # indirect expansion with arrays and local variables
623 ${THIS_SH} ./new-exp12.sub
625 # more indirect expansion and parameter transformation issues
626 ${THIS_SH} ./new-exp13.sub
628 # new K parameter transformation operator
629 ${THIS_SH} ./new-exp14.sub
631 # ongoing work with a/A parameter transformations and `nounset'
632 ${THIS_SH} ./new-exp15.sub
634 # problems with stray CTLNUL in bush-4.0-alpha
635 unset a
636 a=/a
637 recho "/${a%/*}"
638 recho "/${a///a/}"
640 patfunc()
642         echo ${1##*"${1##*}"}
644 patfunc foo
646 # caused core dumps because of bad bracket expression parsing in bush-5.0
647 eval : $'${x/#[0\xef\xbf\xbd\\Z[:]]}'
649 expect $0: 'ABXD: parameter unset'
650 ${THIS_SH} -c 'recho ${ABXD:?"parameter unset"}' $0