svn-apply failed to apply a patch (deleting file with svn property)
[WebKit.git] / Tools / Scripts / webkitperl / VCSUtils_unittest / parseSvnProperty.pl
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 # Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are
9 # met:
10 #
11 #     * Redistributions of source code must retain the above copyright
12 # notice, this list of conditions and the following disclaimer.
13 #     * Redistributions in binary form must reproduce the above
14 # copyright notice, this list of conditions and the following disclaimer
15 # in the documentation and/or other materials provided with the
16 # distribution.
17 #     * Neither the name of Apple Inc. ("Apple") nor the names of
18 # its contributors may be used to endorse or promote products derived
19 # from this software without specific prior written permission.
20 #
21 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 # Unit tests of parseSvnProperty().
34
35 use strict;
36 use warnings;
37
38 use Test::More;
39 use VCSUtils;
40
41 my @testCaseHashRefs = (
42 ####
43 # Simple test cases
44 ##
45 {
46     # New test
47     diffName => "simple: add svn:executable",
48     inputText => <<'END',
49 Added: svn:executable
50    + *
51 END
52     expectedReturn => [
53 {
54     name => "svn:executable",
55     propertyChangeDelta => 1,
56     value => "*",
57 },
58 undef],
59     expectedNextLine => undef,
60 },
61 {
62     # New test
63     diffName => "simple: delete svn:executable",
64     inputText => <<'END',
65 Deleted: svn:executable
66    - *
67 END
68     expectedReturn => [
69 {
70     name => "svn:executable",
71     propertyChangeDelta => -1,
72     value => "*",
73 },
74 undef],
75     expectedNextLine => undef,
76 },
77 {
78     # New test
79     diffName => "simple: add svn:mergeinfo",
80     inputText => <<'END',
81 Added: svn:mergeinfo
82    Merged /trunk/Makefile:r33020
83 END
84     expectedReturn => [
85 {
86     name => "svn:mergeinfo",
87     propertyChangeDelta => 1,
88     value => "/trunk/Makefile:r33020",
89 },
90 undef],
91     expectedNextLine => undef,
92 },
93 {
94     # New test
95     diffName => "simple: delete svn:mergeinfo",
96     inputText => <<'END',
97 Deleted: svn:mergeinfo
98    Reverse-merged /trunk/Makefile:r33020
99 END
100     expectedReturn => [
101 {
102     name => "svn:mergeinfo",
103     propertyChangeDelta => -1,
104     value => "/trunk/Makefile:r33020",
105 },
106 undef],
107     expectedNextLine => undef,
108 },
109 {
110     # New test
111     diffName => "simple: modified svn:mergeinfo",
112     inputText => <<'END',
113 Modified: svn:mergeinfo
114    Reverse-merged /trunk/Makefile:r33020
115    Merged /trunk/Makefile:r41697
116 END
117     expectedReturn => [
118 {
119     name => "svn:mergeinfo",
120     propertyChangeDelta => 1,
121     value => "/trunk/Makefile:r41697",
122 },
123 undef],
124     expectedNextLine => undef,
125 },
126 ####
127 # Using SVN 1.4 syntax
128 ##
129 {
130     # New test
131     diffName => "simple: modified svn:mergeinfo using SVN 1.4 syntax",
132     inputText => <<'END',
133 Name: svn:mergeinfo
134    Reverse-merged /trunk/Makefile:r33020
135    Merged /trunk/Makefile:r41697
136 END
137     expectedReturn => [
138 {
139     name => "svn:mergeinfo",
140     propertyChangeDelta => 1,
141     value => "/trunk/Makefile:r41697",
142 },
143 undef],
144     expectedNextLine => undef,
145 },
146 {
147     # New test
148     diffName => "simple: delete svn:executable using SVN 1.4 syntax",
149     inputText => <<'END',
150 Name: svn:executable
151    - *
152 END
153     expectedReturn => [
154 {
155     name => "svn:executable",
156     propertyChangeDelta => -1,
157     value => "*",
158 },
159 undef],
160     expectedNextLine => undef,
161 },
162 {
163     # New test
164     diffName => "simple: add svn:executable using SVN 1.4 syntax",
165     inputText => <<'END',
166 Name: svn:executable
167    + *
168 END
169     expectedReturn => [
170 {
171     name => "svn:executable",
172     propertyChangeDelta => 1,
173     value => "*",
174 },
175 undef],
176     expectedNextLine => undef,
177 },
178 ####
179 # Using SVN 1.7 syntax
180 ##
181 {
182     # New test
183     diffName => "simple: add svn:executable using SVN 1.7 syntax",
184     inputText => <<'END',
185 Added: svn:executable
186 ## -0,0 +1 ##
187 +*
188 \ No newline at end of property
189 END
190     expectedReturn => [
191 {
192     name => "svn:executable",
193     propertyChangeDelta => 1,
194     value => "*",
195 },
196 undef],
197     expectedNextLine => undef,
198 },
199 {
200     # New test
201     diffName => "simple: delete svn:executable using SVN 1.7 syntax",
202     inputText => <<'END',
203 Deleted: svn:executable
204 ## -1 +0,0 ##
205 -*
206 \ No newline at end of property
207 END
208     expectedReturn => [
209 {
210     name => "svn:executable",
211     propertyChangeDelta => -1,
212     value => "*",
213 },
214 undef],
215     expectedNextLine => undef,
216 },
217 {
218     # New test
219     diffName => "add svn:mime-type and add svn:executable using SVN 1.7 syntax",
220     inputText => <<'END',
221 Added: svn:mime-type
222 ## -0,0 +1 ##
223 +image/png
224 \ No newline at end of property
225 Added: svn:executable
226 ## -0,0 +1 ##
227 +*
228 \ No newline at end of property
229 END
230     expectedReturn => [
231 {
232     name => "svn:mime-type",
233     propertyChangeDelta => 1,
234     value => "image/png",
235 },
236 "Added: svn:executable\n"],
237     expectedNextLine => "## -0,0 +1 ##\n",
238 },
239 ###
240 # Property value using SVN 1.7 syntax followed by start of next diff
241 ##
242 {
243     # New test
244     diffName => "add svn:ignore using SVN 1.7 syntax, followed by start of next diff",
245     inputText => <<'END',
246 Added: svn:ignore
247 ## -0,0 +1 ##
248 +*
249 Index: Makefile.shared
250 END
251     expectedReturn => [
252 {
253     name => "svn:ignore",
254     propertyChangeDelta => 1,
255     value => "*",
256 },
257 "Index: Makefile.shared\n"],
258     expectedNextLine => undef,
259 },
260 {
261     # New test
262     diffName => "remove svn:ignore using SVN 1.7 syntax, followed by start of next diff",
263     inputText => <<'END',
264 Deleted: svn:ignore
265 ## -1 +0,0 ##
266 -*
267 Index: Makefile.shared
268 END
269     expectedReturn => [
270 {
271     name => "svn:ignore",
272     propertyChangeDelta => -1,
273     value => "*",
274 },
275 "Index: Makefile.shared\n"],
276     expectedNextLine => undef,
277 },
278 ####
279 # Property value followed by empty line and start of next diff
280 ##
281 {
282     # New test
283     diffName => "add svn:executable, followed by empty line and start of next diff",
284     inputText => <<'END',
285 Added: svn:executable
286    + *
287
288 Index: Makefile.shared
289 END
290     expectedReturn => [
291 {
292     name => "svn:executable",
293     propertyChangeDelta => 1,
294     value => "*",
295 },
296 "\n"],
297     expectedNextLine => "Index: Makefile.shared\n",
298 },
299 {
300     # New test
301     diffName => "add svn:executable, followed by empty line and start of next diff using Windows line endings",
302     inputText => toWindowsLineEndings(<<'END',
303 Added: svn:executable
304    + *
305
306 Index: Makefile.shared
307 END
308 ),
309     expectedReturn => [
310 {
311     name => "svn:executable",
312     propertyChangeDelta => 1,
313     value => "*",
314 },
315 "\r\n"],
316     expectedNextLine => "Index: Makefile.shared\r\n",
317 },
318 {
319     # New test
320     diffName => "add svn:executable, followed by empty line and start of next property diff",
321     inputText => <<'END',
322 Added: svn:executable
323    + *
324
325 Property changes on: Makefile.shared
326 END
327     expectedReturn => [
328 {
329     name => "svn:executable",
330     propertyChangeDelta => 1,
331     value => "*",
332 },
333 "\n"],
334     expectedNextLine => "Property changes on: Makefile.shared\n",
335 },
336 {
337     # New test
338     diffName => "add svn:executable, followed by empty line and start of next property diff using Windows line endings",
339     inputText => toWindowsLineEndings(<<'END',
340 Added: svn:executable
341    + *
342
343 Property changes on: Makefile.shared
344 END
345 ),
346     expectedReturn => [
347 {
348     name => "svn:executable",
349     propertyChangeDelta => 1,
350     value => "*",
351 },
352 "\r\n"],
353     expectedNextLine => "Property changes on: Makefile.shared\r\n",
354 },
355 {
356     # New test
357     diffName => "multi-line '+' change, followed by empty line and start of next diff",
358     inputText => <<'END',
359 Name: documentation
360    + A
361 long sentence that spans
362 multiple lines.
363
364 Index: Makefile.shared
365 END
366     expectedReturn => [
367 {
368     name => "documentation",
369     propertyChangeDelta => 1,
370     value => "A\nlong sentence that spans\nmultiple lines.",
371 },
372 "\n"],
373     expectedNextLine => "Index: Makefile.shared\n",
374 },
375 {
376     # New test
377     diffName => "multi-line '+' change, followed by empty line and start of next diff using Windows line endings",
378     inputText => toWindowsLineEndings(<<'END',
379 Name: documentation
380    + A
381 long sentence that spans
382 multiple lines.
383
384 Index: Makefile.shared
385 END
386 ),
387     expectedReturn => [
388 {
389     name => "documentation",
390     propertyChangeDelta => 1,
391     value => "A\r\nlong sentence that spans\r\nmultiple lines.",
392 },
393 "\r\n"],
394     expectedNextLine => "Index: Makefile.shared\r\n",
395 },
396 {
397     # New test
398     diffName => "multi-line '+' change, followed by empty line and start of next property diff",
399     inputText => <<'END',
400 Name: documentation
401    + A
402 long sentence that spans
403 multiple lines.
404
405 Property changes on: Makefile.shared
406 END
407     expectedReturn => [
408 {
409     name => "documentation",
410     propertyChangeDelta => 1,
411     value => "A\nlong sentence that spans\nmultiple lines.",
412 },
413 "\n"],
414     expectedNextLine => "Property changes on: Makefile.shared\n",
415 },
416 {
417     # New test
418     diffName => "multi-line '+' change, followed by empty line and start of next property diff using Windows line endings",
419     inputText => toWindowsLineEndings(<<'END',
420 Name: documentation
421    + A
422 long sentence that spans
423 multiple lines.
424
425 Property changes on: Makefile.shared
426 END
427 ),
428     expectedReturn => [
429 {
430     name => "documentation",
431     propertyChangeDelta => 1,
432     value => "A\r\nlong sentence that spans\r\nmultiple lines.",
433 },
434 "\r\n"],
435     expectedNextLine => "Property changes on: Makefile.shared\r\n",
436 },
437 ####
438 # Property value followed by empty line and start of binary patch
439 ##
440 {
441     # New test
442     diffName => "add svn:executable, followed by empty line and start of binary patch",
443     inputText => <<'END',
444 Added: svn:executable
445    + *
446
447 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
448 END
449     expectedReturn => [
450 {
451     name => "svn:executable",
452     propertyChangeDelta => 1,
453     value => "*",
454 },
455 "\n"],
456     expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
457 },
458 {
459     # New test
460     diffName => "add svn:executable, followed by empty line and start of binary patch using Windows line endings",
461     inputText => toWindowsLineEndings(<<'END',
462 Added: svn:executable
463    + *
464
465 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
466 END
467 ),
468     expectedReturn => [
469 {
470     name => "svn:executable",
471     propertyChangeDelta => 1,
472     value => "*",
473 },
474 "\r\n"],
475     expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n",
476 },
477 {
478     # New test
479     diffName => "multi-line '+' change, followed by empty line and start of binary patch",
480     inputText => <<'END',
481 Name: documentation
482    + A
483 long sentence that spans
484 multiple lines.
485
486 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
487 END
488     expectedReturn => [
489 {
490     name => "documentation",
491     propertyChangeDelta => 1,
492     value => "A\nlong sentence that spans\nmultiple lines.",
493 },
494 "\n"],
495     expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
496 },
497 {
498     # New test
499     diffName => "multi-line '+' change, followed by empty line and start of binary patch using Windows line endings",
500     inputText => toWindowsLineEndings(<<'END',
501 Name: documentation
502    + A
503 long sentence that spans
504 multiple lines.
505
506 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
507 END
508 ),
509     expectedReturn => [
510 {
511     name => "documentation",
512     propertyChangeDelta => 1,
513     value => "A\r\nlong sentence that spans\r\nmultiple lines.",
514 },
515 "\r\n"],
516     expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n",
517 },
518 {
519     # New test
520     diffName => "multi-line '-' change, followed by multi-line '+' change, empty line, and start of binary patch",
521     inputText => <<'END',
522 Modified: documentation
523    - A
524 long sentence that spans
525 multiple lines.
526    + Another
527 long sentence that spans
528 multiple lines.
529
530 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
531 END
532     expectedReturn => [
533 {
534     name => "documentation",
535     propertyChangeDelta => 1,
536     value => "Another\nlong sentence that spans\nmultiple lines.",
537 },
538 "\n"],
539     expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
540 },
541 {
542     # New test
543     diffName => "multi-line '-' change, followed by multi-line '+' change, empty line, and start of binary patch using Windows line endings",
544     inputText => toWindowsLineEndings(<<'END',
545 Modified: documentation
546    - A
547 long sentence that spans
548 multiple lines.
549    + Another
550 long sentence that spans
551 multiple lines.
552
553 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
554 END
555 ),
556     expectedReturn => [
557 {
558     name => "documentation",
559     propertyChangeDelta => 1,
560     value => "Another\r\nlong sentence that spans\r\nmultiple lines.",
561 },
562 "\r\n"],
563     expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n",
564 },
565 ####
566 # Successive properties
567 ##
568 {
569     # New test
570     diffName => "single-line '+' change followed by custom property with single-line '+' change",
571     inputText => <<'END',
572 Added: svn:executable
573    + *
574 Added: documentation
575    + A sentence.
576 END
577     expectedReturn => [
578 {
579     name => "svn:executable",
580     propertyChangeDelta => 1,
581     value => "*",
582 },
583 "Added: documentation\n"],
584     expectedNextLine => "   + A sentence.\n",
585 },
586 {
587     # New test
588     diffName => "multi-line '+' change, followed by svn:executable",
589     inputText => <<'END',
590 Name: documentation
591    + A
592 long sentence that spans
593 multiple lines.
594 Name: svn:executable
595    + *
596 END
597     expectedReturn => [
598 {
599     name => "documentation",
600     propertyChangeDelta => 1,
601     value => "A\nlong sentence that spans\nmultiple lines.",
602 },
603 "Name: svn:executable\n"],
604     expectedNextLine => "   + *\n",
605 },
606 {
607     # New test
608     diffName => "multi-line '-' change, followed by multi-line '+' change and add svn:executable",
609     inputText => <<'END',
610 Modified: documentation
611    - A
612 long sentence that spans
613 multiple lines.
614    + Another
615 long sentence that spans
616 multiple lines.
617 Added: svn:executable
618    + *
619 END
620     expectedReturn => [
621 {
622     name => "documentation",
623     propertyChangeDelta => 1,
624     value => "Another\nlong sentence that spans\nmultiple lines.",
625 },
626 "Added: svn:executable\n"],
627     expectedNextLine => "   + *\n",
628 },
629 {
630     # New test
631     diffName => "'Merged' change followed by 'Merged' change",
632     inputText => <<'END',
633 Added: svn:mergeinfo
634    Merged /trunk/Makefile:r33020
635    Merged /trunk/Makefile.shared:r58350
636 END
637     expectedReturn => [
638 {
639     name => "svn:mergeinfo",
640     propertyChangeDelta => 1,
641     value => "/trunk/Makefile.shared:r58350",
642 },
643 undef],
644     expectedNextLine => undef,
645 },
646 {
647     # New test
648     diffName => "'Reverse-merged' change followed by 'Reverse-merged' change",
649     inputText => <<'END',
650 Deleted: svn:mergeinfo
651    Reverse-merged /trunk/Makefile:r33020
652    Reverse-merged /trunk/Makefile.shared:r58350
653 END
654     expectedReturn => [
655 {
656     name => "svn:mergeinfo",
657     propertyChangeDelta => -1,
658     value => "/trunk/Makefile.shared:r58350",
659 },
660 undef],
661     expectedNextLine => undef,
662 },
663 ####
664 # Property values with trailing new lines.
665 ##
666 # FIXME: We do not support property values with trailing new lines, since it is difficult to
667 #        disambiguate them from the empty line that preceeds the contents of a binary patch as
668 #        in the test case (above): "multi-line '+' change, followed by empty line and start of binary patch".
669 {
670     # New test
671     diffName => "single-line '+' with trailing new line",
672     inputText => <<'END',
673 Added: documentation
674    + A sentence.
675
676 END
677     expectedReturn => [
678 {
679     name => "documentation",
680     propertyChangeDelta => 1,
681     value => "A sentence.",
682 },
683 "\n"],
684     expectedNextLine => undef,
685 },
686 {
687     # New test
688     diffName => "single-line '+' with trailing new line using Windows line endings",
689     inputText => toWindowsLineEndings(<<'END',
690 Added: documentation
691    + A sentence.
692
693 END
694 ),
695     expectedReturn => [
696 {
697     name => "documentation",
698     propertyChangeDelta => 1,
699     value => "A sentence.",
700 },
701 "\r\n"],
702     expectedNextLine => undef,
703 },
704 {
705     # New test
706     diffName => "single-line '+' with trailing new line, followed by empty line and start of binary patch",
707     inputText => <<'END',
708 Added: documentation
709    + A sentence.
710
711
712 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
713 END
714     expectedReturn => [
715 {
716     name => "documentation",
717     propertyChangeDelta => 1,
718     value => "A sentence.",
719 },
720 "\n"],
721     expectedNextLine => "\n",
722 },
723 {
724     # New test
725     diffName => "single-line '+' with trailing new line, followed by empty line and start of binary patch using Windows line endings",
726     inputText => toWindowsLineEndings(<<'END',
727 Added: documentation
728    + A sentence.
729
730
731 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
732 END
733 ),
734     expectedReturn => [
735 {
736     name => "documentation",
737     propertyChangeDelta => 1,
738     value => "A sentence.",
739 },
740 "\r\n"],
741     expectedNextLine => "\r\n",
742 },
743 {
744     # New test
745     diffName => "single-line '-' change with trailing new line, and single-line '+' change",
746     inputText => <<'END',
747 Modified: documentation
748    - A long sentence.
749
750    + A sentence.
751 END
752     expectedReturn => [
753 {
754     name => "documentation",
755     propertyChangeDelta => -1, # Since we only interpret the '-' property.
756     value => "A long sentence.",
757 },
758 "\n"],
759     expectedNextLine => "   + A sentence.\n",
760 },
761 {
762     # New test
763     diffName => "single-line '-' change with trailing new line, and single-line '+' change using Windows line endings",
764     inputText => toWindowsLineEndings(<<'END',
765 Modified: documentation
766    - A long sentence.
767
768    + A sentence.
769 END
770 ),
771     expectedReturn => [
772 {
773     name => "documentation",
774     propertyChangeDelta => -1, # Since we only interpret the '-' property.
775     value => "A long sentence.",
776 },
777 "\r\n"],
778     expectedNextLine => "   + A sentence.\r\n",
779 },
780 {
781     # New test
782     diffName => "multi-line '-' change with trailing new line, and multi-line '+' change",
783     inputText => <<'END',
784 Modified: documentation
785    - A
786 long sentence that spans
787 multiple lines.
788
789    + Another
790 long sentence that spans
791 multiple lines.
792 END
793     expectedReturn => [
794 {
795     name => "documentation",
796     propertyChangeDelta => -1, # Since we only interpret the '-' property.
797     value => "A\nlong sentence that spans\nmultiple lines.",
798 },
799 "\n"],
800     expectedNextLine => "   + Another\n",
801 },
802 {
803     # New test
804     diffName => "multi-line '-' change with trailing new line, and multi-line '+' change using Windows line endings",
805     inputText => toWindowsLineEndings(<<'END',
806 Modified: documentation
807    - A
808 long sentence that spans
809 multiple lines.
810
811    + Another
812 long sentence that spans
813 multiple lines.
814 END
815 ),
816     expectedReturn => [
817 {
818     name => "documentation",
819     propertyChangeDelta => -1, # Since we only interpret the '-' property.
820     value => "A\r\nlong sentence that spans\r\nmultiple lines.",
821 },
822 "\r\n"],
823     expectedNextLine => "   + Another\r\n",
824 },
825 );
826
827 my $testCasesCount = @testCaseHashRefs;
828 plan(tests => 2 * $testCasesCount); # Total number of assertions.
829
830 foreach my $testCase (@testCaseHashRefs) {
831     my $testNameStart = "parseSvnProperty(): $testCase->{diffName}: comparing";
832
833     my $fileHandle;
834     open($fileHandle, "<", \$testCase->{inputText});
835     my $line = <$fileHandle>;
836
837     my @got = VCSUtils::parseSvnProperty($fileHandle, $line);
838     my $expectedReturn = $testCase->{expectedReturn};
839
840     is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
841
842     my $gotNextLine = <$fileHandle>;
843     is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
844 }