minerva 0.2.0

Causal ordering for distributed systems
use super::super::super::support::dot;
use crate::metis::{Dot, DotFun, DotStore};

#[test]
fn test_duplicate_dot_insert_is_refused_unchanged() {
    // A dot the store already carries is refused: content is never reassigned
    // (law 3), and the map is left unchanged (self's value stands).
    let mut store: DotFun<&str> = DotFun::new();
    assert!(store.insert(dot(1, 1), "first"));
    assert!(!store.insert(dot(1, 1), "second"));
    assert_eq!(store.get(dot(1, 1)), Some(&"first"));
    assert_eq!(store.len(), 1);
}

#[test]
fn test_dot_zero_is_not_a_dot_at_the_store_doors() {
    // Dots are 1-based, so (station, 0) names no write. The refusal now sits
    // on the type, not on `insert` and `singleton`: neither door can be
    // offered the non-dot at all (ruling R-91).
    assert!(Dot::from_parts(3, 0).is_err());
    assert!(Dot::try_from((2, 0)).is_err());
    let store: DotFun<&str> = DotFun::new();
    assert!(store.is_bottom());
    assert!(store.is_empty());
}

#[test]
fn test_singleton_builds_the_one_write_store() {
    let real: DotFun<&str> = DotFun::singleton(dot(2, 4), "yes");
    assert_eq!(real.len(), 1);
    assert_eq!(real.get(dot(2, 4)), Some(&"yes"));
}