1 use core::future::Future as _;
2 use core::pin::pin;
3 use core::task::{Context, Poll, Waker};
4 
5 use test_programs::p3::wasi::clocks::monotonic_clock;
6 
7 struct Component;
8 
9 test_programs::p3::export!(Component);
10 
11 impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
run() -> Result<(), ()>12     async fn run() -> Result<(), ()> {
13         sleep_10ms().await;
14         sleep_0ms();
15         sleep_backwards_in_time();
16         Ok(())
17     }
18 }
19 
sleep_10ms()20 async fn sleep_10ms() {
21     let dur = 10_000_000;
22     monotonic_clock::wait_until(monotonic_clock::now() + dur).await;
23     monotonic_clock::wait_for(dur).await;
24 }
25 
sleep_0ms()26 fn sleep_0ms() {
27     let mut cx = Context::from_waker(Waker::noop());
28 
29     assert_eq!(
30         pin!(monotonic_clock::wait_until(monotonic_clock::now())).poll(&mut cx),
31         Poll::Ready(()),
32         "waiting until now() is ready immediately",
33     );
34     assert_eq!(
35         pin!(monotonic_clock::wait_for(0)).poll(&mut cx),
36         Poll::Ready(()),
37         "waiting for 0 is ready immediately",
38     );
39 }
40 
sleep_backwards_in_time()41 fn sleep_backwards_in_time() {
42     let mut cx = Context::from_waker(Waker::noop());
43 
44     assert_eq!(
45         pin!(monotonic_clock::wait_until(monotonic_clock::now() - 1)).poll(&mut cx),
46         Poll::Ready(()),
47         "waiting until instant which has passed is ready immediately",
48     );
49 }
50 
main()51 fn main() {}
52