node-webodf
Version:
WebODF - JavaScript Document Engine http://webodf.org/
972 lines (969 loc) • 111 kB
text/xml
<!--
* Copyright (C) 2013-2014 KO GmbH <copyright@kogmbh.com>
*
* @licstart
* This file is part of WebODF.
*
* WebODF is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License (GNU AGPL)
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* WebODF is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with WebODF. If not, see <http://www.gnu.org/licenses/>.
* @licend
*
* @source: http://www.webodf.org/
* @source: https://github.com/kogmbh/WebODF/
-->
<tests
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
xmlns:c="urn:webodf:names:cursor"
xmlns:e="urn:webodf:names:editinfo"
xmlns:h="urn:webodf:names:helper"
xmlns:wo="urn:webodf:names:scope"
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
xmlns:foreign="urn:operationtests:foreign">
<test name="AddCursor_Simple">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/></text:p></office:text></after>
</test>
<test name="AddCursor_Span">
<before><office:text><text:p><text:span/></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/><text:span/></text:p></office:text></after>
</test>
<test name="AddCursor_Text">
<before><office:text><text:p>a</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/>a</text:p></office:text></after>
</test>
<test name="AddCursor_Space">
<before><office:text><text:p> a</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p> <c:cursor c:memberId="Joe"/>a</text:p></office:text></after>
</test>
<test name="AddCursor_SpanSpace">
<before><office:text><text:p> <text:span> a</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p> <text:span> <c:cursor c:memberId="Joe"/>a</text:span></text:p></office:text></after>
</test>
<test name="AddCursor_JustAfterEdit">
<before><office:text><text:p><editinfo /><text:span>a</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><editinfo /><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:p></office:text></after>
</test>
<test name="AddCursor_NonEmptySpan">
<before><office:text><text:p><text:span>a</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:p></office:text></after>
</test>
<test name="AddCursor_NestedSpan">
<before><office:text><text:p><text:span><text:span>a</text:span></text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><text:span><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:span></text:p></office:text></after>
</test>
<test name="AddCursor_NestedSpan_JustAfterEdit_Level1">
<before><office:text><text:p><editinfo /><text:span><text:span>a</text:span></text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><editinfo /><text:span><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:span></text:p></office:text></after>
</test>
<test name="AddCursor_NestedSpan_JustAfterEdit_Level2">
<before><office:text><text:p><text:span><editinfo /><text:span>a</text:span></text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p><text:span><editinfo /><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:span></text:p></office:text></after>
</test>
<!--
<test name="RemoveCursor_Simple">
<before><office:text><text:p><c:cursor c:memberId="Joe"/></text:p></office:text></before>
<ops>
<op optype="RemoveCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
-->
<test name="AddRemoveCursor_Simple">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="RemoveCursor" memberid="Joe"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="MoveCursor_OverImageAnchoredAsCharInStyle" isFailing="true">
<before>
<office:automatic-styles>
<style:style style:name="Graphics" style:family="graphic">
<style:graphic-properties text:anchor-type="as-char"/>
</style:style>
</office:automatic-styles>
<office:text>
<text:p><draw:frame draw:style-name="Graphics"/></text:p>
</office:text>
</before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="1"/>
</ops>
<after>
<office:automatic-styles>
<style:style style:name="Graphics" style:family="graphic">
<style:graphic-properties text:anchor-type="as-char"/>
</style:style>
</office:automatic-styles>
<office:text>
<text:p><draw:frame draw:style-name="Graphics"/><c:cursor c:memberId="Joe"/></text:p>
</office:text>
</after>
</test>
<test name="InsertText_Simple">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="hello"/>
</ops>
<after><office:text><text:p>hello</text:p></office:text></after>
</test>
<test name="InsertRemoveText_Simple">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="hello"/>
<op optype="RemoveText" position="0" length="5"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="InsertText_Simple2">
<before><office:text><text:p>a</text:p></office:text></before>
<ops>
<op optype="InsertText" position="0" text="b"/>
</ops>
<after><office:text><text:p>ba</text:p></office:text></after>
</test>
<test name="InsertText_Simple3">
<before><office:text><text:p>a</text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text="b"/>
</ops>
<after><office:text><text:p>ab</text:p></office:text></after>
</test>
<test name="InsertText_InsertNewLineChar">
<before><office:text><text:p>a</text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text=" "/>
</ops>
<after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after>
</test>
<test name="InsertText_OneByOneBeforeExisting">
<before><office:text><text:p>T</text:p></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a"/>
<op optype="InsertText" position="1" text="b"/>
</ops>
<after><office:text><text:p>abT</text:p></office:text></after>
</test>
<test name="InsertText_Span">
<before><office:text><text:p><text:span>a</text:span></text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text="b"/>
</ops>
<after><office:text><text:p><text:span>ab</text:span></text:p></office:text></after>
</test>
<test name="InsertText_Span2">
<before><office:text><text:p><text:span>a</text:span></text:p></office:text></before>
<ops>
<op optype="InsertText" position="0" text="b"/>
</ops>
<after><office:text><text:p><text:span>ba</text:span></text:p></office:text></after>
</test>
<test name="InsertText_BeforeSpace">
<before><office:text><text:p><text:s> </text:s></text:p></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a"/>
</ops>
<after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after>
</test>
<test name="InsertText_AfterSpace">
<before><office:text><text:p><text:s> </text:s></text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text="a"/>
</ops>
<after><office:text><text:p><text:s> </text:s>a</text:p></office:text></after>
</test>
<test name="InsertText_AfterSpace2">
<before><office:text><text:p>a<text:s> </text:s></text:p></office:text></before>
<ops>
<op optype="InsertText" position="2" text="b"/>
</ops>
<after><office:text><text:p>a b</text:p></office:text></after>
</test>
<test name="InsertText_withSameCursor_AfterSpace2">
<before><office:text><text:p>a<text:s> </text:s></text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="2"/>
<op optype="InsertText" memberid="Joe" position="2" text="b"/>
</ops>
<after><office:text><text:p>a <c:cursor c:memberId="Joe"/>b</text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withSameCursor_AfterSpace2_moveCursor">
<before><office:text><text:p>a<text:s> </text:s></text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="2"/>
<op optype="InsertText" memberid="Joe" position="2" text="b" moveCursor="true"/>
</ops>
<after><office:text><text:p>a b<c:cursor c:memberId="Joe"/></text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withSameCursor_BeforeSpan_moveCursor">
<before><office:text><text:p>a<text:span>b</text:span></text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="InsertText" memberid="Joe" position="0" text="c" moveCursor="true"/>
</ops>
<after><office:text><text:p>c<c:cursor c:memberId="Joe"/>a<text:span>b</text:span></text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withSameCursor_BeforeSpan">
<before><office:text><text:p>a<text:span>b</text:span></text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="InsertText" memberid="Joe" position="0" text="c"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/>ca<text:span>b</text:span></text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withSameCursor_moveCursor">
<before><office:text><text:p>a</text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="InsertText" memberid="Joe" position="0" text="b" moveCursor="true"/>
</ops>
<after><office:text><text:p>b<c:cursor c:memberId="Joe"/>a</text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withSameCursor">
<before><office:text><text:p>a</text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="InsertText" memberid="Joe" position="0" text="b"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/>ba</text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withSameCursor2">
<before><office:text><text:p>ab c</text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="1"/>
<op optype="InsertText" memberid="Joe" position="1" text="d" moveCursor="true"/>
</ops>
<after><office:text><text:p>ad<c:cursor c:memberId="Joe"/>b c</text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withOtherCursor_AfterSpace2">
<before><office:text><text:p>a<text:s> </text:s></text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="2"/>
<op optype="InsertText" memberid="Alice" position="2" text="b" moveCursor="true"/>
</ops>
<after><office:text><text:p>a <c:cursor c:memberId="Joe"/>b</text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withOtherCursor_BeforeSpan">
<before><office:text><text:p>a<text:span>b</text:span></text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="InsertText" memberid="Alice" position="0" text="c" moveCursor="true"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/>ca<text:span>b</text:span></text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withOtherCursor">
<before><office:text><text:p>a</text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="InsertText" memberid="Alice" position="0" text="b" moveCursor="true"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Joe"/>ba</text:p><text:p/></office:text></after>
</test>
<test name="InsertText_withOtherCursor2">
<before><office:text><text:p>ab c</text:p><text:p/></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="1"/>
<op optype="InsertText" memberid="Alice" position="1" text="d" moveCursor="true"/>
</ops>
<after><office:text><text:p>a<c:cursor c:memberId="Joe"/>db c</text:p><text:p/></office:text></after>
</test>
<test name="InsertSpace">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text=" " moveCursor="true"/>
</ops>
<after><office:text><text:p><text:s> </text:s></text:p></office:text></after>
</test>
<test name="InsertSpace_IntoExistingSpaceBlock">
<before><office:text><text:p>a <text:s> </text:s><text:s> </text:s>b</text:p></office:text></before>
<ops>
<op optype="InsertText" position="2" text=" " moveCursor="true"/>
</ops>
<after><office:text><text:p>a <text:s> </text:s><text:s> </text:s><text:s> </text:s>b</text:p></office:text></after>
</test>
<test name="InsertSpaceAndCharacters">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a" moveCursor="true"/>
<op optype="InsertText" position="1" text=" " moveCursor="true"/>
<op optype="InsertText" position="2" text="b" moveCursor="true"/>
<op optype="InsertText" position="3" text="c" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bc</text:p></office:text></after>
</test>
<test name="InsertMultipleSpaces">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a b" moveCursor="true"/>
</ops>
<after><office:text><text:p>a <text:s> </text:s><text:s> </text:s><text:s> </text:s>b</text:p></office:text></after>
</test>
<test name="InsertWithTrailingSpace">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a " moveCursor="true"/>
</ops>
<after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after>
</test>
<test name="InsertSpaceAndCharacters2">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a " moveCursor="true"/>
<op optype="InsertText" position="2" text="b" moveCursor="true"/>
<op optype="InsertText" position="3" text="c" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bc</text:p></office:text></after>
</test>
<test name="InsertText_AfterSpaceAndTab_InNewParagraph">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="SplitParagraph" position="0" moveCursor="true"/>
<op optype="InsertText" position="1" text="	 " moveCursor="true"/>
<op optype="SplitParagraph" position="4" moveCursor="true"/>
<op optype="InsertText" position="5" text="U" moveCursor="true"/>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
</ops>
<after><office:text><text:p><text:tab>	</text:tab> <text:s> </text:s></text:p><text:p>U</text:p></office:text></after>
</test>
<test name="RemoveSpace">
<before><office:text><text:p><text:s> </text:s></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="1"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="RemoveText_SurroundingCursor">
<before><office:text><text:p>a<c:cursor>b</c:cursor>c</text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="2"/>
</ops>
<after><office:text><text:p><c:cursor>b</c:cursor></text:p></office:text></after>
</test>
<test name="AddRemoveSpace">
<before><office:text><text:p>ab</text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text=" " moveCursor="true"/>
<op optype="RemoveText" position="1" length="1"/>
</ops>
<after><office:text><text:p>a b</text:p></office:text></after>
</test>
<test name="InsertTab">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="	" moveCursor="true"/>
</ops>
<after><office:text><text:p><text:tab>	</text:tab></text:p></office:text></after>
</test>
<test name="InsertText_TabChars">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="ab	c" moveCursor="true"/>
</ops>
<after><office:text><text:p>ab<text:tab>	</text:tab>c</text:p></office:text></after>
</test>
<test name="InsertText_SingleSpaceChar">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bc</text:p></office:text></after>
</test>
<test name="InsertText_TextWithLeadingSpaceAfterSpace">
<before><office:text><text:p>a d</text:p></office:text></before>
<ops>
<op optype="InsertText" position="2" text=" bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a <text:s> </text:s>bcd</text:p></office:text></after>
</test>
<test name="InsertText_TextAfterUnexpandedSpace">
<before><office:text><text:p>a d</text:p></office:text></before>
<ops>
<op optype="InsertText" position="2" text="bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bcd</text:p></office:text></after>
</test>
<test name="InsertText_TextAfterExpandedSpace">
<before><office:text><text:p>a<text:s> </text:s>d</text:p></office:text></before>
<ops>
<op optype="InsertText" position="2" text="bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bcd</text:p></office:text></after>
</test>
<test name="InsertText_MultipleSpaceChar">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="a bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a <text:s> </text:s><text:s> </text:s>bc</text:p></office:text></after>
</test>
<test name="InsertText_DowngradeLeadingSpaces">
<before><office:text><text:p>a</text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text=" bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bc</text:p></office:text></after>
</test>
<test name="InsertText_DowngradeTrailingSpaces">
<before><office:text><text:p>a <text:s> </text:s>d</text:p></office:text></before>
<ops>
<op optype="InsertText" position="2" text="bc" moveCursor="true"/>
</ops>
<after><office:text><text:p>a bc d</text:p></office:text></after>
</test>
<test name="InsertText_UpgradesTrailingSpace">
<before><office:text><text:p>a d</text:p></office:text></before>
<ops>
<op optype="InsertText" position="1" text="bc " moveCursor="true"/>
</ops>
<after><office:text><text:p>abc <text:s> </text:s>d</text:p></office:text></after>
</test>
<test name="RemoveCharacter">
<before><office:text><text:p>A</text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="1"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="RemoveCharacter_DowngradesWhiteSpace">
<before><office:text><text:p>A <text:s> </text:s>B</text:p></office:text></before>
<ops>
<op optype="RemoveText" position="1" length="1"/>
</ops>
<after><office:text><text:p>A B</text:p></office:text></after>
</test>
<test name="InsertRemoveText_Simple_Backwards">
<before><office:text><text:p/></office:text></before>
<ops>
<op optype="InsertText" position="0" text="ABC" moveCursor="true"/>
<op optype="RemoveText" position="1" length="2"/>
<op optype="RemoveText" position="0" length="1"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="RemoveSpace2">
<before><office:text><text:p>a<text:s> </text:s><text:s> </text:s></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="1" length="1"/>
</ops>
<after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after>
</test>
<test name="Remove_characterInSpanCursorBehind">
<before><office:text><text:p><text:span>A</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1"/>
<op optype="RemoveText" memberid="Bob" position="0" length="1"/>
</ops>
<after><office:text><text:p><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="RemoveText_bridgeSpan_withCursor">
<before><office:text><text:p text:style-name="A">ab<text:span>cd</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="2"/>
<op optype="RemoveText" position="1" length="2"/>
</ops>
<after><office:text><text:p text:style-name="A">a<c:cursor c:memberId="Bob"/><text:span>d</text:span></text:p></office:text></after>
</test>
<test name="MergeParagraph_1">
<before><office:text><text:p text:style-name="A">abcd</text:p><text:p text:style-name="B">efgh</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="5" paragraphStyleName="A"/>
</ops>
<after><office:text><text:p text:style-name="A">abcdefgh</text:p></office:text></after>
</test>
<test name="MergeParagraphWithEmptyAnnotationText inside">
<before><office:text><text:p text:style-name="A">ab</text:p><text:p text:style-name="B">c<office:annotation office:name="alice_1">
<dc:creator e:memberid="Alice">Alice</dc:creator>
<dc:date>2013-08-05T12:34:07.061Z</dc:date>
<text:list>
<text:list-item>
<text:p></text:p>
</text:list-item>
</text:list>
</office:annotation>d</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="3" paragraphStyleName="A"/>
</ops>
<after><office:text><text:p text:style-name="A">abc<office:annotation office:name="alice_1">
<dc:creator e:memberid="Alice">Alice</dc:creator>
<dc:date>2013-08-05T12:34:07.061Z</dc:date>
<text:list>
<text:list-item>
<text:p></text:p>
</text:list-item>
</text:list>
</office:annotation>d</text:p></office:text></after>
</test>
<test name="RemoveAndMerge">
<before><office:text><text:p text:style-name="A">abc<text:span text:style-name="B">d</text:span></text:p><text:p text:style-name="C"><text:span text:style-name="D">efgh</text:span></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="5" length="2"/>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="5" paragraphStyleName="A"/>
<op optype="RemoveText" position="2" length="2"/>
</ops>
<after><office:text><text:p text:style-name="A">ab<text:span text:style-name="D">gh</text:span></text:p></office:text></after>
</test>
<test name="RemoveAndMerge_withCursor">
<before><office:text><text:p text:style-name="A"><text:span>a</text:span>bcd</text:p><text:p text:style-name="B"><text:span>e</text:span>fgh</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2" length="5"/>
<op optype="RemoveText" position="5" length="2"/>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="5" paragraphStyleName="A"/>
<op optype="RemoveText" position="2" length="2"/>
</ops>
<after><office:text><text:p text:style-name="A"><text:span>a</text:span>b<c:cursor c:memberId="Bob"/>gh</text:p></office:text></after>
</test>
<test name="RemoveAndMerge_OntoFirstLine">
<before><office:text><text:p text:style-name="A"><text:span>ab</text:span></text:p><text:p text:style-name="B"><text:span>cde</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" position="0" length="1"/>
<op optype="RemoveText" position="0" length="1"/>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1" paragraphStyleName="A"/>
</ops>
<after><office:text><text:p text:style-name="A"><text:span><c:cursor c:memberId="Bob"/>cde</text:span></text:p></office:text></after>
</test>
<test name="RemoveAndMerge_EmptyParagraph">
<before><office:text><text:p text:style-name="A"><draw:frame text:anchor-type="as-char"/></text:p><text:p text:style-name="B"/><text:p text:style-name="C"></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" position="0" length="1"/>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1" paragraphStyleName="A"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
</ops>
<after><office:text><text:p text:style-name="A"/><text:p text:style-name="C"><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="RemoveAndMerge_EmptyParagraph_naturalStyling">
<before><office:text><text:p text:style-name="A"><draw:frame text:anchor-type="as-char"/></text:p><text:p text:style-name="B"/><text:p text:style-name="C"></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" position="0" length="1"/>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
<op optype="SetParagraphStyle" position="0" styleName="B"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
</ops>
<after><office:text><text:p text:style-name="B"/><text:p text:style-name="C"><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="Remove_DeleteLastCharacterNearTabs">
<before><office:text><text:p><text:span><text:tab>	</text:tab><text:tab>	</text:tab>a</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2"/>
<op optype="RemoveText" position="2" length="1"/>
</ops>
<after><office:text><text:p><text:span><text:tab>	</text:tab><text:tab>	</text:tab><c:cursor c:memberId="Bob"/></text:span></text:p></office:text></after>
</test>
<test name="Remove_DeleteLastCharacterInSpan">
<before><office:text><text:p>a<text:span><e:editinfo e:id="A"/>b</text:span>c</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1"/>
<op optype="RemoveText" position="1" length="1"/>
</ops>
<after><office:text><text:p>a<c:cursor c:memberId="Bob"/><e:editinfo e:id="A"/>c</text:p></office:text></after>
</test>
<test name="Remove_DeleteTabs">
<before><office:text><text:p><text:span><text:tab>	</text:tab><text:tab>	</text:tab></text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1"/>
<op optype="RemoveText" position="1" length="1"/>
</ops>
<after><office:text><text:p><text:span><text:tab>	</text:tab><c:cursor c:memberId="Bob"/></text:span></text:p></office:text></after>
</test>
<test name="Remove_DeleteTabs2">
<before><office:text><text:p><text:span>a<text:tab>	</text:tab><text:tab>	</text:tab></text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2"/>
<op optype="RemoveText" position="2" length="1"/>
</ops>
<after><office:text><text:p><text:span>a<text:tab>	</text:tab><c:cursor c:memberId="Bob"/></text:span></text:p></office:text></after>
</test>
<test name="Remove_DeleteLineBreak">
<before><office:text><text:p><text:span>a<text:line-break/>b</text:span></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="2"/>
</ops>
<after><office:text><text:p><text:span>b</text:span></text:p></office:text></after>
</test>
<test name="Remove_DeleteImageWithText">
<before><office:text><text:p><draw:frame draw:name="graphics1" draw:style-name="fr1" text:anchor-type="as-char" svg:width="5cm" svg:height="6cm"><draw:image xlink:href="Pictures/helloworld.jpg" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" /></draw:frame><text:span>hello</text:span></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="3"/>
</ops>
<after><office:text><text:p><text:span>llo</text:span></text:p></office:text></after>
</test>
<test name="Remove_DeleteImageWithSvgDesc">
<before><office:text><text:p><draw:frame draw:name="graphics1" draw:style-name="fr1" text:anchor-type="as-char" svg:width="5cm" svg:height="6cm"><draw:image xlink:href="Pictures/helloworld.jpg" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" /><svg:desc>hello world</svg:desc></draw:frame></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="13"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="Merge_ListItem1">
<before><office:text><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item><text:list-item><text:p><text:span>world</text:span></text:p></text:list-item></text:list></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="6"/>
</ops>
<after><office:text><text:list><text:list-item><text:p><text:span>hello</text:span><text:span>world</text:span></text:p></text:list-item></text:list></office:text></after>
</test>
<test name="Merge_ListItem2">
<before><office:text><text:list><text:list-item><text:p></text:p><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item></text:list></text:list-item></text:list></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
</ops>
<after><office:text><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item></text:list></office:text></after>
</test>
<test name="Merge_EmptyParagraph1">
<before><office:text><text:p text:style-name="A"></text:p><text:p text:style-name="B">efgh</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1" paragraphStyleName="A"/>
</ops>
<after><office:text><text:p text:style-name="A">efgh</text:p></office:text></after>
</test>
<test name="Merge_Empty1_naturalStyling">
<before><office:text><text:p text:style-name="A"></text:p><text:p text:style-name="B">efgh</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
<op optype="SetParagraphStyle" position="0" styleName="B"/>
</ops>
<after><office:text><text:p text:style-name="B">efgh</text:p></office:text></after>
</test>
<test name="Merge_Empty1_naturalStyling_unspecifiedName">
<before><office:text><text:p text:style-name="A"></text:p><text:p>efgh</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
<op optype="SetParagraphStyle" position="0" styleName=""/>
</ops>
<after><office:text><text:p>efgh</text:p></office:text></after>
</test>
<test name="Merge_Empty_WithNonOdfChildren">
<before><office:text><text:p text:style-name="A"><foreign:test foreign:id="1"/><foreign:test foreign:id="2"/></text:p><text:p text:style-name="B"><foreign:test foreign:id="3"/>efgh<foreign:test foreign:id="4"/></text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
<op optype="SetParagraphStyle" position="0" styleName="B"/>
</ops>
<after><office:text><text:p text:style-name="B"><foreign:test foreign:id="1"/><foreign:test foreign:id="2"/><foreign:test foreign:id="3"/>efgh<foreign:test foreign:id="4"/></text:p></office:text></after>
</test>
<test name="Merge_Empty_WithNonOdfChildren_PreservesForeignElements">
<before><office:text><text:p><foreign:test foreign:id="1"/></text:p><text:p><text:span><foreign:test foreign:id="2"/></text:span></text:p></office:text></before>
<ops>
<op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/>
</ops>
<after><office:text><text:p><foreign:test foreign:id="1"/><foreign:test foreign:id="2"/></text:p></office:text></after>
</test>
<test name="Merge_HighlightedAnnotation_bug666">
<before><office:text><text:p>A</text:p><text:p><html:span class="webodf-annotationHighlight">B</html:span></text:p></office:text></before>
<ops>
<op optype="MergeParagraph" memberid="Alice" destinationStartPosition="0" sourceStartPosition="2"/>
</ops>
<after><office:text><text:p>A<html:span class="webodf-annotationHighlight">B</html:span></text:p></office:text></after>
</test>
<test name="Merge_MovesCursor">
<before><office:text><text:p/><text:p/><text:p>B</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MergeParagraph" memberid="Alice" destinationStartPosition="1" sourceStartPosition="2" moveCursor="true"/>
</ops>
<after><office:text><text:p/><text:p><c:cursor c:memberId="Alice"/>B</text:p></office:text></after>
</test>
<test name="Merge_CopesWithOddElements_AtParagraphBounds">
<before><office:text><text:p/><text:p><text:hidden-text>hidden</text:hidden-text>B</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" memberid="Alice" destinationStartPosition="0" sourceStartPosition="1"/>
</ops>
<after><office:text><text:p><text:hidden-text>hidden</text:hidden-text>B</text:p></office:text></after>
</test>
<test name="Merge_CleansUpEmptySpans">
<before><office:text><text:p/><text:p><text:span/>B</text:p></office:text></before>
<ops>
<op optype="MergeParagraph" memberid="Alice" destinationStartPosition="0" sourceStartPosition="1"/>
</ops>
<after><office:text><text:p>B</text:p></office:text></after>
</test>
<test name="Remove_deleteLink1">
<before><office:text><text:p><text:a xlink:type="simple" xlink:href="http://www.hello.com"><text:span>Hello</text:span></text:a></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="5"/>
</ops>
<after><office:text><text:p/></office:text></after>
</test>
<test name="Remove_deleteLink2">
<before><office:text><text:p><text:span><text:a xlink:type="simple" xlink:href="http://www.hello.com">Hello</text:a><text:a xlink:type="simple" xlink:href="http://www.world.com">World</text:a></text:span></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="4" length="6"/>
</ops>
<after><office:text><text:p><text:span><text:a xlink:type="simple" xlink:href="http://www.hello.com">Hell</text:a></text:span></text:p></office:text></after>
</test>
<test name="Remove_deleteNearSpace">
<before><office:text><text:p>AB</text:p><text:p><text:s> </text:s><text:span>CD</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="3"/>
<op optype="RemoveText" position="3" length="1"/>
</ops>
<after><office:text><text:p>AB</text:p><text:p><text:span><c:cursor c:memberId="Bob" />CD</text:span></text:p></office:text></after>
</test>
<test name="SpaceBetweenParagraphs">
<before><office:text><text:p>a</text:p> <text:p>b</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="2"/>
</ops>
<after><office:text><text:p>a</text:p> <text:p><c:cursor c:memberId="Joe"/>b</text:p></office:text></after>
</test>
<test name="20130517_split_text_2space">
<before><office:text><text:p>20130517_split_text_2space</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="9"/>
<op optype="InsertText" memberid="Joe" position="9" text="A" moveCursor="true"/>
<op optype="InsertText" memberid="Joe" position="10" text=" " moveCursor="true"/>
<op optype="InsertText" memberid="Joe" position="11" text=" " moveCursor="true"/>
<op optype="MoveCursor" memberid="Joe" position="11"/>
<op optype="MoveCursor" memberid="Joe" position="10"/>
</ops>
<after><office:text><text:p>20130517_A<c:cursor c:memberId="Joe"/> <text:s> </text:s>split_text_2space</text:p></office:text></after>
</test>
<test name="20130517_split_text_2space_otherCursor">
<before><office:text><text:p>20130517_split_text_2space</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Joe"/>
<op optype="MoveCursor" memberid="Joe" position="9"/>
<op optype="InsertText" memberid="Alice" position="9" text="A" moveCursor="true"/>
<op optype="InsertText" memberid="Alice" position="10" text=" " moveCursor="true"/>
<op optype="InsertText" memberid="Alice" position="11" text=" " moveCursor="true"/>
<op optype="MoveCursor" memberid="Joe" position="11"/>
<op optype="MoveCursor" memberid="Joe" position="10"/>
</ops>
<after><office:text><text:p>20130517_A<c:cursor c:memberId="Joe"/> <text:s> </text:s>split_text_2space</text:p></office:text></after>
</test>
<test name="InsertText_multiCursors">
<before><office:text><text:p>abcdefgh</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="3"/>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="3"/>
<op optype="AddCursor" memberid="Eve"/>
<op optype="MoveCursor" memberid="Eve" position="3"/>
<op optype="InsertText" memberid="Eve" position="3" text="123" moveCursor="true"/>
</ops>
<after><office:text><text:p>abc<c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/>123<c:cursor c:memberId="Eve"/>defgh</text:p></office:text></after>
</test>
<test name="SplitParagraph_multiCursors">
<before><office:text><text:p>abcdefgh</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="3"/>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="3"/>
<op optype="AddCursor" memberid="Eve"/>
<op optype="MoveCursor" memberid="Eve" position="3"/>
<op optype="SplitParagraph" memberid="Eve" position="3" moveCursor="true"/>
</ops>
<after><office:text><text:p>abc<c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/></text:p><text:p><c:cursor c:memberId="Eve"/>defgh</text:p></office:text></after>
</test>
<test name="DeleteExposesSpace1">
<before><office:text><text:p> a b </text:p></office:text></before>
<ops>
<op optype="RemoveText" position="0" length="1"/>
</ops>
<after><office:text><text:p> <text:s> </text:s>b </text:p></office:text></after>
</test>
<test name="DeleteExposesSpace2">
<before><office:text><text:p> a b<text:s> </text:s></text:p></office:text></before>
<ops>
<op optype="RemoveText" position="2" length="1"/>
</ops>
<after><office:text><text:p> a <text:s> </text:s></text:p></office:text></after>
</test>
<test name="InsertText_startOfAutomaticStyleSpanAtStartOfParagraph">
<!-- text inserted at the position of a start of a span at the start of a paragraph should be added to the span, not before -->
<before>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p/><text:p><text:span text:style-name="a">ABCD</text:span></text:p></office:text>
</before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1"/>
<op optype="InsertText" memberid="Alice" position="1" text="123" moveCursor="true"/>
</ops>
<after>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p/><text:p><text:span text:style-name="a">123<c:cursor c:memberId="Alice"/>ABCD</text:span></text:p></office:text>
</after>
</test>
<test name="InsertText_startOfAutomaticStyleSpanNotAtStartOfParagraph">
<!-- text inserted at the position of a start of a span which is not at the start of a paragraph should be added before the span, not to it -->
<before>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p/><text:p>A<text:span text:style-name="a">BCD</text:span></text:p></office:text>
</before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2"/>
<op optype="InsertText" memberid="Alice" position="2" text="123" moveCursor="true"/>
</ops>
<after>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p/><text:p>A123<c:cursor c:memberId="Alice"/><text:span text:style-name="a">BCD</text:span></text:p></office:text>
</after>
</test>
<test name="InsertText_endOfAutomaticStyleSpanAtEndOfParagraph">
<!-- text inserted at the position of the end of a span which is at the end of a paragraph should be added to the span, not behind it -->
<before>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p><text:span text:style-name="a">ABCD</text:span></text:p><text:p/></office:text>
</before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="4"/>
<op optype="InsertText" memberid="Alice" position="4" text="123" moveCursor="true"/>
</ops>
<after>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p><text:span text:style-name="a">ABCD123<c:cursor c:memberId="Alice"/></text:span></text:p><text:p/></office:text>
</after>
</test>
<test name="InsertText_endOfAutomaticStyleSpanNotAtEndOfParagraph">
<!-- also text inserted at the position of the end of a span which is not at the end of a paragraph should be added to the span, not behind it -->
<before>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p><text:span text:style-name="a">ABC</text:span>D</text:p><text:p/></office:text>
</before>
<ops>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="3"/>
<op optype="InsertText" memberid="Alice" position="3" text="123" moveCursor="true"/>
</ops>
<after>
<office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p><text:span text:style-name="a">ABC123<c:cursor c:memberId="Alice"/></text:span>D</text:p><text:p/></office:text>
</after>
</test>
<test name="SplitParagraph_SetParagraphStyle">
<before><office:text><text:p text:style-name="currentStyle"/></office:text></before>
<ops>
<op optype="SplitParagraph" memberid="Bob" position="0" paragraphStyleName="newStyle"/>
</ops>
<after><office:text><text:p text:style-name="currentStyle"/><text:p text:style-name="newStyle"/></office:text></after>
</test>
<test name="SplitParagraph_ClearParagraphStyle">
<before><office:text><text:p text:style-name="currentStyle"/></office:text></before>
<ops>
<op optype="SplitParagraph" memberid="Bob" position="0" paragraphStyleName=""/>
</ops>
<after><office:text><text:p text:style-name="currentStyle"/><text:p/></office:text></after>
</test>
<test name="SplitListParagraph_singleCursor">
<before><office:text><text:list><text:list-item><text:p>helloworld</text:p></text:list-item></text:list></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5"/>
<op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/>
</ops>
<after><office:text><text:list><text:list-item><text:p>hello</text:p></text:list-item><text:list-item><text:p><c:cursor c:memberId="Bob"/>world</text:p></text:list-item></text:list></office:text></after>
</test>
<test name="SplitListParagraph_singleCursor_singleSpan">
<before><office:text><text:list><text:list-item><text:p><text:span>helloworld</text:span></text:p></text:list-item></text:list></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5"/>
<op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/>
</ops>
<after><office:text><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item><text:list-item><text:p><text:span><c:cursor c:memberId="Bob"/>world</text:span></text:p></text:list-item></text:list></office:text></after>
</test>
<test name="SplitListParagraph_singleCursor_nestedSpan">
<before><office:text><text:list><text:list-item><text:p><text:span><text:span>helloworld</text:span></text:span></text:p></text:list-item></text:list></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5"/>
<op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/>
</ops>
<after><office:text><text:list><text:list-item><text:p><text:span><text:span>hello</text:span></text:span></text:p></text:list-item><text:list-item><text:p><text:span><text:span><c:cursor c:memberId="Bob"/>world</text:span></text:span></text:p></text:list-item></text:list></office:text></after>
</test>
<test name="SplitParagraph_BeforeSpace">
<before><office:text><text:p>hello world</text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5"/>
<op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/>
</ops>
<after><office:text><text:p>hello</text:p><text:p><c:cursor c:memberId="Bob"/><text:s> </text:s>world</text:p></office:text></after>
</test>
<test name="SplitParagraph_BeforeSpace_2">
<before><office:text><text:p><text:span>hello</text:span><text:span> world</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5"/>
<op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/>
</ops>
<after><office:text><text:p><text:span>hello</text:span></text:p><text:p><text:span/><text:span><c:cursor c:memberId="Bob"/><text:s> </text:s>world</text:span></text:p></office:text></after>
</test>
<test name="SplitParagraph_DoesntSplitAtNodeEnd" isFailing="true">
<before><office:text><text:p><text:span>hello</text:span><text:span>world</text:span></text:p></office:text></before>
<ops>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5"/>
<op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/>
</ops>
<after><of