use crate::kairos::Kairos;
use proptest::prelude::*;
proptest! {
#[test]
fn prop_kairos_fields_round_trip(
physical in any::<u64>(),
logical in any::<u16>(),
kairotic in any::<u16>(),
station_id in any::<u32>(),
) {
let k = Kairos::new(physical, logical, station_id, kairotic);
prop_assert_eq!(k.physical(), physical);
prop_assert_eq!(k.logical(), logical);
prop_assert_eq!(k.kairotic(), kairotic);
prop_assert_eq!(k.station_id(), station_id);
}
#[test]
fn prop_kairos_order_matches_field_priority(
a in any::<(u64, u16, u16, u32)>(),
b in any::<(u64, u16, u16, u32)>(),
) {
let ka = Kairos::new(a.0, a.1, a.3, a.2);
let kb = Kairos::new(b.0, b.1, b.3, b.2);
prop_assert_eq!(ka.cmp(&kb), a.cmp(&b));
}
#[test]
fn prop_bytes_round_trip(
physical in any::<u64>(),
logical in any::<u16>(),
kairotic in any::<u16>(),
station_id in any::<u32>(),
) {
let k = Kairos::new(physical, logical, station_id, kairotic);
prop_assert_eq!(Kairos::from_bytes(&k.to_bytes()), Ok(k));
}
#[test]
fn prop_bytes_preserve_order(
a in any::<(u64, u16, u16, u32)>(),
b in any::<(u64, u16, u16, u32)>(),
) {
let ka = Kairos::new(a.0, a.1, a.3, a.2);
let kb = Kairos::new(b.0, b.1, b.3, b.2);
prop_assert_eq!(ka.to_bytes().cmp(&kb.to_bytes()), ka.cmp(&kb));
}
#[test]
fn prop_from_bytes_never_panics(bytes in prop::collection::vec(any::<u8>(), 0..64)) {
if let Ok(k) = Kairos::from_bytes(&bytes) {
let encoded = k.to_bytes();
prop_assert_eq!(encoded.as_slice(), bytes.as_slice());
}
}
}