extern crate alloc;
use alloc::vec;
use alloc::vec::Vec;
use core::num::NonZeroUsize;
use crate::kairos::Kairos;
use crate::metis::tests::support::dot as d;
use crate::metis::{Anchor, Dot, DotSet, Dotted, Locus, Metatheses, Metathesis, Rhapsody};
use super::super::Note;
use super::super::replica::{Decline, Replica};
use crate::metis::dot::RawDot;
type Text = Dotted<Rhapsody>;
type Moves = Dotted<Metatheses>;
fn rank(physical: u64) -> Kairos {
Kairos::new(physical, 0, 1, 0u16)
}
fn weave(text: &mut Text, dot: Dot, anchor: Anchor, physical: u64) {
let mut delta = Rhapsody::new();
assert!(delta.weave(
dot,
Locus {
anchor,
rank: rank(physical),
}
));
text.merge_from(&Dotted::from_store(delta));
}
#[test]
fn an_undotted_retraction_cannot_be_classified_at_the_boundary() {
let mut sealed = Text::new();
weave(&mut sealed, d(1, 1), Anchor::Origin, 3);
weave(&mut sealed, d(1, 2), Anchor::Origin, 2);
weave(&mut sealed, d(1, 3), Anchor::Origin, 1);
let mut retract = DotSet::new();
let _ = retract.insert(d(1, 2));
let retract = Dotted::<Rhapsody>::from_context(retract);
let stratum_without = sealed.clone();
let mut stratum_with = sealed;
stratum_with.merge_from(&retract);
let moves = Metatheses::new();
let map_without = stratum_without
.store()
.refound(&moves)
.expect("a complete stratum folds")
.map()
.clone();
let map_with = stratum_with
.store()
.refound(&moves)
.expect("a complete stratum folds")
.map()
.clone();
assert_eq!(map_without.translate(d(1, 3)), Some(d(1, 3)));
assert_eq!(map_with.translate(d(1, 3)), Some(d(1, 2)));
assert_eq!(map_without.translate(d(1, 2)), Some(d(1, 2)));
assert_eq!(
map_with.translate(d(1, 2)),
None,
"the replica that folded the retract swept the identity"
);
}
#[test]
fn a_witnessed_cut_can_still_refuse_the_stratum() {
const ROSTER: [u32; 3] = [1, 2, 3];
let depth = NonZeroUsize::new(2).expect("positive");
let mut one = Replica::new(1, &ROSTER, depth);
let mut two = Replica::new(2, &ROSTER, depth);
let mut three = Replica::new(3, &ROSTER, depth);
let mut outbox_one = Vec::new();
let _ = one.insert_visible(0, &mut outbox_one);
let _ = one.insert_visible(0, &mut outbox_one);
let mut weaves = outbox_one
.iter()
.filter(|note| matches!(note, Note::Old { .. }))
.cloned();
let first_weave = weaves.next().expect("first weave note");
let second_weave = weaves.next().expect("second weave note");
let mut relay = Vec::new();
two.handle(&first_weave, &mut relay);
two.handle(&second_weave, &mut relay);
let mut outbox_two = Vec::new();
let deleted = two.delete_visible(0, &mut outbox_two);
assert_eq!(deleted, Some(d(1, 2)), "station 2 deletes the second weave");
let mut deliveries: Vec<Note> = Vec::new();
deliveries.push(first_weave);
deliveries.extend(
outbox_one
.iter()
.filter(|note| matches!(note, Note::Report { .. }))
.cloned(),
);
deliveries.extend(relay);
deliveries.extend(outbox_two);
let mut round = deliveries;
while !round.is_empty() {
let mut next = Vec::new();
for note in &round {
for replica in [&mut one, &mut two, &mut three] {
let mut out = Vec::new();
replica.handle(note, &mut out);
next.extend(out);
}
}
round = next;
}
assert_eq!(
one.try_declare(&mut Vec::new()),
Err(Decline::NotSelfSupporting { dot: d(1, 2) }),
"the rebuilt stratum would carry above-cut context"
);
assert_eq!(one.epochs().candidates().count(), 0, "no window opened");
let mut flood = vec![second_weave];
while let Some(note) = flood.pop() {
for replica in [&mut one, &mut two, &mut three] {
let mut out = Vec::new();
replica.handle(¬e, &mut out);
flood.extend(out);
}
}
assert!(
one.try_declare(&mut Vec::new()).is_ok(),
"the risen watermark is self-supporting"
);
}
#[test]
fn the_have_set_counts_events_never_context_spillover() {
const ROSTER: [u32; 3] = [1, 2, 3];
let depth = NonZeroUsize::new(2).expect("positive");
let mut one = Replica::new(1, &ROSTER, depth);
let mut two = Replica::new(2, &ROSTER, depth);
let mut three = Replica::new(3, &ROSTER, depth);
let mut outbox_one = Vec::new();
let _ = one.insert_visible(0, &mut outbox_one);
let _ = one.insert_visible(0, &mut outbox_one);
let _ = one.insert_visible(1, &mut outbox_one);
let mut weaves = outbox_one
.iter()
.filter(|note| matches!(note, Note::Old { .. }))
.cloned();
let first_weave = weaves.next().expect("first weave note");
let second_weave = weaves.next().expect("second weave note");
let third_weave = weaves.next().expect("third weave note");
let mut relay = Vec::new();
two.handle(&first_weave, &mut relay);
two.handle(&second_weave, &mut relay);
two.handle(&third_weave, &mut relay);
let mut outbox_two = Vec::new();
let deleted = two.delete_visible(0, &mut outbox_two);
assert_eq!(deleted, Some(d(1, 2)), "station 2 deletes the second weave");
let mut round: Vec<Note> = Vec::new();
round.push(first_weave);
round.push(third_weave);
round.extend(
outbox_one
.iter()
.filter(|note| matches!(note, Note::Report { .. }))
.cloned(),
);
round.extend(relay);
round.extend(outbox_two);
while !round.is_empty() {
let mut next = Vec::new();
for note in &round {
for replica in [&mut one, &mut two, &mut three] {
let mut out = Vec::new();
replica.handle(note, &mut out);
next.extend(out);
}
}
round = next;
}
assert_eq!(
one.try_declare(&mut Vec::new()),
Err(Decline::NotSelfSupporting { dot: d(1, 2) }),
"a context-only sighting must not raise the watermark"
);
let mut flood = vec![second_weave];
while let Some(note) = flood.pop() {
for replica in [&mut one, &mut two, &mut three] {
let mut out = Vec::new();
replica.handle(¬e, &mut out);
flood.extend(out);
}
}
let mut declare_out = Vec::new();
let _ = one
.try_declare(&mut declare_out)
.expect("the risen watermark is self-supporting");
let mut round = declare_out;
while !round.is_empty() {
let mut next = Vec::new();
for note in &round {
for replica in [&mut one, &mut two, &mut three] {
let mut out = Vec::new();
replica.handle(note, &mut out);
next.extend(out);
}
}
round = next;
}
for replica in [&one, &two, &three] {
assert_eq!(
replica.generation(),
2,
"replica {} sealed the boundary",
replica.id()
);
}
assert_eq!(one.seals, two.seals);
assert_eq!(one.seals, three.seals);
assert_eq!(one.text(), two.text());
assert_eq!(one.text(), three.text());
assert_eq!(one.effective_order(), two.effective_order());
assert_eq!(one.effective_order(), three.effective_order());
}
#[test]
fn an_undotted_testimony_retirement_cannot_be_classified_at_the_boundary() {
let mut sealed = Text::new();
weave(&mut sealed, d(1, 1), Anchor::Origin, 2);
weave(&mut sealed, d(1, 2), Anchor::Origin, 1);
let testimony = Dotted::from_store(Metatheses::singleton(
d(2, 1),
Metathesis {
target: RawDot::new(1, 1),
to: Locus {
anchor: Anchor::After(RawDot {
station: 1,
counter: 2,
}),
rank: rank(3),
},
},
));
let mut moves_without = Moves::new();
moves_without.merge_from(&testimony);
let mut retract = DotSet::new();
let _ = retract.insert(d(2, 1));
let retract = Dotted::<Metatheses>::from_context(retract);
let mut moves_with = moves_without.clone();
moves_with.merge_from(&retract);
assert_eq!(moves_without.context(), moves_with.context());
let baked_moved = sealed
.store()
.refound(moves_without.store())
.expect("a complete stratum folds");
let baked_unmoved = sealed
.store()
.refound(moves_with.store())
.expect("a complete stratum folds");
assert_eq!(baked_moved.map().translate(d(1, 1)), Some(d(1, 2)));
assert_eq!(baked_unmoved.map().translate(d(1, 1)), Some(d(1, 1)));
assert_eq!(baked_moved.map().translate(d(1, 2)), Some(d(1, 1)));
assert_eq!(baked_unmoved.map().translate(d(1, 2)), Some(d(1, 2)));
}