minerva 0.2.0

Causal ordering for distributed systems
use super::super::super::support::dot;
use crate::metis::Composer;

use super::{Doc, add_under};

#[test]
fn test_absorb_learns_a_peers_delta() {
    let mut writer: Composer<Doc> = Composer::new(1);
    let (_, delta) = writer.compose(add_under(7));
    let mut reader: Composer<Doc> = Composer::new(2);
    let _ = reader.absorb(1, &delta);
    assert!(
        reader
            .state()
            .store()
            .get(&7)
            .is_some_and(|held| held.contains(dot(1, 1)))
    );
    assert_eq!(reader.state().next_dot(2), dot(2, 1));
}

#[test]
fn test_adopt_round_trips_and_continues_fresh() {
    let mut composer: Composer<Doc> = Composer::new(1);
    let _ = composer.compose(add_under(7));
    let _ = composer.compose(add_under(9));
    let persisted = composer.state().clone();
    let resumed: Composer<Doc> = Composer::adopt(1, persisted.clone());
    assert_eq!(resumed.state(), &persisted);
    assert_eq!(resumed.station(), 1);
    assert_eq!(resumed.state().next_dot(1), dot(1, 3));
    let mut resumed = resumed;
    let (_, after) = resumed.compose(add_under(7));
    assert!(
        after
            .store()
            .get(&7)
            .is_some_and(|held| held.contains(dot(1, 3)))
    );
}