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