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