Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
110 lines
3.2 KiB
Bash
Executable File
110 lines
3.2 KiB
Bash
Executable File
#!/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!"
|
|
"findall:lib/prolog/tests/findall.sx:pl-findall-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" <<JSON
|
|
{
|
|
"total_passed": $TOTAL_PASS,
|
|
"total_failed": $TOTAL_FAIL,
|
|
"total": $TOTAL,
|
|
"suites": {$JSON_SUITES},
|
|
"generated": "$WHEN"
|
|
}
|
|
JSON
|
|
|
|
cat > "$HERE/scoreboard.md" <<MD
|
|
# Prolog scoreboard
|
|
|
|
**$TOTAL_PASS / $TOTAL passing** ($TOTAL_FAIL failure(s)).
|
|
Generated $WHEN.
|
|
|
|
| Suite | Passed | Total | Status |
|
|
|-------|--------|-------|--------|
|
|
$MD_ROWS
|
|
Run \`bash lib/prolog/conformance.sh\` to refresh. Override the binary
|
|
with \`SX_SERVER=path/to/sx_server.exe bash …\`.
|
|
MD
|
|
|
|
if [[ "$TOTAL_FAIL" -gt 0 ]]; then
|
|
echo "$TOTAL_FAIL failure(s) across $TOTAL tests" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "All $TOTAL tests pass."
|