bidirectional-channel 0.3.1

A channel where receivers can respond to a message, and senders can wait for a response.
Documentation
use async_std::test;
use bidirectional_channel::{bounded, SendRequestError};
use futures::join;
use ntest::timeout;

#[test]
async fn request_response() {
    let (requester, responder) = bounded(1);
    let requester = async {
        requester
            .send("hello")
            .await
            .expect("Responder or UnRespondedRequest was dropped")
    };
    let responder = async {
        let request = responder.recv().await.expect("Requester was dropped");
        let len = request.len();
        request.respond(len).unwrap()
    };
    let (response, request) = join!(requester, responder);
    assert!(request.len() == response)
}

#[test]
async fn closed() {
    let (requester, responder) = bounded::<_, usize>(1);
    drop(responder);
    assert!(matches!(
        requester.send("hello").await,
        Err(SendRequestError::Closed(_))
    ))
}

#[test]
async fn cancelled() {
    let (requester, responder) = bounded::<_, usize>(1);
    let (result, _) = join!(requester.send("hello"), async {
        drop(responder.recv().await)
    });
    assert!(matches!(result, Err(SendRequestError::Ignored)))
}

#[test]
#[timeout(10)]
#[should_panic]
async fn deadlock() {
    let (requester, responder) = bounded(1);
    let requester = async {
        requester.send("first").await.unwrap();
        requester.send("second").await.unwrap();
    };
    let responder = async {
        let first = responder.recv().await.unwrap();
        let second = responder.recv().await.unwrap();
        let len = first.len();
        first.respond(len).unwrap();
        let len = second.len();
        second.respond(len).unwrap();
    };
    join!(requester, responder);
}