Rev 3197: Make TestTestIdListFilter aware that a test exists for a module or one of in file:///v/home/vila/src/bzr/experimental/selftest/

Vincent Ladeuil v.ladeuil+lp at free.fr
Sun Jan 20 17:45:28 GMT 2008


At file:///v/home/vila/src/bzr/experimental/selftest/

------------------------------------------------------------
revno: 3197
revision-id:v.ladeuil+lp at free.fr-20080120174523-n84kq5xsin1vualx
parent: v.ladeuil+lp at free.fr-20080120101950-dj7a3l2vdb9w9yxc
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: selftest
timestamp: Sun 2008-01-20 18:45:23 +0100
message:
  Make TestTestIdListFilter aware that a test exists for a module or one of
  its sub modules.
  
  * bzrlib/tests/test_selftest.py:
  (TestTestIdListFilter): Some refactoring, some fixes, add new
  tests for get_tests_under and is_module_name_used.
  
  * bzrlib/tests/__init__.py:
  (TestIdListFilter): Fix typo, thks Jelmer.
  (TestIdListFilter.__init__): Build module hierarchies for fast
  access.
  (TestIdListFilter.get_tests): Renamed from module_tests.
  (TestIdListFilter.get_tests_under): Get module tests and all sub
  module tests.
  (TestIdListFilter.is_module_name_used): Is there a test for a
  module or one of its sub modules.
modified:
  bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
-------------- next part --------------
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2008-01-20 10:19:50 +0000
+++ b/bzrlib/tests/__init__.py	2008-01-20 17:45:23 +0000
@@ -2561,7 +2561,7 @@
 
     Relying on the assumption that test ids are built as:
     <module>.<class>.<method>[(<param>+)], this class offers methods to :
-    - avoid building a test suite for modules not reffered to in the test list,
+    - avoid building a test suite for modules not refered to in the test list,
     - keep only the tests listed from the module test suite.
     """
 
@@ -2584,13 +2584,41 @@
                 by_modules[mod_name] = [test_id]
             else:
                 by_module.append(test_id)
-        self.by_modules = by_modules
+        self.tests_by_modules = by_modules
+
+        by_bases = {}
+        for module_name in by_modules.keys():
+            base = module_name
+            while base:
+                by_base = by_bases.get(base, None)
+                if by_base is None:
+                    by_bases[base] = [module_name]
+                else:
+                    by_base.append(module_name)
+                try:
+                    base, sub_mod_name = base.rsplit('.', 1)
+                except ValueError:
+                    base = None
+        self.module_hierarchies = by_bases
 
     def used_modules(self):
-        return self.by_modules.keys()
-
-    def module_tests(self, module_name):
-        return self.by_modules.get(module_name, None)
+        """Return the modules containing the test classes."""
+        return self.tests_by_modules.keys()
+
+    def get_tests(self, module_name):
+        """Return tests defined in the module itself."""
+        return self.tests_by_modules.get(module_name, [])
+
+    def get_tests_under(self, module_name):
+        """Return tests defined in the module or one of its submodules."""
+        tests_list = []
+        for mod in self.module_hierarchies.get(module_name, []):
+            tests_list.extend(self.get_tests(mod))
+        return tests_list
+
+    def is_module_name_used(self, module_name):
+        """Is there tests for the module or one of its sub modules."""
+        return self.module_hierarchies.has_key(module_name)
 
 
 def test_suite():

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2008-01-20 10:19:50 +0000
+++ b/bzrlib/tests/test_selftest.py	2008-01-20 17:45:23 +0000
@@ -1865,37 +1865,67 @@
         self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
 
 
-class TestSplitTestListByModules(tests.TestCase):
+class TestTestIdListFilter(tests.TestCase):
+
+    def _create_filter(self, test_list):
+        return tests.TestIdListFilter(test_list)
 
     def test_empty_list(self):
-        filter = tests.TestIdListFilter([])
+        filter = self._create_filter([])
         self.assertEquals([], filter.used_modules())
 
     def test_valid_list(self):
-        test_list = ['mod1.cl1.meth1', 'mod1.cl1.meth2',
-                     'mod1.cl2.meth1', 'mod1.cl2.meth2',
-                     'mod1.submod2.cl1.meth1', 'mod1.submod2.cl2.meth2',
-                    ]
-        filter = tests.TestIdListFilter(test_list)
+        filter = self._create_filter(
+            ['mod1.cl1.meth1', 'mod1.cl1.meth2',
+             'mod1.cl2.meth1', 'mod1.cl2.meth2',
+             'mod1.submod2.cl1.meth1', 'mod1.submod2.cl2.meth2',
+             ])
         self.assertEquals(['mod1', 'mod1.submod2'], filter.used_modules())
         self.assertEquals(['mod1.cl1.meth1', 'mod1.cl1.meth2',
                            'mod1.cl2.meth1', 'mod1.cl2.meth2',],
-                          filter.module_tests('mod1'))
+                          filter.get_tests('mod1'))
         self.assertEquals(['mod1.submod2.cl1.meth1', 'mod1.submod2.cl2.meth2'],
-                          filter.module_tests('mod1.submod2'))
+                          filter.get_tests('mod1.submod2'))
+
+    def test_get_tests_under(self):
+        filter = self._create_filter(
+            ['mod.cl1.meth1','mod.cl2.meth2',
+             'mod.submod.cl1.meth1', 'mod.submod.cl2.meth2',
+             'mod2.cl1.meth1',
+             ])
+        self.assertEquals(['mod.cl1.meth1', 'mod.cl2.meth2',],
+                          filter.get_tests('mod'))
+        self.assertEquals(['mod.submod.cl1.meth1', 'mod.submod.cl2.meth2'],
+                          filter.get_tests('mod.submod'))
+        self.assertEquals(set(['mod.cl1.meth1','mod.cl2.meth2',
+                           'mod.submod.cl1.meth1', 'mod.submod.cl2.meth2']),
+                          set(filter.get_tests_under('mod')))
+
 
     def test_too_short_test_name(self):
-        test_list = ['mod1', 'mod2.method1', 'mod3.cl1']
-        filter = tests.TestIdListFilter(test_list)
+        filter = self._create_filter(['mod1', 'mod2.method1', 'mod3.cl1'])
         self.assertEquals([''],filter.used_modules())
         self.assertEquals(['mod1', 'mod2.method1', 'mod3.cl1'],
-                          filter.module_tests(''))
+                          filter.get_tests(''))
 
 
     def test_bad_chars_in_params(self):
-        test_list = ['mod1.cl1.meth1(xx.yy)']
-        filter = tests.TestIdListFilter(test_list)
+        filter = self._create_filter(['mod1.cl1.meth1(xx.yy)'])
         self.assertEquals(['mod1'], filter.used_modules())
         self.assertEquals(['mod1.cl1.meth1(xx.yy)'],
-                          filter.module_tests('mod1'))
+                          filter.get_tests('mod1'))
+
+    def test_module_used(self):
+        filter = self._create_filter(['mod.class.meth'])
+        self.assertTrue(filter.is_module_name_used('mod'))
+
+    def test_module_used_includes_sub_modules(self):
+        filter = self._create_filter(['mod.sub_mod.class.meth'])
+        self.assertTrue(filter.is_module_name_used('mod'))
+        self.assertTrue(filter.is_module_name_used('mod.sub_mod'))
+
+    def test_module_used_refuses_class(self):
+        filter = self._create_filter(['mod.sub_mod.class.meth'])
+        self.assertFalse(filter.is_module_name_used('mod.sub_mod.class'))
+
 



More information about the bazaar-commits mailing list