use std::time::Duration;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DebouncePolicy {
window: Duration,
}
impl DebouncePolicy {
#[must_use]
pub const fn new(window: Duration) -> Self {
Self { window }
}
#[must_use]
pub const fn window(&self) -> Duration {
self.window
}
}
impl Default for DebouncePolicy {
fn default() -> Self {
Self {
window: Duration::from_secs(2),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_window_is_two_seconds() {
let policy = DebouncePolicy::default();
assert_eq!(policy.window(), Duration::from_secs(2));
}
#[test]
fn new_creates_with_specified_window() {
let policy = DebouncePolicy::new(Duration::from_millis(500));
assert_eq!(policy.window(), Duration::from_millis(500));
}
#[test]
fn window_accessor_returns_duration() {
let policy = DebouncePolicy::new(Duration::from_secs(5));
assert_eq!(policy.window(), Duration::from_secs(5));
}
#[test]
fn equality_based_on_window() {
let policy1 = DebouncePolicy::new(Duration::from_secs(1));
let policy2 = DebouncePolicy::new(Duration::from_secs(1));
let policy3 = DebouncePolicy::new(Duration::from_secs(2));
assert_eq!(policy1, policy2);
assert_ne!(policy1, policy3);
}
#[test]
fn clone_creates_identical_policy() {
let original = DebouncePolicy::new(Duration::from_millis(100));
let cloned = original.clone();
assert_eq!(original, cloned);
}
#[test]
fn debug_format_includes_window() {
let policy = DebouncePolicy::new(Duration::from_secs(3));
let debug_str = format!("{policy:?}");
assert!(debug_str.contains("DebouncePolicy"));
assert!(debug_str.contains("window"));
}
}