use std::time::Duration;
use super::ton::Ton;
#[derive(Debug, Clone)]
pub struct BitResetOnDelay {
ton: Ton,
}
impl BitResetOnDelay {
pub fn new() -> Self {
Self { ton: Ton::new() }
}
pub fn call(&mut self, value: &mut bool, pt: Duration) {
self.ton.call(*value, pt);
if self.ton.q {
*value = false;
}
}
}
impl Default for BitResetOnDelay {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_resets_after_delay() {
let mut fb = BitResetOnDelay::new();
let mut flag = true;
let pt = Duration::from_millis(50);
fb.call(&mut flag, pt);
assert_eq!(flag, true);
std::thread::sleep(Duration::from_millis(60));
fb.call(&mut flag, pt);
assert_eq!(flag, false);
}
#[test]
fn test_no_effect_when_false() {
let mut fb = BitResetOnDelay::new();
let mut flag = false;
let pt = Duration::from_millis(50);
fb.call(&mut flag, pt);
assert_eq!(flag, false);
std::thread::sleep(Duration::from_millis(60));
fb.call(&mut flag, pt);
assert_eq!(flag, false);
}
#[test]
fn test_timer_resets_when_value_goes_false() {
let mut fb = BitResetOnDelay::new();
let mut flag = true;
let pt = Duration::from_millis(100);
fb.call(&mut flag, pt);
assert_eq!(flag, true);
std::thread::sleep(Duration::from_millis(40));
fb.call(&mut flag, pt);
assert_eq!(flag, true);
flag = false;
fb.call(&mut flag, pt);
assert_eq!(flag, false);
flag = true;
fb.call(&mut flag, pt);
assert_eq!(flag, true);
std::thread::sleep(Duration::from_millis(40));
fb.call(&mut flag, pt);
assert_eq!(flag, true);
std::thread::sleep(Duration::from_millis(70));
fb.call(&mut flag, pt);
assert_eq!(flag, false);
}
#[test]
fn test_default_trait() {
let fb = BitResetOnDelay::default();
assert!(!fb.ton.q);
}
}