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]);
+ }
+}