extern crate alloc;
use alloc::string::String;
use super::page::{BlockDot, Page};
use super::render::Rendered;
use super::{PARAGRAPH, TABLE, gossip_fields, gossip_order, gossip_page, gossip_para};
fn type_run(page: &mut Page, block: BlockDot, text: &str) -> Option<crate::metis::Dot> {
let mut after = None;
for ch in text.chars() {
after = Some(page.type_into(block, ch, after));
}
after
}
#[test]
fn test_two_writers_converge_at_block_shape() {
let mut a = Page::new(1);
let mut b = Page::new(2);
let para = a.create_block(PARAGRAPH, "intro", None);
let _ = type_run(&mut a, para, "hi");
let table = b.create_block(TABLE, "data", None);
b.set_cell(table, 1, "x1");
b.set_cell(table, 2, "x2");
gossip_page(&a, &mut b);
gossip_page(&b, &mut a);
gossip_page(&a, &mut b);
assert_eq!(a.block_order(), b.block_order());
assert_eq!(a.render(), b.render());
assert_eq!(a.anomalous_blocks(), 0, "a quiesced page renders whole");
assert_eq!(a.para_text(para), "hi");
assert_eq!(a.titles(para), ["intro"]);
assert_eq!(a.table_rows(table), 2);
assert_eq!(a.cell(table, 1), ["x1"]);
}
#[test]
fn test_order_ahead_of_content_is_a_classified_ghost() {
let mut writer = Page::new(1);
let mut receiver = Page::new(2);
let block = writer.create_block(PARAGRAPH, "intro", None);
let _ = type_run(&mut writer, block, "hi");
gossip_order(&writer, &mut receiver);
assert_eq!(
receiver.render(),
[Rendered::Ghost { block }],
"order without fields is a ghost, classified rather than fabricated"
);
assert_eq!(receiver.anomalous_blocks(), 1);
gossip_fields(&writer, &mut receiver);
assert_eq!(
receiver.render(),
[Rendered::KindPending { block }],
"fields without the kind's content pair still withhold the render"
);
assert_eq!(receiver.anomalous_blocks(), 1);
gossip_para(&writer, &mut receiver);
assert_eq!(
receiver.render(),
[Rendered::Paragraph {
block,
text: String::from("hi"),
}],
"the conjunction closes when the last pair arrives"
);
assert_eq!(receiver.anomalous_blocks(), 0);
}
#[test]
fn test_content_ahead_of_order_is_silent() {
let mut writer = Page::new(1);
let mut receiver = Page::new(2);
let block = writer.create_block(PARAGRAPH, "intro", None);
let _ = type_run(&mut writer, block, "hi");
gossip_fields(&writer, &mut receiver);
gossip_para(&writer, &mut receiver);
assert!(receiver.render().is_empty(), "no order, no render at all");
assert_eq!(receiver.anomalous_blocks(), 0);
assert!(
receiver.fields_present(block) && receiver.para_present(block),
"the orphan state is held and queryable, just never rendered"
);
gossip_order(&writer, &mut receiver);
assert_eq!(
receiver.render(),
[Rendered::Paragraph {
block,
text: String::from("hi"),
}]
);
assert_eq!(receiver.anomalous_blocks(), 0);
}
#[test]
fn test_empty_block_is_ambiguous_with_undelivered_content() {
let mut writer = Page::new(1);
let mut receiver = Page::new(2);
let block = writer.create_block(PARAGRAPH, "empty", None);
assert_eq!(
writer.anomalous_blocks(),
1,
"even the writer's own conjunction read cannot say 'empty'"
);
gossip_page(&writer, &mut receiver);
assert_eq!(
receiver.render(),
[Rendered::KindPending { block }],
"a fully delivered empty block is indistinguishable from an undelivered one"
);
let _ = writer.type_into(block, 'h', None);
gossip_para(&writer, &mut receiver);
assert_eq!(
receiver.render(),
[Rendered::Paragraph {
block,
text: String::from("h"),
}]
);
assert_eq!(receiver.anomalous_blocks(), 0);
}