#!/usr/bin/env bash # Tcl-on-SX test runner — epoch protocol to sx_server.exe set -uo pipefail cd "$(git rev-parse --show-toplevel)" SX_SERVER="${SX_SERVER:-hosts/ocaml/_build/default/bin/sx_server.exe}" if [ ! -x "$SX_SERVER" ]; then SX_SERVER="/root/rose-ash/hosts/ocaml/_build/default/bin/sx_server.exe" fi if [ ! -x "$SX_SERVER" ]; then echo "ERROR: sx_server.exe not found"; exit 1; fi VERBOSE="${1:-}" TMPFILE=$(mktemp) HELPER=$(mktemp --suffix=.sx) trap "rm -f $TMPFILE $HELPER" EXIT # Helper file: run both test suites and format a parseable summary string cat > "$HELPER" << 'HELPER_EOF' (define __pr (tcl-run-parse-tests)) (define __er (tcl-run-eval-tests)) (define tcl-test-summary (str "PARSE:" (get __pr "passed") ":" (get __pr "failed") " EVAL:" (get __er "passed") ":" (get __er "failed"))) HELPER_EOF cat > "$TMPFILE" << EPOCHS (epoch 1) (load "lib/tcl/tokenizer.sx") (epoch 2) (load "lib/tcl/parser.sx") (epoch 3) (load "lib/tcl/tests/parse.sx") (epoch 4) (load "lib/tcl/runtime.sx") (epoch 5) (load "lib/tcl/tests/eval.sx") (epoch 6) (load "$HELPER") (epoch 7) (eval "tcl-test-summary") EPOCHS OUTPUT=$(timeout 30 "$SX_SERVER" < "$TMPFILE" 2>&1) [ "$VERBOSE" = "-v" ] && echo "$OUTPUT" # Extract summary line from epoch 7 output SUMMARY=$(echo "$OUTPUT" | grep -A1 "^(ok-len 7 " | tail -1 | tr -d '"') if [ -z "$SUMMARY" ]; then echo "ERROR: no summary from test run" echo "$OUTPUT" | tail -20 exit 1 fi # Parse PARSE:N:M EVAL:N:M PARSE_PART=$(echo "$SUMMARY" | grep -o 'PARSE:[0-9]*:[0-9]*') EVAL_PART=$(echo "$SUMMARY" | grep -o 'EVAL:[0-9]*:[0-9]*') PARSE_PASSED=$(echo "$PARSE_PART" | cut -d: -f2) PARSE_FAILED=$(echo "$PARSE_PART" | cut -d: -f3) EVAL_PASSED=$(echo "$EVAL_PART" | cut -d: -f2) EVAL_FAILED=$(echo "$EVAL_PART" | cut -d: -f3) PARSE_PASSED=${PARSE_PASSED:-0}; PARSE_FAILED=${PARSE_FAILED:-1} EVAL_PASSED=${EVAL_PASSED:-0}; EVAL_FAILED=${EVAL_FAILED:-1} TOTAL_PASSED=$((PARSE_PASSED + EVAL_PASSED)) TOTAL_FAILED=$((PARSE_FAILED + EVAL_FAILED)) TOTAL=$((TOTAL_PASSED + TOTAL_FAILED)) if [ "$TOTAL_FAILED" = "0" ]; then echo "ok $TOTAL_PASSED/$TOTAL tcl tests passed (parse: $PARSE_PASSED, eval: $EVAL_PASSED)" exit 0 else echo "FAIL $TOTAL_PASSED/$TOTAL passed, $TOTAL_FAILED failed (parse: $PARSE_PASSED/$((PARSE_PASSED+PARSE_FAILED)), eval: $EVAL_PASSED/$((EVAL_PASSED+EVAL_FAILED)))" if [ -z "$VERBOSE" ]; then echo "--- output ---" echo "$OUTPUT" | tail -20 fi exit 1 fi