From 7eb2b85425cade9660439a83a2977a2d80375777 Mon Sep 17 00:00:00 2001 From: iris <2+iris@noreply.localhost> Date: Sun, 13 Sep 2026 21:29:38 -0400 Subject: [PATCH] One proxy, and a macro instead of a shared test module `Proxy` is the task queue as well as the way an application sends its own events, so `ProxyQueue` is gone. `schedule_redraw` becomes `request_redraw_if_needed`, which says what the comment beside it was saying. `assert_corners!` replaces the region helper, so `tests/common` goes with it, and the scroll test now states both corners rather than one number. --- src/default/mod.rs | 14 +++++--------- src/harness.rs | 19 +++++++++++++++++++ tests/common/mod.rs | 13 ------------- tests/layout.rs | 13 +++++-------- tests/scroll.rs | 11 ++++------- 5 files changed, 33 insertions(+), 37 deletions(-) delete mode 100644 tests/common/mod.rs diff --git a/src/default/mod.rs b/src/default/mod.rs index 0587fbc..0c61a86 100644 --- a/src/default/mod.rs +++ b/src/default/mod.rs @@ -49,9 +49,7 @@ pub enum DefaultEvent { Update(Box>>), } -struct ProxyQueue(EventLoopProxy>); - -impl TaskQueue> for ProxyQueue { +impl TaskQueue> for Proxy { fn send(&self, update: Box>>) { let _ = self.0.send_event(DefaultEvent::Update(update)); } @@ -212,7 +210,7 @@ impl AppState for DefaultApp { .create_window(State::window_attributes()) .unwrap(); let default_state = DefaultUiState::new(window); - let mut rsc = DefaultRsc::init(Arc::new(ProxyQueue(proxy.clone()))); + let mut rsc = DefaultRsc::init(Arc::new(Proxy(proxy.clone()))); let state = State::new(default_state, &mut rsc, Proxy(proxy)); let render = UiRenderState::new(); Self { rsc, state, render } @@ -223,9 +221,7 @@ impl AppState for DefaultApp { DefaultEvent::User(event) => self.state.event(event, &mut self.rsc, &mut self.render), DefaultEvent::Update(update) => update(&mut self.state, &mut self.rsc), } - // An update is not a reason to draw; whether it made anything dirty - // is. That is why a task posts here rather than asking for a redraw. - self.schedule_redraw(); + self.request_redraw_if_needed(); } fn window_event(&mut self, event: WindowEvent, event_loop: &ActiveEventLoop) { @@ -309,7 +305,7 @@ impl AppState for DefaultApp { _ => (), } state.window_event(event, rsc, render); - self.schedule_redraw(); + self.request_redraw_if_needed(); self.state.default_state_mut().input.end_frame(); } @@ -319,7 +315,7 @@ impl AppState for DefaultApp { } impl DefaultApp { - fn schedule_redraw(&mut self) { + fn request_redraw_if_needed(&mut self) { let ui_state = self.state.default_state_mut(); if self.render.needs_redraw(&ui_state.root, self.rsc.widgets()) { ui_state.renderer.window().request_redraw(); diff --git a/src/harness.rs b/src/harness.rs index de43df1..b2a0eb0 100644 --- a/src/harness.rs +++ b/src/harness.rs @@ -22,6 +22,25 @@ impl TaskQueue> for Queue { } } +/// `assert_eq!` for where a frame put a widget, which `PixelRegion` cannot do +/// for itself: it neither compares nor prints. +#[macro_export] +macro_rules! assert_corners { + ($harness:expr, $id:expr, ($x0:expr, $y0:expr), ($x1:expr, $y1:expr)) => {{ + let region = $harness.region(&$id).expect("widget drew nothing"); + assert_eq!( + ( + region.top_left.x, + region.top_left.y, + region.bot_right.x, + region.bot_right.y + ), + ($x0 as f32, $y0 as f32, $x1 as f32, $y1 as f32) + ); + }}; +} +pub use crate::assert_corners; + #[derive(Default)] pub struct HarnessState { pub root: Option, diff --git a/tests/common/mod.rs b/tests/common/mod.rs deleted file mode 100644 index 3ceaf79..0000000 --- a/tests/common/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -use iris::harness::Harness; -use iris::prelude::*; - -/// `PixelRegion` neither compares nor prints. -pub fn corners(h: &Harness, id: &impl IdLike) -> (f32, f32, f32, f32) { - let region = h.region(id).expect("widget drew nothing"); - ( - region.top_left.x, - region.top_left.y, - region.bot_right.x, - region.bot_right.y, - ) -} diff --git a/tests/layout.rs b/tests/layout.rs index a9ee482..940a5aa 100644 --- a/tests/layout.rs +++ b/tests/layout.rs @@ -1,9 +1,6 @@ //! Where a frame puts things, with no window to put them in. -mod common; - -use common::corners; -use iris::harness::Harness; +use iris::harness::{Harness, assert_corners}; use iris::prelude::*; /// A fixed 100 wide, and the rest of the 400 to its neighbour. @@ -19,8 +16,8 @@ fn a_span_gives_each_child_the_width_it_asked_for() { let mut h = Harness::new((400, 200)); let (left, right) = two_rects(&mut h); - assert_eq!(corners(&h, &left), (0.0, 0.0, 100.0, 200.0)); - assert_eq!(corners(&h, &right), (100.0, 0.0, 400.0, 200.0)); + assert_corners!(h, left, (0, 0), (100, 200)); + assert_corners!(h, right, (100, 0), (400, 200)); } #[test] @@ -32,6 +29,6 @@ fn resizing_relays_out_against_the_new_output() { assert!(h.needs_redraw()); h.frame(); - assert_eq!(corners(&h, &left), (0.0, 0.0, 100.0, 100.0)); - assert_eq!(corners(&h, &right), (100.0, 0.0, 800.0, 100.0)); + assert_corners!(h, left, (0, 0), (100, 100)); + assert_corners!(h, right, (100, 0), (800, 100)); } diff --git a/tests/scroll.rs b/tests/scroll.rs index bdf6d0f..24a2d73 100644 --- a/tests/scroll.rs +++ b/tests/scroll.rs @@ -1,9 +1,6 @@ //! Scrolling moves content and stops at its ends. -mod common; - -use common::corners; -use iris::harness::Harness; +use iris::harness::{Harness, assert_corners}; use iris::prelude::*; #[test] @@ -16,14 +13,14 @@ fn a_wheel_scrolls_the_content_and_stops_at_its_end() { h.move_to((200, 100)); // `Scroll` starts snapped to the end. - assert_eq!(corners(&h, &top).1, -200.0); + assert_corners!(h, top, (0, -200), (400, 0)); // The handler scales a wheel line by 50. h.scroll((0, 1)); h.frame(); - assert_eq!(corners(&h, &top).1, -150.0); + assert_corners!(h, top, (0, -150), (400, 50)); h.scroll((0, 10)); h.frame(); - assert_eq!(corners(&h, &top).1, 0.0); + assert_corners!(h, top, (0, 0), (400, 200)); }