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