diff options
| author | Jari Aalto <jari.aalto@cante.net> | 1996-12-23 17:02:34 +0000 |
|---|---|---|
| committer | Jari Aalto <jari.aalto@cante.net> | 2009-09-12 16:46:49 +0000 |
| commit | ccc6cda312fea9f0468ee65b8f368e9653e1380b (patch) | |
| tree | b059878adcfd876c4acb8030deda1eeb918c7e75 /tests | |
| parent | 726f63884db0132f01745f1fb4465e6621088ccf (diff) | |
| download | bash-ccc6cda312fea9f0468ee65b8f368e9653e1380b.tar.gz | |
Imported from ../bash-2.0.tar.gz.
Diffstat (limited to 'tests')
60 files changed, 2705 insertions, 61 deletions
diff --git a/tests/arith.right b/tests/arith.right new file mode 100644 index 00000000..a369bd89 --- /dev/null +++ b/tests/arith.right @@ -0,0 +1,91 @@ +163 +166 +4 +16 +8 +2 +4 +2 +2 +1 +0 +0 +0 +1 +1 +2 +-3 +-2 +1 +0 +2 +131072 +29 +33 +49 +1 +1 +0 +0 +1 +1 +1 +2 +3 +1 +58 +2 +60 +1 +256 +16 +62 +4 +29 +5 +-4 +4 +1 +32 +32 +1 +1 +32 +20 +1,i+=2 +30 +1,j+=2 +20 +1,i+=2 +30 +1,j+=2 +./arith.tests: 1 ? 20 : x+=2: attempted assignment to non-variable (error token is "+=2") +20 +6 +6,5,3 +263 +255 +255 +127 +36 +40 +10 +10 +10 +10 +10 +10 +36 +36 +62 +63 +./arith.tests: 3425#56: illegal arithmetic base (error token is "3425#56") +0 +./arith.tests: 7 = 43 : attempted assignment to non-variable (error token is "= 43 ") +./arith.tests: 2#44: value too great for base (error token is "2#44") +./arith.tests: 44 / 0 : division by 0 (error token is " ") +./arith.tests: let: jv += $iv: syntax error: operand expected (error token is "$iv") +./arith.tests: jv += $iv : syntax error: operand expected (error token is "$iv ") +./arith.tests: let: rv = 7 + (43 * 6: missing `)' (error token is "6") +./arith.tests: 0#4: bad number (error token is "0#4") +./arith.tests: 2#110#11: bad number (error token is "2#110#11") diff --git a/tests/arith.tests b/tests/arith.tests new file mode 100644 index 00000000..6bad3125 --- /dev/null +++ b/tests/arith.tests @@ -0,0 +1,158 @@ +declare -i iv jv + +iv=$(( 3 + 5 * 32 )) +echo $iv +iv=iv+3 +echo $iv +iv=2 +jv=iv + +let "jv *= 2" +echo $jv +jv=$(( $jv << 2 )) +echo $jv + +let jv="$jv / 2" +echo $jv +jv="jv >> 2" +echo $jv + +iv=$((iv+ $jv)) +echo $iv +echo $((iv -= jv)) +echo $iv +echo $(( iv == jv )) +echo $(( iv != $jv )) +echo $(( iv < jv )) +echo $(( $iv > $jv )) +echo $(( iv <= $jv )) +echo $(( $iv >= jv )) + +echo $jv +echo $(( ~$jv )) +echo $(( ~1 )) +echo $(( ! 0 )) + +echo $(( jv % 2 )) +echo $(( $iv % 4 )) + +echo $(( iv <<= 16 )) +echo $(( iv %= 33 )) + +echo $(( 33 & 55 )) +echo $(( 33 | 17 )) + +echo $(( iv && $jv )) +echo $(( $iv || jv )) + +echo $(( iv && 0 )) +echo $(( iv & 0 )) +echo $(( iv && 1 )) +echo $(( iv & 1 )) + +echo $(( $jv || 0 )) +echo $(( jv | 0 )) +echo $(( jv | 1 )) +echo $(( $jv || 1 )) + +let 'iv *= jv' +echo $iv +echo $jv +let "jv += $iv" +echo $jv + +echo $(( jv /= iv )) +echo $(( jv <<= 8 )) +echo $(( jv >>= 4 )) + +echo $(( iv |= 4 )) +echo $(( iv &= 4 )) + +echo $(( iv += (jv + 9))) +echo $(( (iv + 4) % 7 )) + +# unary plus, minus +echo $(( +4 - 8 )) +echo $(( -4 + 8 )) + +# conditional expressions +echo $(( 4<5 ? 1 : 32)) +echo $(( 4>5 ? 1 : 32)) +echo $(( 4>(2+3) ? 1 : 32)) +echo $(( 4<(2+3) ? 1 : 32)) +echo $(( (2+2)<(2+3) ? 1 : 32)) +echo $(( (2+2)>(2+3) ? 1 : 32)) + +# check that the unevaluated part of the ternary operator does not do +# evaluation or assignment +x=i+=2 +y=j+=2 +declare -i i=1 j=1 +echo $((1 ? 20 : (x+=2))) +echo $i,$x +echo $((0 ? (y+=2) : 30)) +echo $j,$y + +x=i+=2 +y=j+=2 +declare -i i=1 j=1 +echo $((1 ? 20 : (x+=2))) +echo $i,$x +echo $((0 ? (y+=2) : 30)) +echo $i,$y + +# check precedence of assignment vs. conditional operator +# should be an error +declare -i x=2 +y=$((1 ? 20 : x+=2)) + +# check precedence of assignment vs. conditional operator +declare -i x=2 +echo $((0 ? x+=2 : 20)) + +# associativity of assignment-operator operator +declare -i i=1 j=2 k=3 +echo $((i += j += k)) +echo $i,$j,$k + +# octal, hex +echo $(( 0x100 | 007 )) +echo $(( 0xff )) +echo $(( 16#ff )) +echo $(( 16#FF/2 )) +echo $(( 8#44 )) + +echo $(( 8 ^ 32 )) + +# other bases +echo $(( 16#a )) +echo $(( 32#a )) +echo $(( 56#a )) +echo $(( 64#a )) + +echo $(( 16#A )) +echo $(( 32#A )) +echo $(( 56#A )) +echo $(( 64#A )) + +echo $(( 64#_ )) +echo $(( 64#@ )) + +# weird bases +echo $(( 3425#56 )) + +# missing number after base +echo $(( 2# )) + +# these should generate errors +echo $(( 7 = 43 )) +echo $(( 2#44 )) +echo $(( 44 / 0 )) +let 'jv += $iv' +echo $(( jv += \$iv )) +let 'rv = 7 + (43 * 6' + +# more errors +declare -i i +i=0#4 +i=2#110#11 diff --git a/tests/array.right b/tests/array.right new file mode 100644 index 00000000..d4a3398d --- /dev/null +++ b/tests/array.right @@ -0,0 +1,78 @@ +abcde +abcde bdef +abcde bdef +declare -a DIRSTACK='()' +declare -a a='([0]="abcde" [1]="" [2]="bdef")' +declare -a b='()' +declare -ar c='()' +abcde bdef +abcde bdef +abcde +abcde +abcde + +bdef +hello world +11 +3 +bdef hello world test expression +./array.tests: readonly: `a[5]': not a valid identifier +declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")' +declare -ar c='()' +declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")' +declare -ar c='()' +./array.tests: declare: e: cannot assign to array variables in this way +a test +declare -a DIRSTACK='()' +declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")' +declare -a b='([0]="this" [1]="is" [2]="a" [3]="test" [4]="" [5]="/etc/passwd")' +declare -ar c='()' +declare -a d='([1]="" [2]="bdef" [5]="hello world" [6]="test" [9]="ninth element")' +declare -a e='([0]="test")' +declare -a f='([0]="" [1]="bdef" [2]="hello world" [3]="test" [4]="ninth element")' +./array.tests: a: readonly variable +./array.tests: b[]: bad array subscript +./array.tests: b[*]: bad array subscript +./array.tests: ${b[ ]}: bad substitution +./array.tests: c[-2]: bad array subscript +./array.tests: c: bad array subscript + +./array.tests: d[7]: cannot assign list to array member +./array.tests: []=abcde: bad array subscript +./array.tests: [*]=last: cannot assign to non-numeric index +./array.tests: [-65]=negative: bad array subscript +declare -a DIRSTACK='()' +declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")' +declare -a b='([0]="this" [1]="is" [2]="a" [3]="test" [4]="" [5]="/etc/passwd")' +declare -ar c='()' +declare -a d='([1]="test test" [2]="bdef" [5]="hello world" [6]="test" [9]="ninth element")' +declare -a f='([0]="" [1]="bdef" [2]="hello world" [3]="test" [4]="ninth element")' +./array.tests: unset: ps1: not an array variable +./array.tests: declare: c: cannot destroy array variables in this way +this of +this is a test of read using arrays +declare -a DIRSTACK='()' +declare -a rv='([0]="this" [1]="is" [2]="a" [3]="test" [4]="of" [5]="read" [6]="using" [7]="arrays")' +declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")' +declare -a b='([0]="this" [1]="is" [2]="a" [3]="test" [4]="" [5]="/etc/passwd")' +declare -ar c='()' +declare -a d='([1]="test test" [2]="bdef" [5]="hello world" [6]="test" [9]="ninth element")' +declare -a f='([0]="" [1]="bdef" [2]="hello world" [3]="test" [4]="ninth element")' +abde +abde +bbb +efgh +wxyz +wxyz +./array.tests +a +b c +d +e f g +h +./array.tests +a +b c +d +e f g +h diff --git a/tests/array.tests b/tests/array.tests new file mode 100644 index 00000000..2ee376bb --- /dev/null +++ b/tests/array.tests @@ -0,0 +1,131 @@ +set +a +# The calls to egrep -v are to filter out builtin array variables that are +# automatically set and possibly contain values that vary. +unset a +a=abcde +a[2]=bdef + +declare -a b[256] + +unset c[2] +unset c[*] + +a[1]= + +_ENV=/bin/true +x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]} + +declare -r c[100] + +echo ${a[0]} ${a[4]} +echo ${a[@]} + +echo ${a[*]} + +# this should print out values, too +declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS)' + +unset a[7] +echo ${a[*]} + +unset a[4] +echo ${a[*]} + +echo ${a} +echo "${a}" +echo $a + +unset a[0] +echo ${a} + +echo ${a[@]} + +a[5]="hello world" +echo ${a[5]} +echo ${#a[5]} + +echo ${#a[@]} + +a[4+5/2]="test expression" +echo ${a[@]} + +readonly a[5] +readonly a +readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS)' +declare -ar | egrep -v '(BASH_VERSINFO|PIPESTATUS)' + +declare -a d='([1]="" [2]="bdef" [5]="hello world" "test")' +d[9]="ninth element" + +declare -a e[10]=test +declare -a e[10]='(test)' + +pass=/etc/passwd +declare -a f='("${d[@]}")' +b=([0]=this [1]=is [2]=a [3]=test [4]="$PS1" [5]=$pass) + +echo ${b[@]:2:3} + +declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS)' + +a[3]="this is a test" + +b[]=bcde +b[*]=aaa +echo ${b[ ]} + +c[-2]=4 +echo ${c[-4]} + +d[7]=(abdedfegeee) + +d=([]=abcde [1]="test test" [*]=last [-65]=negative ) + +unset d[12] +unset e[*] + +declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS)' + +ps1='hello' +unset ps1[2] +unset ${ps1[2]} + +declare +a ps1 +declare +a c + +# the prompt should not print when using a here doc +read -p "array test: " -a rv <<! +this is a test of read using arrays +! + +echo ${rv[0]} ${rv[4]} +echo ${rv[@]} + +declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS)' + +export rv +#set + +x[4]=bbb +x=abde +echo $x +echo ${x[0]} +echo ${x[4]} +echo efgh | ( read x[1] ; echo ${x[1]} ) +echo wxyz | ( declare -a x ; read x ; echo $x ; echo ${x[0]} ) + +# Make sure that arrays can be used to save the positional paramters verbatim +set -- a 'b c' d 'e f g' h + +ARGV=( [0]=$0 "$@" ) + +for z in "${ARGV[@]}" +do + echo "$z" +done + +echo "$0" +for z in "$@" +do + echo "$z" +done diff --git a/tests/braces-tests b/tests/braces-tests new file mode 100644 index 00000000..bd8ff822 --- /dev/null +++ b/tests/braces-tests @@ -0,0 +1,20 @@ +echo ff{c,b,a} +echo f{d,e,f}g +echo {l,n,m}xyz +echo {abc\,def} +echo {abc} + +echo \{a,b,c,d,e} +echo {x,y,\{a,b,c}} +echo {x\,y,\{abc\},trie} + +echo /usr/{ucb/{ex,edit},lib/{ex,how_ex}} + +echo XXXX\{`echo a b c | tr ' ' ','`\} +eval echo XXXX\{`echo a b c | tr ' ' ','`\} + +echo {} +echo { } +echo } +echo { +echo abcd{efgh diff --git a/tests/braces.right b/tests/braces.right new file mode 100644 index 00000000..52cc6383 --- /dev/null +++ b/tests/braces.right @@ -0,0 +1,16 @@ +ffc ffb ffa +fdg feg ffg +lxyz nxyz mxyz +{abc,def} +{abc} +{a,b,c,d,e} +x} y} {a} b} c} +x,y {abc} trie +/usr/ucb/ex /usr/ucb/edit /usr/lib/ex /usr/lib/how_ex +XXXX{a,b,c} +XXXXa XXXXb XXXXc +{} +{ } +} +{ +abcd{efgh diff --git a/tests/exp-tests b/tests/exp-tests index d45b7024..45fe87c4 100644 --- a/tests/exp-tests +++ b/tests/exp-tests @@ -163,14 +163,24 @@ expect '<^A^A^B>' recho '' # More tests of "$@" -expect '< abc> <def> <ghi> <jkl >' set abc def ghi jkl +expect '< abc> <def> <ghi> <jkl >' recho " $@ " +expect '< abc> <def> <ghi> <jkl >' +recho "${1+ $@ }" -expect '<--abc> <def> <ghi> <jkl-->' set abc def ghi jkl +expect '<--abc> <def> <ghi> <jkl-->' recho "--$@--" +set "a b" cd ef gh +expect '<a b> <cd> <ef> <gh>' +recho ${1+"$@"} +expect '<a b> <cd> <ef> <gh>' +recho ${foo:-"$@"} +expect '<a b> <cd> <ef> <gh>' +recho "${@}" + expect '< >' recho " " expect '< - >' @@ -324,3 +334,9 @@ recho '~' expect nothing recho $! + +# test word splitting of assignment statements not preceding a command +a="a b c d e" +declare b=$a +expect '<a> <b> <c> <d> <e>' +recho $b diff --git a/tests/exp.right b/tests/exp.right index f34e88a7..b1b1c2d3 100644 --- a/tests/exp.right +++ b/tests/exp.right @@ -53,10 +53,26 @@ argv[1] = < abc> argv[2] = <def> argv[3] = <ghi> argv[4] = <jkl > +argv[1] = < abc> +argv[2] = <def> +argv[3] = <ghi> +argv[4] = <jkl > argv[1] = <--abc> argv[2] = <def> argv[3] = <ghi> argv[4] = <jkl--> +argv[1] = <a b> +argv[2] = <cd> +argv[3] = <ef> +argv[4] = <gh> +argv[1] = <a b> +argv[2] = <cd> +argv[3] = <ef> +argv[4] = <gh> +argv[1] = <a b> +argv[2] = <cd> +argv[3] = <ef> +argv[4] = <gh> argv[1] = < > argv[1] = < - > argv[1] = </^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/> @@ -111,3 +127,8 @@ argv[1] = <42> argv[1] = <26> argv[1] = <\> argv[1] = <~> +argv[1] = <a> +argv[2] = <b> +argv[3] = <c> +argv[4] = <d> +argv[5] = <e> diff --git a/tests/glob-test b/tests/glob-test index e8c1c706..00227a6d 100644 --- a/tests/glob-test +++ b/tests/glob-test @@ -7,9 +7,9 @@ expect() } TESTDIR=/tmp/glob-test -rm -rf $TESTDIR mkdir $TESTDIR -builtin cd $TESTDIR +builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; } +rm -rf * touch a b c d abc abd abe bb bcd ca cb dd de mkdir bdir @@ -22,12 +22,12 @@ expect '<a> <abc> <abd> <abe>' recho \a* # see if null glob expansion works -allow_null_glob_expansion= +shopt -s nullglob expect '<a> <abc> <abd> <abe>' recho a* X* -unset allow_null_glob_expansion +shopt -u nullglob # see if the code that expands directories only works expect '<bdir/>' @@ -174,6 +174,111 @@ a["\b"]c) echo ok ;; esac +mkdir man +mkdir man/man1 +touch man/man1/bash.1 +expect '<man/man1/bash.1>' +recho */man*/bash.* +expect '<man/man1/bash.1>' +recho $(echo */man*/bash.*) +expect '<man/man1/bash.1>' +recho "$(echo */man*/bash.*)" + +# tests with multiple `*'s +case abc in +a***c) echo ok 1;; +esac + +case abc in +a*****?c) echo ok 2;; +esac + +case abc in +?*****??) echo ok 3;; +esac + +case abc in +*****??) echo ok 4;; +esac + +case abc in +*****??c) echo ok 5;; +esac + +case abc in +?*****?c) echo ok 6;; +esac + +case abc in +?***?****c) echo ok 7;; +esac + +case abc in +?***?****?) echo ok 8;; +esac + +case abc in +?***?****) echo ok 9;; +esac + +case abc in +*******c) echo ok 10;; +esac + +case abc in +*******?) echo ok 11;; +esac + +case abcdecdhjk in +a*cd**?**??k) echo ok 20;; +esac + +case abcdecdhjk in +a**?**cd**?**??k) echo ok 21;; +esac + +case abcdecdhjk in +a**?**cd**?**??k***) echo ok 22;; +esac + +case abcdecdhjk in +a**?**cd**?**??***k) echo ok 23;; +esac + +case abcdecdhjk in +a**?**cd**?**??***k**) echo ok 24;; +esac + +case abcdecdhjk in +a****c**?**??*****) echo ok 25;; +esac + +# none of these should output anything + +case abc in +??**********?****?) echo bad ;; +esac + +case abc in +??**********?****c) echo bad ;; +esac + +case abc in +?************c****?****) echo bad;; +esac + +case abc in +*c*?**) echo bad;; +esac + +case abc in +a*****c*?**) echo bad;; +esac + +case abc in +a********???*******) echo bad;; +esac + builtin cd / rm -rf $TESTDIR exit 0 diff --git a/tests/glob.right b/tests/glob.right index 4f2acbb9..2f1dac22 100644 --- a/tests/glob.right +++ b/tests/glob.right @@ -61,3 +61,23 @@ ok ok ok ok +argv[1] = <man/man1/bash.1> +argv[1] = <man/man1/bash.1> +argv[1] = <man/man1/bash.1> +ok 1 +ok 2 +ok 3 +ok 4 +ok 5 +ok 6 +ok 7 +ok 8 +ok 9 +ok 10 +ok 11 +ok 20 +ok 21 +ok 22 +ok 23 +ok 24 +ok 25 diff --git a/tests/heredoc.right b/tests/heredoc.right new file mode 100644 index 00000000..bf02e2b0 --- /dev/null +++ b/tests/heredoc.right @@ -0,0 +1,12 @@ +there +hi\ +there$a +stuff +hi\ +there +EO\ +F +hi +hi +hi +there diff --git a/tests/heredoc.tests b/tests/heredoc.tests new file mode 100644 index 00000000..aa694965 --- /dev/null +++ b/tests/heredoc.tests @@ -0,0 +1,45 @@ +# check order and content of multiple here docs + +cat << EOF1 << EOF2 +hi +EOF1 +there +EOF2 + +# check quoted here-doc is protected + +a=foo +cat << 'EOF' +hi\ +there$a +stuff +EOF + +# check that quoted here-documents don't have \newline processing done + +cat << 'EOF' +hi\ +there +EO\ +F +EOF +true + +# check that \newline is removed at start of here-doc +cat << EO\ +F +hi +EOF + +# check that \newline removal works for here-doc delimiter +cat << EOF +hi +EO\ +F + +# check that end of file delimits a here-document +# THIS MUST BE LAST! + +cat << EOF +hi +there diff --git a/tests/input-line.sh b/tests/input-line.sh index 086d7e31..3f66c817 100644 --- a/tests/input-line.sh +++ b/tests/input-line.sh @@ -1,4 +1,4 @@ echo before calling input-line.sub -../bash ./input-line.sub +${THIS_SH} ./input-line.sub this line for input-line.sub echo finished with input-line.sub diff --git a/tests/misc/redir.t4.sh b/tests/misc/redir.t4.sh index 861acdd8..78633dc5 100644 --- a/tests/misc/redir.t4.sh +++ b/tests/misc/redir.t4.sh @@ -1,7 +1,7 @@ echo "Point 1" exec 3</etc/passwd -exec 4>a -exec 5>b +exec 4>/tmp/a +exec 5>/tmp/b echo "Point 2" echo to a 1>&4 echo to b 1>&5 diff --git a/tests/more-exp.right b/tests/more-exp.right new file mode 100644 index 00000000..9e689cbb --- /dev/null +++ b/tests/more-exp.right @@ -0,0 +1,146 @@ +argv[1] = <aaa bbb ccc> +argv[1] = <aaa bbb ccc> +argv[1] = <baz:bar> +argv[1] = <baz:bar> +argv[1] = <aaa bbb ccc> +argv[1] = <bar> +argv[1] = <bar> +argv[1] = <bar> +argv[1] = <abcde> +argv[1] = <abcde> +argv[1] = <xyz> +argv[1] = <a b> +argv[2] = <c> +argv[3] = <d> +argv[4] = <e> +argv[5] = <f> +argv[1] = <a b> +argv[1] = <a> +argv[2] = <b> +argv[1] = <a b> +argv[2] = <c> +argv[3] = <d> +argv[4] = <e> +argv[5] = <f> +argv[1] = <a b> +argv[2] = <c> +argv[3] = <d> +argv[4] = <e> +argv[5] = <f> +argv[1] = </usr/homes/chet> +argv[1] = </usr/homes/chet> +argv[1] = <~> +argv[1] = <\~> +argv[1] = <\ \~> +argv[1] = <\ \ \~> +argv[1] = </usr/homes/chet> +argv[1] = </usr/homes/chet> +argv[1] = </usr/homes/chet> +argv[1] = <$HOME> +argv[1] = <\ $HOME> +argv[1] = <\ \ $HOME> +argv[1] = <'bar'> +argv[1] = <'bar'> +argv[1] = <*@*> +argv[1] = <*@*> +argv[1] = <*@> +argv[1] = <*@> +argv[1] = <*@*> +argv[1] = <*@*> +argv[1] = <*@*> +argv[1] = <*@*> +argv[1] = <abcd> +argv[1] = <efghijkl> +argv[1] = <4> +argv[2] = <2> +argv[1] = <1> +argv[1] = <bar> +argv[1] = <2> +argv[1] = <bar> +argv[1] = <2> +argv[1] = <4> +argv[1] = <--\> +argv[2] = <--> +argv[1] = <--\^J--> +argv[1] = <--+\> +argv[2] = <+--> +argv[1] = <--+\^J+--> +argv[1] = <-+\> +argv[2] = <+-\> +argv[3] = <-> +argv[1] = <xy> +argv[1] = <xy> +argv[1] = <xy> +argv[1] = <> +argv[1] = <> +argv[1] = <x> +argv[1] = <x> +argv[1] = <> +argv[1] = <x> +argv[1] = <x> +argv[1] = <x> +argv[1] = <x> +argv[1] = <^?> +argv[1] = <^?> +argv[1] = <x> +argv[1] = <x> +argv[1] = <> +argv[2] = <abd> +argv[3] = <x> +argv[1] = <> +argv[2] = <abd> +argv[3] = <> +argv[1] = <a,b,c,d,e,f> +argv[1] = <a> +argv[2] = <b> +argv[3] = <c> +argv[4] = <d> +argv[5] = <e> +argv[6] = <f> +./more-exp.tests: abc=def: command not found +argv[1] = <a b c d e> +argv[1] = <a> +argv[2] = <b> +argv[3] = <c> +argv[4] = <d> +argv[5] = <e> +argv[1] = <foo)> +argv[1] = <a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\\a> +argv[1] = <a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\\a> +argv[1] = <a> +argv[1] = <a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <$a> +argv[1] = <\foo> +argv[1] = <$a> +argv[1] = <\foo> +argv[1] = <\$a> +argv[1] = <\\$a> +argv[1] = <a> +argv[1] = <a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <\a> +argv[1] = <G> +argv[2] = <{> +argv[3] = <I> +argv[4] = <K> +argv[5] = <}> +argv[1] = <hi> +argv[2] = <K> +argv[3] = <}> +argv[1] = <a*> diff --git a/tests/more-exp.tests b/tests/more-exp.tests new file mode 100644 index 00000000..7f8ae50d --- /dev/null +++ b/tests/more-exp.tests @@ -0,0 +1,303 @@ +expect() +{ + echo expect "$@" +} + +tool_var() { + eval $1=\"\${$1:-$2}\" + export $1 +} + +A="aaa bbb ccc" + +unset B + +tool_var B ${B:-"$A"} + +expect '<aaa bbb ccc>' +recho "$A" +expect '<aaa bbb ccc>' +recho "$B" + +eto_prepend() { + eval $1=\'$2\''${'$1':+":"${'$1'}}'; export $1 +} + +foo=bar; export foo +eto_prepend foo baz +expect '<baz:bar>' +recho $foo +expect '<baz:bar>' +recho ${foo-"bar"} + +aa='aaa bbb ccc' + +expect '<aaa bbb ccc>' +recho ${zzz-"$aa"} +expect '<bar>' +recho ${zzz:-"bar"} +expect '<bar>' +recho "${zzz:-bar}" +expect '<bar>' +recho "${zzz:-"bar"}" + +var=abcde +expect '<abcde>' +recho "${var:-xyz}" +expect '<abcde>' +recho "${var:=xyz}" +expect '<xyz>' +recho "${var:+xyz}" + +set 'a b' c d e f +expect '<a b> <c> <d> <e> <f>' +recho ${1+"$@"} +expect '<a b>' +recho "${1-"$@"}" +expect '<a> <b>' +recho ${1-"$@"} +expect '<a b> <c> <d> <e> <f>' +recho "${1+$@}" +expect '<a b> <c> <d> <e> <f>' +recho "${1+"$@"}" + +HOME=/usr/homes/chet +somevar= +expect "<$HOME>" +recho ${somevar:-~} +expect "<$HOME>" +recho "${somevar:-~}" +expect '<~>' +recho "${somevar:-"~"}" +expect '<\~>' +recho "${somevar:-\~}" +expect '<\ \~>' +recho "${somevar:-\ \~}" +expect '<\ \ \~>' +recho "${somevar:-\ \ \~}" + +expect "<$HOME>" +recho ${somevar:-$HOME} +expect "<$HOME>" +recho "${somevar:-$HOME}" +expect "<$HOME>" +recho "${somevar:-"$HOME"}" +expect '<$HOME>' +recho "${somevar:-\$HOME}" +expect '<\ $HOME>' +recho "${somevar:-\ \$HOME}" +expect '<\ \ $HOME>' +recho "${somevar:-\ \ \$HOME}" + +foo=bar +expect "<'bar'>" +recho "${foo+'$foo'}" +expect "<'bar'>" +recho "${fox='$foo'}" + +P='*@*' +expect '<*@*>' +recho "${P%"*"}" +expect '<*@*>' +recho "${P%'*'}" + +expect '<*@>' +recho ${P%"*"} +expect '<*@>' +recho ${P%'*'} + +expect '<*@*>' +recho ${P%""} +expect '<*@*>' +recho ${P#""} + +expect '<*@*>' +recho ${P#"$foobar"} +expect '<*@*>' +recho ${P%"$foobar"} + +s1=abcdefghijkl +s2=efgh + +first=${s1/$s2*/} +expect '<abcd>' +recho $first + +last=${s1##$first} +expect '<efghijkl>' +recho $last + +shift $# +UNAME_RELEASE=${1:-4.2MP} + +RELEASE=`expr "$UNAME_RELEASE" : '[^0-9]*\([0-9]*\)'` # 4 +case "$RELEASE" in +"") RELEASE=0 ;; +*) RELEASE=`expr "$RELEASE" + 0` ;; +esac +REL_LEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.\([0-9]*\)'` # 1 +REL_SUBLEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2 + +expect '<4> <2>' +recho $RELEASE $REL_LEVEL $REL_SUBLEVEL + +b1() +{ + b2 ${1+"$@"} +} + +b2() +{ + recho $* + recho $# +} + +expect '<1>' +b1 '' + +expect '<bar> <2>' +b1 bar '' + +expect '<bar> <2>' +b1 '' bar + +expect '<4>' +b1 '' '' '' '' + +NL="\\ +" + +NNL="+$NL+" + +expect '<--\> <-->' +recho --$NL-- +expect '<--\^J-->' +recho "--$NL--" + +expect '<--+\> <+-->' +recho --$NNL-- +expect '<--+\^J+-->' +recho "--$NNL--" + +expect '<-+\> <+-\> <->' +recho -$NNL-$NL- + +set '' +expect '<xy>' +recho "$*xy" +expect '<xy>' +recho "x$*y" +expect '<xy>' +recho "xy$*" +expect '<>' +recho "$*" +expect nothing +recho $* + +unset undef ; set "" + +recho ${undef-"$zzz"} +recho x${undef-"$zzz"} +recho x${undef-"$@"} +recho ${undef-"$@"} +recho ${undef-"$zzz"}x +recho ${undef-"$@"}x +recho "$@"x +recho "$zzz"x +recho ${undef-} +recho ${undef-""} + +yyy="" +recho "$xxx"x +recho "$yyy"x + +set "" "abd" "" +recho "$@"x +recho "$@"$xxx + +OIFS="$IFS" + +arg=a,b,c,d,e,f + +IFS=, + +export z=$arg + +eval z1=\"$arg\" + +IFS="$OIFS" + +recho $z +recho $z1 + +# should give an error +abc\=def + +zz="a b c d e" +declare a=$zz + +recho "$a" +recho $a + +recho $(echo "foo$(echo ")")") + +# test backslash escapes + +recho \a +recho \\a + +recho "\a" +recho "\\a" + +recho '\a' +recho '\\a' + +recho $(zecho \a) +recho $(zecho \\a) + +recho $(zecho "\a") +recho $(zecho "\\a") + +recho $(zecho '\a') +recho $(zecho '\\a') + +recho `zecho \a` +recho `zecho \\a` + +recho `zecho "\a"` +recho `zecho "\\a"` + +recho `zecho '\a'` +recho `zecho '\\a'` + +a=foo + +recho \$a +recho \\$a + +recho "\$a" +recho "\\$a" + +recho '\$a' +recho '\\$a' + +recho $(zecho `zecho \a`) +recho $(zecho `zecho \\a`) + +recho $(zecho `zecho "\a"`) +recho $(zecho `zecho "\\a"`) + +recho $(zecho `zecho '\a'`) +recho $(zecho `zecho '\\a'`) + +# should echo G { I K } +recho ${abc:-G { I } K } + +abc=hi + +# should echo hi K } +recho ${abc:-G { I } K } + +# should echo a* +unset foo +recho "${foo:-"a"}*" diff --git a/tests/new-exp.right b/tests/new-exp.right index 07e2e9c6..ea4d3278 100644 --- a/tests/new-exp.right +++ b/tests/new-exp.right @@ -3,8 +3,8 @@ argv[1] = <foo> argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> -./new-exp.tests: ${HOME:`echo }`}: bad substitution -./new-exp.tests: ${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}: bad substitution +./new-exp.tests: HOME: }: syntax error: operand expected (error token is "}") +unset argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> @@ -12,7 +12,8 @@ argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> argv[1] = </usr/homes/chet> -argv[1] = <*@> +argv[1] = <*@*> +argv[1] = <*@*> argv[1] = <@*> argv[1] = <)> argv[1] = <")"> @@ -25,9 +26,194 @@ argv[1] = <a b c d e> bar foo bar foo bar foo -bar foo -bar foo +barfoo +barfoo +argv[1] = <abcd> +argv[1] = <efg> +argv[2] = <nop> +argv[1] = <hijklmnop> +argv[1] = <abcdefghijklmnop> +argv[1] = <abcdefghijklmnop> +argv[1] = <ab cd> +argv[2] = <ef> +argv[1] = <gh ij> +argv[2] = <kl mn> +argv[1] = <gh ij> +argv[2] = <kl mn> +argv[3] = <op> +argv[1] = <ab cd> +argv[2] = <ef> +argv[3] = <gh ij> +argv[4] = <kl mn> +argv[5] = <op> +argv[1] = <abcdefghijklmnop> +argv[1] = <4> +argv[1] = <op> +argv[1] = <abcdefghijklmnop> +argv[1] = <abcdefghijklmnop> ./new-exp.tests: ABX: unbound variable ./new-exp.tests: $6: cannot assign in this way +argv[1] = <xxcde> +argv[1] = <axxde> +argv[1] = <abxyz> +argv[1] = <abbcde> +argv[1] = <abcde> +argv[1] = <abcabe> +argv[1] = <abcdlast> +argv[1] = <abcde> +argv[1] = <xxcd> +argv[1] = <abxx> +argv[1] = <xxgh> +argv[1] = <efgh> +argv[1] = <xxfgh> +argv[1] = <zagh> +argv[1] = <zaza> +argv[1] = <zagh> +argv[1] = <efza> +argv[1] = <yyy> +argv[2] = <yyy> +argv[3] = <yyy> +argv[4] = <yyy> +argv[5] = <yyy> +argv[6] = <yyy> +argv[1] = <yyy> +argv[2] = <yyy> +argv[3] = <yyy> +argv[4] = <yyy> +argv[5] = <yyy> +argv[6] = <yyy> +argv[1] = <yyy> +argv[2] = <yyy> +argv[3] = <yyy> +argv[4] = <yyy> +argv[5] = <yyy> +argv[6] = <yyy> +argv[1] = <yyy> +argv[2] = <efgh> +argv[3] = <ijkl> +argv[4] = <mnop> +argv[5] = <qrst> +argv[6] = <uvwx> +argv[1] = <abxx> +argv[2] = <efxx> +argv[3] = <ijxx> +argv[4] = <mnxx> +argv[5] = <qrxx> +argv[6] = <uvxx> +argv[1] = <xxcd> +argv[1] = <xxcd> +argv[2] = <xxgh> +argv[3] = <xxkl> +argv[4] = <xxop> +argv[5] = <xxst> +argv[6] = <xxwx> +argv[1] = <abxx> +argv[2] = <efxx> +argv[3] = <ijxx> +argv[4] = <mnxx> +argv[5] = <qrxx> +argv[6] = <uvxx> +argv[1] = <zaza> +argv[1] = <ijza> +argv[1] = <zaza> +argv[2] = <zaza> +argv[3] = <zaza> +argv[4] = <zaza> +argv[5] = <zaza> +argv[6] = <zaza> +argv[1] = <zacd> +argv[2] = <zagh> +argv[3] = <zakl> +argv[4] = <zaop> +argv[5] = <zast> +argv[6] = <zawx> +argv[1] = <yyy> +argv[2] = <yyy> +argv[3] = <yyy> +argv[4] = <yyy> +argv[5] = <yyy> +argv[6] = <yyy> +argv[1] = <yyy> +argv[2] = <efgh> +argv[3] = <ijkl> +argv[4] = <mnop> +argv[5] = <qrst> +argv[6] = <uvwx> +argv[1] = <abcd> +argv[2] = <efgh> +argv[3] = <ijkl> +argv[4] = <mnop> +argv[5] = <qrst> +argv[6] = <uvwyyy> +this is a test of proc subst +this is test 2 +./new-exp.tests: ${#:-foo}: bad substitution +./new-exp.tests: ${#:}: bad substitution +argv[1] = <'> +argv[1] = <"> +argv[1] = <"hello"> +argv[1] = <> +argv[1] = <> +argv[1] = <> +argv[1] = <abcdef> +argv[1] = <abc def> +argv[1] = <abcdef> +argv[1] = <abc> +argv[2] = <def> +argv[1] = <abcdef> +argv[1] = <abc def> +argv[1] = <abcdef> +argv[1] = <abc def> +argv[1] = <ab> +argv[2] = <cd> +argv[3] = <ef> +argv[4] = <gh> +argv[1] = <ab> +argv[2] = <cd> +argv[3] = <ef> +argv[4] = <gh> +argv[1] = <ab> +argv[2] = <cd> +argv[3] = <ef> +argv[4] = <gh> +argv[1] = <> +argv[1] = <> +argv[1] = <> +argv[1] = <> +argv[1] = <> +argv[1] = <> +argv[1] = <hijklmnopqrstuv> +argv[1] = <pqrstuv> +argv[1] = <uvwxyz> +argv[1] = <abcdefghijklmnopqrstuvwxyz> +argv[1] = <abcdefghijklmnopqrst> +argv[1] = <klmnopq> +argv[1] = <klmnopq> +argv[1] = <klmnopq> +argv[1] = <"2 3"> +argv[1] = <"2:3"> +argv[1] = <"34"> +argv[1] = <"3456"> +argv[1] = <"3456"> +argv[1] = <"3456"> +argv[1] = <^A> +argv[2] = <^B> +argv[3] = <^?> +argv[1] = <^A> +argv[2] = <^B> +argv[3] = <^?> +argv[1] = <^A> +argv[2] = <^B> +argv[3] = <^?> +argv[1] = <^A> +argv[2] = <^B> +argv[3] = <^?> +argv[1] = <one/two> +argv[1] = <one/two> +argv[1] = <two> +argv[1] = <oneonetwo> +argv[1] = <onetwo> +argv[1] = <two> +argv[1] = <oneonetwo> ./new-exp.tests: ABXD: parameter unset diff --git a/tests/new-exp.tests b/tests/new-exp.tests index f19ecf6c..4ac36d01 100644 --- a/tests/new-exp.tests +++ b/tests/new-exp.tests @@ -16,11 +16,13 @@ recho "${HOME-'}'}" expect "<$HOME>" recho "${HOME-"}"}" -expect $0: '${HOME:`echo }`}: bad substitution' -recho "${HOME:`echo }`}" # should be an error -- bad substitution +expect $0: 'HOME: }: syntax error: operand expected (error token is "}")' +recho "${HOME:`echo }`}" # should be a math error -- bad substring substitution -expect $0: '${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}: bad substitution' +expect unset +_ENV=oops x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]} # memory leak +echo ${x:-unset} expect "<$HOME>" recho ${HOME} @@ -38,8 +40,10 @@ expect "<$HOME>" recho "$(echo "$(echo "${HOME}")")" P=*@* -expect '<*@>' -recho "${P%"*"}" # should be *@ +expect '<*@*>' +recho "${P%"*"}" # +expect '<*@*>' +recho "${P%'*'}" # expect '<@*>' recho "${P#\*}" # should be @* @@ -73,12 +77,65 @@ echo -n $foo" " ; echo foo expect '<bar foo>' echo -n "$foo " ; echo foo -expect '<bar foo>' +expect '<barfoo>' echo -e "$foo\c " ; echo foo -expect '<bar foo>' +expect '<barfoo>' echo -e $foo"\c " ; echo foo +# substring tests +z=abcdefghijklmnop +expect '<abcd>' +recho ${z:0:4} + +expect '<efg> <nop>' +recho ${z:4:3} ${z:${#z}-3:3} + +expect '<hijklmnop>' +recho ${z:7:30} + +expect '<abcdefghijklmnop>' +recho ${z:0:100} + +expect '<abcdefghijklmnop>' +recho ${z:0:${#z}} + +set 'ab cd' 'ef' 'gh ij' 'kl mn' 'op' +expect '<ab cd> <ef>' +recho "${@:1:2}" + +expect '<gh ij> <kl mn>' +recho "${@:3:2}" + +expect '<gh ij> <kl mn> <op>' +recho "${@:3:4}" + +expect '<ab cd> <ef> <gh ij> <kl mn> <op>' +recho "${@:1:$#}" + +# indirect variable references +expect '<abcdefghijklmnop>' +recho ${!9:-$z} + +ef=4 +expect '<4>' +recho ${!2} + +expect '<op>' +recho ${!#} + +set a b c d e +a= +expect '<abcdefghijklmnop>' +recho ${a:-$z} +expect '<abcdefghijklmnop>' +recho ${!1:-$z} + +expect nothing +recho ${a-$z} +expect nothing +recho ${!1-$z} + set -u expect $0: ABX: unbound variable recho ${ABX} @@ -87,9 +144,229 @@ set +u expect $0: '$6: cannot assign in this way' recho ${6="arg6"} +v=abcde + +# sed-like variable substitution +expect '<xxcde>' +recho ${v/a[a-z]/xx} +expect '<axxde>' +recho ${v/a??/axx} +expect '<abxyz>' +recho ${v/c??/xyz} +expect '<abbcde>' +recho ${v/#a/ab} +expect '<abcde>' +recho ${v/#d/ab} +expect '<abcabe>' +recho ${v/d/ab} +expect '<abcdlast>' +recho ${v/%?/last} +expect '<abcde>' +recho ${v/%x/last} + +av=(abcd efgh ijkl mnop qrst uvwx) + +expect '<xxcd>' +recho ${av/??/xx} +expect '<abxx>' +recho ${av/%??/xx} +expect '<xxgh>' +recho ${av[1]/??/xx} +expect '<efgh>' +recho ${av[1]/%ab/xx} +expect '<xxfgh>' +recho ${av[1]/#?/xx} +expect '<zagh>' +recho ${av[1]/??/za} +expect '<zaza>' +recho ${av[1]//??/za} +expect '<zagh>' +recho ${av[1]//#??/za} +expect '<efza>' +recho ${av[1]//%??/za} + +expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>' +recho ${av[@]/*/yyy} +expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>' +recho ${av[@]/#*/yyy} +expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>' +recho ${av[@]/%*/yyy} +expect '<yyy> <efgh> <ijkl> <mnop> <qrst> <uvwx>' +recho ${av[@]/a*/yyy} +expect '<abxx> <efxx> <ijxx> <mnxx> <qrxx> <uvxx>' +recho ${av[@]/%??/xx} + +set abcd efgh ijkl mnop qrst uvwx + +expect '<xxcd>' +recho ${1/??/xx} +expect '<xxcd> <xxgh> <xxkl> <xxop> <xxst> <xxwx>' +recho ${@/??/xx} +expect '<xxcd> <xxgh> <xxkl> <xxop> <xxst> <xxwx>' +recho ${@/%??/xx} +expect '<zaza>' +recho ${3//??/za} +expect '<efza>' +recho ${3//%??/za} +expect '<zaza> <zaza> <zaza> <zaza> <zaza> <zaza>' +recho ${@//??/za} +expect '<zacd> <zagh> <zakl> <zaop> <zast> <zawx>' +recho ${@//#??/za} +expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>' +recho ${@//*/yyy} +expect '<yyy> <efgh> <ijkl> <mnop> <qrst> <uvwx>' +recho ${@//a*/yyy} +expect '<abcd> <efgh> <ijkl> <mnop> <qrst> <uvwyyy>' +recho ${@//%x*/yyy} + expect a newline echo $abmcde +expect this is a test of proc subst +cat <(echo this is a test of proc subst) +echo this is test 2 > /tmp/x +expect this is test 2 +cat <(cat /tmp/x) +rm -f /tmp/x + +expect $0: '${#:-foo}: bad substitution' +echo ${#:-foo} +expect $0: '${#:}: bad substitution' +echo ${#:} + +expect "<'>" +recho "'" +expect '<">' +recho '"' +expect '<"hello">' +recho "\"hello\"" + +shift $# +unset foo +z=abcdef +z1='abc def' + +expect '<>' +recho ${foo:-""} +expect nothing +recho ${foo:-"$@"} +expect '<>' +recho "${foo:-$@}" + +# unset var +expect '<>' +recho ${foo:-"$zbcd"} +expect nothing +recho ${foo:-$zbcd} + +# set var +expect '<abcdef>' +recho ${foo:-"$z"} +expect '<abc def>' +recho ${foo:-"$z1"} + +expect '<abcdef>' +recho ${foo:-$z} +expect '<abc> <def>' +recho ${foo:-$z1} + +expect '<abcdef>' +recho "${foo:-$z}" +expect '<abc def>' +recho "${foo:-$z1}" + +expect '<abcdef>' +recho "${foo:-"$z"}" +# this disagrees with sh and ksh, but I think it is right according +# to posix.2. +expect '<abc def>' +recho "${foo:-"$z1"}" + +set ab cd ef gh +expect '<ab> <cd> <ef> <gh>' +recho ${foo:-"$@"} +expect '<ab> <cd> <ef> <gh>' +recho "${foo:-$@}" +expect '<ab> <cd> <ef> <gh>' +recho "${foo:-"$@"}" + +shift $# +expect nothing +recho $xxx"$@" +expect nothing +recho ${foo:-$xxx"$@"} +expect '<>' +recho "${foo:-$xxx$@}" +expect '<>' +recho "${foo:-$xxx"$@"}" + +expect nothing +recho $xxx"$@" +expect nothing +recho "$xxx$@" +expect nothing +recho "$@"$xxx + +expect '<>' +recho $xxx"" +expect '<>' +recho $xxx'' +expect '<>' +recho ''$xxx +expect '<>' +recho ""$xxx + +AB='abcdefghijklmnopqrstuvwxyz' + +recho ${AB:7:15} +recho ${AB:15:7} + +recho ${AB:20} + +recho ${AB:0} +recho ${AB:0:20} + +recho ${AB:10:7} +recho ${AB:10:3+4} +recho ${AB:20/2:3+4} + +set 1 2 3 4 5 6 +recho \""${*:2:2}"\" + +IFS=: +recho \""${*:2:2}"\" + +IFS=$' \t\n' + +z=123456 + +recho \""${z:2:2}"\" +recho \""${z:2}"\" +recho \""${z:2:4}"\" +recho \""${z:2:6}"\" + +set $'\1' $'\2' $'\177' + +recho $* +recho $@ + +recho ${*} +recho ${@} + +xx=one/two/two +recho ${xx%/*} +recho ${xx/\/two} + +yy=oneonetwo +recho ${yy//one} +recho ${yy/\/one} + +xx=oneonetwo + +recho ${xx/one} +recho ${xx//one} +recho ${xx/\/one} + # this must be last! expect $0: 'ABXD: parameter unset' recho ${ABXD:?"parameter unset"} diff --git a/tests/nquote.right b/tests/nquote.right new file mode 100644 index 00000000..3a0fc53d --- /dev/null +++ b/tests/nquote.right @@ -0,0 +1,16 @@ +argv[1] = <^J^J^J> +argv[1] = <> +argv[1] = <^J^I > +argv[1] = <abc> +argv[1] = <^M^[^Gabc> +argv[1] = <hello,> +argv[2] = <world> +argv[1] = <hello, world> +argv[1] = <> +argv[1] = <$hello, world> +argv[1] = <hello, $world> +argv[1] = <hello, "world"> +argv[1] = <hello, $"world"> +argv[1] = <hello, $"world"> +argv[1] = <$hello, chet> +argv[1] = <hello, chet> diff --git a/tests/nquote.tests b/tests/nquote.tests new file mode 100644 index 00000000..a2e596b2 --- /dev/null +++ b/tests/nquote.tests @@ -0,0 +1,57 @@ +expect() +{ + echo expect "$@" +} + +expect '<^J^J^J>' +recho $'\n\n\n' + +z1=$'' +expect '<>' +recho "$z1" + +ZIFS=$'\n'$'\t'$' ' + +expect '<^J^I >' +recho "$ZIFS" + +expect '<abc>' +recho $'abc' + +expect '<^M^[^Gabc>' +recho $'\r\e\aabc' + +D=$"hello"," "$"world" + +expect '<hello,> <world>' +recho $D + +expect '<hello, world>' +recho "$D" + +D=$"" +expect '<>' +recho "$D" + +world=chet + +expect '<$hello, world>' +recho \$"hello, world" + +expect '<hello, $world>' +recho $"hello, \$world" + +expect '<hello, "world">' +recho $"hello, \"world\"" + +expect '<hello, $"world">' +recho $"hello"', $"world"' + +expect '<hello, $"world">' +recho $'hello, $"world"' + +expect '<$hello, chet>' +recho \$"hello, $world" + +expect '<hello, chet>' +recho $"hello, $world" diff --git a/tests/posix2.right b/tests/posix2.right new file mode 100644 index 00000000..df30c4f1 --- /dev/null +++ b/tests/posix2.right @@ -0,0 +1,2 @@ +Testing for POSIX.2 conformance +All tests passed diff --git a/tests/posix2.tests b/tests/posix2.tests new file mode 100644 index 00000000..5eea7e0e --- /dev/null +++ b/tests/posix2.tests @@ -0,0 +1,148 @@ +#! /bin/sh +# posix-2.sh - Simple identification tests for POSIX.2 features +# commonly missing or incorrectly implemented. +# Time-stamp: <96/04/10 16:43:48 gildea> +# By Stephen Gildea <gildea@x.org> March 1995 +# +# Copyright (c) 1995 Stephen Gildea +# Permission is hereby granted to deal in this Software without restriction. +# THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. +# +# MODIFIED BY chet@po.cwru.edu to make part of the bash test suite. +# last change: Wed Jun 19 12:24:24 EDT 1996 +# +# some of the tests: +# +# shell functions (do we care?) +# var=${var:-val} +# unset +# set -- +# IFS parsing +## not exiting with -e and failed "if", the way Ultrix does (Ultrix 4.2?) +# "$@" expands to zero arguments if passed zero arguments +# $SHELL -c 'echo $1' bad good +# test -x +# positional parameters greater than 9 +# arithmetic expansion $(( ... )) +# getopts + +# For some tests we must run a sub-shell; $TESTSHELL says what to use. +# If set, TESTSHELL must be an absolute pathname. +# For example, on HP-UX 9, /bin/posix/sh is the supposedly-compliant shell. +TESTSHELL=${THIS_SH:-$PWD/../bash} + +# these tests create temp files with names $TMPDIR/conf* +: ${TMPDIR:=/tmp} + +exitval=0 +numtests=0 + +echo "Testing for POSIX.2 conformance" + +newtest() +{ + numtests=$(($numtests + 1)) +} + +testfail() +{ + echo "$1 test failed" + exitval=$(($exitval + 1)) +} + +newtest +empty="" +test "${empty:-ok}" = ok || testfail "empty var colon" +newtest +test "${empty-bad}" = "" || testfail "got \"${empty-bad}\": empty var nocolon" +newtest +test "${unsetvar-ok}" = ok || testfail "unset var" +newtest +unset empty +test "${empty-ok}" = ok || testfail "unset" + +newtest +set -- -Z +test "x$1" = x-Z || testfail '\"set -- arg\"' +# this should empty the argument list +newtest +set -- +test $# = 0 || testfail "still $# args: \"set --\"" + +# IFS parsing: +newtest +names=one/good/three +saved_ifs="$IFS" +IFS=/ +set $names lose +test "$2" = good || testfail "got \"$2\": IFS parsing" +IFS="$saved_ifs" + +# "$@" with 0 arguments should expand to 0 arguments +newtest +cat > $TMPDIR/conftest1 << EOF +$TMPDIR/conftest2 "\$@" +EOF +cat > $TMPDIR/conftest2 << "EOF" +#! /bin/sh +echo $# +EOF +chmod +x $TMPDIR/conftest1 $TMPDIR/conftest2 +numargs=$($TESTSHELL $TMPDIR/conftest1) +if [ "$?" != 0 ]; then + testfail 'running $@' +else + test "$numargs" = 0 || testfail '"$@" got '"$numargs args: expansion w 0 args" +fi +rm -f $TMPDIR/conftest1 $TMPDIR/conftest2 + +newtest +val=$("$TESTSHELL" -c 'echo $1' csh good) +test "$val" = good || testfail "got \"$val\": sh -c" + +newtest +# do these tests in a sub-shell because failure will exit +val=$("$TESTSHELL" -c 'echo ${10}' 0 1 2 3 4 5 6 7 8 9 ten 11 2> /dev/null) +test "$val" = ten || testfail "accessing more than 9 positional params" + +a=abc_def_ghi +export a +newtest; val=`"$TESTSHELL" -c 'echo "${a%_*}"' 2> /dev/null` +test "$val" = abc_def || testfail "parameter % op" +newtest; val=`"$TESTSHELL" -c 'echo "${a%%_*}"' 2> /dev/null` +test "$val" = abc || testfail "parameter %% op" +newtest; val=`"$TESTSHELL" -c 'echo "${a#*_}"' 2> /dev/null` +test "$val" = def_ghi || testfail "parameter # op" +newtest; val=`"$TESTSHELL" -c 'echo "${a##*_}"' 2> /dev/null` +test "$val" = ghi || testfail "parameter ## op" + +newtest +"$TESTSHELL" -c 'export a=value' 2> /dev/null || testfail "export with value" + +newtest +a=5; test "$(( ($a+1)/2 ))" = 3 || testfail "arithmetic expansion" + +# does "test" support the -x switch? +newtest +touch $TMPDIR/conftest +chmod -x $TMPDIR/conftest +test -x $TMPDIR/conftest && testfail "negative test -x" +chmod +x $TMPDIR/conftest +test -x $TMPDIR/conftest || testfail "positive test -x" +rm -f $TMPDIR/conftest + +newtest +test "$OPTIND" = 1 || testfail "OPTIND initial value" + +newtest +getopts a: store -a aoptval +if [ "$OPTIND" != 3 ] || [ "$store" != a ] || [ "$OPTARG" != aoptval ]; then + testfail "getopts" +fi + +if [ $exitval = 0 ]; then + echo "All tests passed" +else + echo "$exitval of $numtests tests failed" +fi +exit $exitval diff --git a/tests/quote.right b/tests/quote.right new file mode 100644 index 00000000..8d71f5dd --- /dev/null +++ b/tests/quote.right @@ -0,0 +1,42 @@ +Single Quote +foo +bar +foo +bar +foo\ +bar +Double Quote +foo +bar +foo +bar +foobar +Backslash Single Quote +foo bar +foo bar +foobar +Backslash Double Quote +foo bar +foo bar +foobar +Double Quote Backslash Single Quote +foo +bar +foo +bar +foobar +Dollar Paren Single Quote +foo bar +foo bar +foo\ bar +Dollar Paren Double Quote +foo bar +foo bar +foobar +Double Quote Dollar Paren Single Quote +foo +bar +foo +bar +foo\ +bar diff --git a/tests/quote.tests b/tests/quote.tests new file mode 100644 index 00000000..152ea5a3 --- /dev/null +++ b/tests/quote.tests @@ -0,0 +1,63 @@ +echo "Single Quote" +echo 'foo +bar' +echo 'foo +bar' +echo 'foo\ +bar' + +echo "Double Quote" +echo "foo +bar" +echo "foo +bar" +echo "foo\ +bar" + +echo "Backslash Single Quote" +echo `echo 'foo +bar'` +echo `echo 'foo +bar'` +echo `echo 'foo\ +bar'` + +echo "Backslash Double Quote" +echo `echo "foo +bar"` +echo `echo "foo +bar"` +echo `echo "foo\ +bar"` + +echo "Double Quote Backslash Single Quote" +echo "`echo 'foo +bar'`" +echo "`echo 'foo +bar'`" +echo "`echo 'foo\ +bar'`" + +echo "Dollar Paren Single Quote" +echo $(echo 'foo +bar') +echo $(echo 'foo +bar') +echo $(echo 'foo\ +bar') + +echo "Dollar Paren Double Quote" +echo $(echo "foo +bar") +echo $(echo "foo +bar") +echo $(echo "foo\ +bar") + +echo "Double Quote Dollar Paren Single Quote" +echo "$(echo 'foo +bar')" +echo "$(echo 'foo +bar')" +echo "$(echo 'foo\ +bar')" diff --git a/tests/read.right b/tests/read.right new file mode 100644 index 00000000..68ce898a --- /dev/null +++ b/tests/read.right @@ -0,0 +1,14 @@ +a. +-a-b- +-a-b- +-a b- +-a b- +-a-b\- +-a b\- +-\-a b\- +-\ a b\- +-\-a b\- +-\ a b\- +1: x[A] y[B] z[] +1a: +2: x[A B] diff --git a/tests/read.tests b/tests/read.tests new file mode 100644 index 00000000..ad814d6d --- /dev/null +++ b/tests/read.tests @@ -0,0 +1,24 @@ +echo " a " | (read x; echo "$x.") + +echo " a b " | ( read x y ; echo -"$x"-"$y"- ) +echo " a b\ " | ( read x y ; echo -"$x"-"$y"- ) +echo " a b " | ( read x ; echo -"$x"- ) +echo " a b\ " | ( read x ; echo -"$x"- ) + +echo " a b\ " | ( read -r x y ; echo -"$x"-"$y"- ) +echo " a b\ " | ( read -r x ; echo -"$x"- ) + +echo "\ a b\ " | ( read -r x y ; echo -"$x"-"$y"- ) +echo "\ a b\ " | ( read -r x ; echo -"$x"- ) +echo " \ a b\ " | ( read -r x y ; echo -"$x"-"$y"- ) +echo " \ a b\ " | ( read -r x ; echo -"$x"- ) + +echo "A B " > /tmp/IN +unset x y z +read x y z < /tmp/IN +echo 1: "x[$x] y[$y] z[$z]" +echo 1a: ${z-z not set} +read x < /tmp/IN +echo 2: "x[$x]" +rm /tmp/IN + diff --git a/tests/rhs-exp.right b/tests/rhs-exp.right new file mode 100644 index 00000000..87b9e43a --- /dev/null +++ b/tests/rhs-exp.right @@ -0,0 +1,68 @@ +argv[1] = <TDEFAULTS = -DSELECT_VECS='&m68kcoff_vec'> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\'&m68kcoff_vec\'> +argv[1] = <TDEFAULTS = -DSELECT_VECS=&m68kcoff_vec> +argv[1] = <TDEFAULTS = -DSELECT_VECS="&m68kcoff_vec"> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\&m68kcoff_vec\> +argv[1] = <TDEFAULTS = -DSELECT_VECS=&m68kcoff_vec> +argv[1] = <TDEFAULTS = -DSELECT_VECS=$selvecs> +argv[1] = <TDEFAULTS = -DSELECT_VECS=$selvecs> +argv[1] = <TDEFAULTS = -DSELECT_VECS='&m68kcoff_vec'> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\&m68kcoff_vec> +argv[1] = <TDEFAULTS = -DSELECT_VECS='&m68kcoff_vec'> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=$selvecs> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS='&m68kcoff_vec'> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=&m68kcoff_vec> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS="&m68kcoff_vec"> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\&m68kcoff_vec\> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=&m68kcoff_vec> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=$selvecs> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=$selvecs> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=$selvecs> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\&m68kcoff_vec> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\'&m68kcoff_vec\'> +argv[1] = <TDEFAULTS = -DSELECT_VECS=p> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\p> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\> +argv[1] = <TDEFAULTS = -DSELECT_VECS=\'> +argv[1] = <TDEFAULTS = -DSELECT_VECS='> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\p> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=p> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS='> +argv[1] = <TDEFAULTS> +argv[2] = <=> +argv[3] = <-DSELECT_VECS=\'> diff --git a/tests/rhs-exp.tests b/tests/rhs-exp.tests new file mode 100644 index 00000000..9aecb829 --- /dev/null +++ b/tests/rhs-exp.tests @@ -0,0 +1,38 @@ +selvecs='&m68kcoff_vec' +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS='$selvecs'}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\'$selvecs\'}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="$selvecs"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\"$selvecs\"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\\$selvecs\\}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=$selvecs}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\$selvecs}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="\$selvecs"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS='$selvecs'"$null"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="\\$selvecs"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="\'$selvecs\'"}" + +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS='$selvecs'} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\'$selvecs\'} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="$selvecs"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\"$selvecs\"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\\$selvecs\\} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=$selvecs} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\$selvecs} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="\$selvecs"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS='$selvecs'"$null"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="\\$selvecs"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="\'$selvecs\'"} + +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="\p"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\p}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="\\"}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\\}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\'}" +recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS="\'"}" + +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="\p"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\p} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="\\"} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\\} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS=\'} +recho TDEFAULTS = ${selvecs:+-DSELECT_VECS="\'"} diff --git a/tests/run-all b/tests/run-all index 7add6881..c4badc6b 100755..100644 --- a/tests/run-all +++ b/tests/run-all @@ -1,14 +1,20 @@ #! /bin/sh -PATH=.:$PATH # just to get the right version of printenv +PATH=.:$PATH # just to get the right version of printenv export PATH -unset ENV +# unset ENV only if it is set +[ "${ENV+set}" = "set" ] && unset ENV + +: ${THIS_SH:=../bash} +export THIS_SH + +echo Testing ${THIS_SH} echo Any output from any test indicates an anomaly worth investigating for x in run-* do case $x in - $0) ;; + $0|run-minimal) ;; *.orig|*~) ;; *) echo $x ; sh $x ;; esac diff --git a/tests/run-arith b/tests/run-arith new file mode 100644 index 00000000..f9f573c6 --- /dev/null +++ b/tests/run-arith @@ -0,0 +1,2 @@ +${THIS_SH} ./arith.tests > /tmp/xx 2>&1 +diff /tmp/xx arith.right && rm -f /tmp/xx diff --git a/tests/run-array b/tests/run-array new file mode 100644 index 00000000..57a271f1 --- /dev/null +++ b/tests/run-array @@ -0,0 +1,2 @@ +${THIS_SH} ./array.tests > /tmp/xx 2>&1 +diff /tmp/xx array.right && rm -f /tmp/xx diff --git a/tests/run-braces b/tests/run-braces new file mode 100644 index 00000000..564a96f3 --- /dev/null +++ b/tests/run-braces @@ -0,0 +1,2 @@ +${THIS_SH} ./braces-tests > /tmp/xx +diff /tmp/xx braces.right && rm -f /tmp/xx diff --git a/tests/run-dollars b/tests/run-dollars index 00ad7f10..e2300267 100755..100644 --- a/tests/run-dollars +++ b/tests/run-dollars @@ -1,3 +1,3 @@ -../bash ./dollar-star.sh a b > x 2>&1 -../bash ./dollar-at.sh a b >>x 2>&1 -diff x dollar.right && rm -f x +${THIS_SH} ./dollar-star.sh a b > /tmp/xx 2>&1 +${THIS_SH} ./dollar-at.sh a b >>/tmp/xx 2>&1 +diff /tmp/xx dollar.right && rm -f /tmp/xx diff --git a/tests/run-exp-tests b/tests/run-exp-tests index b95f6033..c55f7147 100755..100644 --- a/tests/run-exp-tests +++ b/tests/run-exp-tests @@ -1,2 +1,2 @@ -../bash ./exp-tests | grep -v '^expect' > xx -diff xx exp.right && rm -f xx +${THIS_SH} ./exp-tests | grep -v '^expect' > /tmp/xx +diff /tmp/xx exp.right && rm -f /tmp/xx diff --git a/tests/run-glob-test b/tests/run-glob-test index 1e598dc7..a01047ff 100755..100644 --- a/tests/run-glob-test +++ b/tests/run-glob-test @@ -1,4 +1,4 @@ PATH=$PATH:`pwd` export PATH -../bash ./glob-test | grep -v '^expect' > xx -diff xx glob.right && rm -f xx +${THIS_SH} ./glob-test | grep -v '^expect' > /tmp/xx +diff /tmp/xx glob.right && rm -f /tmp/xx diff --git a/tests/run-heredoc b/tests/run-heredoc new file mode 100644 index 00000000..c4e3168c --- /dev/null +++ b/tests/run-heredoc @@ -0,0 +1,2 @@ +${THIS_SH} ./heredoc.tests > /tmp/xx 2>&1 +diff /tmp/xx heredoc.right && rm -f /tmp/xx diff --git a/tests/run-ifs-tests b/tests/run-ifs-tests index 1f9c8c06..3d5fc509 100755..100644 --- a/tests/run-ifs-tests +++ b/tests/run-ifs-tests @@ -1,13 +1,13 @@ # # show that IFS is only applied to the result of expansions # -../bash ifs-test-1.sh > xx -diff xx ./ifs.1.right +${THIS_SH} ifs-test-1.sh > /tmp/xx +diff /tmp/xx ./ifs.1.right -../bash ifs-test-2.sh > xx -diff xx ./ifs.2.right +${THIS_SH} ifs-test-2.sh > /tmp/xx +diff /tmp/xx ./ifs.2.right -../bash ifs-test-3.sh > xx -diff xx ./ifs.3.right +${THIS_SH} ifs-test-3.sh > /tmp/xx +diff /tmp/xx ./ifs.3.right -rm -f xx +rm -f /tmp/xx diff --git a/tests/run-input-test b/tests/run-input-test index 25d63a0f..aaa5d35d 100755..100644 --- a/tests/run-input-test +++ b/tests/run-input-test @@ -1,2 +1,2 @@ -../bash < ./input-line.sh > xx -diff xx input.right && rm -f xx +${THIS_SH} < ./input-line.sh > /tmp/xx +diff /tmp/xx input.right && rm -f /tmp/xx diff --git a/tests/run-minus-e b/tests/run-minus-e index 51d3229c..2a91a3d2 100755..100644 --- a/tests/run-minus-e +++ b/tests/run-minus-e @@ -1,2 +1,2 @@ -../bash ./minus-e > xx -diff xx minus-e.right && rm -f xx +${THIS_SH} ./minus-e > /tmp/xx +diff /tmp/xx minus-e.right && rm -f /tmp/xx diff --git a/tests/run-more-exp b/tests/run-more-exp new file mode 100644 index 00000000..60f55cb6 --- /dev/null +++ b/tests/run-more-exp @@ -0,0 +1,2 @@ +${THIS_SH} ./more-exp.tests 2>&1 | grep -v '^expect' > /tmp/xx +diff /tmp/xx more-exp.right && rm -f /tmp/xx diff --git a/tests/run-new-exp b/tests/run-new-exp index ef57d320..a000b6b5 100755..100644 --- a/tests/run-new-exp +++ b/tests/run-new-exp @@ -1,2 +1,2 @@ -../bash ./new-exp.tests 2>&1 | grep -v '^expect' > xx -diff xx new-exp.right && rm -f xx +${THIS_SH} ./new-exp.tests 2>&1 | grep -v '^expect' > /tmp/xx +diff /tmp/xx new-exp.right && rm -f /tmp/xx diff --git a/tests/run-nquote b/tests/run-nquote new file mode 100644 index 00000000..006872c8 --- /dev/null +++ b/tests/run-nquote @@ -0,0 +1,2 @@ +${THIS_SH} ./nquote.tests 2>&1 | grep -v '^expect' > /tmp/xx +diff /tmp/xx nquote.right && rm -f /tmp/xx diff --git a/tests/run-posix2 b/tests/run-posix2 new file mode 100644 index 00000000..52eea2fa --- /dev/null +++ b/tests/run-posix2 @@ -0,0 +1,2 @@ +${THIS_SH} ./posix2.tests 2>&1 | grep -v '^expect' > /tmp/xx +diff /tmp/xx posix2.right && rm -f /tmp/xx diff --git a/tests/run-precedence b/tests/run-precedence index 9303e873..d81a8688 100755..100644 --- a/tests/run-precedence +++ b/tests/run-precedence @@ -1,2 +1,2 @@ -../bash ./precedence > xx -diff xx prec.right && rm -f xx +${THIS_SH} ./precedence > /tmp/xx +diff /tmp/xx prec.right && rm -f /tmp/xx diff --git a/tests/run-quote b/tests/run-quote new file mode 100644 index 00000000..69050428 --- /dev/null +++ b/tests/run-quote @@ -0,0 +1,2 @@ +${THIS_SH} ./quote.tests >/tmp/xx 2>&1 +diff /tmp/xx quote.right && rm -f /tmp/xx diff --git a/tests/run-read b/tests/run-read new file mode 100644 index 00000000..f2444ba8 --- /dev/null +++ b/tests/run-read @@ -0,0 +1,2 @@ +${THIS_SH} ./read.tests > /tmp/xx +diff /tmp/xx read.right && rm -f /tmp/xx diff --git a/tests/run-rhs-exp b/tests/run-rhs-exp new file mode 100644 index 00000000..1f89d0b6 --- /dev/null +++ b/tests/run-rhs-exp @@ -0,0 +1,2 @@ +${THIS_SH} ./rhs-exp.tests 2>&1 > /tmp/xx +diff /tmp/xx rhs-exp.right && rm -f /tmp/xx diff --git a/tests/run-set-e-test b/tests/run-set-e-test index 1afef169..cca61cd4 100755..100644 --- a/tests/run-set-e-test +++ b/tests/run-set-e-test @@ -1,2 +1,2 @@ -../bash ./set-e-test > xx -diff xx set-e.right && rm -f xx +${THIS_SH} ./set-e-test > /tmp/xx +diff /tmp/xx set-e.right && rm -f /tmp/xx diff --git a/tests/run-strip b/tests/run-strip index 8c97f6ff..0d321152 100755..100644 --- a/tests/run-strip +++ b/tests/run-strip @@ -1,2 +1,2 @@ -../bash ./strip.tests > xx -diff xx strip.right && rm -f xx +${THIS_SH} ./strip.tests > /tmp/xx +diff /tmp/xx strip.right && rm -f /tmp/xx diff --git a/tests/run-test b/tests/run-test new file mode 100644 index 00000000..ab13380a --- /dev/null +++ b/tests/run-test @@ -0,0 +1,2 @@ +${THIS_SH} ./test-tests 2>&1 > /tmp/xx +diff /tmp/xx test.right && rm -f /tmp/xx diff --git a/tests/run-tilde b/tests/run-tilde new file mode 100644 index 00000000..ecb7e9a2 --- /dev/null +++ b/tests/run-tilde @@ -0,0 +1,2 @@ +${THIS_SH} ./tilde-tests > /tmp/xx +diff /tmp/xx tilde.right && rm -f /tmp/xx diff --git a/tests/run-varenv b/tests/run-varenv index 04aece91..f0ce1952 100755..100644 --- a/tests/run-varenv +++ b/tests/run-varenv @@ -1,2 +1,2 @@ -../bash ./varenv.sh | grep -v '^expect' > xx -diff xx varenv.right && rm -f xx +${THIS_SH} ./varenv.sh | grep -v '^expect' > /tmp/xx +diff /tmp/xx varenv.right && rm -f /tmp/xx diff --git a/tests/set-e-test b/tests/set-e-test index ce3feb06..214ff881 100644 --- a/tests/set-e-test +++ b/tests/set-e-test @@ -14,3 +14,6 @@ if : ; then done set +e fi +# command subst should not inherit -e +set -e +echo $(false; echo ok) diff --git a/tests/set-e.right b/tests/set-e.right index 92cb7af0..61f13b24 100644 --- a/tests/set-e.right +++ b/tests/set-e.right @@ -13,3 +13,4 @@ 7 8 9 +ok diff --git a/tests/test-tests b/tests/test-tests new file mode 100644 index 00000000..1fb0dc8f --- /dev/null +++ b/tests/test-tests @@ -0,0 +1,279 @@ +t() +{ + test "$@" + echo $? +} + +echo 't -a noexist' +t -a noexist +echo 't -a run-all' +t -a run-all + +echo 't -b run-all' +t -b run-all +echo 't -b /dev/jb1a' +t -b /dev/jb1a + +echo 't -c run-all' +t -c run-all +echo 't -c /dev/tty' +t -c /dev/tty + +echo 't -d run-all' +t -d run-all +echo 't -d /etc' +t -d /etc + +echo 't -e noexist' +t -e noexist +echo 't -e run-all' +t -e run-all + +echo 't -f noexist' +t -f noexist +echo 't -f /dev/tty' +t -f /dev/tty +echo 't -f run-all' +t -f run-all + +echo 't -g run-all' +t -g run-all + +touch /tmp/test.setgid +chmod ug+x /tmp/test.setgid +chmod g+s /tmp/test.setgid +echo 't -g /tmp/test.setgid' +t -g /tmp/test.setgid +rm -f /tmp/test.setgid + +echo 't -k run-all' +t -k run-all + +echo 't -n ""' +t -n "" +echo 't -n "hello"' +t -n "hello" + +echo 't -p run-all' +t -p run-all + +echo 't -r noexist' +t -r noexist + +touch /tmp/test.noread +chmod a-r /tmp/test.noread +echo 't -r /tmp/test.noread' +t -r /tmp/test.noread +rm -f /tmp/test.noread + +echo 't -r run-all' +t -r run-all + +echo 't -s noexist' +t -s noexist +echo 't -s /dev/null' +t -s /dev/null +echo 't -s run-all' +t -s run-all + +echo 't -t 20' +t -t 20 +echo 't -t 0' +t -t 0 + +echo 't -u noexist' +t -u noexist + +echo 't -u run-all' +t -u run-all + +touch /tmp/test.setuid +chmod u+x /tmp/test.setuid # some systems require this to turn on setuid bit +chmod u+s /tmp/test.setuid +echo 't -u /tmp/test.setuid' +t -u /tmp/test.setuid +rm -f /tmp/test.setuid + +echo 't -w noexist' +t -w noexist + +touch /tmp/test.nowrite +chmod a-w /tmp/test.nowrite +echo 't -w /tmp/test.nowrite' +t -w /tmp/test.nowrite +rm -f /tmp/test.nowrite + +echo 't -w /dev/null' +t -w /dev/null + +echo 't -x noexist' +t -x noexist + +touch /tmp/test.exec +chmod u+x /tmp/test.exec +echo 't -x /tmp/test.exec' +t -x /tmp/test.exec +rm -f /tmp/test.exec + +touch /tmp/test.noexec +chmod u-x /tmp/test.noexec +echo 't -x /tmp/test.noexec' +t -x /tmp/test.noexec +rm -f /tmp/test.noexec + +echo 't -z ""' +t -z "" +echo 't -z "foo"' +t -z "foo" + +echo 't "foo"' +t "foo" +echo 't ""' +t "" + +touch /tmp/test.owner +echo 't -O /tmp/test.owner' +t -O /tmp/test.owner +rm -f /tmp/test.owner + +echo 't "hello" = "hello"' +t "hello" = "hello" +echo 't "hello" = "goodbye"' +t "hello" = "goodbye" + +echo 't "hello" == "hello"' +t "hello" == "hello" +echo 't "hello" == "goodbye"' +t "hello" == "goodbye" + +echo 't "hello" != "hello"' +t "hello" != "hello" +echo 't "hello" != "goodbye"' +t "hello" != "goodbye" + +echo 't "hello" < "goodbye"' +t "hello" \< "goodbye" +echo 't "hello" > "goodbye"' +t "hello" \> "goodbye" + +echo 't ! "hello" > "goodbye"' +t "! hello" \> "goodbye" + +echo 't 200 -eq 200' +t 200 -eq 200 +echo 't 34 -eq 222' +t 34 -eq 222 + +echo 't 200 -ne 200' +t 200 -ne 200 +echo 't 34 -ne 222' +t 34 -ne 222 + +echo 't 200 -gt 200' +t 200 -gt 200 +echo 't 340 -gt 222' +t 340 -gt 222 + +echo 't 200 -ge 200' +t 200 -ge 200 +echo 't 34 -ge 222' +t 34 -ge 222 + +echo 't 200 -lt 200' +t 200 -lt 200 +echo 't 34 -lt 222' +t 34 -lt 222 + +echo 't 200 -le 200' +t 200 -le 200 +echo 't 340 -le 222' +t 340 -le 222 + +echo 't 700 -le 1000 -a -n "1" -a "20" = "20"' +t 700 -le 1000 -a -n "1" -a "20" = "20" +echo 't ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \)' +t ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \) + +touch /tmp/abc +sleep 2 +touch /tmp/def + +echo 't /tmp/abc -nt /tmp/def' +t /tmp/abc -nt /tmp/def +echo 't /tmp/abc -ot /tmp/def' +t /tmp/abc -ot /tmp/def +echo 't /tmp/def -nt /tmp/abc' +t /tmp/def -nt /tmp/abc +echo 't /tmp/def -ot /tmp/abc' +t /tmp/def -ot /tmp/abc + +echo 't /tmp/abc -ef /tmp/def' +t /tmp/abc -ef /tmp/def +ln /tmp/abc /tmp/ghi +echo 't /tmp/abc -ef /tmp/ghi' +t /tmp/abc -ef /tmp/ghi + +rm /tmp/abc /tmp/def /tmp/ghi + +echo 't -r /dev/fd/0' +t -r /dev/fd/0 +echo 't -w /dev/fd/1' +t -w /dev/fd/1 +echo 't -w /dev/fd/2' +t -w /dev/fd/2 +echo 't' +t + +echo 't 12 -eq 34' +t 12 -eq 34 +echo 't ! 12 -eq 34' +t ! 12 -eq 34 + +echo 't -n abcd -o aaa' +t -n abcd -o aaa +echo 't -n abcd -o -z aaa' +t -n abcd -o -z aaa + +echo 't -n abcd -a aaa' +t -n abcd -a aaa +echo 't -n abcd -a -z aaa' +t -n abcd -a -z aaa + +set +o allexport +echo 't -o allexport' +t -o allexport +echo 't ! -o allexport' +t ! -o allexport + +echo 't xx -a yy' +t xx -a yy +echo 't xx -o ""' +t xx -o "" +echo 't xx -a ""' +t xx -a "" + +echo 't -X -a -X' +t -X -a -X +echo 't -X -o -X' +t -X -o -X +echo 't -X -o ""' +t -X -o "" +echo 't -X -a ""' +t -X -a "" +echo 't "" -a -X' +t "" -a -X +echo 't "" -o -X' +t "" -o -X +echo 't "" -a ""' +t "" -a "" +echo 't "" -o ""' +t "" -o "" +echo 't true -o -X' +t true -o -X +echo 't true -a -X' +t true -a -X + +echo 't ( -E )' +t \( -E \) +echo 't ( "" )' +t \( "" \) diff --git a/tests/test.right b/tests/test.right new file mode 100644 index 00000000..9acf6c86 --- /dev/null +++ b/tests/test.right @@ -0,0 +1,194 @@ +t -a noexist +1 +t -a run-all +0 +t -b run-all +1 +t -b /dev/jb1a +1 +t -c run-all +1 +t -c /dev/tty +0 +t -d run-all +1 +t -d /etc +0 +t -e noexist +1 +t -e run-all +0 +t -f noexist +1 +t -f /dev/tty +1 +t -f run-all +0 +t -g run-all +1 +t -g /tmp/test.setgid +0 +t -k run-all +1 +t -n "" +1 +t -n "hello" +0 +t -p run-all +1 +t -r noexist +1 +t -r /tmp/test.noread +1 +t -r run-all +0 +t -s noexist +1 +t -s /dev/null +1 +t -s run-all +0 +t -t 20 +1 +t -t 0 +0 +t -u noexist +1 +t -u run-all +1 +t -u /tmp/test.setuid +0 +t -w noexist +1 +t -w /tmp/test.nowrite +1 +t -w /dev/null +0 +t -x noexist +1 +t -x /tmp/test.exec +0 +t -x /tmp/test.noexec +1 +t -z "" +0 +t -z "foo" +1 +t "foo" +0 +t "" +1 +t -O /tmp/test.owner +0 +t "hello" = "hello" +0 +t "hello" = "goodbye" +1 +t "hello" == "hello" +0 +t "hello" == "goodbye" +1 +t "hello" != "hello" +1 +t "hello" != "goodbye" +0 +t "hello" < "goodbye" +1 +t "hello" > "goodbye" +0 +t ! "hello" > "goodbye" +1 +t 200 -eq 200 +0 +t 34 -eq 222 +1 +t 200 -ne 200 +1 +t 34 -ne 222 +0 +t 200 -gt 200 +1 +t 340 -gt 222 +0 +t 200 -ge 200 +0 +t 34 -ge 222 +1 +t 200 -lt 200 +1 +t 34 -lt 222 +0 +t 200 -le 200 +0 +t 340 -le 222 +1 +t 700 -le 1000 -a -n "1" -a "20" = "20" +0 +t ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \) +1 +t /tmp/abc -nt /tmp/def +1 +t /tmp/abc -ot /tmp/def +0 +t /tmp/def -nt /tmp/abc +0 +t /tmp/def -ot /tmp/abc +1 +t /tmp/abc -ef /tmp/def +1 +t /tmp/abc -ef /tmp/ghi +0 +t -r /dev/fd/0 +0 +t -w /dev/fd/1 +0 +t -w /dev/fd/2 +0 +t +1 +t 12 -eq 34 +1 +t ! 12 -eq 34 +0 +t -n abcd -o aaa +0 +t -n abcd -o -z aaa +0 +t -n abcd -a aaa +0 +t -n abcd -a -z aaa +1 +t -o allexport +1 +t ! -o allexport +0 +t xx -a yy +0 +t xx -o "" +0 +t xx -a "" +1 +t -X -a -X +0 +t -X -o -X +0 +t -X -o "" +0 +t -X -a "" +1 +t "" -a -X +1 +t "" -o -X +0 +t "" -a "" +1 +t "" -o "" +1 +t true -o -X +0 +t true -a -X +0 +t ( -E ) +0 +t ( "" ) +1 diff --git a/tests/tilde-tests b/tests/tilde-tests index a5107514..f0acd558 100644 --- a/tests/tilde-tests +++ b/tests/tilde-tests @@ -1,8 +1,7 @@ HOME=/usr/xyz -set -v -echo ~chet +SHELL=~/bash echo ~ch\et -echo ~chet/"foo" +echo ~/"foo" echo "~chet"/"foo" echo \~chet/"foo" echo \~chet/bar @@ -11,6 +10,30 @@ echo ~chet""/bar echo ":~chet/" echo abcd~chet echo "SHELL=~/bash" -echo SHELL=~/bash +echo $SHELL echo abcd:~chet -echo PATH=/usr/ucb:/bin:~/bin:~/tmp/bin:/usr/bin +path=/usr/ucb:/bin:~/bin:~/tmp/bin:/usr/bin +echo $path + +cd /usr +cd /tmp +echo ~- +echo ~+ + +XPATH=/bin:/usr/bin:. + +# yes tilde expansion +PPATH=$XPATH:~/bin +echo "$PPATH" + +# no tilde expansion +PPATH="$XPATH:~/bin" +echo "$PPATH" + +# yes tilde expansion +export PPATH=$XPATH:~/bin +echo "$PPATH" + +# no tilde expansion +export PPATH="$XPATH:~/bin" +echo "$PPATH" diff --git a/tests/tilde.right b/tests/tilde.right index 2920187e..c07ade1a 100644 --- a/tests/tilde.right +++ b/tests/tilde.right @@ -1,6 +1,5 @@ -/usr/homes/chet ~chet -/usr/homes/chet/foo +/usr/xyz/foo ~chet/foo ~chet/foo ~chet/bar @@ -9,6 +8,12 @@ :~chet/ abcd~chet SHELL=~/bash -SHELL=/usr/xyz/bash +/usr/xyz/bash abcd:~chet -PATH=/usr/ucb:/bin:~/bin:~/tmp/bin:/usr/bin +/usr/ucb:/bin:/usr/xyz/bin:/usr/xyz/tmp/bin:/usr/bin +/usr +/tmp +/bin:/usr/bin:.:/usr/xyz/bin +/bin:/usr/bin:.:~/bin +/bin:/usr/bin:.:/usr/xyz/bin +/bin:/usr/bin:.:~/bin diff --git a/tests/varenv.right b/tests/varenv.right index 74ce5d30..35972b79 100644 --- a/tests/varenv.right +++ b/tests/varenv.right @@ -12,3 +12,4 @@ /a/b/c /a/b/c 1 2 1 1 +unset diff --git a/tests/varenv.sh b/tests/varenv.sh index d6bd4e52..9938cbac 100644 --- a/tests/varenv.sh +++ b/tests/varenv.sh @@ -92,3 +92,14 @@ echo $c $d d=$c c=$d expect "1 1" echo $c $d + +# just for completeness +unset d c +expect unset +echo ${d-unset} + +# no output +export a +a=bcde +export a +/bin/true 2>/dev/null |
