diff --git a/crates/egui_kittest/src/high_level_harness.rs b/crates/egui_kittest/src/high_level_harness.rs new file mode 100644 index 000000000..a4cf9fd91 --- /dev/null +++ b/crates/egui_kittest/src/high_level_harness.rs @@ -0,0 +1,82 @@ +use crate::{Harness, HarnessBuilder, Node}; +use egui::mutex::Mutex; +use kittest::{By, Queryable}; +use std::sync::Arc; + +#[derive(Clone)] +pub struct HighLevelHarness<'a>(Arc>>); +pub struct HighLevelQuery<'a> { + query: By<'a>, + harness: HighLevelHarness<'a>, +} + +impl<'a> HighLevelQuery<'a> { + pub fn query(&self, f: impl FnOnce(Node<'_>) -> T) -> Option { + self.harness.0.lock().query(self.query.clone()).map(f) + } + + pub fn get(&self, f: impl FnOnce(Node<'_>) -> T) -> T { + f(self.harness.0.lock().get(self.query.clone())) + } + + // pub fn query_all(&self, f: impl FnMut(Node<'_>) -> T) -> impl DoubleEndedIterator { + // self.harness.0.lock().query_all(self.query.clone()).map(f) + // } + + pub fn click(&self) { + self.get(|n| n.click()); + self.harness.run(); + } + + pub fn assert_exists(&self) { + self.get(|_| ()); + } +} + +impl<'a> HighLevelHarness<'a> { + pub fn new(harness: Harness<'a>) -> Self { + Self(Arc::new(Mutex::new(harness))) + } + + pub fn by_label(&self, label: &'a str) -> HighLevelQuery<'a> { + HighLevelQuery { + query: By::new().label(label), + harness: self.clone(), + } + } + + pub fn event(&self, event: egui::Event) { + let mut harness = self.0.lock(); + harness.event(event); + harness.run(); + } + + pub fn run(&self) { + self.0.lock().run(); + } +} + +#[cfg(test)] +mod test { + use crate::Harness; + use crate::high_level_harness::HighLevelHarness; + + #[test] + fn integration_test() { + let mut clicked = false; + let harness = HighLevelHarness::new(Harness::new_ui(|ui| { + ui.label("Hello"); + if ui.button("Click me").clicked() { + clicked = true; + } + })); + + let button = harness.by_label("Click me"); + + // Node is no longer restrained by the lifetime of the harness! + harness.run(); + + // Event functions will automatically run the harness! + button.click(); + } +} diff --git a/crates/egui_kittest/src/lib.rs b/crates/egui_kittest/src/lib.rs index c8112f47b..49925b559 100644 --- a/crates/egui_kittest/src/lib.rs +++ b/crates/egui_kittest/src/lib.rs @@ -19,6 +19,7 @@ mod renderer; mod texture_to_image; #[cfg(feature = "wgpu")] pub mod wgpu; +mod high_level_harness; pub use kittest;