Rev 2563: And overhaul WorkingTreeTestProviderAdapter too. in sftp://rookery/~/public_html/baz2.0/adapter-cleanup

Robert Collins robertc at robertcollins.net
Thu Jun 28 08:15:32 BST 2007


At sftp://rookery/~/public_html/baz2.0/adapter-cleanup

------------------------------------------------------------
revno: 2563
revision-id: robertc at robertcollins.net-20070628071528-muyk19rxv7z8dhiy
parent: robertc at robertcollins.net-20070628064436-lyl4ygrlwe7xup2h
committer: Robert Collins <robertc at robertcollins.net>
branch nick: adapter-cleanup
timestamp: Thu 2007-06-28 17:15:28 +1000
message:
  And overhaul WorkingTreeTestProviderAdapter too.
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/tests/intertree_implementations/__init__.py __init__.py-20060724101752-09ysswo1a92uqyoz-3
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
  bzrlib/tests/tree_implementations/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
  bzrlib/tests/workingtree_implementations/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
=== modified file 'NEWS'
--- a/NEWS	2007-06-28 06:44:36 +0000
+++ b/NEWS	2007-06-28 07:15:28 +0000
@@ -63,6 +63,8 @@
       to ``bzrlib.tests.interversionedfile_implementations``.
       ``bzrlib.store.revision.RevisionStoreTestProviderAdapter`` has moved to
       ``bzrlib.tests.revisionstore_implementations``.
+      ``bzrlib.workingtree.WorkingTreeTestProviderAdapter`` has moved to
+      ``bzrlib.tests.workingtree_implementations``.
       These changes are an API break in the testing infrastructure only.
       (Robert Collins)
 

=== modified file 'bzrlib/tests/intertree_implementations/__init__.py'
--- a/bzrlib/tests/intertree_implementations/__init__.py	2007-03-02 09:44:41 +0000
+++ b/bzrlib/tests/intertree_implementations/__init__.py	2007-06-28 07:15:28 +0000
@@ -35,10 +35,12 @@
     revision_tree_from_workingtree,
     TestCaseWithTree,
     )
+from bzrlib.tests.workingtree_implementations import (
+    WorkingTreeTestProviderAdapter,
+    )
 from bzrlib.tree import InterTree
 from bzrlib.workingtree import (
     WorkingTreeFormat3,
-    WorkingTreeTestProviderAdapter,
     )
 
 
@@ -61,26 +63,35 @@
 class InterTreeTestProviderAdapter(WorkingTreeTestProviderAdapter):
     """Generate test suites for each InterTree implementation in bzrlib."""
 
-    def adapt(self, test):
-        result = TestSuite()
+    def formats_to_scenarios(self, formats):
+        """Transform the input formats to a list of scenarios.
+
+        :param formats: A list of tuples:.
+            (intertree_class,
+             workingtree_format,
+             workingtree_format_to,
+             mutable_trees_to_test_trees)
+        """
+        result = []
         for (intertree_class,
             workingtree_format,
             workingtree_format_to,
-            mutable_trees_to_test_trees) in self._formats:
-            new_test = self._clone_test(
-                test,
-                workingtree_format._matchingbzrdir,
-                workingtree_format,
-                intertree_class.__name__)
-            new_test.intertree_class = intertree_class
-            new_test.workingtree_format_to = workingtree_format_to
-            # mutable_trees_to_test_trees takes two trees and converts them to
-            # whatever relationship the optimiser under test requires.
-            new_test.mutable_trees_to_test_trees = mutable_trees_to_test_trees
-            # workingtree_to_test_tree is set to disable changing individual
-            # trees: instead the mutable_trees_to_test_trees helper is used.
-            new_test.workingtree_to_test_tree = return_parameter
-            result.addTest(new_test)
+            mutable_trees_to_test_trees) in formats:
+            scenario = (intertree_class.__name__, {
+                "transport_server":self._transport_server,
+                "transport_readonly_server":self._transport_readonly_server,
+                "bzrdir_format":workingtree_format._matchingbzrdir,
+                "workingtree_format":workingtree_format,
+                "intertree_class":intertree_class,
+                "workingtree_format_to":workingtree_format_to,
+                # mutable_trees_to_test_trees takes two trees and converts them to,
+                # whatever relationship the optimiser under test requires.,
+                "mutable_trees_to_test_trees":mutable_trees_to_test_trees,
+                # workingtree_to_test_tree is set to disable changing individual,
+                # trees: instead the mutable_trees_to_test_trees helper is used.,
+                "workingtree_to_test_tree":return_parameter,
+                })
+            result.append(scenario)
         return result
 
 

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2007-06-28 06:44:36 +0000
+++ b/bzrlib/tests/test_selftest.py	2007-06-28 07:15:28 +0000
@@ -436,27 +436,27 @@
 class TestWorkingTreeProviderAdapter(TestCase):
     """A group of tests that test the workingtree implementation test adapter."""
 
-    def test_adapted_tests(self):
+    def test_scenarios(self):
         # check that constructor parameters are passed through to the adapted
         # test.
-        from bzrlib.workingtree import WorkingTreeTestProviderAdapter
-        input_test = TestWorkingTreeProviderAdapter(
-            "test_adapted_tests")
+        from bzrlib.tests.workingtree_implementations \
+            import WorkingTreeTestProviderAdapter
         server1 = "a"
         server2 = "b"
         formats = [("c", "C"), ("d", "D")]
         adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
-        suite = adapter.adapt(input_test)
-        tests = list(iter(suite))
-        self.assertEqual(2, len(tests))
-        self.assertEqual(tests[0].workingtree_format, formats[0][0])
-        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
-        self.assertEqual(tests[0].transport_server, server1)
-        self.assertEqual(tests[0].transport_readonly_server, server2)
-        self.assertEqual(tests[1].workingtree_format, formats[1][0])
-        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
-        self.assertEqual(tests[1].transport_server, server1)
-        self.assertEqual(tests[1].transport_readonly_server, server2)
+        self.assertEqual([
+            ('str',
+             {'bzrdir_format': 'C',
+              'transport_readonly_server': 'b',
+              'transport_server': 'a',
+              'workingtree_format': 'c'}),
+            ('str',
+             {'bzrdir_format': 'D',
+              'transport_readonly_server': 'b',
+              'transport_server': 'a',
+              'workingtree_format': 'd'})],
+            adapter.scenarios)
 
 
 class TestTreeProviderAdapter(TestCase):

=== modified file 'bzrlib/tests/tree_implementations/__init__.py'
--- a/bzrlib/tests/tree_implementations/__init__.py	2007-04-16 20:42:59 +0000
+++ b/bzrlib/tests/tree_implementations/__init__.py	2007-06-28 07:15:28 +0000
@@ -41,11 +41,13 @@
                           TestSuite,
                           )
 from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
+from bzrlib.tests.workingtree_implementations import (
+    WorkingTreeTestProviderAdapter,
+    )
 from bzrlib.revisiontree import RevisionTree
 from bzrlib.workingtree import (
     WorkingTreeFormat,
     WorkingTreeFormat3,
-    WorkingTreeTestProviderAdapter,
     _legacy_formats,
     )
 from bzrlib.workingtree_4 import (
@@ -289,35 +291,33 @@
 class TreeTestProviderAdapter(WorkingTreeTestProviderAdapter):
     """Generate test suites for each Tree implementation in bzrlib.
 
-    Currently this covers all working tree formats, and RevisionTree by 
-    committing a working tree to create the revision tree.
+    Currently this covers all working tree formats, and RevisionTree and
+    DirStateRevisionTree by committing a working tree to create the revision
+    tree.
     """
 
-    def adapt(self, test):
-        result = super(TreeTestProviderAdapter, self).adapt(test)
-        for adapted_test in result:
+    def __init__(self, transport_server, transport_readonly_server, formats):
+        super(TreeTestProviderAdapter, self).__init__(transport_server,
+            transport_readonly_server, formats)
+        # now adjust the scenarios and add the non-working-tree tree scenarios.
+        for scenario in self.scenarios:
             # for working tree adapted tests, preserve the tree
-            adapted_test.workingtree_to_test_tree = return_parameter
-        # this is the default in that it's used to test the generic InterTree
+            scenario[1]["workingtree_to_test_tree"] = return_parameter
+        # add RevisionTree scenario
+        # this is the 'default format' in that it's used to test the generic InterTree
         # code.
         default_format = WorkingTreeFormat3()
-        revision_tree_test = self._clone_test(
-            test,
-            default_format._matchingbzrdir, 
-            default_format,
-            RevisionTree.__name__)
-        revision_tree_test.workingtree_to_test_tree = revision_tree_from_workingtree
-        result.addTest(revision_tree_test)
-        # also explicity test WorkingTree4 against everything
+        self.scenarios.append(self.formats_to_scenarios([
+            (default_format, default_format._matchingbzrdir)])[0])
+        self.scenarios[-1] = (RevisionTree.__name__, self.scenarios[-1][1])
+        self.scenarios[-1][1]["workingtree_to_test_tree"] = revision_tree_from_workingtree
+
+        # also test WorkingTree4's RevisionTree implementation which is specialised.
         dirstate_format = WorkingTreeFormat4()
-        dirstate_revision_tree_test = self._clone_test(
-            test,
-            dirstate_format._matchingbzrdir,
-            dirstate_format,
-            DirStateRevisionTree.__name__)
-        dirstate_revision_tree_test.workingtree_to_test_tree = _dirstate_tree_from_workingtree
-        result.addTest(dirstate_revision_tree_test)
-        return result
+        self.scenarios.append(self.formats_to_scenarios([
+            (dirstate_format, dirstate_format._matchingbzrdir)])[0])
+        self.scenarios[-1] = (DirStateRevisionTree.__name__, self.scenarios[-1][1])
+        self.scenarios[-1][1]["workingtree_to_test_tree"] = _dirstate_tree_from_workingtree
 
 
 def test_suite():

=== modified file 'bzrlib/tests/workingtree_implementations/__init__.py'
--- a/bzrlib/tests/workingtree_implementations/__init__.py	2007-04-18 20:12:15 +0000
+++ b/bzrlib/tests/workingtree_implementations/__init__.py	2007-06-28 07:15:28 +0000
@@ -28,15 +28,47 @@
                           adapt_modules,
                           default_transport,
                           TestLoader,
+                          TestScenarioApplier,
                           TestSuite,
                           )
 from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
 from bzrlib.workingtree import (WorkingTreeFormat,
-                                WorkingTreeTestProviderAdapter,
                                 _legacy_formats,
                                 )
 
 
+class WorkingTreeTestProviderAdapter(TestScenarioApplier):
+    """A tool to generate a suite testing multiple workingtree formats at once.
+
+    This is done by copying the test once for each transport and injecting
+    the transport_server, transport_readonly_server, and workingtree_format
+    classes into each copy. Each copy is also given a new id() to make it
+    easy to identify.
+    """
+
+    def __init__(self, transport_server, transport_readonly_server, formats):
+        self._transport_server = transport_server
+        self._transport_readonly_server = transport_readonly_server
+        self.scenarios = self.formats_to_scenarios(formats)
+    
+    def formats_to_scenarios(self, formats):
+        """Transform the input formats to a list of scenarios.
+
+        :param formats: A list of (workingtree_format, bzrdir_format).
+        """
+    
+        result = []
+        for workingtree_format, bzrdir_format in formats:
+            scenario = (workingtree_format.__class__.__name__, {
+                "transport_server":self._transport_server,
+                "transport_readonly_server":self._transport_readonly_server,
+                "bzrdir_format":bzrdir_format,
+                "workingtree_format":workingtree_format,
+                })
+            result.append(scenario)
+        return result
+
+
 class TestCaseWithWorkingTree(TestCaseWithBzrDir):
 
     def make_branch_and_tree(self, relpath, format=None):

=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2007-06-19 14:49:06 +0000
+++ b/bzrlib/workingtree.py	2007-06-28 07:15:28 +0000
@@ -44,7 +44,6 @@
 lazy_import(globals(), """
 from bisect import bisect_left
 import collections
-from copy import deepcopy
 import errno
 import itertools
 import operator
@@ -2772,42 +2771,3 @@
 # and not independently creatable, so are not registered.
 _legacy_formats = [WorkingTreeFormat2(),
                    ]
-
-
-class WorkingTreeTestProviderAdapter(object):
-    """A tool to generate a suite testing multiple workingtree formats at once.
-
-    This is done by copying the test once for each transport and injecting
-    the transport_server, transport_readonly_server, and workingtree_format
-    classes into each copy. Each copy is also given a new id() to make it
-    easy to identify.
-    """
-
-    def __init__(self, transport_server, transport_readonly_server, formats):
-        self._transport_server = transport_server
-        self._transport_readonly_server = transport_readonly_server
-        self._formats = formats
-    
-    def _clone_test(self, test, bzrdir_format, workingtree_format, variation):
-        """Clone test for adaption."""
-        new_test = deepcopy(test)
-        new_test.transport_server = self._transport_server
-        new_test.transport_readonly_server = self._transport_readonly_server
-        new_test.bzrdir_format = bzrdir_format
-        new_test.workingtree_format = workingtree_format
-        def make_new_test_id():
-            new_id = "%s(%s)" % (test.id(), variation)
-            return lambda: new_id
-        new_test.id = make_new_test_id()
-        return new_test
-    
-    def adapt(self, test):
-        from bzrlib.tests import TestSuite
-        result = TestSuite()
-        for workingtree_format, bzrdir_format in self._formats:
-            new_test = self._clone_test(
-                test,
-                bzrdir_format,
-                workingtree_format, workingtree_format.__class__.__name__)
-            result.addTest(new_test)
-        return result



More information about the bazaar-commits mailing list