agner-utils 0.4.1

An actor toolkit inspired by Erlang/OTP (utils)
Documentation
use super::*;

use futures::future;

#[tokio::test]
async fn no_blocking_basic() {
    let (mut tx, mut rx) = channel::<usize>(3);
    assert!(tx.send(1, false).await.is_ok());
    assert!(tx.send(2, false).await.is_ok());
    assert!(tx.send(3, false).await.is_ok());
    assert_eq!(tx.send(4, false).await, Err(4));

    assert_eq!(rx.recv(false).await, Some(1));
    assert!(tx.send(4, false).await.is_ok());
    assert_eq!(tx.send(5, false).await, Err(5));

    assert_eq!(rx.recv(false).await, Some(2));
    assert_eq!(rx.recv(false).await, Some(3));
    assert_eq!(rx.recv(false).await, Some(4));
    assert_eq!(rx.recv(false).await, None);
}

#[tokio::test]
async fn blocking_basic() {
    let (mut tx, mut rx) = channel::<usize>(3);
    let producer = async move {
        for i in 1..10 {
            assert!(tx.send(i, true).await.is_ok());
        }
    };
    let consumer = async move {
        for i in 1..10 {
            assert_eq!(rx.recv(true).await, Some(i));
        }
        assert_eq!(rx.recv(false).await, None);
    };

    assert_eq!(future::join(producer, consumer).await, ((), ()));
}