node-webodf
Version:
WebODF - JavaScript Document Engine http://webodf.org/
1,111 lines (1,096 loc) • 315 kB
text/xml
<!--
* Copyright (C) 2013 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:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:c="urn:webodf:names:cursor"
xmlns:e="urn:webodf:names:editinfo"
xmlns:ws="urn:webodf:names:scope"
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0">
<test name="AddCursor_00">
<before><office:text><text:p>ab</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/>ab</text:p></office:text></after>
</test>
<test name="AddCursorRemoveCursor">
<before><office:text><text:p>ab</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="RemoveCursor" memberid="Alice"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveCursor" memberid="Bob"/>
</opsB>
<after><office:text><text:p>ab</text:p></office:text></after>
</test>
<test name="ApplyDirectStylingInsertText_[V__]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="1" text="V" moveCursor="true"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>AV<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingInsertText_V_[__]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="0" text="V" moveCursor="true"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>VA<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingInsertText_[_V_]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="2" text="V" moveCursor="true"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BVC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingInsertText_[__V]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="3" text="V" moveCursor="true"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BCV</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingInsertText_[__]_V">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="4" text="V" moveCursor="true"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span>DV</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingMergeParagraph_MergeBeforeStylingStart">
<before>
<office:automatic-styles/>
<office:text><text:p/><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="2" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="1"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingMergeParagraph_MergeOnStylingStart">
<before>
<office:automatic-styles/>
<office:text><text:p>A</text:p><text:p>BCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="2" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="2"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingMergeParagraph_MergeWithinStyling" isFailing="true">
<comment>Due to #551, the DOMs do not converge even though they will visually render ok</comment>
<before>
<office:automatic-styles/>
<office:text><text:p>AB</text:p><text:p>CD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="3">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="3"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingMergeParagraph_MergeOnStylingEnd">
<before>
<office:automatic-styles/>
<office:text><text:p>ABC</text:p><text:p>D</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="3">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="4"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingMergeParagraph_MergeAfterStylingEnd">
<before>
<office:automatic-styles/>
<office:text><text:p>ABC</text:p><text:p>D</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="4"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingRemoveText_X[__]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="0" length="1"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws: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="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingRemoveText_[X_]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="1" length="1"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">C</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingRemoveText_[_X]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="2" length="1"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">B</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingRemoveText_X[X_]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="0" length="2"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws: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="auto63350368_0">C</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingRemoveText_[_X]X">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="2" length="2"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">B</text:span></text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingRemoveText_[__]X">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="3" length="1"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span></text:p></office:text>
</after>
</test>
<!-- TODO: Empty spans are not yet cleaned up
<test name="ApplyDirectStylingRemoveText_[XX]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="RemoveText" memberid="Bob" position="2" length="2"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>AD</text:p></office:text>
</after>
</test>
-->
<test name="ApplyDirectStylingSplitParagraph_[V__]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="SplitParagraph" memberid="Bob" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A</text:p><text:p><text:span text:style-name="auto63350368_0">BC</text:span>D</text:p></office:text>
</after>
</test>
<test name="ApplyDirectStylingSplitParagraph_[_V_]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="SplitParagraph" memberid="Bob" position="2" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">B</text:span></text:p><text:p><text:span text:style-name="auto63350368_0">C</text:span>D</text:p></office:text>
</after>
</test>
<!-- TODO: SplitParagraph needs to be fixed to not also split text:span ending at the pos
<test name="ApplyDirectStylingSplitParagraph_[__V]">
<before>
<office:automatic-styles/>
<office:text><text:p>ABCD</text:p></office:text>
</before>
<opsA>
<op optype="ApplyDirectStyling" memberid="Alice" position="1" length="2">
<setProperties><style:text-properties fo:font-weight="bold" /></setProperties>
</op>
</opsA>
<opsB>
<op optype="SplitParagraph" memberid="Bob" position="3"/>
</opsB>
<after>
<office:automatic-styles><style:style style:name="auto63350368_0" ws:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles>
<office:text><text:p>A<text:span text:style-name="auto63350368_0">BC</text:span></text:p><text:p>D</text:p></office:text>
</after>
</test>
-->
<test name="MoveCursor_00">
<before><office:text><text:p>ab</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="0" length="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="0" length="0"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/>ab</text:p></office:text></after>
</test>
<test name="MoveCursor_11">
<before><office:text><text:p>ab</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
</opsB>
<after><office:text><text:p>a<c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/>b</text:p></office:text></after>
</test>
<test name="MoveCursor_22">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2" length="0"/>
</opsB>
<after><office:text><text:p>ab<c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/></text:p><text:p/></office:text></after>
</test>
<test name="MoveCursor_02">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="0" length="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2" length="0"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/>ab<c:cursor c:memberId="Bob"/></text:p><text:p/></office:text></after>
</test>
<test name="InsertTextMergeParagraph_[ab]_[V]">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="InsertText" memberid="Alice" position="3" text="V"/>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="3" />
</opsB>
<after><office:text><text:p>abV</text:p></office:text></after>
</test>
<test name="InsertTextMergeParagraph_[aVb]_[]">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="InsertText" memberid="Alice" position="1" text="V"/>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="3" />
</opsB>
<after><office:text><text:p>aVb</text:p></office:text></after>
</test>
<test name="InsertTextMergeParagraph_[ab]_[]_[V]">
<before><office:text><text:p>ab</text:p><text:p/><text:p/></office:text></before>
<opsA>
<op optype="InsertText" memberid="Alice" position="4" text="V"/>
</opsA>
<opsB>
<op optype="MergeParagraph" memberid="Bob" destinationStartPosition="0" sourceStartPosition="3" />
</opsB>
<after><office:text><text:p>ab</text:p><text:p>V</text:p></office:text></after>
</test>
<test name="InsertTextMoveCursor_A__CV">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="0" length="2"/>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="2" text="V" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:anchor c:memberId="Alice"/>ab<c:cursor c:memberId="Alice"/>V</text:p><text:p/></office:text></after>
</test>
<test name="InsertTextMoveCursor_AV__C">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="0" length="2"/>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="0" text="V" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:anchor c:memberId="Alice"/>Vab<c:cursor c:memberId="Alice"/></text:p><text:p/></office:text></after>
</test>
<test name="InsertTextMoveCursor_A_V_C">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="0" length="2"/>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="1" text="V" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:anchor c:memberId="Alice"/>aVb<c:cursor c:memberId="Alice"/></text:p><text:p/></office:text></after>
</test>
<test name="InsertTextMoveCursor_C__AV">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="-2"/>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="2" text="V" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/>ab<c:anchor c:memberId="Alice"/>V</text:p><text:p/></office:text></after>
</test>
<test name="InsertTextMoveCursor_CV__A">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="-2"/>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="0" text="V" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/>Vab<c:anchor c:memberId="Alice"/></text:p><text:p/></office:text></after>
</test>
<test name="InsertTextMoveCursor_C_V_A">
<before><office:text><text:p>ab</text:p><text:p/></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="-2"/>
</opsA>
<opsB>
<op optype="InsertText" memberid="Bob" position="1" text="V" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/>aVb<c:anchor c:memberId="Alice"/></text:p><text:p/></office:text></after>
</test>
<test name="InsertText_aTb">
<before><office:text><text:p>T</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="InsertText" memberid="Alice" position="0" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="InsertText" memberid="Bob" position="1" text="b" moveCursor="true"/>
</opsB>
<after><office:text><text:p>a<c:cursor c:memberId="Alice"/>Tb<c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="InsertText_baT">
<before><office:text><text:p>T</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="InsertText" memberid="Alice" position="0" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="InsertText" memberid="Bob" position="0" text="b" moveCursor="true"/>
</opsB>
<after><office:text><text:p>b<c:cursor c:memberId="Bob"/>a<c:cursor c:memberId="Alice"/>T</text:p></office:text></after>
</test>
<test name="SplitParagraph_VaV">
<before><office:text><text:p>a</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="SplitParagraph" memberid="Alice" position="0" moveCursor="true" sourceParagraphPosition="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after><office:text><text:p/><text:p><c:cursor c:memberId="Alice"/>a</text:p><text:p><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="SplitParagraph_aVVb">
<before><office:text><text:p>ab</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Alice" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after><office:text><text:p>a</text:p><text:p><c:cursor c:memberId="Bob"/></text:p><text:p><c:cursor c:memberId="Alice"/>b</text:p></office:text></after>
</test>
<test name="InsertTextSetParagraphStyle_before">
<before>
<office:text><text:p/><text:p/></office:text>
</before>
<opsA>
<op optype="InsertText" position="0" text="abc"/>
</opsA>
<opsB>
<op optype="SetParagraphStyle" position="1" styleName="S"/>
</opsB>
<after>
<office:text><text:p>abc</text:p><text:p text:style-name="S"/></office:text>
</after>
</test>
<test name="InsertTextSetParagraphStyle_samePos">
<before>
<office:text><text:p/><text:p/></office:text>
</before>
<opsA>
<op optype="InsertText" position="1" text="abc"/>
</opsA>
<opsB>
<op optype="SetParagraphStyle" position="1" styleName="S"/>
</opsB>
<after>
<office:text><text:p/><text:p text:style-name="S">abc</text:p></office:text>
</after>
</test>
<test name="InsertTextSetParagraphStyle_after">
<before>
<office:text><text:p/><text:p>123</text:p></office:text>
</before>
<opsA>
<op optype="InsertText" position="4" text="abc"/>
</opsA>
<opsB>
<op optype="SetParagraphStyle" position="1" styleName="S"/>
</opsB>
<after>
<office:text><text:p/><text:p text:style-name="S">123abc</text:p></office:text>
</after>
</test>
<test name="InsertTextSplitParagraph_TaVT">
<before><office:text><text:p>TT</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="1" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after><office:text><text:p>Ta<c:cursor c:memberId="Alice"/></text:p><text:p><c:cursor c:memberId="Bob"/>T</text:p></office:text></after>
</test>
<test name="InsertTextSplitParagraph_TaTV">
<before><office:text><text:p>TT</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="1" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="2" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after><office:text><text:p>Ta<c:cursor c:memberId="Alice"/>T</text:p><text:p><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="InsertTextSplitParagraph_TVTa">
<before><office:text><text:p>TT</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="2" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after><office:text><text:p>T</text:p><text:p><c:cursor c:memberId="Bob"/>Ta<c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="InsertTextSplitParagraph_InsertBeforeSplit">
<comment>Insert text between split position and paragraph start position</comment>
<before><office:text><text:p>TT</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="0" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsB>
<after><office:text><text:p>a<c:cursor c:memberId="Alice"/>T</text:p><text:p><c:cursor c:memberId="Bob"/>T</text:p></office:text></after>
</test>
<test name="InsertTextSplitParagraph_InsertInParagraphBeforeSplit">
<comment>Insert text in paragraph before split the paragraph to be split</comment>
<before><office:text><text:p>A</text:p><text:p>B</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="0" text="a" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Bob" position="3" moveCursor="true" sourceParagraphPosition="2"/>
</opsB>
<after><office:text><text:p>a<c:cursor c:memberId="Alice"/>A</text:p><text:p>B</text:p><text:p><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_{B}[CDE]">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="RemoveText" memberid="Bob" position="1" length="1"/>
</opsB>
<after><office:text><text:p>A<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_[CDE]{F}">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="5" length="0"/>
<op optype="RemoveText" memberid="Bob" position="5" length="1"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>G</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_{B[CDE]F}">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="RemoveText" memberid="Bob" position="1" length="5"/>
</opsB>
<after><office:text><text:p>A<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>G</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_[C{D}E]">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="3" length="0"/>
<op optype="RemoveText" memberid="Bob" position="3" length="1"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_[{CD}E]">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2" length="0"/>
<op optype="RemoveText" memberid="Bob" position="2" length="2"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_[C{DE}]">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="3" length="0"/>
<op optype="RemoveText" memberid="Bob" position="3" length="2"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_[{CDE}]">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2" length="0"/>
<op optype="RemoveText" memberid="Bob" position="2" length="3"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_{B[CDE]}">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="RemoveText" memberid="Bob" position="1" length="4"/>
</opsB>
<after><office:text><text:p>A<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_{[CDE]F}">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="2" length="0"/>
<op optype="RemoveText" memberid="Bob" position="2" length="4"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>G</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_[C{E]F}">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="3" length="0"/>
<op optype="RemoveText" memberid="Bob" position="3" length="3"/>
</opsB>
<after><office:text><text:p>AB<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>G</text:p></office:text></after>
</test>
<test name="RemoveTextRemoveText_{B[CD}E]">
<before><office:text><text:p>ABCDEFG</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="2" length="0"/>
<op optype="RemoveText" memberid="Alice" position="2" length="3"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="MoveCursor" memberid="Bob" position="1" length="0"/>
<op optype="RemoveText" memberid="Bob" position="1" length="3"/>
</opsB>
<after><office:text><text:p>A<c:cursor c:memberId="Bob"/><c:cursor c:memberId="Alice"/>FG</text:p></office:text></after>
</test>
<test name="RemoveTextSplitParagraph_[AB|CD]">
<before><office:text><text:p>ABCD</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="RemoveText" memberid="Alice" position="0" length="4"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="SplitParagraph" memberid="Bob" position="2" sourceParagraphPosition="0" moveCursor="true"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Alice"/></text:p><text:p><c:cursor c:memberId="Bob"/></text:p></office:text></after>
</test>
<test name="InsertTextRemoveText_VT">
<before><office:text><text:p>T</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="InsertText" memberid="Alice" position="0" text="V" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" memberid="Bob" position="0" length="1"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Bob"/>V<c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="InsertTextRemoveText_TV">
<before><office:text><text:p>T</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="1" text="V" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" memberid="Bob" position="0" length="1"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Bob"/>V<c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="InsertTextRemoveText_TVT">
<before><office:text><text:p>TT</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="InsertText" memberid="Alice" position="1" text="V" moveCursor="true"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" memberid="Bob" position="0" length="2"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Bob"/>V<c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="RemoveTextSetParagraphStyle_before">
<before>
<office:text><text:p>abc</text:p><text:p>def</text:p></office:text>
</before>
<opsA>
<op optype="RemoveText" position="1" length="1"/>
</opsA>
<opsB>
<op optype="SetParagraphStyle" position="4" styleName="S"/>
</opsB>
<after>
<office:text><text:p>ac</text:p><text:p text:style-name="S">def</text:p></office:text>
</after>
</test>
<test name="RemoveTextSetParagraphStyle_samePos">
<before>
<office:text><text:p>abc</text:p><text:p>def</text:p></office:text>
</before>
<opsA>
<op optype="RemoveText" position="4" length="1"/>
</opsA>
<opsB>
<op optype="SetParagraphStyle" position="4" styleName="S"/>
</opsB>
<after>
<office:text><text:p>abc</text:p><text:p text:style-name="S">ef</text:p></office:text>
</after>
</test>
<test name="RemoveTextSetParagraphStyle_after">
<before>
<office:text><text:p>abc</text:p><text:p>def</text:p></office:text>
</before>
<opsA>
<op optype="RemoveText" position="5" length="1"/>
</opsA>
<opsB>
<op optype="SetParagraphStyle" position="4" styleName="S"/>
</opsB>
<after>
<office:text><text:p>abc</text:p><text:p text:style-name="S">df</text:p></office:text>
</after>
</test>
<test name="SplitParagraphRemoveText_VT">
<before><office:text><text:p>T</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="SplitParagraph" memberid="Alice" position="0" moveCursor="true" sourceParagraphPosition="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" memberid="Bob" position="0" length="1"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Bob"/></text:p><text:p><c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="SplitParagraphRemoveText_TV">
<before><office:text><text:p>T</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Alice" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" memberid="Bob" position="0" length="1"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Bob"/></text:p><text:p><c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="SplitParagraphRemoveText_TVT">
<before><office:text><text:p>TT</text:p></office:text></before>
<opsA>
<op optype="AddCursor" memberid="Alice"/>
<op optype="MoveCursor" memberid="Alice" position="1" length="0"/>
<op optype="SplitParagraph" memberid="Alice" position="1" moveCursor="true" sourceParagraphPosition="0"/>
</opsA>
<opsB>
<op optype="AddCursor" memberid="Bob"/>
<op optype="RemoveText" memberid="Bob" position="0" length="2"/>
</opsB>
<after><office:text><text:p><c:cursor c:memberId="Bob"/></text:p><text:p><c:cursor c:memberId="Alice"/></text:p></office:text></after>
</test>
<test name="AddParagraphStyleAddParagraphStyle">
<before>
<office:styles><style:style style:name="S" style:family="paragraph" style:class="text"></style:style></office:styles>
<office:text><text:p/></office:text>
</before>
<opsA>
<op optype="AddStyle" memberid="Alice" styleName="CA" styleFamily="paragraph"><setProperties style:class="text" style:display-name="Cloned from A"/></op>
</opsA>
<opsB>
<op optype="AddStyle" memberid="Bob" styleName="CB" styleFamily="paragraph"><setProperties style:class="text"/></op>
</opsB>
<after>
<office:styles><style:style style:name="S" style:family="paragraph" style:class="text"/><style:style style:name="CB" style:family="paragraph" style:class="text"/><style:style style:name="CA" style:display-name="Cloned from A" style:family="paragraph" style:class="text"/></office:styles>
<office:text><text:p/></office:text>
</after>
</test>
<test name="RemoveParagraphStyleRemoveParagraphStyle">
<before><office:styles><style:style style:name="S" style:family="paragraph" style:class="text"></style:style></office:styles><office:text><text:p/></office:text></before>
<opsA>
<op optype="RemoveStyle" memberid="Alice" styleName="S" styleFamily="paragraph"/>
</opsA>
<opsB>
<op optype="RemoveStyle" memberid="Bob" styleName="S" styleFamily="paragraph"/>
</opsB>
<after><office:styles></office:styles><office:text><text:p/></office:text></after>
</test>
<test name="RemoveParagraphStyleSplitParagraph">
<before><office:styles><style:style style:name="S" style:family="paragraph" style:class="text"/></office:styles><office:text><text:p text:style-name="S"/></office:text></before>
<opsA>
<op optype="SetParagraphStyle" memberid="Alice" position="0" sourceParagraphPosition="0" styleName=""/>
<op optype="RemoveStyle" memberid="Alice" styleName="S" styleFamily="paragraph"/>
</opsA>
<opsB>
<op optype="SplitParagraph" memberid="Bob" position="0" sourceParagraphPosition="0" paragraphStyleName="S"/>
</opsB>
<after><office:styles/><office:text><text:p/><text:p/></office:text></after>
</test>
<test name="AddParagraphStyleRemoveParagraphStyle_nextStyleName">
<before>
<office:styles><style:style style:name="S" style:family="paragraph" style:class="text"/></office:styles>
<office:text><text:p/></office:text>
</before>
<opsA>
<op optype="AddStyle" memberid="Alice" styleName="S2" styleFamily="paragraph"><setProperties style:class="text" style:next-style-name="S"/></op>
</opsA>
<opsB>
<op optype="RemoveStyle" memberid="Bob" styleName="S" styleFamily="paragraph"/>
</opsB>
<after>
<office:styles><style:style style:name="S2" style:family="paragraph" style:class="text"/></office:styles>
<office:text><text:p/></office:text>
</after>
</test>
<test name="AddParagraphStyleRemoveParagraphStyle_parentStyleName">
<before>
<office:styles><style:style style:name="S" style:family="paragraph" style:class="text"/></office:styles>
<office:text><text:p/></office:text>
</before>
<opsA>
<op optype="AddStyle" memberid="Alice" styleName="S2" styleFamily="paragraph"><setProperties style:class="text" style:parent-style-name="S"/></op>
</opsA>
<opsB>
<op optype="RemoveStyle" memberid="Bob" styleName="S" styleFamily="paragraph"/>
</opsB>
<after>
<office:styles><style:style style:name="S2" style:family="paragraph" style:class="text"/></office:styles>
<office:text><text:p/></office:text>
</after>
</test>
<test name="UpdateParagraphStyleRemoveParagraphStyle_sameStyle">
<before><office:styles><style:style style:name="S" style:family="paragraph" style:class="text"></style:style></office:styles><office:text><text:p/></office:text></before>
<opsA>
<op optype="UpdateParagraphStyle" memberid="Alice" styleName="S"><setProperties><style:text-properties fo:font-size="8pt"/></setProperties></op>
</opsA>
<opsB>
<op optype="RemoveStyle" memberid="Bob" styleName="S" styleFamily="paragraph"/>
</opsB>
<after><office:styles></office:styles><office:text><text:p/></office:text></after>
</test>
<test name="UpdateParagraphStyleRemoveParagraphStyle_nextStyleName">
<before>
<office:styles><style:style style:name="S" style:family="paragraph" style:class="text"/><style:style style:name="S2" style:fam