mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-24 02:46:51 -06:00
* 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
74 lines
3.4 KiB
Rust
74 lines
3.4 KiB
Rust
//! -LAYER: the command-line option loop runs the layer commands and ends on Enter.
|
|
|
|
use cadcraft_engine::Session;
|
|
use cadcraft_engine::doc::{EntityKind, Lineweight};
|
|
use serde_json::json;
|
|
|
|
#[test]
|
|
fn make_and_color_then_the_next_command_runs() {
|
|
let mut s = Session::new();
|
|
s.script("-LAYER M Walls C 1 Walls\n\nLINE 0,0 10,0\n\n").unwrap();
|
|
assert!(s.running.is_none(), "{}", s.prompt_text());
|
|
let d = s.doc().unwrap();
|
|
let walls = d.layer("Walls").expect("Walls created");
|
|
assert_eq!(walls.color, cadcraft_color::Color::Index(1));
|
|
assert_eq!(d.header.str("CLAYER", "0"), "Walls");
|
|
let lines: Vec<_> = d.model.iter().filter(|e| matches!(e.kind, EntityKind::Line(_))).collect();
|
|
assert_eq!(lines.len(), 1, "{:?}", s.log);
|
|
assert_eq!(lines[0].common.layer, "Walls");
|
|
// The whole -LAYER session is one undo step.
|
|
assert_eq!(s.state().unwrap().undo.len(), 2);
|
|
s.undo().unwrap();
|
|
s.undo().unwrap();
|
|
assert!(s.doc().unwrap().layer("Walls").is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn options_reach_every_layer_property() {
|
|
let mut s = Session::new();
|
|
s.cmdline("linetype {\"load\": \"DASHED\"}").unwrap();
|
|
s.cmdline("-LAYER").unwrap();
|
|
assert!(
|
|
s.prompt_text().contains(
|
|
"[?/Make/Set/New/Rename/ON/OFF/Color/Ltype/LWeight/TRansparency/MATerial/Plot/Freeze/Thaw/LOck/Unlock/stAte/Description/rEconcile]"
|
|
),
|
|
"{}",
|
|
s.prompt_text()
|
|
);
|
|
// MATerial is not available yet and must not swallow the next option.
|
|
let script =
|
|
"N A,B\nMAT\nS A\nF A\nF B\nLO B\nOFF A\nY\nTR 50 B\nLW 0.3 B\nP N B\nL NOPE\nL DASHED B\nC T 10,20,30 B\nD\nnote here\nB\nR B C\n?\n\n\n";
|
|
s.script(script).unwrap();
|
|
assert!(s.running.is_none(), "{}", s.prompt_text());
|
|
let d = s.doc().unwrap();
|
|
assert_eq!(d.header.str("CLAYER", "0"), "A");
|
|
let a = d.layer("A").unwrap();
|
|
assert!(!a.on, "the current layer is turned off after Yes");
|
|
assert!(!a.frozen, "the current layer cannot be frozen");
|
|
assert!(d.layer("B").is_none(), "B was renamed");
|
|
let c = d.layer("C").unwrap();
|
|
assert!(c.frozen && c.locked && !c.plot);
|
|
assert_eq!(c.transparency, 50);
|
|
assert_eq!(c.lineweight, Lineweight::Mm100(30));
|
|
assert_eq!(c.linetype, "DASHED", "NOPE is refused and DASHED applied: {:?}", s.log);
|
|
assert_eq!(c.color, cadcraft_color::Color::True(cadcraft_color::Rgb(10, 20, 30)));
|
|
assert_eq!(c.description, "note here");
|
|
assert!(s.log.iter().any(|l| l.contains("not available yet")));
|
|
assert!(s.log.iter().any(|l| l.contains("NOPE")));
|
|
}
|
|
|
|
#[test]
|
|
fn layer_commands_reject_unloaded_linetypes_and_duplicate_renames() {
|
|
let mut s = Session::new();
|
|
assert!(s.execute("layer.new", &json!({ "name": "A", "linetype": "NOPE" })).is_err());
|
|
assert!(s.doc().unwrap().layer("A").is_none());
|
|
s.execute("layer.new", &json!({ "name": "A" })).unwrap();
|
|
s.execute("layer.new", &json!({ "name": "B" })).unwrap();
|
|
assert!(s.execute("layer.set", &json!({ "name": "A", "linetype": "ByLayer" })).is_err());
|
|
assert!(s.execute("layer.set", &json!({ "name": "A", "newName": "b" })).is_err());
|
|
assert_eq!(s.doc().unwrap().layers.iter().filter(|l| l.name.eq_ignore_ascii_case("b")).count(), 1);
|
|
// A case-only rename of the same layer is fine.
|
|
s.execute("layer.set", &json!({ "name": "A", "newName": "a", "linetype": "continuous" })).unwrap();
|
|
assert_eq!(s.doc().unwrap().layer("a").unwrap().linetype, "Continuous");
|
|
}
|