1#!/usr/bin/perl -w 2# 3# Copyright (C) Research in Motion Limited 2010. All Rights Reserved. 4# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com) 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are 8# met: 9# 10# * Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# * Redistributions in binary form must reproduce the above 13# copyright notice, this list of conditions and the following disclaimer 14# in the documentation and/or other materials provided with the 15# distribution. 16# * Neither the name of Apple Computer, Inc. ("Apple") nor the names of 17# its contributors may be used to endorse or promote products derived 18# from this software without specific prior written permission. 19# 20# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 32# Unit tests of parseSvnPropertyValue(). 33 34use strict; 35use warnings; 36 37use Test::More; 38use VCSUtils; 39 40my @testCaseHashRefs = ( 41{ 42 # New test 43 diffName => "singe-line '+' change", 44 inputText => <<'END', 45 + * 46END 47 expectedReturn => ["*", undef], 48 expectedNextLine => undef, 49}, 50{ 51 # New test 52 diffName => "single-line '-' change", 53 inputText => <<'END', 54 - * 55END 56 expectedReturn => ["*", undef], 57 expectedNextLine => undef, 58}, 59{ 60 # New test 61 diffName => "'Merged' change", 62 inputText => <<'END', 63 Merged /trunk/Makefile:r33020 64END 65 expectedReturn => ["/trunk/Makefile:r33020", undef], 66 expectedNextLine => undef, 67}, 68{ 69 # New test 70 diffName => "'Reverse-merged' change", 71 inputText => <<'END', 72 Reverse-merged /trunk/Makefile:r33020 73END 74 expectedReturn => ["/trunk/Makefile:r33020", undef], 75 expectedNextLine => undef, 76}, 77{ 78 # New test 79 diffName => "single-line '-' change followed by empty line with Unix line endings", 80 inputText => <<'END', 81 - * 82 83END 84 expectedReturn => ["*", "\n"], 85 expectedNextLine => undef, 86}, 87{ 88 # New test 89 diffName => "single-line '-' change followed by empty line with Windows line endings", 90 inputText => toWindowsLineEndings(<<'END', 91 - * 92 93END 94), 95 expectedReturn => ["*", "\r\n"], 96 expectedNextLine => undef, 97}, 98{ 99 # New test 100 diffName => "single-line '-' change followed by the next property", 101 inputText => <<'END', 102 - * 103Deleted: svn:executable 104END 105 expectedReturn => ["*", "Deleted: svn:executable\n"], 106 expectedNextLine => undef, 107}, 108{ 109 # New test 110 diffName => "multi-line '+' change and start of binary patch", 111 inputText => <<'END', 112 + A 113long sentence that spans 114multiple lines. 115 116Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA== 117END 118 expectedReturn => ["A\nlong sentence that spans\nmultiple lines.", "\n"], 119 expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n", 120}, 121{ 122 # New test 123 diffName => "multi-line '+' change and start of binary patch with Windows line endings", 124 inputText => toWindowsLineEndings(<<'END', 125 + A 126long sentence that spans 127multiple lines. 128 129Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA== 130END 131), 132 expectedReturn => ["A\r\nlong sentence that spans\r\nmultiple lines.", "\r\n"], 133 expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n", 134}, 135{ 136 # New test 137 diffName => "multi-line '-' change followed by '+' single-line change", 138 inputText => <<'END', 139 - A 140long sentence that spans 141multiple lines. 142 + A single-line. 143END 144 expectedReturn => ["A\nlong sentence that spans\nmultiple lines.", " + A single-line.\n"], 145 expectedNextLine => undef, 146}, 147{ 148 # New test 149 diffName => "multi-line '-' change followed by the next property", 150 inputText => <<'END', 151 - A 152long sentence that spans 153multiple lines. 154Added: svn:executable 155END 156 expectedReturn => ["A\nlong sentence that spans\nmultiple lines.", "Added: svn:executable\n"], 157 expectedNextLine => undef, 158}, 159{ 160 # New test 161 diffName => "multi-line '-' change followed by '+' multi-line change", 162 inputText => <<'END', 163 - A 164long sentence that spans 165multiple lines. 166 + Another 167long sentence that spans 168multiple lines. 169END 170 expectedReturn => ["A\nlong sentence that spans\nmultiple lines.", " + Another\n"], 171 expectedNextLine => "long sentence that spans\n", 172}, 173{ 174 # New test 175 diffName => "'Reverse-merged' change followed by 'Merge' change", 176 inputText => <<'END', 177 Reverse-merged /trunk/Makefile:r33020 178 Merged /trunk/Makefile:r41697 179END 180 expectedReturn => ["/trunk/Makefile:r33020", " Merged /trunk/Makefile:r41697\n"], 181 expectedNextLine => undef, 182}, 183{ 184 # New test 185 diffName => "'Merged' change followed by 'Merge' change", 186 inputText => <<'END', 187 Merged /trunk/Makefile:r33020 188 Merged /trunk/Makefile.shared:r58350 189END 190 expectedReturn => ["/trunk/Makefile:r33020", " Merged /trunk/Makefile.shared:r58350\n"], 191 expectedNextLine => undef, 192}, 193{ 194 # New test 195 diffName => "'Reverse-merged' change followed by 'Reverse-merged' change", 196 inputText => <<'END', 197 Reverse-merged /trunk/Makefile:r33020 198 Reverse-merged /trunk/Makefile.shared:r58350 199END 200 expectedReturn => ["/trunk/Makefile:r33020", " Reverse-merged /trunk/Makefile.shared:r58350\n"], 201 expectedNextLine => undef, 202}, 203{ 204 # New test 205 diffName => "'Reverse-merged' change followed by 'Reverse-merged' change followed by 'Merged' change", 206 inputText => <<'END', 207 Reverse-merged /trunk/Makefile:r33020 208 Reverse-merged /trunk/Makefile.shared:r58350 209 Merged /trunk/ChangeLog:r64190 210END 211 expectedReturn => ["/trunk/Makefile:r33020", " Reverse-merged /trunk/Makefile.shared:r58350\n"], 212 expectedNextLine => " Merged /trunk/ChangeLog:r64190\n", 213}, 214); 215 216my $testCasesCount = @testCaseHashRefs; 217plan(tests => 2 * $testCasesCount); # Total number of assertions. 218 219foreach my $testCase (@testCaseHashRefs) { 220 my $testNameStart = "parseSvnPropertyValue(): $testCase->{diffName}: comparing"; 221 222 my $fileHandle; 223 open($fileHandle, "<", \$testCase->{inputText}); 224 my $line = <$fileHandle>; 225 226 my @got = VCSUtils::parseSvnPropertyValue($fileHandle, $line); 227 my $expectedReturn = $testCase->{expectedReturn}; 228 229 is_deeply(\@got, $expectedReturn, "$testNameStart return value."); 230 231 my $gotNextLine = <$fileHandle>; 232 is($gotNextLine, $testCase->{expectedNextLine}, "$testNameStart next read line."); 233} 234