use crate::app_kind::AppKind; use crate::Harness; use egui::{Pos2, Rect, Vec2}; use std::marker::PhantomData; /// Builder for [`Harness`]. pub struct HarnessBuilder { pub(crate) screen_rect: Rect, pub(crate) pixels_per_point: f32, pub(crate) state: PhantomData, } impl Default for HarnessBuilder { fn default() -> Self { Self { screen_rect: Rect::from_min_size(Pos2::ZERO, Vec2::new(800.0, 600.0)), pixels_per_point: 1.0, state: PhantomData, } } } impl HarnessBuilder { /// Set the size of the window. #[inline] pub fn with_size(mut self, size: impl Into) -> Self { let size = size.into(); self.screen_rect.set_width(size.x); self.screen_rect.set_height(size.y); self } /// Set the `pixels_per_point` of the window. #[inline] pub fn with_pixels_per_point(mut self, pixels_per_point: f32) -> Self { self.pixels_per_point = pixels_per_point; self } /// Create a new Harness with the given app closure and a state. /// /// The app closure will immediately be called once to create the initial ui. /// /// If you don't need to create Windows / Panels, you can use [`HarnessBuilder::build_ui`] instead. /// /// # Example /// ```rust /// # use egui::CentralPanel; /// # use egui_kittest::{Harness, kittest::Queryable}; /// let checked = false; /// let mut harness = Harness::builder() /// .with_size(egui::Vec2::new(300.0, 200.0)) /// .build_state(|ctx, checked| { /// CentralPanel::default().show(ctx, |ui| { /// ui.checkbox(checked, "Check me!"); /// }); /// }, checked); /// /// harness.get_by_label("Check me!").click(); /// harness.run(); /// /// assert_eq!(*harness.state(), true); /// ``` pub fn build_state<'a>( self, app: impl FnMut(&egui::Context, &mut State) + 'a, state: State, ) -> Harness<'a, State> { Harness::from_builder(&self, AppKind::ContextState(Box::new(app)), state) } /// Create a new Harness with the given ui closure and a state. /// /// The ui closure will immediately be called once to create the initial ui. /// /// If you need to create Windows / Panels, you can use [`HarnessBuilder::build`] instead. /// /// # Example /// ```rust /// # use egui_kittest::{Harness, kittest::Queryable}; /// let mut checked = false; /// let mut harness = Harness::builder() /// .with_size(egui::Vec2::new(300.0, 200.0)) /// .build_ui_state(|ui, checked| { /// ui.checkbox(checked, "Check me!"); /// }, checked); /// /// harness.get_by_label("Check me!").click(); /// harness.run(); /// /// assert_eq!(*harness.state(), true); /// ``` pub fn build_ui_state<'a>( self, app: impl FnMut(&mut egui::Ui, &mut State) + 'a, state: State, ) -> Harness<'a, State> { Harness::from_builder(&self, AppKind::UiState(Box::new(app)), state) } } impl HarnessBuilder { /// Create a new Harness with the given app closure. /// /// The app closure will immediately be called once to create the initial ui. /// /// If you don't need to create Windows / Panels, you can use [`HarnessBuilder::build_ui`] instead. /// /// # Example /// ```rust /// # use egui::CentralPanel; /// # use egui_kittest::{Harness, kittest::Queryable}; /// let mut harness = Harness::builder() /// .with_size(egui::Vec2::new(300.0, 200.0)) /// .build(|ctx| { /// CentralPanel::default().show(ctx, |ui| { /// ui.label("Hello, world!"); /// }); /// }); /// ``` pub fn build<'a>(self, app: impl FnMut(&egui::Context) + 'a) -> Harness<'a> { Harness::from_builder(&self, AppKind::Context(Box::new(app)), ()) } /// Create a new Harness with the given ui closure. /// /// The ui closure will immediately be called once to create the initial ui. /// /// If you need to create Windows / Panels, you can use [`HarnessBuilder::build`] instead. /// /// # Example /// ```rust /// # use egui_kittest::{Harness, kittest::Queryable}; /// let mut harness = Harness::builder() /// .with_size(egui::Vec2::new(300.0, 200.0)) /// .build_ui(|ui| { /// ui.label("Hello, world!"); /// }); /// ``` pub fn build_ui<'a>(self, app: impl FnMut(&mut egui::Ui) + 'a) -> Harness<'a> { Harness::from_builder(&self, AppKind::Ui(Box::new(app)), ()) } }