Mercurial > hgsubversion
diff tests/test_util.py @ 1049:608e7c8740af
tests: add a metaclass for testing obsolete mode
We use a metaclass to both make the test code more concise, and more
likely to cover all cases. Typically, someone adding a new fixes will
also add a test, and put it in a class containing similar tests. Going
forward, having that entire class automatically then duplicate its
methods for relevant modes is a plus; a similar approach for stupid
mode already found a few omissions.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Thu, 08 Aug 2013 09:25:24 +0200 |
parents | 903c9c9dfe6a |
children | 0932bb4d8870 |
line wrap: on
line diff
--- a/tests/test_util.py +++ b/tests/test_util.py @@ -27,6 +27,11 @@ from mercurial import ui from mercurial import util from mercurial import extensions +try: + from mercurial import obsolete +except ImportError: + obsolete = None + try: SkipTest = unittest.SkipTest except AttributeError: @@ -251,7 +256,54 @@ def svnpropget(repo_path, path, prop, re raise Exception('svn ls failed on %s: %r' % (path, stderr)) return stdout.strip() + +def _obsolete_wrap(cls, name): + origfunc = getattr(cls, name) + + if not name.startswith('test_') or not origfunc: + return + + if not obsolete: + wrapper = _makeskip(name, 'obsolete not available') + else: + def wrapper(self, *args, **opts): + self.assertFalse(obsolete._enabled, 'obsolete was already active') + + obsolete._enabled = True + + try: + origfunc(self, *args, **opts) + self.assertTrue(obsolete._enabled, 'obsolete remains active') + finally: + obsolete._enabled = False + + if not wrapper: + return + + wrapper.__name__ = name + ' obsolete' + wrapper.__module__ = origfunc.__module__ + + if origfunc.__doc__: + firstline = origfunc.__doc__.strip().splitlines()[0] + wrapper.__doc__ = firstline + ' (obsolete)' + + assert getattr(cls, wrapper.__name__, None) is None + + setattr(cls, wrapper.__name__, wrapper) + +class TestMeta(type): + def __init__(cls, *args, **opts): + if cls.obsolete_mode_tests: + for origname in dir(cls): + _obsolete_wrap(cls, origname) + + return super(TestMeta, cls).__init__(*args, **opts) + class TestBase(unittest.TestCase): + __metaclass__ = TestMeta + + obsolete_mode_tests = False + def setUp(self): _verify_our_modules()