008d18bb18
Moved PRELUDE_AIL const + parse_prelude fn to ailang-surface; re-exported from surface's lib.rs. surface::load_workspace rewritten 3-line shim-call → 7-line composition: load_modules_with → reserved-name check → inject parse_prelude → build_workspace(&["prelude"]). Five deletions in core: PRELUDE_JSON, load_prelude, load_workspace_with (the pd.1 shim), the top-level cfg(test) load_one fn, and the cfg(test) crate::load_module import. Production literal-"prelude" count in crates/ailang-core/src/ is now zero. Cross-form-identity preflight PASSED at module_hash 3abe0d3fa3c11c99 — parse(prelude.ail) ≡ deserialize(prelude.ail.json), so pd.3's deletion of the JSON is safe. Three new pin tests in ailang-surface/tests/: prelude_parse_pin (succeeds + min defs); prelude_module_hash_pin (cross-form-identity + literal-hex anchor); prelude_injection_pin (inject + reservation). Plan deviations (recorded in journal): switched the regression-pin fixture from non-existent examples/hello.ail.json to hello.ail; relocated 10 in-mod core tests to crates/ailang-core/tests/workspace_pin.rs because the dev-dep cycle (core ↔ surface) prevents in-mod aliasing in the lib-test target (form-a.1 T5 precedent); preserved load_one production-symbol-deletion by adding a test-mod-private load_one helper in core's mod tests for the 2 pd.1-introduced tests still consuming it. cargo test --workspace 573 green (+9 net from pd.1 baseline). bench/cross_lang.py + bench/compile_check.py exit 0; bench/check.py exit 1 with established noise envelope (bench_list_sum.bump_s, 13th consecutive observation; pd.2 is workspace-loader-only, no codegen touch — baseline pristine).
26 lines
968 B
Rust
26 lines
968 B
Rust
//! pd.2 (`prelude-decouple` milestone): pin that the surface-side
|
|
//! `parse_prelude` succeeds against the in-tree `examples/prelude.ail`
|
|
//! and returns a `Module` with the expected shape. Guards against
|
|
//! `prelude.ail` being silently emptied or `parse_prelude` regressing.
|
|
//!
|
|
//! The hash-stability + cross-form-identity pins live in
|
|
//! `prelude_module_hash_pin.rs`.
|
|
|
|
use ailang_surface::parse_prelude;
|
|
|
|
#[test]
|
|
fn parse_prelude_returns_module_named_prelude_with_min_defs() {
|
|
let m = parse_prelude();
|
|
assert_eq!(m.name, "prelude");
|
|
// Conservative lower bound: the prelude has shipped four classes
|
|
// (Eq, Ord, Show + the Ordering data def) plus their primitive
|
|
// instances by milestone 24. A future content addition only
|
|
// raises the count; an accidental emptying (or a renamed root)
|
|
// trips this immediately.
|
|
assert!(
|
|
m.defs.len() >= 8,
|
|
"expected >= 8 defs in prelude, got {}",
|
|
m.defs.len()
|
|
);
|
|
}
|