Files
cadcraft/crates/engine/tests/mleader_remember.rs
Valentin KleinandClaude Opus 5.5 de8ed87a6e MLEADER remembers the placement order and Options (fixes #362) (#365)
The next MLEADER started again with "arrowhead first", Maxpoints 2 and
a landing line. As in AutoCAD, the order (arrowhead, landing or content
first) and the Options values (Maxpoints, leader landing, content type,
first and second angle) are now kept in Session::last_used for the
rest of the session and are where the next MLEADER starts. JSON calls
keep their documented defaults.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:09:20 -04:00

49 lines
1.9 KiB
Rust

//! MLEADER starts with the placement order and Options chosen the last time (#247 follow-up).
use cadcraft_engine::Session;
use cadcraft_engine::doc::{EntityKind, MLeader};
use cadcraft_engine::geom::Vec2;
use serde_json::json;
fn last_mleader(s: &Session) -> MLeader {
match &s.doc().unwrap().model.last().unwrap().kind {
EntityKind::MLeader(m) => m.clone(),
other => panic!("not a multileader: {other:?}"),
}
}
fn near(a: Vec2, b: Vec2) -> bool {
a.dist(b) < 1e-6
}
#[test]
fn mleader_remembers_order_and_options() {
let mut s = Session::new();
// Landing first, then Options: Maxpoints 3, no landing line.
s.script("mleader l o m 3 a n x 10,5 5,5 0,0 one\n").unwrap();
let m = last_mleader(&s);
assert!(near(m.leaders[0][0].xy(), Vec2::ZERO) && near(m.landing.xy(), Vec2::new(10.0, 5.0)), "{m:?}");
assert_eq!(m.dogleg, 0.0);
// The next MLEADER asks for the landing first and keeps both options.
s.cmdline("mleader").unwrap();
assert!(s.prompt_text().contains("landing location"), "{}", s.prompt_text());
s.script("20,5 15,5 10,0 two\n").unwrap();
let m = last_mleader(&s);
assert_eq!(m.leaders[0].len(), 2, "three points (Maxpoints 3): {m:?}");
assert!(near(m.leaders[0][0].xy(), Vec2::new(10.0, 0.0)) && near(m.landing.xy(), Vec2::new(20.0, 5.0)), "{m:?}");
assert_eq!(m.dogleg, 0.0);
assert_eq!(m.text.unwrap().contents, "two");
// Switching back to arrowhead first is remembered too, also when the command is cancelled.
s.script("mleader h\n").unwrap();
s.cancel();
s.cmdline("mleader").unwrap();
assert!(s.prompt_text().contains("arrowhead location"), "{}", s.prompt_text());
s.cancel();
// JSON calls keep their documented defaults (landing line drawn).
s.execute("mleader", &json!({"points": [[0, 0], [5, 5]], "text": "json"})).unwrap();
assert!(last_mleader(&s).dogleg > 0.0);
}