Home | History | Annotate | Download | only in VCSUtils_unittest
      1 #!/usr/bin/perl -w
      2 #
      3 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek (at] gmail.com)
      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 ANY
     15 # 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 ANY
     18 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     19 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     20 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     21 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     23 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24 
     25 # Unit tests of parseDiff().
     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 {
     36     # New test
     37     diffName => "SVN: simple",
     38     inputText => <<'END',
     39 Index: Makefile
     40 ===================================================================
     41 --- Makefile	(revision 53052)
     42 +++ Makefile	(working copy)
     43 @@ -1,3 +1,4 @@
     44 +
     45  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
     46 
     47  all:
     48 END
     49     expectedReturn => [
     50 [{
     51     svnConvertedText =>  <<'END', # Same as input text
     52 Index: Makefile
     53 ===================================================================
     54 --- Makefile	(revision 53052)
     55 +++ Makefile	(working copy)
     56 @@ -1,3 +1,4 @@
     57 +
     58  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
     59 
     60  all:
     61 END
     62     indexPath => "Makefile",
     63     isSvn => 1,
     64     numTextChunks => 1,
     65     sourceRevision => "53052",
     66 }],
     67 undef],
     68     expectedNextLine => undef,
     69 },
     70 {
     71     # New test
     72     diffName => "SVN: binary file (isBinary true)",
     73     inputText => <<'END',
     74 Index: test_file.swf
     75 ===================================================================
     76 Cannot display: file marked as a binary type.
     77 svn:mime-type = application/octet-stream
     78 
     79 Property changes on: test_file.swf
     80 ___________________________________________________________________
     81 Name: svn:mime-type
     82    + application/octet-stream
     83 
     84 
     85 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
     86 END
     87     expectedReturn => [
     88 [{
     89     svnConvertedText =>  <<'END', # Same as input text
     90 Index: test_file.swf
     91 ===================================================================
     92 Cannot display: file marked as a binary type.
     93 svn:mime-type = application/octet-stream
     94 
     95 
     96 
     97 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
     98 END
     99     indexPath => "test_file.swf",
    100     isBinary => 1,
    101     isSvn => 1,
    102 }],
    103 undef],
    104     expectedNextLine => undef,
    105 },
    106 {
    107     # New test
    108     diffName => "SVN: binary file (isBinary true) using Windows line endings",
    109     inputText => toWindowsLineEndings(<<'END',
    110 Index: test_file.swf
    111 ===================================================================
    112 Cannot display: file marked as a binary type.
    113 svn:mime-type = application/octet-stream
    114 
    115 Property changes on: test_file.swf
    116 ___________________________________________________________________
    117 Name: svn:mime-type
    118    + application/octet-stream
    119 
    120 
    121 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    122 END
    123 ),
    124     expectedReturn => [
    125 [{
    126     svnConvertedText =>  toWindowsLineEndings(<<'END', # Same as input text
    127 Index: test_file.swf
    128 ===================================================================
    129 Cannot display: file marked as a binary type.
    130 svn:mime-type = application/octet-stream
    131 
    132 
    133 
    134 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    135 END
    136 ),
    137     indexPath => "test_file.swf",
    138     isBinary => 1,
    139     isSvn => 1,
    140 }],
    141 undef],
    142     expectedNextLine => undef,
    143 },
    144 {
    145     # New test
    146     diffName => "SVN: leading junk",
    147     inputText => <<'END',
    148 
    149 LEADING JUNK
    150 
    151 Index: Makefile
    152 ===================================================================
    153 --- Makefile	(revision 53052)
    154 +++ Makefile	(working copy)
    155 @@ -1,3 +1,4 @@
    156 +
    157  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    158 
    159  all:
    160 END
    161     expectedReturn => [
    162 [{
    163     svnConvertedText =>  <<'END', # Same as input text
    164 
    165 LEADING JUNK
    166 
    167 Index: Makefile
    168 ===================================================================
    169 --- Makefile	(revision 53052)
    170 +++ Makefile	(working copy)
    171 @@ -1,3 +1,4 @@
    172 +
    173  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    174 
    175  all:
    176 END
    177     indexPath => "Makefile",
    178     isSvn => 1,
    179     numTextChunks => 1,
    180     sourceRevision => "53052",
    181 }],
    182 undef],
    183     expectedNextLine => undef,
    184 },
    185 {
    186     # New test
    187     diffName => "SVN: copied file",
    188     inputText => <<'END',
    189 Index: Makefile_new
    190 ===================================================================
    191 --- Makefile_new	(revision 53131)	(from Makefile:53131)
    192 +++ Makefile_new	(working copy)
    193 @@ -0,0 +1,1 @@
    194 +MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    195 END
    196     expectedReturn => [
    197 [{
    198     copiedFromPath => "Makefile",
    199     indexPath => "Makefile_new",
    200     sourceRevision => "53131",
    201 }],
    202 undef],
    203     expectedNextLine => undef,
    204 },
    205 {
    206     # New test
    207     diffName => "SVN: two diffs",
    208     inputText => <<'END',
    209 Index: Makefile
    210 ===================================================================
    211 --- Makefile	(revision 53131)
    212 +++ Makefile	(working copy)
    213 @@ -1,1 +0,0 @@
    214 -MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    215 Index: Makefile_new
    216 ===================================================================
    217 --- Makefile_new	(revision 53131)	(from Makefile:53131)
    218 END
    219     expectedReturn => [
    220 [{
    221     svnConvertedText =>  <<'END',
    222 Index: Makefile
    223 ===================================================================
    224 --- Makefile	(revision 53131)
    225 +++ Makefile	(working copy)
    226 @@ -1,1 +0,0 @@
    227 -MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    228 END
    229     indexPath => "Makefile",
    230     isSvn => 1,
    231     numTextChunks => 1,
    232     sourceRevision => "53131",
    233 }],
    234 "Index: Makefile_new\n"],
    235     expectedNextLine => "===================================================================\n",
    236 },
    237 {
    238     # New test
    239     diffName => "SVN: SVN diff followed by Git diff", # Should not recognize Git start
    240     inputText => <<'END',
    241 Index: Makefile
    242 ===================================================================
    243 --- Makefile	(revision 53131)
    244 +++ Makefile	(working copy)
    245 @@ -1,1 +0,0 @@
    246 -MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    247 diff --git a/Makefile b/Makefile
    248 index f5d5e74..3b6aa92 100644
    249 --- a/Makefile
    250 +++ b/Makefile
    251 @@ -1,1 1,1 @@ public:
    252 END
    253     expectedReturn => [
    254 [{
    255     svnConvertedText =>  <<'END', # Same as input text
    256 Index: Makefile
    257 ===================================================================
    258 --- Makefile	(revision 53131)
    259 +++ Makefile	(working copy)
    260 @@ -1,1 +0,0 @@
    261 -MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
    262 diff --git a/Makefile b/Makefile
    263 index f5d5e74..3b6aa92 100644
    264 --- a/Makefile
    265 +++ b/Makefile
    266 @@ -1,1 1,1 @@ public:
    267 END
    268     indexPath => "Makefile",
    269     isSvn => 1,
    270     numTextChunks => 1,
    271     sourceRevision => "53131",
    272 }],
    273 undef],
    274     expectedNextLine => undef,
    275 },
    276 ####
    277 # Property Changes: Simple
    278 ##
    279 {
    280     # New test
    281     diffName => "SVN: file change diff with property change diff",
    282     inputText => <<'END',
    283 Index: Makefile
    284 ===================================================================
    285 --- Makefile	(revision 60021)
    286 +++ Makefile	(working copy)
    287 @@ -1,3 +1,4 @@
    288 +
    289  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    290 
    291  all:
    292 
    293 Property changes on: Makefile
    294 ___________________________________________________________________
    295 Name: svn:executable
    296    + *
    297 END
    298     expectedReturn => [
    299 [{
    300     svnConvertedText =>  <<'END', # Same as input text
    301 Index: Makefile
    302 ===================================================================
    303 --- Makefile	(revision 60021)
    304 +++ Makefile	(working copy)
    305 @@ -1,3 +1,4 @@
    306 +
    307  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    308 
    309  all:
    310 
    311 END
    312     executableBitDelta => 1,
    313     indexPath => "Makefile",
    314     isSvn => 1,
    315     numTextChunks => 1,
    316     sourceRevision => "60021",
    317 }],
    318 undef],
    319     expectedNextLine => undef,
    320 },
    321 {
    322     # New test
    323     diffName => "SVN: file change diff, followed by property change diff on different file",
    324     inputText => <<'END',
    325 Index: Makefile
    326 ===================================================================
    327 --- Makefile	(revision 60021)
    328 +++ Makefile	(working copy)
    329 @@ -1,3 +1,4 @@
    330 +
    331  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    332 
    333  all:
    334 
    335 Property changes on: Makefile.shared
    336 ___________________________________________________________________
    337 Name: svn:executable
    338    + *
    339 END
    340     expectedReturn => [
    341 [{
    342     svnConvertedText =>  <<'END', # Same as input text
    343 Index: Makefile
    344 ===================================================================
    345 --- Makefile	(revision 60021)
    346 +++ Makefile	(working copy)
    347 @@ -1,3 +1,4 @@
    348 +
    349  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    350 
    351  all:
    352 
    353 END
    354     indexPath => "Makefile",
    355     isSvn => 1,
    356     numTextChunks => 1,
    357     sourceRevision => "60021",
    358 }],
    359 "Property changes on: Makefile.shared\n"],
    360     expectedNextLine => "___________________________________________________________________\n",
    361 },
    362 {
    363     # New test
    364     diffName => "SVN: property diff, followed by file change diff",
    365     inputText => <<'END',
    366 Property changes on: Makefile
    367 ___________________________________________________________________
    368 Deleted: svn:executable
    369    - *
    370 
    371 Index: Makefile.shared
    372 ===================================================================
    373 --- Makefile.shared	(revision 60021)
    374 +++ Makefile.shared	(working copy)
    375 @@ -1,3 +1,4 @@
    376 +
    377 SCRIPTS_PATH ?= ../WebKitTools/Scripts
    378 XCODE_OPTIONS = `perl -I$(SCRIPTS_PATH) -Mwebkitdirs -e 'print XcodeOptionString()'` $(ARGS)
    379 END
    380     expectedReturn => [
    381 [{
    382     executableBitDelta => -1,
    383     indexPath => "Makefile",
    384     isSvn => 1,
    385 }],
    386 "Index: Makefile.shared\n"],
    387     expectedNextLine => "===================================================================\n",
    388 },
    389 {
    390     # New test
    391     diffName => "SVN: property diff, followed by file change diff using Windows line endings",
    392     inputText => toWindowsLineEndings(<<'END',
    393 Property changes on: Makefile
    394 ___________________________________________________________________
    395 Deleted: svn:executable
    396    - *
    397 
    398 Index: Makefile.shared
    399 ===================================================================
    400 --- Makefile.shared	(revision 60021)
    401 +++ Makefile.shared	(working copy)
    402 @@ -1,3 +1,4 @@
    403 +
    404 SCRIPTS_PATH ?= ../WebKitTools/Scripts
    405 XCODE_OPTIONS = `perl -I$(SCRIPTS_PATH) -Mwebkitdirs -e 'print XcodeOptionString()'` $(ARGS)
    406 END
    407 ),
    408     expectedReturn => [
    409 [{
    410     executableBitDelta => -1,
    411     indexPath => "Makefile",
    412     isSvn => 1,
    413 }],
    414 "Index: Makefile.shared\r\n"],
    415     expectedNextLine => "===================================================================\r\n",
    416 },
    417 {
    418     # New test
    419     diffName => "SVN: copied file with property change",
    420     inputText => <<'END',
    421 Index: NMakefile
    422 ===================================================================
    423 --- NMakefile	(revision 60021)	(from Makefile:60021)
    424 +++ NMakefile	(working copy)
    425 @@ -0,0 +1,1 @@
    426 +MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    427 
    428 Property changes on: NMakefile
    429 ___________________________________________________________________
    430 Added: svn:executable
    431    + *
    432 END
    433     expectedReturn => [
    434 [{
    435     copiedFromPath => "Makefile",
    436     executableBitDelta => 1,
    437     indexPath => "NMakefile",
    438     sourceRevision => "60021",
    439 }],
    440 undef],
    441     expectedNextLine => undef,
    442 },
    443 {
    444     # New test
    445     diffName => "SVN: two consecutive property diffs",
    446     inputText => <<'END',
    447 Property changes on: Makefile
    448 ___________________________________________________________________
    449 Added: svn:executable
    450    + *
    451 
    452 
    453 Property changes on: Makefile.shared
    454 ___________________________________________________________________
    455 Added: svn:executable
    456    + *
    457 END
    458     expectedReturn => [
    459 [{
    460     executableBitDelta => 1,
    461     indexPath => "Makefile",
    462     isSvn => 1,
    463 }],
    464 "Property changes on: Makefile.shared\n"],
    465     expectedNextLine => "___________________________________________________________________\n",
    466 },
    467 {
    468     # New test
    469     diffName => "SVN: two consecutive property diffs using Windows line endings",
    470     inputText => toWindowsLineEndings(<<'END',
    471 Property changes on: Makefile
    472 ___________________________________________________________________
    473 Added: svn:executable
    474    + *
    475 
    476 
    477 Property changes on: Makefile.shared
    478 ___________________________________________________________________
    479 Added: svn:executable
    480    + *
    481 END
    482 ),
    483     expectedReturn => [
    484 [{
    485     executableBitDelta => 1,
    486     indexPath => "Makefile",
    487     isSvn => 1,
    488 }],
    489 "Property changes on: Makefile.shared\r\n"],
    490     expectedNextLine => "___________________________________________________________________\r\n",
    491 },
    492 ####
    493 # Property Changes: Binary files
    494 ##
    495 {
    496     # New test
    497     diffName => "SVN: binary file with executable bit change",
    498     inputText => <<'END',
    499 Index: test_file.swf
    500 ===================================================================
    501 Cannot display: file marked as a binary type.
    502 svn:mime-type = application/octet-stream
    503 
    504 Property changes on: test_file.swf
    505 ___________________________________________________________________
    506 Name: svn:mime-type
    507    + application/octet-stream
    508 Name: svn:executable
    509    + *
    510 
    511 
    512 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    513 END
    514     expectedReturn => [
    515 [{
    516     svnConvertedText =>  <<'END', # Same as input text
    517 Index: test_file.swf
    518 ===================================================================
    519 Cannot display: file marked as a binary type.
    520 svn:mime-type = application/octet-stream
    521 
    522 
    523 
    524 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    525 END
    526     executableBitDelta => 1,
    527     indexPath => "test_file.swf",
    528     isBinary => 1,
    529     isSvn => 1,
    530 }],
    531 undef],
    532     expectedNextLine => undef,
    533 },
    534 {
    535     # New test
    536     diffName => "SVN: binary file with executable bit change usng Windows line endings",
    537     inputText => toWindowsLineEndings(<<'END',
    538 Index: test_file.swf
    539 ===================================================================
    540 Cannot display: file marked as a binary type.
    541 svn:mime-type = application/octet-stream
    542 
    543 Property changes on: test_file.swf
    544 ___________________________________________________________________
    545 Name: svn:mime-type
    546    + application/octet-stream
    547 Name: svn:executable
    548    + *
    549 
    550 
    551 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    552 END
    553 ),
    554     expectedReturn => [
    555 [{
    556     svnConvertedText =>  toWindowsLineEndings(<<'END', # Same as input text
    557 Index: test_file.swf
    558 ===================================================================
    559 Cannot display: file marked as a binary type.
    560 svn:mime-type = application/octet-stream
    561 
    562 
    563 
    564 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    565 END
    566 ),
    567     executableBitDelta => 1,
    568     indexPath => "test_file.swf",
    569     isBinary => 1,
    570     isSvn => 1,
    571 }],
    572 undef],
    573     expectedNextLine => undef,
    574 },
    575 {
    576     # New test
    577     diffName => "SVN: binary file followed by property change on different file",
    578     inputText => <<'END',
    579 Index: test_file.swf
    580 ===================================================================
    581 Cannot display: file marked as a binary type.
    582 svn:mime-type = application/octet-stream
    583 
    584 Property changes on: test_file.swf
    585 ___________________________________________________________________
    586 Name: svn:mime-type
    587    + application/octet-stream
    588 
    589 
    590 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    591 
    592 Property changes on: Makefile
    593 ___________________________________________________________________
    594 Added: svn:executable
    595    + *
    596 END
    597     expectedReturn => [
    598 [{
    599     svnConvertedText =>  <<'END', # Same as input text
    600 Index: test_file.swf
    601 ===================================================================
    602 Cannot display: file marked as a binary type.
    603 svn:mime-type = application/octet-stream
    604 
    605 
    606 
    607 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    608 
    609 END
    610     indexPath => "test_file.swf",
    611     isBinary => 1,
    612     isSvn => 1,
    613 }],
    614 "Property changes on: Makefile\n"],
    615     expectedNextLine => "___________________________________________________________________\n",
    616 },
    617 {
    618     # New test
    619     diffName => "SVN: binary file followed by property change on different file using Windows line endings",
    620     inputText => toWindowsLineEndings(<<'END',
    621 Index: test_file.swf
    622 ===================================================================
    623 Cannot display: file marked as a binary type.
    624 svn:mime-type = application/octet-stream
    625 
    626 Property changes on: test_file.swf
    627 ___________________________________________________________________
    628 Name: svn:mime-type
    629    + application/octet-stream
    630 
    631 
    632 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    633 
    634 Property changes on: Makefile
    635 ___________________________________________________________________
    636 Added: svn:executable
    637    + *
    638 END
    639 ),
    640     expectedReturn => [
    641 [{
    642     svnConvertedText =>  toWindowsLineEndings(<<'END', # Same as input text
    643 Index: test_file.swf
    644 ===================================================================
    645 Cannot display: file marked as a binary type.
    646 svn:mime-type = application/octet-stream
    647 
    648 
    649 
    650 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    651 
    652 END
    653 ),
    654     indexPath => "test_file.swf",
    655     isBinary => 1,
    656     isSvn => 1,
    657 }],
    658 "Property changes on: Makefile\r\n"],
    659     expectedNextLine => "___________________________________________________________________\r\n",
    660 },
    661 {
    662     # New test
    663     diffName => "SVN: binary file followed by file change on different file",
    664     inputText => <<'END',
    665 Index: test_file.swf
    666 ===================================================================
    667 Cannot display: file marked as a binary type.
    668 svn:mime-type = application/octet-stream
    669 
    670 Property changes on: test_file.swf
    671 ___________________________________________________________________
    672 Name: svn:mime-type
    673    + application/octet-stream
    674 
    675 
    676 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    677 
    678 Index: Makefile
    679 ===================================================================
    680 --- Makefile	(revision 60021)
    681 +++ Makefile	(working copy)
    682 @@ -1,3 +1,4 @@
    683 +
    684  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    685 
    686  all:
    687 END
    688     expectedReturn => [
    689 [{
    690     svnConvertedText =>  <<'END', # Same as input text
    691 Index: test_file.swf
    692 ===================================================================
    693 Cannot display: file marked as a binary type.
    694 svn:mime-type = application/octet-stream
    695 
    696 
    697 
    698 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    699 
    700 END
    701     indexPath => "test_file.swf",
    702     isBinary => 1,
    703     isSvn => 1,
    704 }],
    705 "Index: Makefile\n"],
    706     expectedNextLine => "===================================================================\n",
    707 },
    708 {
    709     # New test
    710     diffName => "SVN: binary file followed by file change on different file using Windows line endings",
    711     inputText => toWindowsLineEndings(<<'END',
    712 Index: test_file.swf
    713 ===================================================================
    714 Cannot display: file marked as a binary type.
    715 svn:mime-type = application/octet-stream
    716 
    717 Property changes on: test_file.swf
    718 ___________________________________________________________________
    719 Name: svn:mime-type
    720    + application/octet-stream
    721 
    722 
    723 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    724 
    725 Index: Makefile
    726 ===================================================================
    727 --- Makefile	(revision 60021)
    728 +++ Makefile	(working copy)
    729 @@ -1,3 +1,4 @@
    730 +
    731  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    732 
    733  all:
    734 END
    735 ),
    736     expectedReturn => [
    737 [{
    738     svnConvertedText =>  toWindowsLineEndings(<<'END', # Same as input text
    739 Index: test_file.swf
    740 ===================================================================
    741 Cannot display: file marked as a binary type.
    742 svn:mime-type = application/octet-stream
    743 
    744 
    745 
    746 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
    747 
    748 END
    749 ),
    750     indexPath => "test_file.swf",
    751     isBinary => 1,
    752     isSvn => 1,
    753 }],
    754 "Index: Makefile\r\n"],
    755     expectedNextLine => "===================================================================\r\n",
    756 },
    757 ####
    758 # Property Changes: File change with property change
    759 ##
    760 {
    761     # New test
    762     diffName => "SVN: file change diff with property change, followed by property change diff",
    763     inputText => <<'END',
    764 Index: Makefile
    765 ===================================================================
    766 --- Makefile	(revision 60021)
    767 +++ Makefile	(working copy)
    768 @@ -1,3 +1,4 @@
    769 +
    770  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    771 
    772  all:
    773 
    774 Property changes on: Makefile
    775 ___________________________________________________________________
    776 Added: svn:executable
    777    + *
    778 
    779 
    780 Property changes on: Makefile.shared
    781 ___________________________________________________________________
    782 Deleted: svn:executable
    783    - *
    784 END
    785     expectedReturn => [
    786 [{
    787     svnConvertedText =>  <<'END', # Same as input text
    788 Index: Makefile
    789 ===================================================================
    790 --- Makefile	(revision 60021)
    791 +++ Makefile	(working copy)
    792 @@ -1,3 +1,4 @@
    793 +
    794  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    795 
    796  all:
    797 
    798 
    799 
    800 END
    801     executableBitDelta => 1,
    802     indexPath => "Makefile",
    803     isSvn => 1,
    804     numTextChunks => 1,
    805     sourceRevision => "60021",
    806 }],
    807 "Property changes on: Makefile.shared\n"],
    808     expectedNextLine => "___________________________________________________________________\n",
    809 },
    810 {
    811     # New test
    812     diffName => "SVN: file change diff with property change, followed by property change diff using Windows line endings",
    813     inputText => toWindowsLineEndings(<<'END',
    814 Index: Makefile
    815 ===================================================================
    816 --- Makefile	(revision 60021)
    817 +++ Makefile	(working copy)
    818 @@ -1,3 +1,4 @@
    819 +
    820  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    821 
    822  all:
    823 
    824 Property changes on: Makefile
    825 ___________________________________________________________________
    826 Added: svn:executable
    827    + *
    828 
    829 
    830 Property changes on: Makefile.shared
    831 ___________________________________________________________________
    832 Deleted: svn:executable
    833    - *
    834 END
    835 ),
    836     expectedReturn => [
    837 [{
    838     svnConvertedText =>  toWindowsLineEndings(<<'END', # Same as input text
    839 Index: Makefile
    840 ===================================================================
    841 --- Makefile	(revision 60021)
    842 +++ Makefile	(working copy)
    843 @@ -1,3 +1,4 @@
    844 +
    845  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    846 
    847  all:
    848 
    849 
    850 
    851 END
    852 ),
    853     executableBitDelta => 1,
    854     indexPath => "Makefile",
    855     isSvn => 1,
    856     numTextChunks => 1,
    857     sourceRevision => "60021",
    858 }],
    859 "Property changes on: Makefile.shared\r\n"],
    860     expectedNextLine => "___________________________________________________________________\r\n",
    861 },
    862 {
    863     # New test
    864     diffName => "SVN: file change diff with property change, followed by file change diff",
    865     inputText => <<'END',
    866 Index: Makefile
    867 ===================================================================
    868 --- Makefile	(revision 60021)
    869 +++ Makefile	(working copy)
    870 @@ -1,3 +1,4 @@
    871 +
    872  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    873 
    874  all:
    875 
    876 Property changes on: Makefile
    877 ___________________________________________________________________
    878 Name: svn:executable
    879    - *
    880 
    881 Index: Makefile.shared
    882 ===================================================================
    883 --- Makefile.shared	(revision 60021)
    884 +++ Makefile.shared	(working copy)
    885 @@ -1,3 +1,4 @@
    886 +
    887 SCRIPTS_PATH ?= ../WebKitTools/Scripts
    888 XCODE_OPTIONS = `perl -I$(SCRIPTS_PATH) -Mwebkitdirs -e 'print XcodeOptionString()'` $(ARGS)
    889 END
    890     expectedReturn => [
    891 [{
    892     svnConvertedText =>  <<'END', # Same as input text
    893 Index: Makefile
    894 ===================================================================
    895 --- Makefile	(revision 60021)
    896 +++ Makefile	(working copy)
    897 @@ -1,3 +1,4 @@
    898 +
    899  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    900 
    901  all:
    902 
    903 
    904 END
    905     executableBitDelta => -1,
    906     indexPath => "Makefile",
    907     isSvn => 1,
    908     numTextChunks => 1,
    909     sourceRevision => "60021",
    910 }],
    911 "Index: Makefile.shared\n"],
    912     expectedNextLine => "===================================================================\n",
    913 },
    914 {
    915     # New test
    916     diffName => "SVN: file change diff with property change, followed by file change diff using Windows line endings",
    917     inputText => toWindowsLineEndings(<<'END',
    918 Index: Makefile
    919 ===================================================================
    920 --- Makefile	(revision 60021)
    921 +++ Makefile	(working copy)
    922 @@ -1,3 +1,4 @@
    923 +
    924  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    925 
    926  all:
    927 
    928 Property changes on: Makefile
    929 ___________________________________________________________________
    930 Name: svn:executable
    931    - *
    932 
    933 Index: Makefile.shared
    934 ===================================================================
    935 --- Makefile.shared	(revision 60021)
    936 +++ Makefile.shared	(working copy)
    937 @@ -1,3 +1,4 @@
    938 +
    939 SCRIPTS_PATH ?= ../WebKitTools/Scripts
    940 XCODE_OPTIONS = `perl -I$(SCRIPTS_PATH) -Mwebkitdirs -e 'print XcodeOptionString()'` $(ARGS)
    941 END
    942 ),
    943     expectedReturn => [
    944 [{
    945     svnConvertedText =>  toWindowsLineEndings(<<'END', # Same as input text
    946 Index: Makefile
    947 ===================================================================
    948 --- Makefile	(revision 60021)
    949 +++ Makefile	(working copy)
    950 @@ -1,3 +1,4 @@
    951 +
    952  MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKit2 WebKitTools
    953 
    954  all:
    955 
    956 
    957 END
    958 ),
    959     executableBitDelta => -1,
    960     indexPath => "Makefile",
    961     isSvn => 1,
    962     numTextChunks => 1,
    963     sourceRevision => "60021",
    964 }],
    965 "Index: Makefile.shared\r\n"],
    966     expectedNextLine => "===================================================================\r\n",
    967 },
    968 ####
    969 #    Git test cases
    970 ##
    971 {
    972     # New test
    973     diffName => "Git: simple",
    974     inputText => <<'END',
    975 diff --git a/Makefile b/Makefile
    976 index f5d5e74..3b6aa92 100644
    977 --- a/Makefile
    978 +++ b/Makefile
    979 @@ -1,1 +1,1 @@ public:
    980 END
    981     expectedReturn => [
    982 [{
    983     svnConvertedText =>  <<'END',
    984 Index: Makefile
    985 index f5d5e74..3b6aa92 100644
    986 --- Makefile
    987 +++ Makefile
    988 @@ -1,1 +1,1 @@ public:
    989 END
    990     indexPath => "Makefile",
    991     isGit => 1,
    992     numTextChunks => 1,
    993 }],
    994 undef],
    995     expectedNextLine => undef,
    996 },
    997 {
    998     # New test
    999     diffName => "Git: Append new line to the end of an existing file",
   1000     inputText => <<'END',
   1001 diff --git a/foo b/foo
   1002 index 863339f..db418b2 100644
   1003 --- a/foo
   1004 +++ b/foo
   1005 @@ -1 +1,2 @@
   1006  Passed
   1007 +
   1008 END
   1009     expectedReturn => [
   1010 [{
   1011     svnConvertedText =>  <<'END',
   1012 Index: foo
   1013 index 863339f..db418b2 100644
   1014 --- foo
   1015 +++ foo
   1016 @@ -1 +1,2 @@
   1017  Passed
   1018 +
   1019 END
   1020     indexPath => "foo",
   1021     isGit => 1,
   1022     numTextChunks => 1,
   1023 }],
   1024 undef],
   1025     expectedNextLine => undef,
   1026 },
   1027 {   # New test
   1028     diffName => "Git: new file",
   1029     inputText => <<'END',
   1030 diff --git a/foo.h b/foo.h
   1031 new file mode 100644
   1032 index 0000000..3c9f114
   1033 --- /dev/null
   1034 +++ b/foo.h
   1035 @@ -0,0 +1,34 @@
   1036 +<html>
   1037 diff --git a/bar b/bar
   1038 index d45dd40..3494526 100644
   1039 END
   1040     expectedReturn => [
   1041 [{
   1042     svnConvertedText => <<'END',
   1043 Index: foo.h
   1044 new file mode 100644
   1045 index 0000000..3c9f114
   1046 --- foo.h
   1047 +++ foo.h
   1048 @@ -0,0 +1,34 @@
   1049 +<html>
   1050 END
   1051     indexPath => "foo.h",
   1052     isGit => 1,
   1053     isNew => 1,
   1054     numTextChunks => 1,
   1055 }],
   1056 "diff --git a/bar b/bar\n"],
   1057     expectedNextLine => "index d45dd40..3494526 100644\n",
   1058 },
   1059 {   # New test
   1060     diffName => "Git: file deletion",
   1061     inputText => <<'END',
   1062 diff --git a/foo b/foo
   1063 deleted file mode 100644
   1064 index 1e50d1d..0000000
   1065 --- a/foo
   1066 +++ /dev/null
   1067 @@ -1,1 +0,0 @@
   1068 -line1
   1069 diff --git a/bar b/bar
   1070 index d45dd40..3494526 100644
   1071 END
   1072     expectedReturn => [
   1073 [{
   1074     svnConvertedText => <<'END',
   1075 Index: foo
   1076 deleted file mode 100644
   1077 index 1e50d1d..0000000
   1078 --- foo
   1079 +++ foo
   1080 @@ -1,1 +0,0 @@
   1081 -line1
   1082 END
   1083     indexPath => "foo",
   1084     isDeletion => 1,
   1085     isGit => 1,
   1086     numTextChunks => 1,
   1087 }],
   1088 "diff --git a/bar b/bar\n"],
   1089     expectedNextLine => "index d45dd40..3494526 100644\n",
   1090 },
   1091 {
   1092     # New test
   1093     diffName => "Git: Git diff followed by SVN diff", # Should not recognize SVN start
   1094     inputText => <<'END',
   1095 diff --git a/Makefile b/Makefile
   1096 index f5d5e74..3b6aa92 100644
   1097 --- a/Makefile
   1098 +++ b/Makefile
   1099 @@ -1,1 +1,1 @@ public:
   1100 Index: Makefile_new
   1101 ===================================================================
   1102 --- Makefile_new	(revision 53131)	(from Makefile:53131)
   1103 END
   1104     expectedReturn => [
   1105 [{
   1106     svnConvertedText =>  <<'END',
   1107 Index: Makefile
   1108 index f5d5e74..3b6aa92 100644
   1109 --- Makefile
   1110 +++ Makefile
   1111 @@ -1,1 +1,1 @@ public:
   1112 Index: Makefile_new
   1113 ===================================================================
   1114 --- Makefile_new	(revision 53131)	(from Makefile:53131)
   1115 END
   1116     indexPath => "Makefile",
   1117     isGit => 1,
   1118     numTextChunks => 1,
   1119 }],
   1120 undef],
   1121     expectedNextLine => undef,
   1122 },
   1123 {
   1124     # New test
   1125     diffName => "Git: file that only has an executable bit change",
   1126     inputText => <<'END',
   1127 diff --git a/foo b/foo
   1128 old mode 100644
   1129 new mode 100755
   1130 END
   1131     expectedReturn => [
   1132 [{
   1133     svnConvertedText =>  <<'END',
   1134 Index: foo
   1135 old mode 100644
   1136 new mode 100755
   1137 END
   1138     executableBitDelta => 1,
   1139     indexPath => "foo",
   1140     isGit => 1,
   1141     numTextChunks => 0,
   1142 }],
   1143 undef],
   1144     expectedNextLine => undef,
   1145 },
   1146 ####
   1147 #    Git test cases: file moves (multiple return values)
   1148 ##
   1149 {
   1150     diffName => "Git: rename (with similarity index 100%)",
   1151     inputText => <<'END',
   1152 diff --git a/foo b/foo_new
   1153 similarity index 100%
   1154 rename from foo
   1155 rename to foo_new
   1156 diff --git a/bar b/bar
   1157 index d45dd40..3494526 100644
   1158 END
   1159     expectedReturn => [
   1160 [{
   1161     indexPath => "foo",
   1162     isDeletion => 1,
   1163 },
   1164 {
   1165     copiedFromPath => "foo",
   1166     indexPath => "foo_new",
   1167 }],
   1168 "diff --git a/bar b/bar\n"],
   1169     expectedNextLine => "index d45dd40..3494526 100644\n",
   1170 },
   1171 {
   1172     diffName => "rename (with similarity index < 100%)",
   1173     inputText => <<'END',
   1174 diff --git a/foo b/foo_new
   1175 similarity index 99%
   1176 rename from foo
   1177 rename to foo_new
   1178 index 1e50d1d..1459d21 100644
   1179 --- a/foo
   1180 +++ b/foo_new
   1181 @@ -15,3 +15,4 @@ release r deployment dep deploy:
   1182  line1
   1183  line2
   1184  line3
   1185 +line4
   1186 diff --git a/bar b/bar
   1187 index d45dd40..3494526 100644
   1188 END
   1189     expectedReturn => [
   1190 [{
   1191     indexPath => "foo",
   1192     isDeletion => 1,
   1193 },
   1194 {
   1195     copiedFromPath => "foo",
   1196     indexPath => "foo_new",
   1197 },
   1198 {
   1199     indexPath => "foo_new",
   1200     isGit => 1,
   1201     numTextChunks => 1,
   1202     svnConvertedText => <<'END',
   1203 Index: foo_new
   1204 similarity index 99%
   1205 rename from foo
   1206 rename to foo_new
   1207 index 1e50d1d..1459d21 100644
   1208 --- foo_new
   1209 +++ foo_new
   1210 @@ -15,3 +15,4 @@ release r deployment dep deploy:
   1211  line1
   1212  line2
   1213  line3
   1214 +line4
   1215 END
   1216 }],
   1217 "diff --git a/bar b/bar\n"],
   1218     expectedNextLine => "index d45dd40..3494526 100644\n",
   1219 },
   1220 {
   1221     diffName => "rename (with executable bit change)",
   1222     inputText => <<'END',
   1223 diff --git a/foo b/foo_new
   1224 old mode 100644
   1225 new mode 100755
   1226 similarity index 100%
   1227 rename from foo
   1228 rename to foo_new
   1229 diff --git a/bar b/bar
   1230 index d45dd40..3494526 100644
   1231 END
   1232     expectedReturn => [
   1233 [{
   1234     indexPath => "foo",
   1235     isDeletion => 1,
   1236 },
   1237 {
   1238     copiedFromPath => "foo",
   1239     indexPath => "foo_new",
   1240 },
   1241 {
   1242     executableBitDelta => 1,
   1243     indexPath => "foo_new",
   1244     isGit => 1,
   1245     numTextChunks => 0,
   1246     svnConvertedText => <<'END',
   1247 Index: foo_new
   1248 old mode 100644
   1249 new mode 100755
   1250 similarity index 100%
   1251 rename from foo
   1252 rename to foo_new
   1253 END
   1254 }],
   1255 "diff --git a/bar b/bar\n"],
   1256     expectedNextLine => "index d45dd40..3494526 100644\n",
   1257 },
   1258 );
   1259 
   1260 my $testCasesCount = @testCaseHashRefs;
   1261 plan(tests => 2 * $testCasesCount); # Total number of assertions.
   1262 
   1263 foreach my $testCase (@testCaseHashRefs) {
   1264     my $testNameStart = "parseDiff(): $testCase->{diffName}: comparing";
   1265 
   1266     my $fileHandle;
   1267     open($fileHandle, "<", \$testCase->{inputText});
   1268     my $line = <$fileHandle>;
   1269 
   1270     my @got = VCSUtils::parseDiff($fileHandle, $line, {"shouldNotUseIndexPathEOL" => 1});
   1271     my $expectedReturn = $testCase->{expectedReturn};
   1272 
   1273     is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
   1274 
   1275     my $gotNextLine = <$fileHandle>;
   1276     is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
   1277 }
   1278