joule-ui takes in OpenUI Lang 1.0 the way it takes in A2UI: a model writes a surface as a program, one widget a line, and joule-ui-lang builds a widget tree against the host's registry as the program streams. After every chunk a snapshot holds the tree as far as it can be built, each widget checked by joule-ui's own validate, and every error with its source line and reason code. State, queries, operators, conditionals, built-in functions and sequences of actions are parsed and refused not-declarative. A canonical writer turns a tree back into the language; it parses back to the same tree. - joule-ui-core: WidgetSchema::positional, the order a positional call passes props in (SPEC §3); absent from the wire form when undeclared. - joule-ui-interaction: begin_interaction and Pending::finish, the lifecycle's three phases in two steps for a host whose handler is asynchronous (SPEC §6); run_interaction is built on them and seals what it sealed before. - conformance/lang/v1: L1 statements, L2 ingest, L3 streaming, L4 the canonical form, L5 refusals, with an independent Python verifier written from §11. - docs/create.md: the design of Create. Co-Authored-By: Claude Opus 5.5 <[email protected]>
20 lines
1.1 KiB
Rust
20 lines
1.1 KiB
Rust
//! The published pack (`joule-ui/conformance/lang/v1/`) is exactly what the
|
|
//! reference implementation gives: every file regenerated and compared byte for
|
|
//! byte, and no file in the directory that the pack does not hold.
|
|
|
|
use std::path::PathBuf;
|
|
|
|
#[test]
|
|
fn the_published_pack_is_what_the_implementation_gives() {
|
|
let dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../../conformance/lang/v1");
|
|
let pack = joule_ui_lang::vectors::pack();
|
|
for (name, bytes) in &pack {
|
|
let on_disk = std::fs::read(dir.join(name)).unwrap_or_else(|e| panic!("{name}: {e} (regenerate with `cargo run -p joule-ui-lang --bin gen_lang_vectors`)"));
|
|
assert!(on_disk == *bytes, "{name} differs from what the implementation gives (regenerate with `cargo run -p joule-ui-lang --bin gen_lang_vectors`)");
|
|
}
|
|
let mut listed: Vec<String> = std::fs::read_dir(&dir).unwrap().map(|e| e.unwrap().file_name().to_string_lossy().into_owned()).collect();
|
|
listed.sort();
|
|
let mut expected: Vec<String> = pack.into_iter().map(|(n, _)| n).collect();
|
|
expected.sort();
|
|
assert_eq!(listed, expected, "the pack directory holds exactly the pack");
|
|
}
|