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