minerva 0.2.0

Causal ordering for distributed systems
use super::super::support::{arb_history, deliverable, perm_of};
use crate::metis::{CausalIdeal, VersionVector};
use proptest::prelude::*;

proptest! {
    /// `pop_ready_event` returns enough dependency evidence to re-justify each release.
    #[test]
    fn prop_pop_ready_event_exposes_causal_evidence(
        (history, perm) in arb_history()
            .prop_flat_map(|history| {
                let perm = perm_of(history.len());
                (Just(history), perm)
            }),
    ) {
        let mut buf = CausalIdeal::new();
        for &index in &perm {
            buf.insert(history[index].clone());
        }
        let mut delivered = VersionVector::new();
        let mut count = 0usize;
        while let Some(released) = buf.pop_ready_event() {
            let event = released.event();
            prop_assert!(deliverable(event, &delivered));
            prop_assert_eq!(event.payload, history[event.payload as usize].payload);
            delivered = delivered.merge(&event.deps);
            count += 1;
        }
        prop_assert_eq!(count, history.len());
        prop_assert_eq!(buf.pending_len(), 0);
    }
}