Append renderer name to iced_test snapshots

This commit is contained in:
Héctor Ramón Jiménez 2025-03-24 20:18:24 +01:00
parent 175a53bc86
commit 5e5c7c85ad
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
7 changed files with 66 additions and 12 deletions

View file

@ -109,10 +109,17 @@ pub trait Headless {
fn new( fn new(
default_font: Font, default_font: Font,
default_text_size: Pixels, default_text_size: Pixels,
backend: Option<&str>,
) -> impl Future<Output = Option<Self>> ) -> impl Future<Output = Option<Self>>
where where
Self: Sized; Self: Sized;
/// Returns the unique name of the renderer.
///
/// This name may be used by testing libraries to uniquely identify
/// snapshots.
fn name(&self) -> String;
/// Draws offscreen into a screenshot, returning a collection of /// Draws offscreen into a screenshot, returning a collection of
/// bytes representing the rendered pixels in RGBA order. /// bytes representing the rendered pixels in RGBA order.
fn screenshot( fn screenshot(

View file

@ -0,0 +1 @@
0e355b080ad33905145e9f70a3b29e2481197c8fc8f42491acd5358238ebbd5f

View file

@ -615,16 +615,23 @@ where
async fn new( async fn new(
default_font: Font, default_font: Font,
default_text_size: Pixels, default_text_size: Pixels,
backend: Option<&str>,
) -> Option<Self> { ) -> Option<Self> {
if let Some(renderer) = A::new(default_font, default_text_size).await { if let Some(renderer) =
A::new(default_font, default_text_size, backend).await
{
return Some(Self::Primary(renderer)); return Some(Self::Primary(renderer));
} }
B::new(default_font, default_text_size) B::new(default_font, default_text_size, backend)
.await .await
.map(Self::Secondary) .map(Self::Secondary)
} }
fn name(&self) -> String {
delegate!(self, renderer, renderer.name())
}
fn screenshot( fn screenshot(
&mut self, &mut self,
size: Size<u32>, size: Size<u32>,

View file

@ -109,6 +109,7 @@ use crate::runtime::UserInterface;
use crate::runtime::user_interface; use crate::runtime::user_interface;
use std::borrow::Cow; use std::borrow::Cow;
use std::env;
use std::fs; use std::fs;
use std::io; use std::io;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -186,10 +187,16 @@ where
load_font(font).expect("Font must be valid"); load_font(font).expect("Font must be valid");
} }
let mut renderer = iced_runtime::futures::futures::executor::block_on( let mut renderer = {
Renderer::new(default_font, settings.default_text_size), let backend = env::var("ICED_BACKEND").ok();
)
.expect("Create new headless renderer"); iced_runtime::futures::futures::executor::block_on(Renderer::new(
default_font,
settings.default_text_size,
backend.as_deref(),
))
.expect("Create new headless renderer")
};
let raw = UserInterface::build( let raw = UserInterface::build(
element, element,
@ -457,6 +464,7 @@ where
physical_size, physical_size,
f64::from(scale_factor), f64::from(scale_factor),
), ),
renderer: self.renderer.name(),
}) })
} }
@ -472,6 +480,7 @@ where
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Snapshot { pub struct Snapshot {
screenshot: window::Screenshot, screenshot: window::Screenshot,
renderer: String,
} }
impl Snapshot { impl Snapshot {
@ -481,7 +490,7 @@ impl Snapshot {
/// If the PNG image does not exist, it will be created by the [`Snapshot`] for future /// If the PNG image does not exist, it will be created by the [`Snapshot`] for future
/// testing and `true` will be returned. /// testing and `true` will be returned.
pub fn matches_image(&self, path: impl AsRef<Path>) -> Result<bool, Error> { pub fn matches_image(&self, path: impl AsRef<Path>) -> Result<bool, Error> {
let path = snapshot_path(path, "png"); let path = self.path(path, "png");
if path.exists() { if path.exists() {
let file = fs::File::open(&path)?; let file = fs::File::open(&path)?;
@ -522,7 +531,7 @@ impl Snapshot {
pub fn matches_hash(&self, path: impl AsRef<Path>) -> Result<bool, Error> { pub fn matches_hash(&self, path: impl AsRef<Path>) -> Result<bool, Error> {
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
let path = snapshot_path(path, "sha256"); let path = self.path(path, "sha256");
let hash = { let hash = {
let mut hasher = Sha256::new(); let mut hasher = Sha256::new();
@ -543,6 +552,20 @@ impl Snapshot {
Ok(true) Ok(true)
} }
} }
fn path(&self, path: impl AsRef<Path>, extension: &str) -> PathBuf {
let path = path.as_ref();
path.with_file_name(format!(
"{name}-{renderer}",
name = path
.file_stem()
.map(std::ffi::OsStr::to_string_lossy)
.unwrap_or_default(),
renderer = self.renderer
))
.with_extension(extension)
}
} }
/// Returns the sequence of events of a click. /// Returns the sequence of events of a click.
@ -635,7 +658,3 @@ fn load_font(font: impl Into<Cow<'static, [u8]>>) -> Result<(), Error> {
Ok(()) Ok(())
} }
fn snapshot_path(path: impl AsRef<Path>, extension: &str) -> PathBuf {
path.as_ref().with_extension(extension)
}

View file

@ -410,10 +410,21 @@ impl renderer::Headless for Renderer {
async fn new( async fn new(
default_font: Font, default_font: Font,
default_text_size: Pixels, default_text_size: Pixels,
backend: Option<&str>,
) -> Option<Self> { ) -> Option<Self> {
if backend.is_some_and(|backend| {
!["tiny-skia", "tiny_skia"].contains(&backend)
}) {
return None;
}
Some(Self::new(default_font, default_text_size)) Some(Self::new(default_font, default_text_size))
} }
fn name(&self) -> String {
"tiny-skia".to_owned()
}
fn screenshot( fn screenshot(
&mut self, &mut self,
size: Size<u32>, size: Size<u32>,

View file

@ -815,7 +815,12 @@ impl renderer::Headless for Renderer {
async fn new( async fn new(
default_font: Font, default_font: Font,
default_text_size: Pixels, default_text_size: Pixels,
backend: Option<&str>,
) -> Option<Self> { ) -> Option<Self> {
if backend.is_some_and(|backend| backend != "wgpu") {
return None;
}
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
backends: wgpu::Backends::from_env() backends: wgpu::Backends::from_env()
.unwrap_or(wgpu::Backends::PRIMARY), .unwrap_or(wgpu::Backends::PRIMARY),
@ -862,6 +867,10 @@ impl renderer::Headless for Renderer {
Some(Self::new(engine, default_font, default_text_size)) Some(Self::new(engine, default_font, default_text_size))
} }
fn name(&self) -> String {
"wgpu".to_owned()
}
fn screenshot( fn screenshot(
&mut self, &mut self,
size: Size<u32>, size: Size<u32>,