~bzr-pqm/bzr/bzr.dev

974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
1
# (C) 2005 Canonical Ltd
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1092.2.7 by Robert Collins
Revisions should be comparable
17
from bzrlib.selftest import TestCaseInTempDir, TestCase
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
18
19
20
def make_branches():
21
    from bzrlib.branch import Branch
22
    from bzrlib.commit import commit
23
    import os
24
    os.mkdir("branch1")
25
    br1 = Branch("branch1", init=True)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
26
    
27
    commit(br1, "Commit one", rev_id="a@u-0-0")
28
    commit(br1, "Commit two", rev_id="a@u-0-1")
29
    commit(br1, "Commit three", rev_id="a@u-0-2")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
30
31
    os.mkdir("branch2")
32
    br2 = Branch("branch2", init=True)
33
    br2.update_revisions(br1)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
34
    commit(br2, "Commit four", rev_id="b@u-0-3")
35
    commit(br2, "Commit five", rev_id="b@u-0-4")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
36
    revisions_2 = br2.revision_history()
37
    br1.add_pending_merge(revisions_2[4])
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
38
    commit(br1, "Commit six", rev_id="a@u-0-3")
39
    commit(br1, "Commit seven", rev_id="a@u-0-4")
40
    commit(br2, "Commit eight", rev_id="b@u-0-5")
41
    br1.add_pending_merge(br2.revision_history()[5])
42
    commit(br1, "Commit nine", rev_id="a@u-0-5")
43
    br2.add_pending_merge(br1.revision_history()[4])
44
    commit(br2, "Commit ten", rev_id="b@u-0-6")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
45
    return br1, br2
46
47
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
48
class TestIsAncestor(TestCaseInTempDir):
1102 by Martin Pool
- merge test refactoring from robertc
49
    def test_is_ancestor(self):
50
        """Test checking whether a revision is an ancestor of another revision"""
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
51
        from bzrlib.revision import is_ancestor, MultipleRevisionSources
52
        from bzrlib.errors import NoSuchRevision
53
        br1, br2 = make_branches()
54
        revisions = br1.revision_history()
55
        revisions_2 = br2.revision_history()
56
        sources = MultipleRevisionSources(br1, br2)
57
58
        assert is_ancestor(revisions[0], revisions[0], sources)
59
        assert is_ancestor(revisions[1], revisions[0], sources)
60
        assert not is_ancestor(revisions[0], revisions[1], sources)
61
        assert is_ancestor(revisions_2[3], revisions[0], sources)
62
        self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
63
                          revisions[0], br1)        
64
        assert is_ancestor(revisions[3], revisions_2[4], sources)
65
        assert is_ancestor(revisions[3], revisions_2[4], br1)
66
        assert is_ancestor(revisions[3], revisions_2[3], sources)
67
        assert not is_ancestor(revisions[3], revisions_2[3], br1)
68
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
69
class TestIntermediateRevisions(TestCaseInTempDir):
1092.1.42 by Robert Collins
merge from abentley
70
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
71
    def setUp(self):
72
        from bzrlib.commit import commit
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
73
        TestCaseInTempDir.setUp(self)
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
74
        self.br1, self.br2 = make_branches()
75
        commit(self.br2, "Commit eleven", rev_id="b@u-0-7")
76
        commit(self.br2, "Commit twelve", rev_id="b@u-0-8")
77
        commit(self.br2, "Commit thirtteen", rev_id="b@u-0-9")
78
        self.br1.add_pending_merge(self.br2.revision_history()[6])
79
        commit(self.br1, "Commit fourtten", rev_id="a@u-0-6")
80
        self.br2.add_pending_merge(self.br1.revision_history()[6])
81
        commit(self.br2, "Commit fifteen", rev_id="b@u-0-10")
82
83
        from bzrlib.revision import MultipleRevisionSources
84
        self.sources = MultipleRevisionSources(self.br1, self.br2)
85
86
    def intervene(self, ancestor, revision, revision_history=None):
87
        from bzrlib.revision import get_intervening_revisions
88
        return get_intervening_revisions(ancestor,revision, self.sources, 
89
                                         revision_history)
90
1092.1.42 by Robert Collins
merge from abentley
91
    def test_intervene(self):
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
92
        """Find intermediate revisions, without requiring history"""
93
        from bzrlib.errors import NotAncestor, NoSuchRevision
94
        assert len(self.intervene('a@u-0-0', 'a@u-0-0')) == 0
95
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-1'), ['a@u-0-1'])
96
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-2'), 
97
                         ['a@u-0-1', 'a@u-0-2'])
98
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-3'), 
99
                         ['a@u-0-1', 'a@u-0-2', 'b@u-0-3'])
100
        self.assertEqual(self.intervene('b@u-0-3', 'a@u-0-3'), 
101
                         ['b@u-0-4', 'a@u-0-3'])
102
        self.assertEqual(self.intervene('a@u-0-2', 'a@u-0-3', 
103
                                        self.br1.revision_history()), 
104
                         ['a@u-0-3'])
105
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-5', 
106
                                        self.br1.revision_history()), 
107
                         ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4', 
108
                          'a@u-0-5'])
109
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6', 
110
                         self.br1.revision_history()), 
111
                         ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4', 
112
                          'b@u-0-6'])
113
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'), 
114
                         ['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4', 
115
                          'b@u-0-5'])
116
        self.assertEqual(self.intervene('b@u-0-3', 'b@u-0-6', 
117
                         self.br2.revision_history()), 
118
                         ['b@u-0-4', 'b@u-0-5', 'b@u-0-6'])
119
        self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10'), 
120
                         ['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
121
        self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10', 
122
                                        self.br2.revision_history()), 
123
                         ['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
124
        self.assertRaises(NotAncestor, self.intervene, 'b@u-0-10', 'b@u-0-6', 
125
                          self.br2.revision_history())
126
        self.assertRaises(NoSuchRevision, self.intervene, 'c@u-0-10', 
127
                          'b@u-0-6', self.br2.revision_history())
128
        self.assertRaises(NoSuchRevision, self.intervene, 'b@u-0-10', 
129
                          'c@u-0-6', self.br2.revision_history())
130
131
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
132
class TestCommonAncestor(TestCaseInTempDir):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
133
    """Test checking whether a revision is an ancestor of another revision"""
1092.1.39 by Robert Collins
merge from mpool
134
135
    def test_common_ancestor(self):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
136
        from bzrlib.revision import find_present_ancestors, common_ancestor
137
        from bzrlib.revision import MultipleRevisionSources
138
        br1, br2 = make_branches()
139
        revisions = br1.revision_history()
140
        revisions_2 = br2.revision_history()
141
        sources = MultipleRevisionSources(br1, br2)
142
143
        expected_ancestors_list = {revisions[3]:(0, 0), 
144
                                   revisions[2]:(1, 1),
145
                                   revisions_2[4]:(2, 1), 
146
                                   revisions[1]:(3, 2),
147
                                   revisions_2[3]:(4, 2),
148
                                   revisions[0]:(5, 3) }
149
        ancestors_list = find_present_ancestors(revisions[3], sources)
150
        assert len(expected_ancestors_list) == len(ancestors_list)
151
        for key, value in expected_ancestors_list.iteritems():
152
            self.assertEqual(ancestors_list[key], value, 
153
                              "key %r, %r != %r" % (key, ancestors_list[key],
154
                                                    value))
155
156
        self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
157
                          revisions[0])
158
        self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
159
                          revisions[1])
160
        self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
161
                          revisions[1])
162
        self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
163
                          revisions[2])
164
        self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
165
                          revisions_2[4])
166
        self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
167
                          revisions_2[4])
168
        self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
169
                          revisions[4])
170
        self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
171
                          revisions_2[5])
1092.2.1 by Robert Collins
minor refactors to store, create an ImmutableMemoryStore for testing or other such operations
172
173
class TestCreateSignedRevision(TestCaseInTempDir):
174
175
    def test_create_signed_revision(self):
176
        # create a store
177
        # create a revision, sign it, apply to the store.
178
        pass
179
1092.2.7 by Robert Collins
Revisions should be comparable
180
class TestOperators(TestCase):
181
182
    def test___eq__(self):
183
        from bzrlib.revision import Revision, RevisionReference
184
        revision1 = Revision("invid", "sha", "revid", 100, "boo", "john", [])
185
        revision2 = Revision("invid", "sha", "revid", 100, "boo", "john", [])
186
        revision3 = Revision("invid", "sha", "rev2id", 100, "bp", "john", 
187
                             [RevisionReference("revid")])
188
        self.assertEqual(revision1, revision1)
189
        self.assertEqual(revision1, revision2)
190
        self.assertNotEqual(revision1, revision3)
191
        self.assertEqual(revision2, revision1)
192
        self.assertEqual(revision2, revision2)
193
        self.assertNotEqual(revision2, revision3)
194
        self.assertNotEqual(revision3, revision1)
195
        self.assertNotEqual(revision3, revision2)
196
        self.assertEqual(revision3, revision3)
1092.2.8 by Robert Collins
so should RevisionReferences
197
198
    def test__eq__reference(self):
199
        from bzrlib.revision import Revision, RevisionReference
200
        ref1 = RevisionReference('revid', '1'*40)
201
        ref2 = RevisionReference('revid', '1'*40)
202
        ref3 = RevisionReference('revid', '2'*40)
203
        ref4 = RevisionReference('revid2', '3'*40)
204
        self.assertEqual(ref1, ref1)
205
        self.assertEqual(ref1, ref2)
206
        self.assertNotEqual(ref1, ref3)
207
        self.assertNotEqual(ref1, ref4)
208
        self.assertEqual(ref2, ref1)
209
        self.assertEqual(ref2, ref2)
210
        self.assertNotEqual(ref2, ref3)
211
        self.assertNotEqual(ref2, ref4)
212
        self.assertNotEqual(ref3, ref1)
213
        self.assertNotEqual(ref3, ref2)
214
        self.assertEqual(ref3, ref3)
215
        self.assertNotEqual(ref3, ref4)
216
        self.assertNotEqual(ref4, ref1)
217
        self.assertNotEqual(ref4, ref2)
218
        self.assertNotEqual(ref4, ref3)
219
        self.assertEqual(ref4, ref4)