--- /dev/null
+(function() {
+ var mode = CodeMirror.getMode({tabSize: 4}, "gfm");
+ function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
+
+ MT("emInWordAsterisk",
+ "foo[em *bar*]hello");
+
+ MT("emInWordUnderscore",
+ "foo_bar_hello");
+
+ MT("emStrongUnderscore",
+ "[strong __][em&strong _foo__][em _] bar");
+
+ MT("fencedCodeBlocks",
+ "[comment ```]",
+ "[comment foo]",
+ "",
+ "[comment ```]",
+ "bar");
+
+ MT("fencedCodeBlockModeSwitching",
+ "[comment ```javascript]",
+ "[variable foo]",
+ "",
+ "[comment ```]",
+ "bar");
+
+ MT("taskListAsterisk",
+ "[variable-2 * []] foo]", // Invalid; must have space or x between []
+ "[variable-2 * [ ]]bar]", // Invalid; must have space after ]
+ "[variable-2 * [x]]hello]", // Invalid; must have space after ]
+ "[variable-2 * ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links
+ " [variable-3 * ][property [x]]][variable-3 foo]"); // Valid; can be nested
+
+ MT("taskListPlus",
+ "[variable-2 + []] foo]", // Invalid; must have space or x between []
+ "[variable-2 + [ ]]bar]", // Invalid; must have space after ]
+ "[variable-2 + [x]]hello]", // Invalid; must have space after ]
+ "[variable-2 + ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links
+ " [variable-3 + ][property [x]]][variable-3 foo]"); // Valid; can be nested
+
+ MT("taskListDash",
+ "[variable-2 - []] foo]", // Invalid; must have space or x between []
+ "[variable-2 - [ ]]bar]", // Invalid; must have space after ]
+ "[variable-2 - [x]]hello]", // Invalid; must have space after ]
+ "[variable-2 - ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links
+ " [variable-3 - ][property [x]]][variable-3 foo]"); // Valid; can be nested
+
+ MT("taskListNumber",
+ "[variable-2 1. []] foo]", // Invalid; must have space or x between []
+ "[variable-2 2. [ ]]bar]", // Invalid; must have space after ]
+ "[variable-2 3. [x]]hello]", // Invalid; must have space after ]
+ "[variable-2 4. ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links
+ " [variable-3 1. ][property [x]]][variable-3 foo]"); // Valid; can be nested
+
+ MT("SHA",
+ "foo [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] bar");
+
+ MT("shortSHA",
+ "foo [link be6a8cc] bar");
+
+ MT("tooShortSHA",
+ "foo be6a8c bar");
+
+ MT("longSHA",
+ "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd22 bar");
+
+ MT("badSHA",
+ "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cg2 bar");
+
+ MT("userSHA",
+ "foo [link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] hello");
+
+ MT("userProjectSHA",
+ "foo [link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] world");
+
+ MT("num",
+ "foo [link #1] bar");
+
+ MT("badNum",
+ "foo #1bar hello");
+
+ MT("userNum",
+ "foo [link bar#1] hello");
+
+ MT("userProjectNum",
+ "foo [link bar/hello#1] world");
+
+ MT("vanillaLink",
+ "foo [link http://www.example.com/] bar");
+
+ MT("vanillaLinkPunctuation",
+ "foo [link http://www.example.com/]. bar");
+
+ MT("vanillaLinkExtension",
+ "foo [link http://www.example.com/index.html] bar");
+
+ MT("notALink",
+ "[comment ```css]",
+ "[tag foo] {[property color][operator :][keyword black];}",
+ "[comment ```][link http://www.example.com/]");
+
+ MT("notALink",
+ "[comment ``foo `bar` http://www.example.com/``] hello");
+
+ MT("notALink",
+ "[comment `foo]",
+ "[link http://www.example.com/]",
+ "[comment `foo]",
+ "",
+ "[link http://www.example.com/]");
+})();