extern crate alloc;
use alloc::collections::BTreeMap;
use alloc::vec::Vec;
use crate::kairos::Kairos;
use crate::metis::{Anchor, Dot, Locus};
use proptest::prelude::*;
use super::super::{arb_ops, run};
proptest! {
#[test]
fn prop_children_of_agrees_with_the_sibling_order(ops in arb_ops()) {
let (live, record) = run(&ops);
for seq in &live {
let held: BTreeMap<Dot, Locus> = record
.woven
.iter()
.filter(|(dot, _)| seq.store().locus(**dot).is_some())
.map(|(&dot, &locus)| (dot, locus))
.collect();
let naive_bucket = |anchor: Anchor| -> Vec<Dot> {
let mut kids: Vec<Dot> = held
.iter()
.filter(|(_, t)| t.anchor == anchor)
.map(|(&d, _)| d)
.collect();
kids.sort_by(|a, b| {
let (ra, rb): (Kairos, Kairos) = (held[a].rank, held[b].rank);
rb.cmp(&ra).then_with(|| a.cmp(b))
});
kids
};
let got_origin: Vec<Dot> = seq.store().children_of(Anchor::Origin).collect();
prop_assert_eq!(got_origin, naive_bucket(Anchor::Origin));
for &dot in held.keys() {
let after = Anchor::After(dot.into());
let before = Anchor::Before(dot.into());
let got_after: Vec<Dot> = seq.store().children_of(after).collect();
prop_assert_eq!(got_after, naive_bucket(after));
let got_before: Vec<Dot> = seq.store().children_of(before).collect();
prop_assert_eq!(got_before, naive_bucket(before));
}
}
}
}