~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/testmerge3.py

  • Committer: Martin Pool
  • Date: 2005-07-05 10:14:37 UTC
  • Revision ID: mbp@sourcefrog.net-20050705101437-c41d1d0170905106
- don't sync up on blank or hash-only lines

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
from bzrlib.selftest import TestCaseInTempDir, TestCase
 
18
from bzrlib.selftest import InTempDir, TestBase
19
19
from bzrlib.merge3 import Merge3
20
20
 
21
 
def split_lines(t):
22
 
    from cStringIO import StringIO
23
 
    return StringIO(t).readlines()
24
 
 
25
 
############################################################
26
 
# test case data from the gnu diffutils manual
27
 
# common base
28
 
TZU = split_lines("""     The Nameless is the origin of Heaven and Earth;
29
 
     The named is the mother of all things.
30
 
     
31
 
     Therefore let there always be non-being,
32
 
       so we may see their subtlety,
33
 
     And let there always be being,
34
 
       so we may see their outcome.
35
 
     The two are the same,
36
 
     But after they are produced,
37
 
       they have different names.
38
 
     They both may be called deep and profound.
39
 
     Deeper and more profound,
40
 
     The door of all subtleties!
41
 
""")
42
 
 
43
 
LAO = split_lines("""     The Way that can be told of is not the eternal Way;
44
 
     The name that can be named is not the eternal name.
45
 
     The Nameless is the origin of Heaven and Earth;
46
 
     The Named is the mother of all things.
47
 
     Therefore let there always be non-being,
48
 
       so we may see their subtlety,
49
 
     And let there always be being,
50
 
       so we may see their outcome.
51
 
     The two are the same,
52
 
     But after they are produced,
53
 
       they have different names.
54
 
""")
55
 
 
56
 
 
57
 
TAO = split_lines("""     The Way that can be told of is not the eternal Way;
58
 
     The name that can be named is not the eternal name.
59
 
     The Nameless is the origin of Heaven and Earth;
60
 
     The named is the mother of all things.
61
 
     
62
 
     Therefore let there always be non-being,
63
 
       so we may see their subtlety,
64
 
     And let there always be being,
65
 
       so we may see their result.
66
 
     The two are the same,
67
 
     But after they are produced,
68
 
       they have different names.
69
 
     
70
 
       -- The Way of Lao-Tzu, tr. Wing-tsit Chan
71
 
 
72
 
""")
73
 
 
74
 
MERGED_RESULT = split_lines("""     The Way that can be told of is not the eternal Way;
75
 
     The name that can be named is not the eternal name.
76
 
     The Nameless is the origin of Heaven and Earth;
77
 
     The Named is the mother of all things.
78
 
     Therefore let there always be non-being,
79
 
       so we may see their subtlety,
80
 
     And let there always be being,
81
 
       so we may see their result.
82
 
     The two are the same,
83
 
     But after they are produced,
84
 
       they have different names.
85
 
<<<<<<< LAO
86
 
=======
87
 
     
88
 
       -- The Way of Lao-Tzu, tr. Wing-tsit Chan
89
 
 
90
 
>>>>>>> TAO
91
 
""")
92
 
 
93
 
class TestMerge3(TestCase):
94
 
 
95
 
    def test_no_changes(self):
96
 
        """No conflicts because nothing changed"""
 
21
 
 
22
 
 
23
 
 
24
 
 
25
class NoChanges(TestBase):
 
26
    """No conflicts because nothing changed"""
 
27
    def runTest(self):
97
28
        m3 = Merge3(['aaa', 'bbb'],
98
29
                    ['aaa', 'bbb'],
99
30
                    ['aaa', 'bbb'])
113
44
        self.assertEquals(list(m3.merge_groups()),
114
45
                          [('unchanged', ['aaa', 'bbb'])])
115
46
 
116
 
    def test_front_insert(self):
 
47
 
 
48
class FrontInsert(TestBase):
 
49
    def runTest(self):
117
50
        m3 = Merge3(['zz'],
118
51
                    ['aaa', 'bbb', 'zz'],
119
52
                    ['zz'])
132
65
                          [('a', ['aaa', 'bbb']),
133
66
                           ('unchanged', ['zz'])])
134
67
        
135
 
    def test_null_insert(self):
 
68
    
 
69
 
 
70
class NullInsert(TestBase):
 
71
    def runTest(self):
136
72
        m3 = Merge3([],
137
73
                    ['aaa', 'bbb'],
138
74
                    [])
 
75
 
139
76
        # todo: should use a sentinal at end as from get_matching_blocks
140
77
        # to match without zz
141
78
        self.assertEquals(list(m3.find_sync_regions()),
146
83
 
147
84
        self.assertEquals(list(m3.merge_lines()),
148
85
                          ['aaa', 'bbb'])
 
86
        
 
87
    
149
88
 
150
 
    def test_no_conflicts(self):
151
 
        """No conflicts because only one side changed"""
 
89
class NoConflicts(TestBase):
 
90
    """No conflicts because only one side changed"""
 
91
    def runTest(self):
152
92
        m3 = Merge3(['aaa', 'bbb'],
153
93
                    ['aaa', '111', 'bbb'],
154
94
                    ['aaa', 'bbb'])
166
106
                           ('a', 1, 2),
167
107
                           ('unchanged', 1, 2),])
168
108
 
169
 
    def test_append_a(self):
170
 
        m3 = Merge3(['aaa\n', 'bbb\n'],
171
 
                    ['aaa\n', 'bbb\n', '222\n'],
172
 
                    ['aaa\n', 'bbb\n'])
173
 
 
174
 
        self.assertEquals(''.join(m3.merge_lines()),
175
 
                          'aaa\nbbb\n222\n')
176
 
 
177
 
    def test_append_b(self):
178
 
        m3 = Merge3(['aaa\n', 'bbb\n'],
179
 
                    ['aaa\n', 'bbb\n'],
180
 
                    ['aaa\n', 'bbb\n', '222\n'])
181
 
 
182
 
        self.assertEquals(''.join(m3.merge_lines()),
183
 
                          'aaa\nbbb\n222\n')
184
 
 
185
 
    def test_append_agreement(self):
186
 
        m3 = Merge3(['aaa\n', 'bbb\n'],
187
 
                    ['aaa\n', 'bbb\n', '222\n'],
188
 
                    ['aaa\n', 'bbb\n', '222\n'])
189
 
 
190
 
        self.assertEquals(''.join(m3.merge_lines()),
191
 
                          'aaa\nbbb\n222\n')
192
 
 
193
 
    def test_append_clash(self):
194
 
        m3 = Merge3(['aaa\n', 'bbb\n'],
195
 
                    ['aaa\n', 'bbb\n', '222\n'],
196
 
                    ['aaa\n', 'bbb\n', '333\n'])
197
 
 
198
 
        ml = m3.merge_lines(name_a='a',
199
 
                            name_b='b',
200
 
                            start_marker='<<',
201
 
                            mid_marker='--',
202
 
                            end_marker='>>')
203
 
        self.assertEquals(''.join(ml),
204
 
'''\
205
 
aaa
206
 
bbb
207
 
<< a
208
 
222
209
 
--
210
 
333
211
 
>> b
212
 
''')
213
 
 
214
 
    def test_insert_agreement(self):
 
109
 
 
110
 
 
111
class InsertAgreement(TestBase):
 
112
    def runTest(self):
215
113
        m3 = Merge3(['aaa\n', 'bbb\n'],
216
114
                    ['aaa\n', '222\n', 'bbb\n'],
217
115
                    ['aaa\n', '222\n', 'bbb\n'])
218
116
 
219
 
        ml = m3.merge_lines(name_a='a',
220
 
                            name_b='b',
221
 
                            start_marker='<<',
222
 
                            mid_marker='--',
223
 
                            end_marker='>>')
224
 
        self.assertEquals(''.join(ml), 'aaa\n222\nbbb\n')
225
 
        
226
 
 
227
 
    def test_insert_clash(self):
228
 
        """Both try to insert lines in the same place."""
 
117
        self.assertEquals(''.join(m3.merge_lines()),
 
118
                          'aaa\n222\nbbb\n')
 
119
 
 
120
 
 
121
 
 
122
class InsertClash(TestBase):
 
123
    """Both try to insert lines in the same place."""
 
124
    def runTest(self):
229
125
        m3 = Merge3(['aaa\n', 'bbb\n'],
230
126
                    ['aaa\n', '111\n', 'bbb\n'],
231
127
                    ['aaa\n', '222\n', 'bbb\n'])
264
160
bbb
265
161
''')
266
162
 
267
 
    def test_replace_clash(self):
268
 
        """Both try to insert lines in the same place."""
 
163
 
 
164
 
 
165
class ReplaceClash(TestBase):
 
166
    """Both try to insert lines in the same place."""
 
167
    def runTest(self):
269
168
        m3 = Merge3(['aaa', '000', 'bbb'],
270
169
                    ['aaa', '111', 'bbb'],
271
170
                    ['aaa', '222', 'bbb'])
278
177
                           (2,3, 2,3, 2,3),
279
178
                           (3,3, 3,3, 3,3),])
280
179
 
281
 
    def test_replace_multi(self):
282
 
        """Replacement with regions of different size."""
 
180
 
 
181
 
 
182
class ReplaceMulti(TestBase):
 
183
    """Replacement with regions of different size."""
 
184
    def runTest(self):
283
185
        m3 = Merge3(['aaa', '000', '000', 'bbb'],
284
186
                    ['aaa', '111', '111', '111', 'bbb'],
285
187
                    ['aaa', '222', '222', '222', '222', 'bbb'])
293
195
                           (3,4, 4,5, 5,6),
294
196
                           (4,4, 5,5, 6,6),])
295
197
 
296
 
    def test_merge_poem(self):
297
 
        """Test case from diff3 manual"""
 
198
        
 
199
        
 
200
 
 
201
 
 
202
 
 
203
 
 
204
def split_lines(t):
 
205
    from cStringIO import StringIO
 
206
    return StringIO(t).readlines()
 
207
 
 
208
 
 
209
# common base
 
210
TZU = split_lines("""     The Nameless is the origin of Heaven and Earth;
 
211
     The named is the mother of all things.
 
212
     
 
213
     Therefore let there always be non-being,
 
214
       so we may see their subtlety,
 
215
     And let there always be being,
 
216
       so we may see their outcome.
 
217
     The two are the same,
 
218
     But after they are produced,
 
219
       they have different names.
 
220
     They both may be called deep and profound.
 
221
     Deeper and more profound,
 
222
     The door of all subtleties!
 
223
""")
 
224
 
 
225
LAO = split_lines("""     The Way that can be told of is not the eternal Way;
 
226
     The name that can be named is not the eternal name.
 
227
     The Nameless is the origin of Heaven and Earth;
 
228
     The Named is the mother of all things.
 
229
     Therefore let there always be non-being,
 
230
       so we may see their subtlety,
 
231
     And let there always be being,
 
232
       so we may see their outcome.
 
233
     The two are the same,
 
234
     But after they are produced,
 
235
       they have different names.
 
236
""")
 
237
 
 
238
 
 
239
TAO = split_lines("""     The Way that can be told of is not the eternal Way;
 
240
     The name that can be named is not the eternal name.
 
241
     The Nameless is the origin of Heaven and Earth;
 
242
     The named is the mother of all things.
 
243
     
 
244
     Therefore let there always be non-being,
 
245
       so we may see their subtlety,
 
246
     And let there always be being,
 
247
       so we may see their result.
 
248
     The two are the same,
 
249
     But after they are produced,
 
250
       they have different names.
 
251
     
 
252
       -- The Way of Lao-Tzu, tr. Wing-tsit Chan
 
253
 
 
254
""")
 
255
 
 
256
MERGED_RESULT = split_lines("""     The Way that can be told of is not the eternal Way;
 
257
     The name that can be named is not the eternal name.
 
258
     The Nameless is the origin of Heaven and Earth;
 
259
     The Named is the mother of all things.
 
260
     Therefore let there always be non-being,
 
261
       so we may see their subtlety,
 
262
     And let there always be being,
 
263
       so we may see their result.
 
264
     The two are the same,
 
265
     But after they are produced,
 
266
       they have different names.
 
267
<<<<<<<< LAO
 
268
========
 
269
     
 
270
       -- The Way of Lao-Tzu, tr. Wing-tsit Chan
 
271
 
 
272
>>>>>>>> TAO
 
273
""")
 
274
 
 
275
 
 
276
 
 
277
class MergePoem(TestBase):
 
278
    """Test case from diff3 manual"""
 
279
    def runTest(self):
298
280
        m3 = Merge3(TZU, LAO, TAO)
299
281
        ml = list(m3.merge_lines('LAO', 'TAO'))
300
282
        self.log('merge result:')