~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/testweave.py

add a clean target

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
"""test suite for weave algorithm"""
25
25
 
 
26
 
 
27
import testsweet
 
28
from bzrlib.weave import Weave, WeaveFormatError
 
29
from bzrlib.weavefile import write_weave, read_weave
26
30
from pprint import pformat
27
31
 
28
 
from bzrlib.weave import Weave, WeaveFormatError, WeaveError
29
 
from bzrlib.weavefile import write_weave, read_weave
30
 
from bzrlib.selftest import TestCase
31
 
from bzrlib.osutils import sha_string
 
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
 
32
42
 
33
43
 
34
44
# texts for use in testing
38
48
 
39
49
 
40
50
 
41
 
class TestBase(TestCase):
 
51
class TestBase(testsweet.TestBase):
42
52
    def check_read_write(self, k):
43
53
        """Check the weave k can be written & re-read."""
44
54
        from tempfile import TemporaryFile
101
111
        self.assertEqual(k.get(0), TEXT_0)
102
112
        self.assertEqual(k.get(1), TEXT_1)
103
113
 
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))
 
114
        k.dump(self.TEST_LOG)
113
115
 
114
116
 
115
117
 
125
127
                          ['new text!'])
126
128
 
127
129
 
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
 
 
155
130
class InsertLines(TestBase):
156
131
    """Store a revision that adds one line to the original.
157
132
 
495
470
        self.assertEqual(k.get(0),
496
471
                         ["first line"])
497
472
 
 
473
        k.dump(self.TEST_LOG)
 
474
 
498
475
 
499
476
class DivergedIncludes(TestBase):
500
477
    """Weave with two diverged texts based on version 0.
791
768
                     ['aaa', 'ddd', 'ccc'],
792
769
                     ['aaa', 'ccc'],
793
770
                     ['<<<<', 'aaa', '====', '>>>>', 'ccc'])
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')
 
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
894
784
 
895
785
 
896
786
if __name__ == '__main__':
897
787
    import sys
898
 
    import unittest
899
 
    sys.exit(unittest.main())
 
788
    sys.exit(testweave())
900
789