submodules: address pylint warnings
[git-cola.git] / test / diffparse_test.py
blobd0791ec922cf6b83ddfc01b1cfb711018e877401
1 from __future__ import absolute_import, division, unicode_literals
2 import unittest
4 from cola import core
5 from cola import diffparse
7 from . import helper
10 class ParseDiffTestCase(unittest.TestCase):
11 def test_diff(self):
12 fixture_path = helper.fixture('diff.txt')
13 parser = diffparse.DiffParser('cola/diffparse.py', core.read(fixture_path))
14 hunks = parser.hunks
16 self.assertEqual(len(hunks), 3)
17 self.assertEqual(hunks[0].first_line_idx, 0)
18 self.assertEqual(len(hunks[0].lines), 23)
19 self.assertEqual(
20 hunks[0].lines[0], '@@ -6,10 +6,21 @@ from cola import gitcmds\n'
22 self.assertEqual(hunks[0].lines[1], ' from cola import gitcfg\n')
23 self.assertEqual(hunks[0].lines[2], ' \n')
24 self.assertEqual(hunks[0].lines[3], ' \n')
25 self.assertEqual(hunks[0].lines[4], '+class DiffSource(object):\n')
26 self.assertEqual(
27 hunks[0].lines[-1],
28 r" self._header_start_re = re.compile('^@@ -(\d+)"
29 r" \+(\d+),(\d+) @@.*')"
30 '\n',
33 self.assertEqual(hunks[1].first_line_idx, 23)
34 self.assertEqual(len(hunks[1].lines), 18)
35 self.assertEqual(
36 hunks[1].lines[0], '@@ -29,13 +40,11 @@ class DiffParser(object):\n'
38 self.assertEqual(hunks[1].lines[1], ' self.diff_sel = []\n')
39 self.assertEqual(hunks[1].lines[2], ' self.selected = []\n')
40 self.assertEqual(hunks[1].lines[3], ' self.filename = filename\n')
41 self.assertEqual(
42 hunks[1].lines[4],
43 '+ self.diff_source = diff_source or DiffSource()\n',
45 self.assertEqual(hunks[1].lines[-1], ' self.header = header\n')
47 self.assertEqual(hunks[2].first_line_idx, 41)
48 self.assertEqual(len(hunks[2].lines), 16)
49 self.assertEqual(
50 hunks[2].lines[0], '@@ -43,11 +52,10 @@ class DiffParser(object):\n'
52 self.assertEqual(
53 hunks[2].lines[-1],
54 ' """Writes a new diff corresponding to the user\'s'
55 ' selection."""\n',
58 def test_diff_at_start(self):
59 fixture_path = helper.fixture('diff-start.txt')
60 parser = diffparse.DiffParser('foo bar/a', core.read(fixture_path))
61 hunks = parser.hunks
63 self.assertEqual(hunks[0].lines[0], '@@ -1 +1,4 @@\n')
64 self.assertEqual(hunks[-1].lines[-1], '+c\n')
65 self.assertEqual(hunks[0].old_start, 1)
66 self.assertEqual(hunks[0].old_count, 1)
67 self.assertEqual(hunks[0].new_start, 1)
68 self.assertEqual(hunks[0].new_count, 4)
69 self.assertEqual(
70 parser.generate_patch(1, 3),
71 '--- a/foo bar/a\n'
72 '+++ b/foo bar/a\n'
73 '@@ -1 +1,3 @@\n'
74 ' bar\n'
75 '+a\n'
76 '+b\n',
78 self.assertEqual(
79 parser.generate_patch(0, 4),
80 '--- a/foo bar/a\n'
81 '+++ b/foo bar/a\n'
82 '@@ -1 +1,4 @@\n'
83 ' bar\n'
84 '+a\n'
85 '+b\n'
86 '+c\n',
89 def test_diff_at_end(self):
90 fixture_path = helper.fixture('diff-end.txt')
91 parser = diffparse.DiffParser('rijndael.js', core.read(fixture_path))
92 hunks = parser.hunks
94 self.assertEqual(hunks[0].lines[0], '@@ -1,39 +1 @@\n')
95 self.assertEqual(
96 hunks[-1].lines[-1],
97 "+module.exports = require('./build/Release/rijndael');\n",
99 self.assertEqual(hunks[0].old_start, 1)
100 self.assertEqual(hunks[0].old_count, 39)
101 self.assertEqual(hunks[0].new_start, 1)
102 self.assertEqual(hunks[0].new_count, 1)
104 def test_diff_that_empties_file(self):
105 fixture_path = helper.fixture('diff-empty.txt')
106 parser = diffparse.DiffParser('filename', core.read(fixture_path))
107 hunks = parser.hunks
109 self.assertEqual(hunks[0].lines[0], '@@ -1,2 +0,0 @@\n')
110 self.assertEqual(hunks[-1].lines[-1], '-second\n')
111 self.assertEqual(hunks[0].old_start, 1)
112 self.assertEqual(hunks[0].old_count, 2)
113 self.assertEqual(hunks[0].new_start, 0)
114 self.assertEqual(hunks[0].new_count, 0)
115 self.assertEqual(
116 parser.generate_patch(1, 1),
117 '--- a/filename\n'
118 '+++ b/filename\n'
119 '@@ -1,2 +1 @@\n'
120 '-first\n'
121 ' second\n',
123 self.assertEqual(
124 parser.generate_patch(0, 2),
125 '--- a/filename\n'
126 '+++ b/filename\n'
127 '@@ -1,2 +0,0 @@\n'
128 '-first\n'
129 '-second\n',
132 def test_diff_file_removal(self):
133 diff_text = """\
134 deleted file mode 100755
135 @@ -1,1 +0,0 @@
136 -#!/bin/sh
138 parser = diffparse.DiffParser('deleted.txt', diff_text)
139 self.assertEqual(1, len(parser.hunks))
141 # Selecting the first two lines generate no diff
142 expect = None
143 actual = parser.generate_patch(0, 1)
144 self.assertEqual(expect, actual)
146 # Selecting the last line should generate a line removal
147 expect = """\
148 --- a/deleted.txt
149 +++ b/deleted.txt
150 @@ -1 +0,0 @@
151 -#!/bin/sh
153 actual = parser.generate_patch(1, 2)
154 self.assertEqual(expect, actual)
156 # All three lines should map to the same hunk diff
157 actual = parser.generate_hunk_patch(0)
158 self.assertEqual(expect, actual)
160 actual = parser.generate_hunk_patch(1)
161 self.assertEqual(expect, actual)
163 actual = parser.generate_hunk_patch(2)
164 self.assertEqual(expect, actual)
167 class DiffLinesTestCase(unittest.TestCase):
168 def setUp(self):
169 self.parser = diffparse.DiffLines()
170 fixture_path = helper.fixture('diff.txt')
171 self.text = core.read(fixture_path)
173 def test_basic_diff_line_count(self):
174 """Verify the basic line counts"""
175 lines = self.parser.parse(self.text)
176 expect = len(self.text.splitlines())
177 actual = len(lines)
178 self.assertEqual(expect, actual)
180 def test_diff_line_count_ranges(self):
181 parser = self.parser
182 lines = parser.parse(self.text)
184 # Diff header
185 line = 0
186 count = 1
187 self.assertEqual(lines[line][0], parser.DASH)
188 self.assertEqual(lines[line][1], parser.DASH)
189 line += count
191 # 3 lines of context
192 count = 3
193 current_old = 6
194 current_new = 6
195 for i in range(count):
196 self.assertEqual(lines[line + i][0], current_old + i)
197 self.assertEqual(lines[line + i][1], current_new + i)
198 line += count
199 current_old += count
200 current_new += count
202 # 10 lines of new text
203 count = 10
204 for i in range(count):
205 self.assertEqual(lines[line + i][0], parser.EMPTY)
206 self.assertEqual(lines[line + i][1], current_new + i)
208 line += count
209 current_new += count
211 # 3 more lines of context
212 count = 3
213 for i in range(count):
214 self.assertEqual(lines[line + i][0], current_old + i)
215 self.assertEqual(lines[line + i][1], current_new + i)
216 line += count
217 current_new += count
218 current_old += count
220 # 1 line of removal
221 count = 1
222 for i in range(count):
223 self.assertEqual(lines[line + i][0], current_old + i)
224 self.assertEqual(lines[line + i][1], parser.EMPTY)
225 line += count
226 current_old += count
228 # 2 lines of addition
229 count = 2
230 for i in range(count):
231 self.assertEqual(lines[line + i][0], parser.EMPTY)
232 self.assertEqual(lines[line + i][1], current_new + i)
233 line += count
234 current_new += count
236 # 3 more lines of context
237 count = 3
238 for i in range(count):
239 self.assertEqual(lines[line + i][0], current_old + i)
240 self.assertEqual(lines[line + i][1], current_new + i)
241 line += count
242 current_new += count
243 current_old += count
245 # 1 line of header
246 count = 1
247 for i in range(count):
248 self.assertEqual(lines[line + i][0], parser.DASH)
249 self.assertEqual(lines[line + i][1], parser.DASH)
250 line += count
252 # 3 more lines of context
253 current_old = 29
254 current_new = 40
255 count = 3
256 for i in range(count):
257 self.assertEqual(lines[line + i][0], current_old + i)
258 self.assertEqual(lines[line + i][1], current_new + i)
259 line += count
260 current_new += count
261 current_old += count
263 expect_max_old = 54
264 self.assertEqual(expect_max_old, parser.old.max_value)
266 expect_max_new = 62
267 self.assertEqual(expect_max_new, parser.new.max_value)
269 self.assertEqual(parser.digits(), 2)
271 def test_diff_line_for_merge(self):
272 """Verify the basic line counts"""
273 text = """@@@ -1,23 -1,33 +1,75 @@@
274 ++<<<<<<< upstream
278 parser = self.parser
279 lines = parser.parse(text)
280 self.assertEqual(len(lines), 4)
281 self.assertEqual(len(lines[0]), 3)
282 self.assertEqual(len(lines[1]), 3)
283 self.assertEqual(len(lines[2]), 3)
284 self.assertEqual(len(lines[3]), 3)
286 self.assertEqual(lines[0][0], parser.DASH)
287 self.assertEqual(lines[0][1], parser.DASH)
288 self.assertEqual(lines[0][2], parser.DASH)
290 self.assertEqual(lines[1][0], parser.EMPTY)
291 self.assertEqual(lines[1][1], parser.EMPTY)
292 self.assertEqual(lines[1][2], 1)
294 self.assertEqual(lines[2][0], 1)
295 self.assertEqual(lines[2][1], parser.EMPTY)
296 self.assertEqual(lines[2][2], 2)
298 self.assertEqual(lines[3][0], 2)
299 self.assertEqual(lines[3][1], parser.EMPTY)
300 self.assertEqual(lines[3][2], 3)
303 class FormatDiffLinesTestCase(unittest.TestCase):
304 def test_format_basic(self):
305 fmt = diffparse.FormatDigits()
306 fmt.set_digits(2)
308 expect = '01 99'
309 actual = fmt.value(1, 99)
310 self.assertEqual(expect, actual)
312 def test_format_reuse(self):
313 fmt = diffparse.FormatDigits()
315 fmt.set_digits(3)
316 expect = '001 099'
317 actual = fmt.value(1, 99)
318 self.assertEqual(expect, actual)
320 fmt.set_digits(4)
321 expect = '0001 0099'
322 actual = fmt.value(1, 99)
323 self.assertEqual(expect, actual)
325 def test_format_special_values(self):
326 fmt = diffparse.FormatDigits(dash='-')
327 fmt.set_digits(3)
329 expect = ' 099'
330 actual = fmt.value(fmt.EMPTY, 99)
331 self.assertEqual(expect, actual)
333 expect = '001 '
334 actual = fmt.value(1, fmt.EMPTY)
335 self.assertEqual(expect, actual)
337 expect = ' '
338 actual = fmt.value(fmt.EMPTY, fmt.EMPTY)
339 self.assertEqual(expect, actual)
341 expect = '--- 001'
342 actual = fmt.value(fmt.DASH, 1)
343 self.assertEqual(expect, actual)
345 expect = '099 ---'
346 actual = fmt.value(99, fmt.DASH)
347 self.assertEqual(expect, actual)
349 expect = '--- ---'
350 actual = fmt.value(fmt.DASH, fmt.DASH)
351 self.assertEqual(expect, actual)
353 expect = ' ---'
354 actual = fmt.value(fmt.EMPTY, fmt.DASH)
355 self.assertEqual(expect, actual)
357 expect = '--- '
358 actual = fmt.value(fmt.DASH, fmt.EMPTY)
359 self.assertEqual(expect, actual)
362 class ParseRangeStrTestCase(unittest.TestCase):
363 def test_parse_range_str(self):
364 start, count = diffparse.parse_range_str('1,2')
365 self.assertEqual(start, 1)
366 self.assertEqual(count, 2)
368 def test_parse_range_str_single_line(self):
369 start, count = diffparse.parse_range_str('2')
370 self.assertEqual(start, 2)
371 self.assertEqual(count, 1)
373 def test_parse_range_str_empty(self):
374 start, count = diffparse.parse_range_str('0,0')
375 self.assertEqual(start, 0)
376 self.assertEqual(count, 0)
379 if __name__ == '__main__':
380 unittest.main()