atagen

macltok

public
Star0
Watch0
97fb5720d8812e018aee39923e4eea37fa7dd89b
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
960ac0721079atagen2026-09-25 00:24 UTC5
use macltok::{
960ac0721079atagen2026-09-25 00:24 UTC6
    ClientHandle, Event, EventStream, MediaDescriptor, Message, TimelineContent, TimelineDiff,
960ac0721079atagen2026-09-25 00:24 UTC7
    TimelineEvent, TimelineItem,
960ac0721079atagen2026-09-25 00:24 UTC8
};
31ce2453c82fatagen2026-09-24 13:07 UTC9
31ce2453c82fatagen2026-09-24 13:07 UTC10
pub async fn receive_until(events: &mut EventStream, predicate: impl Fn(&Event) -> bool) -> Event {
31ce2453c82fatagen2026-09-24 13:07 UTC11
    tokio::time::timeout(Duration::from_secs(5), async {
31ce2453c82fatagen2026-09-24 13:07 UTC12
        while let Some(event) = events.recv().await {
31ce2453c82fatagen2026-09-24 13:07 UTC13
            if predicate(&event) {
31ce2453c82fatagen2026-09-24 13:07 UTC14
                return event;
31ce2453c82fatagen2026-09-24 13:07 UTC15
            }
31ce2453c82fatagen2026-09-24 13:07 UTC16
        }
31ce2453c82fatagen2026-09-24 13:07 UTC17
        panic!("event stream closed before the expected event");
31ce2453c82fatagen2026-09-24 13:07 UTC18
    })
31ce2453c82fatagen2026-09-24 13:07 UTC19
    .await
31ce2453c82fatagen2026-09-24 13:07 UTC20
    .expect("expected event did not arrive")
31ce2453c82fatagen2026-09-24 13:07 UTC21
}
31ce2453c82fatagen2026-09-24 13:07 UTC22
31ce2453c82fatagen2026-09-24 13:07 UTC23
/// asks for a shutdown while still draining, since the engine won't answer until its events are out
31ce2453c82fatagen2026-09-24 13:07 UTC24
pub async fn shut_down(
31ce2453c82fatagen2026-09-24 13:07 UTC25
    handle: &ClientHandle,
31ce2453c82fatagen2026-09-24 13:07 UTC26
    events: &mut EventStream,
fe4133dbcd47atagen2026-09-26 09:05 UTC27
    running: tokio::task::JoinHandle<Result<macltok::Termination, macltok::EngineError>>,
31ce2453c82fatagen2026-09-24 13:07 UTC28
) {
31ce2453c82fatagen2026-09-24 13:07 UTC29
    let (answer, _) = tokio::join!(handle.shutdown(), async {
31ce2453c82fatagen2026-09-24 13:07 UTC30
        receive_until(events, |event| matches!(event, Event::Stopped)).await
31ce2453c82fatagen2026-09-24 13:07 UTC31
    });
31ce2453c82fatagen2026-09-24 13:07 UTC32
    answer.unwrap();
fe4133dbcd47atagen2026-09-26 09:05 UTC33
    assert_eq!(
fe4133dbcd47atagen2026-09-26 09:05 UTC34
        running.await.unwrap().unwrap(),
fe4133dbcd47atagen2026-09-26 09:05 UTC35
        macltok::Termination::ShutDown
fe4133dbcd47atagen2026-09-26 09:05 UTC36
    );
31ce2453c82fatagen2026-09-24 13:07 UTC37
}
31ce2453c82fatagen2026-09-24 13:07 UTC38
960ac0721079atagen2026-09-25 00:24 UTC39
pub fn event_messages(event: &Event) -> Vec<&TimelineEvent> {
31ce2453c82fatagen2026-09-24 13:07 UTC40
    let items = match event {
31ce2453c82fatagen2026-09-24 13:07 UTC41
        Event::TimelineReset { items, .. } => items.iter().collect::<Vec<_>>(),
31ce2453c82fatagen2026-09-24 13:07 UTC42
        Event::TimelineChanged { diffs, .. } => diffs.iter().flat_map(diff_items).collect(),
31ce2453c82fatagen2026-09-24 13:07 UTC43
        _ => Vec::new(),
31ce2453c82fatagen2026-09-24 13:07 UTC44
    };
31ce2453c82fatagen2026-09-24 13:07 UTC45
    items
31ce2453c82fatagen2026-09-24 13:07 UTC46
        .into_iter()
31ce2453c82fatagen2026-09-24 13:07 UTC47
        .filter_map(|item| match item {
960ac0721079atagen2026-09-25 00:24 UTC48
            TimelineItem::Event(event) => Some(event.as_ref()),
31ce2453c82fatagen2026-09-24 13:07 UTC49
            _ => None,
31ce2453c82fatagen2026-09-24 13:07 UTC50
        })
31ce2453c82fatagen2026-09-24 13:07 UTC51
        .collect()
31ce2453c82fatagen2026-09-24 13:07 UTC52
}
31ce2453c82fatagen2026-09-24 13:07 UTC53
960ac0721079atagen2026-09-25 00:24 UTC54
pub fn message(event: &TimelineEvent) -> Option<&Message> {
960ac0721079atagen2026-09-25 00:24 UTC55
    match &event.content {
960ac0721079atagen2026-09-25 00:24 UTC56
        TimelineContent::Message(message) => Some(message),
960ac0721079atagen2026-09-25 00:24 UTC57
        _ => None,
960ac0721079atagen2026-09-25 00:24 UTC58
    }
960ac0721079atagen2026-09-25 00:24 UTC59
}
960ac0721079atagen2026-09-25 00:24 UTC60
960ac0721079atagen2026-09-25 00:24 UTC61
pub fn media_of(event: &TimelineEvent) -> Option<&MediaDescriptor> {
960ac0721079atagen2026-09-25 00:24 UTC62
    match &event.content {
960ac0721079atagen2026-09-25 00:24 UTC63
        TimelineContent::Message(message) => message.media.as_ref(),
960ac0721079atagen2026-09-25 00:24 UTC64
        TimelineContent::Sticker { media, .. } => Some(media),
960ac0721079atagen2026-09-25 00:24 UTC65
        _ => None,
960ac0721079atagen2026-09-25 00:24 UTC66
    }
960ac0721079atagen2026-09-25 00:24 UTC67
}
960ac0721079atagen2026-09-25 00:24 UTC68
31ce2453c82fatagen2026-09-24 13:07 UTC69
pub fn diff_items(diff: &TimelineDiff) -> Vec<&TimelineItem> {
31ce2453c82fatagen2026-09-24 13:07 UTC70
    match diff {
31ce2453c82fatagen2026-09-24 13:07 UTC71
        TimelineDiff::Append { values } | TimelineDiff::Reset { values } => values.iter().collect(),
31ce2453c82fatagen2026-09-24 13:07 UTC72
        TimelineDiff::PushFront { value }
31ce2453c82fatagen2026-09-24 13:07 UTC73
        | TimelineDiff::PushBack { value }
31ce2453c82fatagen2026-09-24 13:07 UTC74
        | TimelineDiff::Insert { value, .. }
31ce2453c82fatagen2026-09-24 13:07 UTC75
        | TimelineDiff::Set { value, .. } => vec![value],
31ce2453c82fatagen2026-09-24 13:07 UTC76
        _ => Vec::new(),
31ce2453c82fatagen2026-09-24 13:07 UTC77
    }
31ce2453c82fatagen2026-09-24 13:07 UTC78
}