121939df44de1705786c545cd1bf519d47250322dBen Murdoch#!/usr/bin/perl -w
221939df44de1705786c545cd1bf519d47250322dBen Murdoch#
321939df44de1705786c545cd1bf519d47250322dBen Murdoch# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
421939df44de1705786c545cd1bf519d47250322dBen Murdoch#
521939df44de1705786c545cd1bf519d47250322dBen Murdoch# Redistribution and use in source and binary forms, with or without
621939df44de1705786c545cd1bf519d47250322dBen Murdoch# modification, are permitted provided that the following conditions
721939df44de1705786c545cd1bf519d47250322dBen Murdoch# are met:
821939df44de1705786c545cd1bf519d47250322dBen Murdoch# 1.  Redistributions of source code must retain the above copyright
921939df44de1705786c545cd1bf519d47250322dBen Murdoch#     notice, this list of conditions and the following disclaimer.
1021939df44de1705786c545cd1bf519d47250322dBen Murdoch# 2.  Redistributions in binary form must reproduce the above copyright
1121939df44de1705786c545cd1bf519d47250322dBen Murdoch#     notice, this list of conditions and the following disclaimer in the
1221939df44de1705786c545cd1bf519d47250322dBen Murdoch#     documentation and/or other materials provided with the distribution.
1321939df44de1705786c545cd1bf519d47250322dBen Murdoch#
1421939df44de1705786c545cd1bf519d47250322dBen Murdoch# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
1521939df44de1705786c545cd1bf519d47250322dBen Murdoch# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1621939df44de1705786c545cd1bf519d47250322dBen Murdoch# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1721939df44de1705786c545cd1bf519d47250322dBen Murdoch# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
1821939df44de1705786c545cd1bf519d47250322dBen Murdoch# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1921939df44de1705786c545cd1bf519d47250322dBen Murdoch# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2021939df44de1705786c545cd1bf519d47250322dBen Murdoch# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2121939df44de1705786c545cd1bf519d47250322dBen Murdoch# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2221939df44de1705786c545cd1bf519d47250322dBen Murdoch# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2321939df44de1705786c545cd1bf519d47250322dBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2421939df44de1705786c545cd1bf519d47250322dBen Murdoch
2521939df44de1705786c545cd1bf519d47250322dBen Murdoch# Unit tests of parseGitDiffHeader().
2621939df44de1705786c545cd1bf519d47250322dBen Murdoch
2721939df44de1705786c545cd1bf519d47250322dBen Murdochuse strict;
2821939df44de1705786c545cd1bf519d47250322dBen Murdochuse warnings;
2921939df44de1705786c545cd1bf519d47250322dBen Murdoch
3021939df44de1705786c545cd1bf519d47250322dBen Murdochuse Test::More;
3121939df44de1705786c545cd1bf519d47250322dBen Murdochuse VCSUtils;
3221939df44de1705786c545cd1bf519d47250322dBen Murdoch
3321939df44de1705786c545cd1bf519d47250322dBen Murdoch# The array of test cases.
3421939df44de1705786c545cd1bf519d47250322dBen Murdochmy @testCaseHashRefs = (
3521939df44de1705786c545cd1bf519d47250322dBen Murdoch{   # New test
3621939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "Modified file",
3721939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
3821939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo.h b/foo.h
3921939df44de1705786c545cd1bf519d47250322dBen Murdochindex f5d5e74..3b6aa92 100644
4021939df44de1705786c545cd1bf519d47250322dBen Murdoch--- a/foo.h
4121939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ b/foo.h
4221939df44de1705786c545cd1bf519d47250322dBen Murdoch@@ -1 +1 @@
4321939df44de1705786c545cd1bf519d47250322dBen Murdoch-file contents
4421939df44de1705786c545cd1bf519d47250322dBen Murdoch+new file contents
4521939df44de1705786c545cd1bf519d47250322dBen MurdochEND
4621939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
4721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
4821939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
4921939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.h
5021939df44de1705786c545cd1bf519d47250322dBen Murdochindex f5d5e74..3b6aa92 100644
5121939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo.h
5221939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo.h
5321939df44de1705786c545cd1bf519d47250322dBen MurdochEND
5421939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.h",
5521939df44de1705786c545cd1bf519d47250322dBen Murdoch},
5621939df44de1705786c545cd1bf519d47250322dBen Murdoch"@@ -1 +1 @@\n"],
5721939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "-file contents\n",
5821939df44de1705786c545cd1bf519d47250322dBen Murdoch},
5921939df44de1705786c545cd1bf519d47250322dBen Murdoch{   # New test
606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "new file",
6121939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
6221939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo.h b/foo.h
6321939df44de1705786c545cd1bf519d47250322dBen Murdochnew file mode 100644
6421939df44de1705786c545cd1bf519d47250322dBen Murdochindex 0000000..3c9f114
6521939df44de1705786c545cd1bf519d47250322dBen Murdoch--- /dev/null
6621939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ b/foo.h
6721939df44de1705786c545cd1bf519d47250322dBen Murdoch@@ -0,0 +1,34 @@
6821939df44de1705786c545cd1bf519d47250322dBen Murdoch+<html>
6921939df44de1705786c545cd1bf519d47250322dBen MurdochEND
7021939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
7121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
7221939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
7321939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.h
7421939df44de1705786c545cd1bf519d47250322dBen Murdochnew file mode 100644
7521939df44de1705786c545cd1bf519d47250322dBen Murdochindex 0000000..3c9f114
7621939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo.h
7721939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo.h
7821939df44de1705786c545cd1bf519d47250322dBen MurdochEND
7921939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.h",
806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isNew => 1,
8121939df44de1705786c545cd1bf519d47250322dBen Murdoch},
8221939df44de1705786c545cd1bf519d47250322dBen Murdoch"@@ -0,0 +1,34 @@\n"],
8321939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "+<html>\n",
8421939df44de1705786c545cd1bf519d47250322dBen Murdoch},
8521939df44de1705786c545cd1bf519d47250322dBen Murdoch{   # New test
866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "file deletion",
876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/foo b/foo
896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendeleted file mode 100644
906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex 1e50d1d..0000000
916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen--- a/foo
926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen+++ /dev/null
936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen@@ -1,1 +0,0 @@
946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen-line1
956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/configure.ac b/configure.ac
966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex d45dd40..3494526 100644
976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    svnConvertedText => <<'END',
1016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIndex: foo
1026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendeleted file mode 100644
1036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex 1e50d1d..0000000
1046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen--- foo
1056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen+++ foo
1066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
1076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    indexPath => "foo",
1086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isDeletion => 1,
1096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"@@ -1,1 +0,0 @@\n"],
1116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "-line1\n",
1126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{   # New test
11421939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "using --no-prefix",
11521939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
11621939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git foo.h foo.h
11721939df44de1705786c545cd1bf519d47250322dBen Murdochindex c925780..9e65c43 100644
11821939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo.h
11921939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo.h
12021939df44de1705786c545cd1bf519d47250322dBen Murdoch@@ -1,3 +1,17 @@
12121939df44de1705786c545cd1bf519d47250322dBen Murdoch+contents
12221939df44de1705786c545cd1bf519d47250322dBen MurdochEND
12321939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
12421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
12521939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
12621939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.h
12721939df44de1705786c545cd1bf519d47250322dBen Murdochindex c925780..9e65c43 100644
12821939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo.h
12921939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo.h
13021939df44de1705786c545cd1bf519d47250322dBen MurdochEND
13121939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.h",
13221939df44de1705786c545cd1bf519d47250322dBen Murdoch},
13321939df44de1705786c545cd1bf519d47250322dBen Murdoch"@@ -1,3 +1,17 @@\n"],
13421939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "+contents\n",
13521939df44de1705786c545cd1bf519d47250322dBen Murdoch},
13621939df44de1705786c545cd1bf519d47250322dBen Murdoch####
13721939df44de1705786c545cd1bf519d47250322dBen Murdoch#    Copy operations
13821939df44de1705786c545cd1bf519d47250322dBen Murdoch##
13921939df44de1705786c545cd1bf519d47250322dBen Murdoch{   # New test
14021939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "copy (with similarity index 100%)",
14121939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
14221939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo b/foo_new
14321939df44de1705786c545cd1bf519d47250322dBen Murdochsimilarity index 100%
14421939df44de1705786c545cd1bf519d47250322dBen Murdochcopy from foo
14521939df44de1705786c545cd1bf519d47250322dBen Murdochcopy to foo_new
14621939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/bar b/bar
14721939df44de1705786c545cd1bf519d47250322dBen Murdochindex d45dd40..3494526 100644
14821939df44de1705786c545cd1bf519d47250322dBen MurdochEND
14921939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
15021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
15121939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
15221939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo_new
15321939df44de1705786c545cd1bf519d47250322dBen Murdochsimilarity index 100%
15421939df44de1705786c545cd1bf519d47250322dBen Murdochcopy from foo
15521939df44de1705786c545cd1bf519d47250322dBen Murdochcopy to foo_new
15621939df44de1705786c545cd1bf519d47250322dBen MurdochEND
15721939df44de1705786c545cd1bf519d47250322dBen Murdoch    copiedFromPath => "foo",
15821939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo_new",
15921939df44de1705786c545cd1bf519d47250322dBen Murdoch},
16021939df44de1705786c545cd1bf519d47250322dBen Murdoch"diff --git a/bar b/bar\n"],
16121939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "index d45dd40..3494526 100644\n",
16221939df44de1705786c545cd1bf519d47250322dBen Murdoch},
16321939df44de1705786c545cd1bf519d47250322dBen Murdoch{   # New test
16421939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "copy (with similarity index < 100%)",
16521939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
16621939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo b/foo_new
16721939df44de1705786c545cd1bf519d47250322dBen Murdochsimilarity index 99%
16821939df44de1705786c545cd1bf519d47250322dBen Murdochcopy from foo
16921939df44de1705786c545cd1bf519d47250322dBen Murdochcopy to foo_new
17021939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/bar b/bar
17121939df44de1705786c545cd1bf519d47250322dBen Murdochindex d45dd40..3494526 100644
17221939df44de1705786c545cd1bf519d47250322dBen MurdochEND
17321939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
17421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
17521939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
17621939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo_new
17721939df44de1705786c545cd1bf519d47250322dBen Murdochsimilarity index 99%
17821939df44de1705786c545cd1bf519d47250322dBen Murdochcopy from foo
17921939df44de1705786c545cd1bf519d47250322dBen Murdochcopy to foo_new
18021939df44de1705786c545cd1bf519d47250322dBen MurdochEND
1816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    copiedFromPath => "foo",
1826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    indexPath => "foo_new",
1836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isCopyWithChanges => 1,
1846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"diff --git a/bar b/bar\n"],
1866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "index d45dd40..3494526 100644\n",
1876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{   # New test
1896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "rename (with similarity index 100%)",
1906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
1916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/foo b/foo_new
1926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsensimilarity index 100%
1936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename from foo
1946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename to foo_new
1956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/bar b/bar
1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex d45dd40..3494526 100644
1976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
1986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
1996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    svnConvertedText => <<'END',
2016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIndex: foo_new
2026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsensimilarity index 100%
2036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename from foo
2046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename to foo_new
2056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    copiedFromPath => "foo",
2076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    indexPath => "foo_new",
2086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    shouldDeleteSource => 1,
2096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"diff --git a/bar b/bar\n"],
2116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "index d45dd40..3494526 100644\n",
2126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{   # New test
2146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "rename (with similarity index < 100%)",
2156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
2166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/foo b/foo_new
2176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsensimilarity index 99%
2186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename from foo
2196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename to foo_new
2206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex 1e50d1d..1459d21 100644
2216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen--- a/foo
2226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen+++ b/foo_new
2236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen@@ -15,3 +15,4 @@ release r deployment dep deploy:
2246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen line1
2256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen line2
2266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen line3
2276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen+line4
2286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/bar b/bar
2296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex d45dd40..3494526 100644
2306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
2326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    svnConvertedText => <<'END',
2346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIndex: foo_new
2356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsensimilarity index 99%
2366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename from foo
2376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename to foo_new
2386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex 1e50d1d..1459d21 100644
2396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen--- foo_new
2406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen+++ foo_new
2416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    copiedFromPath => "foo",
2436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    indexPath => "foo_new",
2446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isCopyWithChanges => 1,
2456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    shouldDeleteSource => 1,
2466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"@@ -15,3 +15,4 @@ release r deployment dep deploy:\n"],
2486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => " line1\n",
2496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{   # New test
2516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "rename (with executable bit change)",
2526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
2536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/foo b/foo_new
2546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenold mode 100644
2556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsennew mode 100755
2566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsensimilarity index 100%
2576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename from foo
2586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename to foo_new
2596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendiff --git a/bar b/bar
2606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenindex d45dd40..3494526 100644
2616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
2636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    svnConvertedText => <<'END',
2656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIndex: foo_new
2666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenold mode 100644
2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsennew mode 100755
2686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsensimilarity index 100%
2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename from foo
2706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenrename to foo_new
2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    copiedFromPath => "foo",
2736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    executableBitDelta => 1,
27421939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo_new",
2756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isCopyWithChanges => 1,
2766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    shouldDeleteSource => 1,
27721939df44de1705786c545cd1bf519d47250322dBen Murdoch},
27821939df44de1705786c545cd1bf519d47250322dBen Murdoch"diff --git a/bar b/bar\n"],
27921939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "index d45dd40..3494526 100644\n",
28021939df44de1705786c545cd1bf519d47250322dBen Murdoch},
28121939df44de1705786c545cd1bf519d47250322dBen Murdoch####
28221939df44de1705786c545cd1bf519d47250322dBen Murdoch#    Binary file test cases
28321939df44de1705786c545cd1bf519d47250322dBen Murdoch##
28421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
28521939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
28621939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "New binary file",
28721939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
28821939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo.gif b/foo.gif
28921939df44de1705786c545cd1bf519d47250322dBen Murdochnew file mode 100644
29021939df44de1705786c545cd1bf519d47250322dBen Murdochindex 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
29121939df44de1705786c545cd1bf519d47250322dBen MurdochGIT binary patch
29221939df44de1705786c545cd1bf519d47250322dBen Murdochliteral 7
29321939df44de1705786c545cd1bf519d47250322dBen MurdochOcmYex&reDa;sO8*F9L)B
29421939df44de1705786c545cd1bf519d47250322dBen Murdoch
29521939df44de1705786c545cd1bf519d47250322dBen Murdochliteral 0
29621939df44de1705786c545cd1bf519d47250322dBen MurdochHcmV?d00001
29721939df44de1705786c545cd1bf519d47250322dBen Murdoch
29821939df44de1705786c545cd1bf519d47250322dBen MurdochEND
29921939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
30021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
30121939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
30221939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.gif
30321939df44de1705786c545cd1bf519d47250322dBen Murdochnew file mode 100644
30421939df44de1705786c545cd1bf519d47250322dBen Murdochindex 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
30521939df44de1705786c545cd1bf519d47250322dBen MurdochGIT binary patch
30621939df44de1705786c545cd1bf519d47250322dBen MurdochEND
30721939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.gif",
30821939df44de1705786c545cd1bf519d47250322dBen Murdoch    isBinary => 1,
3096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isNew => 1,
31021939df44de1705786c545cd1bf519d47250322dBen Murdoch},
31121939df44de1705786c545cd1bf519d47250322dBen Murdoch"literal 7\n"],
31221939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "OcmYex&reDa;sO8*F9L)B\n",
31321939df44de1705786c545cd1bf519d47250322dBen Murdoch},
31421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
31521939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
31621939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "Deleted binary file",
31721939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
31821939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo.gif b/foo.gif
31921939df44de1705786c545cd1bf519d47250322dBen Murdochdeleted file mode 100644
32021939df44de1705786c545cd1bf519d47250322dBen Murdochindex 323fae0..0000000
32121939df44de1705786c545cd1bf519d47250322dBen MurdochGIT binary patch
32221939df44de1705786c545cd1bf519d47250322dBen Murdochliteral 0
32321939df44de1705786c545cd1bf519d47250322dBen MurdochHcmV?d00001
32421939df44de1705786c545cd1bf519d47250322dBen Murdoch
32521939df44de1705786c545cd1bf519d47250322dBen Murdochliteral 7
32621939df44de1705786c545cd1bf519d47250322dBen MurdochOcmYex&reDa;sO8*F9L)B
32721939df44de1705786c545cd1bf519d47250322dBen Murdoch
32821939df44de1705786c545cd1bf519d47250322dBen MurdochEND
32921939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
33021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
33121939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
33221939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.gif
33321939df44de1705786c545cd1bf519d47250322dBen Murdochdeleted file mode 100644
33421939df44de1705786c545cd1bf519d47250322dBen Murdochindex 323fae0..0000000
33521939df44de1705786c545cd1bf519d47250322dBen MurdochGIT binary patch
33621939df44de1705786c545cd1bf519d47250322dBen MurdochEND
33721939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.gif",
33821939df44de1705786c545cd1bf519d47250322dBen Murdoch    isBinary => 1,
3396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isDeletion => 1,
34021939df44de1705786c545cd1bf519d47250322dBen Murdoch},
34121939df44de1705786c545cd1bf519d47250322dBen Murdoch"literal 0\n"],
34221939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "HcmV?d00001\n",
34321939df44de1705786c545cd1bf519d47250322dBen Murdoch},
34421939df44de1705786c545cd1bf519d47250322dBen Murdoch####
34521939df44de1705786c545cd1bf519d47250322dBen Murdoch#    Executable bit test cases
34621939df44de1705786c545cd1bf519d47250322dBen Murdoch##
34721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
34821939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
34921939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "Modified executable file",
35021939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
35121939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo b/foo
35221939df44de1705786c545cd1bf519d47250322dBen Murdochindex d03e242..435ad3a 100755
35321939df44de1705786c545cd1bf519d47250322dBen Murdoch--- a/foo
35421939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ b/foo
35521939df44de1705786c545cd1bf519d47250322dBen Murdoch@@ -1 +1 @@
35621939df44de1705786c545cd1bf519d47250322dBen Murdoch-file contents
35721939df44de1705786c545cd1bf519d47250322dBen Murdoch+new file contents
35821939df44de1705786c545cd1bf519d47250322dBen Murdoch
35921939df44de1705786c545cd1bf519d47250322dBen MurdochEND
36021939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
36121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
36221939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
36321939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo
36421939df44de1705786c545cd1bf519d47250322dBen Murdochindex d03e242..435ad3a 100755
36521939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo
36621939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo
36721939df44de1705786c545cd1bf519d47250322dBen MurdochEND
36821939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo",
36921939df44de1705786c545cd1bf519d47250322dBen Murdoch},
37021939df44de1705786c545cd1bf519d47250322dBen Murdoch"@@ -1 +1 @@\n"],
37121939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "-file contents\n",
37221939df44de1705786c545cd1bf519d47250322dBen Murdoch},
37321939df44de1705786c545cd1bf519d47250322dBen Murdoch{
37421939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
37521939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "Making file executable (last diff)",
37621939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
37721939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo.exe b/foo.exe
37821939df44de1705786c545cd1bf519d47250322dBen Murdochold mode 100644
37921939df44de1705786c545cd1bf519d47250322dBen Murdochnew mode 100755
38021939df44de1705786c545cd1bf519d47250322dBen MurdochEND
38121939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
38221939df44de1705786c545cd1bf519d47250322dBen Murdoch{
38321939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
38421939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.exe
38521939df44de1705786c545cd1bf519d47250322dBen Murdochold mode 100644
38621939df44de1705786c545cd1bf519d47250322dBen Murdochnew mode 100755
38721939df44de1705786c545cd1bf519d47250322dBen MurdochEND
38821939df44de1705786c545cd1bf519d47250322dBen Murdoch    executableBitDelta => 1,
38921939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.exe",
39021939df44de1705786c545cd1bf519d47250322dBen Murdoch},
39121939df44de1705786c545cd1bf519d47250322dBen Murdochundef],
39221939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => undef,
39321939df44de1705786c545cd1bf519d47250322dBen Murdoch},
39421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
39521939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
39621939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "Making file executable (not last diff)",
39721939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
39821939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo.exe b/foo.exe
39921939df44de1705786c545cd1bf519d47250322dBen Murdochold mode 100644
40021939df44de1705786c545cd1bf519d47250322dBen Murdochnew mode 100755
40121939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/another_file.txt b/another_file.txt
40221939df44de1705786c545cd1bf519d47250322dBen Murdochindex d03e242..435ad3a 100755
40321939df44de1705786c545cd1bf519d47250322dBen MurdochEND
40421939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
40521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
40621939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
40721939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo.exe
40821939df44de1705786c545cd1bf519d47250322dBen Murdochold mode 100644
40921939df44de1705786c545cd1bf519d47250322dBen Murdochnew mode 100755
41021939df44de1705786c545cd1bf519d47250322dBen MurdochEND
41121939df44de1705786c545cd1bf519d47250322dBen Murdoch    executableBitDelta => 1,
41221939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo.exe",
41321939df44de1705786c545cd1bf519d47250322dBen Murdoch},
41421939df44de1705786c545cd1bf519d47250322dBen Murdoch"diff --git a/another_file.txt b/another_file.txt\n"],
41521939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "index d03e242..435ad3a 100755\n",
41621939df44de1705786c545cd1bf519d47250322dBen Murdoch},
41721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
41821939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
41921939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "New executable file",
42021939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
42121939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo b/foo
42221939df44de1705786c545cd1bf519d47250322dBen Murdochnew file mode 100755
42321939df44de1705786c545cd1bf519d47250322dBen Murdochindex 0000000..d03e242
42421939df44de1705786c545cd1bf519d47250322dBen Murdoch--- /dev/null
42521939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ b/foo
42621939df44de1705786c545cd1bf519d47250322dBen Murdoch@@ -0,0 +1 @@
42721939df44de1705786c545cd1bf519d47250322dBen Murdoch+file contents
42821939df44de1705786c545cd1bf519d47250322dBen Murdoch
42921939df44de1705786c545cd1bf519d47250322dBen MurdochEND
43021939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
43121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
43221939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
43321939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo
43421939df44de1705786c545cd1bf519d47250322dBen Murdochnew file mode 100755
43521939df44de1705786c545cd1bf519d47250322dBen Murdochindex 0000000..d03e242
43621939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo
43721939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo
43821939df44de1705786c545cd1bf519d47250322dBen MurdochEND
43921939df44de1705786c545cd1bf519d47250322dBen Murdoch    executableBitDelta => 1,
44021939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo",
4416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isNew => 1,
44221939df44de1705786c545cd1bf519d47250322dBen Murdoch},
44321939df44de1705786c545cd1bf519d47250322dBen Murdoch"@@ -0,0 +1 @@\n"],
44421939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "+file contents\n",
44521939df44de1705786c545cd1bf519d47250322dBen Murdoch},
44621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
44721939df44de1705786c545cd1bf519d47250322dBen Murdoch    # New test case
44821939df44de1705786c545cd1bf519d47250322dBen Murdoch    diffName => "Deleted executable file",
44921939df44de1705786c545cd1bf519d47250322dBen Murdoch    inputText => <<'END',
45021939df44de1705786c545cd1bf519d47250322dBen Murdochdiff --git a/foo b/foo
45121939df44de1705786c545cd1bf519d47250322dBen Murdochdeleted file mode 100755
45221939df44de1705786c545cd1bf519d47250322dBen Murdochindex d03e242..0000000
45321939df44de1705786c545cd1bf519d47250322dBen Murdoch--- a/foo
45421939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ /dev/null
45521939df44de1705786c545cd1bf519d47250322dBen Murdoch@@ -1 +0,0 @@
45621939df44de1705786c545cd1bf519d47250322dBen Murdoch-file contents
45721939df44de1705786c545cd1bf519d47250322dBen Murdoch
45821939df44de1705786c545cd1bf519d47250322dBen MurdochEND
45921939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedReturn => [
46021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
46121939df44de1705786c545cd1bf519d47250322dBen Murdoch    svnConvertedText => <<'END',
46221939df44de1705786c545cd1bf519d47250322dBen MurdochIndex: foo
46321939df44de1705786c545cd1bf519d47250322dBen Murdochdeleted file mode 100755
46421939df44de1705786c545cd1bf519d47250322dBen Murdochindex d03e242..0000000
46521939df44de1705786c545cd1bf519d47250322dBen Murdoch--- foo
46621939df44de1705786c545cd1bf519d47250322dBen Murdoch+++ foo
46721939df44de1705786c545cd1bf519d47250322dBen MurdochEND
46821939df44de1705786c545cd1bf519d47250322dBen Murdoch    executableBitDelta => -1,
46921939df44de1705786c545cd1bf519d47250322dBen Murdoch    indexPath => "foo",
4706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    isDeletion => 1,
47121939df44de1705786c545cd1bf519d47250322dBen Murdoch},
47221939df44de1705786c545cd1bf519d47250322dBen Murdoch"@@ -1 +0,0 @@\n"],
47321939df44de1705786c545cd1bf519d47250322dBen Murdoch    expectedNextLine => "-file contents\n",
47421939df44de1705786c545cd1bf519d47250322dBen Murdoch},
47521939df44de1705786c545cd1bf519d47250322dBen Murdoch);
47621939df44de1705786c545cd1bf519d47250322dBen Murdoch
47721939df44de1705786c545cd1bf519d47250322dBen Murdochmy $testCasesCount = @testCaseHashRefs;
47821939df44de1705786c545cd1bf519d47250322dBen Murdochplan(tests => 2 * $testCasesCount); # Total number of assertions.
47921939df44de1705786c545cd1bf519d47250322dBen Murdoch
48021939df44de1705786c545cd1bf519d47250322dBen Murdochforeach my $testCase (@testCaseHashRefs) {
48121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $testNameStart = "parseGitDiffHeader(): $testCase->{diffName}: comparing";
48221939df44de1705786c545cd1bf519d47250322dBen Murdoch
48321939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $fileHandle;
48421939df44de1705786c545cd1bf519d47250322dBen Murdoch    open($fileHandle, "<", \$testCase->{inputText});
48521939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $line = <$fileHandle>;
48621939df44de1705786c545cd1bf519d47250322dBen Murdoch
48721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my @got = VCSUtils::parseGitDiffHeader($fileHandle, $line);
48821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $expectedReturn = $testCase->{expectedReturn};
48921939df44de1705786c545cd1bf519d47250322dBen Murdoch
49021939df44de1705786c545cd1bf519d47250322dBen Murdoch    is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
49121939df44de1705786c545cd1bf519d47250322dBen Murdoch
49221939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $gotNextLine = <$fileHandle>;
49321939df44de1705786c545cd1bf519d47250322dBen Murdoch    is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
49421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
495