extern crate alloc;
use crate::kairos::{Clock, Kairos, SkewExceeded, VirtualTimeSource};
#[test]
fn test_try_observe_accepts_within_bound() {
let clock = Clock::with_default_config(VirtualTimeSource::new(0), 1).unwrap();
let remote = Kairos::new(100, 7, 2, 10u16);
assert_eq!(clock.try_observe(remote, 100), Ok(()));
assert_eq!(
clock.stats().max_forward_skew_ns,
100,
"an admitted remote advances the clock exactly as observe does"
);
let next = clock.now(0u16);
assert!(
next > remote,
"a mint after an admitted try_observe exceeds the remote"
);
assert_eq!(next.physical(), 100);
}
#[test]
fn test_try_observe_rejects_beyond_bound_and_leaves_clock_untouched() {
let clock = Clock::with_default_config(VirtualTimeSource::new(10), 1).unwrap();
let first = clock.now(0u16); let hostile = Kairos::new(10_000, 0, 2, 0u16); assert_eq!(
clock.try_observe(hostile, 100),
Err(SkewExceeded {
observed_forward_skew: 9_990,
max_forward_skew: 100,
}),
);
assert_eq!(
clock.stats().max_forward_skew_ns,
0,
"a rejected remote contributes no forward skew"
);
let next = clock.now(0u16);
assert!(next > first, "the clock still advances on its own");
assert_eq!(
next.physical(),
10,
"physical stays on local time; the rejected remote did not drag it forward"
);
}
#[test]
fn test_try_observe_bound_is_inclusive() {
let at = Clock::with_default_config(VirtualTimeSource::new(0), 1).unwrap();
assert_eq!(at.try_observe(Kairos::new(100, 0, 2, 0u16), 100), Ok(()));
let over = Clock::with_default_config(VirtualTimeSource::new(0), 1).unwrap();
assert_eq!(
over.try_observe(Kairos::new(101, 0, 2, 0u16), 100),
Err(SkewExceeded {
observed_forward_skew: 101,
max_forward_skew: 100,
}),
);
}
#[test]
fn test_try_observe_admits_remote_behind_local() {
let clock = Clock::with_default_config(VirtualTimeSource::new(500), 1).unwrap();
let a = clock.now(0u16); let behind = Kairos::new(100, 0, 2, 0u16);
assert_eq!(
clock.try_observe(behind, 0),
Ok(()),
"a behind-local remote passes even a zero bound"
);
let b = clock.now(0u16);
assert!(b > a, "the receive still ticked the clock");
assert_eq!(
b.physical(),
500,
"local time is kept; the remote did not move physical"
);
}