1use futures::executor::block_on;
2use futures::future::{Future, FutureExt};
3use futures::io::{AsyncBufReadExt, Cursor};
4use futures::stream::{self, StreamExt, TryStreamExt};
5use futures::task::Poll;
6use futures_test::io::AsyncReadTestExt;
7use futures_test::task::noop_context;
8
9fn run<F: Future + Unpin>(mut f: F) -> F::Output {
10 let mut cx = noop_context();
11 loop {
12 if let Poll::Ready(x) = f.poll_unpin(&mut cx) {
13 return x;
14 }
15 }
16}
17
18#[test]
19fn read_until() {
20 let mut buf = Cursor::new(b"12");
21 let mut v = Vec::new();
22 assert_eq!(block_on(buf.read_until(b'3', &mut v)).unwrap(), 2);
23 assert_eq!(v, b"12");
24
25 let mut buf = Cursor::new(b"1233");
26 let mut v = Vec::new();
27 assert_eq!(block_on(buf.read_until(b'3', &mut v)).unwrap(), 3);
28 assert_eq!(v, b"123");
29 v.truncate(0);
30 assert_eq!(block_on(buf.read_until(b'3', &mut v)).unwrap(), 1);
31 assert_eq!(v, b"3");
32 v.truncate(0);
33 assert_eq!(block_on(buf.read_until(b'3', &mut v)).unwrap(), 0);
34 assert_eq!(v, []);
35}
36
37#[test]
38fn maybe_pending() {
39 let mut buf = b"12".interleave_pending();
40 let mut v = Vec::new();
41 assert_eq!(run(buf.read_until(b'3', &mut v)).unwrap(), 2);
42 assert_eq!(v, b"12");
43
44 let mut buf = stream::iter(vec![&b"12"[..], &b"33"[..], &b"3"[..]])
45 .map(Ok)
46 .into_async_read()
47 .interleave_pending();
48 let mut v = Vec::new();
49 assert_eq!(run(buf.read_until(b'3', &mut v)).unwrap(), 3);
50 assert_eq!(v, b"123");
51 v.clear();
52 assert_eq!(run(buf.read_until(b'3', &mut v)).unwrap(), 1);
53 assert_eq!(v, b"3");
54 v.clear();
55 assert_eq!(run(buf.read_until(b'3', &mut v)).unwrap(), 1);
56 assert_eq!(v, b"3");
57 v.clear();
58 assert_eq!(run(buf.read_until(b'3', &mut v)).unwrap(), 0);
59 assert_eq!(v, []);
60}
61