use crate::metis::{Dotted, Kind, KindPlurality, NodeContent};
use super::super::{Author, TestNode};
use super::{add, page_with, seq_block, sync, tag_block};
fn rekind(author: &mut Author, key: u8, kind: Kind) -> Dotted<TestNode> {
let (_, delta) = author.compose_super(
|dot| page_with(key, tag_block(dot, kind)),
|held| {
held.children()
.get(&key)
.map(TestNode::observed)
.unwrap_or_default()
},
);
delta
}
#[test]
fn test_a_kind_reassignment_is_one_covered_delta_with_no_window() {
let mut writer = Author::new(1);
let mut peer = Author::new(2);
let _ = add(&mut writer, |dot| {
page_with(7, tag_block(dot, Kind::Sequence))
});
let _ = add(&mut writer, |dot| page_with(7, seq_block(dot, 1)));
let _ = add(&mut writer, |dot| page_with(7, seq_block(dot, 2)));
sync(&writer, &mut peer);
let before = peer.state().store().children().get(&7).expect("alive");
assert!(matches!(
before.sole(),
Ok(Some(NodeContent::Sequence(seq))) if seq.visible_len() == 2
));
let delta = rekind(&mut writer, 7, Kind::Register);
let _ = peer.absorb(1, &delta);
let block = peer.state().store().children().get(&7).expect("alive");
let kinds = block.kinds_present();
assert_eq!(kinds.len(), 1, "no stale evidence survives the one delta");
assert!(kinds.contains(Kind::Register));
assert!(matches!(
block.sole(),
Ok(Some(NodeContent::Register(reg))) if reg.is_empty()
));
assert_eq!(block.sequence().visible_len(), 0);
assert_eq!(block.sequence().skeleton_len(), 2);
assert_eq!(writer.state(), peer.state(), "converged on the one delta");
}
#[test]
fn test_a_concurrent_edit_survives_a_reassignment_and_surfaces() {
let mut writer = Author::new(1);
let mut editor = Author::new(2);
let _ = add(&mut writer, |dot| {
page_with(7, tag_block(dot, Kind::Sequence))
});
let _ = add(&mut writer, |dot| page_with(7, seq_block(dot, 1)));
sync(&writer, &mut editor);
let _ = add(&mut editor, |dot| page_with(7, seq_block(dot, 2)));
let rekind_delta = rekind(&mut writer, 7, Kind::Register);
let _ = editor.absorb(1, &rekind_delta);
sync(&editor, &mut writer);
assert_eq!(writer.state(), editor.state(), "converged");
let block = writer.state().store().children().get(&7).expect("alive");
let kinds = block.kinds_present();
assert_eq!(
kinds.len(),
2,
"the unobserved concurrent edit survives and is surfaced"
);
assert!(kinds.contains(Kind::Register) && kinds.contains(Kind::Sequence));
assert!(matches!(block.sole(), Err(KindPlurality { .. })));
assert_eq!(
block.sequence().visible_len(),
1,
"exactly the edit the writer never saw; the observed content is gone"
);
let settle = rekind(&mut writer, 7, Kind::Register);
let _ = editor.absorb(1, &settle);
let block = editor.state().store().children().get(&7).expect("alive");
assert_eq!(block.kinds_present().len(), 1);
assert!(matches!(
block.sole(),
Ok(Some(NodeContent::Register(reg))) if reg.is_empty()
));
}
#[test]
fn test_anti_entropy_heals_a_rekind_that_outran_the_content() {
let mut writer = Author::new(1);
let mut editor = Author::new(2);
let mut peer = Author::new(3);
let _ = add(&mut writer, |dot| {
page_with(7, tag_block(dot, Kind::Sequence))
});
let (d, _) =
writer.compose(|dot| (page_with(7, seq_block(dot, 1)), crate::metis::DotSet::new()));
sync(&writer, &mut editor);
let _ = add(&mut editor, |dot| {
let mut block = TestNode::new();
assert!(block.weave(
dot,
crate::metis::Locus {
anchor: crate::metis::Anchor::After(d.into()),
rank: super::super::rank(9),
}
));
page_with(7, block)
});
let rekind_delta = rekind(&mut writer, 7, Kind::Register);
sync(&editor, &mut writer);
sync(&writer, &mut editor);
let _ = peer.absorb(1, &rekind_delta);
let owed = writer.owed_to(peer.state().context());
let _ = peer.absorb(1, &owed);
assert_eq!(writer.state(), peer.state(), "healed whole");
let at_writer = writer.state().store().children().get(&7).expect("alive");
let at_peer = peer.state().store().children().get(&7).expect("alive");
assert_eq!(
at_writer.sequence().order(),
at_peer.sequence().order(),
"the surviving concurrent element is placed identically"
);
assert_eq!(at_writer.kinds_present(), at_peer.kinds_present());
}