use super::{KAIROS_WIRE_LEN, Kairos};
#[kani::proof]
fn packing_roundtrips_every_field() {
let physical: u64 = kani::any();
let logical: u16 = kani::any();
let station_id: u32 = kani::any();
let kairotic: u16 = kani::any();
let stamp = Kairos::new(physical, logical, station_id, kairotic);
assert_eq!(stamp.physical(), physical);
assert_eq!(stamp.logical(), logical);
assert_eq!(stamp.kairotic(), kairotic);
assert_eq!(stamp.station_id(), station_id);
}
#[kani::proof]
fn order_is_field_lexicographic() {
let (p_a, l_a, s_a, k_a): (u64, u16, u32, u16) =
(kani::any(), kani::any(), kani::any(), kani::any());
let (p_b, l_b, s_b, k_b): (u64, u16, u32, u16) =
(kani::any(), kani::any(), kani::any(), kani::any());
let a = Kairos::new(p_a, l_a, s_a, k_a);
let b = Kairos::new(p_b, l_b, s_b, k_b);
let a_fields = (p_a, l_a, k_a, s_a);
let b_fields = (p_b, l_b, k_b, s_b);
assert_eq!(a.cmp(&b), a_fields.cmp(&b_fields));
}
#[kani::proof]
#[kani::unwind(20)]
fn wire_roundtrip_is_total() {
let stamp = Kairos::new(kani::any(), kani::any(), kani::any(), kani::any::<u16>());
let decoded = Kairos::from_bytes(&stamp.to_bytes()).unwrap();
assert_eq!(decoded, stamp);
}
#[kani::proof]
#[kani::unwind(20)]
fn wire_bytes_sort_causally() {
let a = Kairos::new(kani::any(), kani::any(), kani::any(), kani::any::<u16>());
let b = Kairos::new(kani::any(), kani::any(), kani::any(), kani::any::<u16>());
assert_eq!(a.to_bytes().cmp(&b.to_bytes()), a.cmp(&b));
}
#[kani::proof]
#[kani::unwind(24)]
fn wire_decode_is_total_and_byte_identical() {
let bytes: [u8; 20] = kani::any();
let len: usize = kani::any();
kani::assume(len <= bytes.len());
let input = &bytes[..len];
match Kairos::from_bytes(input) {
Ok(stamp) => {
assert_eq!(len, KAIROS_WIRE_LEN);
let reencoded = stamp.to_bytes();
assert_eq!(reencoded.as_slice(), input);
}
Err(_) => {
}
}
if len != KAIROS_WIRE_LEN {
assert!(Kairos::from_bytes(input).is_err());
}
}