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 2010-03-07 18:43:29 +00:00
parent 2ef52c99e0
commit d8e6dbd422
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