/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2005-2010 Aaron Bentley, Canonical Ltd
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
2
#
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.82.127 by Aaron Bentley
PEP8 updates
16
17
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
18
import os.path
19
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
20
from breezy.tests import TestCase
3376.2.6 by Martin Pool
Make PatchesTester use bzrlib TestCase base
21
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
22
from breezy.iterablefile import IterableFile
23
from breezy.patches import (MalformedLine,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
24
                            MalformedHunkHeader,
25
                            MalformedPatchHeader,
4634.80.1 by Aaron Bentley
Parse binary files.
26
                            BinaryPatch,
4634.80.3 by Aaron Bentley
Clean up tests, test iter_patched.
27
                            BinaryFiles,
4634.80.1 by Aaron Bentley
Parse binary files.
28
                            Patch,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
29
                            ContextLine,
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
30
                            InsertLine,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
31
                            RemoveLine,
32
                            difference_index,
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
33
                            get_patch_names,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
34
                            hunk_from_header,
35
                            iter_patched,
3363.18.3 by Aaron Bentley
Add tests for iter_patched_from_hunks
36
                            iter_patched_from_hunks,
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
37
                            parse_line,
2298.6.1 by Johan Dahlberg
Fix bzrtools shelve command for removed lines beginning with "--"
38
                            parse_patch,
3873.1.2 by Benoît Pierre
Add patches test for 'No newline at end of file' in the middle of hunk lines.
39
                            parse_patches,
40
                            NO_NL)
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
41
1185.82.127 by Aaron Bentley
PEP8 updates
42
3376.2.6 by Martin Pool
Make PatchesTester use bzrlib TestCase base
43
class PatchesTester(TestCase):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
44
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
45
    def datafile(self, filename):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
46
        data_path = os.path.join(os.path.dirname(__file__),
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
47
                                 "test_patches_data", filename)
6973.7.5 by Jelmer Vernooij
s/file/open.
48
        return open(data_path, "rb")
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
49
4634.80.3 by Aaron Bentley
Clean up tests, test iter_patched.
50
    def data_lines(self, filename):
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
51
        with self.datafile(filename) as datafile:
4634.80.3 by Aaron Bentley
Clean up tests, test iter_patched.
52
            return datafile.readlines()
53
5016.3.2 by Martin Pool
Add test that parse_patches(.. allow_dirty=True) works
54
    def test_parse_patches_leading_noise(self):
5243.1.2 by Martin
Point launchpad links in comments at production server rather than edge
55
        # https://bugs.launchpad.net/bzr/+bug/502076
56
        # https://code.launchpad.net/~toshio/bzr/allow-dirty-patches/+merge/18854
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
57
        lines = [b"diff -pruN commands.py",
58
                 b"--- orig/commands.py",
59
                 b"+++ mod/dommands.py"]
60
        bits = list(parse_patches(iter(lines), allow_dirty=True))
5016.3.2 by Martin Pool
Add test that parse_patches(.. allow_dirty=True) works
61
6601.1.6 by Kit Randel
change of plan, don't track modified state, just preserve dirty_heads if requested in parse_patches
62
    def test_preserve_dirty_head(self):
63
        """Parse a patch containing a dirty header, and preserve lines"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
64
        lines = [b"=== added directory 'foo/bar'\n",
65
                 b"=== modified file 'orig/commands.py'\n",
66
                 b"--- orig/commands.py\n",
67
                 b"+++ mod/dommands.py\n",
68
                 b"=== modified file 'orig/another.py'\n",
69
                 b"--- orig/another.py\n",
70
                 b"+++ mod/another.py\n"]
71
        patches = list(parse_patches(
72
            lines.__iter__(), allow_dirty=True, keep_dirty=True))
6603.2.2 by Colin Watson
Use assertLength.
73
        self.assertLength(2, patches)
6601.1.6 by Kit Randel
change of plan, don't track modified state, just preserve dirty_heads if requested in parse_patches
74
        self.assertEqual(patches[0]['dirty_head'],
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
75
                         [b"=== added directory 'foo/bar'\n",
76
                          b"=== modified file 'orig/commands.py'\n"])
6601.1.6 by Kit Randel
change of plan, don't track modified state, just preserve dirty_heads if requested in parse_patches
77
        self.assertEqual(patches[0]['patch'].get_header().splitlines(True),
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
78
                         [b"--- orig/commands.py\n", b"+++ mod/dommands.py\n"])
6603.2.1 by Colin Watson
Avoid associating dirty patch headers with the previous file in the patch.
79
        self.assertEqual(patches[1]['dirty_head'],
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
80
                         [b"=== modified file 'orig/another.py'\n"])
6603.2.1 by Colin Watson
Avoid associating dirty patch headers with the previous file in the patch.
81
        self.assertEqual(patches[1]['patch'].get_header().splitlines(True),
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
82
                         [b"--- orig/another.py\n", b"+++ mod/another.py\n"])
6601.1.1 by Kit Randel
added failing test: test_parse_patches_file_modified_header
83
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
84
    def testValidPatchHeader(self):
85
        """Parse a valid patch header"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
86
        lines = b"--- orig/commands.py\n+++ mod/dommands.py\n".split(b'\n')
6601.1.6 by Kit Randel
change of plan, don't track modified state, just preserve dirty_heads if requested in parse_patches
87
        (orig, mod) = get_patch_names(lines.__iter__())
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
88
        self.assertEqual(orig, b"orig/commands.py")
89
        self.assertEqual(mod, b"mod/dommands.py")
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
90
91
    def testInvalidPatchHeader(self):
92
        """Parse an invalid patch header"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
93
        lines = b"-- orig/commands.py\n+++ mod/dommands.py".split(b'\n')
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
94
        self.assertRaises(MalformedPatchHeader, get_patch_names,
95
                          lines.__iter__())
96
97
    def testValidHunkHeader(self):
98
        """Parse a valid hunk header"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
99
        header = b"@@ -34,11 +50,6 @@\n"
6601.1.5 by Kit Randel
linting
100
        hunk = hunk_from_header(header)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
101
        self.assertEqual(hunk.orig_pos, 34)
102
        self.assertEqual(hunk.orig_range, 11)
103
        self.assertEqual(hunk.mod_pos, 50)
104
        self.assertEqual(hunk.mod_range, 6)
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
105
        self.assertEqual(hunk.as_bytes(), header)
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
106
107
    def testValidHunkHeader2(self):
108
        """Parse a tricky, valid hunk header"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
109
        header = b"@@ -1 +0,0 @@\n"
6601.1.5 by Kit Randel
linting
110
        hunk = hunk_from_header(header)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
111
        self.assertEqual(hunk.orig_pos, 1)
112
        self.assertEqual(hunk.orig_range, 1)
113
        self.assertEqual(hunk.mod_pos, 0)
114
        self.assertEqual(hunk.mod_range, 0)
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
115
        self.assertEqual(hunk.as_bytes(), header)
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
116
1551.18.6 by Aaron Bentley
Add support for diff -p-style diffs to patch parser
117
    def testPDiff(self):
118
        """Parse a hunk header produced by diff -p"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
119
        header = b"@@ -407,7 +292,7 @@ bzr 0.18rc1  2007-07-10\n"
1551.18.6 by Aaron Bentley
Add support for diff -p-style diffs to patch parser
120
        hunk = hunk_from_header(header)
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
121
        self.assertEqual(b'bzr 0.18rc1  2007-07-10', hunk.tail)
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
122
        self.assertEqual(header, hunk.as_bytes())
1551.18.6 by Aaron Bentley
Add support for diff -p-style diffs to patch parser
123
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
124
    def makeMalformed(self, header):
125
        self.assertRaises(MalformedHunkHeader, hunk_from_header, header)
126
127
    def testInvalidHeader(self):
128
        """Parse an invalid hunk header"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
129
        self.makeMalformed(b" -34,11 +50,6 \n")
130
        self.makeMalformed(b"@@ +50,6 -34,11 @@\n")
131
        self.makeMalformed(b"@@ -34,11 +50,6 @@")
132
        self.makeMalformed(b"@@ -34.5,11 +50,6 @@\n")
133
        self.makeMalformed(b"@@-34,11 +50,6@@\n")
134
        self.makeMalformed(b"@@ 34,11 50,6 @@\n")
135
        self.makeMalformed(b"@@ -34,11 @@\n")
136
        self.makeMalformed(b"@@ -34,11 +50,6.5 @@\n")
137
        self.makeMalformed(b"@@ -34,11 +50,-6 @@\n")
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
138
6601.1.5 by Kit Randel
linting
139
    def lineThing(self, text, type):
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
140
        line = parse_line(text)
3376.2.5 by Martin Pool
Remove a few more elusive assert statements
141
        self.assertIsInstance(line, type)
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
142
        self.assertEqual(line.as_bytes(), text)
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
143
144
    def makeMalformedLine(self, text):
145
        self.assertRaises(MalformedLine, parse_line, text)
146
147
    def testValidLine(self):
148
        """Parse a valid hunk line"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
149
        self.lineThing(b" hello\n", ContextLine)
150
        self.lineThing(b"+hello\n", InsertLine)
151
        self.lineThing(b"-hello\n", RemoveLine)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
152
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
153
    def testMalformedLine(self):
154
        """Parse invalid valid hunk lines"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
155
        self.makeMalformedLine(b"hello\n")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
156
3873.1.2 by Benoît Pierre
Add patches test for 'No newline at end of file' in the middle of hunk lines.
157
    def testMalformedLineNO_NL(self):
6798.1.1 by Jelmer Vernooij
Properly escape backslashes.
158
        """Parse invalid '\\ No newline at end of file' in hunk lines"""
3873.1.2 by Benoît Pierre
Add patches test for 'No newline at end of file' in the middle of hunk lines.
159
        self.makeMalformedLine(NO_NL)
160
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
161
    def compare_parsed(self, patchtext):
162
        lines = patchtext.splitlines(True)
163
        patch = parse_patch(lines.__iter__())
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
164
        pstr = patch.as_bytes()
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
165
        i = difference_index(patchtext, pstr)
166
        if i is not None:
6619.3.3 by Jelmer Vernooij
Apply 2to3 print fix.
167
            print("%i: \"%s\" != \"%s\"" % (i, patchtext[i], pstr[i]))
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
168
        self.assertEqual(patchtext, patch.as_bytes())
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
169
170
    def testAll(self):
171
        """Test parsing a whole patch"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
172
        with self.datafile("patchtext.patch") as f:
173
            patchtext = f.read()
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
174
        self.compare_parsed(patchtext)
175
4634.80.2 by Aaron Bentley
Ensure patch roundtripping.
176
    def test_parse_binary(self):
4634.80.1 by Aaron Bentley
Parse binary files.
177
        """Test parsing a whole patch"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
178
        patches = list(parse_patches(self.data_lines("binary.patch")))
4634.80.1 by Aaron Bentley
Parse binary files.
179
        self.assertIs(BinaryPatch, patches[0].__class__)
180
        self.assertIs(Patch, patches[1].__class__)
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
181
        self.assertContainsRe(patches[0].oldname, b'^bar\t')
182
        self.assertContainsRe(patches[0].newname, b'^qux\t')
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
183
        self.assertContainsRe(patches[0].as_bytes(),
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
184
                              b'Binary files bar\t.* and qux\t.* differ\n')
4634.80.2 by Aaron Bentley
Ensure patch roundtripping.
185
4634.98.1 by Aaron Bentley
Improve patch binary section handling.
186
    def test_parse_binary_after_normal(self):
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
187
        patches = list(parse_patches(self.data_lines("binary-after-normal.patch")))
4634.98.1 by Aaron Bentley
Improve patch binary section handling.
188
        self.assertIs(BinaryPatch, patches[1].__class__)
189
        self.assertIs(Patch, patches[0].__class__)
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
190
        self.assertContainsRe(patches[1].oldname, b'^bar\t')
191
        self.assertContainsRe(patches[1].newname, b'^qux\t')
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
192
        self.assertContainsRe(patches[1].as_bytes(),
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
193
                              b'Binary files bar\t.* and qux\t.* differ\n')
4634.98.1 by Aaron Bentley
Improve patch binary section handling.
194
4634.80.2 by Aaron Bentley
Ensure patch roundtripping.
195
    def test_roundtrip_binary(self):
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
196
        patchtext = b''.join(self.data_lines("binary.patch"))
4634.80.2 by Aaron Bentley
Ensure patch roundtripping.
197
        patches = parse_patches(patchtext.splitlines(True))
7029.1.3 by Jelmer Vernooij
Use separate .as_bytes method rather than __bytes__.
198
        self.assertEqual(patchtext, b''.join(p.as_bytes() for p in patches))
4634.80.1 by Aaron Bentley
Parse binary files.
199
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
200
    def testInit(self):
201
        """Handle patches missing half the position, range tuple"""
202
        patchtext = \
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
203
b"""--- orig/__vavg__.cl
1185.82.129 by Aaron Bentley
Removed confusing text from the test module
204
+++ mod/__vavg__.cl
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
205
@@ -1 +1,2 @@
1185.82.129 by Aaron Bentley
Removed confusing text from the test module
206
 __qbpsbezng__ = "erfgehpgherqgrkg ra"
207
+__qbp__ = Na nygreangr Nepu pbzznaqyvar vagresnpr
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
208
"""
209
        self.compare_parsed(patchtext)
210
211
    def testLineLookup(self):
212
        """Make sure we can accurately look up mod line from orig"""
213
        patch = parse_patch(self.datafile("diff"))
214
        orig = list(self.datafile("orig"))
215
        mod = list(self.datafile("mod"))
216
        removals = []
217
        for i in range(len(orig)):
218
            mod_pos = patch.pos_in_mod(i)
219
            if mod_pos is None:
220
                removals.append(orig[i])
221
                continue
3376.2.5 by Martin Pool
Remove a few more elusive assert statements
222
            self.assertEqual(mod[mod_pos], orig[i])
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
223
        rem_iter = removals.__iter__()
224
        for hunk in patch.hunks:
225
            for line in hunk.lines:
226
                if isinstance(line, RemoveLine):
6634.2.2 by Martin
Fix and unbogofy PatchesTester.testLineLookup
227
                    self.assertEqual(line.contents, next(rem_iter))
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
228
        self.assertRaises(StopIteration, next, rem_iter)
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
229
230
    def testPatching(self):
231
        """Test a few patch files, and make sure they work."""
232
        files = [
233
            ('diff-2', 'orig-2', 'mod-2'),
234
            ('diff-3', 'orig-3', 'mod-3'),
235
            ('diff-4', 'orig-4', 'mod-4'),
236
            ('diff-5', 'orig-5', 'mod-5'),
237
            ('diff-6', 'orig-6', 'mod-6'),
3873.1.4 by Benoît Pierre
Add another test for patches to check we correctly handle '\ No newline
238
            ('diff-7', 'orig-7', 'mod-7'),
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
239
        ]
240
        for diff, orig, mod in files:
241
            patch = self.datafile(diff)
242
            orig_lines = list(self.datafile(orig))
243
            mod_lines = list(self.datafile(mod))
244
245
            patched_file = IterableFile(iter_patched(orig_lines, patch))
246
            count = 0
247
            for patch_line in patched_file:
248
                self.assertEqual(patch_line, mod_lines[count])
249
                count += 1
250
            self.assertEqual(count, len(mod_lines))
251
4634.80.3 by Aaron Bentley
Clean up tests, test iter_patched.
252
    def test_iter_patched_binary(self):
253
        binary_lines = self.data_lines('binary.patch')
254
        e = self.assertRaises(BinaryFiles, iter_patched, [], binary_lines)
255
3363.18.3 by Aaron Bentley
Add tests for iter_patched_from_hunks
256
    def test_iter_patched_from_hunks(self):
257
        """Test a few patch files, and make sure they work."""
258
        files = [
259
            ('diff-2', 'orig-2', 'mod-2'),
260
            ('diff-3', 'orig-3', 'mod-3'),
261
            ('diff-4', 'orig-4', 'mod-4'),
262
            ('diff-5', 'orig-5', 'mod-5'),
263
            ('diff-6', 'orig-6', 'mod-6'),
3873.1.4 by Benoît Pierre
Add another test for patches to check we correctly handle '\ No newline
264
            ('diff-7', 'orig-7', 'mod-7'),
3363.18.3 by Aaron Bentley
Add tests for iter_patched_from_hunks
265
        ]
266
        for diff, orig, mod in files:
267
            parsed = parse_patch(self.datafile(diff))
268
            orig_lines = list(self.datafile(orig))
269
            mod_lines = list(self.datafile(mod))
270
            iter_patched = iter_patched_from_hunks(orig_lines, parsed.hunks)
271
            patched_file = IterableFile(iter_patched)
272
            count = 0
273
            for patch_line in patched_file:
274
                self.assertEqual(patch_line, mod_lines[count])
275
                count += 1
276
            self.assertEqual(count, len(mod_lines))
277
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
278
    def testFirstLineRenumber(self):
279
        """Make sure we handle lines at the beginning of the hunk"""
280
        patch = parse_patch(self.datafile("insert_top.patch"))
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
281
        self.assertEqual(patch.pos_in_mod(0), 1)
1185.82.126 by Aaron Bentley
Split the patch testing out into a separate file
282
2298.6.1 by Johan Dahlberg
Fix bzrtools shelve command for removed lines beginning with "--"
283
    def testParsePatches(self):
284
        """Make sure file names can be extracted from tricky unified diffs"""
285
        patchtext = \
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
286
b"""--- orig-7
2298.6.1 by Johan Dahlberg
Fix bzrtools shelve command for removed lines beginning with "--"
287
+++ mod-7
288
@@ -1,10 +1,10 @@
289
 -- a
290
--- b
291
+++ c
292
 xx d
293
 xx e
294
 ++ f
295
-++ g
296
+-- h
297
 xx i
298
 xx j
299
 -- k
300
--- l
301
+++ m
302
--- orig-8
303
+++ mod-8
304
@@ -1 +1 @@
305
--- A
306
+++ B
307
@@ -1 +1 @@
308
--- C
309
+++ D
310
"""
7029.1.1 by Jelmer Vernooij
Port breezy.patches to Python3.
311
        filenames = [(b'orig-7', b'mod-7'),
312
                     (b'orig-8', b'mod-8')]
2298.6.1 by Johan Dahlberg
Fix bzrtools shelve command for removed lines beginning with "--"
313
        patches = parse_patches(patchtext.splitlines(True))
314
        patch_files = []
315
        for patch in patches:
316
            patch_files.append((patch.oldname, patch.newname))
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
317
        self.assertEqual(patch_files, filenames)
3946.4.1 by Tim Penhey
Extract out the counting of the stats values.
318
319
    def testStatsValues(self):
320
        """Test the added, removed and hunks values for stats_values."""
321
        patch = parse_patch(self.datafile("diff"))
322
        self.assertEqual((299, 407, 48), patch.stats_values())