minerva 0.2.0

Causal ordering for distributed systems
use super::super::super::support::dot;
use super::{Doc, dots, seen, write};
use crate::metis::{DotStore, Purview};

#[test]
fn test_owed_is_delta_for_against_the_row() {
    let mut state = Doc::new();
    write(&mut state, 1, 7);
    write(&mut state, 1, 7);

    let mut purview = Purview::new([1]);
    purview.note(&seen(1, &[(1, 1)])).unwrap();
    let owed = purview.owed(&state, 1).unwrap();
    let expected = state.delta_for(&dots(&[(1, 1)]));

    assert_eq!(owed, expected);
    assert!(owed.store().dots().any(|d| d == dot(1, 2)));
    assert!(!owed.store().dots().any(|d| d == dot(1, 1)));
}

#[test]
fn test_under_claimed_row_over_ships_but_still_converges() {
    let mut state = Doc::new();
    write(&mut state, 1, 7);
    write(&mut state, 1, 7);

    let peer_true = Doc::new().merge(&state);
    let mut purview = Purview::new([1]);
    purview.note(&seen(1, &[(1, 1)])).unwrap();

    let owed = purview.owed(&state, 1).unwrap();
    assert_eq!(peer_true.merge(&owed), peer_true.merge(&state));
}

#[test]
fn test_over_claimed_evidence_via_trust_under_ships() {
    let mut state = Doc::new();
    write(&mut state, 1, 7);
    write(&mut state, 1, 7);

    let peer_true = Doc::new();
    let mut purview = Purview::new([1]);
    purview.note(&seen(1, &[(1, 1), (1, 2)])).unwrap();

    let owed = purview.owed(&state, 1).unwrap();
    let via_owed = peer_true.merge(&owed);
    let via_full = peer_true.merge(&state);

    assert_ne!(via_owed, via_full);
    assert!(via_owed.store().get(&7).is_none());
    assert!(via_full.store().get(&7).is_some());
}