cadcraft/apps/cadcraft-cli/tests/drafting_spacing.rs

84 lines
2.7 KiB
Rust

//! Drawing snap/grid spacing survives saving and opening in a fresh CLI process (#607).
use std::path::PathBuf;
use std::process::Command;
use std::sync::atomic::{AtomicU64, Ordering};
use serde_json::{Value, json};
static NEXT_FILE: AtomicU64 = AtomicU64::new(0);
struct DxfFile(PathBuf);
impl DxfFile {
fn new() -> Self {
let path =
std::env::temp_dir().join(format!("cadcraft-drafting-spacing-{}-{}.dxf", std::process::id(), NEXT_FILE.fetch_add(1, Ordering::Relaxed)));
std::fs::File::options().write(true).create_new(true).open(&path).expect("reserve test DXF");
Self(path)
}
}
impl Drop for DxfFile {
fn drop(&mut self) {
let _ = std::fs::remove_file(&self.0);
}
}
fn cli(args: &[&str]) -> Vec<Value> {
let out = Command::new(env!("CARGO_BIN_EXE_cadcraft-cli")).args(args).output().expect("run cadcraft-cli");
assert!(out.status.success(), "{args:?}: {}", String::from_utf8_lossy(&out.stderr));
String::from_utf8_lossy(&out.stdout).lines().map(|line| serde_json::from_str(line).expect("CLI JSON reply")).collect()
}
#[test]
fn quarter_unit_spacing_survives_save_and_reopen() {
let file = DxfFile::new();
let path = file.0.to_str().expect("test file path");
cli(&[
"run",
"--sample",
"--cmd",
r#"setvar {"name":"SNAPUNIT","value":[0.25,0.25]}"#,
"--cmd",
r#"setvar {"name":"GRIDUNIT","value":[0.25,0.25]}"#,
"--save",
path,
]);
let replies = cli(&["run", path, "--cmd", r#"getvar {"name":"SNAPUNIT"}"#, "--cmd", r#"getvar {"name":"GRIDUNIT"}"#]);
for name in ["SNAPUNIT", "GRIDUNIT"] {
let reply = replies.iter().find(|r| r["name"] == name).expect("getvar reply");
assert_eq!(reply["value"], json!([0.25, 0.25]), "{name} reset on reopen");
}
}
#[test]
fn drafting_settings_spacing_roundtrips_without_persisting_osmode() {
let file = DxfFile::new();
let path = file.0.to_str().expect("test file path");
cli(&[
"run",
"--sample",
"--cmd",
r#"dsettings {"snapunit":[0.25,0.125],"gridunit":[0.75,1.5]}"#,
"--cmd",
r#"setvar {"name":"OSMODE","value":0}"#,
"--save",
path,
]);
let replies = cli(&[
"run",
path,
"--cmd",
r#"getvar {"name":"SNAPUNIT"}"#,
"--cmd",
r#"getvar {"name":"GRIDUNIT"}"#,
"--cmd",
r#"getvar {"name":"OSMODE"}"#,
]);
for (name, expected) in [("SNAPUNIT", json!([0.25, 0.125])), ("GRIDUNIT", json!([0.75, 1.5])), ("OSMODE", json!(4133))] {
let reply = replies.iter().find(|r| r["name"] == name).expect("getvar reply");
assert_eq!(reply["value"], expected, "{name} after reopening");
}
}