# This file is part of NIT ( http://www.nitlanguage.org ). # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Tests for markdown nodes location module test_markdown_location is test import test_markdown abstract class TestMarkdownLocation super TestMarkdown redef var md_parser do var parser = super parser.github_mode = true parser.wikilinks_mode = true return parser end fun md_to_loc(md: String): String do var node = parse_md(md) var v = new TestMarkdownLocationVisitor v.enter_visit(node) return v.buffer.to_s end end class TestMarkdownLocationVisitor super MdVisitor var buffer = new Buffer var indent = 0 fun print_loc(node: MdNode) do buffer.append "{" " * indent}{node.class_name}: {node.location}\n" indent += 1 node.visit_all(self) indent -= 1 end redef fun visit(node) do print_loc(node) end class TestLocationOutput super TestMarkdownLocation test fun test_atx_headings1 is test do var md = """ # title 1 ## title 2 ### title 3 #### title 4 ##### title 5 ###### title 6 """ var loc = """ MdDocument: 1,1--6,14 MdHeading: 1,1--1,9 MdText: 1,3--1,9 MdHeading: 2,1--2,10 MdText: 2,4--2,10 MdHeading: 3,1--3,11 MdText: 3,5--3,11 MdHeading: 4,1--4,12 MdText: 4,6--4,12 MdHeading: 5,1--5,13 MdText: 5,7--5,13 MdHeading: 6,1--6,14 MdText: 6,8--6,14 """ assert md_to_loc(md) == loc end fun test_atx_headings_with_trailings is test do var md = """ # title 1 # ## title 2 ## ### title 3 ### #### title 4 #### ##### title 5 ##### ###### title 6 ###### """ var loc = """ MdDocument: 1,1--6,21 MdHeading: 1,1--1,11 MdText: 1,3--1,9 MdHeading: 2,1--2,13 MdText: 2,4--2,10 MdHeading: 3,1--3,15 MdText: 3,5--3,11 MdHeading: 4,1--4,17 MdText: 4,6--4,12 MdHeading: 5,1--5,19 MdText: 5,7--5,13 MdHeading: 6,1--6,21 MdText: 6,8--6,14 """ assert md_to_loc(md) == loc end fun test_settext_headings is test do var md = """ title 1 ======= title 2 ------- """ var loc = """ MdDocument: 1,1--5,7 MdHeading: 1,1--2,7 MdText: 1,1--1,7 MdHeading: 4,1--5,7 MdText: 4,1--4,7 """ assert md_to_loc(md) == loc end fun test_indented_code_spaces is test do var md = """ some code multi lines """ var loc = """ MdDocument: 1,1--3,15 MdIndentedCodeBlock: 1,1--3,15 """ assert md_to_loc(md) == loc end fun test_indented_code_tabs is test do var md = """ some code multi lines """ var loc = """ MdDocument: 1,1--3,15 MdIndentedCodeBlock: 1,1--3,15 """ assert md_to_loc(md) == loc end fun test_fenced_code is test do var md = """ ~~~ some code multi lines ~~~ """ var loc = """ MdDocument: 1,1--5,3 MdFencedCodeBlock: 1,1--5,3 """ assert md_to_loc(md) == loc end fun test_thematic_breaks is test do var md = """ *** * * * * * * """ var loc = """ MdDocument: 1,1--5,5 MdThematicBreak: 1,1--1,3 MdThematicBreak: 3,1--3,5 MdThematicBreak: 5,1--5,5 """ assert md_to_loc(md) == loc end fun test_html_blocks1 is test do var md = """

bar

bar

""" var loc = """ MdDocument: 1,1--5,12 MdHtmlBlock: 1,1--1,28 MdHtmlBlock: 3,1--5,12 """ assert md_to_loc(md) == loc end fun test_paragraph1 is test do var md = """ foo bar baz line 1 line 2 other par with multiple lines """ var loc = """ MdDocument: 1,1--7,19 MdParagraph: 1,1--1,11 MdText: 1,1--1,11 MdParagraph: 3,1--4,6 MdText: 3,1--3,6 MdSoftLineBreak: 3,7--3,7 MdText: 4,1--4,6 MdParagraph: 6,1--7,19 MdText: 6,1--6,9 MdSoftLineBreak: 6,10--6,10 MdText: 7,1--7,19 """ assert md_to_loc(md) == loc end fun test_blockquotes is test do var md = """ > foo > bar """ var loc = """ MdDocument: 1,1--2,5 MdBlockQuote: 1,1--2,5 MdParagraph: 1,3--2,5 MdText: 1,3--1,5 MdSoftLineBreak: 1,6--1,6 MdText: 2,3--2,5 """ assert md_to_loc(md) == loc end fun test_blockquotes_nested is test do var md = """ > foo > > foo > > bar """ var loc = """ MdDocument: 1,1--3,7 MdBlockQuote: 1,1--3,7 MdParagraph: 1,3--1,5 MdText: 1,3--1,5 MdBlockQuote: 2,3--3,7 MdParagraph: 2,5--3,7 MdText: 2,5--2,7 MdSoftLineBreak: 2,8--2,8 MdText: 3,5--3,7 """ assert md_to_loc(md) == loc end fun test_blockquotes_headings is test do var md = """ > # Title 1 > ## Title 2 ## """ var loc = """ MdDocument: 1,1--2,15 MdBlockQuote: 1,1--2,15 MdHeading: 1,3--1,11 MdText: 1,5--1,11 MdHeading: 2,3--2,15 MdText: 2,6--2,12 """ assert md_to_loc(md) == loc end fun test_blockquotes_thematic_breaks is test do var md = """ > *** > * * * """ var loc = """ MdDocument: 1,1--2,7 MdBlockQuote: 1,1--2,7 MdThematicBreak: 1,3--1,5 MdThematicBreak: 2,3--2,7 """ assert md_to_loc(md) == loc end fun test_blockquotes_indented_code is test do var md = """ > line 1 > line 2 """ var loc = """ MdDocument: 1,1--2,12 MdBlockQuote: 1,1--2,12 MdIndentedCodeBlock: 1,3--2,12 """ assert md_to_loc(md) == loc end fun test_blockquotes_fenced_code is test do var md = """ > ~~~ > line 1 > line 2 > ~~~ """ var loc = """ MdDocument: 1,1--4,5 MdBlockQuote: 1,1--4,5 MdFencedCodeBlock: 1,3--4,5 """ assert md_to_loc(md) == loc end fun test_blockquotes_list is test do var md = """ > * line 1 > * line 2 """ var loc = """ MdDocument: 1,1--2,10 MdBlockQuote: 1,1--2,10 MdUnorderedList: 1,3--2,10 MdListItem: 1,3--1,10 MdParagraph: 1,5--1,10 MdText: 1,5--1,10 MdListItem: 2,3--2,10 MdParagraph: 2,5--2,10 MdText: 2,5--2,10 """ assert md_to_loc(md) == loc end fun test_unordered_lists is test do var md = """ * line 1 * line 2 """ var loc = """ MdDocument: 1,1--2,8 MdUnorderedList: 1,1--2,8 MdListItem: 1,1--1,8 MdParagraph: 1,3--1,8 MdText: 1,3--1,8 MdListItem: 2,1--2,8 MdParagraph: 2,3--2,8 MdText: 2,3--2,8 """ assert md_to_loc(md) == loc end fun test_ordered_lists is test do var md = """ 1) line 1 2) line 2 """ var loc = """ MdDocument: 1,1--2,9 MdOrderedList: 1,1--2,9 MdListItem: 1,1--1,9 MdParagraph: 1,4--1,9 MdText: 1,4--1,9 MdListItem: 2,1--2,9 MdParagraph: 2,4--2,9 MdText: 2,4--2,9 """ assert md_to_loc(md) == loc end fun test_list_headings is test do var md = """ * # Title 1 * ## Title 2 ## """ var loc = """ MdDocument: 1,1--2,15 MdUnorderedList: 1,1--2,15 MdListItem: 1,1--1,11 MdHeading: 1,3--1,11 MdText: 1,5--1,11 MdListItem: 2,1--2,15 MdHeading: 2,3--2,15 MdText: 2,6--2,12 """ assert md_to_loc(md) == loc end fun test_list_thematic_breaks is test do var md = """ - *** - * * * """ var loc = """ MdDocument: 1,1--2,7 MdUnorderedList: 1,1--2,7 MdListItem: 1,1--1,5 MdThematicBreak: 1,3--1,5 MdListItem: 2,1--2,7 MdThematicBreak: 2,3--2,7 """ assert md_to_loc(md) == loc end fun test_list_indented_codes is test do var md = """ - line 1 - line 2 """ var loc = """ MdDocument: 1,1--2,12 MdUnorderedList: 1,1--2,12 MdListItem: 1,1--1,12 MdIndentedCodeBlock: 1,3--1,12 MdListItem: 2,1--2,12 MdIndentedCodeBlock: 2,3--2,12 """ assert md_to_loc(md) == loc end fun test_list_fenced_codes is test do var md = """ - ~~~ line 1 line 2 ~~~ """ var loc = """ MdDocument: 1,1--4,5 MdUnorderedList: 1,1--4,5 MdListItem: 1,1--4,5 MdFencedCodeBlock: 1,3--4,5 """ assert md_to_loc(md) == loc end fun test_list_blockquotes is test do var md = """ - > line 1 > line 2 """ var loc = """ MdDocument: 1,1--2,10 MdUnorderedList: 1,1--2,10 MdListItem: 1,1--2,10 MdBlockQuote: 1,3--2,10 MdParagraph: 1,5--2,10 MdText: 1,5--1,10 MdSoftLineBreak: 1,11--1,11 MdText: 2,5--2,10 """ assert md_to_loc(md) == loc end fun test_list_pars is test do var md = """ * line 1 line 2 * line 3 """ var loc = """ MdDocument: 1,1--4,8 MdUnorderedList: 1,1--4,8 MdListItem: 1,1--2,8 MdParagraph: 1,3--2,8 MdText: 1,3--1,8 MdSoftLineBreak: 1,9--1,9 MdText: 2,3--2,8 MdListItem: 4,1--4,8 MdParagraph: 4,3--4,8 MdText: 4,3--4,8 """ assert md_to_loc(md) == loc end fun test_list_nested is test do var md = """ * foo * foo * bar """ var loc = """ MdDocument: 1,1--3,7 MdUnorderedList: 1,1--3,7 MdListItem: 1,1--3,7 MdParagraph: 1,3--1,5 MdText: 1,3--1,5 MdUnorderedList: 2,3--3,7 MdListItem: 2,3--2,7 MdParagraph: 2,5--2,7 MdText: 2,5--2,7 MdListItem: 3,3--3,7 MdParagraph: 3,5--3,7 MdText: 3,5--3,7 """ assert md_to_loc(md) == loc end fun test_emphasis is test do var md = """ An *emphasis* and a **strong emphasis**. """ var loc = """ MdDocument: 1,1--1,40 MdParagraph: 1,1--1,40 MdText: 1,1--1,3 MdEmphasis: 1,4--1,13 MdText: 1,5--1,12 MdText: 1,14--1,20 MdStrongEmphasis: 1,21--1,39 MdText: 1,23--1,37 MdText: 1,40--1,40 """ assert md_to_loc(md) == loc end fun test_emphasis_nested is test do var md = """ Another ***emphasis***. """ var loc = """ MdDocument: 1,1--1,23 MdParagraph: 1,1--1,23 MdText: 1,1--1,8 MdEmphasis: 1,9--1,22 MdStrongEmphasis: 1,10--1,21 MdText: 1,12--1,19 MdText: 1,23--1,23 """ assert md_to_loc(md) == loc end fun test_emphasis_nested2 is test do var md = """ Another ****emphasis****. """ var loc = """ MdDocument: 1,1--1,25 MdParagraph: 1,1--1,25 MdText: 1,1--1,8 MdStrongEmphasis: 1,9--1,24 MdStrongEmphasis: 1,11--1,22 MdText: 1,13--1,20 MdText: 1,25--1,25 """ assert md_to_loc(md) == loc end fun test_emphasis_nested3 is test do var md = """ Another *****emphasis*****. """ var loc = """ MdDocument: 1,1--1,27 MdParagraph: 1,1--1,27 MdText: 1,1--1,8 MdEmphasis: 1,9--1,26 MdStrongEmphasis: 1,10--1,25 MdStrongEmphasis: 1,12--1,23 MdText: 1,14--1,21 MdText: 1,27--1,27 """ assert md_to_loc(md) == loc end fun test_emphasis_bad is test do var md = """ Another ___ emphasis ___. """ var loc = """ MdDocument: 1,1--1,25 MdParagraph: 1,1--1,25 MdText: 1,1--1,25 """ assert md_to_loc(md) == loc end fun test_emphasis_bad2 is test do var md = """ Another **emphasis. """ var loc = """ MdDocument: 1,1--1,19 MdParagraph: 1,1--1,19 MdText: 1,1--1,19 """ assert md_to_loc(md) == loc end fun test_inline_code is test do var md = """ A `code` and another ``one``. """ var loc = """ MdDocument: 1,1--1,29 MdParagraph: 1,1--1,29 MdText: 1,1--1,2 MdCode: 1,3--1,8 MdText: 1,9--1,21 MdCode: 1,22--1,28 MdText: 1,29--1,29 """ assert md_to_loc(md) == loc end fun test_inline_code_bad is test do var md = """ A `code and another ``one``. """ var loc = """ MdDocument: 1,1--1,28 MdParagraph: 1,1--1,28 MdText: 1,1--1,20 MdCode: 1,21--1,27 MdText: 1,28--1,28 """ assert md_to_loc(md) == loc end fun test_inline_autolink is test do var md = """ An . """ var loc = """ MdDocument: 1,1--1,21 MdParagraph: 1,1--1,21 MdText: 1,1--1,3 MdLink: 1,4--1,20 MdText: 1,5--1,19 MdText: 1,21--1,21 """ assert md_to_loc(md) == loc end fun test_inline_autolink_bad is test do var md = """ An http://autolink>. """ var loc = """ MdDocument: 1,1--1,20 MdParagraph: 1,1--1,20 MdText: 1,1--1,20 """ assert md_to_loc(md) == loc end fun test_inline_autolink_bad2 is test do var md = """ An . """ var loc = """ MdDocument: 1,1--1,21 MdParagraph: 1,1--1,21 MdText: 1,1--1,3 MdLink: 1,4--1,20 MdText: 1,5--1,19 MdText: 1,21--1,21 """ assert md_to_loc(md) == loc end fun test_inline_link is test do var md = """ A [link](url/). """ var loc = """ MdDocument: 1,1--1,15 MdParagraph: 1,1--1,15 MdText: 1,1--1,2 MdLink: 1,3--1,14 MdText: 1,4--1,7 MdText: 1,15--1,15 """ assert md_to_loc(md) == loc end fun test_inline_link_with_title is test do var md = """ A [link](url/ "title"). """ var loc = """ MdDocument: 1,1--1,23 MdParagraph: 1,1--1,23 MdText: 1,1--1,2 MdLink: 1,3--1,22 MdText: 1,4--1,7 MdText: 1,23--1,23 """ assert md_to_loc(md) == loc end fun test_inline_link_with_content is test do var md = """ A [`code` link](url/). """ var loc = """ MdDocument: 1,1--1,22 MdParagraph: 1,1--1,22 MdText: 1,1--1,2 MdLink: 1,3--1,21 MdCode: 1,4--1,9 MdText: 1,10--1,14 MdText: 1,22--1,22 """ assert md_to_loc(md) == loc end fun test_inline_link_bad is test do var md = """ A [link](url/. """ var loc = """ MdDocument: 1,1--1,14 MdParagraph: 1,1--1,14 MdText: 1,1--1,14 """ assert md_to_loc(md) == loc end fun test_inline_image is test do var md = """ A ![img](url/). """ var loc = """ MdDocument: 1,1--1,15 MdParagraph: 1,1--1,15 MdText: 1,1--1,2 MdImage: 1,3--1,14 MdText: 1,5--1,7 MdText: 1,15--1,15 """ assert md_to_loc(md) == loc end fun test_inline_image_bad is test do var md = """ A ![img](url/. """ var loc = """ MdDocument: 1,1--1,14 MdParagraph: 1,1--1,14 MdText: 1,1--1,14 """ assert md_to_loc(md) == loc end fun test_inline_link_ref is test do var md = """ A [link][]. [link]: url/ """ var loc = """ MdDocument: 1,1--1,11 MdParagraph: 1,1--1,11 MdText: 1,1--1,2 MdLink: 1,3--1,10 MdText: 1,4--1,7 MdText: 1,11--1,11 """ assert md_to_loc(md) == loc end fun test_inline_link_ref2 is test do var md = """ A [foo][link]. [link]: url/ """ var loc = """ MdDocument: 1,1--1,14 MdParagraph: 1,1--1,14 MdText: 1,1--1,2 MdLink: 1,3--1,13 MdText: 1,4--1,6 MdText: 1,14--1,14 """ assert md_to_loc(md) == loc end fun test_inline_link_ref_bad is test do var md = """ A [foo][link2]. [link]: url/ """ var loc = """ MdDocument: 1,1--1,15 MdParagraph: 1,1--1,15 MdText: 1,1--1,15 """ assert md_to_loc(md) == loc end fun test_inline_html is test do var md = """ An
break line. """ var loc = """ MdDocument: 1,1--1,21 MdParagraph: 1,1--1,21 MdText: 1,1--1,3 MdHtmlInline: 1,4--1,9 MdText: 1,10--1,21 """ assert md_to_loc(md) == loc end fun test_inline_html2 is test do var md = """ An *emph*. """ var loc = """ MdDocument: 1,1--1,29 MdParagraph: 1,1--1,29 MdText: 1,1--1,3 MdHtmlInline: 1,4--1,18 MdEmphasis: 1,19--1,24 MdText: 1,20--1,23 MdHtmlInline: 1,25--1,28 MdText: 1,29--1,29 """ assert md_to_loc(md) == loc end fun test_inline_escape is test do var md = """ A text with \\"escaped chars\\". """ var loc = """ MdDocument: 1,1--1,30 MdParagraph: 1,1--1,30 MdText: 1,1--1,30 """ assert md_to_loc(md) == loc end fun test_inline_soft_break is test do var md = """ A text with a soft break. """ var loc = """ MdDocument: 1,1--2,13 MdParagraph: 1,1--2,13 MdText: 1,1--1,11 MdSoftLineBreak: 1,12--1,12 MdText: 2,1--2,13 """ assert md_to_loc(md) == loc end fun test_inline_soft_break2 is test do var md = """A text with \na hard break.\n""" var loc = """ MdDocument: 1,1--2,13 MdParagraph: 1,1--2,13 MdText: 1,1--1,11 MdSoftLineBreak: 1,12--1,13 MdText: 2,1--2,13 """ assert md_to_loc(md) == loc end fun test_inline_hard_break is test do var md = """ A text with\\ a hard break. """ var loc = """ MdDocument: 1,1--2,13 MdParagraph: 1,1--2,13 MdText: 1,1--1,11 MdHardLineBreak: 1,12--1,13 MdText: 2,1--2,13 """ assert md_to_loc(md) == loc end fun test_inline_hard_break2 is test do var md = """A text with \na hard break.\n""" var loc = """ MdDocument: 1,1--2,13 MdParagraph: 1,1--2,13 MdText: 1,1--1,11 MdHardLineBreak: 1,12--1,14 MdText: 2,1--2,13 """ assert md_to_loc(md) == loc end end