use super::RearmSuppression;
#[test]
fn nothing_is_suppressed_initially() {
assert_eq!(*RearmSuppression::new().lock(), 0);
}
#[test]
fn suppressing_raises_the_count_before_the_disarm_runs() {
let suppression = RearmSuppression::new();
let mut seen = None;
suppression.suppress_and(|count| seen = Some(count));
assert_eq!(seen, Some(1));
assert_eq!(*suppression.lock(), 1);
}
#[test]
fn releasing_lowers_the_count() {
let suppression = RearmSuppression::new();
suppression.suppress_and(|_| {});
suppression.release();
assert_eq!(*suppression.lock(), 0);
}
#[test]
fn two_suppressions_both_have_to_be_released() {
let suppression = RearmSuppression::new();
suppression.suppress_and(|count| assert_eq!(count, 1));
suppression.suppress_and(|count| assert_eq!(count, 2));
suppression.release();
assert_eq!(
*suppression.lock(),
1,
"one release must not discharge the other caller's suppression"
);
suppression.release();
assert_eq!(*suppression.lock(), 0);
}
#[test]
fn releasing_more_than_was_suppressed_saturates_at_zero() {
let suppression = RearmSuppression::new();
suppression.release();
assert_eq!(*suppression.lock(), 0);
}
#[test]
fn the_count_saturates_rather_than_wrapping_at_the_top() {
let suppression = RearmSuppression::new();
*suppression.lock() = u32::MAX;
suppression.suppress_and(|count| assert_eq!(count, u32::MAX));
assert_eq!(*suppression.lock(), u32::MAX);
}
#[test]
fn a_poisoned_lock_is_still_usable() {
let suppression = RearmSuppression::new();
suppression.suppress_and(|_| {});
let poisoned = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
let _guard = suppression.lock();
panic!("poison the lock");
}));
assert!(poisoned.is_err(), "the closure above must have panicked");
assert_eq!(
*suppression.lock(),
1,
"the count survives, and the lock is still usable"
);
suppression.release();
assert_eq!(*suppression.lock(), 0);
}