async_ach-notify 0.2.3

Async Atomic Channel
Documentation
use async_ach_notify::Notify;
use core::future::Future;
use core::pin::Pin;
use futures_test::task;

#[test]
fn test() {
    static NOTIFY: Notify<2> = Notify::new();
    let mut cx = task::noop_context();

    let mut listener1 = NOTIFY.listen();
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_pending());
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_pending());
    NOTIFY.notify_one();
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_ready());
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_pending());

    let mut listener2 = NOTIFY.listen();
    let mut listener3 = NOTIFY.listen();
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_pending());
    assert!(Pin::new(&mut listener2).poll(&mut cx).is_pending());
    assert!(Pin::new(&mut listener3).poll(&mut cx).is_pending());
    NOTIFY.notify_one();
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_ready());
    assert!(Pin::new(&mut listener2).poll(&mut cx).is_pending());
    assert!(Pin::new(&mut listener3).poll(&mut cx).is_pending());
    NOTIFY.notify_one();
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_ready());
    assert!(Pin::new(&mut listener2).poll(&mut cx).is_pending());
    assert!(Pin::new(&mut listener3).poll(&mut cx).is_pending());
    NOTIFY.notify_one();
    assert!(Pin::new(&mut listener1).poll(&mut cx).is_ready());
    assert!(Pin::new(&mut listener2).poll(&mut cx).is_pending());
    assert!(Pin::new(&mut listener3).poll(&mut cx).is_pending());
}