use super::{arb_ops, run};
use crate::metis::{Cut, DotSet, DotStore};
use proptest::prelude::*;
proptest! {
#[test]
fn prop_delta_is_as_good_as_the_full_state(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
for peer in &live {
let delta = state.delta_for(peer.context());
let via_delta = peer.merge(&delta);
let via_full = peer.merge(state);
prop_assert_eq!(via_delta, via_full);
}
}
}
#[test]
fn prop_delta_for_since_is_as_good_as_the_full_state(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
for peer in &live {
let peer_floor = Cut::floor_of(peer.context());
for cut in [
peer_floor.clone(),
Cut::bottom(),
peer_floor.meet(&Cut::floor_of(state.context())),
] {
let delta = state.delta_for_since(&cut);
let via_delta = peer.merge(&delta);
let via_full = peer.merge(state);
prop_assert_eq!(&via_delta, &via_full);
}
}
}
}
#[test]
fn prop_delta_for_since_ships_the_whole_store(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
for peer in &live {
let cut = Cut::floor_of(peer.context());
let floored = state.delta_for_since(&cut);
prop_assert_eq!(floored.store(), state.store());
}
}
}
#[test]
fn prop_delta_for_a_fresh_peer_is_the_full_state(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
let empty = DotSet::new();
let delta = state.delta_for(&empty);
prop_assert_eq!(&delta, state);
}
}
#[test]
fn prop_delta_for_a_current_peer_is_pure_testimony(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
let delta = state.delta_for(state.context());
prop_assert!(delta.store().is_bottom());
let mut held = DotSet::new();
for dot in state.store().dots() {
let _ = held.insert(dot);
}
let mut superseded = DotSet::new();
for dot in state.context().difference(&held) {
let _ = superseded.insert(dot);
}
prop_assert_eq!(delta.context(), &superseded);
}
}
#[test]
fn prop_witnessed_delta_defaults_to_the_bare_read(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
for peer in &live {
let bare = state.delta_for(peer.context());
for witness in [&DotSet::new(), peer.context(), state.context()] {
let witnessed = state.delta_for_witnessed(peer.context(), witness);
prop_assert_eq!(&witnessed, &bare);
}
}
}
}
#[test]
fn prop_delta_store_dots_are_uncovered_by_the_peer(ops in arb_ops()) {
let (live, _) = run(&ops);
for state in &live {
for peer in &live {
let delta = state.delta_for(peer.context());
let peer_context = peer.context();
for dot in delta.store().dots() {
prop_assert!(!peer_context.contains(dot));
}
}
}
}
}