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);
}