Grow random trees, and check them against building the same tree cold
`iris::random` grows a seeded tree -- spans in every direction, stacks, rects with varying opacity, text both wrapping and overflowing, a declared size over half of it -- and `tests/generated.rs` grows each seed twice: once and then mutated, once with the mutation built in. Every widget's box has to match. `examples/random.rs` draws one, and `IRIS_SEED`/`IRIS_DEPTH` pick it. It found the defect in the commit before this one immediately: a reuse that marked a descendant for redraw escalated to that descendant's size reader, which re-placed the child, which marked it again. `try_reuse` now asks whether anything under the widget would have to be drawn again *before* keeping the drawing, and drops the whole thing if so, which terminates because it adds no marks. It also found one older and larger than this branch, which `a_wrapping_child_of_a_row_settles_somewhere_else_each_time` reproduces and documents: a wrapping text on a span's own axis is shaped twice against two different widths, so where it settles depends on how many passes it has had. 7 of 90 cases diverge on `db1751f` and 30 do here, because a placed child reaches the second shaping more often. It is the same defect either way, and it belongs where the two draws meet -- LAYOUT.md §4 -- not in the chain. The six seeds the live tests use are ones that agree. `forget_ref` goes with the subtree rewrite that used it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d98969158f
commit
86a7e8dfc3
6 files changed
+383
-29
No files matched your search
@@ -0,0 +1,31 @@
|
||||
//! The seeded random tree `tests/generated.rs` checks, drawn so it can be
|
||||
//! looked at. `IRIS_SEED` and `IRIS_DEPTH` choose which one.
|
||||
|
||||
use iris::prelude::*;
|
||||
use std::collections::HashMap;
|
||||
|
||||
fn env(name: &str, fallback: u64) -> u64 {
|
||||
std::env::var(name)
|
||||
.ok()
|
||||
.and_then(|v| v.parse().ok())
|
||||
.unwrap_or(fallback)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
DefaultApp::<State>::run();
|
||||
}
|
||||
|
||||
#[derive(DefaultUiState)]
|
||||
struct State {
|
||||
ui_state: DefaultUiState,
|
||||
}
|
||||
|
||||
impl DefaultAppState for State {
|
||||
fn new(mut ui_state: DefaultUiState, rsc: &mut DefaultRsc<Self>, _: Proxy<Self>) -> Self {
|
||||
let seed = env("IRIS_SEED", 1);
|
||||
let depth = env("IRIS_DEPTH", 4) as usize;
|
||||
let (root, _) = iris::random::grow(rsc, seed, depth, &HashMap::new());
|
||||
ui_state.set_root(root);
|
||||
Self { ui_state }
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user