minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use crate::kairos::{Clock, Kairos, TickCounter};

#[test]
fn test_skew_tracking() {
    let clock = Clock::with_default_config(TickCounter::new(), 1).unwrap();
    let initial_stats = clock.stats();
    assert_eq!(initial_stats.max_forward_skew_ns, 0);
    assert_eq!(initial_stats.max_backward_skew_ns, 0);

    let remote_t = Kairos::new(100, 0, 2, 10u16);
    let _ = clock.after(remote_t, 20u16); // time_source.now() is 0, new_physical is 100

    let stats = clock.stats();
    assert_eq!(stats.max_forward_skew_ns, 100);

    let remote_t2 = Kairos::new(101, 0, 2, 30u16);
    let _ = clock.after(remote_t2, 40u16); // time_source.now() is 1, new_physical is 101
    let stats = clock.stats();
    assert_eq!(
        stats.max_forward_skew_ns, 100,
        "Skew tracking uses fetch_max"
    );
    assert_eq!(
        stats.max_backward_skew_ns, 99,
        "Backward skew detected when clock lags behind last timestamp"
    );
}

#[test]
fn test_clock_stats_monitoring() {
    let clock = Clock::with_default_config(TickCounter::new(), 1).unwrap();
    let stats = clock.stats();
    assert!(!stats.has_concerning_skew());
    assert_eq!(stats.skew_warning_threshold_ns, 100_000_000);
    assert_eq!(stats.max_forward_skew_ns, 0);
    assert_eq!(stats.max_backward_skew_ns, 0);
}