Add image and hash snapshot-based testing to iced_test
This commit is contained in:
parent
8e3636d769
commit
1aeb317f2d
17 changed files with 280 additions and 105 deletions
|
|
@ -8,10 +8,11 @@ use crate::conversion;
|
|||
use crate::core;
|
||||
use crate::core::mouse;
|
||||
use crate::core::renderer;
|
||||
use crate::core::theme;
|
||||
use crate::core::time::Instant;
|
||||
use crate::core::widget::operation;
|
||||
use crate::core::window;
|
||||
use crate::core::{Color, Element, Point, Size, Theme};
|
||||
use crate::core::{Element, Point, Size};
|
||||
use crate::futures::futures::channel::mpsc;
|
||||
use crate::futures::futures::channel::oneshot;
|
||||
use crate::futures::futures::task;
|
||||
|
|
@ -46,7 +47,7 @@ use std::sync::Arc;
|
|||
pub trait Program
|
||||
where
|
||||
Self: Sized,
|
||||
Self::Theme: DefaultStyle,
|
||||
Self::Theme: theme::Base,
|
||||
{
|
||||
/// The type of __messages__ your [`Program`] will produce.
|
||||
type Message: std::fmt::Debug + Send;
|
||||
|
|
@ -106,8 +107,8 @@ where
|
|||
fn theme(&self, window: window::Id) -> Self::Theme;
|
||||
|
||||
/// Returns the `Style` variation of the `Theme`.
|
||||
fn style(&self, theme: &Self::Theme) -> Appearance {
|
||||
theme.default_style()
|
||||
fn style(&self, theme: &Self::Theme) -> theme::Style {
|
||||
theme::Base::base(theme)
|
||||
}
|
||||
|
||||
/// Returns the event `Subscription` for the current state of the
|
||||
|
|
@ -138,37 +139,6 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
/// The appearance of a program.
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
pub struct Appearance {
|
||||
/// The background [`Color`] of the application.
|
||||
pub background_color: Color,
|
||||
|
||||
/// The default text [`Color`] of the application.
|
||||
pub text_color: Color,
|
||||
}
|
||||
|
||||
/// The default style of a [`Program`].
|
||||
pub trait DefaultStyle {
|
||||
/// Returns the default style of a [`Program`].
|
||||
fn default_style(&self) -> Appearance;
|
||||
}
|
||||
|
||||
impl DefaultStyle for Theme {
|
||||
fn default_style(&self) -> Appearance {
|
||||
default(self)
|
||||
}
|
||||
}
|
||||
|
||||
/// The default [`Appearance`] of a [`Program`] with the built-in [`Theme`].
|
||||
pub fn default(theme: &Theme) -> Appearance {
|
||||
let palette = theme.extended_palette();
|
||||
|
||||
Appearance {
|
||||
background_color: palette.background.base.color,
|
||||
text_color: palette.background.base.text,
|
||||
}
|
||||
}
|
||||
/// Runs a [`Program`] with an executor, compositor, and the provided
|
||||
/// settings.
|
||||
pub fn run<P, C>(
|
||||
|
|
@ -180,7 +150,7 @@ pub fn run<P, C>(
|
|||
where
|
||||
P: Program + 'static,
|
||||
C: Compositor<Renderer = P::Renderer> + 'static,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
use winit::event_loop::EventLoop;
|
||||
|
||||
|
|
@ -674,7 +644,7 @@ async fn run_instance<P, C>(
|
|||
) where
|
||||
P: Program + 'static,
|
||||
C: Compositor<Renderer = P::Renderer> + 'static,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
use winit::event;
|
||||
use winit::event_loop::ControlFlow;
|
||||
|
|
@ -1170,7 +1140,7 @@ fn build_user_interface<'a, P: Program>(
|
|||
id: window::Id,
|
||||
) -> UserInterface<'a, P::Message, P::Theme, P::Renderer>
|
||||
where
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
debug.view_started();
|
||||
let view = program.view(id);
|
||||
|
|
@ -1189,7 +1159,7 @@ fn update<P: Program, E: Executor>(
|
|||
debug: &mut Debug,
|
||||
messages: &mut Vec<P::Message>,
|
||||
) where
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
for message in messages.drain(..) {
|
||||
debug.log_message(&message);
|
||||
|
|
@ -1226,7 +1196,7 @@ fn run_action<P, C>(
|
|||
) where
|
||||
P: Program,
|
||||
C: Compositor<Renderer = P::Renderer> + 'static,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
use crate::runtime::clipboard;
|
||||
use crate::runtime::system;
|
||||
|
|
@ -1461,7 +1431,7 @@ fn run_action<P, C>(
|
|||
&debug.overlay(),
|
||||
);
|
||||
|
||||
let _ = channel.send(window::Screenshot::new(
|
||||
let _ = channel.send(core::window::Screenshot::new(
|
||||
bytes,
|
||||
window.state.physical_size(),
|
||||
window.state.viewport().scale_factor(),
|
||||
|
|
@ -1536,7 +1506,7 @@ pub fn build_user_interfaces<'a, P: Program, C>(
|
|||
) -> FxHashMap<window::Id, UserInterface<'a, P::Message, P::Theme, P::Renderer>>
|
||||
where
|
||||
C: Compositor<Renderer = P::Renderer>,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
cached_user_interfaces
|
||||
.drain()
|
||||
|
|
|
|||
|
|
@ -1,17 +1,18 @@
|
|||
use crate::conversion;
|
||||
use crate::core::{mouse, window};
|
||||
use crate::core::{mouse, theme, window};
|
||||
use crate::core::{Color, Size};
|
||||
use crate::graphics::Viewport;
|
||||
use crate::program::{self, Program};
|
||||
use std::fmt::{Debug, Formatter};
|
||||
use crate::program::Program;
|
||||
|
||||
use winit::event::{Touch, WindowEvent};
|
||||
use winit::window::Window;
|
||||
|
||||
use std::fmt::{Debug, Formatter};
|
||||
|
||||
/// The state of a multi-windowed [`Program`].
|
||||
pub struct State<P: Program>
|
||||
where
|
||||
P::Theme: program::DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
title: String,
|
||||
scale_factor: f64,
|
||||
|
|
@ -20,12 +21,12 @@ where
|
|||
cursor_position: Option<winit::dpi::PhysicalPosition<f64>>,
|
||||
modifiers: winit::keyboard::ModifiersState,
|
||||
theme: P::Theme,
|
||||
appearance: program::Appearance,
|
||||
style: theme::Style,
|
||||
}
|
||||
|
||||
impl<P: Program> Debug for State<P>
|
||||
where
|
||||
P::Theme: program::DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("multi_window::State")
|
||||
|
|
@ -34,14 +35,14 @@ where
|
|||
.field("viewport", &self.viewport)
|
||||
.field("viewport_version", &self.viewport_version)
|
||||
.field("cursor_position", &self.cursor_position)
|
||||
.field("appearance", &self.appearance)
|
||||
.field("style", &self.style)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl<P: Program> State<P>
|
||||
where
|
||||
P::Theme: program::DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
/// Creates a new [`State`] for the provided [`Program`]'s `window`.
|
||||
pub fn new(
|
||||
|
|
@ -52,7 +53,7 @@ where
|
|||
let title = application.title(window_id);
|
||||
let scale_factor = application.scale_factor(window_id);
|
||||
let theme = application.theme(window_id);
|
||||
let appearance = application.style(&theme);
|
||||
let style = application.style(&theme);
|
||||
|
||||
let viewport = {
|
||||
let physical_size = window.inner_size();
|
||||
|
|
@ -71,7 +72,7 @@ where
|
|||
cursor_position: None,
|
||||
modifiers: winit::keyboard::ModifiersState::default(),
|
||||
theme,
|
||||
appearance,
|
||||
style,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -127,12 +128,12 @@ where
|
|||
|
||||
/// Returns the current background [`Color`] of the [`State`].
|
||||
pub fn background_color(&self) -> Color {
|
||||
self.appearance.background_color
|
||||
self.style.background_color
|
||||
}
|
||||
|
||||
/// Returns the current text [`Color`] of the [`State`].
|
||||
pub fn text_color(&self) -> Color {
|
||||
self.appearance.text_color
|
||||
self.style.text_color
|
||||
}
|
||||
|
||||
/// Processes the provided window event and updates the [`State`] accordingly.
|
||||
|
|
@ -237,6 +238,6 @@ where
|
|||
|
||||
// Update theme and appearance
|
||||
self.theme = application.theme(window_id);
|
||||
self.appearance = application.style(&self.theme);
|
||||
self.style = application.style(&self.theme);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
use crate::core::mouse;
|
||||
use crate::core::theme;
|
||||
use crate::core::time::Instant;
|
||||
use crate::core::window::Id;
|
||||
use crate::core::{Point, Size};
|
||||
use crate::graphics::Compositor;
|
||||
use crate::program::{DefaultStyle, Program, State};
|
||||
use crate::program::{Program, State};
|
||||
|
||||
use std::collections::BTreeMap;
|
||||
use std::sync::Arc;
|
||||
|
|
@ -14,7 +15,7 @@ pub struct WindowManager<P, C>
|
|||
where
|
||||
P: Program,
|
||||
C: Compositor<Renderer = P::Renderer>,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
aliases: BTreeMap<winit::window::WindowId, Id>,
|
||||
entries: BTreeMap<Id, Window<P, C>>,
|
||||
|
|
@ -24,7 +25,7 @@ impl<P, C> WindowManager<P, C>
|
|||
where
|
||||
P: Program,
|
||||
C: Compositor<Renderer = P::Renderer>,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
|
|
@ -132,7 +133,7 @@ impl<P, C> Default for WindowManager<P, C>
|
|||
where
|
||||
P: Program,
|
||||
C: Compositor<Renderer = P::Renderer>,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
|
|
@ -144,7 +145,7 @@ pub struct Window<P, C>
|
|||
where
|
||||
P: Program,
|
||||
C: Compositor<Renderer = P::Renderer>,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
pub raw: Arc<winit::window::Window>,
|
||||
pub state: State<P>,
|
||||
|
|
@ -160,7 +161,7 @@ impl<P, C> Window<P, C>
|
|||
where
|
||||
P: Program,
|
||||
C: Compositor<Renderer = P::Renderer>,
|
||||
P::Theme: DefaultStyle,
|
||||
P::Theme: theme::Base,
|
||||
{
|
||||
pub fn position(&self) -> Option<Point> {
|
||||
self.raw
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue