From 31db91a631b048ad95f7774d6cc37f2b077bea4a Mon Sep 17 00:00:00 2001 From: jutty Date: Mon, 16 Feb 2026 13:36:48 -0300 Subject: [PATCH] Add table context handling tests --- src/syntax/content/parser/context/table.rs | 330 ++++++++++++++++++++- 1 file changed, 328 insertions(+), 2 deletions(-) diff --git a/src/syntax/content/parser/context/table.rs b/src/syntax/content/parser/context/table.rs index a4c3f8e..357f599 100644 --- a/src/syntax/content/parser/context/table.rs +++ b/src/syntax/content/parser/context/table.rs @@ -63,7 +63,6 @@ pub fn parse( log!(VERBOSE, "Adding row: found newline on {lexeme}"); if !buffer.cell.is_empty() { - if buffer.in_header { log!(VERBOSE, "Adding unterminated header: {lexeme}"); candidate.add_header(&parse_text(&buffer.cell)); @@ -86,7 +85,6 @@ pub fn parse( buffer.in_header = false; buffer.in_cell = false; candidate.add_row(vec![]); - } else if lexeme.match_char_triple(' ', '!', ' ') { buffer.in_header = true; if !buffer.cell.trim().is_empty() { @@ -116,3 +114,331 @@ pub fn parse( } true } + +#[cfg(test)] +mod tests { + use crate::{syntax::content::parser, graph::Graph}; + + fn read(input: &str) -> String { + parser::read(input, &Graph::default()) + } + + fn read_loaded(input: &str) -> String { + parser::read(input, &Graph::load()) + } + + #[test] + fn single_row() { + assert_eq!( + read(concat!("%", "\n", "a | b | c", "\n", "%", "\n")), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
", "\n", + ) + ); + } + + #[test] + fn two_rows() { + assert_eq!( + read(concat!( + "%", "\n", + "a | b | c", "\n", + "d | e | f", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
", "\n", + ) + ); + } + + #[test] + fn three_rows() { + assert_eq!( + read(concat!( + "%", "\n", + "a | b | c", "\n", + "d | e | f", "\n", + "g | h | i", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
ghi
", "\n", + ) + ); + } + + #[test] + fn with_header() { + assert_eq!( + read(concat!( + "%", "\n", + "hA ! hB ! hC", "\n", + "a | b | c", "\n", + "d | e | f", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
hAhBhC
abc
def
", "\n", + ) + ); + } + + #[test] + fn with_anchor() { + assert_eq!( + read(concat!( + "%", "\n", + "a | |Node| | c", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + r#" "#, "\n", + " ", "\n", + " ", "\n", + "
aNodec
", "\n", + )); + } + + #[test] + fn with_loaded_anchor() { + assert_eq!( + read_loaded(concat!( + "%", "\n", + "a | |Node| | c", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + r#" "#, "\n", + " ", "\n", + " ", "\n", + "
aNodec
", "\n", + )); + } + + #[test] + fn no_leading_delimiters() { + assert_eq!( + read_loaded(concat!( + "%", "\n", + "a ! b ! c !", "\n", + "d | e | f |", "\n", + "g | h | i |", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
ghi
", "\n", + ) + ); + } + + #[test] + fn no_trailing_delimiters() { + assert_eq!( + read_loaded(concat!( + "%", "\n", + " ! a ! b ! c", "\n", + " | d | e | f", "\n", + " | g | h | i", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
ghi
", "\n", + ) + ); + } + + #[test] + fn with_leading_and_trailing_delimiters() { + assert_eq!( + read_loaded(concat!( + "%", "\n", + " ! a ! b ! c !", "\n", + " | d | e | f |", "\n", + " | g | h | i |", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
ghi
", "\n", + ) + ); + } + + #[test] + fn no_flanking_delimiters() { + assert_eq!( + read_loaded(concat!( + "%", "\n", + "a ! b ! c", "\n", + "d | e | f", "\n", + "g | h | i", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
ghi
", "\n", + ) + ); + } + + #[test] + fn with_indent() { + assert_eq!( + read_loaded(concat!( + "%", "\n", + " ! a ! b ! c !", "\n", + " | d | e | f |", "\n", + " | g | h | i |", "\n", + "%", "\n", + )), + concat!( + "\n", + "", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + " ", "\n", + "
abc
def
ghi
", "\n", + ) + ); + } +}