summaryrefslogtreecommitdiff
path: root/tests/t0036-lang-string.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/t0036-lang-string.sh')
-rwxr-xr-xtests/t0036-lang-string.sh120
1 files changed, 120 insertions, 0 deletions
diff --git a/tests/t0036-lang-string.sh b/tests/t0036-lang-string.sh
new file mode 100755
index 0000000..8e40022
--- /dev/null
+++ b/tests/t0036-lang-string.sh
@@ -0,0 +1,120 @@
+#!/bin/sh
+set -eu
+dir="${TMPDIR-/tmp}/mcpu-cpp-lang-string-$$"
+mkdir -p "$dir"
+trap 'rm -rf "$dir"' EXIT HUP INT TERM
+
+cat > "$dir/normalize.c" <<'EOT'
+ # lang "DiFf"
+#endlang
+ #lang "dIfT"
+#endlang
+EOT
+"$MCPU_CPP" --no-config "$dir/normalize.c" -o "$dir/normalize.out"
+grep '^#lang "DiFf"$' "$dir/normalize.out" >/dev/null
+grep '^#lang "dIfT"$' "$dir/normalize.out" >/dev/null
+if grep '^[[:space:]][[:space:]]*#lang' "$dir/normalize.out" >/dev/null
+then
+ echo '#lang leading whitespace was not normalized' >&2
+ exit 1
+fi
+
+cat > "$dir/case.c" <<'EOT'
+#lang "diff"
+#endlang
+#lang "Diff"
+#endlang
+#lang "DIFF"
+#endlang
+#lang "dIfF"
+y' = 1;
+#endlang
+#lang "dIfT"
+#endlang
+#lang "ALG"
+#endlang
+#lang "As"
+#endlang
+#lang "aVm"
+#endlang
+#lang "aCs"
+#endlang
+EOT
+"$MCPU_CPP" --no-config "$dir/case.c" -o "$dir/case.out"
+for spelling in diff Diff DIFF dIfF dIfT ALG As aVm aCs
+do
+ grep "^#lang \"$spelling\"$" "$dir/case.out" >/dev/null
+done
+grep "^y' = 1;$" "$dir/case.out" >/dev/null
+
+check_bad()
+{
+ name=$1
+ pattern=$2
+ if "$MCPU_CPP" --no-config "$dir/$name.c" -o "$dir/$name.out" 2> "$dir/$name.err"
+ then
+ echo "$name unexpectedly accepted" >&2
+ exit 1
+ fi
+ grep -F "$pattern" "$dir/$name.err" >/dev/null
+}
+
+cat > "$dir/unquoted.c" <<'EOT'
+#lang diff
+EOT
+check_bad unquoted 'string constant expected after #lang'
+
+cat > "$dir/empty.c" <<'EOT'
+#lang ""
+EOT
+check_bad empty 'empty language name in #lang'
+
+cat > "$dir/leading-space.c" <<'EOT'
+#lang " diff"
+EOT
+check_bad leading-space 'one word without whitespace'
+
+cat > "$dir/trailing-space.c" <<'EOT'
+#lang "diff "
+EOT
+check_bad trailing-space 'one word without whitespace'
+
+cat > "$dir/internal-space.c" <<'EOT'
+#lang "di ff"
+EOT
+check_bad internal-space 'one word without whitespace'
+
+printf '#lang "di\tff"\n' > "$dir/internal-tab.c"
+check_bad internal-tab 'one word without whitespace'
+
+cat > "$dir/unknown.c" <<'EOT'
+#lang "cplusplus"
+EOT
+check_bad unknown "unknown language 'cplusplus'"
+
+cat > "$dir/zero.c" <<'EOT'
+#lang "0"
+EOT
+check_bad zero "unknown language '0'"
+
+cat > "$dir/extra.c" <<'EOT'
+#lang "diff" extra
+EOT
+check_bad extra 'extra text after #lang string constant'
+
+cat > "$dir/multiline.c" <<'EOT'
+#lang "di
+ff"
+EOT
+check_bad multiline 'unterminated #lang string constant'
+
+cat > "$dir/spliced.c" <<'EOT'
+#lang "di\
+ff"
+EOT
+check_bad spliced 'one physical source line'
+
+cat > "$dir/no-escape.c" <<'EOT'
+#lang "d\iff"
+EOT
+check_bad no-escape "unknown language 'd\\iff'"