minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use alloc::string::String;
use alloc::vec::Vec;

use super::super::super::support::dot;
use crate::metis::{Dot, DotFun, DotStore};

/// `iter` and `values` walk entries ascending by dot, and `IntoIterator` for
/// `&DotFun` agrees with `iter`.
#[test]
fn test_iter_and_values_are_ascending_by_dot() {
    let mut store: DotFun<String> = DotFun::new();
    assert!(store.insert(dot(2, 1), String::from("b")));
    assert!(store.insert(dot(1, 3), String::from("a")));
    assert!(store.insert(dot(1, 1), String::from("c")));

    let via_iter: Vec<(Dot, String)> = store
        .iter()
        .map(|(entry, value)| (entry, value.clone()))
        .collect();
    assert_eq!(
        via_iter,
        [
            (dot(1, 1), String::from("c")),
            (dot(1, 3), String::from("a")),
            (dot(2, 1), String::from("b")),
        ]
    );

    let via_into: Vec<Dot> = (&store).into_iter().map(|(entry, _)| entry).collect();
    assert_eq!(via_into, [dot(1, 1), dot(1, 3), dot(2, 1)]);

    let values: Vec<String> = store.values().cloned().collect();
    assert_eq!(
        values,
        [String::from("c"), String::from("a"), String::from("b")]
    );
}

#[test]
fn test_len_and_is_empty_track_the_dots() {
    let mut store: DotFun<u8> = DotFun::new();
    assert!(store.is_empty());
    assert_eq!(store.len(), 0);
    assert!(store.insert(dot(1, 1), 7));
    assert!(!store.is_empty());
    assert_eq!(store.len(), 1);
}

#[test]
fn test_default_is_bottom() {
    let store: DotFun<String> = DotFun::default();
    assert!(store.is_bottom());
    assert!(store.is_empty());
    assert_eq!(store, DotFun::new());
    assert!(store.dots().next().is_none());
}