469 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			469 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
| 
 | |
| """ rst generation tests
 | |
| """
 | |
| import py
 | |
| py.test.importorskip("docutils")
 | |
| from py.__.rest.rst import *
 | |
| from py.__.misc.rest import process as restcheck
 | |
| import traceback
 | |
| 
 | |
| tempdir = py.test.ensuretemp('rest')
 | |
| def checkrest(rest):
 | |
|     fname = traceback.extract_stack()[-2][2]
 | |
|     i = 0
 | |
|     while True:
 | |
|         if i == 0:
 | |
|             filename = '%s.txt' % (fname,)
 | |
|         else:
 | |
|             filename = '%s_%s.txt' % (fname, i)
 | |
|         tempfile = tempdir.join(filename)
 | |
|         if not tempfile.check():
 | |
|             break
 | |
|         i += 1
 | |
|     tempfile.write(rest)
 | |
|     restcheck(tempfile)
 | |
|     return tempfile.new(ext='.html').read()
 | |
| 
 | |
| def test_escape_text():
 | |
|     txt = Paragraph('*escape* ``test``').text()
 | |
|     assert txt == '\\*escape\\* \\`\\`test\\`\\`'
 | |
|     html = checkrest(txt)
 | |
|     assert '*escape* ``test``' in html
 | |
| 
 | |
| def test_escape_markup_simple():
 | |
|     txt = Paragraph(Em('*em*')).text()
 | |
|     assert txt == '*\\*em\\**'
 | |
|     html = checkrest(txt)
 | |
|     assert '<em>*em*</em>' in html
 | |
| 
 | |
| def test_escape_underscore():
 | |
|     txt = Rest(Paragraph('foo [1]_')).text()
 | |
|     assert txt == "foo [1]\\_\n"
 | |
|     html = checkrest(txt)
 | |
|     assert 'foo [1]_' in html
 | |
| 
 | |
| def test_escape_markup_spaces_docutils_nastyness():
 | |
|     txt = Rest(Paragraph(Em('foo *bar* baz'))).text()
 | |
|     assert txt == '*foo \\*bar\\* baz*\n'
 | |
|     html = checkrest(txt)
 | |
|     assert '<em>foo *bar* baz</em>' in html
 | |
| 
 | |
| def test_escape_literal():
 | |
|     txt = LiteralBlock('*escape* ``test``').text()
 | |
|     assert txt == '::\n\n  *escape* ``test``'
 | |
|     html = checkrest(txt)
 | |
|     assert '>\n*escape* ``test``\n</pre>' in html
 | |
| 
 | |
| def test_escape_markup_obvious():
 | |
|     txt = Em('foo*bar').text()
 | |
|     assert txt == '*foo\\*bar*'
 | |
|     html = checkrest(txt)
 | |
|     assert '<em>foo*bar</em>' in html
 | |
| 
 | |
| def test_escape_markup_text_1():
 | |
|     txt = Paragraph(Em('foo'), "*bar").text()
 | |
|     assert txt == '*foo* \\*bar'
 | |
|     html = checkrest(txt)
 | |
|     assert '<em>foo</em> *bar' in html
 | |
| 
 | |
| def test_escape_markup_text_2():
 | |
|     txt = Paragraph(Em('foo'), "bar*").text()
 | |
|     assert txt == '*foo* bar\\*'
 | |
|     html = checkrest(txt)
 | |
|     assert '<em>foo</em> bar*' in html
 | |
| 
 | |
| def test_illegal_parent():
 | |
|     Rest(Paragraph(Text('spam')))
 | |
|     py.test.raises(RestError, 'Rest(Text("spam"))')
 | |
|     py.test.raises(RestError, 'ListItem(Paragraph(Text("eggs")))')
 | |
| 
 | |
| def test_text_basic():
 | |
|     txt = Text("dupa").text()
 | |
|     assert txt == "dupa"
 | |
| 
 | |
| def test_basic_inline():
 | |
|     txt = Em('foo').text()
 | |
|     assert txt == '*foo*'
 | |
| 
 | |
| def test_basic_inline_2():
 | |
|     txt = Strong('bar').text()
 | |
|     assert txt == '**bar**'
 | |
| 
 | |
| def test_text_multiple_arguments():
 | |
|     txt = Paragraph(Text("dupa"), Text("dupa")).text()
 | |
|     assert txt == "dupa dupa"
 | |
| 
 | |
| def test_text_join():
 | |
|     txt = Paragraph(Text("worse things"))
 | |
|     txt = txt.join(Text("happen at sea"), Text("you know"))
 | |
|     assert txt.text() == "worse things happen at sea you know"
 | |
| 
 | |
| def test_text_add():
 | |
|     p = Paragraph(Text('grmbl'))
 | |
|     p2 = p.add(Text('grmbl too'))
 | |
|     assert p2.text() == 'grmbl too'
 | |
|     assert p.text() == 'grmbl grmbl too'
 | |
| 
 | |
| def test_paragraph_basic():
 | |
|     txt = Paragraph(Text('spam')).text()
 | |
|     assert txt == 'spam'
 | |
| 
 | |
| def test_paragraph_string():
 | |
|     txt = Paragraph("eggs").text()
 | |
|     assert txt == "eggs"
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_paragraph_join():
 | |
|     txt = Rest(Paragraph(Text("a")), Paragraph(Text("b"))).text()
 | |
|     assert txt == "a\n\nb\n"
 | |
| 
 | |
| def test_paragraph_indent():
 | |
|     txt = Paragraph(Text("a"), indent=" ").text()
 | |
|     assert txt == " a"
 | |
|     checkrest(txt)
 | |
|     txt = Paragraph(Text("  a "), indent=" ").text()
 | |
|     assert txt == " a"
 | |
| 
 | |
| def test_paragraph_width():
 | |
|     txt = Paragraph(Text("a b c d e f"), width=3, indent=" ").text()
 | |
|     assert txt == ' a\n b\n c\n d\n e\n f'
 | |
|     checkrest(txt)
 | |
|     text = """
 | |
| Lorem ipsum dolor sit amet, consectetuer
 | |
| adipiscing elit. Vestibulum malesuada
 | |
| eleifend leo. Sed faucibus commodo libero. 
 | |
| Mauris elementum fringilla velit. Ut
 | |
| sem urna, aliquet sed, molestie at, viverra 
 | |
| id, justo. In ornare lacinia turpis. Etiam 
 | |
| et ipsum. Quisque at lacus. Etiam 
 | |
| pellentesque, enim porta pulvinar viverra, 
 | |
| libero elit iaculis justo, vitae convallis 
 | |
| pede purus vel arcu. Morbi aliquam lacus 
 | |
| et urna. Donec commodo pellentesque mi.
 | |
| """
 | |
|     expected = """\
 | |
| Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum malesuada
 | |
| eleifend leo. Sed faucibus commodo libero. Mauris elementum fringilla velit. Ut
 | |
| sem urna, aliquet sed, molestie at, viverra id, justo. In ornare lacinia
 | |
| turpis. Etiam et ipsum. Quisque at lacus. Etiam pellentesque, enim porta
 | |
| pulvinar viverra, libero elit iaculis justo, vitae convallis pede purus vel
 | |
| arcu. Morbi aliquam lacus et urna. Donec commodo pellentesque mi."""
 | |
|     txt = Paragraph(text, width=80).text()
 | |
|     print repr(txt)
 | |
|     print repr(expected)
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_paragraph_stripping():
 | |
|     txt = Paragraph(Text('\n foo bar\t')).text()
 | |
|     assert txt == 'foo bar'
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_blockquote():
 | |
|     expected = """\
 | |
| Text
 | |
| 
 | |
| ::
 | |
| 
 | |
|   def fun():
 | |
|    some
 | |
| 
 | |
| Paragraph
 | |
| """
 | |
|     txt = Rest(Paragraph("Text"), LiteralBlock("def fun():\n some"), \
 | |
|                Paragraph("Paragraph")).text()
 | |
|     print repr(txt)
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_blockquote_empty():
 | |
|     expected = """\
 | |
| Foo
 | |
| 
 | |
| Bar
 | |
| """
 | |
|     txt = Rest(Paragraph('Foo'), LiteralBlock(''), Paragraph('Bar')).text()
 | |
|     print repr(txt)
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_title():
 | |
|     txt = Title(Text("Some title"), belowchar="=").text()
 | |
|     assert txt == "Some title\n=========="
 | |
|     checkrest(txt)
 | |
|     txt =  Title("Some title", belowchar="#", abovechar="#").text()
 | |
|     assert txt == "##########\nSome title\n##########"
 | |
|     html = checkrest(txt)
 | |
|     assert '>Some title</h1>' in html
 | |
| 
 | |
| def test_title_long():
 | |
|     txt = Title('Some very long title that doesn\'t fit on a single line '
 | |
|                 'but still should not be split into multiple lines').text()
 | |
|     assert txt == ("Some very long title that doesn't fit on a single line "
 | |
|                    "but still should not be split into multiple lines\n"
 | |
|                    "======================================================="
 | |
|                    "=================================================")
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_title_long_with_markup():
 | |
|     txt = Title('Some very long title with', Em('some markup'),
 | |
|                 'to test whether that works as expected too...').text()
 | |
|     assert txt == ("Some very long title with *some markup* to test whether "
 | |
|                    "that works as expected too...\n"
 | |
|                    "========================================================"
 | |
|                    "=============================")
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_title_escaping():
 | |
|     txt = Title('foo *bar* baz').text()
 | |
|     assert txt == 'foo \\*bar\\* baz\n==============='
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_link():
 | |
|     expected = "`some link`_\n\n.. _`some link`: http://codespeak.net\n\n"
 | |
|     txt = Rest(Paragraph(Link("some link", "http://codespeak.net"))).text()
 | |
|     assert txt == expected
 | |
|     html = checkrest(txt)
 | |
|     assert ' href="http://codespeak.net">some link</a>' in html
 | |
| 
 | |
| def test_link_same_text_and_target():
 | |
|     txt = Rest(Paragraph(Link('some link', 'bar'), 'foo',
 | |
|                          Link('some link', 'bar'))
 | |
|                          ).text()
 | |
|     expected = '`some link`_ foo `some link`_\n\n.. _`some link`: bar\n\n'
 | |
|     assert txt == expected
 | |
| 
 | |
| def test_link_same_text_different_target():
 | |
|     py.test.raises(ValueError, ("Rest(Paragraph(Link('some link', 'foo'),"
 | |
|                                   "Link('some link', 'bar'))).text()"))
 | |
| 
 | |
| def test_text_multiline():
 | |
|     expected = """\
 | |
| Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum malesuada
 | |
| eleifend leo. Sed faucibus commodo libero. Mauris elementum fringilla velit. Ut
 | |
| sem urna, aliquet sed, molestie at, viverra id, justo. In ornare lacinia
 | |
| turpis. Etiam et ipsum. Quisque at lacus. Etiam pellentesque, enim porta
 | |
| pulvinar viverra, libero elit iaculis justo, vitae convallis pede purus vel
 | |
| arcu. Morbi aliquam lacus et urna. Donec commodo pellentesque mi.
 | |
| """
 | |
|     txt = Rest(Paragraph('Lorem ipsum dolor sit amet, consectetuer adipiscing '
 | |
|                          'elit. Vestibulum malesuada eleifend leo. Sed '
 | |
|                          'faucibus commodo libero. Mauris elementum fringilla '
 | |
|                          'velit. Ut sem urna, aliquet sed, molestie at, '
 | |
|                          'viverra id, justo. In ornare lacinia turpis. Etiam '
 | |
|                          'et ipsum. Quisque at lacus. Etiam pellentesque, '
 | |
|                          'enim porta pulvinar viverra, libero elit iaculis '
 | |
|                          'justo, vitae convallis pede purus vel arcu. Morbi '
 | |
|                          'aliquam lacus et urna. Donec commodo pellentesque '
 | |
|                          'mi.')).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_text_indented():
 | |
|     expected = """\
 | |
| This is a paragraph with some indentation. The indentation should be removed
 | |
| and the lines split up nicely. This is still part of the first paragraph.
 | |
| """
 | |
|     txt = Rest(Paragraph('This is a paragraph with some\n'
 | |
|                          '    indentation. The indentation\n'
 | |
|                          ' should be removed and the lines split up nicely.\n'
 | |
|                          '\nThis is still part of the first paragraph.')
 | |
|                          ).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_text_strip():
 | |
|     expected = "foo\n"
 | |
|     txt = Rest(Paragraph(Text(' foo '))).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_list():
 | |
|     expected = "* a\n\n* b\n"
 | |
|     txt = Rest(ListItem("a"), ListItem("b")).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_list_item_multiple_args():
 | |
|     expected = "* foo bar baz\n"
 | |
|     txt = Rest(ListItem('foo', 'bar', 'baz')).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_list_multiline():
 | |
|     expected = """\
 | |
| * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum
 | |
|   malesuada eleifend leo. Sed faucibus commodo libero.
 | |
| 
 | |
| * Mauris elementum fringilla velit. Ut sem urna, aliquet sed, molestie at,
 | |
|   viverra id, justo. In ornare lacinia turpis. Etiam et ipsum. Quisque at
 | |
|   lacus.
 | |
| 
 | |
| * Etiam pellentesque, enim porta pulvinar viverra, libero elit iaculis justo,
 | |
|   vitae convallis pede purus vel arcu. Morbi aliquam lacus et urna. Donec
 | |
|   commodo pellentesque mi.
 | |
| """
 | |
|     txt = Rest(ListItem('Lorem ipsum dolor sit amet, consectetuer adipiscing '
 | |
|                         'elit. Vestibulum malesuada eleifend leo. Sed '
 | |
|                         'faucibus commodo libero.'),
 | |
|                ListItem('Mauris elementum fringilla velit. Ut sem urna, '
 | |
|                         'aliquet sed, molestie at, viverra id, justo. In '
 | |
|                         'ornare lacinia turpis. Etiam et ipsum. Quisque at '
 | |
|                         'lacus.'),
 | |
|                ListItem('Etiam pellentesque, enim porta pulvinar viverra, '
 | |
|                         'libero elit iaculis justo, vitae convallis pede '
 | |
|                         'purus vel arcu. Morbi aliquam lacus et urna. Donec '
 | |
|                         'commodo pellentesque mi.')).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_list_multiline_no_parent():
 | |
|     expected = ("* test **strong**\n  thisisaverylongwordthatdoesntfiton"
 | |
|                 "thepreviouslineandthereforeshouldbeindented")
 | |
|     txt = ListItem(Text('test'), Strong('strong'),
 | |
|                    Text('thisisaverylongwordthatdoesntfitontheprevious'
 | |
|                         'lineandthereforeshouldbeindented')).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_ordered_list():
 | |
|     expected = "#. foo\n\n#. bar\n\n#. baz\n"
 | |
|     txt = Rest(OrderedListItem('foo'), OrderedListItem('bar'),
 | |
|                OrderedListItem('baz')).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_nested_lists():
 | |
|     expected = """\
 | |
| * foo
 | |
| 
 | |
| * bar
 | |
| 
 | |
|   + baz
 | |
| """
 | |
|     txt = Rest(ListItem('foo'), ListItem('bar', ListItem('baz'))).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_nested_nested_lists():
 | |
|     expected = """\
 | |
| * foo
 | |
| 
 | |
|   + bar
 | |
| 
 | |
|     - baz
 | |
| 
 | |
|   + qux
 | |
| 
 | |
| * quux
 | |
| """
 | |
|     txt = Rest(ListItem('foo', ListItem('bar', ListItem('baz')),
 | |
|                                ListItem('qux')), ListItem('quux')).text()
 | |
|     print txt
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_definition_list():
 | |
|     expected = """\
 | |
| foo
 | |
|   bar, baz and qux!
 | |
| 
 | |
| spam
 | |
|   eggs, spam, spam, eggs, spam and spam...
 | |
| """
 | |
|     txt = Rest(DListItem("foo", "bar, baz and qux!"),
 | |
|                DListItem("spam", "eggs, spam, spam, eggs, spam and spam...")
 | |
|                ).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_nested_dlists():
 | |
|     expected = """\
 | |
| foo
 | |
|   bar baz
 | |
| 
 | |
|   qux
 | |
|     quux
 | |
| """
 | |
|     txt = Rest(DListItem('foo', 'bar baz', DListItem('qux', 'quux'))).text()
 | |
|     assert txt == expected
 | |
| 
 | |
| def test_nested_list_dlist():
 | |
|     expected = """\
 | |
| * foo
 | |
| 
 | |
|   foobar
 | |
|     baz
 | |
| """
 | |
|     txt = Rest(ListItem('foo', DListItem('foobar', 'baz'))).text()
 | |
|     assert txt == expected
 | |
| 
 | |
| def test_transition():
 | |
|     txt = Rest(Paragraph('foo'), Transition(), Paragraph('bar')).text()
 | |
|     assert txt == 'foo\n\n%s\n\nbar\n' % ('-' * 79,)
 | |
|     checkrest(txt)
 | |
|     txt = Rest(Paragraph('foo'), Transition('+'), Paragraph('bar')).text()
 | |
|     assert txt == 'foo\n\n%s\n\nbar\n' % ('+' * 79,)
 | |
|     checkrest(txt)
 | |
| 
 | |
|     py.test.raises(ValueError, 'Rest(Transition(), Paragraph("foo")).text()')
 | |
|     py.test.raises(ValueError, 'Rest(Paragraph("foo"), Transition()).text()')
 | |
| 
 | |
| def test_directive_simple():
 | |
|     txt = Rest(Directive('image', 'images/foo.png')).text()
 | |
|     assert txt == '.. image:: images/foo.png\n'
 | |
| 
 | |
| def test_directive_metadata():
 | |
|     txt = Rest(Directive('image', 'images/foo.png',
 | |
|                          width=200, height=150)).text()
 | |
|     assert txt == ('.. image:: images/foo.png\n   :width: 200\n'
 | |
|                    '   :height: 150\n')
 | |
| 
 | |
| def test_directive_multiline():
 | |
|     txt = Rest(Directive('note', ('This is some string that is too long to '
 | |
|                                   'fit on a single line, so it should be '
 | |
|                                   'broken up.'))).text()
 | |
|     assert txt == """\
 | |
| .. note:: This is some string that is too long to fit on a single line, so it
 | |
|    should be broken up.
 | |
| """
 | |
| 
 | |
| def test_directive_content():
 | |
|     txt = Rest(Directive('image', 'foo.png', width=200, height=100,
 | |
|                          content=[Paragraph('Some paragraph content.')])).text()
 | |
|     assert txt == """\
 | |
| .. image:: foo.png
 | |
|    :width: 200
 | |
|    :height: 100
 | |
| 
 | |
|    Some paragraph content.
 | |
| """
 | |
| 
 | |
| def test_title_following_links_empty_line():
 | |
|     expected = """\
 | |
| Foo, bar and `baz`_
 | |
| 
 | |
| Spam
 | |
| ====
 | |
| 
 | |
| Spam, eggs and spam.
 | |
| 
 | |
| .. _`baz`: http://www.baz.com
 | |
| 
 | |
| """
 | |
|     txt = Rest(Paragraph("Foo, bar and ", Link("baz", "http://www.baz.com")),
 | |
|                Title('Spam'), Paragraph('Spam, eggs and spam.')).text()
 | |
|     assert txt == expected
 | |
|     checkrest(txt)
 | |
| 
 | |
| def test_nonstring_text():
 | |
|     expected = """\
 | |
| <foobar>
 | |
| """
 | |
|     class FooBar(object):
 | |
|         def __str__(self):
 | |
|             return '<foobar>'
 | |
|     txt = Rest(Paragraph(Text(FooBar()))).text()
 | |
|     assert txt == expected
 | |
| 
 |