minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

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

#[test]
fn test_monotonicity_and_components() {
    let clock = Clock::with_default_config(TickCounter::new(), 42).unwrap();
    let t1 = clock.now(0u16);
    let t2 = clock.now(0u16);

    assert!(t2 > t1, "Local timestamps must be monotonic");
    assert_eq!(t1.physical(), 0);
    assert_eq!(t1.logical(), 0);
    assert_eq!(t1.kairotic(), 0);
    assert_eq!(t1.station_id(), 42);

    assert_eq!(t2.physical(), 1);
    assert_eq!(t2.logical(), 0);
    assert_eq!(t2.kairotic(), 0);
    assert_eq!(t2.station_id(), 42);
}

#[test]
fn test_station_id_uniqueness() {
    let clock1 = Clock::with_default_config(TickCounter::new(), 1).unwrap();
    let clock2 = Clock::with_default_config(TickCounter::new(), 2).unwrap();
    let t1 = clock1.now(0u16);
    let t2 = clock2.now(0u16);
    assert_ne!(t1, t2);
    assert!(t2 > t1); // Because station_id 2 > 1
    assert_eq!(t1.kairotic(), 0);
    assert_eq!(t2.kairotic(), 0);
}

#[test]
fn test_kairotic() {
    let clock = Clock::with_default_config(TickCounter::new(), 1).unwrap();
    let t1 = clock.now(42u16);
    assert_eq!(t1.kairotic(), 42);
    let t2 = clock.after(t1, 100u16);
    assert_eq!(t2.kairotic(), 100);
}