1 //! Additional combinators for testing streams.
2 
3 use futures_core::stream::Stream;
4 
5 pub use crate::assert_unmoved::AssertUnmoved;
6 pub use crate::interleave_pending::InterleavePending;
7 
8 /// Additional combinators for testing streams.
9 pub trait StreamTestExt: Stream {
10     /// Asserts that the given is not moved after being polled.
11     ///
12     /// A check for movement is performed each time the stream is polled
13     /// and when `Drop` is called.
14     ///
15     /// Aside from keeping track of the location at which the stream was first
16     /// polled and providing assertions, this stream adds no runtime behavior
17     /// and simply delegates to the child stream.
assert_unmoved(self) -> AssertUnmoved<Self> where Self: Sized,18     fn assert_unmoved(self) -> AssertUnmoved<Self>
19     where
20         Self: Sized,
21     {
22         AssertUnmoved::new(self)
23     }
24 
25     /// Introduces an extra [`Poll::Pending`](futures_core::task::Poll::Pending)
26     /// in between each item of the stream.
27     ///
28     /// # Examples
29     ///
30     /// ```
31     /// use futures::task::Poll;
32     /// use futures::stream::{self, Stream};
33     /// use futures_test::task::noop_context;
34     /// use futures_test::stream::StreamTestExt;
35     /// use futures::pin_mut;
36     ///
37     /// let stream = stream::iter(vec![1, 2]).interleave_pending();
38     /// pin_mut!(stream);
39     ///
40     /// let mut cx = noop_context();
41     ///
42     /// assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Pending);
43     /// assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Ready(Some(1)));
44     /// assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Pending);
45     /// assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Ready(Some(2)));
46     /// assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Pending);
47     /// assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Ready(None));
48     /// ```
interleave_pending(self) -> InterleavePending<Self> where Self: Sized,49     fn interleave_pending(self) -> InterleavePending<Self>
50     where
51         Self: Sized,
52     {
53         InterleavePending::new(self)
54     }
55 }
56 
57 impl<St> StreamTestExt for St where St: Stream {}
58