~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_weave.py

Merge in format-5 work - release bzr 0.1rc1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
"""test suite for weave algorithm"""
25
25
 
 
26
from pprint import pformat
26
27
 
27
 
import testsweet
28
 
from bzrlib.weave import Weave, WeaveFormatError
 
28
from bzrlib.weave import Weave, WeaveFormatError, WeaveError
29
29
from bzrlib.weavefile import write_weave, read_weave
30
 
from pprint import pformat
31
 
 
32
 
 
33
 
try:
34
 
    set
35
 
    frozenset
36
 
except NameError:
37
 
    from sets import Set, ImmutableSet
38
 
    set = Set
39
 
    frozenset = ImmutableSet
40
 
    del Set, ImmutableSet
41
 
 
 
30
from bzrlib.selftest import TestCase
 
31
from bzrlib.osutils import sha_string
42
32
 
43
33
 
44
34
# texts for use in testing
48
38
 
49
39
 
50
40
 
51
 
class TestBase(testsweet.TestBase):
 
41
class TestBase(TestCase):
52
42
    def check_read_write(self, k):
53
43
        """Check the weave k can be written & re-read."""
54
44
        from tempfile import TemporaryFile
111
101
        self.assertEqual(k.get(0), TEXT_0)
112
102
        self.assertEqual(k.get(1), TEXT_1)
113
103
 
114
 
        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))
115
113
 
116
114
 
117
115
 
127
125
                          ['new text!'])
128
126
 
129
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
 
130
155
class InsertLines(TestBase):
131
156
    """Store a revision that adds one line to the original.
132
157
 
470
495
        self.assertEqual(k.get(0),
471
496
                         ["first line"])
472
497
 
473
 
        k.dump(self.TEST_LOG)
474
 
 
475
498
 
476
499
class DivergedIncludes(TestBase):
477
500
    """Weave with two diverged texts based on version 0.
768
791
                     ['aaa', 'ddd', 'ccc'],
769
792
                     ['aaa', 'ccc'],
770
793
                     ['<<<<', 'aaa', '====', '>>>>', 'ccc'])
771
 
    
772
 
 
773
 
 
774
 
def testweave():
775
 
    import testsweet
776
 
    from unittest import TestSuite, TestLoader
777
 
    import testweave
778
 
 
779
 
    tl = TestLoader()
780
 
    suite = TestSuite()
781
 
    suite.addTest(tl.loadTestsFromModule(testweave))
782
 
    
783
 
    return int(not testsweet.run_suite(suite)) # for shell 0=true
 
794
 
 
795
 
 
796
class JoinWeavesTests(TestBase):
 
797
    def setUp(self):
 
798
        super(JoinWeavesTests, self).setUp()
 
799
        self.weave1 = Weave()
 
800
        self.lines1 = ['hello\n']
 
801
        self.lines3 = ['hello\n', 'cruel\n', 'world\n']
 
802
        self.weave1.add('v1', [], self.lines1)
 
803
        self.weave1.add('v2', [0], ['hello\n', 'world\n'])
 
804
        self.weave1.add('v3', [1], self.lines3)
 
805
        
 
806
    def test_join_empty(self):
 
807
        """Join two empty weaves."""
 
808
        eq = self.assertEqual
 
809
        w1 = Weave()
 
810
        w2 = Weave()
 
811
        w1.join(w2)
 
812
        eq(w1.numversions(), 0)
 
813
        
 
814
    def test_join_empty_to_nonempty(self):
 
815
        """Join empty weave onto nonempty."""
 
816
        self.weave1.join(Weave())
 
817
        self.assertEqual(len(self.weave1), 3)
 
818
 
 
819
    def test_join_unrelated(self):
 
820
        """Join two weaves with no history in common."""
 
821
        wb = Weave()
 
822
        wb.add('b1', [], ['line from b\n'])
 
823
        w1 = self.weave1
 
824
        w1.join(wb)
 
825
        eq = self.assertEqual
 
826
        eq(len(w1), 4)
 
827
        eq(sorted(list(w1.iter_names())),
 
828
           ['b1', 'v1', 'v2', 'v3'])
 
829
 
 
830
    def test_join_related(self):
 
831
        wa = self.weave1.copy()
 
832
        wb = self.weave1.copy()
 
833
        wa.add('a1', ['v3'], ['hello\n', 'sweet\n', 'world\n'])
 
834
        wb.add('b1', ['v3'], ['hello\n', 'pale blue\n', 'world\n'])
 
835
        eq = self.assertEquals
 
836
        eq(len(wa), 4)
 
837
        eq(len(wb), 4)
 
838
        wa.join(wb)
 
839
        eq(len(wa), 5)
 
840
        eq(wa.get_lines('b1'),
 
841
           ['hello\n', 'pale blue\n', 'world\n'])
 
842
 
 
843
    def test_join_parent_disagreement(self):
 
844
        """Cannot join weaves with different parents for a version."""
 
845
        wa = Weave()
 
846
        wb = Weave()
 
847
        wa.add('v1', [], ['hello\n'])
 
848
        wb.add('v0', [], [])
 
849
        wb.add('v1', ['v0'], ['hello\n'])
 
850
        self.assertRaises(WeaveError,
 
851
                          wa.join, wb)
 
852
 
 
853
    def test_join_text_disagreement(self):
 
854
        """Cannot join weaves with different texts for a version."""
 
855
        wa = Weave()
 
856
        wb = Weave()
 
857
        wa.add('v1', [], ['hello\n'])
 
858
        wb.add('v1', [], ['not\n', 'hello\n'])
 
859
        self.assertRaises(WeaveError,
 
860
                          wa.join, wb)
 
861
 
 
862
    def test_join_unordered(self):
 
863
        """Join weaves where indexes differ.
 
864
        
 
865
        The source weave contains a different version at index 0."""
 
866
        wa = self.weave1.copy()
 
867
        wb = Weave()
 
868
        wb.add('x1', [], ['line from x1\n'])
 
869
        wb.add('v1', [], ['hello\n'])
 
870
        wb.add('v2', ['v1'], ['hello\n', 'world\n'])
 
871
        wa.join(wb)
 
872
        eq = self.assertEquals
 
873
        eq(sorted(wa.iter_names()), ['v1', 'v2', 'v3', 'x1',])
 
874
        eq(wa.get_text('x1'), 'line from x1\n')
 
875
 
 
876
    def test_join_with_ghosts(self):
 
877
        """Join that inserts parents of an existing revision.
 
878
 
 
879
        This can happen when merging from another branch who
 
880
        knows about revisions the destination does not.  In 
 
881
        this test the second weave knows of an additional parent of 
 
882
        v2.  Any revisions which are in common still have to have the 
 
883
        same text."""
 
884
        return ###############################
 
885
        wa = self.weave1.copy()
 
886
        wb = Weave()
 
887
        wb.add('x1', [], ['line from x1\n'])
 
888
        wb.add('v1', [], ['hello\n'])
 
889
        wb.add('v2', ['v1', 'x1'], ['hello\n', 'world\n'])
 
890
        wa.join(wb)
 
891
        eq = self.assertEquals
 
892
        eq(sorted(wa.iter_names()), ['v1', 'v2', 'v3', 'x1',])
 
893
        eq(wa.get_text('x1'), 'line from x1\n')
784
894
 
785
895
 
786
896
if __name__ == '__main__':
787
897
    import sys
788
 
    sys.exit(testweave())
 
898
    import unittest
 
899
    sys.exit(unittest.main())
789
900