minerva 0.2.0

Causal ordering for distributed systems
use super::{Doc, arb_ops, expected, run};
use crate::metis::DotSet;
use proptest::prelude::*;

proptest! {
    /// Every fold order reaches the oracle survivors and absorbs each replica.
    #[test]
    fn prop_replicas_converge_to_the_oracle(ops in arb_ops()) {
        let (live, record) = run(&ops);
        let forward = live.iter().fold(Doc::new(), |acc, doc| acc.merge(doc));
        let backward = live.iter().rev().fold(Doc::new(), |acc, doc| acc.merge(doc));
        prop_assert_eq!(&forward, &backward);

        let survivors = expected(&record);
        prop_assert_eq!(forward.store(), &survivors);

        let mut seen = DotSet::new();
        for &minted in record.minted.keys() {
            let _ = seen.insert(minted);
        }
        prop_assert_eq!(forward.context(), &seen);

        for doc in &live {
            prop_assert_eq!(&forward.merge(doc), &forward);
        }
    }
}