#! /usr/bin/env python3 # $Id: test_substitutions.py 9425 2023-06-30 14:56:47Z milde $ # Author: David Goodger # Copyright: This module has been placed in the public domain. """ Tests for docutils.transforms.references.Substitutions. """ 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[2])) from docutils.frontend import get_default_settings from docutils.parsers.rst import Parser from docutils.transforms.references import Substitutions from docutils.transforms.universal import TestMessages from docutils.utils import new_document class TransformTestCase(unittest.TestCase): def test_transforms(self): parser = Parser() settings = get_default_settings(Parser) settings.warning_stream = '' for name, (transforms, 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) # Don't do a ``populate_from_components()`` because that # would enable the Transformer's default transforms. document.transformer.add_transforms(transforms) document.transformer.add_transform(TestMessages) document.transformer.apply_transforms() output = document.pformat() self.assertEqual(case_expected, output) totest = {} totest['substitutions'] = ((Substitutions,), [ ["""\ The |biohazard| symbol is deservedly scary-looking. .. |biohazard| image:: biohazard.png """, """\ The \n\ biohazard symbol is deservedly scary-looking. biohazard """], ["""\ Here's an |unknown| substitution. """, """\ Here's an \n\ |unknown| substitution. Undefined substitution referenced: "unknown". """], ["""\ Substitutions support case differences: .. |eacute| replace:: \u00E9 .. |Eacute| replace:: \u00C9 |Eacute|\\t\\ |eacute|, and even |EACUTE|. """, """\ Substitutions support case differences: \u00E9 \u00C9 \u00C9 t \u00E9 , and even \n\ \u00C9 . """], ["""\ Indirect substitution definitions with multiple references: |substitute| my coke for gin |substitute| you for my mum at least I'll get my washing done .. |substitute| replace:: |replace| .. |replace| replace:: swap """, """\ Indirect substitution definitions with multiple references: swap my coke for gin swap you for my mum at least I'll get my washing done swap swap """], ["""\ .. |l| unicode:: U+00AB .. left chevron .. |r| unicode:: U+00BB .. right chevron .. |.| replace:: |l|\\ ``.``\\ |r| .. Delete either of the following lines, and there is no error. Regular expression |.| will match any character .. Note:: Note that |.| matches *exactly* one character """, """\ \xab \xbb \xab . \xbb Delete either of the following lines, and there is no error. Regular expression \n\ \xab . \xbb will match any character Note that \n\ \xab . \xbb matches \n\ exactly one character """], ["""\ .. |sub| replace:: |sub| """, """\ Circular substitution definition detected: .. |sub| replace:: |sub| """], ["""\ .. |sub| replace:: |indirect1| .. |indirect1| replace:: |indirect2| .. |indirect2| replace:: |Sub| """, """\ Circular substitution definition detected: .. |sub| replace:: |indirect1| Circular substitution definition detected: .. |indirect1| replace:: |indirect2| Circular substitution definition detected: .. |indirect2| replace:: |Sub| """], ["""\ .. |indirect1| replace:: |indirect2| .. |indirect2| replace:: |Sub| .. |sub| replace:: |indirect1| Use |sub| and |indirect1| and |sub| again (and |sub| one more time). """, """\ Circular substitution definition detected: .. |indirect1| replace:: |indirect2| Circular substitution definition detected: .. |indirect2| replace:: |Sub| Circular substitution definition detected: .. |sub| replace:: |indirect1| Use \n\ |Sub| and \n\ |indirect1| and \n\ |sub| again (and \n\ |sub| one more time). Circular substitution definition referenced: "indirect1". Circular substitution definition referenced: "sub". Circular substitution definition referenced: "sub". Circular substitution definition referenced: "Sub". """], ["""\ Substitution reference with |reference-in-content|. .. |reference-in-content| replace:: text and hyperlink-reference_ """, """\ Substitution reference with \n\ text and \n\ hyperlink-reference . text and \n\ hyperlink-reference """], ]) totest['unicode'] = ((Substitutions,), [ ["""\ Insert an em-dash (|mdash|), a copyright symbol (|copy|), a non-breaking space (|nbsp|), a backwards-not-equals (|bne|), and a captial omega (|Omega|). .. |mdash| unicode:: 0x02014 .. |copy| unicode:: \\u00A9 .. |nbsp| unicode::   .. |bne| unicode:: U0003D U020E5 .. |Omega| unicode:: U+003A9 """, """\ Insert an em-dash ( \u2014 ), a copyright symbol ( \u00a9 ), a non-breaking space ( \u00a0 ), a backwards-not-equals ( = \u20e5 ), and a captial omega ( \u03a9 ). \u2014 \u00a9 \u00a0 = \u20e5 \u03a9 """], [""" Testing comments and extra text. Copyright |copy| 2003, |BogusMegaCorp (TM)|. .. |copy| unicode:: 0xA9 .. copyright sign .. |BogusMegaCorp (TM)| unicode:: BogusMegaCorp U+2122 .. with trademark sign """, """\ Testing comments and extra text. Copyright \n\ \u00a9 2003, \n\ BogusMegaCorp \u2122 . \u00a9 BogusMegaCorp \u2122 """], ["""\ Insert an em-dash |---| automatically trimming whitespace. Some substitutions |TM| only need |rarrow| trimming on one side. .. |---| unicode:: U+02014 :trim: .. |TM| unicode:: U+02122 :ltrim: .. |rarrow| unicode:: U+2192 :rtrim: """, """\ Insert an em-dash \u2014 automatically trimming whitespace. Some substitutions \u2122 only need \n\ \u2192 trimming on one side. \u2014 \u2122 \u2192 """], ["""\ Substitution definition with an illegal element: .. |target| replace:: _`target` Make sure this substitution definition is not registered: |target| """, """\ Substitution definition with an illegal element: Substitution definition contains illegal element : target .. |target| replace:: _`target` Make sure this substitution definition is not registered: \n\ |target| Undefined substitution referenced: "target". """], ]) if __name__ == '__main__': unittest.main()