#! /usr/bin/env python3 # $Id: test_code.py 10134 2025-05-19 21:12:34Z milde $ # Author: Guenter Milde # Copyright: This module has been placed in the public domain. """ Test the 'code' directive in parsers/rst/directives/body.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[4])) 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 if with_pygments: import pygments pygments_version = tuple(map(int, pygments.__version__.split('.')[:2])) else: pygments_version = (0, 0) PYGMENTS_2_14_PLUS = pygments_version >= (2, 14) if pygments_version >= (2, 19): def_ws = '\n ' else: def_ws = ' ' class ParserTestCase(unittest.TestCase): def test_parser(self): parser = Parser() settings = get_default_settings(Parser) settings.warning_stream = '' settings.report_level = 5 for name, cases in totest.items(): for casenum, (case_input, case_expected) in enumerate(cases): with self.subTest(id=f'totest[{name!r}][{casenum}]'): if name == 'code_parsing' and not with_pygments: self.skipTest('syntax highlight requires pygments') document = new_document('test data', settings.copy()) parser.parse(case_input, document) output = document.pformat() self.assertEqual(case_expected, output) totest = {} totest['code'] = [ ["""\ .. code:: This is a code block. """, """\ This is a code block. """], ["""\ .. code:: :class: testclass :name: without argument This is a code block with generic options. """, """\ This is a code block with generic options. """], ["""\ .. code:: text :class: testclass This is a code block with text. """, """\ This is a code block with text. """], ["""\ .. code:: :number-lines: This is a code block with text. """, """\ 1 \n\ This is a code block with text. """], ["""\ .. code:: :number-lines: 30 This is a code block with text. """, """\ 30 \n\ This is a code block with text. """], ["""\ .. code:: """, """\ Content block expected for the "code" directive; none found. .. code:: """], ] totest['code_parsing'] = [ ["""\ .. code:: python3 :class: testclass print('hello world') # to stdout """, """\ \n\ print ( 'hello world' ) \n\ # to stdout """], ["""\ .. code:: python3 :class: testclass :name: my_function :number-lines: 7 def my_function(): '''Test the lexer. ''' # and now for something completely different print(8/2) """, f"""\ 7 \n\ def {def_ws} my_function (): \n\ 8 \n\ \n\ \'\'\'Test the lexer. 9 \n\ \'\'\' \n\ 10 \n\ \n\ 11 \n\ \n\ # and now for something completely different \n\ 12 \n\ \n\ print ( 8 / 2 ) """ if PYGMENTS_2_14_PLUS else """\ 7 \n\ def \n\ my_function (): \n\ 8 \n\ \n\ \'\'\'Test the lexer. 9 \n\ \'\'\' \n\ 10 \n\ \n\ 11 \n\ \n\ # and now for something completely different \n\ 12 \n\ \n\ print ( 8 / 2 ) """], ["""\ .. code:: latex :class: testclass hello \\emph{world} % emphasize """, """\ hello \n\ \\emph { world } \n\ % emphasize """], ["""\ .. code:: rst :number-lines: This is a code block with text. """, """\ 1 \n\ This is a code block with text. """], ["""\ Code not parsed but warning silenced in ParserTestCase. .. code:: s-lang % abc.sl autoload("abc_mode", "abc"); """, """\ Code not parsed but warning silenced in ParserTestCase. % abc.sl autoload("abc_mode", "abc"); """], ["""\ Place the language name in a class argument to avoid the no-lexer warning: .. code:: :class: s-lang % abc.sl autoload("abc_mode", "abc"); """, """\ Place the language name in a class argument to avoid the no-lexer warning: % abc.sl autoload("abc_mode", "abc"); """], ] if __name__ == '__main__': unittest.main()