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