test: share migrated GridCraft UI harness setup

This commit is contained in:
skylar taylor-barrick
2026-10-25 09:21:03 +01:00
parent e9764f6446
commit c217639cb5
34 changed files with 114 additions and 345 deletions
+25
View File
@@ -12,6 +12,8 @@ use egui_kittest::HarnessBuilder;
use gridcraft_engine::Session;
use gridcraft_ui_egui::{Services, SheetApp};
pub type Harness = egui_kittest::Harness<'static, SheetApp>;
/// A kittest builder with the deterministic font set and GridCraft's visuals installed.
pub fn builder<State>() -> HarnessBuilder<State> {
egui_kittest::Harness::builder().with_context_setup(|ctx| {
@@ -30,3 +32,26 @@ pub fn prepare(mut app: SheetApp) -> SheetApp {
app.use_prepared_fonts();
app
}
/// Drive `app`'s `logic` then `ui` each frame in a harness built with `builder`.
///
/// Tests that need a non-standard size, step timing, OS or pixel ratio configure the builder
/// here so those details stay explicit; the shared font and lifecycle setup lives in `builder`
/// and `app`.
pub fn harness_with(builder: HarnessBuilder<SheetApp>, app: SheetApp, steps: usize) -> Harness {
let mut h = builder.build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
app,
);
h.run_steps(steps);
h
}
/// A 1200×800 harness that reports `os` to egui, for platform-specific input.
pub fn os_harness(session: Session, os: egui::os::OperatingSystem) -> Harness {
harness_with(builder().with_os(os).with_size(egui::vec2(1200.0, 800.0)), app(session), 4)
}
+1 -13
View File
@@ -1,24 +1,12 @@
//! Advanced Filter's dialog must route both actions to the same engine command.
use egui::vec2;
use egui_kittest::kittest::Queryable;
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
use gridcraft_ui_egui::control::{Outcome, handle};
use serde_json::{Value as Json, json};
fn harness() -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(&ui.ctx().clone());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(6);
h
crate::support::blank_harness(6)
}
fn control(h: &mut egui_kittest::Harness<'static, SheetApp>, method: &str, params: Json) -> Json {
@@ -1,6 +1,6 @@
//! Text fields over workbook values (chart titles, table name) keep what the user types until they commit it.
use egui::{Event, Key, Modifiers, accesskit::Role, vec2};
use egui::{Event, Key, Modifiers, accesskit::Role};
use egui_kittest::kittest::Queryable as _;
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
@@ -9,16 +9,7 @@ use serde_json::json;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn session() -> Session {
@@ -2,7 +2,6 @@
//! The tab remembered in the saved UI state, or left behind when the selection moves away, must
//! not leave the ribbon blank: it falls back to Home.
use egui::vec2;
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
use serde_json::json;
@@ -10,16 +9,7 @@ use serde_json::json;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn session_with_table() -> Session {
@@ -34,16 +24,7 @@ fn session_with_table() -> Session {
fn app_restored_on(tab: &str, session: Session) -> Harness {
let mut app = crate::common::app(session);
app.ui.ribbon_tab = tab.into();
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
app,
);
h.run_steps(4);
h
crate::support::app_harness(app, 4)
}
#[test]
+1 -13
View File
@@ -1,24 +1,12 @@
//! `ui.dialog.confirm` runs a dialog's command with the parameters its OK button sends (#1459).
use egui::vec2;
use gridcraft_engine::Session;
use gridcraft_engine::model::CfRule;
use gridcraft_ui_egui::SheetApp;
use gridcraft_ui_egui::control::{Outcome, handle};
use serde_json::{Value as Json, json};
fn harness() -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(&ui.ctx().clone());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(6);
h
crate::support::blank_harness(6)
}
fn control(h: &mut egui_kittest::Harness<'static, SheetApp>, method: &str, params: Json) -> Json {
+2 -13
View File
@@ -3,23 +3,12 @@
use std::sync::{Arc, Mutex};
use egui_kittest::kittest::Queryable as _;
use gridcraft_engine::{Session, core::CellRef, core::Value};
use gridcraft_engine::{core::CellRef, core::Value};
use gridcraft_ui_egui::i18n::Language;
use gridcraft_ui_egui::{Services, SheetApp};
fn harness(services: Services) -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::prepare(SheetApp::new(session, services)),
);
h.run_steps(4);
h
crate::support::services_harness(services, 4)
}
/// Opens File (the Backstage view) and clicks a navigation entry or page button.
@@ -13,15 +13,7 @@ fn harness() -> egui_kittest::Harness<'static, SheetApp> {
session.execute("range.setValues", json!({"range": "A1", "values": [[1], [2], [3], [4], [5], [6]]})).unwrap();
session.execute("range.setValues", json!({"range": "B1", "values": [[10], [20], [30]]})).unwrap();
session.execute("selection.set", json!({"range": "B1:B3"})).unwrap();
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
fn handle(h: &egui_kittest::Harness<'_, SheetApp>) -> Pos2 {
@@ -15,15 +15,7 @@ fn harness(setup: impl FnOnce(&mut Session)) -> Harness {
let mut session = Session::new();
session.new_workbook();
setup(&mut session);
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
/// B1:B2 holds 1, 2 and is selected.
@@ -15,15 +15,7 @@ fn harness(setup: impl FnOnce(&mut Session)) -> Harness {
let mut session = Session::new();
session.new_workbook();
setup(&mut session);
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
/// B1:B2 holds 1, 2 and is selected.
+1 -13
View File
@@ -1,7 +1,6 @@
//! Opening Find and Replace puts the cursor in "Find what", so the user can type at once.
use egui::{Event, Key, Modifiers};
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
use serde_json::json;
@@ -11,18 +10,7 @@ type Harness = egui_kittest::Harness<'static, SheetApp>;
const CTRL: Modifiers = Modifiers { alt: false, ctrl: true, shift: false, mac_cmd: false, command: true };
fn harness() -> Harness {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(6);
h
crate::support::blank_harness(6)
}
fn type_after_shortcut(k: Key) -> Option<serde_json::Value> {
+2 -13
View File
@@ -2,8 +2,7 @@
use std::io::Cursor;
use egui::{Shape, TextureId, vec2};
use gridcraft_engine::Session;
use egui::{Shape, TextureId};
use gridcraft_ui_egui::SheetApp;
use serde_json::json;
@@ -15,17 +14,7 @@ fn png(color: [u8; 4]) -> Vec<u8> {
}
fn harness() -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(&ui.ctx().clone());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::blank_harness(4)
}
fn picture_textures(h: &egui_kittest::Harness<'static, SheetApp>) -> Vec<TextureId> {
+1 -10
View File
@@ -18,16 +18,7 @@ fn harness() -> Harness {
session.execute("home.bold", json!({"range": "A1", "on": true})).unwrap();
session.execute("home.fillColor", json!({"range": "A1", "color": "#FFFF00"})).unwrap();
session.execute("selection.set", json!({"cell": "A1"})).unwrap();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn style(h: &Harness, a1: &str) -> Style {
+1 -10
View File
@@ -18,16 +18,7 @@ fn harness() -> Harness {
session.new_workbook();
session.execute("cell.set", json!({"cell": "A1", "input": "text"})).unwrap();
session.execute("selection.set", json!({"range": "A1"})).unwrap();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn ctrl_shift_u(h: &mut Harness, m: Modifiers) {
+2 -10
View File
@@ -1,6 +1,6 @@
//! Freezing panes by dragging the freeze handles on the header edges (#195).
use egui::{Event, Modifiers, PointerButton, Pos2, pos2, vec2};
use egui::{Event, Modifiers, PointerButton, Pos2, pos2};
use gridcraft_engine::Session;
use gridcraft_engine::core::CellRef;
use gridcraft_ui_egui::SheetApp;
@@ -11,15 +11,7 @@ type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness() -> Harness {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
fn geo(h: &Harness) -> Geo {
+1 -10
View File
@@ -9,16 +9,7 @@ use gridcraft_ui_egui::{SheetApp, grid::Geo};
use serde_json::json;
fn harness(session: Session) -> egui_kittest::Harness<'static, SheetApp> {
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn blank() -> Session {
+1 -10
View File
@@ -11,16 +11,7 @@ use serde_json::json;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn book(selected: &str) -> Session {
+1 -9
View File
@@ -14,15 +14,7 @@ use gridcraft_ui_egui::SheetApp;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder().with_os(OperatingSystem::Nix).with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::common::os_harness(session, OperatingSystem::Nix)
}
fn blank() -> Session {
+1
View File
@@ -88,6 +88,7 @@ mod show_objects;
mod shrink_to_fit;
mod sort_dialog_columns;
mod status_bar_menu;
mod support;
mod symbol_glyphs;
mod system_theme;
mod tab_split;
+1 -12
View File
@@ -9,18 +9,7 @@ use serde_json::json;
const PW: &str = "synthetic-pw-8842";
fn harness(services: Services) -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::prepare(SheetApp::new(session, services)),
);
h.run_steps(4);
h
crate::support::services_harness(services, 4)
}
/// A workbook with 42 in A1, saved as `.xlsx` and encrypted with `PW`.
+2 -10
View File
@@ -1,7 +1,7 @@
//! The outline band of grouped rows and columns: − / + and level buttons (#373), and the
//! Outline Settings dialog that moves the summary rows above their detail.
use egui::{Event, Modifiers, PointerButton, Pos2, vec2};
use egui::{Event, Modifiers, PointerButton, Pos2};
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
use gridcraft_ui_egui::outline::{Action, layout};
@@ -12,15 +12,7 @@ type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness() -> Harness {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
fn click(h: &mut Harness, pos: Pos2) {
+5 -11
View File
@@ -32,17 +32,11 @@ fn fixture_with(rtl: bool, setup: Option<serde_json::Value>) -> Harness {
}
session.execute("pageLayout.headerFooter", json!({"header": "&LLeft"})).unwrap();
session.execute("view.pageLayout", json!({})).unwrap();
let mut h =
crate::common::builder().with_size(vec2(1200.0, 900.0)).with_step_dt(1.0 / 60.0).with_os(egui::os::OperatingSystem::Mac).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::common::harness_with(
crate::common::builder().with_size(vec2(1200.0, 900.0)).with_step_dt(1.0 / 60.0).with_os(egui::os::OperatingSystem::Mac),
crate::common::app(session),
4,
)
}
fn geo(h: &Harness) -> Geo {
+2 -10
View File
@@ -2,7 +2,7 @@
//! Show Details) unless its Enable show details option is off; a label of the report still opens
//! the cell for editing.
use egui::{Event, Modifiers, PointerButton, Pos2, vec2};
use egui::{Event, Modifiers, PointerButton, Pos2};
use gridcraft_engine::Session;
use gridcraft_engine::core::CellRef;
use gridcraft_ui_egui::{SheetApp, grid::Geo};
@@ -17,15 +17,7 @@ fn harness() -> egui_kittest::Harness<'static, SheetApp> {
.execute("insert.pivotTable", json!({"source": "Sheet1!A1:B4", "destination": "Sheet1!D3", "rows": ["Region"], "values": ["Sales"]}))
.unwrap();
session.execute("selection.set", json!({"cell": "A1"})).unwrap();
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
fn center(h: &egui_kittest::Harness<'_, SheetApp>, cell: &str) -> Pos2 {
@@ -1,7 +1,7 @@
//! Right-clicking a PivotTable's value cell offers Show Details in the cell menu (Excel's
//! right-click › Show Details); labels of the report and ordinary cells don't offer it.
use egui::{Event, Modifiers, PointerButton, Pos2, vec2};
use egui::{Event, Modifiers, PointerButton, Pos2};
use egui_kittest::kittest::Queryable as _;
use gridcraft_engine::Session;
use gridcraft_engine::core::{CellRef, Value};
@@ -17,15 +17,7 @@ fn harness() -> egui_kittest::Harness<'static, SheetApp> {
.execute("insert.pivotTable", json!({"source": "Sheet1!A1:B4", "destination": "Sheet1!D3", "rows": ["Region"], "values": ["Sales"]}))
.unwrap();
session.execute("selection.set", json!({"cell": "A1"})).unwrap();
let mut h = crate::common::builder().with_step_dt(1.0 / 60.0).with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::stepped_harness(session)
}
fn center(h: &egui_kittest::Harness<'_, SheetApp>, cell: &str) -> Pos2 {
+1 -13
View File
@@ -2,25 +2,13 @@
use egui::accesskit::Role;
use egui_kittest::kittest::Queryable as _;
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
use serde_json::json;
const SECRET: &str = "s3cret";
fn harness() -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::blank_harness(4)
}
fn type_password(h: &mut egui_kittest::Harness<'static, SheetApp>) {
+1 -10
View File
@@ -14,16 +14,7 @@ fn harness() -> Harness {
session.execute("range.setValues", json!({"range": "A1", "values": [["first", 2], [3, "fourth"]]})).unwrap();
session.execute("view.rightToLeft", json!({"on": true})).unwrap();
session.execute("selection.set", json!({"cell": "B2"})).unwrap();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn geo(h: &Harness) -> Geo {
+1 -10
View File
@@ -10,16 +10,7 @@ use serde_json::json;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
/// Header row + three rows; the user's cursor sits in column B (Revenue).
+41
View File
@@ -0,0 +1,41 @@
//! Constructors for the suite's usual harness shapes.
//!
//! The strict font and lifecycle setup stays in `crate::common`; these wrap it at the sizes and
//! step timings the `it` tests share. Keeping them here (rather than in `common`) leaves the
//! `keytips` test binary's copy of `common` free of helpers only this binary uses.
use crate::common::{Harness, app, builder, harness_with, prepare};
use gridcraft_engine::Session;
use gridcraft_ui_egui::{Services, SheetApp};
/// A blank workbook session, as most integration tests start.
pub fn blank_session() -> Session {
let mut session = Session::new();
session.new_workbook();
session
}
/// The suite's usual 1200×800 harness around `session`, warmed for `steps` frames.
pub fn harness(session: Session, steps: usize) -> Harness {
harness_with(builder().with_size(egui::vec2(1200.0, 800.0)), app(session), steps)
}
/// A blank workbook in the suite's usual 1200×800 harness.
pub fn blank_harness(steps: usize) -> Harness {
harness(blank_session(), steps)
}
/// A 1200×800 harness advancing in 1/60 s frames, for drags and hover sequences.
pub fn stepped_harness(session: Session) -> Harness {
harness_with(builder().with_step_dt(1.0 / 60.0).with_size(egui::vec2(1200.0, 800.0)), app(session), 4)
}
/// A harness around an app built with the caller's `Services` (e.g. a test inbox).
pub fn services_harness(services: Services, steps: usize) -> Harness {
harness_with(builder().with_size(egui::vec2(1200.0, 800.0)), prepare(SheetApp::new(blank_session(), services)), steps)
}
/// A harness around an already-prepared `app`, at the suite's usual 1200×800 size.
pub fn app_harness(app: SheetApp, steps: usize) -> Harness {
harness_with(builder().with_size(egui::vec2(1200.0, 800.0)), app, steps)
}
+5 -10
View File
@@ -22,16 +22,11 @@ fn fixture() -> (Harness, u32) {
session.execute("selection.set", json!({"cell": "B2"})).unwrap();
let id = session.execute("insert.textBox", json!({"at": "B2", "width": 240, "height": 120, "text": ORIGINAL})).unwrap()["shape"].as_u64().unwrap()
as u32;
let mut h =
crate::common::builder().with_size(vec2(1200.0, 800.0)).with_step_dt(1.0 / 60.0).with_os(egui::os::OperatingSystem::Mac).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
let h = crate::common::harness_with(
crate::common::builder().with_size(vec2(1200.0, 800.0)).with_step_dt(1.0 / 60.0).with_os(egui::os::OperatingSystem::Mac),
crate::common::app(session),
4,
);
(h, id)
}
+1 -10
View File
@@ -6,16 +6,7 @@ use gridcraft_engine::core::CellRef;
use gridcraft_ui_egui::SheetApp;
fn harness(session: Session) -> egui_kittest::Harness<'static, SheetApp> {
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn blank() -> Session {
+1 -10
View File
@@ -9,16 +9,7 @@ use serde_json::json;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::harness(session, 4)
}
fn active(h: &Harness) -> String {
@@ -2,24 +2,12 @@
//! and OK/Cancel buttons already were (Page Setup showed "Left margin (in):" in every language).
use egui_kittest::kittest::Queryable as _;
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
use gridcraft_ui_egui::i18n::Language;
use serde_json::json;
fn harness() -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::support::blank_harness(4)
}
#[test]
+1 -12
View File
@@ -1,6 +1,5 @@
//! The Zoom dialog stores the Magnification the user picks.
use egui::vec2;
use egui_kittest::kittest::Queryable;
use gridcraft_engine::Session;
use gridcraft_ui_egui::SheetApp;
@@ -8,17 +7,7 @@ use gridcraft_ui_egui::control::{Outcome, handle};
use serde_json::{Value as Json, json};
fn harness() -> egui_kittest::Harness<'static, SheetApp> {
let mut session = Session::new();
session.new_workbook();
let mut h = crate::common::builder().with_size(vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(&ui.ctx().clone());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(6);
h
crate::support::blank_harness(6)
}
fn zoom(h: &egui_kittest::Harness<'static, SheetApp>) -> u16 {
+1 -9
View File
@@ -18,15 +18,7 @@ fn harness(session: Session) -> Harness {
}
fn harness_on(session: Session, os: OperatingSystem) -> Harness {
let mut h = crate::common::builder().with_os(os).with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::common::os_harness(session, os)
}
fn blank() -> Session {
+1 -12
View File
@@ -365,18 +365,7 @@ use gridcraft_ui_egui::SheetApp;
type Harness = egui_kittest::Harness<'static, SheetApp>;
fn harness(session: Session) -> Harness {
let mut h = crate::common::builder()
.with_os(OperatingSystem::Nix)
.with_size(egui::vec2(1200.0, 800.0))
.build_ui_state(
|ui, app: &mut SheetApp| {
app.logic(ui.ctx());
app.ui(ui);
},
crate::common::app(session),
);
h.run_steps(4);
h
crate::common::os_harness(session, OperatingSystem::Nix)
}
fn blank() -> Session {