From 869b44db4ec8c946c8e5eab2498bbc3a501418b1 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 17 Dec 2024 01:37:00 +0100 Subject: Implement `Simulator::simulate` and polish naming --- test/src/lib.rs | 102 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 44 deletions(-) (limited to 'test') diff --git a/test/src/lib.rs b/test/src/lib.rs index 6c1d6bdc..44594a4d 100644 --- a/test/src/lib.rs +++ b/test/src/lib.rs @@ -9,13 +9,16 @@ use iced_runtime as runtime; use iced_runtime::core; use crate::core::clipboard; +use crate::core::event; use crate::core::keyboard; use crate::core::mouse; use crate::core::theme; use crate::core::time; use crate::core::widget; use crate::core::window; -use crate::core::{Element, Event, Font, Rectangle, Settings, Size, SmolStr}; +use crate::core::{ + Element, Event, Font, Point, Rectangle, Settings, Size, SmolStr, +}; use crate::runtime::user_interface; use crate::runtime::UserInterface; @@ -53,6 +56,7 @@ pub struct Simulator< raw: UserInterface<'a, Message, Theme, Renderer>, renderer: Renderer, window_size: Size, + cursor: mouse::Cursor, messages: Vec, } @@ -75,14 +79,14 @@ where settings: Settings, element: impl Into>, ) -> Self { - Self::with_settings_and_size( + Self::with_window_size( settings, window::Settings::default().size, element, ) } - pub fn with_settings_and_size( + pub fn with_window_size( settings: Settings, window_size: impl Into, element: impl Into>, @@ -112,6 +116,7 @@ where raw, renderer, window_size, + cursor: mouse::Cursor::Unavailable, messages: Vec::new(), } } @@ -214,7 +219,6 @@ where } let mut find = FindById { id, target: None }; - self.raw.operate(&self.renderer, &mut find); find.target.ok_or(Error::NotFound(selector)) @@ -258,7 +262,6 @@ where } let mut find = FindByText { text, target: None }; - self.raw.operate(&self.renderer, &mut find); find.target.ok_or(Error::NotFound(selector)) @@ -266,56 +269,52 @@ where } } + pub fn point_at(&mut self, position: impl Into) { + self.cursor = mouse::Cursor::Available(position.into()); + } + pub fn click( &mut self, selector: impl Into, ) -> Result { let target = self.find(selector)?; + self.point_at(target.bounds.center()); - let _ = self.raw.update( - &[ - Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)), - Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)), - ], - mouse::Cursor::Available(target.bounds.center()), - &mut self.renderer, - &mut clipboard::Null, - &mut self.messages, - ); + let _ = self.simulate(click()); Ok(target) } - pub fn typewrite(&mut self, text: impl AsRef) { - let events: Vec<_> = text - .as_ref() - .chars() - .map(|c| SmolStr::new_inline(&c.to_string())) - .flat_map(|c| { - key_press_and_release( - keyboard::Key::Character(c.clone()), - Some(c), - ) - }) - .collect(); + pub fn tap_key(&mut self, key: impl Into) -> event::Status { + self.simulate(tap_key(key, None)) + .first() + .copied() + .unwrap_or(event::Status::Ignored) + } - let _ = self.raw.update( - &events, - mouse::Cursor::Unavailable, - &mut self.renderer, - &mut clipboard::Null, - &mut self.messages, - ); + pub fn typewrite(&mut self, text: &str) -> event::Status { + let statuses = self.simulate(typewrite(text)); + + statuses + .into_iter() + .fold(event::Status::Ignored, event::Status::merge) } - pub fn press_key(&mut self, key: impl Into) { - let _ = self.raw.update( - &key_press_and_release(key, None), - mouse::Cursor::Unavailable, + pub fn simulate( + &mut self, + events: impl IntoIterator, + ) -> Vec { + let events: Vec = events.into_iter().collect(); + + let (_state, statuses) = self.raw.update( + &events, + self.cursor, &mut self.renderer, &mut clipboard::Null, &mut self.messages, ); + + statuses } pub fn snapshot(&mut self) -> Result { @@ -326,7 +325,7 @@ where &[Event::Window(window::Event::RedrawRequested( time::Instant::now(), ))], - mouse::Cursor::Unavailable, + self.cursor, &mut self.renderer, &mut clipboard::Null, &mut self.messages, @@ -338,7 +337,7 @@ where &core::renderer::Style { text_color: base.text_color, }, - mouse::Cursor::Unavailable, + self.cursor, ); let scale_factor = 2.0; @@ -363,8 +362,8 @@ where }) } - pub fn into_messages(self) -> impl IntoIterator { - self.messages + pub fn into_messages(self) -> impl Iterator { + self.messages.into_iter() } } @@ -433,10 +432,18 @@ impl Snapshot { } } -fn key_press_and_release( +pub fn click() -> impl Iterator { + [ + Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)), + Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)), + ] + .into_iter() +} + +pub fn tap_key( key: impl Into, text: Option, -) -> [Event; 2] { +) -> impl Iterator { let key = key.into(); [ @@ -460,6 +467,13 @@ fn key_press_and_release( modifiers: keyboard::Modifiers::default(), }), ] + .into_iter() +} + +pub fn typewrite(text: &str) -> impl Iterator + '_ { + text.chars() + .map(|c| SmolStr::new_inline(&c.to_string())) + .flat_map(|c| tap_key(keyboard::Key::Character(c.clone()), Some(c))) } #[derive(Debug, Clone)] -- cgit