aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/sh.test47
1 files changed, 45 insertions, 2 deletions
diff --git a/tests/sh.test b/tests/sh.test
index 4fae2062..de5a433c 100644
--- a/tests/sh.test
+++ b/tests/sh.test
@@ -1,5 +1,31 @@
#!/bin/echo no
+# // ${#} ${#x} ${#@} ${#x[@]} ${#!} ${!#}
+# // ${!} ${!@} ${!@Q} ${!x} ${!x@} ${!x@Q} ${!x#} ${!x[} ${!x[*]}
+
+# Looked like a prefix but wasn't: three chars (@ # -) are both paremeter name
+# and slice operator. When immediately followed by } it's parameter, otherwise
+# otherwise we did NOT have a prefix and it's an operator.
+#
+# ${#-} ${#-abc}
+# ${##} ${##0}
+# ${#@} ${#@Q}
+#
+# backslash not discarded: echo "abc\"def"
+
+# ${x:-y} use default
+# ${x:=y} assign default (error if positional)
+# ${x:?y} err if null
+# ${x:+y} alt value
+# ${x:off} ${x:off:len} off<0 from end (must ": -"), len<0 also from end must
+# 0-based indexing
+# ${@:off:len} positional parameters, off -1 = len, -len is error
+# 1-based indexing
+
+# [] wins over +()
+# touch 'AB[DEF]'; echo AB[+(DEF]) AB[+(DEF)?
+# AB[+(DEF]) AB[DEF]
+
# Testing shell corner cases _within_ a shell script is kind of hard.
[ -f testing.sh ] && . testing.sh
@@ -36,6 +62,9 @@ testing '-c args2' "\$SH -c 'echo \${10}' a b c d e f g h i j k l" "k\n" "" ""
testing '-c arg split' \
"$SH -c 'for i in a\"\$@\"b;do echo =\$i=;done;echo \$0' 123 456 789" \
"=a456=\n=789b=\n123\n" "" ""
+testing '-c arg split2' \
+ "$SH -c 'for i in a\"\$* \$@\"b; do echo =\$i=;done' one two three four five"\
+ "=atwo three four five two=\n=three=\n=four=\n=fiveb=\n" "" ""
testing '-c arg count' "$SH -c 'echo \$#' 9 8 7 6 1 2 3 4" "7\n" "" ""
testing "exec3" '$C -c "{ exec readlink /proc/self/fd/0;} < /proc/self/exe"' \
"$(readlink -f $C)\n" "" ""
@@ -159,6 +188,8 @@ testing "leading variable assignment" 'abc=def env | grep ^abc=; echo $abc' \
testing "leading variable assignments" \
"abc=def ghi=jkl env | egrep '^(abc|ghi)=' | sort; echo \$abc \$ghi" \
"abc=def\nghi=jkl\n\n" "" ""
+testing "leading assignment occurs after parsing" \
+ 'abc=def; abc=ghi echo $abc' "def\n" "" ""
testing "leading assignment space" 'X="abc def"; Y=$X; echo "$Y"' \
"abc def\n" "" ""
testing "leading assignment space2" \
@@ -253,11 +284,11 @@ testing "subshell splitting" 'for i in $(true); do echo =$i=; done' "" "" ""
#testing "subshell split 2"
# variable assignment argument splitting only performed for "$@"
-testing "assignment splitting" 'X="one two"; Y=$X; echo $Y' "one two\n" "" ""
+testing "assignment nosplit" 'X="one two"; Y=$X; echo $Y' "one two\n" "" ""
testing "argument splitting" \
'chicken() { for i in a"$@"b;do echo =$i=;done;}; chicken 123 456 789' \
"=a123=\n=456=\n=789b=\n" "" ""
-testing "assignment splitting2" 'pop(){ X="$@";};pop one two three; echo $X' \
+testing "assignment nosplit2" 'pop(){ X="$@";};pop one two three; echo $X' \
"one two three\n" "" ""
#testing "leading assignments don't affect current line" \
@@ -396,6 +427,8 @@ testing 'IFS wildcards' \
'abc\ndef\nwallpapers\nwalrus\n' '' ''
rm -f walrus wallpapers
+# Force parsing granularity via interactive shxpect because bash parses all
+# of sh -c "str" in one go, meaning the "shopt -s extglob" won't take effect
shxpect 'IFS +(extglob)' I$'shopt -s extglob\n' E"$P" \
I$'IFS=x; ABC=cxd; for i in +($ABC); do echo =$i=; done\n' \
O$'=+(c=\n' O$'=d)=\n'
@@ -404,6 +437,16 @@ touch abc\)d
shxpect 'IFS +(extglob) 2' I$'shopt -s extglob\n' E"$P" \
I$'ABC="c?d"; for i in ab+($ABC); do echo =$i=; done\n' \
O$'=abc)d=\n'
+rm abc\)d
+
+shxpect '[+(]) overlap priority' I$'shopt -s extglob\n' E"$P" \
+ I$'touch "AB[DEF]"; echo AB[+(DEF]) AB[+(DEF)? AB+([DEF)]\n' \
+ O$'AB[+(DEF]) AB[DEF] AB+([DEF)]\n' \
+ I$'X="("; Y=")"; echo AB[+${X}DEF${Y}?\n' O$'AB[DEF]\n'
+
+# TODO: syntax error takes out ': ${a?b}; echo $?' (I.E. never runs echo)
+shxpect '${a?b} sets err, stops cmdline eval' \
+ I$': ${a?b} ${c:=d}\n' E E"$P" I$'echo $?$c\n' O$'1\n'
# TODO finish variable list from shell init