blob: 064aa1a393dc235ec47334f392c60772dfe80bf8 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/bin/bash
# exit status of zy: a program that fails to compile (syntax, type or analyzer
# error, or too many errors) exits 1; a good program exits 0; a runtime trap
# (bounds, overflow, out of memory, bad pointer) exits 2. usage:
# tests/exitstatus.sh [VM]. prints one line per case and exits 1 when any
# case is wrong.
vm=${1:-build/bin/zy}
T=$(mktemp -d); trap 'rm -rf "$T"' EXIT
fail=0
want() { # status description < program
cat > "$T/p.zc"; "$vm" < "$T/p.zc" > "$T/out" 2>&1; local r=$?
if [ "$r" = "$1" ]; then echo "ok $2 (exit $r)"; else echo "FAIL $2: exit $r, want $1: $(head -c 200 "$T/out")"; fail=1; fi
}
want 0 "a good program" <<< $'namespace;\ninclude rt;\nfn main() { rt.put_n(1); return 0; }'
want 1 "a syntax error" <<< $'namespace;\ninclude rt;\nfn main() { int a = ; return 0; }'
want 1 "a module access without include" <<< $'fn main() { rt.put_n(1); return 0; }'
want 1 "an undefined name" <<< $'namespace;\ninclude rt;\nfn main() { rt.put_n(nosuch); return 0; }'
want 1 "a type error" < tests/typeerrors/arg.zc
want 1 "an analyzer error" < tests/errors/alias_field.zc
want 1 "twenty errors" < <(printf 'namespace;\ninclude rt;\nfn main() {\n'; for i in $(seq 25); do echo " int a$i = ;"; done; echo ' return 0; }')
want 2 "a bounds trap" < tests/programs/bounds_heap.zc
want 0 "an explicit halt" <<< $'namespace;\ninclude rt;\nfn main() { rt.put_n(1); rt.halt(); return 3; }'
exit $fail
|