use agent_engine::engine::reactor::{
drain_event_queue, wake_action_with_cap, EventDisposition, WakeAction,
};
use agent_engine::events::{
types::{Event, Severity},
EventQueue,
};
use synaps_cli::SharedMessage;
use tokio::sync::mpsc::unbounded_channel;
fn make_event(text: &str) -> Event {
let mut ev = Event::simple("synaps-send", text, Some(Severity::High));
ev.content.content_type = "message".into();
ev
}
#[test]
fn send_while_busy_steers_into_the_live_stream() {
let q = EventQueue::new(16);
q.push(make_event("nudge: prefer the smaller diff")).unwrap();
let (steer_tx, mut steer_rx) = unbounded_channel::<String>();
let mut msgs: Vec<SharedMessage> = Vec::new();
let mut pending: Vec<String> = Vec::new();
let drained = drain_event_queue(&q, &mut msgs, &mut pending, true, Some(&steer_tx));
assert_eq!(drained.len(), 1);
assert_eq!(
drained[0].disposition,
EventDisposition::Steered,
"a send during a live (driver-owned) turn must be steered"
);
let steered = steer_rx.try_recv().expect("steer channel got the event");
assert!(steered.contains("nudge: prefer the smaller diff"));
assert!(msgs.is_empty(), "steered events do not inject a user message");
assert!(pending.is_empty(), "steered events are not buffered");
}
#[test]
fn send_while_busy_without_steer_channel_buffers() {
let q = EventQueue::new(16);
q.push(make_event("late note")).unwrap();
let mut msgs: Vec<SharedMessage> = Vec::new();
let mut pending: Vec<String> = Vec::new();
let drained = drain_event_queue(&q, &mut msgs, &mut pending, true, None);
assert_eq!(drained[0].disposition, EventDisposition::Buffered);
assert_eq!(pending.len(), 1);
assert!(pending[0].contains("late note"));
}
#[test]
fn send_while_idle_injects_and_would_wake_unarmed() {
let q = EventQueue::new(16);
q.push(make_event("kick off the task")).unwrap();
let mut msgs: Vec<SharedMessage> = Vec::new();
let mut pending: Vec<String> = Vec::new();
let drained = drain_event_queue(&q, &mut msgs, &mut pending, false, None);
assert_eq!(drained[0].disposition, EventDisposition::Injected);
assert_eq!(msgs.len(), 1, "idle send injects a role=user message");
let action = wake_action_with_cap(&drained, &msgs, false, true, 0, 0);
assert_eq!(
action,
WakeAction::RunTurn,
"an idle send on an unarmed session behaves like Submit (wakes a turn)"
);
}