use crate::event::payload::SupervisorEvent;
use crate::journal::ring::EventJournal;
use crate::observe::pipeline::TestRecorder;
use crate::state::child::ChildLifecycleState;
use crate::state::supervisor::SupervisorState;
use crate::summary::builder::RunSummary;
pub fn assert_event_sequences_increase(events: &[SupervisorEvent]) {
for pair in events.windows(2) {
assert!(
pair[0].sequence.value < pair[1].sequence.value,
"event sequence must increase"
);
}
}
pub fn assert_journal_len(journal: &EventJournal, expected: usize) {
assert_eq!(journal.len(), expected, "unexpected event journal length");
}
pub fn assert_summary_has_recent_events(summary: &RunSummary) {
assert!(
!summary.recent_events.is_empty(),
"run summary must include recent events"
);
}
pub fn assert_child_state(state: &SupervisorState, path: &str, expected: ChildLifecycleState) {
let child = state
.children
.get(path)
.unwrap_or_else(|| panic!("missing child state for {path}"));
assert_eq!(child.state, expected, "unexpected child state");
}
pub fn assert_shutdown_without_orphaned_tasks(state: &SupervisorState) {
let running = state
.children
.values()
.filter(|child| matches!(child.state, ChildLifecycleState::Running))
.count();
assert_eq!(running, 0, "shutdown left running children");
}
pub fn assert_recorder_has_metrics(recorder: &TestRecorder) {
assert!(
!recorder.metrics.is_empty(),
"observability recorder must contain metrics"
);
}