use std::time::{Duration, Instant};
use crate::{Clock, ConstantRate};
fn test_clock() -> (Instant, Clock<ConstantRate>) {
let now = Instant::now();
(now, Clock::new(now, ConstantRate(0.25)))
}
const fn ms(ms: u64) -> Duration {
Duration::from_millis(ms)
}
#[test]
fn new_clock_starts_at_zero() {
let (now, c) = test_clock();
assert_eq!(c.elapsed(now), Duration::ZERO);
}
#[test]
fn unadjusted_clock_acts_as_stopwatch() {
let (mut now, c) = test_clock();
now += ms(10);
assert_eq!(c.elapsed(now), ms(10));
}
#[test]
fn setting_target_changes_elapsed_time() {
let (mut now, mut c) = test_clock();
const TARGET: Duration = ms(1000);
const ADJUSTMENT_DELAY: Duration = ms(4000); c.set_target(now, TARGET);
now += ADJUSTMENT_DELAY; assert_eq!(c.elapsed(now), TARGET + ADJUSTMENT_DELAY);
}
#[test]
fn setting_target_does_not_changed_elapse_time_immediately() {
let (now, mut c) = test_clock();
c.set_target(now, ms(1000));
assert_eq!(c.elapsed(now), ms(0));
}
#[test]
fn setting_target_to_later_speeds_up_clock() {
let (mut now, mut c) = test_clock();
now += ms(1000);
assert_eq!(c.elapsed(now), ms(1000));
c.set_target(now, ms(1300));
assert_eq!(c.elapsed(now), ms(1000));
assert_eq!(c.elapsed(now + ms(100)), ms(1000 + 100 + 25));
assert_eq!(c.elapsed(now + ms(200)), ms(1000 + 200 + 50));
assert_eq!(c.elapsed(now + ms(300)), ms(1000 + 300 + 75));
assert_eq!(c.elapsed(now + ms(400)), ms(1000 + 400 + 100));
assert_eq!(c.elapsed(now + ms(1100)), ms(1000 + 1100 + 275));
assert_eq!(c.elapsed(now + ms(1200)), ms(1000 + 1200 + 300));
assert_eq!(c.elapsed(now + ms(1300)), ms(1000 + 1300 + 300));
assert_eq!(c.elapsed(now + ms(1400)), ms(1000 + 1400 + 300));
}
#[test]
fn setting_target_to_earlier_slows_down_clock() {
let (start, mut c) = test_clock();
let t = start + ms(1000);
c.set_target(t, ms(700));
assert_eq!(c.elapsed(t), ms(1000));
assert_eq!(c.elapsed(t + ms(100)), ms(1000 + 100 - 25));
assert_eq!(c.elapsed(t + ms(200)), ms(1000 + 200 - 50));
assert_eq!(c.elapsed(t + ms(300)), ms(1000 + 300 - 75));
assert_eq!(c.elapsed(t + ms(400)), ms(1000 + 400 - 100));
assert_eq!(c.elapsed(t + ms(1100)), ms(1000 + 1100 - 275));
assert_eq!(c.elapsed(t + ms(1200)), ms(1000 + 1200 - 300));
assert_eq!(c.elapsed(t + ms(1300)), ms(1000 + 1300 - 300));
}
#[test]
fn high_rate_forwards() {
let start = Instant::now();
let mut c = Clock::new(start, ConstantRate(100.0));
c.set_target(start, ms(100)); assert_eq!(c.elapsed(start), ms(0), "no change at first");
assert_eq!(
c.elapsed(start + ms(1)),
ms(101),
"adjustment done after short time"
);
}
#[test]
fn high_rate_backwards() {
let base = Instant::now();
let mut c = Clock::new(base, ConstantRate(100.0));
let now = base + ms(1000);
c.set_target(now, ms(900)); assert_eq!(c.elapsed(now), ms(1000), "no change at first");
assert_eq!(
c.elapsed(now + ms(1)),
ms(901),
"adjustment done after short time"
);
}