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}