1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
#! /usr/bin/env python3
# $Id: test_replace.py 9425 2023-06-30 14:56:47Z milde $
# Author: David Goodger <goodger@python.org>
# Copyright: This module has been placed in the public domain.
"""
Tests for misc.py "replace" directive.
"""
from pathlib import Path
import sys
import unittest
if __name__ == '__main__':
# prepend the "docutils root" to the Python library path
# so we import the local `docutils` package.
sys.path.insert(0, str(Path(__file__).resolve().parents[4]))
from docutils.frontend import get_default_settings
from docutils.parsers.rst import Parser
from docutils.utils import new_document
class ParserTestCase(unittest.TestCase):
def test_parser(self):
parser = Parser()
settings = get_default_settings(Parser)
settings.warning_stream = ''
for name, cases in totest.items():
for casenum, (case_input, case_expected) in enumerate(cases):
with self.subTest(id=f'totest[{name!r}][{casenum}]'):
document = new_document('test data', settings.copy())
parser.parse(case_input, document)
output = document.pformat()
self.assertEqual(case_expected, output)
totest = {}
totest['replace'] = [
["""\
Test the |name| directive.
.. |name| replace:: "**replace**"
""",
"""\
<document source="test data">
<paragraph>
Test the \n\
<substitution_reference refname="name">
name
directive.
<substitution_definition names="name">
"
<strong>
replace
"
"""],
["""\
.. |name| replace:: paragraph 1
paragraph 2
""",
"""\
<document source="test data">
<system_message level="3" line="1" source="test data" type="ERROR">
<paragraph>
Error in "replace" directive: may contain a single paragraph only.
<system_message level="2" line="1" source="test data" type="WARNING">
<paragraph>
Substitution definition "name" empty or invalid.
<literal_block xml:space="preserve">
.. |name| replace:: paragraph 1
\n\
paragraph 2
"""],
["""\
.. |name| replace::
""",
"""\
<document source="test data">
<system_message level="3" line="1" source="test data" type="ERROR">
<paragraph>
Content block expected for the "replace" directive; none found.
<literal_block xml:space="preserve">
replace::
<system_message level="2" line="1" source="test data" type="WARNING">
<paragraph>
Substitution definition "name" empty or invalid.
<literal_block xml:space="preserve">
.. |name| replace::
"""],
["""\
.. |Python| replace:: Python, *the* best language around
.. _Python: http://www.python.org/
I recommend you try |Python|_.
""",
"""\
<document source="test data">
<substitution_definition names="Python">
Python, \n\
<emphasis>
the
best language around
<target ids="python" names="python" refuri="http://www.python.org/">
<paragraph>
I recommend you try \n\
<reference refname="python">
<substitution_reference refname="Python">
Python
.
"""],
["""\
.. |name| replace:: *error in **inline ``markup
""",
"""\
<document source="test data">
<system_message ids="system-message-1" level="2" line="1" source="test data" type="WARNING">
<paragraph>
Inline emphasis start-string without end-string.
<system_message ids="system-message-2" level="2" line="1" source="test data" type="WARNING">
<paragraph>
Inline strong start-string without end-string.
<system_message ids="system-message-3" level="2" line="1" source="test data" type="WARNING">
<paragraph>
Inline literal start-string without end-string.
<system_message level="3" line="1" source="test data" type="ERROR">
<paragraph>
Substitution definition contains illegal element <problematic>:
<literal_block xml:space="preserve">
<problematic ids="problematic-1" refid="system-message-1">
*
<literal_block xml:space="preserve">
.. |name| replace:: *error in **inline ``markup
"""],
["""\
.. replace:: not valid outside of a substitution definition
""",
"""\
<document source="test data">
<system_message level="3" line="1" source="test data" type="ERROR">
<paragraph>
Invalid context: the "replace" directive can only be used within a substitution definition.
<literal_block xml:space="preserve">
.. replace:: not valid outside of a substitution definition
"""],
]
if __name__ == '__main__':
unittest.main()
|