async_ach-pubsub 0.2.0

Async Atomic Channel
Documentation
use async_ach_pubsub::Publisher;
use core::sync::atomic::{AtomicUsize, Ordering::SeqCst};
use core::time::Duration;
use futures_executor::ThreadPool;
use futures_util::StreamExt;
use std::thread;

#[test]
fn test() {
    static STATE: AtomicUsize = AtomicUsize::new(0);
    static PUB: Publisher<usize, 2, 2> = Publisher::new(false);
    let sub1 = PUB.subscribe().unwrap();
    let sub2 = PUB.subscribe().unwrap();
    let executor = ThreadPool::new().unwrap();

    executor.spawn_ok(async move {
        let data = sub1.recv().next().await;
        assert_eq!(data, Some(1));
        println!("1-1");
        let data = sub1.recv().next().await;
        assert_eq!(data, Some(2));
        println!("1-2");
        let data = sub1.recv().next().await;
        assert_eq!(data, Some(3));
        println!("1-3");
        let data = sub1.recv().next().await;
        assert_eq!(data, Some(4));
        println!("1-4");
        STATE.fetch_add(1, SeqCst);
    });
    executor.spawn_ok(async move {
        let data = sub2.recv().next().await;
        assert_eq!(data, Some(1));
        println!("2-1");
        let data = sub2.recv().next().await;
        assert_eq!(data, Some(2));
        println!("2-2");
        let data = sub2.recv().next().await;
        assert_eq!(data, Some(3));
        println!("2-3");
        let data = sub2.recv().next().await;
        assert_eq!(data, Some(4));
        println!("2-4");
        STATE.fetch_add(1, SeqCst);
    });
    assert_eq!(PUB.send(1), 2);
    thread::sleep(Duration::from_millis(100));
    assert_eq!(PUB.send(2), 2);
    thread::sleep(Duration::from_millis(100));
    assert_eq!(PUB.send(3), 2);
    thread::sleep(Duration::from_millis(100));
    assert_eq!(PUB.send(4), 2);
    thread::sleep(Duration::from_secs(1));
    assert_eq!(STATE.load(SeqCst), 2);
}