use std::time::SystemTime;
pub trait ClockSource: Send + Sync {
fn now(&self) -> SystemTime;
}
#[derive(Debug, Clone, Default)]
pub struct SystemClock;
impl ClockSource for SystemClock {
fn now(&self) -> SystemTime {
SystemTime::now()
}
}
#[derive(Debug, Clone)]
pub struct FixedClock(pub SystemTime);
impl ClockSource for FixedClock {
fn now(&self) -> SystemTime {
self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn system_clock_returns_recent_time() {
let before = SystemTime::now();
let observed = SystemClock.now();
let after = SystemTime::now();
assert!(observed >= before && observed <= after);
}
#[test]
fn fixed_clock_returns_the_same_instant_every_call() {
let t = SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(1_700_000_000);
let clock = FixedClock(t);
assert_eq!(clock.now(), t);
assert_eq!(clock.now(), t);
}
}