Verify projection API and preserve same-object explicit navigation

This commit is contained in:
2026-09-24 23:00:05 -07:00
parent 0341bca846
commit 603a59c178
4 changed files with 182 additions and 8 deletions
@@ -23,12 +23,13 @@ fn model_issue(error: persistence::FileError) -> validation::Issue {
#[test]
fn frozen_3_through_6_reject_cross_layer_nodes_but_keep_mixed_traceability() {
let node_id = Id::parse_str("00000000-0000-4000-8000-000000000004").unwrap();
for version in 3..=6 {
let source = format!(
"arcadia {version}; project compat \"Compatibility\" {{\n\
sa_function work \"Counterpart\" {{}}\n\
diagram view \"OA concern\" {{ layer Oa; projection Traceability; }}\n\
node occurrence {{ diagram @view; element @work; }}\n}}"
"arcadia {version}; project compat \"Compatibility\" id \"00000000-0000-4000-8000-000000000001\" {{\n\
sa_function work \"Counterpart\" id \"00000000-0000-4000-8000-000000000002\" {{}}\n\
diagram view \"OA concern\" id \"00000000-0000-4000-8000-000000000003\" {{ layer Oa; projection Traceability; }}\n\
node occurrence id \"00000000-0000-4000-8000-000000000004\" {{ diagram @view; element @work; }}\n}}"
);
let mixed = language::parse(&source).unwrap();
assert_eq!(
@@ -61,12 +62,13 @@ fn frozen_3_through_6_reject_cross_layer_nodes_but_keep_mixed_traceability() {
let diagram = latent.diagrams.values_mut().next().unwrap();
diagram.projection = ProjectionKind::Overview;
let node = diagram.nodes.values().next().unwrap().id;
assert_eq!(node, node_id);
if version >= 4 {
let diagnostic = errors
.iter()
.find(|error| error.code == "diagram_layer")
.unwrap();
assert_eq!(diagnostic.object_id, Some(node));
assert_eq!(diagnostic.object_id, Some(node_id));
assert_eq!(diagnostic.field.as_deref(), Some("element"));
let bundle = source_project::SourceBundle {
entry: "model.arcadia".into(),
@@ -80,7 +82,7 @@ fn frozen_3_through_6_reject_cross_layer_nodes_but_keep_mixed_traceability() {
.find(|error| error.diagnostic.code == "diagram_layer")
.unwrap()
.diagnostic;
assert_eq!(diagnostic.object_id, Some(node));
assert_eq!(diagnostic.object_id, Some(node_id));
assert_eq!(diagnostic.field.as_deref(), Some("element"));
}
let issue = model_issue(persistence::decode(&legacy_json(&latent, version)).unwrap_err());
@@ -103,7 +105,7 @@ fn frozen_3_through_6_reject_cross_layer_nodes_but_keep_mixed_traceability() {
.values_mut()
.next()
.unwrap()
.element = Id::new_v4();
.element = Id::parse_str("00000000-0000-4000-8000-000000000005").unwrap();
let issue = model_issue(persistence::decode(&legacy_json(&dangling, version)).unwrap_err());
assert_eq!(issue.code, "diagram_layer");
assert_eq!(issue.element, Some(node));