minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use alloc::{boxed::Box, string::ToString};

use crate::kairos::{
    Clock, ClockConfig, DynClock, DynLocalClock, InvalidStationId, LocalClock, TickCounter,
    TimeSource,
};

#[test]
fn test_invalid_station_id() {
    let clock = Clock::new(TickCounter::new(), 1 << 31, ClockConfig::default());
    assert!(clock.is_ok());

    let result = Clock::new(TickCounter::new(), 0, ClockConfig::default());
    assert!(matches!(result, Err(InvalidStationId)));
    let result = Clock::with_default_config(TickCounter::new(), 0);
    assert!(matches!(result, Err(InvalidStationId)));
    assert_eq!(
        InvalidStationId.to_string(),
        "invalid station_id: station_id must be non-zero"
    );
}

#[test]
fn test_construction_preserves_or_erases_the_source_by_type() {
    let concrete = Clock::with_default_config(TickCounter::new(), 1).unwrap();
    let _: &Clock<TickCounter> = &concrete;

    let source: Box<dyn TimeSource> = Box::new(TickCounter::new());
    let erased: DynClock = Clock::with_default_config(source, 2).unwrap();
    assert_eq!(erased.now(0u16).station_id(), 2);

    let source: Box<dyn TimeSource> = Box::new(TickCounter::new());
    let local: DynLocalClock = LocalClock::new(source, 3).unwrap();
    assert_eq!(local.now(0u16).station_id(), 3);
}