summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Th?nault <sylvain.thenault@logilab.fr>2009-10-20 14:27:11 +0200
committerSylvain Th?nault <sylvain.thenault@logilab.fr>2009-10-20 14:27:11 +0200
commit78d91a5ffcf12ab811aca95e3596be842b02f988 (patch)
tree0fe329f28a46359b5423ffc4894c511dfd2d3742
parent2d1c598df0a6759d7702a02a1147c856628a8af3 (diff)
parent166e3151585127b5569858794050bc5c18acfdd6 (diff)
downloadlogilab-common-78d91a5ffcf12ab811aca95e3596be842b02f988.tar.gz
merge
-rw-r--r--debugger.py9
-rw-r--r--test/unittest_testlib.py57
-rw-r--r--testlib.py9
3 files changed, 69 insertions, 6 deletions
diff --git a/debugger.py b/debugger.py
index 567c738..59bd0f8 100644
--- a/debugger.py
+++ b/debugger.py
@@ -74,11 +74,12 @@ class Debugger(Pdb):
- overrides list command to search for current block instead
of using 5 lines of context
"""
- def __init__(self, tcbk):
+ def __init__(self, tcbk=None):
Pdb.__init__(self)
self.reset()
- while tcbk.tb_next is not None:
- tcbk = tcbk.tb_next
+ if tcbk:
+ while tcbk.tb_next is not None:
+ tcbk = tcbk.tb_next
self._tcbk = tcbk
self._histfile = osp.join(os.environ["HOME"], ".pdbhist")
@@ -187,3 +188,5 @@ def pm():
dbg = Debugger(sys.last_traceback)
dbg.start()
+def set_trace():
+ Debugger().set_trace(sys._getframe().f_back)
diff --git a/test/unittest_testlib.py b/test/unittest_testlib.py
index 1bf5123..5e37cf0 100644
--- a/test/unittest_testlib.py
+++ b/test/unittest_testlib.py
@@ -20,7 +20,7 @@ except NameError:
from unittest import TestSuite
-from logilab.common.testlib import TestCase, SkipAwareTextTestRunner
+from logilab.common.testlib import TestCase, SkipAwareTextTestRunner, Tags
from logilab.common.testlib import mock_object, NonStrictTestLoader, create_files
from logilab.common.testlib import capture_stdout, unittest_main, InnerTest
from logilab.common.testlib import with_tempdir, tag
@@ -776,6 +776,21 @@ class TagTC(TestCase):
self.func = bob
+ class TagTestTC(TestCase):
+ tags = Tags(('one', 'two'))
+
+ def test_one(self):
+ self.assertTrue(True)
+
+ @tag('two', 'three')
+ def test_two(self):
+ self.assertTrue(True)
+
+ @tag('three')
+ def test_three(self):
+ self.assertTrue(True)
+ self.cls = TagTestTC
+
def test_tag_decorator(self):
bob = self.func
@@ -804,5 +819,45 @@ class TagTC(TestCase):
self.assertTrue(tags.match('not other or (testing and bibi)'))
self.assertTrue(tags.match('other or (testing and bob)'))
+ def test_tagged_class(self):
+ def options(tags):
+ class Options(object):
+ tags_pattern = tags
+ return Options()
+
+ cls = self.cls
+
+ runner = SkipAwareTextTestRunner()
+ self.assertTrue(runner.does_match_tags(cls.test_one))
+ self.assertTrue(runner.does_match_tags(cls.test_two))
+ self.assertTrue(runner.does_match_tags(cls.test_three))
+
+ runner = SkipAwareTextTestRunner(options=options('one'))
+ self.assertTrue(runner.does_match_tags(cls.test_one))
+ self.assertFalse(runner.does_match_tags(cls.test_two))
+ self.assertFalse(runner.does_match_tags(cls.test_three))
+
+ runner = SkipAwareTextTestRunner(options=options('two'))
+ self.assertTrue(runner.does_match_tags(cls.test_one))
+ self.assertTrue(runner.does_match_tags(cls.test_two))
+ self.assertFalse(runner.does_match_tags(cls.test_three))
+
+ runner = SkipAwareTextTestRunner(options=options('three'))
+ self.assertFalse(runner.does_match_tags(cls.test_one))
+ self.assertTrue(runner.does_match_tags(cls.test_two))
+ self.assertTrue(runner.does_match_tags(cls.test_three))
+
+ runner = SkipAwareTextTestRunner(options=options('two or three'))
+ self.assertTrue(runner.does_match_tags(cls.test_one))
+ self.assertTrue(runner.does_match_tags(cls.test_two))
+ self.assertTrue(runner.does_match_tags(cls.test_three))
+
+ runner = SkipAwareTextTestRunner(options=options('two and three'))
+ self.assertFalse(runner.does_match_tags(cls.test_one))
+ self.assertTrue(runner.does_match_tags(cls.test_two))
+ self.assertFalse(runner.does_match_tags(cls.test_three))
+
+
+
if __name__ == '__main__':
unittest_main()
diff --git a/testlib.py b/testlib.py
index f19d6d1..1a6b2dc 100644
--- a/testlib.py
+++ b/testlib.py
@@ -466,8 +466,13 @@ class SkipAwareTextTestRunner(unittest.TextTestRunner):
if self.options is not None:
tags_pattern = getattr(self.options, 'tags_pattern', None)
if tags_pattern is not None:
- tags = getattr(test, 'tags', Tags())
- return tags.match(tags_pattern)
+ tags = getattr(test, 'tags', None)
+ if tags is not None:
+ return tags.match(tags_pattern)
+ if isinstance(test, types.MethodType):
+ tags = getattr(test.im_class, 'tags', Tags())
+ return tags.match(tags_pattern)
+ return False
return True # no pattern
def _makeResult(self):