16c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#!/usr/bin/perl -w
26c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#
36c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Copyright (C) Research in Motion Limited 2010. All Rights Reserved.
46c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
56c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#
66c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Redistribution and use in source and binary forms, with or without
76c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# modification, are permitted provided that the following conditions are
86c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# met:
96c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#
106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#     * Redistributions of source code must retain the above copyright
116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# notice, this list of conditions and the following disclaimer.
126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#     * Redistributions in binary form must reproduce the above
136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# copyright notice, this list of conditions and the following disclaimer
146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# in the documentation and/or other materials provided with the
156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# distribution.
166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#     * Neither the name of Apple Computer, Inc. ("Apple") nor the names of
176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# its contributors may be used to endorse or promote products derived
186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# from this software without specific prior written permission.
196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#
206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Unit tests of parseSvnProperty().
336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenuse strict;
356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenuse warnings;
366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenuse Test::More;
386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenuse VCSUtils;
396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmy @testCaseHashRefs = (
416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen####
426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Simple test cases
436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen##
446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "simple: add svn:executable",
476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: svn:executable
496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenundef],
586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => undef,
596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "simple: delete svn:executable",
636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenDeleted: svn:executable
656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   - *
666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => -1,
716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenundef],
746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => undef,
756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    # New test
785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    diffName => "simple: add svn:mergeinfo",
795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    inputText => <<'END',
805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickAdded: svn:mergeinfo
815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Merged /trunk/Makefile:r33020
825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickEND
835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedReturn => [
845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    name => "svn:mergeinfo",
865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    propertyChangeDelta => 1,
875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value => "/trunk/Makefile:r33020",
885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickundef],
905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedNextLine => undef,
915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    # New test
945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    diffName => "simple: delete svn:mergeinfo",
955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    inputText => <<'END',
965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDeleted: svn:mergeinfo
975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Reverse-merged /trunk/Makefile:r33020
985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickEND
995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedReturn => [
1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    name => "svn:mergeinfo",
1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    propertyChangeDelta => -1,
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value => "/trunk/Makefile:r33020",
1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickundef],
1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedNextLine => undef,
1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    # New test
1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    diffName => "simple: modified svn:mergeinfo",
1115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    inputText => <<'END',
1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickModified: svn:mergeinfo
1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Reverse-merged /trunk/Makefile:r33020
1145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Merged /trunk/Makefile:r41697
1155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickEND
1165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedReturn => [
1175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    name => "svn:mergeinfo",
1195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    propertyChangeDelta => 1,
1205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value => "/trunk/Makefile:r41697",
1215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
1225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickundef],
1235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedNextLine => undef,
1245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
1256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen####
1266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Using SVN 1.4 syntax
1276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen##
1286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
1305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    diffName => "simple: modified svn:mergeinfo using SVN 1.4 syntax",
1315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    inputText => <<'END',
1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickName: svn:mergeinfo
1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Reverse-merged /trunk/Makefile:r33020
1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Merged /trunk/Makefile:r41697
1355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickEND
1365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedReturn => [
1375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    name => "svn:mergeinfo",
1395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    propertyChangeDelta => 1,
1405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value => "/trunk/Makefile:r41697",
1415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
1425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickundef],
1435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedNextLine => undef,
1445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    # New test
1476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "simple: delete svn:executable using SVN 1.4 syntax",
1486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
1496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: svn:executable
1506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   - *
1516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
1526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
1536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
1556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => -1,
1566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
1576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenundef],
1596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => undef,
1606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
1636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "simple: add svn:executable using SVN 1.4 syntax",
1646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
1656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: svn:executable
1666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
1676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
1686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
1696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
1716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
1726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
1736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenundef],
1756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => undef,
1766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen####
1786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Property value followed by empty line and start of next diff
1796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen##
1806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
1826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "add svn:executable, followed by empty line and start of next diff",
1836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
1846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: svn:executable
1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
1866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIndex: Makefile.shared
1886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
1896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
1906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
1926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
1936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
1946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Index: Makefile.shared\n",
1976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
1986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
200e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "add svn:executable, followed by empty line and start of next diff using Windows line endings",
201e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
202e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockAdded: svn:executable
203e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + *
204e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
205e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockIndex: Makefile.shared
206e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
207e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
208e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
209e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
210e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "svn:executable",
211e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
212e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "*",
213e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
214e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
215e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Index: Makefile.shared\r\n",
216e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
217e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
218e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
2196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "add svn:executable, followed by empty line and start of next property diff",
2206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
2216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: svn:executable
2226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
2236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenProperty changes on: Makefile.shared
2256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
2276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
2296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
2306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
2316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
2336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Property changes on: Makefile.shared\n",
2346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
237e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "add svn:executable, followed by empty line and start of next property diff using Windows line endings",
238e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
239e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockAdded: svn:executable
240e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + *
241e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
242e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockProperty changes on: Makefile.shared
243e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
244e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
245e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
246e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
247e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "svn:executable",
248e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
249e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "*",
250e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
251e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
252e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Property changes on: Makefile.shared\r\n",
253e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
254e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
255e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
2566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '+' change, followed by empty line and start of next diff",
2576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
2586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: documentation
2596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A
2606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
2616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
2626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIndex: Makefile.shared
2646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
2656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
2666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
2686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A\nlong sentence that spans\nmultiple lines.",
2706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
2726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Index: Makefile.shared\n",
2736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
2746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
276e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "multi-line '+' change, followed by empty line and start of next diff using Windows line endings",
277e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
278e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockName: documentation
279e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + A
280e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
281e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
282e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
283e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockIndex: Makefile.shared
284e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
285e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
286e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
287e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
288e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
289e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
290e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A\r\nlong sentence that spans\r\nmultiple lines.",
291e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
292e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
293e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Index: Makefile.shared\r\n",
294e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
295e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
296e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
2976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '+' change, followed by empty line and start of next property diff",
2986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
2996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: documentation
3006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A
3016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
3026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
3036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
3046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenProperty changes on: Makefile.shared
3056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
3066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
3076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
3086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
3096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
3106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A\nlong sentence that spans\nmultiple lines.",
3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
3126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
3136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Property changes on: Makefile.shared\n",
3146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
315e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
316e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
317e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "multi-line '+' change, followed by empty line and start of next property diff using Windows line endings",
318e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
319e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockName: documentation
320e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + A
321e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
322e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
323e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
324e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockProperty changes on: Makefile.shared
325e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
326e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
327e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
328e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
329e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
330e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
331e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A\r\nlong sentence that spans\r\nmultiple lines.",
332e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
333e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
334e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Property changes on: Makefile.shared\r\n",
335e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
3366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen####
3376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Property value followed by empty line and start of binary patch
3386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen##
3396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
3406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
3416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "add svn:executable, followed by empty line and start of binary patch",
3426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
3436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: svn:executable
3446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
3456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
3466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
3476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
3486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
3496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
3506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
3516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
3526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
3536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
3546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
3556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
3566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
3576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
3586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
359e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "add svn:executable, followed by empty line and start of binary patch using Windows line endings",
360e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
361e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockAdded: svn:executable
362e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + *
363e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
364e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
365e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
366e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
367e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
368e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
369e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "svn:executable",
370e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
371e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "*",
372e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
373e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
374e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n",
375e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
376e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
377e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
3786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '+' change, followed by empty line and start of binary patch",
3796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
3806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: documentation
3816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A
3826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
3836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
3846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
3856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
3866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
3876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
3886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
3896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
3906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
3916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A\nlong sentence that spans\nmultiple lines.",
3926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
3936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
3946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
3956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
3966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
3976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
398e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "multi-line '+' change, followed by empty line and start of binary patch using Windows line endings",
399e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
400e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockName: documentation
401e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + A
402e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
403e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
404e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
405e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
406e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
407e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
408e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
409e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
410e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
411e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
412e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A\r\nlong sentence that spans\r\nmultiple lines.",
413e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
414e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
415e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n",
416e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
417e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
418e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
4196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '-' change, followed by multi-line '+' change, empty line, and start of binary patch",
4206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
4216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenModified: documentation
4226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   - A
4236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
4246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
4256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + Another
4266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
4276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
4286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
4296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
4306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
4316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
4326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
4336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
4346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
4356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "Another\nlong sentence that spans\nmultiple lines.",
4366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
4376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
4386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\n",
4396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
440e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
441e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
442e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "multi-line '-' change, followed by multi-line '+' change, empty line, and start of binary patch using Windows line endings",
443e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
444e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockModified: documentation
445e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   - A
446e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
447e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
448e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + Another
449e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
450e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
451e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
452e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
453e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
454e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
455e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
456e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
457e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
458e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
459e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "Another\r\nlong sentence that spans\r\nmultiple lines.",
460e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
461e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
462e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==\r\n",
463e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
4646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen####
4656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Successive properties
4666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen##
4676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
4686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
4696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "single-line '+' change followed by custom property with single-line '+' change",
4706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
4716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: svn:executable
4726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
4736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: documentation
4746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A sentence.
4756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
4766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
4776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
4786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "svn:executable",
4796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
4806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "*",
4816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
4826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"Added: documentation\n"],
4836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "   + A sentence.\n",
4846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
4856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
4866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
4876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '+' change, followed by svn:executable",
4886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
4896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: documentation
4906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A
4916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
4926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
4936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenName: svn:executable
4946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
4956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
4966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
4976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
4986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
4996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
5006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A\nlong sentence that spans\nmultiple lines.",
5016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
5026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"Name: svn:executable\n"],
5036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "   + *\n",
5046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
5056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
5066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
5076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '-' change, followed by multi-line '+' change and add svn:executable",
5086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
5096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenModified: documentation
5106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   - A
5116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
5126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
5136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + Another
5146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
5156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
5166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: svn:executable
5176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + *
5186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
5196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
5206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
5216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
5226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
5236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "Another\nlong sentence that spans\nmultiple lines.",
5246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
5256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"Added: svn:executable\n"],
5266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "   + *\n",
5276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
5285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
5295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    # New test
5305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    diffName => "'Merged' change followed by 'Merged' change",
5315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    inputText => <<'END',
5325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickAdded: svn:mergeinfo
5335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Merged /trunk/Makefile:r33020
5345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Merged /trunk/Makefile.shared:r58350
5355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickEND
5365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedReturn => [
5375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
5385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    name => "svn:mergeinfo",
5395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    propertyChangeDelta => 1,
5405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value => "/trunk/Makefile.shared:r58350",
5415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
5425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickundef],
5435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedNextLine => undef,
5445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
5455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
5465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    # New test
5475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    diffName => "'Reverse-merged' change followed by 'Reverse-merged' change",
5485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    inputText => <<'END',
5495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDeleted: svn:mergeinfo
5505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Reverse-merged /trunk/Makefile:r33020
5515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick   Reverse-merged /trunk/Makefile.shared:r58350
5525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickEND
5535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedReturn => [
5545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
5555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    name => "svn:mergeinfo",
5565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    propertyChangeDelta => -1,
5575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value => "/trunk/Makefile.shared:r58350",
5585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
5595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickundef],
5605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    expectedNextLine => undef,
5615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick},
5626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen####
5636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# Property values with trailing new lines.
5646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen##
5656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen# FIXME: We do not support property values with trailing new lines, since it is difficult to
5666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#        disambiguate them from the empty line that preceeds the contents of a binary patch as
5676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#        in the test case (above): "multi-line '+' change, followed by empty line and start of binary patch".
5686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
5696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
5706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "single-line '+' with trailing new line",
5716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
5726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: documentation
5736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A sentence.
5746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
5756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
5766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
5776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
5786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
5796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
5806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A sentence.",
5816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
5826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
5836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => undef,
5846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
5856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
5866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
587e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "single-line '+' with trailing new line using Windows line endings",
588e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
589e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockAdded: documentation
590e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + A sentence.
591e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
592e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
593e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
594e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
595e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
596e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
597e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
598e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A sentence.",
599e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
600e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
601e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => undef,
602e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
603e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
604e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
6056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "single-line '+' with trailing new line, followed by empty line and start of binary patch",
6066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
6076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAdded: documentation
6086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A sentence.
6096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
6106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
6116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
6126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
6136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
6146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
6156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
6166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => 1,
6176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A sentence.",
6186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
6196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
6206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "\n",
6216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
6226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
6236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
624e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "single-line '+' with trailing new line, followed by empty line and start of binary patch using Windows line endings",
625e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
626e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockAdded: documentation
627e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + A sentence.
628e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
629e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
630e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockQ1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
631e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
632e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
633e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
634e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
635e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
636e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => 1,
637e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A sentence.",
638e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
639e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
640e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "\r\n",
641e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
642e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
643e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
6446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "single-line '-' change with trailing new line, and single-line '+' change",
6456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
6466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenModified: documentation
6476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   - A long sentence.
6486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
6496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + A sentence.
6506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
6516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
6526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
6536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
6546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => -1, # Since we only interpret the '-' property.
6556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A long sentence.",
6566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
6576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
6586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "   + A sentence.\n",
6596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
6606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
6616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    # New test
662e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "single-line '-' change with trailing new line, and single-line '+' change using Windows line endings",
663e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
664e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockModified: documentation
665e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   - A long sentence.
666e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
667e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + A sentence.
668e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
669e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
670e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
671e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
672e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
673e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => -1, # Since we only interpret the '-' property.
674e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A long sentence.",
675e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
676e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
677e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "   + A sentence.\r\n",
678e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
679e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
680e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
6816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    diffName => "multi-line '-' change with trailing new line, and multi-line '+' change",
6826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    inputText => <<'END',
6836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenModified: documentation
6846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   - A
6856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
6866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
6876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
6886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen   + Another
6896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenlong sentence that spans
6906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmultiple lines.
6916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenEND
6926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedReturn => [
6936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
6946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    name => "documentation",
6956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    propertyChangeDelta => -1, # Since we only interpret the '-' property.
6966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    value => "A\nlong sentence that spans\nmultiple lines.",
6976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
6986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen"\n"],
6996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    expectedNextLine => "   + Another\n",
7006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen},
701e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
702e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    # New test
703e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    diffName => "multi-line '-' change with trailing new line, and multi-line '+' change using Windows line endings",
704e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    inputText => toWindowsLineEndings(<<'END',
705e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockModified: documentation
706e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   - A
707e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
708e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
709e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
710e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block   + Another
711e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocklong sentence that spans
712e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockmultiple lines.
713e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockEND
714e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block),
715e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedReturn => [
716e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
717e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    name => "documentation",
718e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    propertyChangeDelta => -1, # Since we only interpret the '-' property.
719e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    value => "A\r\nlong sentence that spans\r\nmultiple lines.",
720e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
721e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block"\r\n"],
722e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    expectedNextLine => "   + Another\r\n",
723e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block},
7246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen);
7256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
7266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenmy $testCasesCount = @testCaseHashRefs;
7276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenplan(tests => 2 * $testCasesCount); # Total number of assertions.
7286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
7296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenforeach my $testCase (@testCaseHashRefs) {
7306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    my $testNameStart = "parseSvnProperty(): $testCase->{diffName}: comparing";
7316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
7326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    my $fileHandle;
7336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    open($fileHandle, "<", \$testCase->{inputText});
7346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    my $line = <$fileHandle>;
7356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
7366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    my @got = VCSUtils::parseSvnProperty($fileHandle, $line);
7376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    my $expectedReturn = $testCase->{expectedReturn};
7386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
7396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
7406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
7416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    my $gotNextLine = <$fileHandle>;
7426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
7436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
744