minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use super::{Doc, dots, seen};
use crate::metis::{DotSet, Purview, UnknownStation};
use alloc::vec::Vec;

#[test]
fn test_rows_start_at_bottom() {
    let purview = Purview::new([1, 2, 3]);
    for peer in [1, 2, 3] {
        assert_eq!(purview.of(peer), Some(&DotSet::new()));
    }
    assert_eq!(purview.common(), DotSet::new());
}

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

    assert_eq!(purview.of(1), Some(&dots(&[(3, 1), (3, 2), (4, 1)])));
    assert_eq!(purview.of(2), Some(&DotSet::new()));
}

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

    purview.note(&seen(1, &[(1, 1)])).unwrap();
    assert_eq!(purview, before);
}

#[test]
fn test_unknown_peer_note_is_refused_unchanged() {
    let mut purview = Purview::new([1, 2]);
    purview.note(&seen(1, &[(1, 1)])).unwrap();
    let before = purview.clone();

    let refused = purview.note(&seen(9, &[(1, 5)]));
    assert_eq!(refused, Err(UnknownStation { station: 9 }));
    assert_eq!(purview, before);
}

#[test]
fn test_of_and_owed_are_none_off_roster() {
    let purview = Purview::new([1, 2]);
    let state = Doc::new();

    assert_eq!(purview.of(9), None);
    assert!(purview.owed(&state, 9).is_none());
}

#[test]
fn test_roster_is_ascending_and_deduplicated() {
    let purview = Purview::new([3, 1, 2, 1, 3]);
    let roster: Vec<u32> = purview.roster().collect();
    assert_eq!(roster, alloc::vec![1, 2, 3]);
}