minerva 0.2.0

Causal ordering for distributed systems
use super::super::super::support::vv;
use crate::metis::VersionVector;
use core::cmp::Ordering;

#[test]
fn test_concurrent_pair() {
    let a = vv(&[(1, 1)]);
    let b = vv(&[(2, 1)]);
    assert!(a.concurrent(&b));
    assert!(b.concurrent(&a));
    assert_eq!(a.partial_cmp(&b), None);
    assert!(!a.happens_before(&b));
    assert!(!b.happens_before(&a));
}

#[test]
fn test_happens_before_chain() {
    let a = VersionVector::new();
    let b = vv(&[(1, 1)]);
    let c = vv(&[(1, 1), (2, 1)]);

    assert!(a.happens_before(&b));
    assert!(b.happens_before(&c));
    assert!(a.happens_before(&c));
    assert!(a < b && b < c && a < c);
    assert!(c > a);
    assert_eq!(b.partial_cmp(&a), Some(Ordering::Greater));
}

#[test]
fn test_bottom_precedes_all() {
    let bottom = VersionVector::new();
    let v = vv(&[(5, 1), (3, 9)]);
    assert!(bottom.happens_before(&v));
    assert!(bottom <= v);
    assert_eq!(bottom.partial_cmp(&bottom), Some(Ordering::Equal));
    assert_eq!(v.merge(&bottom), v);
    assert_eq!(bottom.merge(&v), v);
}