1 #! /usr/bin/env python3
4 # Author: David Goodger <goodger@python.org>
5 # Copyright: This module has been placed in the public domain.
8 Tests for interpreted text in docutils/parsers/rst/states.py.
11 from pathlib
import Path
15 if __name__
== '__main__':
16 # prepend the "docutils root" to the Python library path
17 # so we import the local `docutils` package.
18 sys
.path
.insert(0, str(Path(__file__
).resolve().parents
[3]))
20 from docutils
.frontend
import get_default_settings
21 from docutils
.parsers
.rst
import Parser
22 from docutils
.utils
import new_document
23 from docutils
.utils
.code_analyzer
import with_pygments
26 class ParserTestCase(unittest
.TestCase
):
27 def test_parser(self
):
29 del totest
['code_parsing']
32 settings
= get_default_settings(Parser
)
33 settings
.warning_stream
= ''
34 for name
, cases
in totest
.items():
35 for casenum
, (case_input
, case_expected
) in enumerate(cases
):
36 with self
.subTest(id=f
'totest[{name!r}][{casenum}]'):
37 document
= new_document('test data', settings
.copy())
38 parser
.parse(case_input
, document
)
39 output
= document
.pformat()
40 self
.assertEqual(case_expected
, output
)
50 <document source="test data">
59 <document source="test data">
68 <document source="test data">
74 `interpreted \\`title``
77 <document source="test data">
83 :title:`:not-role: interpreted`
86 <document source="test data">
89 :not-role: interpreted
92 `interpreted` but not \\`interpreted` [`] or ({[`] or [`]}) or `
95 <document source="test data">
99 but not `interpreted` [`] or ({[`] or [`]}) or `
102 `interpreted`-text `interpreted`: text `interpreted`:text `text`'s interpreted
105 <document source="test data">
121 `interpreted without closing backquote
124 <document source="test data">
126 <problematic ids="problematic-1" refid="system-message-1">
128 interpreted without closing backquote
129 <system_message backrefs="problematic-1" ids="system-message-1" level="2" line="1" source="test data" type="WARNING">
131 Inline interpreted text or phrase reference start-string without end-string.
134 `interpreted`:not a role if it contains whitespace:
137 <document source="test data">
141 :not a role if it contains whitespace:
144 :title:`` (empty interpreted text not recognized)
147 <document source="test data">
149 :title:`` (empty interpreted text not recognized)
152 :title:`\\ ` (interpreted text containing empty string)
155 <document source="test data">
158 (interpreted text containing empty string)
161 `\\ `:title: (interpreted text containing empty string (postfix))
164 <document source="test data">
167 (interpreted text containing empty string (postfix))
170 :title:`\\ non-empty`
173 <document source="test data">
179 :title:`\\ ` (trailing unquoted space)
182 <document source="test data">
185 <problematic ids="problematic-1" refid="system-message-1">
187 ` (trailing unquoted space)
188 <system_message backrefs="problematic-1" ids="system-message-1" level="2" line="1" source="test data" type="WARNING">
190 Inline interpreted text or phrase reference start-string without end-string.
193 Explicit roles for standard inline markup:
194 :emphasis:`emphasis`,
196 :literal:`inline literal text`.
199 <document source="test data">
201 Explicit roles for standard inline markup:
213 Simple explicit roles:
218 :title:`title reference`.
221 <document source="test data">
223 Simple explicit roles:
244 Code role for inline code snippets:
245 :code:`$\alpha = \\int_0^\\infty f(x) dx$`.
248 <document source="test data">
250 Code role for inline code snippets:
251 <literal classes="code">
252 $\x07lpha = \\int_0^\\infty f(x) dx$
257 totest
['code_parsing'] = [
262 Custom role based on code role:
263 :tex:`$\alpha = f(x)$`.
266 <document source="test data">
268 Custom role based on code role:
269 <literal classes="code tex latex">
270 <inline classes="literal string">
272 <inline classes="name builtin">
274 <inline classes="operator">
276 <inline classes="name builtin">
278 <inline classes="operator">
280 <inline classes="name builtin">
282 <inline classes="operator">
284 <inline classes="literal string">
289 Custom role based on code role:
291 .. role:: python(code)
295 Python code :python:`print("The end")`.
298 <document source="test data">
300 Custom role based on code role:
303 <literal classes="code testclass python3">
304 <inline classes="name builtin">
306 <inline classes="punctuation">
308 <inline classes="literal string double">
310 <inline classes="punctuation">
316 totest
['references'] = [
321 <document source="test data">
323 <reference refuri="https://peps.python.org/pep-0000">
330 <document source="test data">
332 <problematic ids="problematic-1" refid="system-message-1">
334 <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="1" source="test data" type="ERROR">
336 PEP number must be a number from 0 to 9999; "-1" is invalid.
342 <document source="test data">
344 <reference refuri="https://tools.ietf.org/html/rfc2822.html">
351 <document source="test data">
353 <problematic ids="problematic-1" refid="system-message-1">
355 <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="1" source="test data" type="ERROR">
357 RFC number must be a number greater than or equal to 1; "0" is invalid.
363 <document source="test data">
365 <reference refuri="https://tools.ietf.org/html/rfc2822.html#section1">
370 totest
['unknown_roles'] = [
375 <document source="test data">
377 <problematic ids="problematic-1" refid="system-message-1">
379 <system_message level="1" line="1" source="test data" type="INFO">
381 No role entry for "role" in module "docutils.parsers.rst.languages.en".
382 Trying "role" as canonical role name.
383 <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="1" source="test data" type="ERROR">
385 Unknown interpreted text role "role".
391 <document source="test data">
393 <problematic ids="problematic-1" refid="system-message-1">
395 <system_message level="1" line="1" source="test data" type="INFO">
397 No role entry for "role" in module "docutils.parsers.rst.languages.en".
398 Trying "role" as canonical role name.
399 <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="1" source="test data" type="ERROR">
401 Unknown interpreted text role "role".
404 :role:`interpreted`:role:
407 <document source="test data">
409 <problematic ids="problematic-1" refid="system-message-1">
410 :role:`interpreted`:role:
411 <system_message backrefs="problematic-1" ids="system-message-1" level="2" line="1" source="test data" type="WARNING">
413 Multiple roles in interpreted text (both prefix and suffix present; only one allowed).
416 :very.long-role_name:`interpreted`
419 <document source="test data">
421 <problematic ids="problematic-1" refid="system-message-1">
422 :very.long-role_name:`interpreted`
423 <system_message level="1" line="1" source="test data" type="INFO">
425 No role entry for "very.long-role_name" in module "docutils.parsers.rst.languages.en".
426 Trying "very.long-role_name" as canonical role name.
427 <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="1" source="test data" type="ERROR">
429 Unknown interpreted text role "very.long-role_name".
432 :restructuredtext-unimplemented-role:`interpreted`
435 <document source="test data">
437 <problematic ids="problematic-1" refid="system-message-1">
438 :restructuredtext-unimplemented-role:`interpreted`
439 <system_message level="1" line="1" source="test data" type="INFO">
441 No role entry for "restructuredtext-unimplemented-role" in module "docutils.parsers.rst.languages.en".
442 Trying "restructuredtext-unimplemented-role" as canonical role name.
443 <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="1" source="test data" type="ERROR">
445 Interpreted text role "restructuredtext-unimplemented-role" not implemented.
450 if __name__
== '__main__':