pub trait Sleeper {
fn sleep_ms(&self, ms: u64);
}
#[cfg(feature = "std")]
#[derive(Debug, Clone, Copy)]
pub struct StdSleeper;
#[cfg(feature = "std")]
impl Sleeper for StdSleeper {
fn sleep_ms(&self, ms: u64) {
std::thread::sleep(std::time::Duration::from_millis(ms));
}
}
#[derive(Clone, Copy)]
pub struct FnSleeper(pub fn(u64));
impl Sleeper for FnSleeper {
fn sleep_ms(&self, ms: u64) {
(self.0)(ms);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "std")]
#[test]
fn test_std_sleeper() {
let sleeper = StdSleeper;
let start = std::time::Instant::now();
sleeper.sleep_ms(10);
let elapsed = start.elapsed();
assert!(elapsed.as_millis() >= 9 && elapsed.as_millis() <= 20);
}
#[test]
fn test_fn_sleeper() {
fn test_sleep(ms: u64) {
assert!(ms > 0);
}
let sleeper = FnSleeper(test_sleep);
sleeper.sleep_ms(100);
}
}