mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 06:40:06 -04:00
Add Harness::spawn_eframe_app (#8120)
This lets you start up the test app from within the test itself, which can be very useful when you have a specific test scenario set up that you need to debug. ### Related * Previous attempt: https://github.com/emilk/egui/pull/5418 ### macOS On macOS, you may only run UIs on the main loop, so you need a few additional steps. Not ideal, but works! ```diff diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index f9a153268..4e0cc14ee 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -84,3 +84,7 @@ web-sys.workspace = true [dev-dependencies] egui_kittest = { workspace = true, features = ["eframe", "snapshot", "wgpu"] } + +[[test]] +name = "test_demo_app" +harness = false diff --git a/crates/egui_demo_app/tests/test_demo_app.rs b/crates/egui_demo_app/tests/test_demo_app.rs index e083c8455..7ad9ed516 100644 --- a/crates/egui_demo_app/tests/test_demo_app.rs +++ b/crates/egui_demo_app/tests/test_demo_app.rs @@ -4,7 +4,10 @@ use egui_demo_app::{Anchor, WrapApp}; use egui_kittest::SnapshotResults; use egui_kittest::kittest::Queryable as _; -#[test] +fn main() { + test_demo_app(); +} + fn test_demo_app() { let mut harness = egui_kittest::Harness::builder() .with_size(Vec2::new(900.0, 600.0)) @@ -73,5 +76,8 @@ fn test_demo_app() { harness.run_steps(4); results.add(harness.try_snapshot(anchor.to_string())); + + harness.spawn_eframe_app(); + break; } } ```
This commit is contained in:
@@ -4,17 +4,21 @@ type AppKindUiState<'a, State> = Box<dyn FnMut(&mut egui::Ui, &mut State) + 'a>;
|
||||
type AppKindUi<'a> = Box<dyn FnMut(&mut egui::Ui) + 'a>;
|
||||
|
||||
/// In order to access the [`eframe::App`] trait from the generic `State`, we store a function pointer
|
||||
/// here that will return the dyn trait from the struct. In the builder we have the correct where
|
||||
/// clause to be able to create this.
|
||||
/// here that will return the dyn trait from the struct.
|
||||
/// In the builder we have the correct `where`-clause to be able to create this.
|
||||
/// Later we can use it anywhere to get the [`eframe::App`] from the `State`.
|
||||
#[cfg(feature = "eframe")]
|
||||
type AppKindEframe<'a, State> = (fn(&mut State) -> &mut dyn eframe::App, eframe::Frame);
|
||||
pub(crate) struct AppKindEframe<State> {
|
||||
pub get_app: fn(&mut State) -> &mut dyn eframe::App,
|
||||
pub take_app: fn(State) -> Box<dyn eframe::App>,
|
||||
pub frame: eframe::Frame,
|
||||
}
|
||||
|
||||
pub(crate) enum AppKind<'a, State> {
|
||||
Ui(AppKindUi<'a>),
|
||||
UiState(AppKindUiState<'a, State>),
|
||||
#[cfg(feature = "eframe")]
|
||||
Eframe(AppKindEframe<'a, State>),
|
||||
Eframe(AppKindEframe<State>),
|
||||
}
|
||||
|
||||
impl<State> AppKind<'_, State> {
|
||||
@@ -26,13 +30,10 @@ impl<State> AppKind<'_, State> {
|
||||
) -> Option<egui::Response> {
|
||||
match self {
|
||||
#[cfg(feature = "eframe")]
|
||||
AppKind::Eframe((get_app, frame)) => {
|
||||
AppKind::Eframe(AppKindEframe { get_app, frame, .. }) => {
|
||||
let app = get_app(state);
|
||||
|
||||
app.logic(ui, frame);
|
||||
|
||||
app.ui(ui, frame);
|
||||
|
||||
None
|
||||
}
|
||||
kind_ui => Some(kind_ui.run_ui(ui, state, sizing_pass)),
|
||||
|
||||
Reference in New Issue
Block a user