On 17:34:19 2019-01-26, Jani Nikula wrote:
Similar to the parser test transition to dynamically generated test
methods, but with more test separation added. After this, the Sphinx
build is done independently for each test case, and separately for the
actual directive output and the expected output. This removes any
potential C domain interactions between test cases and expected/actual
inputs.
The change does mean the Sphinx build is run roughly 50x times per full
test run, at the current number of test cases. This is somewhat offset
by the ability to run individual directive test cases:
$ test/test_cautodoc.py DirectiveTest.test_example_10_macro
A little bit of extra temp file boilerplate is required to work around a
sphinx-testing issue [1]. Otherwise, the decorated functions could
return the values directly.
[1] https://github.com/sphinx-doc/sphinx-testing/issues/12
---
test/test_cautodoc.py | 93 ++++++++++++++++++++++---------------------
1 file changed, 47 insertions(+), 46 deletions(-)
diff --git a/test/test_cautodoc.py b/test/test_cautodoc.py
index 3fb98af8629d..adbd17c8453e 100755
--- a/test/test_cautodoc.py
+++ b/test/test_cautodoc.py
@@ -4,59 +4,60 @@
import os
import shutil
+import tempfile
import unittest
import testenv
from sphinx_testing import with_app
-class DirectiveTest(unittest.TestCase):
-
- def _setup_src(self, srcdir, testcase_in):
- testcase_out = testenv.modify_filename(testcase_in, dir=srcdir)
-
- # use the pre-generated rst as comparison data
- shutil.copyfile(testenv.modify_filename(testcase_in, ext='stdout'),
- testenv.modify_filename(testcase_out,
ext='expected.rst'))
-
- # set up an rst file to run the extension
- shutil.copyfile(testcase_in, testcase_out)
- options = testenv.get_testcase_options(testcase_in)
-
- with open(testenv.modify_filename(testcase_out, ext='output.rst'),
'w') as file:
- fmt = '.. c:autodoc:: {source}\n'
- file.write(fmt.format(source=os.path.basename(testcase_out)))
- for key in options.keys():
- fmt = ' :{key}: {value}\n'
- file.write(fmt.format(key=key, value=options[key]))
-
- def _check_out(self, outdir, testcase_in):
- testcase_out = testenv.modify_filename(testcase_in, dir=outdir)
-
- # compare output from the pre-generated rst against the output
generated
- # by the extension
+# Use copy_srcdir_to_tmpdir=False and outdir='some-dir' for debugging
+@with_app(srcdir=os.path.join(testenv.testdir, 'sphinx'),
+ buildername='text', copy_srcdir_to_tmpdir=True)
+def _sphinx_build_output(input_filename, output_filename, options,
+ app, status, warning):
+ shutil.copyfile(input_filename,
+ testenv.modify_filename(input_filename, dir=app.srcdir))
+
+ with open(os.path.join(app.srcdir, 'index.rst'), 'w') as file:
+ fmt = '.. c:autodoc:: {source}\n'
+ file.write(fmt.format(source=os.path.basename(input_filename)))
+ for key in options.keys():
+ fmt = ' :{key}: {value}\n'
+ file.write(fmt.format(key=key, value=options[key]))
+
+ app.build()
+ shutil.copyfile(os.path.join(app.outdir, 'index.txt'), output_filename)
+
+# Use copy_srcdir_to_tmpdir=False and outdir='some-dir' for debugging
+@with_app(srcdir=os.path.join(testenv.testdir, 'sphinx'),
+ buildername='text', copy_srcdir_to_tmpdir=True)
+def _sphinx_build_expected(input_filename, output_filename, options,
+ app, status, warning):
+ shutil.copyfile(testenv.modify_filename(input_filename, ext='stdout'),
+ os.path.join(app.srcdir, 'index.rst'))
+ app.build()
+ shutil.copyfile(os.path.join(app.outdir, 'index.txt'), output_filename)
+
+def _get_output(input_filename, **options):
+ output_filename = tempfile.mktemp()
+ _sphinx_build_output(input_filename, output_filename, options)
+ ret = testenv.read_file(output_filename)
+ os.remove(output_filename)
+
+ return ret
+
+def _get_expected(input_filename, **options):
+ output_filename = tempfile.mktemp()
+ _sphinx_build_expected(input_filename, output_filename, options)
+ ret = testenv.read_file(output_filename)
+ os.remove(output_filename)
+
+ return ret
- output = testenv.read_file(testenv.modify_filename(testcase_out,
- ext='output.txt'))
-
- expected = testenv.read_file(testenv.modify_filename(testcase_out,
-
ext='expected.txt'))
-
- self.assertEqual(expected, output)
-
- # Use copy_srcdir_to_tmpdir=False and outdir='some-dir' for debugging
- @with_app(srcdir=os.path.join(testenv.testdir, 'sphinx'),
- buildername='text', copy_srcdir_to_tmpdir=True)
- def test_directive(self, app, status, warning):
- testcases = list(testenv.get_testcases(testenv.testdir))
-
- for f in testcases:
- self._setup_src(app.srcdir, f)
-
- app.build()
+class DirectiveTest(unittest.TestCase):
+ pass
- for f in testcases:
- with self.subTest(source=os.path.basename(f)):
- self._check_out(app.outdir, os.path.basename(f))
+testenv.assign_test_methods(DirectiveTest, _get_output, _get_expected)
if __name__ == '__main__':
unittest.main()