minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use proptest::prelude::*;

use super::super::super::support::arb_vv;
use super::{arb_dots, arb_roster, have};
use crate::metis::with_scope;

proptest! {
    /// A single scoped restriction agrees with the unbranded restriction over
    /// the same roster for version vectors and have-sets.
    #[test]
    fn prop_scoped_restrict_agrees_with_unbranded(
        v in arb_vv(), dots in arb_dots(), r in arb_roster(),
    ) {
        let set = have(&dots);
        let expected_vv = v.restrict(r.iter().copied());
        let expected_ds = set.restrict(r.iter().copied());
        let (got_vv, got_ds) = with_scope(r.iter().copied(), |scope| {
            (scope.restrict(&v).forget(), scope.restrict_dots(&set).forget())
        });
        prop_assert_eq!(got_vv, expected_vv);
        prop_assert_eq!(got_ds, expected_ds);
    }

    /// `restrict_all` brands a batch exactly as restricting each element does,
    /// preserving order.
    #[test]
    fn prop_restrict_all_matches_pointwise_restrict(
        vs in prop::collection::vec(arb_vv(), 0..6), r in arb_roster(),
    ) {
        let expected: alloc::vec::Vec<_> =
            vs.iter().map(|v| v.restrict(r.iter().copied())).collect();
        let got = with_scope(r.iter().copied(), |scope| {
            let mut out = alloc::vec::Vec::new();
            for scoped in scope.restrict_all(vs.iter()) {
                out.push(scoped.forget());
            }
            out
        });
        prop_assert_eq!(got, expected);
    }
}