Mercurial > hatta
view tests/test_parser.py @ 2491:c7b397a38422 default tip
Make it work with newer pygments
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 10 Mar 2019 19:33:33 +0100 |
| parents | c022854d3895 |
| children |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- from lxml.doctestcompare import LHTMLOutputChecker import doctest import werkzeug import hatta class HTML(object): """ A class wrapping HTML for better comparison and nicer error reporting. """ def __init__(self, text): self.text = text self.example = doctest.Example('', self.text) self.checker = LHTMLOutputChecker() self.flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS self.print_diff = True def compare(self, other, expect_eq): if isinstance(other, HTML): text = other.text else: text = other eq = self.checker.check_output(self.text, text, self.flags) if self.print_diff and eq != expect_eq: print self.checker.output_difference(self.example, text, self.flags) # Only output diff once per HTML object. self.print_diff = False return eq def __eq__(self, other): return self.compare(other, True) def __ne__(self, other): return self.compare(other, False) def __str__(self): return str(self.text) def __unicode__(self): return unicode(self.text) def link(addr, label, class_=None, image=None, lineno=0): href = werkzeug.escape(addr, quote=True) text = image or werkzeug.escape(label or addr) return u'<a href="%s">%s</a>' % (href, text) def img(addr, label, class_=None, image=None): href = werkzeug.escape(addr, quote=True) text = image or werkzeug.escape(label or addr, quote=True) return u'<img src="%s" alt="%s">' % (href, text) def hgh(text, mime=None, syntax=None, line_no=0): class DummyPage(hatta.page.WikiPageColorText): def __init__(self): self.request = self self.request.print_highlight_styles = None return DummyPage().highlight(text, mime, syntax, line_no) def parse(text): lines = text.splitlines(True) return HTML(u''.join(hatta.parser.WikiParser(lines, link, img, hgh))) def wiki_parse(text): lines = text.splitlines(True) return HTML(u''.join(hatta.parser.WikiWikiParser(lines, link, img, hgh))) class TestParser(object): def test_extract_links(self): text = """[[one link]] some text [[another|link]] more text [[link]]""" links = list(hatta.parser.WikiParser.extract_links(text)) assert links == [ ('one link', 'one link'), ('another', 'link'), ('link', 'link'), ] def test_basic_paragraph(self): html = parse(u'ziew') assert html == '<p id="line_0">ziew</p>' def test_amp(self): html = parse(u"d&d") assert html == """<p id="line_0">d&d</p>""" def test_basic_header(self): html = parse(u"= head =") assert html == """<a name="head-1"></a><h1 id="line_0">head</h1>""" def test_paragraph_newline(self): html = parse(u'test\ntest') assert html == """<p id="line_0">test test</p>""" def test_two_paragraphs(self): html = parse(u'test\n\ntest') assert html == """<p id="line_0">test</p><p id="line_2">test</p>""" def test_linebreak(self): html = parse(u'test\\\\test') assert html == """<p id="line_0">test<br>test</p>""" def test_separator(self): html = parse(u'----') assert html == """<hr>""" def test_level_two_header(self): html = parse(u'==test==') assert html == """<a name="head-0-1"></a><h2 id="line_0">test</h2>""" def test_unterminated_header(self): html = parse(u'== test') assert html == """<a name="head-0-1"></a><h2 id="line_0">test</h2>""" def test_overterminated_header(self): html = parse(u'==test====') assert html == """<a name="head-0-1"></a><h2 id="line_0">test</h2>""" def test_level_five_header(self): html = parse(u'=====test') assert html == """<a name="head-0-0-0-0-1"></a><h5 id="line_0">test</h5>""" def test_mix_headers_and_paragraphs(self): html = parse(u'==test==\ntest\n===test===') assert html == """ <a name="head-0-1"></a> <h2 id="line_0">test</h2> <p id="line_1">test</p> <a name="head-0-1-1"></a> <h3 id="line_2">test</h3> """ def test_basic_bulltes(self): html = parse(u'test\n* test line one\n * test line two\ntest') assert html == """ <p id="line_0">test</p> <ul id="line_1"> <li>test line one</li> <li>test line two</li> </ul> <p id="line_3">test</p> """ def test_nested_bullets(self): html = parse(u'* test line one\n* test line two\n** Nested item') assert html == """ <ul id="line_0"> <li>test line one</li> <li>test line two<ul id="line_2"> <li>Nested item</li> </ul></li> </ul> """ def test_basic_numbers(self): html = parse(u'test\n# test line one\n # test line two\ntest') assert html == """ <p id="line_0">test</p> <ol id="line_1"> <li>test line one</li> <li>test line two</li> </ol> <p id="line_3">test</p> """ def test_nested_numbers(self): html = parse(u'# test line one\n# test line two\n## Nested item') assert html == """ <ol id="line_0"> <li>test line one</li> <li>test line two<ol id="line_2"> <li>Nested item</li> </ol></li> </ol> """ def test_very_nested_numbers(self): html = parse(u'# 1\n# 2\n## 2.1\n### 2.1.1\n# 3') assert html == """ <ol id="line_0"> <li>1</li> <li>2<ol id="line_2"> <li>2.1<ol id="line_3"> <li>2.1.1</li> </ol></li> </ol></li> <li>3</li> </ol> """ def test_mixed_numbers_bullets(self): html = parse(u'# test line one\n* test line two\n*# Nested item') assert html == """ <ol id="line_0"> <li>test line one</li> <li>test line two<ol id="line_2"> <li>Nested item</li> </ol></li> </ol> """ def test_mixed_bullets_numbers(self): html = parse(u'* test line one\n# test line two\n*# Nested item') assert html == """ <ul id="line_0"> <li>test line one</li> <li>test line two<ul id="line_2"> <li>Nested item</li> </ul></li> </ul> """ def test_basic_emphasis(self): html = parse(u'test //test test// test **test test** test') assert html == """<p id="line_0">test <i>test test</i> test <b>test test</b> test</p>""" def test_nested_emphasis(self): html = parse(u'test //test **test// test** test') assert html == """<p id="line_0">test <i>test <b>test</b></i> test<b> test</b></p>""" def test_unterminated_emphasis(self): html = parse(u'**test') assert html == """<p id="line_0"><b>test</b></p>""" def test_basic_table(self): html = parse(u'|x|y|z|\n|a|b|c|\n|d|e|f|\ntest') assert html == """ <table id="line_0"> <tr> <td>x</td> <td>y</td> <td>z</td> </tr> <tr> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <td>d</td> <td>e</td> <td>f</td> </tr> </table> <p id="line_3">test</p> """ def test_table_with_head(self): html = parse(u'|=x|y|=z=|\n|a|b|c|\n|d|e|=f=|') assert html == """ <table id="line_0"> <thead><tr> <th>x</th> <td>y</td> <th>z</th> </tr></thead> <tr> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <td>d</td> <td>e</td> <th>f</th> </tr> </table> """ def test_free_url(self): html = parse(u'test http://example.com/test test') assert html == """ <p id="line_0"> test <a href="http://example.com/test"> http://example.com/test </a> test </p> """ def test_free_url_with_commas(self): html = parse(u'http://example.com/,test, test') assert html == """ <p id="line_0"> <a href="http://example.com/,test">http://example.com/,test</a>, test </p> """ def test_free_url_with_parens(self): html = parse(u'(http://example.com/test)') assert html == """ <p id="line_0"> (<a href="http://example.com/test">http://example.com/test</a>) </p> """ # This might be considered a bug, but impossible to detect in general. html = parse(u'http://example.com/(test)') assert html == """ <p id="line_0"> <a href="http://example.com/(test">http://example.com/(test</a>) </p> """ def test_free_url_with_query_string(self): html = parse(u'http://example.com/test?test&test=1') assert html == """ <p id="line_0"> <a href="http://example.com/test?test&test=1"> http://example.com/test?test&test=1 </a></p> """ def test_free_url_with_tilde(self): html = parse(u'http://example.com/~test') assert html == """ <p id="line_0"> <a href="http://example.com/~test">http://example.com/~test</a> </p> """ def test_wiki_link(self): html = parse(u'[[test]] [[tset|test]]') assert html == """ <p id="line_0"> <a href="test">test</a> <a href="tset">test</a> </p> """ def test_url_link(self): html = parse(u'[[http://example.com|test]]') assert html == """ <p id="line_0"> <a href="http://example.com">test</a> </p> """ def test_pre(self): html = parse(u'{{{\nlorem ipsum\n}}}') assert html == """<pre id="line_1" class="code">lorem ipsum</pre>""" def test_text(self): html = parse(u'{{{#!text\nlorem ipsum\n}}}') assert html == """<div class="highlight"><pre><span id="line_1">lorem ipsum</span></pre></div>""" def test_highlight(self): html = parse(u'{{{#!c++\nint eger;\n}}}') assert html == """<div class="highlight"><pre><span id="line_1"><span class="kt">int</span> <span class="n">eger</span><span class="p">;</span></span></pre></div>""" def test_basic_table(self): html = parse(u'|table|') assert html == """<table id="line_0"><tr><td>table</td></tr></table>""" def test_two_cell_table(self): html = parse(u'|table| cell |') assert html == """<table id="line_0"><tr><td>table</td><td> cell </td></tr></table>""" def test_table_head(self): html = parse(u'|table|=head=|') assert html == """<table id="line_0"><tr><td>table</td><th>head</th></tr></table>""" def test_table_head_row(self): html = parse(u'|=table=|=head=|') assert html == """<table id="line_0"><thead><tr><th>table</th><th>head</th></tr></thead></table>""" def test_table_link(self): html = parse(u'|table|[[link|link]]|') assert html == """<table id="line_0"><tr><td>table</td><td><a href="link">link</a></td></tr></table>""" def test_table_image(self): html = parse(u'|table|{{img|img}}|') assert html == """<table id="line_0"><tr><td>table</td><td><img src="img" alt="img"></td></tr></table>""" def test_table_pre(self): html = parse(u'|table|{{{code|code}}}|') assert html == """<table id="line_0"><tr><td>table</td><td><code>code|code</code></td></tr></table>""" def test_wiki_word(self): html = wiki_parse(u'some wikiWord, here') assert html == """<p id="line_0">some <a href="wikiWord">wikiWord</a>, here</p>""" def test_wiki_word_escape(self): html = wiki_parse(u'no !wikiWord here, ~wikiWord') assert html == """<p id="line_0">no wikiWord here, wikiWord</p>""" def test_emoticon(self): html = parse(u'lol:)') assert html == """<p id="line_0">lol<img src="smile.png" alt=":)"></p>""" def test_monotype(self): html = parse(u'This is ##monotyped## text.') assert html == """<p id="line_0">This is <tt>monotyped</tt> text.</p>""" def test_inline_quote(self): html = parse(u'> //Simple// quote with\n> one paragraph') assert html == """ <blockquote> <p id="line_0"><i>Simple</i> quote with\none paragraph</p> </blockquote> """ def test_block_quote(self): html = parse(u'> //Complex// quote\n> with\n>\n> = extra markup') assert html == """ <blockquote> <p id="line_0"><i>Complex</i> quote\nwith</p> <a name="head-1"></a><h1 id="line_3">extra markup</h1> </blockquote> """ def test_nested_quotes(self): html = parse(u'> Outer quote\n>> Inner quote') assert html == """ <blockquote> <p id="line_0">Outer quote</p> <blockquote> <p id="line_1">Inner quote</p> </blockquote> </blockquote> """
