minerva 0.2.0

Causal ordering for distributed systems
use super::super::super::support::vv;
use super::hash_of;
use crate::metis::VersionVector;

#[test]
fn test_restriction_creates_order() {
    let a = vv(&[(1, 3), (2, 1)]);
    let b = vv(&[(1, 1), (2, 4)]);
    assert!(a.concurrent(&b));

    let ra = a.restrict([1]);
    let rb = b.restrict([1]);
    assert!(rb.happens_before(&ra));

    let sa = a.restrict([1, 2]);
    let sb = b.restrict([1, 2]);
    assert!(sa.concurrent(&sb));
}

#[test]
fn test_restrict_to_empty_roster_is_bottom() {
    let v = vv(&[(1, 3), (5, 2)]);
    let empty = v.restrict(core::iter::empty::<u32>());
    assert_eq!(empty, VersionVector::new());
    assert_eq!(hash_of(&empty), hash_of(&VersionVector::new()));
}

#[test]
fn test_glue_refuses_what_merge_absorbs() {
    let left = vv(&[(1, 5), (2, 3)]);
    let right = vv(&[(2, 7), (3, 2)]);

    assert_eq!(left.merge(&right), vv(&[(1, 5), (2, 7), (3, 2)]));

    let witness = left.try_glue(&right, [2]).unwrap_err();
    assert_eq!(witness.station, 2);
    assert_eq!(witness.left, 3);
    assert_eq!(witness.right, 7);

    let disjoint = left.try_glue(&right, core::iter::empty::<u32>());
    assert_eq!(disjoint, Ok(left.merge(&right)));
}