golden.rs
raw
//! Golden-image tests: render the sample scenes headless and compare against
//! checked-in reference PNGs.
//!
//! On mismatch the actual render and per-test goldens land in
//! `target/golden-failures/` for inspection. To bless new goldens after an
//! intentional rendering change, run:
//!
//! ```sh
//! GUIDUCK_BLESS=1 cargo test -p guiduck-render-tinyskia --test golden
//! ```
use guiduck_render_tinyskia::TinySkiaBackend;
use guiduck_samples::Samples;
use guiduck_scene::geom::Size;
use guiduck_scene::{FragmentStore, RenderBackend};
use std::path::{Path, PathBuf};
fn golden_dir() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/goldens")
}
fn check_golden(name: &str, actual: &tiny_skia::Pixmap) {
guiduck_render_tinyskia::golden::check(name, actual, &golden_dir());
}
fn render_showcase(scale: f64) -> tiny_skia::Pixmap {
let viewport = Size::new(560.0, 360.0);
let mut samples = Samples::new();
let mut store = FragmentStore::new();
let root = samples.showcase(&mut store, viewport);
let mut backend = TinySkiaBackend::new();
backend
.render(
root,
&store,
(viewport.width * scale) as u32,
(viewport.height * scale) as u32,
scale,
)
.expect("render succeeds");
backend.pixmap().clone()
}
#[test]
fn showcase_1x() {
check_golden("showcase-1x", &render_showcase(1.0));
}
#[test]
fn showcase_2x() {
check_golden("showcase-2x", &render_showcase(2.0));
}
fn render_widgets_demo(viewport: Size, scale: f64) -> tiny_skia::Pixmap {
let (mut tree, _) = guiduck_samples::widgets::demo_tree();
tree.compute_layout(viewport);
let mut store = FragmentStore::new();
let root = tree.paint_fresh(&mut store).expect("demo tree has a root");
let mut backend = TinySkiaBackend::new();
backend
.render(
root,
&store,
(viewport.width * scale) as u32,
(viewport.height * scale) as u32,
scale,
)
.expect("render succeeds");
backend.pixmap().clone()
}
#[test]
fn widgets_wide() {
check_golden(
"widgets-wide",
&render_widgets_demo(Size::new(640.0, 420.0), 1.0),
);
}
#[test]
fn widgets_narrow() {
check_golden(
"widgets-narrow",
&render_widgets_demo(Size::new(360.0, 420.0), 1.0),
);
}
#[test]
fn counter_initial() {
let (mut tree, _count, _button) = guiduck_samples::counter::counter_tree();
let viewport = Size::new(400.0, 300.0);
let root = tree
.render_frame(viewport)
.expect("counter tree has a root");
let mut backend = TinySkiaBackend::new();
backend
.render(root, tree.fragments(), 400, 300, 1.0)
.expect("render succeeds");
check_golden("counter-initial", &backend.pixmap().clone());
}