extern crate alloc;
use super::super::{Seq, clock, delete, insert};
use crate::metis::{Dot, DotStore, Rhapsody};
use alloc::vec::Vec;
#[test]
fn test_deletion_keeps_order() {
let mut r = Seq::new();
let clk = clock(1);
let d0 = insert(&mut r, &clk, 1, None);
let d1 = insert(&mut r, &clk, 1, Some(d0));
let d2 = insert(&mut r, &clk, 1, Some(d1));
let d3 = insert(&mut r, &clk, 1, Some(d2));
assert_eq!(r.store().order(), [d0, d1, d2, d3]);
let stale = r.clone();
delete(&mut r, d1);
assert_eq!(r.store().order(), [d0, d2, d3]);
assert!(r.store().locus(d1).is_some());
assert_eq!(r.store().skeleton_len(), 4);
let rejoined = r.merge(&stale);
assert_eq!(rejoined.store().order(), [d0, d2, d3]);
assert!(!rejoined.store().is_visible(d1));
assert_eq!(rejoined.store().order(), stale.merge(&r).store().order());
}
#[test]
fn test_is_bottom_distinguishes_empty_from_fully_deleted() {
let empty = Rhapsody::new();
assert!(empty.is_bottom());
let mut r = Seq::new();
let clk = clock(1);
let d0 = insert(&mut r, &clk, 1, None);
delete(&mut r, d0);
assert_eq!(r.store().visible_len(), 0);
assert_eq!(r.store().skeleton_len(), 1);
assert!(!r.store().is_bottom());
}
#[test]
fn test_dots_are_the_visible_only() {
let mut r = Seq::new();
let clk = clock(1);
let d0 = insert(&mut r, &clk, 1, None);
let d1 = insert(&mut r, &clk, 1, Some(d0));
delete(&mut r, d0);
let support: Vec<Dot> = r.store().dots().collect();
assert_eq!(support, [d1]);
}