diff --git a/tests/LexerRules/FrontMatterRuleTest.php b/tests/LexerRules/FrontMatterRuleTest.php index 445c68d..97a6a8f 100644 --- a/tests/LexerRules/FrontMatterRuleTest.php +++ b/tests/LexerRules/FrontMatterRuleTest.php @@ -49,6 +49,22 @@ public function test_lex_with_longer_frontmatter_lines(): void $this->assertEquals(new ParagraphToken('Bar'), $tokens[1]); } + #[Test] + public function scalar_frontmatter_is_normalized_to_empty_data(): void + { + $tokens = new Lexer([new FrontMatterRule(), new NewLineRule(), new ParagraphRule()])->lex(<<<'MD' + --- + just text + --- + + Body + MD); + + $this->assertCount(2, $tokens); + $this->assertEquals(new FrontMatterToken([]), $tokens[0]); + $this->assertEquals(new ParagraphToken('Body'), $tokens[1]); + } + #[Test] public function test_complex_frontmatter(): void { diff --git a/tests/LexerRules/HtmlRuleTest.php b/tests/LexerRules/HtmlRuleTest.php index afd993c..fec1110 100644 --- a/tests/LexerRules/HtmlRuleTest.php +++ b/tests/LexerRules/HtmlRuleTest.php @@ -10,6 +10,7 @@ use Tempest\Markdown\LexerRules\ParagraphRule; use Tempest\Markdown\LexerRules\TextRule; use Tempest\Markdown\Tokens\HtmlToken; +use Tempest\Markdown\Tokens\ParagraphToken; class HtmlRuleTest extends TestCase { @@ -55,4 +56,14 @@ public function test_void_tags(): void $this->assertCount(15, $tokens); } + + #[Test] + public function test_void_tags_are_case_insensitive(): void + { + $tokens = new Lexer([new HtmlRule(), new NewLineRule(), new ParagraphRule()])->lex("
\nHello"); + + $this->assertCount(3, $tokens); + $this->assertEquals(new HtmlToken('
'), $tokens[0]); + $this->assertEquals(new ParagraphToken('Hello'), $tokens[2]); + } } diff --git a/tests/LexerRules/ListRuleTest.php b/tests/LexerRules/ListRuleTest.php index a34fb3c..f08ad3a 100644 --- a/tests/LexerRules/ListRuleTest.php +++ b/tests/LexerRules/ListRuleTest.php @@ -6,8 +6,10 @@ use PHPUnit\Framework\TestCase; use Tempest\Markdown\Lexer; use Tempest\Markdown\LexerRules\ListRule; +use Tempest\Markdown\LexerRules\TextRule; use Tempest\Markdown\Tokens\ListItem; use Tempest\Markdown\Tokens\ListToken; +use Tempest\Markdown\Tokens\TextToken; class ListRuleTest extends TestCase { @@ -27,6 +29,14 @@ public function test_lex_multiple_items(): void $this->assertEquals(new ListToken([new ListItem('one'), new ListItem('two')]), $token); } + #[Test] + public function test_hyphen_without_whitespace_is_not_a_list(): void + { + $tokens = new Lexer([new ListRule(), new TextRule()])->lex('-not list'); + + $this->assertEquals(new TextToken('-not list'), $tokens[0]); + } + #[Test] public function test_lex_nested(): void { diff --git a/tests/LexerRules/OrderedListRuleTest.php b/tests/LexerRules/OrderedListRuleTest.php index 5877ff1..a396c3c 100644 --- a/tests/LexerRules/OrderedListRuleTest.php +++ b/tests/LexerRules/OrderedListRuleTest.php @@ -6,8 +6,10 @@ use PHPUnit\Framework\TestCase; use Tempest\Markdown\Lexer; use Tempest\Markdown\LexerRules\OrderedListRule; +use Tempest\Markdown\LexerRules\TextRule; use Tempest\Markdown\Tokens\ListItem; use Tempest\Markdown\Tokens\OrderedListToken; +use Tempest\Markdown\Tokens\TextToken; class OrderedListRuleTest extends TestCase { @@ -35,6 +37,14 @@ public function test_lex_multi_digit_numbers(): void $this->assertEquals(new OrderedListToken([new ListItem('ten'), new ListItem('eleven')]), $token); } + #[Test] + public function test_numeric_text_without_marker_is_not_an_ordered_list(): void + { + $tokens = new Lexer([new OrderedListRule(), new TextRule()])->lex('2026 is year'); + + $this->assertEquals(new TextToken('2026 is year'), $tokens[0]); + } + #[Test] public function test_lex_nested(): void { diff --git a/tests/LexerRules/PreRuleTest.php b/tests/LexerRules/PreRuleTest.php index 8aa7925..9aa789d 100644 --- a/tests/LexerRules/PreRuleTest.php +++ b/tests/LexerRules/PreRuleTest.php @@ -34,6 +34,14 @@ public function test_lex_without_language(): void $this->assertEquals(new PreToken(language: null, content: 'echo "hi";'), $token); } + #[Test] + public function test_lex_preserves_significant_whitespace(): void + { + $token = new Lexer([new PreRule()])->lex("```\n keep \n```")[0]; + + $this->assertEquals(new PreToken(language: null, content: ' keep '), $token); + } + #[Test] public function test_lex_with_backtick_in_content(): void { diff --git a/tests/LexerRules/TableRuleTest.php b/tests/LexerRules/TableRuleTest.php index c3818c2..47b1470 100644 --- a/tests/LexerRules/TableRuleTest.php +++ b/tests/LexerRules/TableRuleTest.php @@ -83,6 +83,20 @@ public function test_table_with_empty_cells(): void ); } + #[Test] + public function test_table_with_all_empty_cells(): void + { + $token = new Lexer([new TableRule()])->lex("| A | B |\n| --- | --- |\n| | |")[0]; + + $this->assertEquals( + new TableToken([ + new TableRow(['A', 'B'], isHeader: true), + new TableRow(['', ''], isHeader: false), + ]), + $token, + ); + } + #[Test] public function test_paragraphs_with_pipe_are_not_treated_as_tables(): void { @@ -92,4 +106,14 @@ public function test_paragraphs_with_pipe_are_not_treated_as_tables(): void $this->assertInstanceOf(ParagraphToken::class, $tokens[0]); $this->assertInstanceOf(ParagraphToken::class, $tokens[1]); } + + #[Test] + public function test_separator_cells_must_contain_hyphens(): void + { + $tokens = new Lexer([new TableRule(), new ParagraphRule()])->lex("| not | table |\n| : | : |"); + + $this->assertCount(2, $tokens); + $this->assertInstanceOf(ParagraphToken::class, $tokens[0]); + $this->assertInstanceOf(ParagraphToken::class, $tokens[1]); + } } diff --git a/tests/TokenCollectionTest.php b/tests/TokenCollectionTest.php new file mode 100644 index 0000000..49a0cc7 --- /dev/null +++ b/tests/TokenCollectionTest.php @@ -0,0 +1,22 @@ +assertSame($token, $collection[0]); + } +}