94af4c788c
The built-in sample that `aura graph` renders and `aura sweep` runs is now a
"trend + momentum, weighted blend" strategy that exercises four authoring/viewer
capabilities the single-level sample left dark:
- multiply-nested composites: root -> signals -> {trend = sma_cross, momentum = macd};
- a multi-param node inside a composite: blend = LinComb(3) (weights[0]/[1] shown);
- a multi-output node: momentum (the macd composite) re-exports macd/signal/histogram,
two of which the blend consumes;
- bind(): blend.weights[2] is fixed as a structural constant, so it drops out of the
sweepable param surface (and renders absent).
The new `signals` composite reuses the existing sma_cross/macd builders unchanged; the
sweep re-paths its axes to the eight free params (still a 4-point grid) and runs an
18-tick warm-up stream (showcase_prices) so the MACD EMA-of-EMA chain and the all-Any
LinComb join warm up. The render fixture (sample-model.json) is re-captured, and a new
headless guard (viewer_nested_depth) pins that the viewer renders the nesting to depth 2
with valid Graphviz ids. Pure authoring over already-shipped primitives — no engine or
graph-viewer.js change.
The flat run_sample, run_macd/macd(), the inline model_golden test, and the viewer are
untouched. A third sweep-param pin in tests/cli_run.rs (the aura sweep E2E) was re-pathed
in lockstep with its in-crate twin.
closes #62
43 lines
1.5 KiB
Rust
43 lines
1.5 KiB
Rust
//! Integration guard: the `aura graph` viewer renders multiply-nested composites
|
|
//! (a composite inside a composite inside the root) with valid Graphviz node ids
|
|
//! at every depth.
|
|
//!
|
|
//! Like `viewer_dot_ids.rs`/`viewer_dot.rs`, the property lives in JavaScript
|
|
//! (`genDot` in assets/graph-viewer.js), so this shells out to `node` running the
|
|
//! headless guard `tests/viewer_nested_depth.mjs`, which loads the real viewer
|
|
//! module and the re-captured sample fixture and expands it recursively to depth 2.
|
|
//!
|
|
//! `node` is REQUIRED: if it is not on PATH this test FAILS (a skipped guard is
|
|
//! not a guard).
|
|
|
|
use std::path::PathBuf;
|
|
use std::process::Command;
|
|
|
|
#[test]
|
|
fn viewer_renders_nested_composites_to_depth_2_with_valid_ids() {
|
|
let script = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
|
.join("tests")
|
|
.join("viewer_nested_depth.mjs");
|
|
assert!(
|
|
script.exists(),
|
|
"guard script missing at {}",
|
|
script.display()
|
|
);
|
|
|
|
let out = match Command::new("node").arg(&script).output() {
|
|
Ok(out) => out,
|
|
Err(e) => panic!(
|
|
"node is required for the viewer depth-2 nesting guard but could not be run \
|
|
({e}); install Node.js or ensure `node` is on PATH"
|
|
),
|
|
};
|
|
|
|
let stdout = String::from_utf8_lossy(&out.stdout);
|
|
let stderr = String::from_utf8_lossy(&out.stderr);
|
|
assert!(
|
|
out.status.success(),
|
|
"viewer depth-2 nesting guard failed (exit {:?}).\n--- node stdout ---\n{stdout}\n--- node stderr ---\n{stderr}",
|
|
out.status.code()
|
|
);
|
|
}
|