mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-25 19:36:49 -06:00
Squash of PR #503 by @vangel76. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.6 KiB
Rust
61 lines
2.6 KiB
Rust
//! Typed ZOOM Center, Scale, Dynamic and a plain scale factor do what they say, and ZOOM All /
|
||
//! Extents in paper space fit the sheet (#388).
|
||
|
||
use cadcraft_engine::{Session, View};
|
||
use cadcraft_geom::Vec2;
|
||
use serde_json::json;
|
||
|
||
fn view(s: &Session) -> View {
|
||
s.state().unwrap().view()
|
||
}
|
||
|
||
fn near(a: f64, b: f64) -> bool {
|
||
(a - b).abs() < 1e-6 * b.abs().max(1.0)
|
||
}
|
||
|
||
#[test]
|
||
fn zoom_center_scale_dynamic_and_paper_space_all() {
|
||
let mut s = Session::new();
|
||
s.viewport_px = (1600.0, 900.0);
|
||
s.execute("limits", &json!({ "min": [0, 0], "max": [420, 297] })).unwrap();
|
||
s.execute("line", &json!({ "points": [[0, 0], [1000, 0]] })).unwrap();
|
||
|
||
// Center: point, then a height; nX is a magnification of the current height.
|
||
s.cmdline("ZOOM C").unwrap();
|
||
assert_eq!(s.current_prompt().unwrap().display(), "Specify center point:");
|
||
s.cmdline("500,0").unwrap();
|
||
assert!(s.current_prompt().unwrap().display().starts_with("Enter magnification or height <"));
|
||
s.cmdline("100").unwrap();
|
||
assert!(s.current_prompt().is_none());
|
||
let v = view(&s);
|
||
assert!(v.center.near(Vec2::new(500.0, 0.0), 1e-9) && near(v.height, 100.0), "{v:?}");
|
||
s.script("ZOOM C 0,0 2X\n").unwrap();
|
||
let v = view(&s);
|
||
assert!(v.center.near(Vec2::ZERO, 1e-9) && near(v.height, 50.0), "{v:?}");
|
||
|
||
// Scale: nX relative to the view; a plain n relative to the limits (1 fits them).
|
||
s.script("ZOOM S 0.5X\n").unwrap();
|
||
assert!(near(view(&s).height, 100.0), "{:?}", view(&s));
|
||
s.cmdline("ZOOM 1").unwrap();
|
||
// 420 × 297 at 16:9 is limited by the height.
|
||
assert!(near(view(&s).height, 297.0) && view(&s).center.near(Vec2::ZERO, 1e-9), "{:?}", view(&s));
|
||
s.cmdline("ZOOM S 2").unwrap();
|
||
assert!(near(view(&s).height, 148.5), "{:?}", view(&s));
|
||
|
||
// Dynamic: a point places the view box (the size of the view before), Enter shows it (#463).
|
||
s.script("ZOOM D 80,45\n\n").unwrap();
|
||
assert!(s.current_prompt().is_none());
|
||
let v = view(&s);
|
||
assert!(v.center.near(Vec2::new(80.0, 45.0), 1e-9) && near(v.height, 148.5), "{v:?}");
|
||
|
||
// Paper space: All and Extents (no paper objects) fit the sheet, not the model limits.
|
||
s.execute("layout.set", &json!({ "name": "Layout1" })).unwrap();
|
||
let sheet = s.zoom_limits().unwrap();
|
||
assert!(sheet.min == Vec2::ZERO && !near(sheet.max.x, 420.0), "the sheet, not the limits: {sheet:?}");
|
||
s.cmdline("ZOOM E").unwrap();
|
||
assert!(view(&s).center.near(sheet.center(), 1e-9), "{:?} vs {sheet:?}", view(&s));
|
||
s.cmdline("ZOOM A").unwrap();
|
||
let v = view(&s);
|
||
assert!(v.center.near(sheet.center(), 1e-9) && v.height < 297.0 && v.height >= sheet.height(), "{v:?} vs {sheet:?}");
|
||
}
|