run.sh raw

   1  #!/bin/bash
   2  # Spawn test suite for Moxie.
   3  # Runs each test program through the moxie compiler and checks results.
   4  set -euo pipefail
   5  
   6  MOXIE="${MOXIE:-./moxie}"
   7  MOXIEROOT="${MOXIEROOT:-$(cd "$(dirname "$0")/../.." && pwd)}"
   8  export MOXIEROOT
   9  TESTDIR="$(cd "$(dirname "$0")" && pwd)"
  10  TMPDIR=$(mktemp -d)
  11  STAGEROOT="$MOXIEROOT/tests/_spawn_stage_$$"
  12  mkdir -p "$STAGEROOT"
  13  trap "rm -rf $TMPDIR $STAGEROOT" EXIT
  14  
  15  export PATH="/usr/lib/llvm19/bin:$PATH"
  16  
  17  pass=0
  18  fail=0
  19  skip=0
  20  
  21  # stage_src copies $1 to a fresh per-test package directory under the moxie
  22  # tree so the package resolver can find it, and prints the package path.
  23  stage_src() {
  24      local src="$1"
  25      local name=$(basename "$src" .go)
  26      local stage="$STAGEROOT/$name"
  27      mkdir -p "$stage"
  28      cp "$src" "$stage/main.go"
  29      echo "./tests/_spawn_stage_$$/$name"
  30  }
  31  
  32  run_pass_test() {
  33      local src="$1"
  34      local name=$(basename "$src" .go)
  35      local bin="$TMPDIR/$name"
  36      local pkg
  37      pkg=$(stage_src "$src")
  38  
  39      if ! (cd "$MOXIEROOT" && "$MOXIE" build -o "$bin" "$pkg") 2>"$TMPDIR/$name.err"; then
  40          echo "FAIL $name: compilation failed"
  41          cat "$TMPDIR/$name.err"
  42          fail=$((fail + 1))
  43          return
  44      fi
  45  
  46      local output
  47      output=$(timeout 5 "$bin" 2>&1 || true)
  48  
  49      # Check that no FAIL markers appear and at least one PASS marker does.
  50      if echo "$output" | grep -q "FAIL:"; then
  51          echo "FAIL $name: wrong values received"
  52          echo "$output"
  53          fail=$((fail + 1))
  54          return
  55      fi
  56      if echo "$output" | grep -q "PASS:"; then
  57          local passes=$(echo "$output" | grep -c "PASS:" || true)
  58          echo "OK   $name ($passes checks)"
  59          pass=$((pass + 1))
  60      else
  61          echo "FAIL $name: no PASS markers in output"
  62          echo "$output"
  63          fail=$((fail + 1))
  64      fi
  65  }
  66  
  67  run_fail_test() {
  68      local src="$1"
  69      local pattern="$2"
  70      local name=$(basename "$src" .go)
  71      local bin="$TMPDIR/$name"
  72      local pkg
  73      pkg=$(stage_src "$src")
  74  
  75      local errout
  76      if errout=$(cd "$MOXIEROOT" && "$MOXIE" build -o "$bin" "$pkg" 2>&1); then
  77          echo "FAIL $name: compilation should have failed"
  78          fail=$((fail + 1))
  79          return
  80      fi
  81  
  82      if echo "$errout" | grep -qi "$pattern"; then
  83          echo "OK   $name (rejected: $pattern)"
  84          pass=$((pass + 1))
  85      else
  86          echo "FAIL $name: expected error containing '$pattern'"
  87          echo "$errout"
  88          fail=$((fail + 1))
  89      fi
  90  }
  91  
  92  echo "=== Spawn positive tests ==="
  93  for src in "$TESTDIR"/pass_*.go; do
  94      run_pass_test "$src"
  95  done
  96  
  97  echo ""
  98  echo "=== Spawn negative tests ==="
  99  run_fail_test "$TESTDIR/fail_pointer.go"      "pointer"
 100  run_fail_test "$TESTDIR/fail_func.go"          "function"
 101  run_fail_test "$TESTDIR/fail_interface.go"     "interface"
 102  run_fail_test "$TESTDIR/fail_empty_iface.go"   "interface"
 103  run_fail_test "$TESTDIR/fail_slice_iface.go"   "interface"
 104  run_fail_test "$TESTDIR/fail_struct_chan.go"    "channel"
 105  run_fail_test "$TESTDIR/fail_array_chan.go"     "channel"
 106  run_fail_test "$TESTDIR/fail_alias.go"         "after spawn"
 107  run_fail_test "$TESTDIR/fail_type_mismatch.go" "expects"
 108  run_fail_test "$TESTDIR/fail_wrong_count.go"   "expects"
 109  
 110  echo ""
 111  echo "=== Results: $pass passed, $fail failed ==="
 112  [ "$fail" -eq 0 ]
 113