#!/usr/bin/env bash # Run every Prolog test suite via sx_server and refresh scoreboard.{json,md}. # Exit 0 if all green, 1 if any failures. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(cd "$HERE/../.." && pwd)" SX="${SX_SERVER:-/root/rose-ash/hosts/ocaml/_build/default/bin/sx_server.exe}" if [[ ! -x "$SX" ]]; then echo "sx_server not found at $SX (set SX_SERVER env to override)" >&2 exit 2 fi cd "$ROOT" # name : test-file : runner-fn SUITES=( "parse:lib/prolog/tests/parse.sx:pl-parse-tests-run!" "unify:lib/prolog/tests/unify.sx:pl-unify-tests-run!" "clausedb:lib/prolog/tests/clausedb.sx:pl-clausedb-tests-run!" "solve:lib/prolog/tests/solve.sx:pl-solve-tests-run!" "operators:lib/prolog/tests/operators.sx:pl-operators-tests-run!" "dynamic:lib/prolog/tests/dynamic.sx:pl-dynamic-tests-run!" "append:lib/prolog/tests/programs/append.sx:pl-append-tests-run!" "reverse:lib/prolog/tests/programs/reverse.sx:pl-reverse-tests-run!" "member:lib/prolog/tests/programs/member.sx:pl-member-tests-run!" "nqueens:lib/prolog/tests/programs/nqueens.sx:pl-nqueens-tests-run!" "family:lib/prolog/tests/programs/family.sx:pl-family-tests-run!" ) SCRIPT='(epoch 1) (load "lib/prolog/tokenizer.sx") (load "lib/prolog/parser.sx") (load "lib/prolog/runtime.sx")' for entry in "${SUITES[@]}"; do IFS=: read -r _ file _ <<< "$entry" SCRIPT+=$'\n(load "'"$file"$'")' done for entry in "${SUITES[@]}"; do IFS=: read -r _ _ fn <<< "$entry" SCRIPT+=$'\n(eval "('"$fn"$')")' done OUTPUT="$(printf '%s\n' "$SCRIPT" | "$SX" 2>&1)" mapfile -t LINES < <(printf '%s\n' "$OUTPUT" | grep -E '^\{:failed') if [[ ${#LINES[@]} -ne ${#SUITES[@]} ]]; then echo "Expected ${#SUITES[@]} suite results, got ${#LINES[@]}" >&2 echo "---- raw output ----" >&2 printf '%s\n' "$OUTPUT" >&2 exit 3 fi TOTAL_PASS=0 TOTAL_FAIL=0 TOTAL=0 JSON_SUITES="" MD_ROWS="" for i in "${!SUITES[@]}"; do IFS=: read -r name _ _ <<< "${SUITES[$i]}" line="${LINES[$i]}" passed=$(grep -oE ':passed [0-9]+' <<< "$line" | grep -oE '[0-9]+') total=$(grep -oE ':total [0-9]+' <<< "$line" | grep -oE '[0-9]+') failed=$(grep -oE ':failed [0-9]+' <<< "$line" | grep -oE '[0-9]+') TOTAL_PASS=$((TOTAL_PASS + passed)) TOTAL_FAIL=$((TOTAL_FAIL + failed)) TOTAL=$((TOTAL + total)) status="ok" [[ "$failed" -gt 0 ]] && status="FAIL" [[ -n "$JSON_SUITES" ]] && JSON_SUITES+="," JSON_SUITES+="\"$name\":{\"passed\":$passed,\"total\":$total,\"failed\":$failed}" MD_ROWS+="| $name | $passed | $total | $status |"$'\n' done WHEN="$(date -Iseconds 2>/dev/null || date)" cat > "$HERE/scoreboard.json" < "$HERE/scoreboard.md" <&2 exit 1 fi echo "All $TOTAL tests pass."