#!/usr/bin/env perl # Copyright (C) 2018 Apple Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 for parseDiffStartLine(), parseGitDiffStartLine(), parseSvnDiffStartLine(). use strict; use warnings; use constant { CR => "\r", CRLF => "\r\n", LF => "\n", }; use Test::More; use VCSUtils; my @testCases = ( { testName => "Git diff start line", input => "diff --git a/Source/Makefile.shared b/Source/Makefile.shared", expected => "Source/Makefile.shared", isGitDiffStartLine => 1, isValid => 1, }, { testName => "Git diff start line with --no-prefix", input => "diff --git Source/Makefile.shared Source/Makefile.shared", expected => "Source/Makefile.shared", isGitDiffStartLine => 1, isValid => 1, }, { testName => "Git diff start line with space in path", input => "diff --git a/LayoutTests/http/tests/misc/resources/a success.html b/LayoutTests/http/tests/misc/resources/a success.html", expected => "LayoutTests/http/tests/misc/resources/a success.html", isGitDiffStartLine => 1, isValid => 1, }, { testName => "Invalid Git diff start line", input => "===================================================================", expected => undef, isGitDiffStartLine => 1, isValid => 0, }, { testName => "Svn diff start line", input => "Index: Source/Makefile.shared", expected => "Source/Makefile.shared", isSvnDiffStartLine => 1, isValid => 1, }, { testName => "Svn diff start line with space in path", input => "Index: LayoutTests/http/tests/misc/resources/a success.html", expected => "LayoutTests/http/tests/misc/resources/a success.html", isSvnDiffStartLine => 1, isValid => 1, }, { testName => "Invalid Svn diff start line", input => "===================================================================", expected => undef, isSvnDiffStartLine => 1, isValid => 0, }, ); my $testCaseCount = scalar @testCases; plan(tests => 9 * $testCaseCount); foreach my $testCase (@testCases) { # Make sure future modifications or new test cases are valid. ok(exists $testCase->{expected}, "'expected' key exists: $testCase->{testName}"); ok(exists $testCase->{input}, "'input' key exists: $testCase->{testName}"); ok(exists $testCase->{isGitDiffStartLine} ^ exists $testCase->{isSvnDiffStartLine}, "Exactly one of 'isGitDiffStartLine' key or 'isSvnDiffStartLine' key exists: $testCase->{testName}"); ok(exists $testCase->{isValid}, "'isValid' key exists: $testCase->{testName}"); ok(exists $testCase->{testName}, "'testName' key exists"); my $testCaseName = "parseDiffStartLine(): $testCase->{testName}"; my $got = VCSUtils::parseDiffStartLine($testCase->{input}); is($got, $testCase->{expected}, $testCaseName); if ($testCase->{isGitDiffStartLine}) { SKIP: { skip "parseGitDiffStartLine() does not handle invalid input", 3 if !$testCase->{isValid}; $testCaseName = "parseGitDiffStartLine(): CR line ending: $testCase->{testName}"; my $input = $testCase->{input} . CR; $got = VCSUtils::parseGitDiffStartLine($input); is($got, $testCase->{expected}, $testCaseName); $testCaseName = "parseGitDiffStartLine(): CRLF line ending: $testCase->{testName}"; $input = $testCase->{input} . CRLF; $got = VCSUtils::parseGitDiffStartLine($input); is($got, $testCase->{expected}, $testCaseName); $testCaseName = "parseGitDiffStartLine(): LF line ending: $testCase->{testName}"; $input = $testCase->{input} . LF; $got = VCSUtils::parseGitDiffStartLine($input); is($got, $testCase->{expected}, $testCaseName); } } elsif ($testCase->{isSvnDiffStartLine}) { $testCaseName = "parseSvnDiffStartLine(): CR line ending: $testCase->{testName}"; my $input = $testCase->{input} . CR; $got = VCSUtils::parseSvnDiffStartLine($input); is($got, $testCase->{expected}, $testCaseName); $testCaseName = "parseSvnDiffStartLine(): CRLF line ending: $testCase->{testName}"; $input = $testCase->{input} . CRLF; $got = VCSUtils::parseSvnDiffStartLine($input); is($got, $testCase->{expected}, $testCaseName); $testCaseName = "parseSvnDiffStartLine(): LF line ending: $testCase->{testName}"; $input = $testCase->{input} . LF; $got = VCSUtils::parseSvnDiffStartLine($input); is($got, $testCase->{expected}, $testCaseName); } else { fail("CR line ending: isGitDiffStartLine or isSvnDiffStartLine is not set for $testCase->{testName}"); fail("CFLF line ending: isGitDiffStartLine or isSvnDiffStartLine is not set for $testCase->{testName}"); fail("FL line ending: isGitDiffStartLine or isSvnDiffStartLine is not set for $testCase->{testName}"); } }