cadcraft/crates/engine/tests/plot_sheets.rs

50 lines
2.1 KiB
Rust

//! PLOT / EXPORTPDF with several sheets (issue #560): `layouts` names the sheets of one PDF
//! (any case, or "all"); the engine checks them and reports the pages.
use cadcraft_engine::Session;
use cadcraft_engine::cmd::file::{IoHooks, base64_decode, set_io};
use serde_json::{Value, json};
/// A plotter that echoes the sheets it was asked for.
fn fake_plot(_: &cadcraft_doc::Drawing, space: &cadcraft_doc::Space, opts: &Value) -> Result<Vec<u8>, String> {
Ok(format!("%PDF-1.4 {space:?} {}", opts.get("layouts").map(Value::to_string).unwrap_or_default()).into_bytes())
}
fn session() -> Session {
set_io(IoHooks { read: |_, _| Err("no reader in this test".into()), write: |_, _| Err("no writer in this test".into()), plot: Some(fake_plot) });
let mut s = Session::new();
s.execute("line", &json!({"points": [[0, 0], [100, 0]]})).unwrap();
s.execute("layout.new", &json!({"name": "Sheet B"})).unwrap();
s
}
fn plotted(r: &Value) -> String {
String::from_utf8(base64_decode(r["data"].as_str().unwrap()).unwrap()).unwrap()
}
#[test]
fn layouts_name_the_sheets_of_one_pdf() {
let mut s = session();
for cmd in ["plot", "exportpdf"] {
let r = s.execute(cmd, &json!({"layouts": ["model", "sheet b"]})).unwrap();
assert_eq!(r["pages"], 2);
assert_eq!(r["layout"], "Model");
assert!(plotted(&r).ends_with(r#"["model","sheet b"]"#), "the plotter gets the list: {}", plotted(&r));
}
// "all": model (it has objects), then the layouts in tab order.
let r = s.execute("exportpdf", &json!({"layouts": "all"})).unwrap();
assert_eq!((r["pages"].as_u64(), r["layout"].as_str()), (Some(4), Some("Model")));
// One sheet without `layouts` as before.
assert_eq!(s.execute("plot", &json!({})).unwrap()["pages"], 1);
}
#[test]
fn bad_sheet_lists_are_errors() {
let mut s = session();
let many = vec!["Model"; 257];
for p in [json!({"layouts": []}), json!({"layouts": ["Nope"]}), json!({"layouts": "Model"}), json!({"layouts": [7]}), json!({ "layouts": many })]
{
assert!(s.execute("exportpdf", &p).is_err(), "{p}");
}
}