diff --git a/crates/oa-desktop/src/app/transition_context_tests.rs b/crates/oa-desktop/src/app/transition_context_tests.rs index 65425248..f02c014e 100644 --- a/crates/oa-desktop/src/app/transition_context_tests.rs +++ b/crates/oa-desktop/src/app/transition_context_tests.rs @@ -49,11 +49,28 @@ fn fixture(layer: Layer, kind: Kind) -> (App, Id, Id, Id) { p.diagrams.get_mut(&view).unwrap().name = "Unrelated architecture".into(); p.place(view, reused, Position { x: 873., y: 421. }); let mut app = App::with_project(p); - app.layer = layer; - app.page = Page::Behavior; - app.selected = root; - app.behavior.active_owner = Some(root); - app.refresh_draft(); + let accepted = app.document.snapshot(); + // Enter through the actual navigation path: assigning Page/owner alone does + // not create the representation and live visit required by canvas events. + send(&mut app, Message::Select(root)); + send(&mut app, Message::Page(Page::Behavior)); + assert_eq!(app.layer, layer); + assert_eq!(app.page, Page::Behavior); + assert_eq!(app.selected, root); + assert_eq!(app.behavior.active_owner, Some(root)); + if kind == Kind::Scenario { + let context = app.scenario_context().unwrap(); + assert_eq!(context.document, app.canvas_document); + assert_eq!(context.scenario, root); + assert_eq!( + context.representation, + crate::behavior::scenario_layout::Representation::Derived { owner: root } + ); + assert!(!context.visit.is_nil()); + } + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert_eq!(app.source_workspace.bundle(), accepted.bundle); + assert!(!app.document.can_undo() && !app.document.can_redo()); (app, root, work, reused) } diff --git a/crates/oa-desktop/src/behavior/contextual_source_tests.rs b/crates/oa-desktop/src/behavior/contextual_source_tests.rs index 7e53ae0c..81b192cd 100644 --- a/crates/oa-desktop/src/behavior/contextual_source_tests.rs +++ b/crates/oa-desktop/src/behavior/contextual_source_tests.rs @@ -893,11 +893,14 @@ fn contextual_source_empty_palette_lifeline_cannot_open_a_previous_owner_or_laye .add_element(Kind::Scenario, Layer::Oa, "Second scenario", None) .unwrap(); let mut app = App::with_project(p.clone()); - app.page = Page::Behavior; - app.layer = Layer::Oa; - app.behavior.active_owner = Some(a); - app.selected = a; + // Capture the context created by actual navigation, including its visit. + // Merely assigning active_owner/selected does not mount a Scenario anymore. + let _ = app.update(Message::Select(a)); + let _ = app.update(Message::Page(Page::Behavior)); let context = app.scenario_context().unwrap(); + assert_eq!(context.scenario, a); + assert!(!context.visit.is_nil()); + let snapshot = app.document.snapshot(); let source = app.document.bundle().clone(); let begin = |context| scenario::CanvasEvent::BeginOccurrence { context, @@ -908,23 +911,40 @@ fn contextual_source_empty_palette_lifeline_cannot_open_a_previous_owner_or_laye }, lifeline: None, }; - app.behavior.active_owner = Some(b); - app.selected = b; + let _ = app.update(Message::Select(b)); + let second = app.scenario_context().unwrap(); + assert_eq!(second.scenario, b); + assert_ne!(second.visit, context.visit); let _ = app.update(Message::ScenarioCanvas(begin(context))); assert!(!app.behavior.has_pending()); assert_eq!(app.project(), &p); - app.behavior.active_owner = Some(a); - app.selected = a; - app.layer = Layer::Sa; - let _ = app.update(Message::ScenarioCanvas(begin(context))); + + let _ = app.update(Message::Select(a)); + let before_layer_change = app.scenario_context().unwrap(); + assert_eq!(before_layer_change.scenario, a); + assert_ne!(before_layer_change.visit, context.visit); + let _ = app.update(Message::Layer(Layer::Sa)); + assert_eq!(app.layer, Layer::Sa); + assert!(app.scenario_context().is_none()); + let _ = app.update(Message::ScenarioCanvas(begin(before_layer_change))); assert!(!app.behavior.has_pending()); - app.layer = Layer::Oa; + + let _ = app.update(Message::Layer(Layer::Oa)); + let _ = app.update(Message::Select(a)); let current = app.scenario_context().unwrap(); + assert_eq!(current.scenario, a); + assert_ne!(current.visit, before_layer_change.visit); + // Returning to the same owner/layer must not revive either retired packet. + for retired in [context, before_layer_change] { + let _ = app.update(Message::ScenarioCanvas(begin(retired))); + assert!(!app.behavior.has_pending()); + } + assert!(std::sync::Arc::ptr_eq(&snapshot, &app.document.snapshot())); let _ = app.update(Message::ScenarioCanvas(begin(current))); assert_eq!(app.behavior.pending_owner(), Some(a)); assert_eq!(app.project(), &p); assert_eq!(app.document.bundle(), &source); - assert!(!app.document.can_undo()); + assert!(!app.document.can_undo() && !app.document.can_redo()); } #[test]