~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testweave.py

  • Committer: Martin Pool
  • Date: 2005-06-28 08:57:48 UTC
  • mto: This revision was merged to the branch mainline in revision 852.
  • Revision ID: mbp@sourcefrog.net-20050628085748-4df85f5d3304e7f1
doc

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/python2.4
2
 
 
3
1
# Copyright (C) 2005 by Canonical Ltd
4
2
 
5
3
# This program is free software; you can redistribute it and/or modify
23
21
 
24
22
 
25
23
from testsweet import TestBase
26
 
from weave import Weave, VerInfo, WeaveFormatError
27
 
from pprint import pformat
28
 
 
29
 
# XXX: If we do weaves this way, will a merge still behave the same
30
 
# way if it's done in a different order?  That's a pretty desirable
31
 
# property.
 
24
from weave import Weave, VerInfo
32
25
 
33
26
 
34
27
# texts for use in testing
77
70
 
78
71
 
79
72
 
80
 
class DeltaAdd(TestBase):
 
73
class Delta1(TestBase):
81
74
    """Detection of changes prior to inserting new revision."""
82
75
    def runTest(self):
 
76
        return ########################## SKIPPED
 
77
        from pprint import pformat
 
78
 
83
79
        k = Weave()
84
80
        k.add([], ['line 1'])
85
81
 
86
 
        self.assertEqual(k._l,
87
 
                         [('{', 0),
88
 
                          'line 1',
89
 
                          ('}', 0),
90
 
                          ])
91
 
 
92
82
        changes = list(k._delta(set([0]),
93
83
                                ['line 1',
94
84
                                 'new line']))
95
85
 
96
86
        self.log('raw changes: ' + pformat(changes))
97
87
 
98
 
        # currently there are 3 lines in the weave, and we insert after them
 
88
        # should be one inserted line after line 0q
99
89
        self.assertEquals(changes,
100
 
                          [(3, 3, ['new line'])])
 
90
                          [(1, 1, ['new line'])])
101
91
 
102
92
        changes = k._delta(set([0]),
103
93
                           ['top line',
104
94
                            'line 1'])
105
95
        
106
96
        self.assertEquals(list(changes),
107
 
                          [(1, 1, ['top line'])])
 
97
                          [(0, 0, ['top line'])])
108
98
 
109
99
 
110
100
 
125
115
    Look at the annotations to make sure that the first line is matched
126
116
    and not stored repeatedly."""
127
117
    def runTest(self):
 
118
        return ########################## SKIPPED
 
119
        
128
120
        k = Weave()
129
121
 
130
122
        k.add([], ['line 1'])
147
139
                         [(0, 'line 1'),
148
140
                          (2, 'diverged line')])
149
141
 
150
 
        text3 = ['line 1', 'middle line', 'line 2']
151
142
        k.add([0, 1],
152
 
              text3)
153
 
 
154
 
        self.log("changes to text3: " + pformat(list(k._delta(set([0, 1]), text3))))
155
 
 
156
 
        self.log("k._l=" + pformat(k._l))
 
143
              ['line 1', 'middle line', 'line 2'])
157
144
 
158
145
        self.assertEqual(k.annotate(3),
159
146
                         [(0, 'line 1'),
174
161
 
175
162
 
176
163
 
177
 
class DeleteLines(TestBase):
178
 
    """Deletion of lines from existing text.
179
 
 
180
 
    Try various texts all based on a common ancestor."""
181
 
    def runTest(self):
182
 
        k = Weave()
183
 
 
184
 
        base_text = ['one', 'two', 'three', 'four']
185
 
 
186
 
        k.add([], base_text)
187
 
        
188
 
        texts = [['one', 'two', 'three'],
189
 
                 ['two', 'three', 'four'],
190
 
                 ['one', 'four'],
191
 
                 ['one', 'two', 'three', 'four'],
192
 
                 ]
193
 
 
194
 
        for t in texts:
195
 
            ver = k.add([0], t)
196
 
 
197
 
        self.log('final weave:')
198
 
        self.log('k._l=' + pformat(k._l))
199
 
 
200
 
        for i in range(len(texts)):
201
 
            self.assertEqual(k.get(i+1),
202
 
                             texts[i])
203
 
            
204
 
 
205
 
 
206
 
 
207
 
class SuicideDelete(TestBase):
208
 
    """Invalid weave which tries to add and delete simultaneously."""
209
 
    def runTest(self):
210
 
        k = Weave()
211
 
 
212
 
        k._v = [VerInfo([]),
213
 
                ]
214
 
        k._l = [('{', 0),
215
 
                'first line',
216
 
                ('[', 0),
217
 
                'deleted in 0',
218
 
                (']', 0),
219
 
                ('}', 0),
220
 
                ]
221
 
 
222
 
        self.assertRaises(WeaveFormatError,
223
 
                          k.get,
224
 
                          0)        
225
 
 
226
 
 
227
 
 
228
 
class CannedDelete(TestBase):
229
 
    """Unpack canned weave with deleted lines."""
230
 
    def runTest(self):
231
 
        k = Weave()
232
 
 
233
 
        k._v = [VerInfo([]),
234
 
                VerInfo([0]),
235
 
                ]
236
 
        k._l = [('{', 0),
237
 
                'first line',
238
 
                ('[', 1),
239
 
                'line to be deleted',
240
 
                (']', 1),
241
 
                'last line',
242
 
                ('}', 0),
243
 
                ]
244
 
 
245
 
        self.assertEqual(k.get(0),
246
 
                         ['first line',
247
 
                          'line to be deleted',
248
 
                          'last line',
249
 
                          ])
250
 
 
251
 
        self.assertEqual(k.get(1),
252
 
                         ['first line',
253
 
                          'last line',
254
 
                          ])
255
 
 
256
 
 
257
 
 
258
 
class CannedReplacement(TestBase):
259
 
    """Unpack canned weave with deleted lines."""
260
 
    def runTest(self):
261
 
        k = Weave()
262
 
 
263
 
        k._v = [VerInfo([]),
264
 
                VerInfo([0]),
265
 
                ]
266
 
        k._l = [('{', 0),
267
 
                'first line',
268
 
                ('[', 1),
269
 
                'line to be deleted',
270
 
                (']', 1),
271
 
                ('{', 1),
272
 
                'replacement line',                
273
 
                ('}', 1),
274
 
                'last line',
275
 
                ('}', 0),
276
 
                ]
277
 
 
278
 
        self.assertEqual(k.get(0),
279
 
                         ['first line',
280
 
                          'line to be deleted',
281
 
                          'last line',
282
 
                          ])
283
 
 
284
 
        self.assertEqual(k.get(1),
285
 
                         ['first line',
286
 
                          'replacement line',
287
 
                          'last line',
288
 
                          ])
289
 
 
290
 
 
291
 
 
292
 
class BadWeave(TestBase):
293
 
    """Test that we trap an insert which should not occur."""
294
 
    def runTest(self):
295
 
        k = Weave()
296
 
 
297
 
        k._v = [VerInfo([]),
298
 
                ]
299
 
        k._l = ['bad line',
300
 
                ('{', 0),
301
 
                'foo {',
302
 
                ('{', 1),
303
 
                '  added in version 1',
304
 
                ('{', 2),
305
 
                '  added in v2',
306
 
                ('}', 2),
307
 
                '  also from v1',
308
 
                ('}', 1),
309
 
                '}',
310
 
                ('}', 0)]
311
 
 
312
 
        self.assertRaises(WeaveFormatError,
313
 
                          k.get,
314
 
                          0)
315
 
 
316
 
 
317
 
class BadInsert(TestBase):
318
 
    """Test that we trap an insert which should not occur."""
319
 
    def runTest(self):
320
 
        k = Weave()
321
 
 
322
 
        k._v = [VerInfo([]),
323
 
                VerInfo([0]),
324
 
                VerInfo([0]),
325
 
                VerInfo([0,1,2]),
326
 
                ]
327
 
        k._l = [('{', 0),
328
 
                'foo {',
329
 
                ('{', 1),
330
 
                '  added in version 1',
331
 
                ('{', 1),
332
 
                '  more in 1',
333
 
                ('}', 1),
334
 
                ('}', 1),
335
 
                ('}', 0)]
336
 
 
337
 
        self.assertRaises(WeaveFormatError,
338
 
                          k.get,
339
 
                          0)
340
 
 
341
 
        self.assertRaises(WeaveFormatError,
342
 
                          k.get,
343
 
                          1)
344
 
 
345
 
 
346
164
class InsertNested(TestBase):
347
165
    """Insertion with nested instructions."""
348
166
    def runTest(self):
389
207
                         
390
208
 
391
209
 
392
 
class DeleteLines2(TestBase):
 
210
class DeleteLines(TestBase):
393
211
    """Test recording revisions that delete lines.
394
212
 
395
213
    This relies on the weave having a way to represent lines knocked
404
222
 
405
223
        self.assertEqual(len(k.get(0)), 4)
406
224
 
 
225
        return ################################## SKIPPED
 
226
 
407
227
        k.add([0], ["line the first",
408
228
                   "fine"])
409
229
 
411
231
                         ["line the first",
412
232
                          "fine"])
413
233
 
414
 
        self.assertEqual(k.annotate(1),
415
 
                         [(0, "line the first"),
416
 
                          (0, "fine")])
417
 
 
418
234
 
419
235
 
420
236
class IncludeVersions(TestBase):
480
296
                         ["first line",
481
297
                          "alternative second line"])
482
298
 
483
 
 
484
 
 
485
 
class ReplaceLine(TestBase):
486
 
    def runTest(self):
487
 
        k = Weave()
488
 
 
489
 
        text0 = ['cheddar', 'stilton', 'gruyere']
490
 
        text1 = ['cheddar', 'blue vein', 'neufchatel', 'chevre']
491
 
        
492
 
        k.add([], text0)
493
 
        k.add([0], text1)
494
 
 
495
 
        self.log('k._l=' + pformat(k._l))
496
 
 
497
 
        self.assertEqual(k.get(0), text0)
498
 
        self.assertEqual(k.get(1), text1)
499
 
 
500
 
        
501
 
 
502
 
 
503
 
class Khayyam(TestBase):
504
 
    def runTest(self):
505
 
        rawtexts = [
506
 
            """A Book of Verses underneath the Bough,
507
 
            A Jug of Wine, a Loaf of Bread, -- and Thou
508
 
            Beside me singing in the Wilderness --
509
 
            Oh, Wilderness were Paradise enow!""",
510
 
            
511
 
            """A Book of Verses underneath the Bough,
512
 
            A Jug of Wine, a Loaf of Bread, -- and Thou
513
 
            Beside me singing in the Wilderness --
514
 
            Oh, Wilderness were Paradise now!""",
515
 
 
516
 
            """A Book of poems underneath the tree,
517
 
            A Jug of Wine, a Loaf of Bread,
518
 
            and Thou
519
 
            Beside me singing in the Wilderness --
520
 
            Oh, Wilderness were Paradise now!
521
 
 
522
 
            -- O. Khayyam""",
523
 
 
524
 
            """A Book of Verses underneath the Bough,
525
 
            A Jug of Wine, a Loaf of Bread,
526
 
            and Thou
527
 
            Beside me singing in the Wilderness --
528
 
            Oh, Wilderness were Paradise now!
529
 
            """,
530
 
            ]
531
 
        texts = [[l.strip() for l in t.split('\n')] for t in rawtexts]
532
 
 
533
 
        k = Weave()
534
 
        parents = set()
535
 
        for t in texts:
536
 
            ver = k.add(parents, t)
537
 
            parents.add(ver)
538
 
 
539
 
        self.log("k._l=" + pformat(k._l))
540
 
 
541
 
        for i, t in enumerate(texts):
542
 
            self.assertEqual(k.get(i),
543
 
                             t)            
544
 
 
545
 
 
546
 
 
547
299
def testweave():
548
300
    import testsweet
549
301
    from unittest import TestSuite, TestLoader
550
302
    import testweave
551
 
 
 
303
 
552
304
    tl = TestLoader()
553
305
    suite = TestSuite()
554
306
    suite.addTest(tl.loadTestsFromModule(testweave))