~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_weave.py

  • Committer: Robert Collins
  • Date: 2005-10-03 05:54:35 UTC
  • mto: (1393.1.30)
  • mto: This revision was merged to the branch mainline in revision 1400.
  • Revision ID: robertc@robertcollins.net-20051003055434-c8ebd30d1de10247
move exporting functionality into inventory.py - uncovers bug in symlink support

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
18
 
19
19
 
 
20
# TODO: tests regarding version names
 
21
 
20
22
 
21
23
 
22
24
"""test suite for weave algorithm"""
23
25
 
 
26
from pprint import pformat
24
27
 
25
 
import testsweet
26
 
from bzrlib.weave import Weave, WeaveFormatError
 
28
from bzrlib.weave import Weave, WeaveFormatError, WeaveError
27
29
from bzrlib.weavefile import write_weave, read_weave
28
 
from pprint import pformat
29
 
 
30
 
 
31
 
try:
32
 
    set
33
 
    frozenset
34
 
except NameError:
35
 
    from sets import Set, ImmutableSet
36
 
    set = Set
37
 
    frozenset = ImmutableSet
38
 
    del Set, ImmutableSet
39
 
 
 
30
from bzrlib.selftest import TestCase
 
31
from bzrlib.osutils import sha_string
40
32
 
41
33
 
42
34
# texts for use in testing
46
38
 
47
39
 
48
40
 
49
 
class TestBase(testsweet.TestBase):
 
41
class TestBase(TestCase):
50
42
    def check_read_write(self, k):
51
43
        """Check the weave k can be written & re-read."""
52
44
        from tempfile import TemporaryFile
60
52
            tf.seek(0)
61
53
            self.log('serialized weave:')
62
54
            self.log(tf.read())
 
55
 
 
56
            self.log('')
 
57
            self.log('parents: %s' % (k._parents == k2._parents))
 
58
            self.log('         %r' % k._parents)
 
59
            self.log('         %r' % k2._parents)
 
60
            self.log('')
 
61
 
 
62
            
63
63
            self.fail('read/write check failed')
64
64
        
65
65
        
74
74
    """Store and retrieve a simple text."""
75
75
    def runTest(self):
76
76
        k = Weave()
77
 
        idx = k.add([], TEXT_0)
 
77
        idx = k.add('text0', [], TEXT_0)
78
78
        self.assertEqual(k.get(idx), TEXT_0)
79
79
        self.assertEqual(idx, 0)
80
80
 
83
83
class AnnotateOne(TestBase):
84
84
    def runTest(self):
85
85
        k = Weave()
86
 
        k.add([], TEXT_0)
 
86
        k.add('text0', [], TEXT_0)
87
87
        self.assertEqual(k.annotate(0),
88
88
                         [(0, TEXT_0[0])])
89
89
 
92
92
    def runTest(self):
93
93
        k = Weave()
94
94
 
95
 
        idx = k.add([], TEXT_0)
 
95
        idx = k.add('text0', [], TEXT_0)
96
96
        self.assertEqual(idx, 0)
97
97
 
98
 
        idx = k.add([], TEXT_1)
 
98
        idx = k.add('text1', [], TEXT_1)
99
99
        self.assertEqual(idx, 1)
100
100
 
101
101
        self.assertEqual(k.get(0), TEXT_0)
102
102
        self.assertEqual(k.get(1), TEXT_1)
103
103
 
104
 
        k.dump(self.TEST_LOG)
 
104
 
 
105
 
 
106
class AddWithGivenSha(TestBase):
 
107
    def runTest(self):
 
108
        """Add with caller-supplied SHA-1"""
 
109
        k = Weave()
 
110
 
 
111
        t = 'text0'
 
112
        k.add('text0', [], [t], sha1=sha_string(t))
105
113
 
106
114
 
107
115
 
112
120
 
113
121
        self.assertRaises(IndexError,
114
122
                          k.add,
 
123
                          'text0',
115
124
                          [69],
116
125
                          ['new text!'])
117
126
 
118
127
 
 
128
class RepeatedAdd(TestBase):
 
129
    """Add the same version twice; harmless."""
 
130
    def runTest(self):
 
131
        k = Weave()
 
132
        idx = k.add('text0', [], TEXT_0)
 
133
        idx2 = k.add('text0', [], TEXT_0)
 
134
        self.assertEqual(idx, idx2)
 
135
 
 
136
 
 
137
 
 
138
class InvalidRepeatedAdd(TestBase):
 
139
    def runTest(self):
 
140
        k = Weave()
 
141
        idx = k.add('text0', [], TEXT_0)
 
142
        self.assertRaises(WeaveError,
 
143
                          k.add,
 
144
                          'text0',
 
145
                          [],
 
146
                          ['not the same text'])
 
147
        self.assertRaises(WeaveError,
 
148
                          k.add,
 
149
                          'text0',
 
150
                          [12],         # not the right parents
 
151
                          TEXT_0)
 
152
        
 
153
 
 
154
 
119
155
class InsertLines(TestBase):
120
156
    """Store a revision that adds one line to the original.
121
157
 
124
160
    def runTest(self):
125
161
        k = Weave()
126
162
 
127
 
        k.add([], ['line 1'])
128
 
        k.add([0], ['line 1', 'line 2'])
 
163
        k.add('text0', [], ['line 1'])
 
164
        k.add('text1', [0], ['line 1', 'line 2'])
129
165
 
130
166
        self.assertEqual(k.annotate(0),
131
167
                         [(0, 'line 1')])
138
174
                         [(0, 'line 1'),
139
175
                          (1, 'line 2')])
140
176
 
141
 
        k.add([0], ['line 1', 'diverged line'])
 
177
        k.add('text2', [0], ['line 1', 'diverged line'])
142
178
 
143
179
        self.assertEqual(k.annotate(2),
144
180
                         [(0, 'line 1'),
145
181
                          (2, 'diverged line')])
146
182
 
147
183
        text3 = ['line 1', 'middle line', 'line 2']
148
 
        k.add([0, 1],
 
184
        k.add('text3',
 
185
              [0, 1],
149
186
              text3)
150
187
 
151
188
        # self.log("changes to text3: " + pformat(list(k._delta(set([0, 1]), text3))))
158
195
                          (1, 'line 2')])
159
196
 
160
197
        # now multiple insertions at different places
161
 
        k.add([0, 1, 3],
 
198
        k.add('text4',
 
199
              [0, 1, 3],
162
200
              ['line 1', 'aaa', 'middle line', 'bbb', 'line 2', 'ccc'])
163
201
 
164
202
        self.assertEqual(k.annotate(4), 
180
218
 
181
219
        base_text = ['one', 'two', 'three', 'four']
182
220
 
183
 
        k.add([], base_text)
 
221
        k.add('text0', [], base_text)
184
222
        
185
223
        texts = [['one', 'two', 'three'],
186
224
                 ['two', 'three', 'four'],
188
226
                 ['one', 'two', 'three', 'four'],
189
227
                 ]
190
228
 
 
229
        i = 1
191
230
        for t in texts:
192
 
            ver = k.add([0], t)
 
231
            ver = k.add('text%d' % i,
 
232
                        [0], t)
 
233
            i += 1
193
234
 
194
235
        self.log('final weave:')
195
236
        self.log('k._weave=' + pformat(k._weave))
406
447
    def runTest(self):
407
448
        k = Weave()
408
449
 
409
 
        k.add([], ["line the first",
 
450
        k.add('text0', [], ["line the first",
410
451
                   "line 2",
411
452
                   "line 3",
412
453
                   "fine"])
413
454
 
414
455
        self.assertEqual(len(k.get(0)), 4)
415
456
 
416
 
        k.add([0], ["line the first",
 
457
        k.add('text1', [0], ["line the first",
417
458
                   "fine"])
418
459
 
419
460
        self.assertEqual(k.get(1),
454
495
        self.assertEqual(k.get(0),
455
496
                         ["first line"])
456
497
 
457
 
        k.dump(self.TEST_LOG)
458
 
 
459
498
 
460
499
class DivergedIncludes(TestBase):
461
500
    """Weave with two diverged texts based on version 0.
501
540
        text0 = ['cheddar', 'stilton', 'gruyere']
502
541
        text1 = ['cheddar', 'blue vein', 'neufchatel', 'chevre']
503
542
        
504
 
        k.add([], text0)
505
 
        k.add([0], text1)
 
543
        k.add('text0', [], text0)
 
544
        k.add('text1', [0], text1)
506
545
 
507
546
        self.log('k._weave=' + pformat(k._weave))
508
547
 
522
561
                 ['header', '', 'line from 1', 'fixup line', 'line from 2'],
523
562
                 ]
524
563
 
525
 
        k.add([], texts[0])
526
 
        k.add([0], texts[1])
527
 
        k.add([0], texts[2])
528
 
        k.add([0, 1, 2], texts[3])
 
564
        k.add('text0', [], texts[0])
 
565
        k.add('text1', [0], texts[1])
 
566
        k.add('text2', [0], texts[2])
 
567
        k.add('merge', [0, 1, 2], texts[3])
529
568
 
530
569
        for i, t in enumerate(texts):
531
570
            self.assertEqual(k.get(i), t)
593
632
                 ['header', 'aaa', 'bbb', 'line from 2', 'more from 2'],
594
633
                 ]
595
634
 
596
 
        k.add([], texts[0])
597
 
        k.add([0], texts[1])
598
 
        k.add([0], texts[2])
 
635
        k.add('text0', [], texts[0])
 
636
        k.add('text1', [0], texts[1])
 
637
        k.add('text2', [0], texts[2])
599
638
 
600
639
        self.log('k._weave=' + pformat(k._weave))
601
640
 
641
680
 
642
681
        k = Weave()
643
682
        parents = set()
 
683
        i = 0
644
684
        for t in texts:
645
 
            ver = k.add(list(parents), t)
 
685
            ver = k.add('text%d' % i,
 
686
                        list(parents), t)
646
687
            parents.add(ver)
 
688
            i += 1
647
689
 
648
690
        self.log("k._weave=" + pformat(k._weave))
649
691
 
663
705
            return x + '\n'
664
706
        
665
707
        w = Weave()
666
 
        w.add([], map(addcrlf, base))
667
 
        w.add([0], map(addcrlf, a))
668
 
        w.add([0], map(addcrlf, b))
 
708
        w.add('text0', [], map(addcrlf, base))
 
709
        w.add('text1', [0], map(addcrlf, a))
 
710
        w.add('text2', [0], map(addcrlf, b))
669
711
 
670
712
        self.log('weave is:')
671
713
        tmpf = StringIO()
752
794
    
753
795
 
754
796
 
755
 
def testweave():
756
 
    import testsweet
757
 
    from unittest import TestSuite, TestLoader
758
 
    import testweave
759
 
 
760
 
    tl = TestLoader()
761
 
    suite = TestSuite()
762
 
    suite.addTest(tl.loadTestsFromModule(testweave))
763
 
    
764
 
    return int(not testsweet.run_suite(suite)) # for shell 0=true
765
 
 
766
 
 
767
797
if __name__ == '__main__':
768
798
    import sys
769
 
    sys.exit(testweave())
 
799
    import unittest
 
800
    sys.exit(unittest.main())
770
801