extern crate alloc;
use alloc::vec::Vec;
use super::page::Page;
use super::render::Rendered;
use super::{PARAGRAPH, TABLE, gossip_fields, gossip_page, gossip_para, gossip_table};
#[test]
fn test_concurrent_kinds_surface_as_siblings_in_both_maps() {
let mut a = Page::new(1);
let mut b = Page::new(2);
let block = a.create_block(PARAGRAPH, "draft", None);
gossip_page(&a, &mut b);
assert_eq!(b.kinds(block), [PARAGRAPH]);
a.set_kind(block, PARAGRAPH);
let _ = a.type_into(block, 'h', None);
b.set_kind(block, TABLE);
b.set_cell(block, 1, "x1");
gossip_page(&a, &mut b);
gossip_page(&b, &mut a);
gossip_page(&a, &mut b);
let kinds: Vec<&str> = a.kinds(block);
assert_eq!(
kinds,
[PARAGRAPH, TABLE],
"concurrent kind writes are siblings, ascending by dot"
);
assert_eq!(
a.render(),
[Rendered::MultiKind { block, kinds }],
"the conflict renders surfaced, never resolved"
);
assert_eq!(a.render(), b.render());
assert!(
a.para_present(block) && a.table_present(block),
"both kind maps hold the block: the read must consult every map, \
the key-space duplication cost on the record"
);
}
#[test]
fn test_kind_reassignment_leaves_the_stale_subtree_readable() {
let mut writer = Page::new(1);
let mut peer = Page::new(2);
let block = writer.create_block(PARAGRAPH, "draft", None);
let first = writer.type_into(block, 'h', None);
let _ = writer.type_into(block, 'i', Some(first));
gossip_page(&writer, &mut peer);
assert_eq!(peer.para_text(block), "hi");
writer.set_kind(block, TABLE);
writer.set_cell(block, 1, "x1");
writer.retract_para_content(block);
gossip_fields(&writer, &mut peer);
gossip_table(&writer, &mut peer);
assert_eq!(
peer.render(),
[Rendered::Table { block, rows: 1 }],
"the kind-driven conjunction render never shows the stale paragraph"
);
assert_eq!(
peer.para_text(block),
"hi",
"but the superseded kind's subtree is still held and readable: \
no canonical drop exists across pairs, the stage-B exhibit"
);
gossip_para(&writer, &mut peer);
assert_eq!(peer.para_text(block), "");
assert_eq!(peer.para_visible_len(block), 0);
assert!(
peer.para_present(block),
"the tombstoned sequence keeps the key alive after the retract"
);
assert_eq!(peer.para_skeleton_len(block), 2);
}