[svn r47584] Implement very sophisticated algorith for -k TestClass.test to work

--HG--
branch : trunk
This commit is contained in:
fijal 2007-10-19 15:46:10 +02:00
parent aabae96514
commit b97ff86b0f
3 changed files with 37 additions and 19 deletions

View File

@ -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). """
@ -184,8 +184,21 @@ class Collector(object):
py.test.skip("test not selected by keyword %r" %(keyword,))
def _matchonekeyword(self, key, chain):
for subitem in chain:
if subitem._haskeyword(key):
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
@ -426,6 +439,8 @@ class Instance(PyCollectorMixin, Collector):
def Function(self):
return getattr(self.obj, 'Function',
Collector.Function.__get__(self)) # XXX for python 2.2
def _keywords(self):
return []
Function = property(Function)

View File

@ -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):

View File

@ -56,18 +56,22 @@ def test_is_not_boxed_by_default():
class TestKeywordSelection:
def test_select_simple(self):
for keyword in ['test_one', 'est_on']:
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
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("""
@ -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)