sh: Add some testcases for ${v=w}, ${v-w}, ${v+w}.

These expansions, which were already in the Bourne shell, work correctly for
the most part. The testcases are only about the parts that already work
correctly.
This commit is contained in:
Jilles Tjoelker 2010-03-07 18:43:29 +00:00
parent 9df3a16421
commit 0de1173276
2 changed files with 118 additions and 0 deletions

View File

@ -0,0 +1,37 @@
# $FreeBSD$
e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
h='##'
failures=''
ok=''
testcase() {
code="$1"
expected="$2"
oIFS="$IFS"
eval "$code"
IFS='|'
result="$#|$*"
IFS="$oIFS"
if [ "x$result" = "x$expected" ]; then
ok=x$ok
else
failures=x$failures
echo "For $code, expected $expected actual $result"
fi
}
testcase 'v=; set -- ${v=a b} $v' '0|'
testcase 'unset v; set -- ${v=a b} $v' '4|a|b|a|b'
testcase 'v=; set -- ${v:=a b} $v' '4|a|b|a|b'
testcase 'v=; set -- "${v:=a b}" "$v"' '2|a b|a b'
# expect sensible behaviour, although it disagrees with POSIX
testcase 'v=; set -- ${v:=a\ b} $v' '4|a|b|a|b'
testcase 'v=; set -- ${v:=$p} $v' '2|/etc/|/etc/'
testcase 'v=; set -- "${v:=$p}" "$v"' '2|/et[c]/|/et[c]/'
testcase 'v=; set -- "${v:=a\ b}" "$v"' '2|a\ b|a\ b'
testcase 'v=; set -- ${v:="$p"} $v' '2|/etc/|/etc/'
# whether $p is quoted or not shouldn't really matter
testcase 'v=; set -- "${v:="$p"}" "$v"' '2|/et[c]/|/et[c]/'
test "x$failures" = x

View File

@ -0,0 +1,81 @@
# $FreeBSD$
e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
h='##'
failures=''
ok=''
testcase() {
code="$1"
expected="$2"
oIFS="$IFS"
eval "$code"
IFS='|'
result="$#|$*"
IFS="$oIFS"
if [ "x$result" = "x$expected" ]; then
ok=x$ok
else
failures=x$failures
echo "For $code, expected $expected actual $result"
fi
}
testcase 'set -- a b' '2|a|b'
testcase 'set --' '0|'
testcase 'set -- ${e}' '0|'
testcase 'set -- "${e}"' '1|'
testcase 'set -- $p' '1|/etc/'
testcase 'set -- "$p"' '1|/et[c]/'
testcase 'set -- ${s+$p}' '1|/etc/'
testcase 'set -- "${s+$p}"' '1|/et[c]/'
testcase 'set -- ${s+"$p"}' '1|/et[c]/'
# Dquotes in dquotes is undefined for Bourne shell operators
#testcase 'set -- "${s+"$p"}"' '1|/et[c]/'
testcase 'set -- ${e:-$p}' '1|/etc/'
testcase 'set -- "${e:-$p}"' '1|/et[c]/'
testcase 'set -- ${e:-"$p"}' '1|/et[c]/'
# Dquotes in dquotes is undefined for Bourne shell operators
#testcase 'set -- "${e:-"$p"}"' '1|/et[c]/'
testcase 'set -- ${e:+"$e"}' '0|'
testcase 'set -- ${e:+$w"$e"}' '0|'
testcase 'set -- ${w:+"$w"}' '1|a b c'
testcase 'set -- ${w:+$w"$w"}' '3|a|b|ca b c'
# These two are known broken in FreeBSD /bin/sh
#testcase 'set -- ${s+a b}' '2|a|b'
#testcase 'set -- ${e:-a b}' '2|a|b'
testcase 'set -- "${s+a b}"' '1|a b'
testcase 'set -- "${e:-a b}"' '1|a b'
testcase 'set -- ${e:-\}}' '1|}'
# Currently broken in FreeBSD /bin/sh
#testcase 'set -- "${e:-\}}"' '1|}'
testcase 'set -- ${e:+{}}' '1|}'
testcase 'set -- "${e:+{}}"' '1|}'
testcase 'set -- ${e+x}${e+x}' '1|xx'
testcase 'set -- "${e+x}"${e+x}' '1|xx'
testcase 'set -- ${e+x}"${e+x}"' '1|xx'
testcase 'set -- "${e+x}${e+x}"' '1|xx'
testcase 'set -- "${e+x}""${e+x}"' '1|xx'
testcase 'set -- ${e:-${e:-$p}}' '1|/etc/'
testcase 'set -- "${e:-${e:-$p}}"' '1|/et[c]/'
testcase 'set -- ${e:-"${e:-$p}"}' '1|/et[c]/'
testcase 'set -- ${e:-${e:-"$p"}}' '1|/et[c]/'
testcase 'set -- ${e:-${e:-${e:-$w}}}' '3|a|b|c'
testcase 'set -- ${e:-${e:-${e:-"$w"}}}' '1|a b c'
testcase 'set -- ${e:-${e:-"${e:-$w}"}}' '1|a b c'
testcase 'set -- ${e:-"${e:-${e:-$w}}"}' '1|a b c'
testcase 'set -- "${e:-${e:-${e:-$w}}}"' '1|a b c'
testcase 'shift $#; set -- ${1+"$@"}' '0|'
testcase 'set -- ""; set -- ${1+"$@"}' '1|'
testcase 'set -- "" a; set -- ${1+"$@"}' '2||a'
testcase 'set -- a ""; set -- ${1+"$@"}' '2|a|'
testcase 'set -- a b; set -- ${1+"$@"}' '2|a|b'
testcase 'set -- a\ b; set -- ${1+"$@"}' '1|a b'
testcase 'set -- " " ""; set -- ${1+"$@"}' '2| |'
test "x$failures" = x