diff options
author | jilles <jilles@FreeBSD.org> | 2010-05-09 17:10:50 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2010-05-09 17:10:50 +0000 |
commit | c0ec19525dbe9ab467e36097e42c2ecc28260982 (patch) | |
tree | 98514d40256d3a99b948ca95cb51b3e8e1dc8727 | |
parent | 684507e744872ba607fb04d7ec1b56c7ef4c68a4 (diff) | |
download | FreeBSD-src-c0ec19525dbe9ab467e36097e42c2ecc28260982.zip FreeBSD-src-c0ec19525dbe9ab467e36097e42c2ecc28260982.tar.gz |
sh: Add some parser tests.
case1.0 tests POSIX requirements and one more for keywords in case
statements. The others test very special cases of command substitution.
These also work on stable/8.
-rw-r--r-- | tools/regression/bin/sh/parser/case1.0 | 14 | ||||
-rw-r--r-- | tools/regression/bin/sh/parser/case2.0 | 32 | ||||
-rw-r--r-- | tools/regression/bin/sh/parser/heredoc3.0 | 7 |
3 files changed, 53 insertions, 0 deletions
diff --git a/tools/regression/bin/sh/parser/case1.0 b/tools/regression/bin/sh/parser/case1.0 new file mode 100644 index 0000000..49b4c45 --- /dev/null +++ b/tools/regression/bin/sh/parser/case1.0 @@ -0,0 +1,14 @@ +# $FreeBSD$ + +keywords='if then else elif fi while until for do done { } case esac ! in' + +# Keywords can be used unquoted in case statements, except the keyword +# esac as the first pattern of a '|' alternation without a starting '('. +# (POSIX doesn't seem to require (esac) to work.) +for k in $keywords; do + eval "case $k in (foo|$k) ;; *) echo bad ;; esac" + eval "case $k in ($k) ;; *) echo bad ;; esac" + eval "case $k in foo|$k) ;; *) echo bad ;; esac" + [ "$k" = esac ] && continue + eval "case $k in $k) ;; *) echo bad ;; esac" +done diff --git a/tools/regression/bin/sh/parser/case2.0 b/tools/regression/bin/sh/parser/case2.0 new file mode 100644 index 0000000..14610e4 --- /dev/null +++ b/tools/regression/bin/sh/parser/case2.0 @@ -0,0 +1,32 @@ +# $FreeBSD$ + +# Pretty much only ash derivatives can parse all of this. + +f1() { + x=$(case x in + (x|esac) ;; + (*) echo bad >&2 ;; + esac) +} +f1 +f2() { + x=$(case x in + (x|esac) ;; + (*) echo bad >&2 + esac) +} +f2 +f3() { + x=$(case x in + x|esac) ;; + *) echo bad >&2 ;; + esac) +} +f3 +f4() { + x=$(case x in + x|esac) ;; + *) echo bad >&2 + esac) +} +f4 diff --git a/tools/regression/bin/sh/parser/heredoc3.0 b/tools/regression/bin/sh/parser/heredoc3.0 new file mode 100644 index 0000000..b250272 --- /dev/null +++ b/tools/regression/bin/sh/parser/heredoc3.0 @@ -0,0 +1,7 @@ +# $FreeBSD$ + +# This may be expected to work, but pretty much only ash derivatives allow it. + +test "$(cat <<EOF)" = "hi there" +hi there +EOF |