Add deps and engine test specs, bootstrap engine to Python

New test specs (test-deps.sx: 33 tests, test-engine.sx: 37 tests) covering
component dependency analysis and engine pure functions. All 6 spec modules
now have formal SX tests: eval (81), parser (39), router (18), render (23),
deps (33), engine (37) = 231 total.

- Add engine as spec module in bootstrap_py.py (alongside deps)
- Add primitive aliases (trim, replace, parse_int, upper) for engine functions
- Fix parse-int to match JS parseInt semantics (strip trailing non-digits)
- Regenerate sx_ref.py with --spec-modules deps,engine
- Update all three test runners (run.js, run.py, sx-test-runner.js)
- Add Dependencies and Engine nav items and testing page entries
- Wire deps-source/engine-source through testing overview UI

Node.js: 231/231 pass. Python: 226/231 (5 pre-existing parser/router gaps).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 18:01:33 +00:00
parent 6421a23223
commit 917a487195
13 changed files with 1018 additions and 100 deletions

View File

@@ -141,6 +141,8 @@ SPECS = {
"parser": {"file": "test-parser.sx", "needs": ["sx-parse"]},
"router": {"file": "test-router.sx", "needs": []},
"render": {"file": "test-render.sx", "needs": ["render-html"]},
"deps": {"file": "test-deps.sx", "needs": []},
"engine": {"file": "test-engine.sx", "needs": []},
}
REF_DIR = os.path.join(_HERE, "..", "ref")
@@ -269,6 +271,62 @@ def _load_router_from_bootstrap(env):
eval_file("router.sx", env)
def _load_deps_from_bootstrap(env):
"""Load deps functions from the bootstrapped sx_ref.py."""
try:
from shared.sx.ref.sx_ref import (
scan_refs,
scan_components_from_source,
transitive_deps,
compute_all_deps,
components_needed,
page_component_bundle,
page_css_classes,
scan_io_refs,
transitive_io_refs,
compute_all_io_refs,
component_pure_p,
)
env["scan-refs"] = scan_refs
env["scan-components-from-source"] = scan_components_from_source
env["transitive-deps"] = transitive_deps
env["compute-all-deps"] = compute_all_deps
env["components-needed"] = components_needed
env["page-component-bundle"] = page_component_bundle
env["page-css-classes"] = page_css_classes
env["scan-io-refs"] = scan_io_refs
env["transitive-io-refs"] = transitive_io_refs
env["compute-all-io-refs"] = compute_all_io_refs
env["component-pure?"] = component_pure_p
env["test-env"] = lambda: env
except ImportError:
eval_file("deps.sx", env)
env["test-env"] = lambda: env
def _load_engine_from_bootstrap(env):
"""Load engine pure functions from the bootstrapped sx_ref.py."""
try:
from shared.sx.ref.sx_ref import (
parse_time,
parse_trigger_spec,
default_trigger,
parse_swap_spec,
parse_retry_spec,
next_retry_ms,
filter_params,
)
env["parse-time"] = parse_time
env["parse-trigger-spec"] = parse_trigger_spec
env["default-trigger"] = default_trigger
env["parse-swap-spec"] = parse_swap_spec
env["parse-retry-spec"] = parse_retry_spec
env["next-retry-ms"] = next_retry_ms
env["filter-params"] = filter_params
except ImportError:
eval_file("engine.sx", env)
def main():
global passed, failed, test_num
@@ -306,6 +364,10 @@ def main():
# Load prerequisite spec modules
if spec_name == "router":
_load_router_from_bootstrap(env)
if spec_name == "deps":
_load_deps_from_bootstrap(env)
if spec_name == "engine":
_load_engine_from_bootstrap(env)
print(f"# --- {spec_name} ---")
eval_file(spec["file"], env)