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