minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use super::super::super::support::{dot, vv};
use crate::metis::{CausalIdeal, Cut, DotSet, Purview, Received, Stability};
use alloc::vec::Vec;

#[test]
fn test_adoption_bridge_holes_above_the_floor_do_not_move_the_watermark() {
    let mut have = DotSet::new();
    for (station, counter) in [(1, 1), (1, 2), (2, 1), (2, 3)] {
        assert!(have.insert(dot(station, counter)));
    }
    let cut = Cut::floor_of(&have);
    assert_eq!(cut.as_vector(), &vv(&[(1, 2), (2, 1)]));

    let mut tracker = Stability::new([1, 2]);
    tracker.report(1, &vv(&[(1, 4), (2, 3)])).unwrap();
    tracker.report(2, cut.as_vector()).unwrap();

    let watermark = tracker.watermark();
    assert_eq!(watermark, vv(&[(1, 2), (2, 1)]));
    let holes: Vec<_> = have.holes().collect();
    assert_eq!(holes, [dot(2, 2)]);
    assert!(watermark.get(2) < 2);
}

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

    let embedded = cut.to_have_set();
    assert_eq!(embedded.floor(), *cut.as_vector());
    assert_eq!(embedded.high_water(), *cut.as_vector());
    assert_eq!(embedded.holes().count(), 0);
}

#[test]
fn test_delivered_by_reads_the_buffer_cut() {
    let buffer: CausalIdeal<u32> = CausalIdeal::new();
    let cut = Cut::delivered_by(&buffer);
    assert_eq!(cut, Cut::bottom());
    assert_eq!(cut.as_vector(), buffer.delivered());
}

#[test]
fn test_common_of_reads_the_purview_floor() {
    let mut view = Purview::new([1u32, 2]);
    let mut evidence = DotSet::new();
    assert!(evidence.insert(dot(1, 1)));
    assert!(evidence.insert(dot(1, 2)));
    view.note(&Received::trust(1, evidence.clone())).unwrap();
    view.note(&Received::trust(2, evidence)).unwrap();

    let cut = Cut::common_of(&view);
    assert_eq!(cut.as_vector(), &vv(&[(1, 2)]));
    assert_eq!(cut.as_vector(), &view.common_floor());
}