Merge pull request #55 from storytold/pr/ui-dialog-stretch-test

UI: test that no dialog stretches with the screen
This commit is contained in:
BFlat 2026-10-05 04:13:34 +07:00 committed by GitHub
commit 0c950aae0e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 46 additions and 0 deletions

View File

@ -199,3 +199,49 @@ fn dialogs_are_as_tall_as_their_content() {
let prompt = height(&mut app, crate::unsaved::KIND, json!({"index": 0, "name": "Untitled-1", "then": "close"}));
assert!(prompt < 180.0 && prompt < tall, "save prompt {prompt} pt tall (the dialog before it: {tall} pt)");
}
#[test]
fn dialogs_do_not_stretch_to_the_screen() {
// A dialog is as tall as its content: the same on a short and a tall screen.
let openers: &[(&str, serde_json::Value)] = &[
("ui.newSwatch", json!({})),
("ui.newColorGroup", json!({})),
("ui.swatchOptions", json!({"name": "White"})),
("ui.colorPicker", json!({})),
("ui.graphicStyleOptions", json!({})),
("ui.colorGuideOptions", json!({})),
("ui.colorBalanceDialog", json!({})),
("ui.saturateDialog", json!({})),
("ui.saveSwatchLibrary", json!({})),
("ui.flattenTransparencyDialog", json!({})),
("ui.expandDialog", json!({})),
("ui.spotColors", json!({})),
("ui.paramDialog", json!({"command": "object.path.simplify", "label": "Simplify", "params": {"tolerance": 2}})),
("effect.dialog", json!({"effect": "distort.roughen"})),
];
let height = |id: &str, p: &serde_json::Value, screen_h: f32| -> Option<(String, f32)> {
let mut app = app();
app.run("shape.rectangle", json!({"x": 10, "y": 10, "width": 50, "height": 50})).unwrap();
app.run("select.all", json!({})).unwrap();
app.run(id, p.clone()).ok()?;
let kind = app.ui.dialog.as_ref()?.kind.clone();
spec(&kind).window.is_none().then_some(())?;
let ctx = egui::Context::default();
theme::install_fonts(&ctx);
theme::apply(&ctx, Default::default());
let screen = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(1600.0, screen_h));
for _ in 0..4 {
let input = egui::RawInput { screen_rect: Some(screen), ..Default::default() };
ctx.run_ui(input, |ui| show(&mut app, ui.ctx())).textures_delta.clear();
}
let h = ctx.memory(|m| m.area_rect(egui::Id::new(("dialog", kind.as_str()))))?.height();
Some((kind, h))
};
let mut checked = 0;
for (id, p) in openers {
let (Some((kind, short)), Some((_, tall))) = (height(id, p, 1000.0), height(id, p, 2000.0)) else { continue };
assert!((short - tall).abs() < 1.0, "{kind} is {short} pt tall on a 1000 pt screen but {tall} pt on a 2000 pt one");
checked += 1;
}
assert!(checked >= 10, "only {checked} dialogs drew in the shared frame");
}