minerva 0.2.0

Causal ordering for distributed systems
use crate::metis::Dotted;

use super::super::{Seq, clock, delete, insert};
use super::{claim, condense};

#[test]
fn test_condense_diamond_excises_one_child_and_spares_the_branching_anchor() {
    let mut r: Seq = Dotted::new();
    let clk = clock(1);
    let d0 = insert(&mut r, &clk, 1, None);
    let t = insert(&mut r, &clk, 1, Some(d0));
    let c1 = insert(&mut r, &clk, 1, Some(t));
    let c2 = insert(&mut r, &clk, 1, Some(t));
    delete(&mut r, t);
    delete(&mut r, c1);
    assert!(r.store().order().contains(&c2));
    assert!(!r.store().order().contains(&c1));

    let excised = condense(&mut r, &claim(&[t, c1]));
    assert_eq!(excised, 1);
    assert!(r.store().locus(c1).is_none());
    assert!(r.store().locus(t).is_some());
    assert!(r.store().locus(c2).is_some());
    assert_eq!(r.store().order(), [d0, c2]);
}

#[test]
fn test_condense_diamond_collapses_the_anchor_once_both_children_die() {
    let mut r: Seq = Dotted::new();
    let clk = clock(1);
    let d0 = insert(&mut r, &clk, 1, None);
    let t = insert(&mut r, &clk, 1, Some(d0));
    let c1 = insert(&mut r, &clk, 1, Some(t));
    let c2 = insert(&mut r, &clk, 1, Some(t));
    delete(&mut r, t);
    delete(&mut r, c1);
    delete(&mut r, c2);

    let excised = condense(&mut r, &claim(&[t, c1, c2]));
    assert_eq!(excised, 3);
    assert!(r.store().locus(t).is_none());
    assert!(r.store().locus(c1).is_none());
    assert!(r.store().locus(c2).is_none());
    assert_eq!(r.store().order(), [d0]);
}