15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/perl -w
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) Research in Motion Limited 2010. All Rights Reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions are
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# met:
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     * Redistributions of source code must retain the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# notice, this list of conditions and the following disclaimer.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     * Redistributions in binary form must reproduce the above
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in the documentation and/or other materials provided with the
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# distribution.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     * Neither the name of Apple Computer, Inc. ("Apple") nor the names of
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# its contributors may be used to endorse or promote products derived
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# from this software without specific prior written permission.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Unit tests of parseSvnDiffProperties().
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use strict;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use warnings;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use Test::More;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use VCSUtils;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my @testCaseHashRefs = (
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Simple test cases
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: add svn:executable",
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: add svn:mergeinfo",
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: Makefile
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:mergeinfo
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   Merged /trunk/Makefile:r33020
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "Makefile",
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: delete svn:mergeinfo",
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: Makefile
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Deleted: svn:mergeinfo
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   Reverse-merged /trunk/Makefile:r33020
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "Makefile",
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: modified svn:mergeinfo",
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: Makefile
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Modified: svn:mergeinfo
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   Reverse-merged /trunk/Makefile:r33020
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   Merged /trunk/Makefile:r41697
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "Makefile",
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: delete svn:executable",
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Deleted: svn:executable
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   - *
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => -1,
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: delete svn:executable using SVN 1.4 syntax",
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Name: svn:executable
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   - *
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => -1,
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Property value followed by empty line and start of next diff
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "add svn:executable, followed by empty line and start of next diff",
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Index: Makefile.shared
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"\n"],
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => "Index: Makefile.shared\n",
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "add svn:executable, followed by empty line and start of next property diff",
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: Makefile.shared
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"\n"],
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => "Property changes on: Makefile.shared\n",
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Property value followed by empty line and start of the binary contents
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "add svn:executable, followed by empty line and start of binary contents",
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"\n"],
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "custom property followed by svn:executable, empty line and start of binary contents",
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"\n"],
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Successive properties
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "svn:executable followed by custom property",
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "svn:executable followed by custom property using SVN 1.7 syntax",
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)## -0,0 +1 ##
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+*
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)\ No newline at end of property
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)## -0,0 +1 ##
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+This is an example sentence.
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "svn:executable followed by custom property without newline using SVN 1.7 syntax",
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)## -0,0 +1 ##
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+*
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)\ No newline at end of property
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)## -0,0 +1 ##
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)+This is an example sentence.
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)\ No newline at end of property
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "custom property followed by svn:executable",
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Successive properties followed by empty line and start of next diff
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "custom property followed by svn:executable, empty line and start of next property diff",
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: Makefile.shared
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"\n"],
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => "Property changes on: Makefile.shared\n",
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "custom property followed by svn:executable, empty line and start of next index diff",
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Index: Makefile.shared
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => 1,
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"\n"],
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => "Index: Makefile.shared\n",
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Custom properties
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# FIXME: We do not support anything other than the svn:executable property.
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#        We should add support for handling other properties.
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "simple: custom property",
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Name: documentation
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "custom property followed by custom property",
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: copyright
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + Copyright (C) Research in Motion Limited 2010. All Rights Reserved.
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)####
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Malformed property diffs
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)##
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# We shouldn't encounter such diffs in practice.
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # New test
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    diffName => "svn:executable followed by custom property and svn:executable",
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputText => <<'END',
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Property changes on: FileA
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)___________________________________________________________________
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: svn:executable
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + *
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Added: documentation
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   + This is an example sentence.
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Deleted: svn:executable
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   - *
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedReturn => [
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    propertyPath => "FileA",
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executableBitDelta => -1,
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)undef],
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expectedNextLine => undef,
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)},
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles));
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $testCasesCount = @testCaseHashRefs;
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)plan(tests => 2 * $testCasesCount); # Total number of assertions.
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)foreach my $testCase (@testCaseHashRefs) {
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $testNameStart = "parseSvnDiffProperties(): $testCase->{diffName}: comparing";
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $fileHandle;
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    open($fileHandle, "<", \$testCase->{inputText});
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $line = <$fileHandle>;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my @got = VCSUtils::parseSvnDiffProperties($fileHandle, $line);
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $expectedReturn = $testCase->{expectedReturn};
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $gotNextLine = <$fileHandle>;
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
444