use super::super::super::support::dot;
use crate::metis::{Composer, Dot, DotSet, DotStore};
use super::dots;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
struct LyingStore {
hidden: Option<Dot>,
}
impl DotStore for LyingStore {
fn dots(&self) -> impl Iterator<Item = Dot> + '_ {
core::iter::empty()
}
fn is_bottom(&self) -> bool {
self.hidden.is_none()
}
fn causal_merge(&self, _self_context: &DotSet, other: &Self, _other_context: &DotSet) -> Self {
if self.hidden.is_some() {
self.clone()
} else {
other.clone()
}
}
fn restrict(&self, _roster: impl IntoIterator<Item = u32>) -> Self {
self.clone()
}
fn novel_to(&self, _context: &DotSet) -> Self {
self.clone()
}
}
#[test]
fn test_compose_over_a_lying_store_rides_the_lie_through() {
let mut composer: Composer<LyingStore> = Composer::new(1);
let superseded = dots(&[(1, 5)]);
let carried = superseded.clone();
let (_, delta) = composer.compose(move |assigned| {
(
LyingStore {
hidden: Some(assigned),
},
carried,
)
});
assert!(!delta.store().is_bottom());
assert_eq!(delta.store().hidden, Some(dot(1, 1)));
assert_eq!(delta.context(), &superseded);
assert!(!delta.context().contains(dot(1, 1)));
}