| package com.jetbrains.rest; | |
| import com.intellij.psi.tree.IElementType; | |
| import com.jetbrains.rest.lexer._RestFlexLexer; | |
| import junit.framework.TestCase; | |
| import java.io.IOException; | |
| /** | |
| * User : catherine | |
| */ | |
| public class RestLexerTest extends TestCase { | |
| public void testTitle() throws IOException { | |
| doTest("\n" + | |
| ".. _quickstart:\n" + | |
| "\n" + | |
| "Quick start guide\n" + | |
| "=================\n", | |
| "[\n, WHITESPACE]", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[_quickstart:, HYPERLINK]", | |
| "[\n, WHITESPACE]", | |
| "[\n, WHITESPACE]", | |
| "[Quick start guide\n" + | |
| "=================\n" + | |
| ", TITLE]" | |
| ); | |
| } | |
| public void testDirective() throws IOException { | |
| doTest("\n" + | |
| ".. note::\n" + | |
| " Please", | |
| "[\n, WHITESPACE]", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[note::, DIRECTIVE]", | |
| "[\n, WHITESPACE]", | |
| "[ , LINE]", | |
| "[Please, LINE]" | |
| ); | |
| } | |
| public void testSubstitution() throws IOException { | |
| doTest(".. |grappelli| replace:: Grappelli", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[|grappelli|, SUBSTITUTION]", | |
| "[ , WHITESPACE]", | |
| "[replace::, DIRECTIVE]", | |
| "[ Grappelli, LINE]" | |
| ); | |
| } | |
| public void testField() throws IOException { | |
| doTest(".. figure:: image.png\n" + | |
| " :width: 300pt", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[figure::, DIRECTIVE]", | |
| "[ image.png, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[ , LINE]", | |
| "[:width:, FIELD]", | |
| "[ , LINE]", | |
| "[300pt, LINE]" | |
| ); | |
| } | |
| public void testRole() throws IOException { //PY-3810 | |
| doTest(" role :roole1:`some text` :notparsed: text\n" + | |
| ":list field:\n" + | |
| " :second field:\n", | |
| "[ , LINE]", | |
| "[role, LINE]", | |
| "[ , LINE]", | |
| "[:roole1:, FIELD]", | |
| "[`some text`, INTERPRETED]", | |
| "[ , LINE]", | |
| "[:, LINE]", | |
| "[notparsed, LINE]", | |
| "[:, LINE]", | |
| "[ , LINE]", | |
| "[text, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[:list field:, FIELD]", | |
| "[\n, WHITESPACE]", | |
| "[ , LINE]", | |
| "[:second field:, FIELD]", | |
| "[\n, WHITESPACE]" | |
| ); | |
| } | |
| public void testFootnote() throws IOException { | |
| doTest(".. [2] Random", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[[2], FOOTNOTE]", | |
| "[ , LINE]", | |
| "[Random, LINE]" | |
| ); | |
| } | |
| public void testHyperlink() throws IOException { | |
| doTest(".. _`dvipng`: http://savannah.nongnu.org/projects/dvipng/", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[_`dvipng`:, HYPERLINK]", | |
| "[ , LINE]", | |
| "[http://savannah.nongnu.org/projects/dvipng/, DIRECT_HYPERLINK]" | |
| ); | |
| } | |
| public void testItalics() throws IOException { | |
| doTest("*italics* highlighting", | |
| "[*italics*, ITALIC]", | |
| "[ , LINE]", | |
| "[highlighting, LINE]" | |
| ); | |
| } | |
| public void testBold() throws IOException { | |
| doTest("**bold** highlighting", | |
| "[**bold**, BOLD]", | |
| "[ , LINE]", | |
| "[highlighting, LINE]" | |
| ); | |
| } | |
| public void testShortHeading() throws IOException { | |
| doTest("DSF\n" + | |
| "===", | |
| "[DSF, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[===, LINE]" | |
| ); | |
| } | |
| public void testSubstitutions() throws IOException { | |
| doTest(".. |end-user| replace:: :term:`user`\n" + | |
| ".. |PNS ID| replace:: :term:`user`\n" + | |
| ".. |PNS.ID| replace:: :term:`user`", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[|end-user|, SUBSTITUTION]", | |
| "[ , WHITESPACE]", | |
| "[replace::, DIRECTIVE]", | |
| "[ :term:`user`, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[|PNS ID|, SUBSTITUTION]", | |
| "[ , WHITESPACE]", | |
| "[replace::, DIRECTIVE]", | |
| "[ :term:`user`, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[|PNS.ID|, SUBSTITUTION]", | |
| "[ , WHITESPACE]", | |
| "[replace::, DIRECTIVE]", | |
| "[ :term:`user`, LINE]" | |
| ); | |
| } | |
| public void testLinks() throws IOException { | |
| doTest("link_/\n" + | |
| "link_!\n" + | |
| "\"link_\"\n" + | |
| "'link_'\n" + | |
| "link_;\n", | |
| "[link_, REFERENCE_NAME]", | |
| "[/, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[link_, REFERENCE_NAME]", | |
| "[!, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[\", LINE]", | |
| "[link_, REFERENCE_NAME]", | |
| "[\", LINE]", | |
| "[\n, WHITESPACE]", | |
| "[', LINE]", | |
| "[link_, REFERENCE_NAME]", | |
| "[', LINE]", | |
| "[\n, WHITESPACE]", | |
| "[link_, REFERENCE_NAME]", | |
| "[;, LINE]", | |
| "[\n, WHITESPACE]" | |
| ); | |
| } | |
| public void testFieldInCodeBlock() throws IOException { | |
| doTest(".. code-block:: python\n" + | |
| " :class: extra-css-class\n" + | |
| "\n" + | |
| " def thing(x): # comment\n" + | |
| " print(\"{x} is a thing\".format(x=x))", | |
| "[.. , EXPLISIT_MARKUP_START]", | |
| "[code-block::, CUSTOM_DIRECTIVE]", | |
| "[ , WHITESPACE]", | |
| "[python\n, LINE]", | |
| "[ , WHITESPACE]", | |
| "[ , WHITESPACE]", | |
| "[:class:, FIELD]", | |
| "[ extra-css-class, LINE]", | |
| "[\n, WHITESPACE]", | |
| "[\n, WHITESPACE]", | |
| "[ , PYTHON_LINE]", | |
| "[def thing(x): # comment, PYTHON_LINE]", | |
| "[\n, PYTHON_LINE]", | |
| "[ , PYTHON_LINE]", | |
| "[print(\"{x} is a thing\".format(x=x)), PYTHON_LINE]" | |
| ); | |
| } | |
| public void testInterpreted() throws IOException { | |
| doTest(":kbd:`1`\n" + | |
| "\n" + | |
| ":kbd:`a`\n" + | |
| "\n" + | |
| ":kbd:`*`\n" + | |
| "\n" + | |
| ":kbd:`12`\n" + | |
| "\n" + | |
| ":kbd:`ab`\n" + | |
| "\n" + | |
| ":kbd:`**`\n" + | |
| "\n" + | |
| ":kbd:`1`, :kbd:`2`", | |
| "[:kbd:, FIELD]", | |
| "[`1`, INTERPRETED]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[:kbd:, FIELD]", | |
| "[`a`, INTERPRETED]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[:kbd:, FIELD]", | |
| "[`*`, INTERPRETED]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[:kbd:, FIELD]", | |
| "[`12`, INTERPRETED]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[:kbd:, FIELD]", | |
| "[`ab`, INTERPRETED]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[:kbd:, FIELD]", | |
| "[`**`, INTERPRETED]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[\n" + | |
| ", WHITESPACE]", | |
| "[:kbd:, FIELD]", | |
| "[`1`, INTERPRETED]", | |
| "[,, LINE]", | |
| "[ , LINE]", | |
| "[:kbd:, FIELD]", | |
| "[`2`, INTERPRETED]" | |
| ); | |
| } | |
| private static void doTest(String text, String... expected) throws IOException { | |
| _RestFlexLexer lexer = createLexer(text); | |
| for (String expectedTokenText : expected) { | |
| IElementType type = lexer.advance(); | |
| if (type == null) { | |
| fail("Not enough tokens"); | |
| } | |
| String tokenText = "[" + lexer.yytext() + ", " + type + "]"; | |
| assertEquals(expectedTokenText, tokenText); | |
| } | |
| } | |
| public static _RestFlexLexer createLexer(String text) { | |
| _RestFlexLexer lexer = new _RestFlexLexer(null); | |
| lexer.reset(text, 0, text.length(), _RestFlexLexer.YYINITIAL); | |
| return lexer; | |
| } | |
| } |