minerva 0.2.0

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

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

#[test]
fn test_over_claimed_retirement_strands_a_laggards_anchor() {
    let mut leader: Seq = Dotted::new();
    let clk_leader = clock(1);
    let d0 = insert(&mut leader, &clk_leader, 1, None);
    let d1 = insert(&mut leader, &clk_leader, 1, Some(d0));

    let mut laggard = leader.clone();
    assert!(laggard.store().is_visible(d1));

    delete(&mut leader, d1);
    let excised = condense(&mut leader, &claim(&[d1]));
    assert_eq!(excised, 1);
    assert!(leader.store().locus(d1).is_none());

    let clk_laggard = clock(2);
    let d2 = insert(&mut laggard, &clk_laggard, 2, Some(d1));
    assert!(laggard.store().order().contains(&d2));
    assert!(laggard.store().order().contains(&d1));

    let d2_locus = laggard.store().locus(d2).unwrap();
    let delta = woven(d2, d2_locus);
    leader = leader.merge(&delta);

    assert!(leader.store().is_visible(d2));
    assert!(!leader.store().order().contains(&d2));
    assert!(laggard.store().order().contains(&d2));
}