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("![alt[](image.jpg()"); $this->iterateCharacters("! [alt](image.jpg)"); $this->iterateCharacters("!(image.jpg)"); $this->iterateCharacters("[][]]][][[][][][[][[]][][][][][[[]]]][]][]["); $this->iterateCharacters("())())()()()(())(()((())))(()((()"); $this->iterateCharacters(""); $this->iterateCharacters("<"); $this->iterateCharacters(">"); $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 ipsum"); $this->iterateCharacters("Lorem ipsum"); $this->iterateCharacters("Lorem ipsum"); $this->iterateCharacters("Lorem ipsum"); $this->iterateCharacters("Lorem "); $this->iterateCharacters("Lorem sit"); $this->iterateCharacters("\\*\\\\*\\\\\\*\\\\\\\\*\\*"); $this->assertTrue(true); // to suppress risky test warning } } ?>