use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct MockTime {
elapsed_ms: Arc<AtomicU64>,
}
impl MockTime {
pub fn new() -> Self {
Self {
elapsed_ms: Arc::new(AtomicU64::new(0)),
}
}
pub fn elapsed(&self) -> Duration {
Duration::from_millis(self.elapsed_ms.load(Ordering::Relaxed))
}
pub fn elapsed_ms(&self) -> u64 {
self.elapsed_ms.load(Ordering::Relaxed)
}
pub fn advance(&self, duration: Duration) {
self.elapsed_ms
.fetch_add(duration.as_millis() as u64, Ordering::Relaxed);
}
pub fn advance_ms(&self, ms: u64) {
self.elapsed_ms.fetch_add(ms, Ordering::Relaxed);
}
pub fn advance_secs(&self, secs: u64) {
self.advance_ms(secs * 1000);
}
pub fn reset(&self) {
self.elapsed_ms.store(0, Ordering::Relaxed);
}
pub fn set(&self, duration: Duration) {
self.elapsed_ms
.store(duration.as_millis() as u64, Ordering::Relaxed);
}
}
impl Default for MockTime {
fn default() -> Self {
Self::new()
}
}