#!/usr/bin/env perl
#
# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Apple Inc. ("Apple") nor the names of
# its contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Unit tests of parseDiffHeader().

use strict;
use warnings;

use Test::More;
use VCSUtils;

# The unit tests for parseGitDiffHeader() and parseSvnDiffHeader()
# already thoroughly test parsing each format.
#
# For parseDiffHeader(), it should suffice to verify that -- (1) for each
# format, the method can return non-trivial values back for each key
# supported by that format (e.g. "sourceRevision" for SVN), (2) the method
# correctly sets default values when specific key-values are not set
# (e.g. undef for "sourceRevision" for Git), and (3) key-values unique to
# this method are set correctly (e.g. "scmFormat").
my @testCaseHashRefs = (
####
#    SVN test cases
##
{   # New test
    diffName => "SVN: non-trivial copiedFromPath and sourceRevision values",
    inputText => <<'END',
Index: index_path.py
===================================================================
--- index_path.py	(revision 53048)	(from copied_from_path.py:53048)
+++ index_path.py	(working copy)
@@ -0,0 +1,7 @@
+# Python file...
END
    expectedReturn => [
{
    svnConvertedText => <<'END',
Index: index_path.py
===================================================================
--- index_path.py	(revision 53048)	(from copied_from_path.py:53048)
+++ index_path.py	(working copy)
END
    copiedFromPath => "copied_from_path.py",
    indexPath => "index_path.py",
    isSvn => 1,
    sourceRevision => 53048,
},
"@@ -0,0 +1,7 @@\n"],
    expectedNextLine => "+# Python file...\n",
},
####
#    Git test cases
##
{   # New test case
    diffName => "Git: Non-zero executable bit",
    inputText => <<'END',
diff --git a/foo.exe b/foo.exe
old mode 100644
new mode 100755
END
    expectedReturn => [
{
    svnConvertedText => <<'END',
Index: foo.exe
old mode 100644
new mode 100755
END
    executableBitDelta => 1,
    indexPath => "foo.exe",
    isGit => 1,
},
undef],
    expectedNextLine => undef,
},
####
#    Unified patch cases
##
{
    diffName => "Unified: Modified file",
    inputText => <<'END',
--- Foo/bar.h
+++ Foo/bar.h
END
    expectedReturn => [
{
    svnConvertedText => <<'END',
Index: Foo/bar.h
index 0000000..0000000
--- Foo/bar.h
+++ Foo/bar.h
END
    indexPath => 'Foo/bar.h',
    isUnified => 1,
},
undef],
    expectedNextLine => undef,
}
);

my $testCasesCount = @testCaseHashRefs;
plan(tests => 2 * $testCasesCount); # Total number of assertions.

foreach my $testCase (@testCaseHashRefs) {
    my $testNameStart = "parseDiffHeader(): $testCase->{diffName}: comparing";

    my $fileHandle;
    open($fileHandle, "<", \$testCase->{inputText});
    my $line = <$fileHandle>;

    my @got = VCSUtils::parseDiffHeader($fileHandle, $line);
    my $expectedReturn = $testCase->{expectedReturn};

    is_deeply(\@got, $expectedReturn, "$testNameStart return value.");

    my $gotNextLine = <$fileHandle>;
    is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
}
