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::assert::assert_is_unpin_stream(stream);
31 let stream = $crate::std_reexport::pin::Pin::new(stream);
32 let mut cx = $crate::task::noop_context();
33 let poll = $crate::futures_core_reexport::stream::Stream::poll_next(
34 stream, &mut cx,
35 );
36 if poll.is_ready() {
37 panic!("assertion failed: stream is not pending");
38 }
39 }};
40}
41
42/// Assert that the next poll to the provided stream will return
43/// [`Poll::Ready`](futures_core::task::Poll::Ready) with the provided item.
44///
45/// # Examples
46///
47/// ```
48/// use futures::stream;
49/// use futures_test::future::FutureTestExt;
50/// use futures_test::{
51/// assert_stream_pending, assert_stream_next, assert_stream_done,
52/// };
53/// use futures::pin_mut;
54///
55/// let stream = stream::once((async { 5 }).pending_once());
56/// pin_mut!(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::assert::assert_is_unpin_stream(stream);
67 let stream = $crate::std_reexport::pin::Pin::new(stream);
68 let mut cx = $crate::task::noop_context();
69 match $crate::futures_core_reexport::stream::Stream::poll_next(stream, &mut cx) {
70 $crate::futures_core_reexport::task::Poll::Ready(Some(x)) => {
71 assert_eq!(x, $item);
72 }
73 $crate::futures_core_reexport::task::Poll::Ready(None) => {
74 panic!("assertion failed: expected stream to provide item but stream is at its end");
75 }
76 $crate::futures_core_reexport::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::assert::assert_is_unpin_stream(stream);
109 let stream = $crate::std_reexport::pin::Pin::new(stream);
110 let mut cx = $crate::task::noop_context();
111 match $crate::futures_core_reexport::stream::Stream::poll_next(stream, &mut cx) {
112 $crate::futures_core_reexport::task::Poll::Ready(Some(_)) => {
113 panic!("assertion failed: expected stream to be done but had more elements");
114 }
115 $crate::futures_core_reexport::task::Poll::Ready(None) => {}
116 $crate::futures_core_reexport::task::Poll::Pending => {
117 panic!("assertion failed: expected stream to be done but was pending");
118 }
119 }
120 }}
121}