use super::change::{ProjectionChange, projection_change};
#[kani::proof]
fn projection_change_reconstructs_the_exact_new_state() {
let before: Option<(u64, u8)> = kani::any();
let after: Option<(u64, u8)> = kani::any();
let change = projection_change(
before
.as_ref()
.map(|(incarnation, value)| (*incarnation, value)),
after,
);
let reconstructed = match change {
ProjectionChange::Unchanged => {
assert!(before == after);
kani::cover!(true, "observed.change_unchanged");
before
}
ProjectionChange::Upsert { incarnation, value } => {
assert!(after.is_some() && before != after);
kani::cover!(true, "observed.change_upsert");
Some((incarnation, value))
}
ProjectionChange::Remove { incarnation } => {
assert!(matches!(before, Some((old, _)) if old == incarnation));
assert!(after.is_none());
kani::cover!(true, "observed.change_remove");
None
}
};
assert!(reconstructed == after);
}