[py-svn] r47584 - in py/trunk/py/test: . testing

fijal at codespeak.net fijal at codespeak.net
Fri Oct 19 15:46:12 CEST 2007


Author: fijal
Date: Fri Oct 19 15:46:10 2007
New Revision: 47584

Modified:
   py/trunk/py/test/collect.py
   py/trunk/py/test/session.py
   py/trunk/py/test/testing/test_session.py
Log:
Implement very sophisticated algorith for -k TestClass.test to work


Modified: py/trunk/py/test/collect.py
==============================================================================
--- py/trunk/py/test/collect.py	(original)
+++ py/trunk/py/test/collect.py	Fri Oct 19 15:46:10 2007
@@ -150,8 +150,8 @@
                 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 @@
         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 @@
         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)
 
 

Modified: py/trunk/py/test/session.py
==============================================================================
--- py/trunk/py/test/session.py	(original)
+++ py/trunk/py/test/session.py	Fri Oct 19 15:46:10 2007
@@ -44,7 +44,7 @@
 
 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): 

Modified: py/trunk/py/test/testing/test_session.py
==============================================================================
--- py/trunk/py/test/testing/test_session.py	(original)
+++ py/trunk/py/test/testing/test_session.py	Fri Oct 19 15:46:10 2007
@@ -55,20 +55,24 @@
     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
+
+        for keyword in ['test_one', 'est_on']:
+            check(keyword, 'test_one')
+        check('TestClass.test', 'test_method_one')
 
-    def test_select_extra_keywords(self): 
+    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 @@
         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)


More information about the py-svn mailing list