//! 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()); }