15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/perl -w
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# are met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1.  Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 2.  Redistributions in binary form must reproduce the above copyright
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     notice, this list of conditions and the following disclaimer in the
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     documentation and/or other materials provided with the distribution.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Unit tests of parseGitDiffHeader().
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use strict;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use warnings;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use Test::More;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use VCSUtils;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The array of test cases.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)my @testCaseHashRefs = (
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){   # New test
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    diffName => "Modified file",
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputText => <<'END',
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git a/foo.h b/foo.h
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index f5d5e74..3b6aa92 100644
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- a/foo.h
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ b/foo.h
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@@ -1 +1 @@
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)-file contents
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+new file contents
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedReturn => [
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    svnConvertedText => <<'END',
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Index: foo.h
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index f5d5e74..3b6aa92 100644
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- foo.h
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ foo.h
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    indexPath => "foo.h",
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"@@ -1 +1 @@\n"],
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedNextLine => "-file contents\n",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){   # New test
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    diffName => "new file",
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputText => <<'END',
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git a/foo.h b/foo.h
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)new file mode 100644
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index 0000000..3c9f114
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- /dev/null
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ b/foo.h
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@@ -0,0 +1,34 @@
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+<html>
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedReturn => [
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    svnConvertedText => <<'END',
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Index: foo.h
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)new file mode 100644
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index 0000000..3c9f114
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- foo.h
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ foo.h
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    indexPath => "foo.h",
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isNew => 1,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"@@ -0,0 +1,34 @@\n"],
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedNextLine => "+<html>\n",
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){   # New test
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    diffName => "file deletion",
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputText => <<'END',
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git a/foo b/foo
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)deleted file mode 100644
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index 1e50d1d..0000000
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- a/foo
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ /dev/null
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@@ -1,1 +0,0 @@
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)-line1
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git a/configure.ac b/configure.ac
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index d45dd40..3494526 100644
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedReturn => [
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    svnConvertedText => <<'END',
101116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIndex: foo
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)deleted file mode 100644
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochindex 1e50d1d..0000000
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- foo
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch+++ foo
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    indexPath => "foo",
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isDeletion => 1,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"@@ -1,1 +0,0 @@\n"],
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedNextLine => "-line1\n",
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){   # New test
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    diffName => "using --no-prefix",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputText => <<'END',
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git foo.h foo.h
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index c925780..9e65c43 100644
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- foo.h
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ foo.h
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@@ -1,3 +1,17 @@
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+contents
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedReturn => [
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    svnConvertedText => <<'END',
126116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIndex: foo.h
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdochindex c925780..9e65c43 100644
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch--- foo.h
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch+++ foo.h
130116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    indexPath => "foo.h",
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"@@ -1,3 +1,17 @@\n"],
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedNextLine => "+contents\n",
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch####
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#    Copy operations
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch##
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{   # New test
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    diffName => "copy (with similarity index 100%)",
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    inputText => <<'END',
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdiff --git a/foo b/foo_new
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsimilarity index 100%
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy from foo
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy to foo_new
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdiff --git a/bar b/bar
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdochindex d45dd40..3494526 100644
148116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedReturn => [
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    svnConvertedText => <<'END',
152116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIndex: foo_new
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsimilarity index 100%
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy from foo
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy to foo_new
156116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    copiedFromPath => "foo",
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    indexPath => "foo_new",
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"diff --git a/bar b/bar\n"],
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedNextLine => "index d45dd40..3494526 100644\n",
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{   # New test
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    diffName => "copy (with similarity index < 100%)",
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    inputText => <<'END',
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdiff --git a/foo b/foo_new
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsimilarity index 99%
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy from foo
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy to foo_new
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdiff --git a/bar b/bar
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdochindex d45dd40..3494526 100644
172116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedReturn => [
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    svnConvertedText => <<'END',
176116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIndex: foo_new
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsimilarity index 99%
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy from foo
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcopy to foo_new
180116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    copiedFromPath => "foo",
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    indexPath => "foo_new",
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    isCopyWithChanges => 1,
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"diff --git a/bar b/bar\n"],
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedNextLine => "index d45dd40..3494526 100644\n",
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch},
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{   # New test
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    diffName => "rename (with similarity index 100%)",
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    inputText => <<'END',
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdiff --git a/foo b/foo_new
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsimilarity index 100%
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdochrename from foo
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdochrename to foo_new
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdiff --git a/bar b/bar
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdochindex d45dd40..3494526 100644
197116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectedReturn => [
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    svnConvertedText => <<'END',
201116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIndex: foo_new
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsimilarity index 100%
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdochrename from foo
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdochrename to foo_new
205116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEND
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copiedFromPath => "foo",
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    indexPath => "foo_new",
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shouldDeleteSource => 1,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"diff --git a/bar b/bar\n"],
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedNextLine => "index d45dd40..3494526 100644\n",
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){   # New test
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    diffName => "rename (with similarity index < 100%)",
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputText => <<'END',
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git a/foo b/foo_new
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)similarity index 99%
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rename from foo
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rename to foo_new
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index 1e50d1d..1459d21 100644
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- a/foo
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ b/foo_new
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@@ -15,3 +15,4 @@ release r deployment dep deploy:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line1
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line2
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line3
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+line4
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)diff --git a/bar b/bar
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)index d45dd40..3494526 100644
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)END
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    expectedReturn => [
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles){
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    svnConvertedText => <<'END',
23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)Index: foo_new
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)similarity index 99%
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)rename from foo
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)rename to foo_new
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)index 1e50d1d..1459d21 100644
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--- foo_new
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+++ foo_new
241END
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',
253diff --git a/foo b/foo_new
254old mode 100644
255new mode 100755
256similarity index 100%
257rename from foo
258rename to foo_new
259diff --git a/bar b/bar
260index d45dd40..3494526 100644
261END
262    expectedReturn => [
263{
264    svnConvertedText => <<'END',
265Index: foo_new
266old mode 100644
267new mode 100755
268similarity index 100%
269rename from foo
270rename to foo_new
271END
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',
288diff --git a/foo.gif b/foo.gif
289new file mode 100644
290index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
291GIT binary patch
292literal 7
293OcmYex&reDa;sO8*F9L)B
294
295literal 0
296HcmV?d00001
297
298END
299    expectedReturn => [
300{
301    svnConvertedText => <<'END',
302Index: foo.gif
303new file mode 100644
304index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
305GIT binary patch
306END
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',
318diff --git a/foo.gif b/foo.gif
319deleted file mode 100644
320index 323fae0..0000000
321GIT binary patch
322literal 0
323HcmV?d00001
324
325literal 7
326OcmYex&reDa;sO8*F9L)B
327
328END
329    expectedReturn => [
330{
331    svnConvertedText => <<'END',
332Index: foo.gif
333deleted file mode 100644
334index 323fae0..0000000
335GIT binary patch
336END
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',
351diff --git a/foo b/foo
352index d03e242..435ad3a 100755
353--- a/foo
354+++ b/foo
355@@ -1 +1 @@
356-file contents
357+new file contents
358
359END
360    expectedReturn => [
361{
362    svnConvertedText => <<'END',
363Index: foo
364index d03e242..435ad3a 100755
365--- foo
366+++ foo
367END
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',
377diff --git a/foo.exe b/foo.exe
378old mode 100644
379new mode 100755
380END
381    expectedReturn => [
382{
383    svnConvertedText => <<'END',
384Index: foo.exe
385old mode 100644
386new mode 100755
387END
388    executableBitDelta => 1,
389    indexPath => "foo.exe",
390},
391undef],
392    expectedNextLine => undef,
393},
394{
395    # New test case
396    diffName => "Making file executable (not last diff)",
397    inputText => <<'END',
398diff --git a/foo.exe b/foo.exe
399old mode 100644
400new mode 100755
401diff --git a/another_file.txt b/another_file.txt
402index d03e242..435ad3a 100755
403END
404    expectedReturn => [
405{
406    svnConvertedText => <<'END',
407Index: foo.exe
408old mode 100644
409new mode 100755
410END
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',
421diff --git a/foo b/foo
422new file mode 100755
423index 0000000..d03e242
424--- /dev/null
425+++ b/foo
426@@ -0,0 +1 @@
427+file contents
428
429END
430    expectedReturn => [
431{
432    svnConvertedText => <<'END',
433Index: foo
434new file mode 100755
435index 0000000..d03e242
436--- foo
437+++ foo
438END
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',
450diff --git a/foo b/foo
451deleted file mode 100755
452index d03e242..0000000
453--- a/foo
454+++ /dev/null
455@@ -1 +0,0 @@
456-file contents
457
458END
459    expectedReturn => [
460{
461    svnConvertedText => <<'END',
462Index: foo
463deleted file mode 100755
464index d03e242..0000000
465--- foo
466+++ foo
467END
468    executableBitDelta => -1,
469    indexPath => "foo",
470    isDeletion => 1,
471},
472"@@ -1 +0,0 @@\n"],
473    expectedNextLine => "-file contents\n",
474},
475);
476
477my $testCasesCount = @testCaseHashRefs;
478plan(tests => 2 * $testCasesCount); # Total number of assertions.
479
480foreach 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}
495