1 from __future__
import absolute_import
, division
, unicode_literals
5 from cola
import diffparse
10 class ParseDiffTestCase(unittest
.TestCase
):
12 fixture_path
= helper
.fixture('diff.txt')
13 parser
= diffparse
.DiffParser('cola/diffparse.py', core
.read(fixture_path
))
16 self
.assertEqual(len(hunks
), 3)
17 self
.assertEqual(hunks
[0].first_line_idx
, 0)
18 self
.assertEqual(len(hunks
[0].lines
), 23)
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')
28 r
" self._header_start_re = re.compile('^@@ -(\d+)"
29 r
" \+(\d+),(\d+) @@.*')"
33 self
.assertEqual(hunks
[1].first_line_idx
, 23)
34 self
.assertEqual(len(hunks
[1].lines
), 18)
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')
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)
50 hunks
[2].lines
[0], '@@ -43,11 +52,10 @@ class DiffParser(object):\n'
54 ' """Writes a new diff corresponding to the user\'s'
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
))
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)
70 parser
.generate_patch(1, 3),
79 parser
.generate_patch(0, 4),
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
))
94 self
.assertEqual(hunks
[0].lines
[0], '@@ -1,39 +1 @@\n')
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
))
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)
116 parser
.generate_patch(1, 1),
124 parser
.generate_patch(0, 2),
132 def test_diff_file_removal(self
):
134 deleted file mode 100755
138 parser
= diffparse
.DiffParser('deleted.txt', diff_text
)
139 self
.assertEqual(1, len(parser
.hunks
))
141 # Selecting the first two lines generate no diff
143 actual
= parser
.generate_patch(0, 1)
144 self
.assertEqual(expect
, actual
)
146 # Selecting the last line should generate a line removal
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
):
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())
178 self
.assertEqual(expect
, actual
)
180 def test_diff_line_count_ranges(self
):
182 lines
= parser
.parse(self
.text
)
187 self
.assertEqual(lines
[line
][0], parser
.DASH
)
188 self
.assertEqual(lines
[line
][1], parser
.DASH
)
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
)
202 # 10 lines of new text
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
)
211 # 3 more lines of context
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
)
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
)
228 # 2 lines of addition
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
)
236 # 3 more lines of context
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
)
247 for i
in range(count
):
248 self
.assertEqual(lines
[line
+ i
][0], parser
.DASH
)
249 self
.assertEqual(lines
[line
+ i
][1], parser
.DASH
)
252 # 3 more lines of context
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
)
264 self
.assertEqual(expect_max_old
, parser
.old
.max_value
)
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 @@@
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()
309 actual
= fmt
.value(1, 99)
310 self
.assertEqual(expect
, actual
)
312 def test_format_reuse(self
):
313 fmt
= diffparse
.FormatDigits()
317 actual
= fmt
.value(1, 99)
318 self
.assertEqual(expect
, actual
)
322 actual
= fmt
.value(1, 99)
323 self
.assertEqual(expect
, actual
)
325 def test_format_special_values(self
):
326 fmt
= diffparse
.FormatDigits(dash
='-')
330 actual
= fmt
.value(fmt
.EMPTY
, 99)
331 self
.assertEqual(expect
, actual
)
334 actual
= fmt
.value(1, fmt
.EMPTY
)
335 self
.assertEqual(expect
, actual
)
338 actual
= fmt
.value(fmt
.EMPTY
, fmt
.EMPTY
)
339 self
.assertEqual(expect
, actual
)
342 actual
= fmt
.value(fmt
.DASH
, 1)
343 self
.assertEqual(expect
, actual
)
346 actual
= fmt
.value(99, fmt
.DASH
)
347 self
.assertEqual(expect
, actual
)
350 actual
= fmt
.value(fmt
.DASH
, fmt
.DASH
)
351 self
.assertEqual(expect
, actual
)
354 actual
= fmt
.value(fmt
.EMPTY
, fmt
.DASH
)
355 self
.assertEqual(expect
, actual
)
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__':