2013-02-05 08:57:26 -06:00
|
|
|
"""Test the build process with Text builder with the test root."""
|
|
|
|
|
2024-07-22 20:22:58 -05:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
|
2018-02-19 07:39:14 -06:00
|
|
|
import pytest
|
2013-02-05 08:57:26 -06:00
|
|
|
from docutils.utils import column_width
|
2018-02-19 07:39:14 -06:00
|
|
|
|
2020-11-11 05:00:27 -06:00
|
|
|
from sphinx.writers.text import MAXWIDTH, Cell, Table
|
2013-02-05 08:57:26 -06:00
|
|
|
|
2024-07-22 20:22:58 -05:00
|
|
|
if TYPE_CHECKING:
|
|
|
|
from typing import Any
|
|
|
|
|
2013-02-05 08:57:26 -06:00
|
|
|
|
2024-07-22 20:22:58 -05:00
|
|
|
def with_text_app(*args: Any, **kw: Any) -> pytest.MarkDecorator:
|
2024-08-12 16:34:03 -05:00
|
|
|
return pytest.mark.sphinx(*args, buildername='text', testroot='build-text', **kw)
|
2013-02-05 08:57:26 -06:00
|
|
|
|
|
|
|
|
2013-03-09 07:58:47 -06:00
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_maxwitdh_with_prefix(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'maxwidth.txt').read_text(encoding='utf8')
|
2013-03-09 07:58:47 -06:00
|
|
|
|
|
|
|
lines = result.splitlines()
|
|
|
|
line_widths = [column_width(line) for line in lines]
|
|
|
|
assert max(line_widths) < MAXWIDTH
|
2019-11-27 11:00:26 -06:00
|
|
|
assert lines[0].startswith('See also:')
|
|
|
|
assert lines[1].startswith('')
|
|
|
|
assert lines[2].startswith(' ham')
|
|
|
|
assert lines[3].startswith(' ham')
|
|
|
|
assert lines[4] == ''
|
|
|
|
assert lines[5].startswith('* ham')
|
|
|
|
assert lines[6].startswith(' ham')
|
|
|
|
assert lines[7] == ''
|
|
|
|
assert lines[8].startswith('* ham')
|
|
|
|
assert lines[9].startswith(' ham')
|
|
|
|
assert lines[10] == ''
|
|
|
|
assert lines[11].startswith('spam egg')
|
2013-03-09 07:58:47 -06:00
|
|
|
|
|
|
|
|
2013-03-09 08:14:31 -06:00
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_lineblock(app):
|
2013-03-09 08:14:31 -06:00
|
|
|
# regression test for #1109: need empty line after line block
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'lineblock.txt').read_text(encoding='utf8')
|
2013-03-09 08:14:31 -06:00
|
|
|
expect = (
|
2024-08-11 08:58:56 -05:00
|
|
|
'* one\n'
|
|
|
|
'\n'
|
|
|
|
' line-block 1\n'
|
|
|
|
' line-block 2\n'
|
|
|
|
'\n'
|
|
|
|
'followed paragraph.\n'
|
2014-09-21 10:17:02 -05:00
|
|
|
)
|
2013-03-09 08:14:31 -06:00
|
|
|
assert result == expect
|
|
|
|
|
|
|
|
|
2013-02-05 08:57:26 -06:00
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_nonascii_title_line(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'nonascii_title.txt').read_text(encoding='utf8')
|
2018-01-14 10:01:13 -06:00
|
|
|
expect_underline = '*********'
|
2016-08-19 09:46:54 -05:00
|
|
|
result_underline = result.splitlines()[1].strip()
|
2024-08-11 08:58:56 -05:00
|
|
|
assert result_underline == expect_underline
|
2013-02-05 09:29:59 -06:00
|
|
|
|
|
|
|
|
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_nonascii_table(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'nonascii_table.txt').read_text(encoding='utf8')
|
2013-02-05 09:29:59 -06:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
|
|
|
line_widths = [column_width(line) for line in lines]
|
|
|
|
assert len(set(line_widths)) == 1 # same widths
|
2013-02-06 21:34:51 -06:00
|
|
|
|
|
|
|
|
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_nonascii_maxwidth(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'nonascii_maxwidth.txt').read_text(encoding='utf8')
|
2013-02-06 21:34:51 -06:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
|
|
|
line_widths = [column_width(line) for line in lines]
|
|
|
|
assert max(line_widths) < MAXWIDTH
|
2014-08-26 06:52:02 -05:00
|
|
|
|
|
|
|
|
2018-10-23 11:40:30 -05:00
|
|
|
def test_table_builder():
|
|
|
|
table = Table([6, 6])
|
2024-08-11 08:58:56 -05:00
|
|
|
table.add_cell(Cell('foo'))
|
|
|
|
table.add_cell(Cell('bar'))
|
|
|
|
table_str = str(table).split('\n')
|
|
|
|
assert table_str[0] == '+--------+--------+'
|
|
|
|
assert table_str[1] == '| foo | bar |'
|
|
|
|
assert table_str[2] == '+--------+--------+'
|
|
|
|
assert repr(table).count('<Cell ') == 2
|
2018-10-23 11:40:30 -05:00
|
|
|
|
|
|
|
|
|
|
|
def test_table_separator():
|
|
|
|
table = Table([6, 6])
|
2024-08-11 08:58:56 -05:00
|
|
|
table.add_cell(Cell('foo'))
|
|
|
|
table.add_cell(Cell('bar'))
|
2018-10-23 11:40:30 -05:00
|
|
|
table.set_separator()
|
|
|
|
table.add_row()
|
2024-08-11 08:58:56 -05:00
|
|
|
table.add_cell(Cell('FOO'))
|
|
|
|
table.add_cell(Cell('BAR'))
|
|
|
|
table_str = str(table).split('\n')
|
|
|
|
assert table_str[0] == '+--------+--------+'
|
|
|
|
assert table_str[1] == '| foo | bar |'
|
|
|
|
assert table_str[2] == '|========|========|'
|
|
|
|
assert table_str[3] == '| FOO | BAR |'
|
|
|
|
assert table_str[4] == '+--------+--------+'
|
|
|
|
assert repr(table).count('<Cell ') == 4
|
2018-10-23 11:40:30 -05:00
|
|
|
|
|
|
|
|
|
|
|
def test_table_cell():
|
2024-08-11 08:58:56 -05:00
|
|
|
cell = Cell('Foo bar baz')
|
2018-10-23 11:40:30 -05:00
|
|
|
cell.wrap(3)
|
2024-08-11 08:58:56 -05:00
|
|
|
assert 'Cell' in repr(cell)
|
|
|
|
assert cell.wrapped == ['Foo', 'bar', 'baz']
|
2018-10-23 11:40:30 -05:00
|
|
|
|
|
|
|
|
2014-08-26 06:52:02 -05:00
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_table_with_empty_cell(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'table.txt').read_text(encoding='utf8')
|
2014-08-26 06:52:02 -05:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '+-------+-------+'
|
|
|
|
assert lines[1] == '| XXX | XXX |'
|
|
|
|
assert lines[2] == '+-------+-------+'
|
|
|
|
assert lines[3] == '| | XXX |'
|
|
|
|
assert lines[4] == '+-------+-------+'
|
|
|
|
assert lines[5] == '| XXX | |'
|
|
|
|
assert lines[6] == '+-------+-------+'
|
2015-03-30 05:54:17 -05:00
|
|
|
|
|
|
|
|
2018-10-21 18:14:19 -05:00
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_table_with_rowspan(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'table_rowspan.txt').read_text(encoding='utf8')
|
2018-10-21 18:14:19 -05:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '+-------+-------+'
|
|
|
|
assert lines[1] == '| XXXXXXXXX |'
|
|
|
|
assert lines[2] == '+-------+-------+'
|
|
|
|
assert lines[3] == '| | XXX |'
|
|
|
|
assert lines[4] == '+-------+-------+'
|
|
|
|
assert lines[5] == '| XXX | |'
|
|
|
|
assert lines[6] == '+-------+-------+'
|
2018-10-21 18:14:19 -05:00
|
|
|
|
|
|
|
|
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_table_with_colspan(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'table_colspan.txt').read_text(encoding='utf8')
|
2018-10-21 18:14:19 -05:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '+-------+-------+'
|
|
|
|
assert lines[1] == '| XXX | XXX |'
|
|
|
|
assert lines[2] == '+-------+-------+'
|
|
|
|
assert lines[3] == '| | XXX |'
|
|
|
|
assert lines[4] == '+-------+ |'
|
|
|
|
assert lines[5] == '| XXX | |'
|
|
|
|
assert lines[6] == '+-------+-------+'
|
2018-10-21 18:14:19 -05:00
|
|
|
|
|
|
|
|
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_table_with_colspan_left(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'table_colspan_left.txt').read_text(encoding='utf8')
|
2018-10-21 18:14:19 -05:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '+-------+-------+'
|
|
|
|
assert lines[1] == '| XXX | XXX |'
|
|
|
|
assert lines[2] == '+-------+-------+'
|
|
|
|
assert lines[3] == '| XXX | XXX |'
|
|
|
|
assert lines[4] == '| +-------+'
|
|
|
|
assert lines[5] == '| | |'
|
|
|
|
assert lines[6] == '+-------+-------+'
|
2018-10-21 18:14:19 -05:00
|
|
|
|
|
|
|
|
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_table_with_colspan_and_rowspan(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'table_colspan_and_rowspan.txt').read_text(encoding='utf8')
|
2018-10-21 18:14:19 -05:00
|
|
|
lines = [line.strip() for line in result.splitlines() if line.strip()]
|
|
|
|
assert result
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '+-------+-------+-------+'
|
|
|
|
assert lines[1] == '| AAA | BBB |'
|
|
|
|
assert lines[2] == '+-------+-------+ |'
|
|
|
|
assert lines[3] == '| DDD | XXX | |'
|
|
|
|
assert lines[4] == '| +-------+-------+'
|
|
|
|
assert lines[5] == '| | CCC |'
|
|
|
|
assert lines[6] == '+-------+-------+-------+'
|
2018-10-21 18:14:19 -05:00
|
|
|
|
|
|
|
|
2015-03-30 05:54:17 -05:00
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_list_items_in_admonition(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build()
|
2022-04-26 21:04:19 -05:00
|
|
|
result = (app.outdir / 'listitems.txt').read_text(encoding='utf8')
|
2015-03-30 05:54:17 -05:00
|
|
|
lines = [line.rstrip() for line in result.splitlines()]
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == 'See also:'
|
|
|
|
assert lines[1] == ''
|
|
|
|
assert lines[2] == ' * item 1'
|
|
|
|
assert lines[3] == ''
|
|
|
|
assert lines[4] == ' * item 2'
|
2017-11-05 16:47:57 -06:00
|
|
|
|
|
|
|
|
|
|
|
@with_text_app()
|
2024-07-23 09:35:55 -05:00
|
|
|
def test_secnums(app):
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build(force_all=True)
|
2022-04-26 21:04:19 -05:00
|
|
|
index = (app.outdir / 'index.txt').read_text(encoding='utf8')
|
2018-09-03 07:38:31 -05:00
|
|
|
lines = index.splitlines()
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '* 1. Section A'
|
|
|
|
assert lines[1] == ''
|
|
|
|
assert lines[2] == '* 2. Section B'
|
|
|
|
assert lines[3] == ''
|
|
|
|
assert lines[4] == ' * 2.1. Sub Ba'
|
|
|
|
assert lines[5] == ''
|
|
|
|
assert lines[6] == ' * 2.2. Sub Bb'
|
2022-04-26 21:04:19 -05:00
|
|
|
doc2 = (app.outdir / 'doc2.txt').read_text(encoding='utf8')
|
2017-11-05 16:47:57 -06:00
|
|
|
expect = (
|
2024-08-11 08:58:56 -05:00
|
|
|
'2. Section B\n'
|
|
|
|
'************\n'
|
|
|
|
'\n'
|
|
|
|
'\n'
|
|
|
|
'2.1. Sub Ba\n'
|
|
|
|
'===========\n'
|
|
|
|
'\n'
|
|
|
|
'\n'
|
|
|
|
'2.2. Sub Bb\n'
|
|
|
|
'===========\n'
|
2017-11-05 16:47:57 -06:00
|
|
|
)
|
2017-11-07 17:10:11 -06:00
|
|
|
assert doc2 == expect
|
2017-11-05 16:47:57 -06:00
|
|
|
|
2024-08-11 08:58:56 -05:00
|
|
|
app.config.text_secnumber_suffix = ' '
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build(force_all=True)
|
2022-04-26 21:04:19 -05:00
|
|
|
index = (app.outdir / 'index.txt').read_text(encoding='utf8')
|
2018-09-03 07:38:31 -05:00
|
|
|
lines = index.splitlines()
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '* 1 Section A'
|
|
|
|
assert lines[1] == ''
|
|
|
|
assert lines[2] == '* 2 Section B'
|
|
|
|
assert lines[3] == ''
|
|
|
|
assert lines[4] == ' * 2.1 Sub Ba'
|
|
|
|
assert lines[5] == ''
|
|
|
|
assert lines[6] == ' * 2.2 Sub Bb'
|
2022-04-26 21:04:19 -05:00
|
|
|
doc2 = (app.outdir / 'doc2.txt').read_text(encoding='utf8')
|
2017-11-05 16:47:57 -06:00
|
|
|
expect = (
|
2024-08-11 08:58:56 -05:00
|
|
|
'2 Section B\n'
|
|
|
|
'***********\n'
|
|
|
|
'\n'
|
|
|
|
'\n'
|
|
|
|
'2.1 Sub Ba\n'
|
|
|
|
'==========\n'
|
|
|
|
'\n'
|
|
|
|
'\n'
|
|
|
|
'2.2 Sub Bb\n'
|
|
|
|
'==========\n'
|
2017-11-05 16:47:57 -06:00
|
|
|
)
|
2017-11-07 17:10:11 -06:00
|
|
|
assert doc2 == expect
|
2017-11-05 16:47:57 -06:00
|
|
|
|
2018-01-14 10:01:13 -06:00
|
|
|
app.config.text_add_secnumbers = False
|
2024-01-16 20:38:46 -06:00
|
|
|
app.build(force_all=True)
|
2022-04-26 21:04:19 -05:00
|
|
|
index = (app.outdir / 'index.txt').read_text(encoding='utf8')
|
2018-09-03 07:38:31 -05:00
|
|
|
lines = index.splitlines()
|
2024-08-11 08:58:56 -05:00
|
|
|
assert lines[0] == '* Section A'
|
|
|
|
assert lines[1] == ''
|
|
|
|
assert lines[2] == '* Section B'
|
|
|
|
assert lines[3] == ''
|
|
|
|
assert lines[4] == ' * Sub Ba'
|
|
|
|
assert lines[5] == ''
|
|
|
|
assert lines[6] == ' * Sub Bb'
|
2022-04-26 21:04:19 -05:00
|
|
|
doc2 = (app.outdir / 'doc2.txt').read_text(encoding='utf8')
|
2018-01-14 10:01:13 -06:00
|
|
|
expect = (
|
2024-08-11 08:58:56 -05:00
|
|
|
'Section B\n'
|
|
|
|
'*********\n'
|
|
|
|
'\n'
|
|
|
|
'\n'
|
|
|
|
'Sub Ba\n'
|
|
|
|
'======\n'
|
|
|
|
'\n'
|
|
|
|
'\n'
|
|
|
|
'Sub Bb\n'
|
|
|
|
'======\n'
|
2018-01-14 10:01:13 -06:00
|
|
|
)
|
|
|
|
assert doc2 == expect
|