minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use super::super::super::support::{dot, vv};
use super::cut;
use crate::metis::{Cut, DotSet, VersionVector};

#[test]
fn test_bottom_is_merge_identity_and_meet_absorber() {
    let cut = Cut::floor_of(&{
        let mut set = DotSet::new();
        assert!(set.insert(dot(1, 1)));
        assert!(set.insert(dot(1, 2)));
        assert!(set.insert(dot(3, 1)));
        set
    });
    let bottom = Cut::bottom();

    assert_eq!(cut.merge(&bottom), cut);
    assert_eq!(bottom.merge(&cut), cut);
    assert_eq!(cut.meet(&bottom), bottom);
    assert_eq!(bottom.meet(&cut), bottom);
}

#[test]
fn test_partial_order_is_pointwise() {
    let low = cut(&[(1, 2), (2, 1)]);
    let high = cut(&[(1, 3), (2, 4)]);
    assert!(low < high);
    assert!(high > low);
    assert_eq!(low.partial_cmp(&low), Some(core::cmp::Ordering::Equal));

    let a = cut(&[(1, 3), (2, 1)]);
    let b = cut(&[(1, 1), (2, 3)]);
    assert_eq!(a.partial_cmp(&b), None);
    assert_ne!(a, b);
}

#[test]
fn test_difference_owed_vector_carries_the_claim() {
    let mine = cut(&[(1, 5), (2, 2)]);
    let yours = cut(&[(1, 3), (2, 2)]);
    let owed = mine.difference(&yours);

    assert_eq!(owed, vv(&[(1, 5)]));
    assert_eq!(
        yours.as_vector().merge(&owed),
        mine.merge(&yours).into_vector()
    );
    assert_eq!(mine.difference(&mine), VersionVector::new());
    assert_eq!(yours.difference(&mine), VersionVector::new());

    let owed_dots: alloc::vec::Vec<_> = mine
        .to_have_set()
        .difference(&yours.to_have_set())
        .collect();
    assert_eq!(owed_dots, [dot(1, 4), dot(1, 5)]);
}

#[test]
fn test_restrict_selects_whole_fibers() {
    let cut = Cut::floor_of(&{
        let mut set = DotSet::new();
        for counter in [1, 2] {
            assert!(set.insert(dot(1, counter)));
        }
        for counter in [1, 2, 3] {
            assert!(set.insert(dot(2, counter)));
        }
        assert!(set.insert(dot(5, 1)));
        set
    });

    let restricted = cut.restrict([1u32, 5]);
    assert_eq!(restricted.as_vector(), &vv(&[(1, 2), (5, 1)]));
}