blob: ee9fff903cefba403e4508fb978c7c45fe69a74a [file] [log] [blame]
#!/usr/bin/perl -w
#
# Copyright (C) 2011 Research In Motion Limited. All rights reserved.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# Unit tests of parseDiff() with mock files; test override of patch EOL with EOL of target file.
use strict;
use warnings;
use File::Temp;
use POSIX qw/getcwd/;
use Test::More;
use VCSUtils;
my $gitDiffHeaderForNewFile = <<EOF;
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..756e864
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,17 @@
EOF
my $gitDiffHeader = <<EOF;
diff --git a/Makefile b/Makefile
index 756e864..04d2ae1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,4 @@
EOF
my $svnConvertedGitDiffHeader = <<EOF;
Index: Makefile
index 756e864..04d2ae1 100644
--- Makefile
+++ Makefile
@@ -1,3 +1,4 @@
EOF
my $svnConvertedGitDiffHeaderForNewFile = <<EOF;
Index: Makefile
new file mode 100644
index 0000000..756e864
--- Makefile
+++ Makefile
@@ -0,0 +1,17 @@
EOF
my $svnDiffHeaderForNewFile = <<EOF;
Index: Makefile
===================================================================
--- Makefile (revision 0)
+++ Makefile (revision 0)
@@ -0,0 +1,17 @@
EOF
my $svnDiffHeader = <<EOF;
Index: Makefile
===================================================================
--- Makefile (revision 53052)
+++ Makefile (working copy)
@@ -1,3 +1,4 @@
EOF
my $diffBody = <<EOF;
+
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
all:
EOF
my $MakefileContents = <<EOF;
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
all:
EOF
my $mockDir = File::Temp->tempdir("parseDiffXXXX", CLEANUP => 1);
writeToFile(File::Spec->catfile($mockDir, "MakefileWithUnixEOL"), $MakefileContents);
writeToFile(File::Spec->catfile($mockDir, "MakefileWithWindowsEOL"), toWindowsLineEndings($MakefileContents));
# The array of test cases.
my @testCaseHashRefs = (
###
# SVN test cases
##
{
# New test
diffName => "SVN: Patch with Unix line endings and IndexPath has Unix line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody, # Same as input text
indexPath => "MakefileWithUnixEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Windows line endings and IndexPath has Unix line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
indexPath => "MakefileWithUnixEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Windows line endings and IndexPath has Windows line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "MakefileWithWindowsEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Unix line endings and IndexPath has Windows line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
indexPath => "MakefileWithWindowsEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Unix line endings and nonexistent IndexPath",
inputText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody, # Same as input text
indexPath => "NonexistentFile",
isSvn => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Windows line endings and nonexistent IndexPath",
inputText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "NonexistentFile",
isSvn => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
###
# Git test cases
##
{
# New test
diffName => "Git: Patch with Unix line endings and IndexPath has Unix line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody, # Same as input text
indexPath => "MakefileWithUnixEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Windows line endings and IndexPath has Unix line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithUnixEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
indexPath => "MakefileWithUnixEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Windows line endings and IndexPath has Windows line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "MakefileWithWindowsEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Unix line endings and IndexPath has Windows line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
indexPath => "MakefileWithWindowsEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Unix line endings and nonexistent IndexPath",
inputText => substituteString($gitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody, # Same as input text
indexPath => "NonexistentFile",
isGit => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Windows line endings and nonexistent IndexPath",
inputText => substituteString($gitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "NonexistentFile",
isGit => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
);
my $testCasesCount = @testCaseHashRefs;
plan(tests => 2 * $testCasesCount); # Total number of assertions.
my $savedCWD = getcwd();
chdir($mockDir) or die;
foreach my $testCase (@testCaseHashRefs) {
my $testNameStart = "parseDiff(): $testCase->{diffName}: comparing";
my $fileHandle;
open($fileHandle, "<", \$testCase->{inputText});
my $line = <$fileHandle>;
my @got = VCSUtils::parseDiff($fileHandle, $line);
my $expectedReturn = $testCase->{expectedReturn};
is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
my $gotNextLine = <$fileHandle>;
is($gotNextLine, $testCase->{expectedNextLine}, "$testNameStart next read line.");
}
chdir($savedCWD);
sub substituteString
{
my ($string, $searchString, $replacementString) = @_;
$string =~ s/$searchString/$replacementString/g;
return $string;
}
sub writeToFile
{
my ($file, $text) = @_;
open(FILE, ">$file") or die;
print FILE $text;
close(FILE);
}