Files
cadcraft/crates/engine/tests/it/non_finite_edits.rs
T
aiongg 9cf115e808 CI: one test binary per crate, nextest, line tables only (#1989)
* Build: line tables only in dev, no debug info for dependencies

* Tests: one integration-test binary per crate

Each crate's tests/*.rs becomes a module of tests/it/main.rs. Files that
install process-wide state (the file io hooks, user aliases, SAVETIME and
SAVEFILEPATH, user linetype and pattern files, registered fonts) stay their
own test binaries.

* xtask ci: nextest, tests without examples, one wasm check call
2026-10-23 13:34:26 -04:00

57 lines
2.3 KiB
Rust

//! Edits whose result would have infinite or undefined coordinates fail and leave the drawing as it
//! was, whether they come as JSON (MCP, control channel) or are typed at the command line.
use cadcraft_engine::Session;
use serde_json::{Value, json};
fn circle(s: &mut Session) -> String {
s.execute("circle", &json!({"center": [0, 0], "radius": 1})).unwrap()["handle"].as_str().unwrap().to_string()
}
fn snapshot(s: &mut Session) -> (Value, usize) {
let i = s.execute("drawing.inspect", &json!({})).unwrap();
let undo = i["undo"].as_array().map_or(0, Vec::len);
(i["entities"].clone(), undo)
}
#[test]
fn json_transforms_that_overflow_are_refused() {
let huge = [1e308, 1e308];
let cases: Vec<(&str, Value)> = vec![
("move", json!({"delta": huge})),
("copy", json!({"delta": huge})),
("scale", json!({"base": [0, 0], "factor": 1e308})),
("rotate", json!({"base": [-1e308, -1e308], "angle": 180})),
("mirror", json!({"p1": [-1e308, -1e308], "p2": [-1e308, 0]})),
("arrayrect", json!({"rows": 3, "cols": 1, "rowSpacing": 1e308, "colSpacing": 1})),
("stretch", json!({"window": [[-2, -2], [1.7e308, 1.7e308]], "delta": huge})),
("offset", json!({"distance": 1e308, "side": [1.7e308, 1.7e308]})),
];
for (cmd, p) in cases {
let mut s = Session::new();
let h = circle(&mut s);
// Put it where the edit overflows: far out, then once more.
s.execute("move", &json!({"handles": [h], "delta": huge})).unwrap();
let before = snapshot(&mut s);
let mut p = p;
p["handles"] = json!([h]);
p["handle"] = json!(h);
let r = s.execute(cmd, &p);
let err = r.expect_err(&format!("{cmd} {p} must fail"));
assert!(err.to_string().contains("too large"), "{cmd}: {err}");
assert_eq!(snapshot(&mut s), before, "{cmd} must leave the drawing and undo history unchanged");
}
}
#[test]
fn typed_move_that_overflows_is_refused() {
let mut s = Session::new();
circle(&mut s);
s.script("MOVE ALL\n\n0,0 1e308,1e308\n").unwrap();
let before = snapshot(&mut s);
s.script("MOVE ALL\n\n0,0 1e308,1e308\n").unwrap();
assert_eq!(snapshot(&mut s), before);
assert!(s.log.iter().any(|l| l.contains("too large")), "{:?}", s.log);
assert!(s.running.is_none());
}