From e34ba27e26ede3ab55f276acc250d92b2e0c3204 Mon Sep 17 00:00:00 2001 From: "sorokin.oleg.edu" Date: Wed, 23 Sep 2026 06:12:13 -0700 Subject: [PATCH] Repair mounted Scenario fixtures for qualified owners and inspector tabs --- .../src/app/behavior_removal_tests.rs | 26 +++++++++++++++++++ .../scenario/workspace/details_tests.rs | 14 +++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/crates/oa-desktop/src/app/behavior_removal_tests.rs b/crates/oa-desktop/src/app/behavior_removal_tests.rs index 4d31218f..1159423f 100644 --- a/crates/oa-desktop/src/app/behavior_removal_tests.rs +++ b/crates/oa-desktop/src/app/behavior_removal_tests.rs @@ -180,10 +180,36 @@ async fn mounted_scenario_use_delete_keeps_definition_and_second_use_and_rejects send(&mut mounted, &mut app, Message::ConfirmDelete(stale)).await; assert!(app.delete_pending, "old token does not cancel new dialog"); // Keep selection and epoch deliberately unchanged: owner is an independent witness. + let captured = app.scenario_context().unwrap(); + assert_eq!(captured.scenario, owners[0]); + assert_eq!( + app.delete_target.as_ref().unwrap().behavior_owner, + Some(owners[0]) + ); app.behavior.active_owner = Some(owners[1]); + app.reconcile_scenario_workspace(); + let other = app.scenario_context().unwrap(); + assert_eq!(other.scenario, owners[1]); + assert_eq!( + other.representation, + crate::behavior::scenario_layout::Representation::Derived { owner: owners[1] } + ); + assert_eq!(other.epoch, captured.epoch); + assert_eq!(app.selected, uses[0]); + assert!( + app.delete_target.as_ref().unwrap().snapshot.valid(&app), + "the independent owner guard must reject an otherwise current token" + ); send(&mut mounted, &mut app, Message::ConfirmDelete(token)).await; assert_eq!(app.document.bundle(), &original); + assert!(!app.delete_pending && app.delete_target.is_none()); + assert!(!app.document.can_undo() && !app.document.can_redo()); app.behavior.active_owner = Some(owners[0]); + // Restore both owner and qualified presentation before mounting pointer input. + // Passive reports from the previous owner cannot repair an inconsistent fixture. + app.reconcile_scenario_workspace(); + assert_eq!(app.scenario_context().unwrap().scenario, owners[0]); + assert_eq!(app.selected, uses[0]); mounted.settle(&mut app).await; select(&mut mounted, &mut app, uses[0]).await; let token = delete(&mut mounted, &mut app, false).await; diff --git a/crates/oa-desktop/src/behavior/scenario/workspace/details_tests.rs b/crates/oa-desktop/src/behavior/scenario/workspace/details_tests.rs index 832d84ff..33622c7d 100644 --- a/crates/oa-desktop/src/behavior/scenario/workspace/details_tests.rs +++ b/crates/oa-desktop/src/behavior/scenario/workspace/details_tests.rs @@ -54,7 +54,11 @@ async fn saved_details_opens_real_editable_inspector_and_returns_to_same_view() open_details(&mut app); mounted.settle(&mut app).await; let before = mounted.geometry(&app); - assert!(before.scrolls.contains_key(&widget::Id::new("inspector"))); + assert_eq!( + app.inspector_tab, + crate::navigation::InspectorTab::Connections + ); + assert!(!before.scrolls.contains_key(&widget::Id::new("inspector"))); let (details, offset) = before.scrolls[&widget::Id::new("scenario-details")]; let button = before.bounds("scenario-properties").center() - offset; assert!( @@ -84,7 +88,7 @@ async fn saved_details_opens_real_editable_inspector_and_returns_to_same_view() assert_eq!( stored_camera(&app), camera, - "restoring panels retains camera intent" + "opening Properties retains camera intent" ); assert!(Arc::ptr_eq(&original, &app.document.snapshot())); assert_eq!(app.document.bundle(), &bundle); @@ -251,7 +255,11 @@ async fn details_opens_current_saved_view_properties_after_following_diagram_pic let snapshot = app.document.snapshot(); let bundle = app.document.bundle().clone(); let before = mounted.geometry(&app); - assert!(before.scrolls.contains_key(&widget::Id::new("inspector"))); + assert_eq!( + app.inspector_tab, + crate::navigation::InspectorTab::Connections + ); + assert!(!before.scrolls.contains_key(&widget::Id::new("inspector"))); let (details, offset) = before.scrolls[&widget::Id::new("scenario-details")]; let point = before.bounds("scenario-properties").center() - offset; assert!(details.contains(point));