From e84ba16fd870c6e74e87d7621eb074cf667d18ea Mon Sep 17 00:00:00 2001 From: Vitja Makarov Date: Wed, 29 Dec 2010 09:53:49 +0300 Subject: [PATCH] Improve pyregr test runner: add CythonPyregrTestCase --- runtests.py | 71 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/runtests.py b/runtests.py index 2d20ebd2..004b0493 100644 --- a/runtests.py +++ b/runtests.py @@ -189,7 +189,9 @@ class TestBuilder(object): if self.exclude_selectors: if [1 for match in self.exclude_selectors if match(fqmodule)]: continue - if context in TEST_RUN_DIRS: + if context == 'pyregr': + test_class = CythonPyregrTestCase + elif context in TEST_RUN_DIRS: if module.startswith("test_"): test_class = CythonUnitTestCase else: @@ -462,8 +464,7 @@ class CythonRunTestCase(CythonCompileTestCase): self.setUp() try: self.runCompileTest() - if not self.cython_only: - self.run_doctests(self.module, result) + self.run_tests(result) finally: check_thread_termination() except Exception: @@ -474,6 +475,10 @@ class CythonRunTestCase(CythonCompileTestCase): except Exception: pass + def run_tests(self, result): + if not self.cython_only: + self.run_doctests(self.module, result) + def run_doctests(self, module_name, result): if sys.version_info[0] >= 3 or not hasattr(os, 'fork') or not self.fork: doctest.DocTestSuite(module_name).run(result) @@ -621,28 +626,54 @@ class PartialTestResult(_TextTestResult): self.write("%s\n" % line) -class CythonUnitTestCase(CythonCompileTestCase): +class CythonUnitTestCase(CythonRunTestCase): def shortDescription(self): return "compiling (%s) tests in %s" % (self.language, self.module) - def run(self, result=None): - if result is None: - result = self.defaultTestResult() - result.startTest(self) + def run_tests(self, result): + unittest.defaultTestLoader.loadTestsFromName(self.module).run(result) + + +class CythonPyregrTestCase(CythonRunTestCase): + def _run_unittest(self, result, *classes): + """Run tests from unittest.TestCase-derived classes.""" + valid_types = (unittest.TestSuite, unittest.TestCase) + suite = unittest.TestSuite() + for cls in classes: + if isinstance(cls, str): + if cls in sys.modules: + suite.addTest(unittest.findTestCases(sys.modules[cls])) + else: + raise ValueError("str arguments must be keys in sys.modules") + elif isinstance(cls, valid_types): + suite.addTest(cls) + else: + suite.addTest(unittest.makeSuite(cls)) + suite.run(result) + + def _run_doctest(self, result, module): + self.run_doctests(module, result) + + def run_tests(self, result): try: - self.setUp() - try: - self.runCompileTest() - unittest.defaultTestLoader.loadTestsFromName(self.module).run(result) - finally: - check_thread_termination() - except Exception: - result.addError(self, sys.exc_info()) - result.stopTest(self) + from test import test_support as support + except ImportError: # Py3k + from test import support + + def run_unittest(*classes): + return self._run_unittest(result, *classes) + def run_doctest(module, verbosity=None): + return self._run_doctest(result, module) + + support.run_unittest = run_unittest + support.run_doctest = run_doctest + try: - self.tearDown() - except Exception: - pass + module = __import__(self.module) + if hasattr(module, 'test_main'): + module.test_main() + except (unittest.SkipTest, support.ResourceDenied): + result.addSkip(self, 'ok') try: -- 2.26.2