use super::super::support::{arb_history, deliverable, perm_of};
use crate::metis::{CausalIdeal, VersionVector};
use proptest::prelude::*;
proptest! {
#[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);
}
}