forked from 1b-agent/opencadstudio-upstream
fix(automation): compare save_verified against the baked view
The before-manifest was taken pre-bake while save mints *D geometry on its clone, so every new dimension failed verification 1-vs-7. Compute before on a bake-simulated clone: baked-vs-baked proves roundtrip stability (bake correctness itself is pinned by the explode geometry tests). Pinned by save_verified_accepts_new_dimension_with_baked_block.
This commit is contained in:
1 parent
7d1fca000b
commit
fc19afa715
1 file changed
+44
-1
+44
-1
@@ -1398,7 +1398,13 @@ impl OpenCADStudio {
|
||||
// The same snapshot a normal save writes: display-only overrides and
|
||||
// resolved xref content stay out of the file.
|
||||
let snapshot = self.tabs[i].scene.document_for_save();
|
||||
let before = document_manifest(&snapshot);
|
||||
// Bake simulation: save_as_version mints *D geometry blocks on its
|
||||
// private clone, so the reopened manifest always contains baked
|
||||
// sub-entities. Compare against the same baked view or every new
|
||||
// (still blockless) dimension trips a false semantic_mismatch.
|
||||
let mut baked_view = snapshot.clone();
|
||||
crate::modules::draw::modify::explode::bake_dimension_blocks(&mut baked_view);
|
||||
let before = document_manifest(&baked_view);
|
||||
crate::io::save_as_version(&snapshot, &path, version)
|
||||
.map_err(|error| json!({
|
||||
"ok":false,"status":"failed","code":"save_failed","error":error,
|
||||
@@ -1572,6 +1578,43 @@ mod tests {
|
||||
let _ = std::fs::remove_file(path);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn save_verified_accepts_new_dimension_with_baked_block() {
|
||||
use codec::entities::{Dimension, DimensionLinear};
|
||||
use codec::{EntityType, Vector3};
|
||||
|
||||
let mut app = super::OpenCADStudio::new_for_test();
|
||||
app.automation_op(r#"{"op":"new"}"#);
|
||||
let i = app.active_tab;
|
||||
let mut d = DimensionLinear::new(Vector3::new(0.0, 0.0, 0.0), Vector3::new(10.0, 0.0, 0.0));
|
||||
d.definition_point = Vector3::new(0.0, 5.0, 0.0);
|
||||
d.base.text_middle_point = Vector3::new(5.0, 5.0, 0.0);
|
||||
app.tabs[i]
|
||||
.scene
|
||||
.document
|
||||
.add_entity(EntityType::Dimension(Dimension::Linear(d)))
|
||||
.unwrap();
|
||||
let path = std::env::temp_dir().join(format!(
|
||||
"ocs_verified_dim_{}_{}.dwg",
|
||||
std::process::id(),
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.as_nanos(),
|
||||
));
|
||||
let _ = std::fs::remove_file(&path);
|
||||
let result = app
|
||||
.save_verified_request(&serde_json::json!({
|
||||
"path":path,
|
||||
"target_format":"dwg",
|
||||
"overwrite":true,
|
||||
}))
|
||||
.expect("verified save of a new dimension");
|
||||
assert_eq!(result["verified"], true, "{result}");
|
||||
assert!(path.is_file());
|
||||
let _ = std::fs::remove_file(path);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn explicit_target_version_parser_never_silently_defaults() {
|
||||
assert_eq!(
|
||||
|
||||
Reference in new issue
Block a user