Branch on a measurement, so a wrong one shows as a different tree
Comparing boxes catches a widget that moved. It does not catch one that measured a child, was handed an answer a cold start would not have given, and took the other branch -- the same defect, arriving where a pixel comparison cannot see it. Branching on what the painter tells you is something a widget is allowed to do, so the library owes the same answer warm and cold; only a widget changing its own configuration is exempt. `random::Branch` measures a child and draws one of two others on the result, with both grown either way so the ids match whichever is drawn. It joins the generator, which makes every existing scenario a control-flow oracle as well as a geometric one. `tests/determinism.rs` is the same widget by hand across eight thresholds, including either side of the answer, and is the fast check -- the sweep is a fuzzer and confirms at the end rather than being iterated against. A span behind a branch nobody took is not drawn, so shuffling it cannot move anything; `reshuffled` now treats that as vacuous, the way it already treats a tree with no spans, rather than as a shuffle that had no effect. Both new tests pass, and the sweep passes at depth 4 and 5 over 200 seeds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
60175c3821
commit
1b1378b05a
3 files changed
+156
-2
No files matched your search
+9
-2
@@ -224,8 +224,15 @@ fn reshuffled(seed: u64, shuffle: Shuffle) {
|
||||
let mut warm = Harness::new((900, 1200));
|
||||
let mut grown = plant(&mut warm, seed, &Edits::default());
|
||||
// Some seeds grow nothing but wrappers, and a shuffle with no span to
|
||||
// shuffle is not the same thing as one that had no effect.
|
||||
if grown.spans.is_empty() {
|
||||
// shuffle is not the same thing as one that had no effect. A span behind
|
||||
// a branch nobody took is the same kind of nothing: it is not drawn, so
|
||||
// shuffling it cannot move anything.
|
||||
let shuffles = grown
|
||||
.spans
|
||||
.iter()
|
||||
.step_by(3)
|
||||
.any(|span| warm.region(&span.id.id()).is_some());
|
||||
if !shuffles {
|
||||
return;
|
||||
}
|
||||
let before: Vec<_> = grown.ids.iter().map(|id| warm.region(id)).collect();
|
||||
|
||||
Reference in new issue
Block a user