[svn r47584] Implement very sophisticated algorith for -k TestClass.test to work
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									aabae96514
								
							
						
					
					
						commit
						b97ff86b0f
					
				|  | @ -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) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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):  | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue