15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/perl -w 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Neither the name of Apple Computer, Inc. ("Apple") nor the names of 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# its contributors may be used to endorse or promote products derived 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# from this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Unit tests of parseDiffHeader(). 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use strict; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use warnings; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use Test::More; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use VCSUtils; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# The unit tests for parseGitDiffHeader() and parseSvnDiffHeader() 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# already thoroughly test parsing each format. 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# For parseDiffHeader(), it should suffice to verify that -- (1) for each 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# format, the method can return non-trivial values back for each key 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# supported by that format (e.g. "sourceRevision" for SVN), (2) the method 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# correctly sets default values when specific key-values are not set 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (e.g. undef for "sourceRevision" for Git), and (3) key-values unique to 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# this method are set correctly (e.g. "scmFormat"). 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my @testCaseHashRefs = ( 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#### 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SVN test cases 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)## 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ # New test 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) diffName => "SVN: non-trivial copiedFromPath and sourceRevision values", 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inputText => <<'END', 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Index: index_path.py 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=================================================================== 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)--- index_path.py (revision 53048) (from copied_from_path.py:53048) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+++ index_path.py (working copy) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)@@ -0,0 +1,7 @@ 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+# Python file... 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) expectedReturn => [ 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) svnConvertedText => <<'END', 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Index: index_path.py 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)=================================================================== 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)--- index_path.py (revision 53048) (from copied_from_path.py:53048) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+++ index_path.py (working copy) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) copiedFromPath => "copied_from_path.py", 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indexPath => "index_path.py", 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isSvn => 1, 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sourceRevision => 53048, 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}, 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"@@ -0,0 +1,7 @@\n"], 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) expectedNextLine => "+# Python file...\n", 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}, 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#### 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Git test cases 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)## 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ # New test case 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) diffName => "Git: Non-zero executable bit", 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inputText => <<'END', 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)diff --git a/foo.exe b/foo.exe 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)old mode 100644 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)new mode 100755 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) expectedReturn => [ 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) svnConvertedText => <<'END', 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Index: foo.exe 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)old mode 100644 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)new mode 100755 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) executableBitDelta => 1, 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) indexPath => "foo.exe", 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isGit => 1, 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}, 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef], 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) expectedNextLine => undef, 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}, 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $testCasesCount = @testCaseHashRefs; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)plan(tests => 2 * $testCasesCount); # Total number of assertions. 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)foreach my $testCase (@testCaseHashRefs) { 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) my $testNameStart = "parseDiffHeader(): $testCase->{diffName}: comparing"; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) my $fileHandle; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) open($fileHandle, "<", \$testCase->{inputText}); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) my $line = <$fileHandle>; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) my @got = VCSUtils::parseDiffHeader($fileHandle, $line); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) my $expectedReturn = $testCase->{expectedReturn}; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_deeply(\@got, $expectedReturn, "$testNameStart return value."); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) my $gotNextLine = <$fileHandle>; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is($gotNextLine, $testCase->{expectedNextLine}, "$testNameStart next read line."); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 122