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 (at] 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 34 use strict; 35 use warnings; 36 37 use Test::More; 38 use VCSUtils; 39 40 my @testCaseHashRefs = ( 41 { 42 # New test 43 diffName => "singe-line '+' change", 44 inputText => <<'END', 45 + * 46 END 47 expectedReturn => ["*", undef], 48 expectedNextLine => undef, 49 }, 50 { 51 # New test 52 diffName => "single-line '-' change", 53 inputText => <<'END', 54 - * 55 END 56 expectedReturn => ["*", undef], 57 expectedNextLine => undef, 58 }, 59 { 60 # New test 61 diffName => "'Merged' change", 62 inputText => <<'END', 63 Merged /trunk/Makefile:r33020 64 END 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 73 END 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 83 END 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 93 END 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 - * 103 Deleted: svn:executable 104 END 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 113 long sentence that spans 114 multiple lines. 115 116 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA== 117 END 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 126 long sentence that spans 127 multiple lines. 128 129 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA== 130 END 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 140 long sentence that spans 141 multiple lines. 142 + A single-line. 143 END 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 152 long sentence that spans 153 multiple lines. 154 Added: svn:executable 155 END 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 164 long sentence that spans 165 multiple lines. 166 + Another 167 long sentence that spans 168 multiple lines. 169 END 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 179 END 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 189 END 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 199 END 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 210 END 211 expectedReturn => ["/trunk/Makefile:r33020", " Reverse-merged /trunk/Makefile.shared:r58350\n"], 212 expectedNextLine => " Merged /trunk/ChangeLog:r64190\n", 213 }, 214 ); 215 216 my $testCasesCount = @testCaseHashRefs; 217 plan(tests => 2 * $testCasesCount); # Total number of assertions. 218 219 foreach 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