From 83f53c7c6e277e250f06d2ae6bfa6a7988bd2e4b Mon Sep 17 00:00:00 2001 From: "sorokin.oleg.edu" Date: Sat, 12 Sep 2026 15:22:33 -0700 Subject: [PATCH] Update atomic call reply test for typed activation geometry --- crates/oa-desktop/src/behavior/scenario.rs | 43 +++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/crates/oa-desktop/src/behavior/scenario.rs b/crates/oa-desktop/src/behavior/scenario.rs index c624137c..70e9ce6a 100644 --- a/crates/oa-desktop/src/behavior/scenario.rs +++ b/crates/oa-desktop/src/behavior/scenario.rs @@ -3253,12 +3253,45 @@ mod tests { .iter() .any(|l| l.id == steps[1] && l.dashed && l.label.contains("reply")) ); - assert!( - scene - .boxes - .iter() - .any(|b| b.id == steps[0] && b.rect.width == 8.) + assert_eq!(scene.activations.len(), 1); + let activation = &scene.activations[0]; + assert_eq!(activation.call, steps[0]); + assert_eq!(activation.receiver, receiver); + assert_eq!(activation.scope, owner); + assert_eq!( + activation.finish, + scenario_activation::Finish::Reply(steps[1]) ); + // Scene::draw paints this typed rectangle directly. Check its extent + // against the actual message endpoints, without fixing a style width. + let rect = activation.rect; + assert!( + [rect.x, rect.y, rect.width, rect.height] + .iter() + .all(|v| v.is_finite()) + ); + assert!(rect.width > 0. && rect.height > 0.); + let call_line = scene.lines.iter().find(|l| l.id == steps[0]).unwrap(); + let reply_line = scene.lines.iter().find(|l| l.id == steps[1]).unwrap(); + let received = *call_line.points.last().unwrap(); + let returned = reply_line.points[0]; + assert_eq!(rect.y, received.y); + assert_eq!(rect.y + rect.height, returned.y); + assert_eq!(received.x, returned.x); + assert!(received.x == rect.x || received.x == rect.x + rect.width); + assert!(!scene.boxes.iter().any(|b| b.id == steps[0])); + assert!(scene.open_calls.is_empty()); + let interior = rect.center(); + assert!(scene.lines.iter().filter(|l| !l.label.is_empty()).all(|l| { + l.points.windows(2).all(|p| { + crate::diagram::distance_to_segment(interior, p[0], p[1]) > 8. / scene.scale + }) && !Rectangle::new( + l.label_at, + Size::new((l.label.chars().count() as f32 * 6.8 + 8.).min(225.), 25.), + ) + .contains(interior) + })); + assert_eq!(scene.hit(interior), Some(steps[0])); let mut reply = State::default(); reply .update(result, Event::Start(owner, Tool::Message))