use std::time::Duration;
use async_channel as mpmc;
use tokio::sync::{broadcast, mpsc};
use tokio::time::sleep;
use crate::executor::Executor;
type Ref<T1> = std::sync::Arc<T1>;
type Tup = (u8, u8);
async fn new() -> (mpmc::Sender<u8>, broadcast::Sender<u8>, mpsc::Receiver<Tup>) {
let (we, event) = async_channel::bounded(512);
let (ws, state) = broadcast::channel(512);
let executor = Executor::new(state, event, 12);
let (wk, check) = mpsc::channel(512);
let worker = move |state: Ref<u8>, event| {
let wk = wk.clone();
async move {
wk.send((*state, event)).await.unwrap();
sleep(Duration::from_secs(100)).await;
}
};
tokio::task::spawn(executor.receive(worker));
(we, ws, check)
}
#[tokio::test]
async fn wal() {
let (we, ws, mut check) = new().await;
we.send(0u8).await.unwrap();
ws.send(0).unwrap();
let val = check.recv().await.unwrap();
assert_eq!(val, (0, 0));
ws.send(1).unwrap();
let val = check.recv().await.unwrap();
assert_eq!(val, (1, 0));
()
}