minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use super::super::{Seq, clock, delete, insert};
use crate::metis::{Dot, DotStore, Rhapsody};
use alloc::vec::Vec;

#[test]
fn test_deletion_keeps_order() {
    let mut r = Seq::new();
    let clk = clock(1);
    let d0 = insert(&mut r, &clk, 1, None);
    let d1 = insert(&mut r, &clk, 1, Some(d0));
    let d2 = insert(&mut r, &clk, 1, Some(d1));
    let d3 = insert(&mut r, &clk, 1, Some(d2));
    assert_eq!(r.store().order(), [d0, d1, d2, d3]);

    let stale = r.clone();

    delete(&mut r, d1);
    assert_eq!(r.store().order(), [d0, d2, d3]);
    assert!(r.store().locus(d1).is_some());
    assert_eq!(r.store().skeleton_len(), 4);

    let rejoined = r.merge(&stale);
    assert_eq!(rejoined.store().order(), [d0, d2, d3]);
    assert!(!rejoined.store().is_visible(d1));
    assert_eq!(rejoined.store().order(), stale.merge(&r).store().order());
}

#[test]
fn test_is_bottom_distinguishes_empty_from_fully_deleted() {
    let empty = Rhapsody::new();
    assert!(empty.is_bottom());

    let mut r = Seq::new();
    let clk = clock(1);
    let d0 = insert(&mut r, &clk, 1, None);
    delete(&mut r, d0);
    assert_eq!(r.store().visible_len(), 0);
    assert_eq!(r.store().skeleton_len(), 1);
    assert!(!r.store().is_bottom());
}

#[test]
fn test_dots_are_the_visible_only() {
    let mut r = Seq::new();
    let clk = clock(1);
    let d0 = insert(&mut r, &clk, 1, None);
    let d1 = insert(&mut r, &clk, 1, Some(d0));
    delete(&mut r, d0);

    let support: Vec<Dot> = r.store().dots().collect();
    assert_eq!(support, [d1]);
}