~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_weave.py

[merge] jam-integration

Show diffs side-by-side

added added

removed removed

Lines of Context:
991
991
        self.assertRaises(errors.WeaveInvalidChecksum, w.check)
992
992
 
993
993
 
 
994
class InstrumentedWeave(Weave):
 
995
    """Keep track of how many times functions are called."""
 
996
    
 
997
    def __init__(self, weave_name=None):
 
998
        self._extract_count = 0
 
999
        Weave.__init__(self, weave_name=weave_name)
 
1000
 
 
1001
    def _extract(self, versions):
 
1002
        self._extract_count += 1
 
1003
        return Weave._extract(self, versions)
 
1004
 
 
1005
 
 
1006
class JoinOptimization(TestCase):
 
1007
    """Test that Weave.join() doesn't extract all texts, only what must be done."""
 
1008
 
 
1009
    def test_join(self):
 
1010
        w1 = InstrumentedWeave()
 
1011
        w2 = InstrumentedWeave()
 
1012
 
 
1013
        txt0 = ['a\n']
 
1014
        txt1 = ['a\n', 'b\n']
 
1015
        txt2 = ['a\n', 'c\n']
 
1016
        txt3 = ['a\n', 'b\n', 'c\n']
 
1017
 
 
1018
        w1.add('txt0', [], txt0) # extract 1a
 
1019
        w2.add('txt0', [], txt0) # extract 1b
 
1020
        w1.add('txt1', [0], txt1)# extract 2a
 
1021
        w2.add('txt2', [0], txt2)# extract 2b
 
1022
        w1.join(w2) # extract 3a to add txt2 
 
1023
        w2.join(w1) # extract 3b to add txt1 
 
1024
 
 
1025
        w1.add('txt3', [1, 2], txt3) # extract 4a 
 
1026
        w2.add('txt3', [1, 2], txt3) # extract 4b
 
1027
        # These secretly have inverted parents
 
1028
 
 
1029
        # This should not have to do any extractions
 
1030
        w1.join(w2) # NO extract, texts already present with same parents
 
1031
        w2.join(w1) # NO extract, texts already present with same parents
 
1032
 
 
1033
        self.assertEqual(4, w1._extract_count)
 
1034
        self.assertEqual(4, w2._extract_count)
 
1035
 
 
1036
    def test_double_parent(self):
 
1037
        # It should not be considered illegal to add
 
1038
        # a revision with the same parent twice
 
1039
        w1 = InstrumentedWeave()
 
1040
        w2 = InstrumentedWeave()
 
1041
 
 
1042
        txt0 = ['a\n']
 
1043
        txt1 = ['a\n', 'b\n']
 
1044
        txt2 = ['a\n', 'c\n']
 
1045
        txt3 = ['a\n', 'b\n', 'c\n']
 
1046
 
 
1047
        w1.add('txt0', [], txt0)
 
1048
        w2.add('txt0', [], txt0)
 
1049
        w1.add('txt1', [0], txt1)
 
1050
        w2.add('txt1', [0,0], txt1)
 
1051
        # Same text, effectively the same, because the
 
1052
        # parent is only repeated
 
1053
        w1.join(w2) # extract 3a to add txt2 
 
1054
        w2.join(w1) # extract 3b to add txt1 
 
1055
 
 
1056
 
 
1057
class MismatchedTexts(TestCase):
 
1058
    """Test that merging two weaves with different texts fails."""
 
1059
 
 
1060
    def test_reweave(self):
 
1061
        w1 = Weave('a')
 
1062
        w2 = Weave('b')
 
1063
 
 
1064
        w1.add('txt0', [], ['a\n'])
 
1065
        w2.add('txt0', [], ['a\n'])
 
1066
        w1.add('txt1', [0], ['a\n', 'b\n'])
 
1067
        w2.add('txt1', [0], ['a\n', 'c\n'])
 
1068
 
 
1069
        self.assertRaises(errors.WeaveTextDiffers, w1.reweave, w2)
 
1070
 
 
1071