1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3
4 use tokio::time::{self, Duration, Instant};
5 use tokio_test::{assert_pending, assert_ready_eq, task};
6
7 use std::task::Poll;
8
9 #[tokio::test]
10 #[should_panic]
interval_zero_duration()11 async fn interval_zero_duration() {
12 let _ = time::interval_at(Instant::now(), ms(0));
13 }
14
15 #[tokio::test]
usage()16 async fn usage() {
17 time::pause();
18
19 let start = Instant::now();
20
21 // TODO: Skip this
22 time::advance(ms(1)).await;
23
24 let mut i = task::spawn(time::interval_at(start, ms(300)));
25
26 assert_ready_eq!(poll_next(&mut i), start);
27 assert_pending!(poll_next(&mut i));
28
29 time::advance(ms(100)).await;
30 assert_pending!(poll_next(&mut i));
31
32 time::advance(ms(200)).await;
33 assert_ready_eq!(poll_next(&mut i), start + ms(300));
34 assert_pending!(poll_next(&mut i));
35
36 time::advance(ms(400)).await;
37 assert_ready_eq!(poll_next(&mut i), start + ms(600));
38 assert_pending!(poll_next(&mut i));
39
40 time::advance(ms(500)).await;
41 assert_ready_eq!(poll_next(&mut i), start + ms(900));
42 assert_ready_eq!(poll_next(&mut i), start + ms(1200));
43 assert_pending!(poll_next(&mut i));
44 }
45
46 #[tokio::test]
usage_stream()47 async fn usage_stream() {
48 use tokio::stream::StreamExt;
49
50 let start = Instant::now();
51 let mut interval = time::interval(ms(10));
52
53 for _ in 0..3 {
54 interval.next().await.unwrap();
55 }
56
57 assert!(start.elapsed() > ms(20));
58 }
59
poll_next(interval: &mut task::Spawn<time::Interval>) -> Poll<Instant>60 fn poll_next(interval: &mut task::Spawn<time::Interval>) -> Poll<Instant> {
61 interval.enter(|cx, mut interval| interval.poll_tick(cx))
62 }
63
ms(n: u64) -> Duration64 fn ms(n: u64) -> Duration {
65 Duration::from_millis(n)
66 }
67