Skip to content

Commit

Permalink
Merge pull request #1342 from hydephp/add-more-unit-tests-for-sidebar…
Browse files Browse the repository at this point in the history
…-table-of-contents-generator

Improve and add more unit tests for the sidebar table of contents generator
  • Loading branch information
caendesilva authored Mar 22, 2023
2 parents f5b75bc + 8400b44 commit e0b289e
Showing 1 changed file with 167 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

/** @noinspection HtmlUnknownAnchorTarget */

declare(strict_types=1);

namespace Hyde\Framework\Testing\Feature\Actions;
Expand Down Expand Up @@ -30,11 +32,172 @@ public function testCanGenerateTableOfContents()

public function testReturnStringContainsExpectedContent()
{
$markdown = "# Level 1\n## Level 2\n### Level 3\n";
$result = (new GeneratesTableOfContents($markdown))->execute();
$markdown = <<<'MARKDOWN'
# Level 1
## Level 2
### Level 3
MARKDOWN;

$this->assertSameIgnoringIndentation(<<<'HTML'
<ul class="table-of-contents">
<li>
<a href="#level-2">Level 2</a>
<ul>
<li>
<a href="#level-3">Level 3</a>
</li>
</ul>
</li>
</ul>
HTML, (new GeneratesTableOfContents($markdown))->execute()
);
}

public function testNonHeadingMarkdownIsRemoved()
{
$expected = <<<'MARKDOWN'
# Level 1
## Level 2
### Level 3
MARKDOWN;

$actual = <<<'MARKDOWN'
# Level 1
Foo bar
## Level 2
Bar baz
### Level 3
Baz foo
MARKDOWN;

$this->assertSame(
(new GeneratesTableOfContents($expected))->execute(),
(new GeneratesTableOfContents($actual))->execute()
);
}

public function testWithNoLevelOneHeading()
{
$markdown = <<<'MARKDOWN'
## Level 2
### Level 3
MARKDOWN;

$this->assertSameIgnoringIndentation(<<<'HTML'
<ul class="table-of-contents">
<li>
<a href="#level-2">Level 2</a>
<ul>
<li>
<a href="#level-3">Level 3</a>
</li>
</ul>
</li>
</ul>
HTML, (new GeneratesTableOfContents($markdown))->execute()
);
}

public function testWithMultipleNestedHeadings()
{
$markdown = <<<'MARKDOWN'
# Level 1
## Level 2
### Level 3
#### Level 4
##### Level 5
###### Level 6
## Level 2B
### Level 3B
### Level 3C
## Level 2C
### Level 3D
MARKDOWN;

$this->assertSameIgnoringIndentation(<<<'HTML'
<ul class="table-of-contents">
<li>
<a href="#level-2">Level 2</a>
<ul>
<li>
<a href="#level-3">Level 3</a>
<ul>
<li>
<a href="#level-4">Level 4</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#level-2b">Level 2B</a>
<ul>
<li>
<a href="#level-3b">Level 3B</a>
</li>
<li>
<a href="#level-3c">Level 3C</a>
</li>
</ul>
</li>
<li>
<a href="#level-2c">Level 2C</a>
<ul>
<li>
<a href="#level-3d">Level 3D</a>
</li>
</ul>
</li>
</ul>
HTML, (new GeneratesTableOfContents($markdown))->execute()
);
}

public function testWithMultipleLevelOneHeadings()
{
$markdown = <<<'MARKDOWN'
# Level 1
## Level 2
### Level 3
# Level 1B
## Level 2B
### Level 3B
MARKDOWN;

$this->assertEquals('<ul class="table-of-contents"><li><a href="#level-2">Level 2</a><ul><li><a href="#level-3">Level 3</a></li></ul></li></ul>',
str_replace("\n", '', $result)
$this->assertSameIgnoringIndentation(<<<'HTML'
<ul class="table-of-contents">
<li>
<a href="#level-2">Level 2</a>
<ul>
<li>
<a href="#level-3">Level 3</a>
</li>
</ul>
</li>
<li>
<a href="#level-2b">Level 2B</a>
<ul>
<li>
<a href="#level-3b">Level 3B</a>
</li>
</ul>
</li>
</ul>
HTML, (new GeneratesTableOfContents($markdown))->execute()
);
}

protected function assertSameIgnoringIndentation(string $expected, string $actual): void
{
$this->assertSame(
$this->removeIndentation(trim($expected)),
$this->removeIndentation(trim($actual))
);
}

protected function removeIndentation(string $actual): string
{
return implode("\n", array_map('trim', explode("\n", $actual)));
}
}

0 comments on commit e0b289e

Please sign in to comment.