GUEST: step 1 — lib/guest/conformance.{sx,sh} config-driven driver
Extracted the duplicated conformance plumbing into a single driver:
- lib/guest/conformance.sx — two helper fns that emit (gc-result NAME P F T)
lines for the bash side to grep: gc-dict-result for runners returning
a {:passed :failed :total} dict, and gc-counters-result for guests that
bump a global pass/fail counter from a test file load.
- lib/guest/conformance.sh — config-driven bash driver. Sources a per-lang
conf, locates sx_server, runs sx_server in either single-session "dict"
mode (one preload + many suite evals) or per-suite "counters" mode
(fresh sx_server per suite, with shared preloads). Aggregates and writes
scoreboard.{json,md} via per-lang emit_scoreboard_* functions.
- Ported lib/prolog/conformance.sh and lib/haskell/conformance.sh down to
one-line wrappers that exec the shared driver against their .conf file.
Verification:
- Prolog: 590/590 — diff vs baseline is timestamp-only.
- Haskell: 156/156 — significantly higher than the 0/18 in baseline. The
old conformance.sh was buggy (its `(ok-len 3 ...)` grep never matched,
defaulting every program to 0 pass / 1 fail). Updated baseline to the
true count; no actual test regressed. Plan baseline cell updated.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
80
lib/prolog/conformance.conf
Normal file
80
lib/prolog/conformance.conf
Normal file
@@ -0,0 +1,80 @@
|
||||
# Prolog conformance config — sourced by lib/guest/conformance.sh.
|
||||
|
||||
LANG_NAME=prolog
|
||||
MODE=dict
|
||||
|
||||
PRELOADS=(
|
||||
lib/prolog/tokenizer.sx
|
||||
lib/prolog/parser.sx
|
||||
lib/prolog/runtime.sx
|
||||
lib/prolog/query.sx
|
||||
lib/prolog/compiler.sx
|
||||
lib/prolog/hs-bridge.sx
|
||||
)
|
||||
|
||||
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!)"
|
||||
"term_inspect:lib/prolog/tests/term_inspect.sx:(pl-term-inspect-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!)"
|
||||
"atoms:lib/prolog/tests/atoms.sx:(pl-atom-tests-run!)"
|
||||
"query_api:lib/prolog/tests/query_api.sx:(pl-query-api-tests-run!)"
|
||||
"iso_predicates:lib/prolog/tests/iso_predicates.sx:(pl-iso-predicates-tests-run!)"
|
||||
"meta_predicates:lib/prolog/tests/meta_predicates.sx:(pl-meta-predicates-tests-run!)"
|
||||
"list_predicates:lib/prolog/tests/list_predicates.sx:(pl-list-predicates-tests-run!)"
|
||||
"meta_call:lib/prolog/tests/meta_call.sx:(pl-meta-call-tests-run!)"
|
||||
"set_predicates:lib/prolog/tests/set_predicates.sx:(pl-set-predicates-tests-run!)"
|
||||
"char_predicates:lib/prolog/tests/char_predicates.sx:(pl-char-predicates-tests-run!)"
|
||||
"io_predicates:lib/prolog/tests/io_predicates.sx:(pl-io-predicates-tests-run!)"
|
||||
"assert_rules:lib/prolog/tests/assert_rules.sx:(pl-assert-rules-tests-run!)"
|
||||
"string_agg:lib/prolog/tests/string_agg.sx:(pl-string-agg-tests-run!)"
|
||||
"advanced:lib/prolog/tests/advanced.sx:(pl-advanced-tests-run!)"
|
||||
"compiler:lib/prolog/tests/compiler.sx:(pl-compiler-tests-run!)"
|
||||
"cross_validate:lib/prolog/tests/cross_validate.sx:(pl-cross-validate-tests-run!)"
|
||||
"integration:lib/prolog/tests/integration.sx:(pl-integration-tests-run!)"
|
||||
"hs_bridge:lib/prolog/tests/hs_bridge.sx:(pl-hs-bridge-tests-run!)"
|
||||
)
|
||||
|
||||
emit_scoreboard_json() {
|
||||
local n=${#GC_NAMES[@]} i sep
|
||||
printf '{\n'
|
||||
printf ' "total_passed": %d,\n' "$GC_TOTAL_PASS"
|
||||
printf ' "total_failed": %d,\n' "$GC_TOTAL_FAIL"
|
||||
printf ' "total": %d,\n' "$GC_TOTAL"
|
||||
printf ' "suites": {'
|
||||
for ((i=0; i<n; i++)); do
|
||||
sep=","; [ $i -eq $((n-1)) ] && sep=""
|
||||
printf '"%s":{"passed":%d,"total":%d,"failed":%d}%s' \
|
||||
"${GC_NAMES[$i]}" "${GC_PASS[$i]}" "${GC_TOTAL_S[$i]}" "${GC_FAIL[$i]}" "$sep"
|
||||
done
|
||||
printf '},\n'
|
||||
printf ' "generated": "%s"\n' "$(date -Iseconds 2>/dev/null || date)"
|
||||
printf '}\n'
|
||||
}
|
||||
|
||||
emit_scoreboard_md() {
|
||||
local n=${#GC_NAMES[@]} i status when
|
||||
when="$(date -Iseconds 2>/dev/null || date)"
|
||||
printf '# Prolog scoreboard\n\n'
|
||||
printf '**%d / %d passing** (%d failure(s)).\n' \
|
||||
"$GC_TOTAL_PASS" "$GC_TOTAL" "$GC_TOTAL_FAIL"
|
||||
printf 'Generated %s.\n\n' "$when"
|
||||
printf '| Suite | Passed | Total | Status |\n'
|
||||
printf '|-------|--------|-------|--------|\n'
|
||||
for ((i=0; i<n; i++)); do
|
||||
status="ok"; [ "${GC_FAIL[$i]}" -gt 0 ] && status="FAIL"
|
||||
printf '| %s | %d | %d | %s |\n' \
|
||||
"${GC_NAMES[$i]}" "${GC_PASS[$i]}" "${GC_TOTAL_S[$i]}" "$status"
|
||||
done
|
||||
printf '\nRun `bash lib/prolog/conformance.sh` to refresh. Override the binary\n'
|
||||
printf 'with `SX_SERVER=path/to/sx_server.exe bash …`.\n'
|
||||
}
|
||||
Reference in New Issue
Block a user