[Checkins]
SVN: z3c.testsetup/branches/ulif-sepfunctesting/src/z3c/testsetup/functional/testgetter.py
Prepare split of testgetter code.
Uli Fouquet
uli at gnufix.de
Tue Jun 24 18:33:17 EDT 2008
Log message for revision 87722:
Prepare split of testgetter code.
Changed:
A z3c.testsetup/branches/ulif-sepfunctesting/src/z3c/testsetup/functional/testgetter.py
-=-
Copied: z3c.testsetup/branches/ulif-sepfunctesting/src/z3c/testsetup/functional/testgetter.py (from rev 87721, z3c.testsetup/branches/ulif-sepfunctesting/src/z3c/testsetup/testgetter.py)
===================================================================
--- z3c.testsetup/branches/ulif-sepfunctesting/src/z3c/testsetup/functional/testgetter.py (rev 0)
+++ z3c.testsetup/branches/ulif-sepfunctesting/src/z3c/testsetup/functional/testgetter.py 2008-06-24 22:33:16 UTC (rev 87722)
@@ -0,0 +1,148 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""TestGetters and TestCollectors.
+
+TestGetters wrap ordinary TestSetups and TestCollectors wrap
+TestGetters. They ease the writing of often used ``test_suite()``
+functions in test setup modules of projects.
+
+See testgetter.txt to learn more about this stuff.
+"""
+import unittest
+from z3c.testsetup.doctesting import UnitDocTestSetup, FunctionalDocTestSetup
+from z3c.testsetup.testing import UnitTestSetup
+from z3c.testsetup.util import get_package, get_keyword_params
+
+class BasicTestGetter(object):
+ """Abstract base for TestGetters.
+
+ TestGetters are a replacement for the test_suite() functions often
+ defined in test setup modules. They are more elegant, more
+ flexible, reusable and better looking ;-)
+ """
+ defaults = {}
+ settings = {}
+ args = ()
+
+ def __init__(self, pkg_or_dotted_name, *args, **kw):
+ self.args = args
+ if 'defaults' in kw.keys():
+ self.defaults = kw['defaults']
+ del kw['defaults']
+ self.settings = kw
+ self.package = get_package(pkg_or_dotted_name)
+ self.initialize()
+ return
+
+ def initialize(self):
+ """Convenience method called at end of constructor.
+
+ Might be usable for derived classes.
+ """
+ pass
+
+ def __call__(self):
+ """Get a testsuite.
+ """
+ self.filterKeywords()
+ suite = unittest.TestSuite()
+ suite.addTest(
+ self.wrapped_class(
+ self.package, **self.settings).getTestSuite()
+ )
+ return suite
+
+ def filterKeywords(self):
+ """Filter keywords passed to the constructor.
+
+ See testgetter.txt for deeper insights.
+ """
+ new_kws = self.defaults.copy()
+ new_kws.update(self.settings)
+ self.settings = new_kws
+ if not getattr(self, 'wrapped_class', None):
+ return
+ supported_kws = get_keyword_params(self.wrapped_class, '__init__')
+ for kw, val in new_kws.items():
+ if (kw.startswith(self.special_char) and
+ kw[1:] in supported_kws):
+ new_kws[kw[1:]] = val
+ if kw not in supported_kws:
+ del new_kws[kw]
+ self.settings = new_kws
+ return
+
+ def getTestSuite(self):
+ """A convenience method.
+
+ Some people might expect this method to exist.
+ """
+ return self.__call__()
+
+
+class FunctionalDocTestGetter(BasicTestGetter):
+ """Collect functional doctests.
+ """
+
+ wrapped_class = FunctionalDocTestSetup
+ special_char = 'f'
+
+class UnitDocTestGetter(BasicTestGetter):
+ """Collect unit doctests.
+ """
+
+ wrapped_class = UnitDocTestSetup
+ special_char = 'u'
+
+class PythonTestGetter(BasicTestGetter):
+ """Collect 'normal' python tests.
+ """
+
+ wrapped_class = UnitTestSetup
+ special_char = 'p'
+
+
+class BasicTestCollector(BasicTestGetter):
+ """Abstract base of TestCollectors.
+
+ TestCollectors are TestGetters, that can handle several TestGetter
+ types at once.
+ """
+
+ handled_getters = []
+ def __call__(self):
+ """Return a test suite.
+ """
+ suite = unittest.TestSuite()
+ for getter_cls in self.handled_getters:
+ getter = getter_cls(self.package, **self.settings)
+ # Merge our defaults with target defaults...
+ target_defaults = getattr(getter, 'defaults', {})
+ self_defaults = getattr(self, 'defaults', {})
+ getter.defaults = target_defaults.copy()
+ getter.defaults.update(self_defaults)
+ suite.addTest(getter.getTestSuite())
+ return suite
+
+class DocTestCollector(BasicTestCollector):
+ """A TestCollector that wraps functional doctests and unit doctests.
+ """
+ handled_getters = [FunctionalDocTestGetter, UnitDocTestGetter]
+
+class TestCollector(BasicTestCollector):
+ """A TestCollector that wraps doctests and PythonTests.
+ """
+ handled_getters = [FunctionalDocTestGetter, UnitDocTestGetter,
+ PythonTestGetter]
+
More information about the Checkins
mailing list