use jiff::Zoned;
#[derive(Debug)]
pub enum Clock {
DefaultClock,
#[cfg(test)]
ManualClock(ManualClock),
}
impl Clock {
pub fn now(&self) -> Zoned {
match self {
Clock::DefaultClock => Zoned::now(),
#[cfg(test)]
Clock::ManualClock(clock) => clock.now(),
}
}
#[cfg(test)]
pub fn set_now(&mut self, now: Zoned) {
if let Clock::ManualClock(clock) = self {
clock.set_now(now);
}
}
}
#[derive(Debug)]
#[cfg(test)]
pub struct ManualClock {
now: Zoned,
}
#[cfg(test)]
impl ManualClock {
pub fn new(now: Zoned) -> ManualClock {
ManualClock { now }
}
fn now(&self) -> Zoned {
self.now.clone()
}
pub fn set_now(&mut self, now: Zoned) {
self.now = now;
}
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use super::*;
#[test]
fn test_manual_clock_adjusting() {
let now = Zoned::from_str("2024-08-10T17:12:52+08[+08]").unwrap();
let mut clock = ManualClock { now: now.clone() };
assert_eq!(clock.now(), now);
let now = Zoned::from_str("2024-01-01T12:00:00+08[+08]").unwrap();
clock.set_now(now.clone());
assert_eq!(clock.now(), now);
}
}