| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- <?php
- declare(strict_types=1);
-
- use PHPUnit\Framework\TestCase;
-
- require_once __DIR__ . '/../php/markdown.php';
-
- final class BrokenSyntaxTests extends TestCase {
- private ?Markdown $parser = null;
-
- protected function setUp(): void {
- parent::setUp();
- $this->parser = Markdown::completeParser();
- }
-
- private function iterateCharacters(string $markdown) {
- for ($i = 1; $i < mb_strlen($markdown); $i++) {
- $portion = mb_substr($markdown, 0, $i);
- try {
- $this->parser->toHTML($portion);
- } catch (Error $e) {
- print("Broken portion is:\n\"{$portion}\"\n");
- throw $e;
- }
- }
- }
-
- public function test_brokenSyntax() {
- // Just try a bunch of broken syntax and make sure no exceptions are
- // thrown or infinite loops triggered. Don't care about what's rendered
- // as most of these are incomplete or invalid syntax.
- $this->iterateCharacters("# ");
- $this->iterateCharacters("## ");
- $this->iterateCharacters("Underlined\n-");
- $this->iterateCharacters("* ");
- $this->iterateCharacters(" * A");
- $this->iterateCharacters("- A");
- $this->iterateCharacters(" - A");
- $this->iterateCharacters("+ A");
- $this->iterateCharacters(" + A");
- $this->iterateCharacters("1. A");
- $this->iterateCharacters(" 1. A");
- $this->iterateCharacters("1. A\n 1. B\n 2. C\n2. D");
- $this->iterateCharacters("> A");
- $this->iterateCharacters("> \nA");
- $this->iterateCharacters("> \n>");
- $this->iterateCharacters(">>");
- $this->iterateCharacters("> > A");
- $this->iterateCharacters("> \n> A");
- $this->iterateCharacters("> > \n> A");
- $this->iterateCharacters("```\ncode\n```");
- $this->iterateCharacters("```java\ncode\n```");
- $this->iterateCharacters(" code\n code\n\n");
- $this->iterateCharacters("------");
- $this->iterateCharacters(" - - - --*");
- $this->iterateCharacters("Header|Header\n--|--\nCell|Cell");
- $this->iterateCharacters("Header\n--|--\nCell");
- $this->iterateCharacters("|Header|\n|-|\n|Cell|");
- $this->iterateCharacters("|Header|\n|--|--|--|\n|Cell|");
- $this->iterateCharacters("|Header|Header|\n|--|\n|Cell|Cell|");
- $this->iterateCharacters("|Header|\n|:-|\n|Cell|");
- $this->iterateCharacters("|Header|\n|:-:|\n|Cell|");
- $this->iterateCharacters("|Header|\n|-:|\n|Cell|");
- $this->iterateCharacters("term\n: definition\nterm\n: definition");
- $this->iterateCharacters("term\n:definition\nterm\n:definition");
- $this->iterateCharacters("HTML\n\n*[HTML]: Hypertext");
- $this->iterateCharacters("HTML\n*[HTML]: Hypertext");
- $this->iterateCharacters("*[HTML]: Hypertext\nHTML");
- $this->iterateCharacters("---{.foo}\n");
- $this->iterateCharacters("---{#foo}\n");
- $this->iterateCharacters("---{.foo #foo lang=en}\n");
- $this->iterateCharacters("lorem *ipsum* dolor *sit* amet");
- $this->iterateCharacters("*lorem* ipsum *dolor* sit *amet*");
- $this->iterateCharacters("*lorem *ipsum *dolor*** sit");
- $this->iterateCharacters("***lorem* ipsum* dolor* sit");
- $this->iterateCharacters("lorem _ipsum_ dolor _sit_ amet");
- $this->iterateCharacters("_lorem_ ipsum _dolor_ sit _amet_");
- $this->iterateCharacters("_lorem _ipsum _dolor___ sit");
- $this->iterateCharacters("___lorem_ ipsum_ dolor_ sit");
- $this->iterateCharacters("lorem **ipsum** dolor **sit** amet");
- $this->iterateCharacters("**lorem** ipsum **dolor** sit **amet**");
- $this->iterateCharacters("**lorem **ipsum **dolor****** sit");
- $this->iterateCharacters("******lorem** ipsum** dolor** sit");
- $this->iterateCharacters("lorem __ipsum__ dolor __sit__ amet");
- $this->iterateCharacters("__lorem__ ipsum __dolor__ sit __amet__");
- $this->iterateCharacters("lorem __ipsum__ dolor __sit__ amet");
- $this->iterateCharacters("__lorem __ipsum __dolor______ sit");
- $this->iterateCharacters("______lorem__ ipsum__ dolor__ sit");
- $this->iterateCharacters("*_**`~~^==!__~*^!``**-+!**`==!~_^**``_");
- $this->iterateCharacters("[link[(index.html(");
- $this->iterateCharacters("[link[](index.html()");
- $this->iterateCharacters("[link]](index.html))");
- $this->iterateCharacters("[[link]((index.html)");
- $this->iterateCharacters("]link])index.html)");
- $this->iterateCharacters("[ link ] ( index.html )");
- $this->iterateCharacters("(user@example.com)");
- $this->iterateCharacters("(https://user@example.com)");
- $this->iterateCharacters("(index.html \"title\")");
- $this->iterateCharacters("(index.html \"title)");
- $this->iterateCharacters("(index.html title\")");
- $this->iterateCharacters("(index.html title)");
- $this->iterateCharacters("![alt][image.jpg]");
- $this->iterateCharacters("");
- $this->iterateCharacters("! [alt](image.jpg)");
- $this->iterateCharacters("!(image.jpg)");
- $this->iterateCharacters("[][]]][][[][][][[][[]][][][][][[[]]]][]][][");
- $this->iterateCharacters("())())()()()(())(()((())))(()((()");
- $this->iterateCharacters("<https://example.com>");
- $this->iterateCharacters("<<https://example.com>");
- $this->iterateCharacters("<https://example.com>>");
- $this->iterateCharacters("[link][ref]\n\n[ref]: page.html");
- $this->iterateCharacters("[link][ref]\n[ref]: page.html");
- $this->iterateCharacters("[link][ref]\n\n[ref]:page.html");
- $this->iterateCharacters("[ref]: page.html\n\n[link][ref]");
- $this->iterateCharacters("[link][ref]\n\n[ref]: page.html \"title\"");
- $this->iterateCharacters("[link][ref]\n\n[ref]: page.html title");
- $this->iterateCharacters("Lorem[^1] ipsum[^abc] dolor[^-1]\n\n[^abc]: def\n[^1]: def\n[^-1]: def\n[^abc]: def");
- $this->iterateCharacters("Lorem[^1]\n\n[^2]: def");
- $this->iterateCharacters("[^1]] [[^2] [^3]] [[^4]] ]^5[");
- $this->iterateCharacters("[^1]: Def\n\nLorem[^1]");
- $this->iterateCharacters("[^1]: Def\n\nLorem[^2]");
- $this->iterateCharacters("Lorem <foo> ipsum");
- $this->iterateCharacters("Lorem <span> ipsum");
- $this->iterateCharacters("Lorem <span class=\"foo\" id=\"foo\" lang=\"en\"> ipsum");
- $this->iterateCharacters("Lorem </span> ipsum");
- $this->iterateCharacters("Lorem </span foo=\"bar\">");
- $this->iterateCharacters("Lorem <span foo='bar' baz=ipsum dolor> sit");
- $this->iterateCharacters("\\*\\\\*\\\\\\*\\\\\\\\*\\*");
- $this->assertTrue(true); // to suppress risky test warning
- }
- }
- ?>
|