|
""" rst generation tests |
""" |
|
from py.__.rest.rst import * |
from py.__.doc.conftest import 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 |
|
|