~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tests/test_groupcompress.py

Core proof of concept working.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
import zlib
21
21
 
22
22
from bzrlib import tests
 
23
from bzrlib.osutils import sha_strings
23
24
from bzrlib.plugins.groupcompress import errors, groupcompress
24
25
from bzrlib.tests import (
25
26
    TestCaseWithTransport,
47
48
    return standard_tests
48
49
 
49
50
 
 
51
class TestGroupCompressor(TestCaseWithTransport):
 
52
    """Tests for GroupCompressor"""
 
53
 
 
54
    def test_empty_delta(self):
 
55
        compressor = groupcompress.GroupCompressor(True)
 
56
        self.assertEqual([], compressor.lines)
 
57
 
 
58
    def test_one_nosha_delta(self):
 
59
        # diff against NUKK
 
60
        compressor = groupcompress.GroupCompressor(True)
 
61
        sha1, end_point = compressor.compress(('label',),
 
62
            ['strange\n', 'common\n'], None)
 
63
        self.assertEqual(sha_strings(['strange\n', 'common\n']), sha1)
 
64
        expected_lines = [
 
65
            'label: label\n',
 
66
            'sha1: %s\n' % sha1,
 
67
            '0,0,3\n',
 
68
            'strange\n',
 
69
            'common\n',
 
70
            '\n', # the last \n in a text is removed, which allows safe
 
71
            # serialisation of lines without trailing \n.
 
72
            ]
 
73
        self.assertEqual(expected_lines, compressor.lines)
 
74
        self.assertEqual(sum(map(len, expected_lines)), end_point)
 
75
 
 
76
    def test_two_nosha_delta(self):
 
77
        compressor = groupcompress.GroupCompressor(True)
 
78
        sha1_1, _ = compressor.compress(('label',),
 
79
            ['strange\n', 'common\n'], None)
 
80
        sha1_2, end_point = compressor.compress(('newlabel',),
 
81
            ['common\n', 'different\n'], None)
 
82
        self.assertEqual(sha_strings(['common\n', 'different\n']), sha1_2)
 
83
        expected_lines = [
 
84
            'label: label\n',
 
85
            'sha1: %s\n' % sha1_1,
 
86
            '0,0,3\n',
 
87
            'strange\n',
 
88
            'common\n',
 
89
            '\n',
 
90
            'label: newlabel\n',
 
91
            'sha1: %s\n' % sha1_2,
 
92
            # Delete what we don't want. Perhaps we want an implicit
 
93
            # delete all to keep from bloating with useless delete
 
94
            # instructions.
 
95
            '0,4,0\n',
 
96
            # add the new lines
 
97
            '5,5,1\n',
 
98
            'different\n',
 
99
            ]
 
100
        self.assertEqual(expected_lines, compressor.lines)
 
101
        self.assertEqual(sum(map(len, expected_lines)), end_point)
 
102
 
 
103
    def test_three_nosha_delta(self):
 
104
        # The first interesting test: make a change that should use lines from
 
105
        # both parents.
 
106
        compressor = groupcompress.GroupCompressor(True)
 
107
        sha1_1, end_point = compressor.compress(('label',),
 
108
            ['strange\n', 'common\n'], None)
 
109
        sha1_2, _ = compressor.compress(('newlabel',),
 
110
            ['common\n', 'different\n', 'moredifferent\n'], None)
 
111
        sha1_3, end_point = compressor.compress(('label3',),
 
112
            ['new\n', 'common\n', 'different\n', 'moredifferent\n'], None)
 
113
        self.assertEqual(
 
114
            sha_strings(['new\n', 'common\n', 'different\n', 'moredifferent\n']),
 
115
            sha1_3)
 
116
        expected_lines = [
 
117
            'label: label\n',
 
118
            'sha1: %s\n' % sha1_1,
 
119
            '0,0,3\n',
 
120
            'strange\n',
 
121
            'common\n',
 
122
            '\n',
 
123
            'label: newlabel\n',
 
124
            'sha1: %s\n' % sha1_2,
 
125
            # Delete what we don't want. Perhaps we want an implicit
 
126
            # delete all to keep from bloating with useless delete
 
127
            # instructions.
 
128
            '0,4,0\n',
 
129
            # add the new lines
 
130
            '5,5,2\n',
 
131
            'different\n',
 
132
            'moredifferent\n',
 
133
            'label: label3\n',
 
134
            'sha1: %s\n' % sha1_3,
 
135
            # Delete what we don't want. Perhaps we want an implicit
 
136
            # delete all to keep from bloating with useless delete
 
137
            # instructions.
 
138
            # replace 'strange' with 'new'
 
139
            '0,4,1\n',
 
140
            'new\n',
 
141
            # delete from after common up to differnet
 
142
            '5,10,0\n',
 
143
            # add new \n
 
144
            '12,12,1\n',
 
145
            '\n',
 
146
            ]
 
147
        self.assertEqualDiff(''.join(expected_lines), ''.join(compressor.lines))
 
148
        self.assertEqual(sum(map(len, expected_lines)), end_point)
 
149
 
 
150
    def test_stats(self):
 
151
        compressor = groupcompress.GroupCompressor(True)
 
152
        compressor.compress(('label',),
 
153
            ['strange\n', 'common\n'], None)
 
154
        compressor.compress(('newlabel',),
 
155
            ['common\n', 'different\n', 'moredifferent\n'], None)
 
156
        compressor.compress(('label3',),
 
157
            ['new\n', 'common\n', 'different\n', 'moredifferent\n'], None)
 
158
        self.assertAlmostEqual(0.3, compressor.ratio(), 1)