Skip to main content

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