atagen

macltok

public
Star0
Watch0
1fe480c16a3c6db3270dce9e11f0afe67ebc17fc
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,
31ce2453c82fatagen2026-09-24 13:07 UTC27
    running: tokio::task::JoinHandle<Result<(), 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();
31ce2453c82fatagen2026-09-24 13:07 UTC33
    running.await.unwrap().unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC34
}
31ce2453c82fatagen2026-09-24 13:07 UTC35
960ac0721079atagen2026-09-25 00:24 UTC36
pub fn event_messages(event: &Event) -> Vec<&TimelineEvent> {
31ce2453c82fatagen2026-09-24 13:07 UTC37
    let items = match event {
31ce2453c82fatagen2026-09-24 13:07 UTC38
        Event::TimelineReset { items, .. } => items.iter().collect::<Vec<_>>(),
31ce2453c82fatagen2026-09-24 13:07 UTC39
        Event::TimelineChanged { diffs, .. } => diffs.iter().flat_map(diff_items).collect(),
31ce2453c82fatagen2026-09-24 13:07 UTC40
        _ => Vec::new(),
31ce2453c82fatagen2026-09-24 13:07 UTC41
    };
31ce2453c82fatagen2026-09-24 13:07 UTC42
    items
31ce2453c82fatagen2026-09-24 13:07 UTC43
        .into_iter()
31ce2453c82fatagen2026-09-24 13:07 UTC44
        .filter_map(|item| match item {
960ac0721079atagen2026-09-25 00:24 UTC45
            TimelineItem::Event(event) => Some(event.as_ref()),
31ce2453c82fatagen2026-09-24 13:07 UTC46
            _ => None,
31ce2453c82fatagen2026-09-24 13:07 UTC47
        })
31ce2453c82fatagen2026-09-24 13:07 UTC48
        .collect()
31ce2453c82fatagen2026-09-24 13:07 UTC49
}
31ce2453c82fatagen2026-09-24 13:07 UTC50
960ac0721079atagen2026-09-25 00:24 UTC51
pub fn message(event: &TimelineEvent) -> Option<&Message> {
960ac0721079atagen2026-09-25 00:24 UTC52
    match &event.content {
960ac0721079atagen2026-09-25 00:24 UTC53
        TimelineContent::Message(message) => Some(message),
960ac0721079atagen2026-09-25 00:24 UTC54
        _ => None,
960ac0721079atagen2026-09-25 00:24 UTC55
    }
960ac0721079atagen2026-09-25 00:24 UTC56
}
960ac0721079atagen2026-09-25 00:24 UTC57
960ac0721079atagen2026-09-25 00:24 UTC58
pub fn media_of(event: &TimelineEvent) -> Option<&MediaDescriptor> {
960ac0721079atagen2026-09-25 00:24 UTC59
    match &event.content {
960ac0721079atagen2026-09-25 00:24 UTC60
        TimelineContent::Message(message) => message.media.as_ref(),
960ac0721079atagen2026-09-25 00:24 UTC61
        TimelineContent::Sticker { media, .. } => Some(media),
960ac0721079atagen2026-09-25 00:24 UTC62
        _ => None,
960ac0721079atagen2026-09-25 00:24 UTC63
    }
960ac0721079atagen2026-09-25 00:24 UTC64
}
960ac0721079atagen2026-09-25 00:24 UTC65
31ce2453c82fatagen2026-09-24 13:07 UTC66
pub fn diff_items(diff: &TimelineDiff) -> Vec<&TimelineItem> {
31ce2453c82fatagen2026-09-24 13:07 UTC67
    match diff {
31ce2453c82fatagen2026-09-24 13:07 UTC68
        TimelineDiff::Append { values } | TimelineDiff::Reset { values } => values.iter().collect(),
31ce2453c82fatagen2026-09-24 13:07 UTC69
        TimelineDiff::PushFront { value }
31ce2453c82fatagen2026-09-24 13:07 UTC70
        | TimelineDiff::PushBack { value }
31ce2453c82fatagen2026-09-24 13:07 UTC71
        | TimelineDiff::Insert { value, .. }
31ce2453c82fatagen2026-09-24 13:07 UTC72
        | TimelineDiff::Set { value, .. } => vec![value],
31ce2453c82fatagen2026-09-24 13:07 UTC73
        _ => Vec::new(),
31ce2453c82fatagen2026-09-24 13:07 UTC74
    }
31ce2453c82fatagen2026-09-24 13:07 UTC75
}