Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / Tools / Scripts / webkitperl / VCSUtils_unittest / parseGitDiffHeader.pl
1 #!/usr/bin/perl -w
2 #
3 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1.  Redistributions of source code must retain the above copyright
9 #     notice, this list of conditions and the following disclaimer.
10 # 2.  Redistributions in binary form must reproduce the above copyright
11 #     notice, this list of conditions and the following disclaimer in the
12 #     documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
15 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
18 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25 # Unit tests of parseGitDiffHeader().
26
27 use strict;
28 use warnings;
29
30 use Test::More;
31 use VCSUtils;
32
33 # The array of test cases.
34 my @testCaseHashRefs = (
35 {   # New test
36     diffName => "Modified file",
37     inputText => <<'END',
38 diff --git a/foo.h b/foo.h
39 index f5d5e74..3b6aa92 100644
40 --- a/foo.h
41 +++ b/foo.h
42 @@ -1 +1 @@
43 -file contents
44 +new file contents
45 END
46     expectedReturn => [
47 {
48     svnConvertedText => <<'END',
49 Index: foo.h
50 index f5d5e74..3b6aa92 100644
51 --- foo.h
52 +++ foo.h
53 END
54     indexPath => "foo.h",
55 },
56 "@@ -1 +1 @@\n"],
57     expectedNextLine => "-file contents\n",
58 },
59 {   # New test
60     diffName => "new file",
61     inputText => <<'END',
62 diff --git a/foo.h b/foo.h
63 new file mode 100644
64 index 0000000..3c9f114
65 --- /dev/null
66 +++ b/foo.h
67 @@ -0,0 +1,34 @@
68 +<html>
69 END
70     expectedReturn => [
71 {
72     svnConvertedText => <<'END',
73 Index: foo.h
74 new file mode 100644
75 index 0000000..3c9f114
76 --- foo.h
77 +++ foo.h
78 END
79     indexPath => "foo.h",
80     isNew => 1,
81 },
82 "@@ -0,0 +1,34 @@\n"],
83     expectedNextLine => "+<html>\n",
84 },
85 {   # New test
86     diffName => "file deletion",
87     inputText => <<'END',
88 diff --git a/foo b/foo
89 deleted file mode 100644
90 index 1e50d1d..0000000
91 --- a/foo
92 +++ /dev/null
93 @@ -1,1 +0,0 @@
94 -line1
95 diff --git a/configure.ac b/configure.ac
96 index d45dd40..3494526 100644
97 END
98     expectedReturn => [
99 {
100     svnConvertedText => <<'END',
101 Index: foo
102 deleted file mode 100644
103 index 1e50d1d..0000000
104 --- foo
105 +++ foo
106 END
107     indexPath => "foo",
108     isDeletion => 1,
109 },
110 "@@ -1,1 +0,0 @@\n"],
111     expectedNextLine => "-line1\n",
112 },
113 {   # New test
114     diffName => "using --no-prefix",
115     inputText => <<'END',
116 diff --git foo.h foo.h
117 index c925780..9e65c43 100644
118 --- foo.h
119 +++ foo.h
120 @@ -1,3 +1,17 @@
121 +contents
122 END
123     expectedReturn => [
124 {
125     svnConvertedText => <<'END',
126 Index: foo.h
127 index c925780..9e65c43 100644
128 --- foo.h
129 +++ foo.h
130 END
131     indexPath => "foo.h",
132 },
133 "@@ -1,3 +1,17 @@\n"],
134     expectedNextLine => "+contents\n",
135 },
136 ####
137 #    Copy operations
138 ##
139 {   # New test
140     diffName => "copy (with similarity index 100%)",
141     inputText => <<'END',
142 diff --git a/foo b/foo_new
143 similarity index 100%
144 copy from foo
145 copy to foo_new
146 diff --git a/bar b/bar
147 index d45dd40..3494526 100644
148 END
149     expectedReturn => [
150 {
151     svnConvertedText => <<'END',
152 Index: foo_new
153 similarity index 100%
154 copy from foo
155 copy to foo_new
156 END
157     copiedFromPath => "foo",
158     indexPath => "foo_new",
159 },
160 "diff --git a/bar b/bar\n"],
161     expectedNextLine => "index d45dd40..3494526 100644\n",
162 },
163 {   # New test
164     diffName => "copy (with similarity index < 100%)",
165     inputText => <<'END',
166 diff --git a/foo b/foo_new
167 similarity index 99%
168 copy from foo
169 copy to foo_new
170 diff --git a/bar b/bar
171 index d45dd40..3494526 100644
172 END
173     expectedReturn => [
174 {
175     svnConvertedText => <<'END',
176 Index: foo_new
177 similarity index 99%
178 copy from foo
179 copy to foo_new
180 END
181     copiedFromPath => "foo",
182     indexPath => "foo_new",
183     isCopyWithChanges => 1,
184 },
185 "diff --git a/bar b/bar\n"],
186     expectedNextLine => "index d45dd40..3494526 100644\n",
187 },
188 {   # New test
189     diffName => "rename (with similarity index 100%)",
190     inputText => <<'END',
191 diff --git a/foo b/foo_new
192 similarity index 100%
193 rename from foo
194 rename to foo_new
195 diff --git a/bar b/bar
196 index d45dd40..3494526 100644
197 END
198     expectedReturn => [
199 {
200     svnConvertedText => <<'END',
201 Index: foo_new
202 similarity index 100%
203 rename from foo
204 rename to foo_new
205 END
206     copiedFromPath => "foo",
207     indexPath => "foo_new",
208     shouldDeleteSource => 1,
209 },
210 "diff --git a/bar b/bar\n"],
211     expectedNextLine => "index d45dd40..3494526 100644\n",
212 },
213 {   # New test
214     diffName => "rename (with similarity index < 100%)",
215     inputText => <<'END',
216 diff --git a/foo b/foo_new
217 similarity index 99%
218 rename from foo
219 rename to foo_new
220 index 1e50d1d..1459d21 100644
221 --- a/foo
222 +++ b/foo_new
223 @@ -15,3 +15,4 @@ release r deployment dep deploy:
224  line1
225  line2
226  line3
227 +line4
228 diff --git a/bar b/bar
229 index d45dd40..3494526 100644
230 END
231     expectedReturn => [
232 {
233     svnConvertedText => <<'END',
234 Index: foo_new
235 similarity index 99%
236 rename from foo
237 rename to foo_new
238 index 1e50d1d..1459d21 100644
239 --- foo_new
240 +++ foo_new
241 END
242     copiedFromPath => "foo",
243     indexPath => "foo_new",
244     isCopyWithChanges => 1,
245     shouldDeleteSource => 1,
246 },
247 "@@ -15,3 +15,4 @@ release r deployment dep deploy:\n"],
248     expectedNextLine => " line1\n",
249 },
250 {   # New test
251     diffName => "rename (with executable bit change)",
252     inputText => <<'END',
253 diff --git a/foo b/foo_new
254 old mode 100644
255 new mode 100755
256 similarity index 100%
257 rename from foo
258 rename to foo_new
259 diff --git a/bar b/bar
260 index d45dd40..3494526 100644
261 END
262     expectedReturn => [
263 {
264     svnConvertedText => <<'END',
265 Index: foo_new
266 old mode 100644
267 new mode 100755
268 similarity index 100%
269 rename from foo
270 rename to foo_new
271 END
272     copiedFromPath => "foo",
273     executableBitDelta => 1,
274     indexPath => "foo_new",
275     isCopyWithChanges => 1,
276     shouldDeleteSource => 1,
277 },
278 "diff --git a/bar b/bar\n"],
279     expectedNextLine => "index d45dd40..3494526 100644\n",
280 },
281 ####
282 #    Binary file test cases
283 ##
284 {
285     # New test case
286     diffName => "New binary file",
287     inputText => <<'END',
288 diff --git a/foo.gif b/foo.gif
289 new file mode 100644
290 index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
291 GIT binary patch
292 literal 7
293 OcmYex&reDa;sO8*F9L)B
294
295 literal 0
296 HcmV?d00001
297
298 END
299     expectedReturn => [
300 {
301     svnConvertedText => <<'END',
302 Index: foo.gif
303 new file mode 100644
304 index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
305 GIT binary patch
306 END
307     indexPath => "foo.gif",
308     isBinary => 1,
309     isNew => 1,
310 },
311 "literal 7\n"],
312     expectedNextLine => "OcmYex&reDa;sO8*F9L)B\n",
313 },
314 {
315     # New test case
316     diffName => "Deleted binary file",
317     inputText => <<'END',
318 diff --git a/foo.gif b/foo.gif
319 deleted file mode 100644
320 index 323fae0..0000000
321 GIT binary patch
322 literal 0
323 HcmV?d00001
324
325 literal 7
326 OcmYex&reDa;sO8*F9L)B
327
328 END
329     expectedReturn => [
330 {
331     svnConvertedText => <<'END',
332 Index: foo.gif
333 deleted file mode 100644
334 index 323fae0..0000000
335 GIT binary patch
336 END
337     indexPath => "foo.gif",
338     isBinary => 1,
339     isDeletion => 1,
340 },
341 "literal 0\n"],
342     expectedNextLine => "HcmV?d00001\n",
343 },
344 ####
345 #    Executable bit test cases
346 ##
347 {
348     # New test case
349     diffName => "Modified executable file",
350     inputText => <<'END',
351 diff --git a/foo b/foo
352 index d03e242..435ad3a 100755
353 --- a/foo
354 +++ b/foo
355 @@ -1 +1 @@
356 -file contents
357 +new file contents
358
359 END
360     expectedReturn => [
361 {
362     svnConvertedText => <<'END',
363 Index: foo
364 index d03e242..435ad3a 100755
365 --- foo
366 +++ foo
367 END
368     indexPath => "foo",
369 },
370 "@@ -1 +1 @@\n"],
371     expectedNextLine => "-file contents\n",
372 },
373 {
374     # New test case
375     diffName => "Making file executable (last diff)",
376     inputText => <<'END',
377 diff --git a/foo.exe b/foo.exe
378 old mode 100644
379 new mode 100755
380 END
381     expectedReturn => [
382 {
383     svnConvertedText => <<'END',
384 Index: foo.exe
385 old mode 100644
386 new mode 100755
387 END
388     executableBitDelta => 1,
389     indexPath => "foo.exe",
390 },
391 undef],
392     expectedNextLine => undef,
393 },
394 {
395     # New test case
396     diffName => "Making file executable (not last diff)",
397     inputText => <<'END',
398 diff --git a/foo.exe b/foo.exe
399 old mode 100644
400 new mode 100755
401 diff --git a/another_file.txt b/another_file.txt
402 index d03e242..435ad3a 100755
403 END
404     expectedReturn => [
405 {
406     svnConvertedText => <<'END',
407 Index: foo.exe
408 old mode 100644
409 new mode 100755
410 END
411     executableBitDelta => 1,
412     indexPath => "foo.exe",
413 },
414 "diff --git a/another_file.txt b/another_file.txt\n"],
415     expectedNextLine => "index d03e242..435ad3a 100755\n",
416 },
417 {
418     # New test case
419     diffName => "New executable file",
420     inputText => <<'END',
421 diff --git a/foo b/foo
422 new file mode 100755
423 index 0000000..d03e242
424 --- /dev/null
425 +++ b/foo
426 @@ -0,0 +1 @@
427 +file contents
428
429 END
430     expectedReturn => [
431 {
432     svnConvertedText => <<'END',
433 Index: foo
434 new file mode 100755
435 index 0000000..d03e242
436 --- foo
437 +++ foo
438 END
439     executableBitDelta => 1,
440     indexPath => "foo",
441     isNew => 1,
442 },
443 "@@ -0,0 +1 @@\n"],
444     expectedNextLine => "+file contents\n",
445 },
446 {
447     # New test case
448     diffName => "Deleted executable file",
449     inputText => <<'END',
450 diff --git a/foo b/foo
451 deleted file mode 100755
452 index d03e242..0000000
453 --- a/foo
454 +++ /dev/null
455 @@ -1 +0,0 @@
456 -file contents
457
458 END
459     expectedReturn => [
460 {
461     svnConvertedText => <<'END',
462 Index: foo
463 deleted file mode 100755
464 index d03e242..0000000
465 --- foo
466 +++ foo
467 END
468     executableBitDelta => -1,
469     indexPath => "foo",
470     isDeletion => 1,
471 },
472 "@@ -1 +0,0 @@\n"],
473     expectedNextLine => "-file contents\n",
474 },
475 );
476
477 my $testCasesCount = @testCaseHashRefs;
478 plan(tests => 2 * $testCasesCount); # Total number of assertions.
479
480 foreach my $testCase (@testCaseHashRefs) {
481     my $testNameStart = "parseGitDiffHeader(): $testCase->{diffName}: comparing";
482
483     my $fileHandle;
484     open($fileHandle, "<", \$testCase->{inputText});
485     my $line = <$fileHandle>;
486
487     my @got = VCSUtils::parseGitDiffHeader($fileHandle, $line);
488     my $expectedReturn = $testCase->{expectedReturn};
489
490     is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
491
492     my $gotNextLine = <$fileHandle>;
493     is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
494 }