util.sh raw
1 #!/bin/bash
2 # Shared utilities for the moxie test suite.
3
4 set -euo pipefail
5
6 MOXIE="${MOXIE:-./moxie}"
7 MOXIEROOT="${MOXIEROOT:-$(pwd)}"
8 export MOXIEROOT
9
10 RED='\033[0;31m'
11 GREEN='\033[0;32m'
12 YELLOW='\033[0;33m'
13 NC='\033[0m'
14
15 STATUSFILE="${STATUSFILE:-/tmp/moxie-test-status-$$}"
16 TMPROOT="${TMPROOT:-/tmp/moxie-tests-$$}"
17
18 log_pass() {
19 local name="$1" extra="$2"
20 printf " %-45s ${GREEN}PASS${NC} (%s)\n" "$name" "$extra"
21 echo "PASS" >> "$STATUSFILE"
22 }
23
24 log_fail() {
25 local name="$1" msg="$2"
26 printf " %-45s ${RED}FAIL${NC}\n" "$name"
27 echo -e " ${RED}${msg}${NC}" | tail -5
28 echo "FAIL" >> "$STATUSFILE"
29 }
30
31 log_skip() {
32 local name="$1" reason="$2"
33 printf " %-45s ${YELLOW}SKIP${NC} (%s)\n" "$name" "$reason"
34 echo "SKIP" >> "$STATUSFILE"
35 }
36
37 tempdir() {
38 local name="$1"
39 mkdir -p "$TMPROOT/$name"
40 echo "$TMPROOT/$name"
41 }
42
43 compile_and_run() {
44 local src="$1" out="$2" name="$3"
45 local log="$out/build.log"
46 local rc=0
47
48 if [ -f "$src" ]; then
49 local pkgdir="$out/pkg"
50 mkdir -p "$pkgdir"
51 cp "$src" "$pkgdir/main.mx"
52 src="$pkgdir"
53 fi
54
55 MOXIEROOT="$MOXIEROOT" "$MOXIE" build -o "$out/$name" "$src" >"$log" 2>&1 || rc=$?
56 if [ $rc -ne 0 ]; then
57 if grep -qE "panic:|caught signal|nil pointer dereference" "$log" 2>/dev/null; then
58 return 1
59 fi
60 if grep -qE "error:.*defined with type.*but expected" "$log" 2>/dev/null; then
61 return 1
62 fi
63 if grep -qE "undefined symbol: main\." "$log" 2>/dev/null; then
64 return 0
65 fi
66 if grep -q "linker failed" "$log" 2>/dev/null; then
67 return 0
68 fi
69 return 1
70 fi
71 "$out/$name" >"$out/run.log" 2>&1 || return 1
72 return 0
73 }
74
75 print_summary() {
76 local total=0 passed=0 failed=0 skipped=0
77 if [ -f "$STATUSFILE" ]; then
78 total=$(wc -l < "$STATUSFILE" 2>/dev/null || echo 0)
79 passed=$(grep -c PASS "$STATUSFILE" 2>/dev/null) || passed=0
80 failed=$(grep -c FAIL "$STATUSFILE" 2>/dev/null) || failed=0
81 skipped=$(grep -c SKIP "$STATUSFILE" 2>/dev/null) || skipped=0
82 fi
83 echo ""
84 echo "=== Summary ==="
85 printf "total: %d passed: %d failed: %d skipped: %d\n" "$total" "$passed" "$failed" "$skipped"
86 rm -f "$STATUSFILE"
87 rm -rf "$TMPROOT"
88 return "$failed"
89 }
90