1 """Tests for the diffparse module"""
2 # pylint: disable=redefined-outer-name
3 from __future__
import absolute_import
, division
, print_function
, unicode_literals
8 from cola
import diffparse
13 class DiffLinesTestData(object):
14 """Test data used by DiffLines tests"""
17 self
.parser
= diffparse
.DiffLines()
18 fixture_path
= helper
.fixture('diff.txt')
19 self
.text
= core
.read(fixture_path
)
24 """Return test data for diffparse.DiffLines tests"""
25 return DiffLinesTestData()
29 fixture_path
= helper
.fixture('diff.txt')
30 parser
= diffparse
.DiffParser('cola/diffparse.py', core
.read(fixture_path
))
33 assert len(hunks
) == 3
34 assert hunks
[0].first_line_idx
== 0
35 assert len(hunks
[0].lines
) == 23
36 assert hunks
[0].lines
[0] == '@@ -6,10 +6,21 @@ from cola import gitcmds\n'
37 assert hunks
[0].lines
[1] == ' from cola import gitcfg\n'
38 assert hunks
[0].lines
[2] == ' \n'
39 assert hunks
[0].lines
[3] == ' \n'
40 assert hunks
[0].lines
[4] == '+class DiffSource(object):\n'
41 assert hunks
[0].lines
[-1] == (
42 r
" self._header_start_re = re.compile('^@@ -(\d+)"
43 r
" \+(\d+),(\d+) @@.*')"
46 assert hunks
[1].first_line_idx
== 23
47 assert len(hunks
[1].lines
) == 18
48 assert hunks
[1].lines
[0] == '@@ -29,13 +40,11 @@ class DiffParser(object):\n'
49 assert hunks
[1].lines
[1] == ' self.diff_sel = []\n'
50 assert hunks
[1].lines
[2] == ' self.selected = []\n'
51 assert hunks
[1].lines
[3] == ' self.filename = filename\n'
52 assert hunks
[1].lines
[4] == (
53 '+ self.diff_source = diff_source or DiffSource()\n'
55 assert hunks
[1].lines
[-1] == ' self.header = header\n'
57 assert hunks
[2].first_line_idx
== 41
58 assert len(hunks
[2].lines
) == 16
59 assert hunks
[2].lines
[0] == '@@ -43,11 +52,10 @@ class DiffParser(object):\n'
60 assert hunks
[2].lines
[-1] == (
61 ' """Writes a new diff corresponding to the user\'s' ' selection."""\n'
65 def test_diff_at_start():
66 fixture_path
= helper
.fixture('diff-start.txt')
67 parser
= diffparse
.DiffParser('foo bar/a', core
.read(fixture_path
))
70 assert hunks
[0].lines
[0] == '@@ -1 +1,4 @@\n'
71 assert hunks
[-1].lines
[-1] == '+c\n'
72 assert hunks
[0].old_start
== 1
73 assert hunks
[0].old_count
== 1
74 assert hunks
[0].new_start
== 1
75 assert hunks
[0].new_count
== 4
76 assert parser
.generate_patch(1, 3) == (
77 '--- a/foo bar/a\n' '+++ b/foo bar/a\n' '@@ -1 +1,3 @@\n' ' bar\n' '+a\n' '+b\n'
79 assert parser
.generate_patch(0, 4) == (
90 def test_diff_at_end():
91 fixture_path
= helper
.fixture('diff-end.txt')
92 parser
= diffparse
.DiffParser('rijndael.js', core
.read(fixture_path
))
95 assert hunks
[0].lines
[0] == '@@ -1,39 +1 @@\n'
96 assert hunks
[-1].lines
[-1] == (
97 "+module.exports = require('./build/Release/rijndael');\n"
99 assert hunks
[0].old_start
== 1
100 assert hunks
[0].old_count
== 39
101 assert hunks
[0].new_start
== 1
102 assert hunks
[0].new_count
== 1
105 def test_diff_that_empties_file():
106 fixture_path
= helper
.fixture('diff-empty.txt')
107 parser
= diffparse
.DiffParser('filename', core
.read(fixture_path
))
110 assert hunks
[0].lines
[0] == '@@ -1,2 +0,0 @@\n'
111 assert hunks
[-1].lines
[-1] == '-second\n'
112 assert hunks
[0].old_start
== 1
113 assert hunks
[0].old_count
== 2
114 assert hunks
[0].new_start
== 0
115 assert hunks
[0].new_count
== 0
116 assert parser
.generate_patch(1, 1) == (
117 '--- a/filename\n' '+++ b/filename\n' '@@ -1,2 +1 @@\n' '-first\n' ' second\n'
119 assert parser
.generate_patch(0, 2) == (
120 '--- a/filename\n' '+++ b/filename\n' '@@ -1,2 +0,0 @@\n' '-first\n' '-second\n'
124 def test_diff_file_removal():
126 deleted file mode 100755
130 parser
= diffparse
.DiffParser('deleted.txt', diff_text
)
133 actual
= len(parser
.hunks
)
134 assert expect
== actual
136 # Selecting the first two lines generate no diff
138 actual
= parser
.generate_patch(0, 1)
139 assert expect
== actual
141 # Selecting the last line should generate a line removal
148 actual
= parser
.generate_patch(1, 2)
149 assert expect
== actual
151 # All three lines should map to the same hunk diff
152 actual
= parser
.generate_hunk_patch(0)
153 assert expect
== actual
155 actual
= parser
.generate_hunk_patch(1)
156 assert expect
== actual
158 actual
= parser
.generate_hunk_patch(2)
159 assert expect
== actual
162 def test_basic_diff_line_count(difflines_data
):
163 """Verify the basic line counts"""
164 lines
= difflines_data
.parser
.parse(difflines_data
.text
)
165 expect
= len(difflines_data
.text
.splitlines())
167 assert expect
== actual
170 def test_diff_line_count_ranges(difflines_data
):
171 parser
= difflines_data
.parser
172 lines
= parser
.parse(difflines_data
.text
)
177 assert lines
[line
][0] == parser
.DASH
178 assert lines
[line
][1] == parser
.DASH
185 for i
in range(count
):
186 assert lines
[line
+ i
][0] == current_old
+ i
187 assert lines
[line
+ i
][1] == current_new
+ i
192 # 10 lines of new text
194 for i
in range(count
):
195 assert lines
[line
+ i
][0] == parser
.EMPTY
196 assert lines
[line
+ i
][1] == current_new
+ i
201 # 3 more lines of context
203 for i
in range(count
):
204 assert lines
[line
+ i
][0] == current_old
+ i
205 assert lines
[line
+ i
][1] == current_new
+ i
212 for i
in range(count
):
213 assert lines
[line
+ i
][0] == current_old
+ i
214 assert lines
[line
+ i
][1] == parser
.EMPTY
218 # 2 lines of addition
220 for i
in range(count
):
221 assert lines
[line
+ i
][0] == parser
.EMPTY
222 assert lines
[line
+ i
][1] == current_new
+ i
226 # 3 more lines of context
228 for i
in range(count
):
229 assert lines
[line
+ i
][0] == current_old
+ i
230 assert lines
[line
+ i
][1] == current_new
+ i
237 for i
in range(count
):
238 assert lines
[line
+ i
][0] == parser
.DASH
239 assert lines
[line
+ i
][1] == parser
.DASH
242 # 3 more lines of context
246 for i
in range(count
):
247 assert lines
[line
+ i
][0] == current_old
+ i
248 assert lines
[line
+ i
][1] == current_new
+ i
254 assert expect_max_old
== parser
.old
.max_value
257 assert expect_max_new
== parser
.new
.max_value
259 assert parser
.digits() == 2
262 def test_diff_line_for_merge(difflines_data
):
263 """Verify the basic line counts"""
264 text
= """@@@ -1,23 -1,33 +1,75 @@@
269 parser
= difflines_data
.parser
270 lines
= parser
.parse(text
)
271 assert len(lines
) == 4
272 assert len(lines
[0]) == 3
273 assert len(lines
[1]) == 3
274 assert len(lines
[2]) == 3
275 assert len(lines
[3]) == 3
277 assert lines
[0][0] == parser
.DASH
278 assert lines
[0][1] == parser
.DASH
279 assert lines
[0][2] == parser
.DASH
281 assert lines
[1][0] == parser
.EMPTY
282 assert lines
[1][1] == parser
.EMPTY
283 assert lines
[1][2] == 1
285 assert lines
[2][0] == 1
286 assert lines
[2][1] == parser
.EMPTY
287 assert lines
[2][2] == 2
289 assert lines
[3][0] == 2
290 assert lines
[3][1] == parser
.EMPTY
291 assert lines
[3][2] == 3
294 def test_diff_line_digits(difflines_data
):
295 parser
= difflines_data
.parser
297 text
= """@@ -1,99 +1,99 @@"""
299 assert parser
.digits() == 2
301 text
= """@@ -2,99 +2,99 @@"""
303 assert parser
.digits() == 3
306 def test_format_basic():
307 fmt
= diffparse
.FormatDigits()
311 actual
= fmt
.value(1, 99)
312 assert expect
== actual
315 def test_format_reuse():
316 fmt
= diffparse
.FormatDigits()
320 actual
= fmt
.value(1, 99)
321 assert expect
== actual
325 actual
= fmt
.value(1, 99)
326 assert expect
== actual
329 def test_format_special_values():
330 fmt
= diffparse
.FormatDigits(dash
='-')
334 actual
= fmt
.value(fmt
.EMPTY
, 99)
335 assert expect
== actual
338 actual
= fmt
.value(1, fmt
.EMPTY
)
339 assert expect
== actual
342 actual
= fmt
.value(fmt
.EMPTY
, fmt
.EMPTY
)
343 assert expect
== actual
346 actual
= fmt
.value(fmt
.DASH
, 1)
347 assert expect
== actual
350 actual
= fmt
.value(99, fmt
.DASH
)
351 assert expect
== actual
354 actual
= fmt
.value(fmt
.DASH
, fmt
.DASH
)
355 assert expect
== actual
358 actual
= fmt
.value(fmt
.EMPTY
, fmt
.DASH
)
359 assert expect
== actual
362 actual
= fmt
.value(fmt
.DASH
, fmt
.EMPTY
)
363 assert expect
== actual
366 def test_parse_range_str():
367 start
, count
= diffparse
.parse_range_str('1,2')
372 def test_parse_range_str_single_line():
373 start
, count
= diffparse
.parse_range_str('2')
378 def test_parse_range_str_empty():
379 start
, count
= diffparse
.parse_range_str('0,0')