Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions tests/LexerRules/FrontMatterRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
11 changes: 11 additions & 0 deletions tests/LexerRules/HtmlRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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("<BR>\nHello");

$this->assertCount(3, $tokens);
$this->assertEquals(new HtmlToken('<BR>'), $tokens[0]);
$this->assertEquals(new ParagraphToken('Hello'), $tokens[2]);
}
}
10 changes: 10 additions & 0 deletions tests/LexerRules/ListRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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
{
Expand Down
10 changes: 10 additions & 0 deletions tests/LexerRules/OrderedListRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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
{
Expand Down
8 changes: 8 additions & 0 deletions tests/LexerRules/PreRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
24 changes: 24 additions & 0 deletions tests/LexerRules/TableRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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]);
}
}
22 changes: 22 additions & 0 deletions tests/TokenCollectionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Tempest\Markdown\Tests;

use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
use Tempest\Markdown\TokenCollection;
use Tempest\Markdown\Tokens\TextToken;

final class TokenCollectionTest extends TestCase
{
#[Test]
public function test_array_access_append_uses_next_numeric_index(): void
{
$collection = new TokenCollection();
$token = new TextToken('x');

$collection[] = $token;

$this->assertSame($token, $collection[0]);
}
}
Loading