use super::{Doc, arb_ops, expected, run};
use crate::metis::DotSet;
use proptest::prelude::*;
proptest! {
#[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);
}
}
}