use super::super::super::placement::{Anchor, Locus};
use super::{apply_chain_step, chain_step, flatten, pure};
use crate::kairos::Kairos;
use crate::metis::dot::RawDot;
fn any_anchor() -> Anchor {
let tag: u8 = kani::any();
kani::assume(tag < 3);
match tag {
0 => Anchor::Origin,
1 => Anchor::After(RawDot {
station: kani::any(),
counter: kani::any(),
}),
_ => Anchor::Before(RawDot {
station: kani::any(),
counter: kani::any(),
}),
}
}
fn any_locus() -> Locus {
Locus {
anchor: any_anchor(),
rank: Kairos::new(kani::any(), kani::any(), kani::any(), kani::any::<u16>()),
}
}
#[kani::proof]
fn chain_step_spelling_is_lossless() {
let prev_dot: (u32, u64) = (kani::any(), kani::any());
let prev = any_locus();
kani::assume(prev_dot.1 < u64::MAX);
let next_dot = (prev_dot.0, prev_dot.1 + 1);
let next = any_locus();
if let Some(step) = chain_step(prev_dot, &prev, next_dot, &next) {
assert_eq!(
apply_chain_step(prev_dot, &prev, step),
next,
"an admitted step must reconstruct the original locus exactly"
);
}
}
#[kani::proof]
fn a_committed_send_succession_always_chains() {
let prev_dot: (u32, u64) = (kani::any(), kani::any());
kani::assume(prev_dot.1 < u64::MAX);
let next_dot = (prev_dot.0, prev_dot.1 + 1);
let prev = any_locus();
let next = apply_chain_step(prev_dot, &prev, 0);
assert!(
pure::chainable(&flatten(prev_dot, &prev), &flatten(next_dot, &next)),
"the successor locus must satisfy the codec chain predicate"
);
assert_eq!(
chain_step(prev_dot, &prev, next_dot, &next),
Some(0),
"the successor locus must spell as the inline zero step"
);
}