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}
122