class BrokenSyntaxTests extends BaseTest { #parser; setUp() { this.#parser = Markdown.completeParser; } /** * @param {string} markdown */ #iterateCharacters(markdown) { for (var i = 1; i < markdown.length; i++) { const portion = markdown.substring(0, i); this.#parser.toHTML(portion); } } 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("\\*\\\\*\\\\\\*\\\\\\\\*\\*"); } }