futures_test/
assert.rs

1use futures_core::stream::Stream;
2
3#[doc(hidden)]
4pub fn assert_is_unpin_stream<S: Stream + Unpin>(_: &mut S) {}
5
6/// Assert that the next poll to the provided stream will return
7/// [`Poll::Pending`](futures_core::task::Poll::Pending).
8///
9/// # Examples
10///
11/// ```
12/// use futures::stream;
13/// use futures_test::future::FutureTestExt;
14/// use futures_test::{
15///     assert_stream_pending, assert_stream_next, assert_stream_done,
16/// };
17/// use futures::pin_mut;
18///
19/// let stream = stream::once((async { 5 }).pending_once());
20/// pin_mut!(stream);
21///
22/// assert_stream_pending!(stream);
23/// assert_stream_next!(stream, 5);
24/// assert_stream_done!(stream);
25/// ```
26#[macro_export]
27macro_rules! assert_stream_pending {
28    ($stream:expr) => {{
29        let mut stream = &mut $stream;
30        $crate::__private::assert::assert_is_unpin_stream(stream);
31        let stream = $crate::__private::Pin::new(stream);
32        let mut cx = $crate::task::noop_context();
33        let poll = $crate::__private::stream::Stream::poll_next(stream, &mut cx);
34        if poll.is_ready() {
35            panic!("assertion failed: stream is not pending");
36        }
37    }};
38}
39
40/// Assert that the next poll to the provided stream will return
41/// [`Poll::Ready`](futures_core::task::Poll::Ready) with the provided item.
42///
43/// # Examples
44///
45/// ```
46/// use futures::stream;
47/// use futures_test::future::FutureTestExt;
48/// use futures_test::{
49///     assert_stream_pending, assert_stream_next, assert_stream_done,
50/// };
51/// use futures::pin_mut;
52///
53/// let stream = stream::once((async { 5 }).pending_once());
54/// pin_mut!(stream);
55///
56/// assert_stream_pending!(stream);
57/// assert_stream_next!(stream, 5);
58/// assert_stream_done!(stream);
59/// ```
60#[macro_export]
61macro_rules! assert_stream_next {
62    ($stream:expr, $item:expr) => {{
63        let mut stream = &mut $stream;
64        $crate::__private::assert::assert_is_unpin_stream(stream);
65        let stream = $crate::__private::Pin::new(stream);
66        let mut cx = $crate::task::noop_context();
67        match $crate::__private::stream::Stream::poll_next(stream, &mut cx) {
68            $crate::__private::task::Poll::Ready($crate::__private::Some(x)) => {
69                assert_eq!(x, $item);
70            }
71            $crate::__private::task::Poll::Ready($crate::__private::None) => {
72                panic!(
73                    "assertion failed: expected stream to provide item but stream is at its end"
74                );
75            }
76            $crate::__private::task::Poll::Pending => {
77                panic!("assertion failed: expected stream to provide item but stream wasn't ready");
78            }
79        }
80    }};
81}
82
83/// Assert that the next poll to the provided stream will return an empty
84/// [`Poll::Ready`](futures_core::task::Poll::Ready) signalling the
85/// completion of the stream.
86///
87/// # Examples
88///
89/// ```
90/// use futures::stream;
91/// use futures_test::future::FutureTestExt;
92/// use futures_test::{
93///     assert_stream_pending, assert_stream_next, assert_stream_done,
94/// };
95/// use futures::pin_mut;
96///
97/// let stream = stream::once((async { 5 }).pending_once());
98/// pin_mut!(stream);
99///
100/// assert_stream_pending!(stream);
101/// assert_stream_next!(stream, 5);
102/// assert_stream_done!(stream);
103/// ```
104#[macro_export]
105macro_rules! assert_stream_done {
106    ($stream:expr) => {{
107        let mut stream = &mut $stream;
108        $crate::__private::assert::assert_is_unpin_stream(stream);
109        let stream = $crate::__private::Pin::new(stream);
110        let mut cx = $crate::task::noop_context();
111        match $crate::__private::stream::Stream::poll_next(stream, &mut cx) {
112            $crate::__private::task::Poll::Ready($crate::__private::Some(_)) => {
113                panic!("assertion failed: expected stream to be done but had more elements");
114            }
115            $crate::__private::task::Poll::Ready($crate::__private::None) => {}
116            $crate::__private::task::Poll::Pending => {
117                panic!("assertion failed: expected stream to be done but was pending");
118            }
119        }
120    }};
121}