diff options
Diffstat (limited to 'tests/t0036-lang-string.sh')
| -rwxr-xr-x | tests/t0036-lang-string.sh | 120 |
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'" |
