Tests: the drag-budget test sets its thread count, and no render test changes the default

The FreeBSD job fails
fx::tests::a_drag_renders_raster_effects_within_the_drag_budget at
fx.rs:2822 with 1 previewed instead of 2.

pixels_do_not_depend_on_the_thread_count called set_default_threads
with 0, 1, 4 and 8. The override is process-wide, so a Renderer::new()
in a test running at the same time took that count. With 0 threads a
drag renders the drop shadow at full resolution, as
RenderOptions::dragging documents, so stats.previewed counts only the
filtered content (1 instead of 2).

The thread-count test now sets each renderer's threads. The drag test
gives its renderers 3 threads, so it also passes where default_threads()
is 0 (one CPU, or VECTORCRAFT_RENDER_THREADS=0).
This commit is contained in:
dotCooCoo
2026-10-18 12:36:24 +07:00
committed by bflatastic
parent 468d7b21e9
commit 739b0b7335
+15 -7
View File
@@ -2389,12 +2389,13 @@ mod tests {
}
let opts = RenderOptions { background: Some([255, 255, 255, 255]), ..Default::default() };
let mut frames = vec![];
for threads in [Some(0), Some(1), Some(4), Some(8)] {
crate::set_default_threads(threads);
// The test sets each renderer's count. `set_default_threads` would also change the count of the
// renderers that other tests create while this one runs.
for threads in [0, 1, 4, 8] {
let mut r = Renderer::new();
r.threads = threads;
frames.push(r.render(&d, 1200, 900, Affine::scale(6.0), &opts).pixels);
}
crate::set_default_threads(None);
assert!(frames.windows(2).all(|w| w[0] == w[1]), "the thread count changed pixels");
}
@@ -2852,8 +2853,15 @@ mod tests {
let still = RenderOptions { background: Some([255, 255, 255, 255]), ..Default::default() };
let live = RenderOptions { interacting: true, ..still.clone() };
let drag = RenderOptions { dragging: true, ..live.clone() };
let fresh = Renderer::new().render(&d, 1600, 1000, view, &still).pixels;
let mut r = Renderer::new();
// Every renderer here has 3 threads on any machine. A drag renders drop shadows within its
// budget only with `threads` above 0.
let threaded = || {
let mut r = Renderer::new();
r.threads = 3;
r
};
let fresh = threaded().render(&d, 1600, 1000, view, &still).pixels;
let mut r = threaded();
let _ = r.render(&base, 1600, 1000, view, &still);
assert_eq!(r.stats.previewed, 0);
let dragged = r.render(&d, 1600, 1000, view, &drag).pixels;
@@ -2873,14 +2881,14 @@ mod tests {
let id = scaled.layers[0].children().unwrap()[0].id;
scaled.node_mut(id).unwrap().transform(Affine::scale_about(1.05, vectorcraft_geom::Point::new(35.0, 33.0)), false);
let view = Affine::translate((800.0, 500.0)) * Affine::scale(40.0) * Affine::translate((-35.0, -33.0));
let mut r = Renderer::new();
let mut r = threaded();
let _ = r.render(&shadowed, 1600, 1000, view, &still);
let kept = r.shadows.len();
assert_eq!((kept, r.stats.previewed), (1, 0), "a still frame keeps the shadow's raster");
let _ = r.render(&scaled, 1600, 1000, view, &drag);
assert_eq!((r.shadows.len(), r.stats.previewed), (kept, 1), "the scaled shadow");
let after = r.render(&scaled, 1600, 1000, view, &still).pixels;
assert!(after == Renderer::new().render(&scaled, 1600, 1000, view, &still).pixels, "the frame after the drag");
assert!(after == threaded().render(&scaled, 1600, 1000, view, &still).pixels, "the frame after the drag");
}
/// While interacting, a group holding a symbol instance whose art lies outside the 20 × 20