| OLD | NEW |
| (Empty) |
| 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..64a9532e7794fcd791f6f12157406d90
60151690 | |
| 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..64a9532e7794fcd791f6f12157406d90
60151690 | |
| 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 l
ine."); | |
| 494 } | |
| OLD | NEW |