~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_patches.py

  • Committer: Ian Clatworthy
  • Date: 2009-01-19 02:24:15 UTC
  • mto: This revision was merged to the branch mainline in revision 3944.
  • Revision ID: ian.clatworthy@canonical.com-20090119022415-mo0mcfeiexfktgwt
apply jam's log --short fix (Ian Clatworthy)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004 - 2006 Aaron Bentley
 
1
# Copyright (C) 2004 - 2008 Aaron Bentley, Canonical Ltd
2
2
# <aaron.bentley@utoronto.ca>
3
3
#
4
 
#    This program is free software; you can redistribute it and/or modify
5
 
#    it under the terms of the GNU General Public License as published by
6
 
#    the Free Software Foundation; either version 2 of the License, or
7
 
#    (at your option) any later version.
8
 
#
9
 
#    This program is distributed in the hope that it will be useful,
10
 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
#    GNU General Public License for more details.
13
 
#
14
 
#    You should have received a copy of the GNU General Public License
15
 
#    along with this program; if not, write to the Free Software
16
 
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
 
18
 
 
19
 
import unittest
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; either version 2 of the License, or
 
7
# (at your option) any later version.
 
8
#
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program; if not, write to the Free Software
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
 
 
18
 
20
19
import os.path
21
20
 
 
21
from bzrlib.tests import TestCase
 
22
 
22
23
from bzrlib.iterablefile import IterableFile
23
24
from bzrlib.patches import (MalformedLine, 
24
25
                            MalformedHunkHeader, 
30
31
                            get_patch_names,
31
32
                            hunk_from_header, 
32
33
                            iter_patched, 
 
34
                            iter_patched_from_hunks,
33
35
                            parse_line,
34
 
                            parse_patch)
35
 
 
36
 
 
37
 
class PatchesTester(unittest.TestCase):
 
36
                            parse_patch,
 
37
                            parse_patches)
 
38
 
 
39
 
 
40
class PatchesTester(TestCase):
 
41
 
38
42
    def datafile(self, filename):
39
43
        data_path = os.path.join(os.path.dirname(__file__), 
40
44
                                 "test_patches_data", filename)
44
48
        """Parse a valid patch header"""
45
49
        lines = "--- orig/commands.py\n+++ mod/dommands.py\n".split('\n')
46
50
        (orig, mod) = get_patch_names(lines.__iter__())
47
 
        assert(orig == "orig/commands.py")
48
 
        assert(mod == "mod/dommands.py")
 
51
        self.assertEqual(orig, "orig/commands.py")
 
52
        self.assertEqual(mod, "mod/dommands.py")
49
53
 
50
54
    def testInvalidPatchHeader(self):
51
55
        """Parse an invalid patch header"""
57
61
        """Parse a valid hunk header"""
58
62
        header = "@@ -34,11 +50,6 @@\n"
59
63
        hunk = hunk_from_header(header);
60
 
        assert (hunk.orig_pos == 34)
61
 
        assert (hunk.orig_range == 11)
62
 
        assert (hunk.mod_pos == 50)
63
 
        assert (hunk.mod_range == 6)
64
 
        assert (str(hunk) == header)
 
64
        self.assertEqual(hunk.orig_pos, 34)
 
65
        self.assertEqual(hunk.orig_range, 11)
 
66
        self.assertEqual(hunk.mod_pos, 50)
 
67
        self.assertEqual(hunk.mod_range, 6)
 
68
        self.assertEqual(str(hunk), header)
65
69
 
66
70
    def testValidHunkHeader2(self):
67
71
        """Parse a tricky, valid hunk header"""
68
72
        header = "@@ -1 +0,0 @@\n"
69
73
        hunk = hunk_from_header(header);
70
 
        assert (hunk.orig_pos == 1)
71
 
        assert (hunk.orig_range == 1)
72
 
        assert (hunk.mod_pos == 0)
73
 
        assert (hunk.mod_range == 0)
74
 
        assert (str(hunk) == header)
 
74
        self.assertEqual(hunk.orig_pos, 1)
 
75
        self.assertEqual(hunk.orig_range, 1)
 
76
        self.assertEqual(hunk.mod_pos, 0)
 
77
        self.assertEqual(hunk.mod_range, 0)
 
78
        self.assertEqual(str(hunk), header)
 
79
 
 
80
    def testPDiff(self):
 
81
        """Parse a hunk header produced by diff -p"""
 
82
        header = "@@ -407,7 +292,7 @@ bzr 0.18rc1  2007-07-10\n"
 
83
        hunk = hunk_from_header(header)
 
84
        self.assertEqual('bzr 0.18rc1  2007-07-10', hunk.tail)
 
85
        self.assertEqual(header, str(hunk))
75
86
 
76
87
    def makeMalformed(self, header):
77
88
        self.assertRaises(MalformedHunkHeader, hunk_from_header, header)
90
101
 
91
102
    def lineThing(self,text, type):
92
103
        line = parse_line(text)
93
 
        assert(isinstance(line, type))
94
 
        assert(str(line)==text)
 
104
        self.assertIsInstance(line, type)
 
105
        self.assertEqual(str(line), text)
95
106
 
96
107
    def makeMalformedLine(self, text):
97
108
        self.assertRaises(MalformedLine, parse_line, text)
143
154
            if mod_pos is None:
144
155
                removals.append(orig[i])
145
156
                continue
146
 
            assert(mod[mod_pos]==orig[i])
 
157
            self.assertEqual(mod[mod_pos], orig[i])
147
158
        rem_iter = removals.__iter__()
148
159
        for hunk in patch.hunks:
149
160
            for line in hunk.lines:
152
163
                    if line.contents != next:
153
164
                        sys.stdout.write(" orig:%spatch:%s" % (next,
154
165
                                         line.contents))
155
 
                    assert(line.contents == next)
 
166
                    self.assertEqual(line.contents, next)
156
167
        self.assertRaises(StopIteration, rem_iter.next)
157
168
 
158
169
    def testPatching(self):
177
188
                count += 1
178
189
            self.assertEqual(count, len(mod_lines))
179
190
 
 
191
    def test_iter_patched_from_hunks(self):
 
192
        """Test a few patch files, and make sure they work."""
 
193
        files = [
 
194
            ('diff-2', 'orig-2', 'mod-2'),
 
195
            ('diff-3', 'orig-3', 'mod-3'),
 
196
            ('diff-4', 'orig-4', 'mod-4'),
 
197
            ('diff-5', 'orig-5', 'mod-5'),
 
198
            ('diff-6', 'orig-6', 'mod-6'),
 
199
        ]
 
200
        for diff, orig, mod in files:
 
201
            parsed = parse_patch(self.datafile(diff))
 
202
            orig_lines = list(self.datafile(orig))
 
203
            mod_lines = list(self.datafile(mod))
 
204
            iter_patched = iter_patched_from_hunks(orig_lines, parsed.hunks)
 
205
            patched_file = IterableFile(iter_patched)
 
206
            lines = []
 
207
            count = 0
 
208
            for patch_line in patched_file:
 
209
                self.assertEqual(patch_line, mod_lines[count])
 
210
                count += 1
 
211
            self.assertEqual(count, len(mod_lines))
 
212
 
180
213
    def testFirstLineRenumber(self):
181
214
        """Make sure we handle lines at the beginning of the hunk"""
182
215
        patch = parse_patch(self.datafile("insert_top.patch"))
183
 
        assert (patch.pos_in_mod(0)==1)
184
 
 
185
 
def test():
186
 
    patchesTestSuite = unittest.makeSuite(PatchesTester,'test')
187
 
    runner = unittest.TextTestRunner(verbosity=0)
188
 
    return runner.run(patchesTestSuite)
189
 
 
190
 
 
191
 
if __name__ == "__main__":
192
 
    test()
 
216
        self.assertEqual(patch.pos_in_mod(0), 1)
 
217
 
 
218
    def testParsePatches(self):
 
219
        """Make sure file names can be extracted from tricky unified diffs"""
 
220
        patchtext = \
 
221
"""--- orig-7
 
222
+++ mod-7
 
223
@@ -1,10 +1,10 @@
 
224
 -- a
 
225
--- b
 
226
+++ c
 
227
 xx d
 
228
 xx e
 
229
 ++ f
 
230
-++ g
 
231
+-- h
 
232
 xx i
 
233
 xx j
 
234
 -- k
 
235
--- l
 
236
+++ m
 
237
--- orig-8
 
238
+++ mod-8
 
239
@@ -1 +1 @@
 
240
--- A
 
241
+++ B
 
242
@@ -1 +1 @@
 
243
--- C
 
244
+++ D
 
245
"""
 
246
        filenames = [('orig-7', 'mod-7'),
 
247
                     ('orig-8', 'mod-8')]
 
248
        patches = parse_patches(patchtext.splitlines(True))
 
249
        patch_files = []
 
250
        for patch in patches:
 
251
            patch_files.append((patch.oldname, patch.newname))
 
252
        self.assertEqual(patch_files, filenames)