lazily 0.54.0

Lazy reactive signals with dependency tracking and cache invalidation
Documentation
use std::time::{Duration, Instant};

use lazily::stdlib::{Timer, TimerPoll};

#[test]
fn timer_poll_at_is_pending_then_fires_exactly_once() {
    let start = Instant::now();
    let deadline = start + Duration::from_secs(5);
    let mut timer = Timer::at(deadline);

    assert_eq!(timer.deadline(), deadline);
    assert_eq!(
        timer.poll_at(start),
        TimerPoll::Pending {
            remaining: Duration::from_secs(5)
        }
    );
    assert!(!timer.has_fired());

    assert_eq!(
        timer.poll_at(deadline),
        TimerPoll::Fired { newly_fired: true }
    );
    assert!(timer.has_fired());
    assert_eq!(
        timer.poll_at(deadline + Duration::from_secs(1)),
        TimerPoll::Fired { newly_fired: false }
    );
}

#[test]
fn fired_timer_is_terminal_when_polled_with_an_earlier_instant() {
    let start = Instant::now();
    let deadline = start + Duration::from_secs(1);
    let mut timer = Timer::at(deadline);

    assert_eq!(
        timer.poll_at(deadline),
        TimerPoll::Fired { newly_fired: true }
    );
    assert_eq!(
        timer.poll_at(start),
        TimerPoll::Fired { newly_fired: false }
    );
}

#[test]
fn zero_delay_wait_fires_without_an_async_runtime() {
    let mut timer = Timer::after(Duration::ZERO);

    assert_eq!(timer.wait(), TimerPoll::Fired { newly_fired: true });
    assert_eq!(timer.wait(), TimerPoll::Fired { newly_fired: false });
}