atagen

macltok

public
Star0
Watch0
31ce2453c82f470aa8b5d3861ab0eec4273afc5d
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
tests/support/mod.rsRust57 lines1.9 KB
1
#![allow(dead_code)]
2
3
use std::time::Duration;
4
5
use macltok::{ClientHandle, Event, EventStream, TimelineDiff, TimelineItem, TimelineMessage};
6
7
pub async fn receive_until(events: &mut EventStream, predicate: impl Fn(&Event) -> bool) -> Event {
8
    tokio::time::timeout(Duration::from_secs(5), async {
9
        while let Some(event) = events.recv().await {
10
            if predicate(&event) {
11
                return event;
12
            }
13
        }
14
        panic!("event stream closed before the expected event");
15
    })
16
    .await
17
    .expect("expected event did not arrive")
18
}
19
20
/// asks for a shutdown while still draining, since the engine won't answer until its events are out
21
pub async fn shut_down(
22
    handle: &ClientHandle,
23
    events: &mut EventStream,
24
    running: tokio::task::JoinHandle<Result<(), macltok::EngineError>>,
25
) {
26
    let (answer, _) = tokio::join!(handle.shutdown(), async {
27
        receive_until(events, |event| matches!(event, Event::Stopped)).await
28
    });
29
    answer.unwrap();
30
    running.await.unwrap().unwrap();
31
}
32
33
pub fn event_messages(event: &Event) -> Vec<&TimelineMessage> {
34
    let items = match event {
35
        Event::TimelineReset { items, .. } => items.iter().collect::<Vec<_>>(),
36
        Event::TimelineChanged { diffs, .. } => diffs.iter().flat_map(diff_items).collect(),
37
        _ => Vec::new(),
38
    };
39
    items
40
        .into_iter()
41
        .filter_map(|item| match item {
42
            TimelineItem::Message(message) => Some(message.as_ref()),
43
            _ => None,
44
        })
45
        .collect()
46
}
47
48
pub fn diff_items(diff: &TimelineDiff) -> Vec<&TimelineItem> {
49
    match diff {
50
        TimelineDiff::Append { values } | TimelineDiff::Reset { values } => values.iter().collect(),
51
        TimelineDiff::PushFront { value }
52
        | TimelineDiff::PushBack { value }
53
        | TimelineDiff::Insert { value, .. }
54
        | TimelineDiff::Set { value, .. } => vec![value],
55
        _ => Vec::new(),
56
    }
57
}