From b97ff86b0fc5acd11175d71d0584b308eb1ed657 Mon Sep 17 00:00:00 2001 From: fijal Date: Fri, 19 Oct 2007 15:46:10 +0200 Subject: [PATCH] [svn r47584] Implement very sophisticated algorith for -k TestClass.test to work --HG-- branch : trunk --- py/test/collect.py | 31 +++++++++++++++++++++++-------- py/test/session.py | 2 +- py/test/testing/test_session.py | 23 +++++++++++++---------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/py/test/collect.py b/py/test/collect.py index 67e02988b..5047d645d 100644 --- a/py/test/collect.py +++ b/py/test/collect.py @@ -150,8 +150,8 @@ class Collector(object): cur = next return cur - def _haskeyword(self, keyword): - return keyword in self.name + def _keywords(self): + return [self.name] def _getmodpath(self): """ return dotted module path (relative to the containing). """ @@ -176,17 +176,30 @@ class Collector(object): if not keyword: return chain = self.listchain() - for key in filter(None, keyword.split()): + for key in filter(None, keyword.split()): eor = key[:1] == '-' if eor: key = key[1:] if not (eor ^ self._matchonekeyword(key, chain)): py.test.skip("test not selected by keyword %r" %(keyword,)) - def _matchonekeyword(self, key, chain): - for subitem in chain: - if subitem._haskeyword(key): - return True + def _matchonekeyword(self, key, chain): + elems = key.split(".") + # XXX O(n^2), anyone cares? + chain = [item._keywords() for item in chain if item._keywords()] + for start, _ in enumerate(chain): + if start + len(elems) > len(chain): + return False + for num, elem in enumerate(elems): + for keyword in chain[num + start]: + ok = False + if elem in keyword: + ok = True + break + if not ok: + break + if num == len(elems) - 1 and ok: + return True return False def _tryiter(self, yieldtype=None): @@ -425,7 +438,9 @@ class Instance(PyCollectorMixin, Collector): return self.parent.obj() def Function(self): return getattr(self.obj, 'Function', - Collector.Function.__get__(self)) # XXX for python 2.2 + Collector.Function.__get__(self)) # XXX for python 2.2 + def _keywords(self): + return [] Function = property(Function) diff --git a/py/test/session.py b/py/test/session.py index bf760bd5c..e53c58251 100644 --- a/py/test/session.py +++ b/py/test/session.py @@ -44,7 +44,7 @@ class AbstractSession(object): class Session(AbstractSession): """ - A Session gets test Items from Collectors, # executes the + A Session gets test Items from Collectors, executes the Items and sends the Outcome to the Reporter. """ def shouldclose(self): diff --git a/py/test/testing/test_session.py b/py/test/testing/test_session.py index 7703c9fe4..959880d2f 100644 --- a/py/test/testing/test_session.py +++ b/py/test/testing/test_session.py @@ -55,20 +55,24 @@ def test_is_not_boxed_by_default(): assert not config.option.boxed class TestKeywordSelection: - def test_select_simple(self): - for keyword in ['test_one', 'est_on']: + def test_select_simple(self): + def check(keyword, name): config = py.test.config._reparse([datadir/'filetest.py', - '-k', keyword]) + '-s', '-k', keyword]) session = config._getsessionclass()(config, py.std.sys.stdout) session.main() l = session.getitemoutcomepairs(Failed) assert len(l) == 1 item = l[0][0] - assert item.name == 'test_one' + assert item.name == name l = session.getitemoutcomepairs(Skipped) - assert len(l) == 1 + assert len(l) == 1 - def test_select_extra_keywords(self): + for keyword in ['test_one', 'est_on']: + check(keyword, 'test_one') + check('TestClass.test', 'test_method_one') + + def test_select_extra_keywords(self): o = tmpdir.ensure('selecttest', dir=1) tfile = o.join('test_select.py').write(py.code.Source(""" def test_1(): @@ -80,14 +84,13 @@ class TestKeywordSelection: conftest = o.join('conftest.py').write(py.code.Source(""" import py class Class(py.test.collect.Class): - def _haskeyword(self, keyword): - return keyword == 'xxx' or \ - super(Class, self)._haskeyword(keyword) + def _keywords(self): + return ['xxx', self.name] """)) for keyword in ('xxx', 'xxx test_2', 'TestClass', 'xxx -test_1', 'TestClass test_2', 'xxx TestClass test_2',): f = py.std.StringIO.StringIO() - config = py.test.config._reparse([o, '-k', keyword]) + config = py.test.config._reparse([o, '-s', '-k', keyword]) session = config._getsessionclass()(config, f) session.main() print "keyword", repr(keyword)