1 use futures_core::stream::Stream;
2
3 #[doc(hidden)]
assert_is_unpin_stream<S: Stream + Unpin>(_: &mut S)4 pub 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]
27 macro_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]
61 macro_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]
105 macro_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