extern crate alloc;
use alloc::string::String;
use super::page::Page;
use super::render::Rendered;
use super::{PARAGRAPH, gossip_page};
#[test]
fn test_move_by_reinsert_forks_identity_and_loses_the_concurrent_edit() {
let mut mover = Page::new(1);
let mut editor = Page::new(2);
let original = mover.create_block(PARAGRAPH, "draft", None);
let char_a = mover.type_into(original, 'a', None);
let char_b = mover.type_into(original, 'b', Some(char_a));
gossip_page(&mover, &mut editor);
assert_eq!(editor.para_text(original), "ab");
mover.delete_block_order_only(original);
let reinserted = mover.create_block(PARAGRAPH, "draft", None);
let copy_a = mover.type_into(reinserted, 'a', None);
let _ = mover.type_into(reinserted, 'b', Some(copy_a));
mover.retract_para_content(original);
let _ = editor.type_into(original, 'c', Some(char_b));
assert_eq!(editor.para_text(original), "abc");
gossip_page(&mover, &mut editor);
gossip_page(&editor, &mut mover);
gossip_page(&mover, &mut editor);
assert_eq!(mover.render(), editor.render(), "the replicas agree");
assert_eq!(
mover.render(),
[Rendered::Paragraph {
block: reinserted,
text: String::from("ab"),
}],
"the moved copy renders WITHOUT the concurrent edit: 'ab', never 'abc'"
);
assert!(
!mover.block_order().contains(&original),
"the original identity is order-tombstoned"
);
assert_eq!(
mover.para_text(original),
"c",
"the edit lives under the dead identity ('a' and 'b' were retracted, \
the concurrent 'c' survived the observed remove), unreachable by render"
);
let lost_edits = mover.para_visible_len(original);
assert_eq!(lost_edits, 1, "the exhibit's number: one edit forked away");
}