Files
deckcraft/crates/ui-egui/src/font_dialog_tests.rs
T
Nikita RakitinandCursor 68ab3a4839 UI: Font dialog sets character formatting in one step
format.fontDialog applies family, size, bold, italic, underline, colour,
strikethrough, baseline, caps and spacing together, so one undo restores
them. With no fields it asks the UI to open the dialog, seeded from the
selection. Home › Font, the shape menu and Cmd+T open it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:41:28 +03:00

66 lines
2.4 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! The Font dialog: Home › Font › Font… and Cmd+T open it, OK applies one undo step, Cancel does not.
use deckcraft_engine::Session;
use egui_kittest::Harness;
use egui_kittest::kittest::Queryable;
use serde_json::json;
use crate::{Services, SlideApp};
fn harness() -> Harness<'static, SlideApp> {
let mut s = Session::with_new();
s.execute("shape.insert", &json!({"preset": "rect", "rect": [80.0, 80.0, 320.0, 80.0], "text": "Hello"})).unwrap();
// A selected shape, not a caret: the dialog then formats the text that is already there.
let _ = s.execute("text.exit", &json!({}));
let app = SlideApp::new(s, Services::default());
let mut h = Harness::builder().with_size(egui::vec2(1440.0, 900.0)).with_step_dt(1.0 / 60.0).build_ui_state(
|ui, app: &mut SlideApp| {
app.logic(ui.ctx());
app.ui(ui);
},
app,
);
h.run_steps(4);
h
}
fn bold_of(h: &Harness<'_, SlideApp>) -> Option<bool> {
let st = h.state().session.active().unwrap();
st.selected_shapes()
.first()
.and_then(|sh| sh.text.as_ref())
.and_then(|t| t.paragraphs.first())
.and_then(|p| p.runs.first())
.and_then(|r| r.props.bold)
}
#[test]
fn font_button_applies_bold_from_the_dialog() {
let mut h = harness();
h.get_by_label("Font…").click();
// The opening frame ignores the click that summoned the window; the next one is live.
h.run_steps(2);
assert_eq!(h.state().dialog.as_ref().map(|d| d.id.as_str()), Some("font"));
// A pointer click on this checkbox does not register through kittest's per-event frames;
// the accessibility click does, and it is the same toggle a pointer click runs.
h.get_by_label("Bold").click_accesskit();
h.run_steps(1);
h.get_by_label("OK").click();
h.run_steps(1);
assert!(h.state().dialog.is_none(), "status {:?}", h.state().status);
assert_eq!(bold_of(&h), Some(true));
assert_eq!(h.state().session.active().unwrap().history.undo.last().unwrap().label, "Font…");
}
#[test]
fn command_t_opens_the_font_dialog_and_cancel_keeps_the_text() {
let mut h = harness();
h.key_press_modifiers(egui::Modifiers::COMMAND, egui::Key::T);
h.run_steps(1);
assert_eq!(h.state().dialog.as_ref().map(|d| d.id.as_str()), Some("font"), "status {:?}", h.state().status);
h.get_by_label("Cancel").click();
h.run_steps(1);
assert!(h.state().dialog.is_none());
assert_eq!(bold_of(&h), None);
}