#! /usr/bin/env python3 # $Id$ # Author: David Goodger # Copyright: This module has been placed in the public domain. """ Tests for interpreted text in docutils/parsers/rst/states.py. """ 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[3])) from docutils.frontend import get_default_settings from docutils.parsers.rst import Parser from docutils.utils import new_document from docutils.utils.code_analyzer import with_pygments class ParserTestCase(unittest.TestCase): def test_parser(self): if not with_pygments: del totest['code_parsing'] 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(output, case_expected) totest = {} totest['basics'] = [ ["""\ `interpreted` """, """\ interpreted """], ["""\ :title:`interpreted` """, """\ interpreted """], ["""\ `interpreted`:title: """, """\ interpreted """], ["""\ `interpreted \\`title`` """, """\ interpreted `title` """], ["""\ :title:`:not-role: interpreted` """, """\ :not-role: interpreted """], ["""\ `interpreted` but not \\`interpreted` [`] or ({[`] or [`]}) or ` """, """\ interpreted but not `interpreted` [`] or ({[`] or [`]}) or ` """], ["""\ `interpreted`-text `interpreted`: text `interpreted`:text `text`'s interpreted """, """\ interpreted -text \n\ interpreted : text \n\ interpreted :text \n\ text 's interpreted """], ["""\ `interpreted without closing backquote """, """\ ` interpreted without closing backquote Inline interpreted text or phrase reference start-string without end-string. """], ["""\ `interpreted`:not a role if it contains whitespace: """, """\ interpreted :not a role if it contains whitespace: """], ["""\ :title:`` (empty interpreted text not recognized) """, """\ :title:`` (empty interpreted text not recognized) """], ["""\ :title:`\\ ` (interpreted text containing empty string) """, """\ (interpreted text containing empty string) """], ["""\ `\\ `:title: (interpreted text containing empty string (postfix)) """, """\ (interpreted text containing empty string (postfix)) """], ["""\ :title:`\\ non-empty` """, """\ non-empty """], ["""\ :title:`\\ ` (trailing unquoted space) """, """\ :title: ` ` (trailing unquoted space) Inline interpreted text or phrase reference start-string without end-string. """], ["""\ Explicit roles for standard inline markup: :emphasis:`emphasis`, :strong:`strong`, :literal:`inline literal text`. """, """\ Explicit roles for standard inline markup: emphasis , strong , inline literal text . """], ["""\ Simple explicit roles: :ab:`abbreviation`, :ac:`acronym`, :sup:`superscript`, :sub:`subscript`, :title:`title reference`. """, """\ Simple explicit roles: abbreviation , acronym , superscript , subscript , title reference . """], ] totest['code'] = [ ["""\ Code role for inline code snippets: :code:`$\alpha = \\int_0^\\infty f(x) dx$`. """, """\ Code role for inline code snippets: $\x07lpha = \\int_0^\\infty f(x) dx$ . """], ] totest['code_parsing'] = [ ["""\ .. role:: tex(code) :language: latex Custom role based on code role: :tex:`$\alpha = f(x)$`. """, """\ Custom role based on code role: $ \x07lpha \n\ = f ( x ) $ . """], ["""\ Custom role based on code role: .. role:: python(code) :language: python3 :class: testclass Python code :python:`print("The end")`. """, """\ Custom role based on code role: Python code \n\ print ( "The end" ) . """], ] totest['references'] = [ ["""\ :PEP:`0` """, """\ PEP 0 """], ["""\ :PEP:`-1` """, """\ :PEP:`-1` PEP number must be a number from 0 to 9999; "-1" is invalid. """], ["""\ :RFC:`2822` """, """\ RFC 2822 """], ["""\ :RFC:`0` """, """\ :RFC:`0` RFC number must be a number greater than or equal to 1; "0" is invalid. """], ["""\ :RFC:`2822#section1` """, """\ RFC 2822 """], ] totest['unknown_roles'] = [ ["""\ :role:`interpreted` """, """\ :role:`interpreted` No role entry for "role" in module "docutils.parsers.rst.languages.en". Trying "role" as canonical role name. Unknown interpreted text role "role". """], ["""\ `interpreted`:role: """, """\ `interpreted`:role: No role entry for "role" in module "docutils.parsers.rst.languages.en". Trying "role" as canonical role name. Unknown interpreted text role "role". """], ["""\ :role:`interpreted`:role: """, """\ :role:`interpreted`:role: Multiple roles in interpreted text (both prefix and suffix present; only one allowed). """], ["""\ :very.long-role_name:`interpreted` """, """\ :very.long-role_name:`interpreted` No role entry for "very.long-role_name" in module "docutils.parsers.rst.languages.en". Trying "very.long-role_name" as canonical role name. Unknown interpreted text role "very.long-role_name". """], ["""\ :restructuredtext-unimplemented-role:`interpreted` """, """\ :restructuredtext-unimplemented-role:`interpreted` No role entry for "restructuredtext-unimplemented-role" in module "docutils.parsers.rst.languages.en". Trying "restructuredtext-unimplemented-role" as canonical role name. Interpreted text role "restructuredtext-unimplemented-role" not implemented. """], ] if __name__ == '__main__': unittest.main()