use super::*;
#[test]
fn gap_guard_no_resume_adopts_first_observed_sequence() {
let mut g = GapGuard::starting_from(None);
assert!(g.observe(100).is_ok());
assert!(g.observe(101).is_ok());
assert!(matches!(
g.observe(105),
Err(GapReason::SequenceJump {
expected: 102,
observed: 105
})
));
}
#[test]
fn gap_guard_after_sequence_expects_next() {
let mut g = GapGuard::starting_from(Some(&ResumeStart::AfterSequence(9)));
assert!(g.observe(10).is_ok());
assert!(g.observe(11).is_ok());
assert!(matches!(
g.observe(13),
Err(GapReason::SequenceJump {
expected: 12,
observed: 13
})
));
}
#[test]
fn gap_guard_tolerates_backwards_sequence() {
let mut g = GapGuard::starting_from(None);
assert!(g.observe(100).is_ok());
assert!(
g.observe(50).is_ok(),
"backwards observation must not be reported as a gap"
);
}
#[test]
fn gap_guard_overflow_resets_to_fresh_start() {
let mut g = GapGuard::starting_from(Some(&ResumeStart::AfterSequence(u64::MAX)));
assert!(
g.observe(0).is_ok(),
"overflow on construction must not poison subsequent observation"
);
}
#[test]
fn gap_guard_relaxed_does_not_report_sequence_jump_as_error() {
let mut g = GapGuard::relaxed_starting_from(Some(&ResumeStart::AfterSequence(15)));
assert!(
g.observe(24).is_ok(),
"relaxed mode must NOT report a jump from expected=16 to observed=24 as an error; the server filtered events 16-23 server-side and the gap is expected behaviour for filtered listeners"
);
assert!(
g.observe(25).is_ok(),
"after a relaxed jump, the next consecutive observation continues without complaint"
);
}
#[test]
fn gap_guard_relaxed_advances_expected_past_the_jump() {
let mut g = GapGuard::relaxed_starting_from(Some(&ResumeStart::AfterSequence(15)));
let _ = g.observe(24);
assert!(
g.observe(25).is_ok(),
"relaxed mode must advance `expected` past the jumped-to sequence so the next consecutive observation does not also fire"
);
assert!(g.observe(40).is_ok());
}
#[test]
fn gap_guard_strict_default_still_reports_jumps_for_unfiltered_listeners() {
let mut g = GapGuard::starting_from(Some(&ResumeStart::AfterSequence(15)));
assert!(matches!(
g.observe(24),
Err(GapReason::SequenceJump {
expected: 16,
observed: 24
})
));
}