minerva 0.2.0

Causal ordering for distributed systems
use super::super::super::support::vv;
use super::{dots, seen};
use crate::metis::{DotSet, Purview, VersionVector};

#[test]
fn test_empty_roster_common_is_bottom() {
    let purview = Purview::new(core::iter::empty::<u32>());
    assert_eq!(purview.common(), DotSet::new());
    assert_eq!(purview.common_floor(), VersionVector::new());
    assert!(purview.roster().next().is_none());
}

#[test]
fn test_one_lagging_peer_pins_common_until_it_reports() {
    let shared = [(5, 1), (5, 2)];
    let mut purview = Purview::new([1, 2, 3]);
    purview.note(&seen(1, &shared)).unwrap();
    purview.note(&seen(2, &shared)).unwrap();
    assert_eq!(purview.common(), DotSet::new());

    purview.note(&seen(3, &shared)).unwrap();
    assert_eq!(purview.common(), dots(&shared));
    assert_eq!(purview.common_floor(), vv(&[(5, 2)]));
}

#[test]
fn test_common_is_the_intersection_of_rows() {
    let mut purview = Purview::new([1, 2, 3]);
    purview.note(&seen(1, &[(9, 1), (9, 2), (9, 3)])).unwrap();
    purview.note(&seen(2, &[(9, 1), (9, 2)])).unwrap();
    purview.note(&seen(3, &[(9, 1), (9, 2), (9, 4)])).unwrap();

    assert_eq!(purview.common(), dots(&[(9, 1), (9, 2)]));
}