atagen

macltok

public
Star0
Watch0
31ce2453c82f470aa8b5d3861ab0eec4273afc5d
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: tests/support/mod.rs

31ce2453c82fatagen2026-09-24 13:07 UTC1
#![allow(dead_code)]
31ce2453c82fatagen2026-09-24 13:07 UTC2
31ce2453c82fatagen2026-09-24 13:07 UTC3
use std::time::Duration;
31ce2453c82fatagen2026-09-24 13:07 UTC4
31ce2453c82fatagen2026-09-24 13:07 UTC5
use macltok::{ClientHandle, Event, EventStream, TimelineDiff, TimelineItem, TimelineMessage};
31ce2453c82fatagen2026-09-24 13:07 UTC6
31ce2453c82fatagen2026-09-24 13:07 UTC7
pub async fn receive_until(events: &mut EventStream, predicate: impl Fn(&Event) -> bool) -> Event {
31ce2453c82fatagen2026-09-24 13:07 UTC8
    tokio::time::timeout(Duration::from_secs(5), async {
31ce2453c82fatagen2026-09-24 13:07 UTC9
        while let Some(event) = events.recv().await {
31ce2453c82fatagen2026-09-24 13:07 UTC10
            if predicate(&event) {
31ce2453c82fatagen2026-09-24 13:07 UTC11
                return event;
31ce2453c82fatagen2026-09-24 13:07 UTC12
            }
31ce2453c82fatagen2026-09-24 13:07 UTC13
        }
31ce2453c82fatagen2026-09-24 13:07 UTC14
        panic!("event stream closed before the expected event");
31ce2453c82fatagen2026-09-24 13:07 UTC15
    })
31ce2453c82fatagen2026-09-24 13:07 UTC16
    .await
31ce2453c82fatagen2026-09-24 13:07 UTC17
    .expect("expected event did not arrive")
31ce2453c82fatagen2026-09-24 13:07 UTC18
}
31ce2453c82fatagen2026-09-24 13:07 UTC19
31ce2453c82fatagen2026-09-24 13:07 UTC20
/// asks for a shutdown while still draining, since the engine won't answer until its events are out
31ce2453c82fatagen2026-09-24 13:07 UTC21
pub async fn shut_down(
31ce2453c82fatagen2026-09-24 13:07 UTC22
    handle: &ClientHandle,
31ce2453c82fatagen2026-09-24 13:07 UTC23
    events: &mut EventStream,
31ce2453c82fatagen2026-09-24 13:07 UTC24
    running: tokio::task::JoinHandle<Result<(), macltok::EngineError>>,
31ce2453c82fatagen2026-09-24 13:07 UTC25
) {
31ce2453c82fatagen2026-09-24 13:07 UTC26
    let (answer, _) = tokio::join!(handle.shutdown(), async {
31ce2453c82fatagen2026-09-24 13:07 UTC27
        receive_until(events, |event| matches!(event, Event::Stopped)).await
31ce2453c82fatagen2026-09-24 13:07 UTC28
    });
31ce2453c82fatagen2026-09-24 13:07 UTC29
    answer.unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC30
    running.await.unwrap().unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC31
}
31ce2453c82fatagen2026-09-24 13:07 UTC32
31ce2453c82fatagen2026-09-24 13:07 UTC33
pub fn event_messages(event: &Event) -> Vec<&TimelineMessage> {
31ce2453c82fatagen2026-09-24 13:07 UTC34
    let items = match event {
31ce2453c82fatagen2026-09-24 13:07 UTC35
        Event::TimelineReset { items, .. } => items.iter().collect::<Vec<_>>(),
31ce2453c82fatagen2026-09-24 13:07 UTC36
        Event::TimelineChanged { diffs, .. } => diffs.iter().flat_map(diff_items).collect(),
31ce2453c82fatagen2026-09-24 13:07 UTC37
        _ => Vec::new(),
31ce2453c82fatagen2026-09-24 13:07 UTC38
    };
31ce2453c82fatagen2026-09-24 13:07 UTC39
    items
31ce2453c82fatagen2026-09-24 13:07 UTC40
        .into_iter()
31ce2453c82fatagen2026-09-24 13:07 UTC41
        .filter_map(|item| match item {
31ce2453c82fatagen2026-09-24 13:07 UTC42
            TimelineItem::Message(message) => Some(message.as_ref()),
31ce2453c82fatagen2026-09-24 13:07 UTC43
            _ => None,
31ce2453c82fatagen2026-09-24 13:07 UTC44
        })
31ce2453c82fatagen2026-09-24 13:07 UTC45
        .collect()
31ce2453c82fatagen2026-09-24 13:07 UTC46
}
31ce2453c82fatagen2026-09-24 13:07 UTC47
31ce2453c82fatagen2026-09-24 13:07 UTC48
pub fn diff_items(diff: &TimelineDiff) -> Vec<&TimelineItem> {
31ce2453c82fatagen2026-09-24 13:07 UTC49
    match diff {
31ce2453c82fatagen2026-09-24 13:07 UTC50
        TimelineDiff::Append { values } | TimelineDiff::Reset { values } => values.iter().collect(),
31ce2453c82fatagen2026-09-24 13:07 UTC51
        TimelineDiff::PushFront { value }
31ce2453c82fatagen2026-09-24 13:07 UTC52
        | TimelineDiff::PushBack { value }
31ce2453c82fatagen2026-09-24 13:07 UTC53
        | TimelineDiff::Insert { value, .. }
31ce2453c82fatagen2026-09-24 13:07 UTC54
        | TimelineDiff::Set { value, .. } => vec![value],
31ce2453c82fatagen2026-09-24 13:07 UTC55
        _ => Vec::new(),
31ce2453c82fatagen2026-09-24 13:07 UTC56
    }
31ce2453c82fatagen2026-09-24 13:07 UTC57
}