extern crate alloc;
use alloc::vec::Vec;
use crate::metis::{Anchor, Dot, Dotted};
use super::super::{Seq, clock, delete, insert, weave_at};
#[test]
fn test_children_of_agrees_with_the_order_sibling_bucket() {
let mut a: Seq = Dotted::new();
let mut b: Seq = Dotted::new();
let ca = clock(1);
let cb = clock(2);
let da = insert(&mut a, &ca, 1, None);
let db = insert(&mut b, &cb, 2, None);
let merged = a.merge(&b);
let head = merged.store().order()[0];
let mut merged = merged;
let cc = clock(1);
let dc = insert(&mut merged, &cc, 1, Some(head));
let origin_children: Vec<Dot> = merged.store().children_of(Anchor::Origin).collect();
let expected_origin = if da == head { [da, db] } else { [db, da] };
assert_eq!(origin_children, expected_origin);
let head_children: Vec<Dot> = merged
.store()
.children_of(Anchor::After(head.into()))
.collect();
assert_eq!(head_children, [dc]);
delete(&mut merged, dc);
let head_children_after: Vec<Dot> = merged
.store()
.children_of(Anchor::After(head.into()))
.collect();
assert_eq!(head_children_after, [dc]);
}
#[test]
fn test_children_of_head_is_the_rank_to_beat_on_both_sides() {
let clk = clock(1);
let mut r: Seq = Dotted::new();
let base = insert(&mut r, &clk, 1, None);
let after_lo = weave_at(&mut r, &clk, 1, Anchor::After(base.into()));
let after_hi = weave_at(&mut r, &clk, 1, Anchor::After(base.into()));
let before_lo = weave_at(&mut r, &clk, 1, Anchor::Before(base.into()));
let before_hi = weave_at(&mut r, &clk, 1, Anchor::Before(base.into()));
let after: Vec<Dot> = r.store().children_of(Anchor::After(base.into())).collect();
let before: Vec<Dot> = r.store().children_of(Anchor::Before(base.into())).collect();
assert_eq!(after, [after_hi, after_lo]);
assert_eq!(before, [before_hi, before_lo]);
let order = r.store().order();
let base_at = order.iter().position(|&d| d == base).unwrap();
assert_eq!(order[base_at + 1], after_hi, "After head reads right after");
assert_eq!(
order[base_at - 1],
before_hi,
"Before head reads right before"
);
}