nio 0.1.4

Async runtime for Rust
Documentation
use nio::{Sleep, test};
use std::time::{Duration, Instant};

mod support {
    pub mod futures;
}
use support::futures::test::{assert_pending, task};

#[test]
async fn immediate_sleep() {
    let iter = if cfg!(miri) { 10 } else { 1000 };
    for _ in 0..iter {
        let now = Instant::now();
        let mut sleep = Sleep::at(now);
        (&mut sleep).await;
        assert!(sleep.is_elapsed())
    }
}

#[test]
async fn is_elapsed() {
    let now = Instant::now();
    let mut sleep = Sleep::at(now + Duration::from_millis(10));

    assert!(!sleep.is_elapsed());
    assert!(futures::poll!(&mut sleep).is_pending());
    assert!(!sleep.is_elapsed());

    (&mut sleep).await;
    assert!(sleep.is_elapsed());
}

#[test]
async fn reset_future_sleep_before_fire() {
    let now = Instant::now();

    let mut sleep = task::spawn(Sleep::at(now + ms(100)));
    assert_pending!(sleep.poll());

    let mut sleep = sleep.into_inner();

    sleep.reset_at(Instant::now() + ms(200));
    sleep.await;

    assert!(now.elapsed() >= ms(200));
}

#[test]
async fn reset_past_sleep_before_fire() {
    let now = Instant::now();

    let mut sleep = task::spawn(Sleep::at(now + ms(200)));
    assert_pending!(sleep.poll());

    let mut sleep = sleep.into_inner();

    nio::sleep(ms(20)).await;

    sleep.reset_at(now + ms(80));
    sleep.await;

    assert!(now.elapsed() >= ms(80));
}

fn ms(n: u64) -> Duration {
    Duration::from_millis(n)
}