use async_oneshot::*; use futures_lite::future::block_on; use futures_micro::prelude::*; use waker_fn::waker_fn; #[test] fn send_recv() { let (mut s,r) = oneshot::(); assert_eq!( block_on(zip!(async { s.send(42).unwrap() }, r)), ((), Ok(42)) ) } #[test] fn recv_send() { let (mut s,r) = oneshot::(); assert_eq!( block_on(zip!(r, async { s.send(42).unwrap() })), (Ok(42), ()) ) } #[test] fn recv_recv() { let (_s, mut r) = oneshot::(); let waker = waker_fn(|| ()); let mut ctx = Context::from_waker(&waker); assert_eq!(Receiver::poll(Pin::new(&mut r), &mut ctx), Poll::Pending); assert_eq!(Receiver::poll(Pin::new(&mut r), &mut ctx), Poll::Pending); } #[test] fn close_recv() { let (s,r) = oneshot::(); s.close(); assert_eq!(Err(Closed()), block_on(r)); } #[test] fn close_send() { let (mut s,r) = oneshot::(); r.close(); assert_eq!(Err(Closed()), s.send(true)); } #[test] fn send_close() { let (mut s,r) = oneshot::(); s.send(true).unwrap(); r.close(); } #[test] fn recv_close() { let (s,r) = oneshot::(); assert_eq!( block_on(zip!(r, async { s.close() })), (Err(Closed()), ()) ) } #[test] fn wait_close() { let (s,r) = oneshot::(); assert_eq!( block_on( zip!(async { s.wait().await.unwrap_err() }, async { r.close() }) ), (Closed(), ()) ) } #[test] fn wait_wait() { let (s, _r) = oneshot::(); let waker = waker_fn(|| ()); let mut ctx = Context::from_waker(&waker); let mut wait = s.wait(); assert!(Future::poll(Pin::new(&mut wait), &mut ctx).is_pending()); assert!(Future::poll(Pin::new(&mut wait), &mut ctx).is_pending()); } #[test] fn wait_recv_close() { let (s,r) = oneshot::(); assert_eq!( block_on( zip!(async { s.wait().await.unwrap().close(); println!("closed"); }, r) ), ((), Err(Closed())) ) } #[test] fn wait_recv_send() { let (s,r) = oneshot::(); assert_eq!( block_on( zip!(async { let mut s = s.wait().await?; s.send(42) }, r) ), (Ok(()), Ok(42)) ) } #[test] fn close_wait() { let (s,r) = oneshot::(); r.close(); assert_eq!(Closed(), block_on(s.wait()).unwrap_err()); }