use std::time::{Duration, Instant};
#[derive(Debug, Clone)]
pub struct SimpleTimer {
start_time: Option<Instant>,
preset: Duration,
}
impl SimpleTimer {
pub fn new(preset: Duration) -> Self {
Self {
start_time: None,
preset,
}
}
pub fn start(&mut self) {
self.start_time = Some(Instant::now());
}
pub fn is_done(&self) -> bool {
self.start_time
.map(|t| t.elapsed() >= self.preset)
.unwrap_or(false)
}
pub fn elapsed(&self) -> Duration {
self.start_time
.map(|t| t.elapsed())
.unwrap_or(Duration::ZERO)
}
pub fn reset(&mut self) {
self.start_time = None;
}
pub fn preset(&self) -> Duration {
self.preset
}
pub fn set_preset(&mut self, preset: Duration) {
self.preset = preset;
}
pub fn is_running(&self) -> bool {
self.start_time.is_some()
}
}
impl Default for SimpleTimer {
fn default() -> Self {
Self::new(Duration::ZERO)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_simple_timer_basic() {
let mut timer = SimpleTimer::new(Duration::from_millis(50));
assert_eq!(timer.is_done(), false);
assert_eq!(timer.is_running(), false);
assert_eq!(timer.elapsed(), Duration::ZERO);
timer.start();
assert_eq!(timer.is_running(), true);
assert_eq!(timer.is_done(), false);
std::thread::sleep(Duration::from_millis(60));
assert_eq!(timer.is_done(), true);
assert!(timer.elapsed() >= Duration::from_millis(50));
timer.reset();
assert_eq!(timer.is_done(), false);
assert_eq!(timer.is_running(), false);
assert_eq!(timer.elapsed(), Duration::ZERO);
}
#[test]
fn test_simple_timer_restart() {
let mut timer = SimpleTimer::new(Duration::from_millis(100));
timer.start();
std::thread::sleep(Duration::from_millis(30));
timer.start();
assert!(timer.elapsed() < Duration::from_millis(20));
}
#[test]
fn test_simple_timer_preset() {
let mut timer = SimpleTimer::new(Duration::from_secs(5));
assert_eq!(timer.preset(), Duration::from_secs(5));
timer.set_preset(Duration::from_secs(10));
assert_eq!(timer.preset(), Duration::from_secs(10));
}
#[test]
fn test_simple_timer_default() {
let mut timer = SimpleTimer::default();
assert_eq!(timer.preset(), Duration::ZERO);
timer.start();
assert_eq!(timer.is_done(), true);
}
}