/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include namespace { char const DATA_DIRECTORY[] = "/sw/qa/extras/uiwriter/data3/"; } // namespace /// Third set of tests asserting the behavior of Writer user interface shells. class SwUiWriterTest3 : public SwModelTestBase { }; CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf129382) { load(DATA_DIRECTORY, "tdf129382.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(8, getShapes()); CPPUNIT_ASSERT_EQUAL(2, getPages()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Cut(); CPPUNIT_ASSERT_EQUAL(3, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(8, getShapes()); CPPUNIT_ASSERT_EQUAL(2, getPages()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(3, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); // without the fix, it crashes dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(8, getShapes()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf112342) { load(DATA_DIRECTORY, "tdf112342.docx"); //Get the last para uno::Reference xPara = getParagraph(3); auto xCur = xPara->getText()->createTextCursor(); //Go to the end of it xCur->gotoEnd(false); //And let's remove the last 2 chars (the last para with its char). xCur->goLeft(2, true); xCur->setString(""); //If the second paragraph on the second page, this will be passed. CPPUNIT_ASSERT_EQUAL_MESSAGE("Page break does not match", 2, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf126626) { load(DATA_DIRECTORY, "tdf126626.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(2, getShapes()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Copy(); CPPUNIT_ASSERT_EQUAL(2, getShapes()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(2, getShapes()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(4, getShapes()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(2, getShapes()); // without the fix, it crashes SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(4, getShapes()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf133967) { load(DATA_DIRECTORY, "tdf133967.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(6, getPages()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); dispatchCommand(mxComponent, ".uno:Cut", {}); Scheduler::ProcessEventsToIdle(); for (sal_Int32 i = 0; i < 10; ++i) { dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); dispatchCommand(mxComponent, ".uno:Redo", {}); Scheduler::ProcessEventsToIdle(); } // Without the fix in place, this test would have failed with: //- Expected: 1 //- Actual : 45 CPPUNIT_ASSERT_EQUAL(1, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132187) { load(DATA_DIRECTORY, "tdf132187.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(1, getPages()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Copy(); dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {}); TransferableDataHelper aHelper(xTransfer.get()); for (sal_Int32 i = 0; i < 10; ++i) { SwTransferable::Paste(*pWrtShell, aHelper); Scheduler::ProcessEventsToIdle(); } //without the fix in place, this test would fail with: //- Expected: 1 //- Actual : 70 CPPUNIT_ASSERT_EQUAL(1, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf128739) { load(DATA_DIRECTORY, "tdf128739.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(OUString("Fehler: Verweis nicht gefunden"), getParagraph(1)->getString()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Cut(); CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(OUString("Fehler: Verweis nicht gefunden"), getParagraph(1)->getString()); // without the fix, it crashes dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf124722) { load(DATA_DIRECTORY, "tdf124722.rtf"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(22, getPages()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Copy(); CPPUNIT_ASSERT_EQUAL(22, getPages()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(43, getPages()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(22, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf125261) { load(DATA_DIRECTORY, "tdf125261.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(OUString("https://www.example.com/"), getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); //apply autocorrect StartAutoCorrect dispatchCommand(mxComponent, ".uno:AutoFormatApply", {}); CPPUNIT_ASSERT_EQUAL(OUString("https://www.example.com/"), getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); // without the fix, it hangs dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(OUString("https://www.example.com/"), getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf76636) { load(DATA_DIRECTORY, "tdf76636.doc"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getColumns()->getCount()); //go to middle row pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); Scheduler::ProcessEventsToIdle(); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); Scheduler::ProcessEventsToIdle(); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); Scheduler::ProcessEventsToIdle(); dispatchCommand(mxComponent, ".uno:MergeCells", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getColumns()->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getColumns()->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf76636_2) { load(DATA_DIRECTORY, "tdf76636.doc"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getColumns()->getCount()); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); Scheduler::ProcessEventsToIdle(); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); Scheduler::ProcessEventsToIdle(); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT | KEY_SHIFT); Scheduler::ProcessEventsToIdle(); dispatchCommand(mxComponent, ".uno:MergeCells", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getColumns()->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getColumns()->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf126340) { load(DATA_DIRECTORY, "tdf126340.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); dispatchCommand(mxComponent, ".uno:GoDown", {}); // without the fix, it crashes dispatchCommand(mxComponent, ".uno:Delete", {}); CPPUNIT_ASSERT_EQUAL(OUString("foo"), getParagraph(1)->getString()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(OUString("foo"), getParagraph(1)->getString()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf124397) { load(DATA_DIRECTORY, "tdf124397.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); dispatchCommand(mxComponent, ".uno:Delete", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); // Without the fix in place, it would crash here dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf107975) { // This test also covers tdf#117185 tdf#110442 load(DATA_DIRECTORY, "tdf107975.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextGraphicObjectsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess( xTextGraphicObjectsSupplier->getGraphicObjects(), uno::UNO_QUERY); uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, getProperty(xShape, "AnchorType")); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Copy(); //Position the mouse cursor (caret) after "ABC" below the blue image dispatchCommand(mxComponent, ".uno:GoRight", {}); { TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); } // without the fix, it crashes CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(OUString("ABC"), getParagraph(1)->getString()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Redo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Redo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); //try again with anchor at start of doc which is another special case xShape.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); uno::Reference xShapeContent(xShape, uno::UNO_QUERY); uno::Reference const xStart = pTextDoc->getText()->getStart(); xShapeContent->attach(xStart); CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, getProperty(xShape, "AnchorType")); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); xTransfer.set(new SwTransferable(*pWrtShell)); xTransfer->Copy(); //Position the mouse cursor (caret) after "ABC" below the blue image dispatchCommand(mxComponent, ".uno:GoRight", {}); { TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); } // without the fix, it crashes CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(OUString("ABC"), getParagraph(1)->getString()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Redo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Redo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf130746) { load(DATA_DIRECTORY, "tdf130746.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:JumpToNextTable", {}); uno::Reference xModel(mxComponent, uno::UNO_QUERY); uno::Reference xTextViewCursorSupplier( xModel->getCurrentController(), uno::UNO_QUERY); uno::Reference xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCursor->getPage()); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCursor->getPage()); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_UP | KEY_MOD2); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCursor->getPage()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCursor->getPage()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf129805) { load(DATA_DIRECTORY, "tdf129805.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(OUString("x"), getParagraph(1)->getString()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); // without the fix in place, it would crash here xTransfer->Cut(); CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(OUString("x"), getParagraph(1)->getString()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf130685) { load(DATA_DIRECTORY, "tdf130685.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(2, getPages()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Cut(); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(1, getPages()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); SwTransferable::Paste(*pWrtShell, aHelper); // Without fix in place, this test would have failed with: //- Expected: 2 //- Actual : 4 Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(2, getPages()); dispatchCommand(mxComponent, ".uno:Undo", {}); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(1, getPages()); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(2, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132944) { load(DATA_DIRECTORY, "tdf132944.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(1, getPages()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); dispatchCommand(mxComponent, ".uno:Delete", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(1, getPages()); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); // Without the fix in place, the document would have had 2 pages CPPUNIT_ASSERT_EQUAL(1, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf130680) { load(DATA_DIRECTORY, "tdf130680.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(23), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); rtl::Reference xClpDoc(new SwDoc()); xClpDoc->SetClipBoard(true); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); // without the fix, it crashes xTransfer->Cut(); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); xClpDoc.clear(); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(23), xIndexAccess->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf131684) { load(DATA_DIRECTORY, "tdf131684.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); //Use selectAll 3 times in a row dispatchCommand(mxComponent, ".uno:SelectAll", {}); dispatchCommand(mxComponent, ".uno:SelectAll", {}); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Cut(); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); // without the fix, it crashes dispatchCommand(mxComponent, ".uno:Undo", {}); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); // check that the text frame has the correct upper xmlDocUniquePtr pXmlDoc = parseLayoutDump(); OUString const sectionId = getXPath(pXmlDoc, "/root/page[1]/body/section[7]", "id"); OUString const sectionLower = getXPath(pXmlDoc, "/root/page[1]/body/section[7]", "lower"); OUString const textId = getXPath(pXmlDoc, "/root/page[1]/body/section[7]/txt[1]", "id"); OUString const textUpper = getXPath(pXmlDoc, "/root/page[1]/body/section[7]/txt[1]", "upper"); CPPUNIT_ASSERT_EQUAL(textId, sectionLower); CPPUNIT_ASSERT_EQUAL(sectionId, textUpper); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf80663) { mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Sequence aArgs(comphelper::InitPropertySequence( { { "Rows", uno::makeAny(sal_Int32(2)) }, { "Columns", uno::makeAny(sal_Int32(2)) } })); dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); Scheduler::ProcessEventsToIdle(); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); dispatchCommand(mxComponent, ".uno:DeleteRows", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf130805) { load(DATA_DIRECTORY, "tdf130805.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); SwWrtShell* pWrtSh = pTextDoc->GetDocShell()->GetWrtShell(); CPPUNIT_ASSERT(pWrtSh); const SwFrameFormats& rFrmFormats = *pWrtSh->GetDoc()->GetSpzFrameFormats(); CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); auto pShape = rFrmFormats.front(); CPPUNIT_ASSERT(pShape); SwTextBoxHelper::create(pShape); auto pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); CPPUNIT_ASSERT(pTxBxFrm); auto pTxAnch = pTxBxFrm->GetAnchor().GetContentAnchor(); auto pShpAnch = pShape->GetAnchor().GetContentAnchor(); CPPUNIT_ASSERT(pTxAnch); CPPUNIT_ASSERT(pShpAnch); CPPUNIT_ASSERT_EQUAL_MESSAGE("The textbox got apart!", pTxAnch->nNode, pShpAnch->nNode); //CPPUNIT_ASSERT_EQUAL_MESSAGE("", xShp->getPosition().Y, xShp2->getPosition().Y); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf96067) { mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Sequence aArgs(comphelper::InitPropertySequence( { { "Rows", uno::makeAny(sal_Int32(3)) }, { "Columns", uno::makeAny(sal_Int32(3)) } })); dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); Scheduler::ProcessEventsToIdle(); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); dispatchCommand(mxComponent, ".uno:SelectTable", {}); dispatchCommand(mxComponent, ".uno:InsertRowsBefore", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf87199) { mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Sequence aArgs(comphelper::InitPropertySequence( { { "Rows", uno::makeAny(sal_Int32(2)) }, { "Columns", uno::makeAny(sal_Int32(1)) } })); dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); uno::Reference xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); xCellA1->setString("test1"); uno::Reference xCellA2(xTextTable->getCellByName("A2"), uno::UNO_QUERY); xCellA2->setString("test2"); dispatchCommand(mxComponent, ".uno:EntireColumn", {}); dispatchCommand(mxComponent, ".uno:MergeCells", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); CPPUNIT_ASSERT(xCellA1->getString().endsWith("test2")); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); xCellA1.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); CPPUNIT_ASSERT(xCellA1->getString().endsWith("test1")); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132603) { mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Sequence aPropertyValues = comphelper::InitPropertySequence({ { "Text", uno::makeAny(OUString("Comment")) } }); dispatchCommand(mxComponent, ".uno:InsertAnnotation", aPropertyValues); Scheduler::ProcessEventsToIdle(); dispatchCommand(mxComponent, ".uno:SelectAll", {}); Scheduler::ProcessEventsToIdle(); // Without the fix in place, it would crash here dispatchCommand(mxComponent, ".uno:Copy", {}); Scheduler::ProcessEventsToIdle(); OUString aPostits = pTextDoc->getPostIts(); std::stringstream aStream(aPostits.toUtf8().getStr()); boost::property_tree::ptree aTree; boost::property_tree::read_json(aStream, aTree); for (const boost::property_tree::ptree::value_type& rValue : aTree.get_child("comments")) { const boost::property_tree::ptree& rComment = rValue.second; OString aText(rComment.get("text").c_str()); CPPUNIT_ASSERT_EQUAL(OString("Comment"), aText); } } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf117601) { mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); uno::Sequence aArgs(comphelper::InitPropertySequence( { { "Rows", uno::makeAny(sal_Int32(5)) }, { "Columns", uno::makeAny(sal_Int32(3)) } })); dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); Scheduler::ProcessEventsToIdle(); uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); uno::Reference xCellB1(xTextTable->getCellByName("B1"), uno::UNO_QUERY); xCellB1->setString("test1"); uno::Reference xCellB2(xTextTable->getCellByName("B2"), uno::UNO_QUERY); xCellB2->setString("test2"); //go to middle row pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_UP); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT); Scheduler::ProcessEventsToIdle(); dispatchCommand(mxComponent, ".uno:EntireColumn", {}); dispatchCommand(mxComponent, ".uno:MergeCells", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); CPPUNIT_ASSERT(xCellB1->getString().endsWith("test2")); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); CPPUNIT_ASSERT(xCellB1->getString().endsWith("test1")); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf128782) { load(DATA_DIRECTORY, "tdf128782.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(2, getShapes()); uno::Reference xShape1 = getShape(1); uno::Reference xShape2 = getShape(2); awt::Point aPos[2]; aPos[0] = xShape1->getPosition(); aPos[1] = xShape2->getPosition(); //select shape 2 and move it down dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); Scheduler::ProcessEventsToIdle(); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); //Y position in shape 2 has changed CPPUNIT_ASSERT(aPos[1].Y < xShape2->getPosition().Y); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); // Shape2 has come back to the original position // without the fix in place, it would have failed CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf135623) { load(DATA_DIRECTORY, "tdf135623.docx"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(2, getShapes()); CPPUNIT_ASSERT_EQUAL(2, getPages()); uno::Reference xShape1 = getShape(1); uno::Reference xShape2 = getShape(2); awt::Point aPos[2]; aPos[0] = xShape1->getPosition(); aPos[1] = xShape2->getPosition(); //select shape 1 and move it down dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); Scheduler::ProcessEventsToIdle(); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); //Y position in shape 1 has changed CPPUNIT_ASSERT(aPos[0].Y < xShape1->getPosition().Y); CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); // Without the fix in place, this test would have failed here // - Expected: 1351 // - Actual : 2233 CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); CPPUNIT_ASSERT_EQUAL(2, getPages()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf133490) { load(DATA_DIRECTORY, "tdf133490.odt"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); CPPUNIT_ASSERT_EQUAL(1, getShapes()); dispatchCommand(mxComponent, ".uno:SelectAll", {}); SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); rtl::Reference xTransfer = new SwTransferable(*pWrtShell); xTransfer->Cut(); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(0, getShapes()); TransferableDataHelper aHelper(xTransfer.get()); SwTransferable::Paste(*pWrtShell, aHelper); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(1, getShapes()); SwTransferable::Paste(*pWrtShell, aHelper); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(2, getShapes()); uno::Reference xShape1 = getShape(1); uno::Reference xShape2 = getShape(2); awt::Point aPos[2]; aPos[0] = xShape1->getPosition(); aPos[1] = xShape2->getPosition(); //select shape 2 and move it to the right dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); Scheduler::ProcessEventsToIdle(); for (sal_Int32 i = 0; i < 5; ++i) { pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT); Scheduler::ProcessEventsToIdle(); } CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); //X position in shape 2 has changed CPPUNIT_ASSERT(aPos[1].X < xShape2->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); for (sal_Int32 i = 0; i < 4; ++i) { dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); // Without the fix in place, undo action would have changed shape1's position // and this test would have failed with // - Expected: -139 // - Actual : 1194 CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); CPPUNIT_ASSERT(aPos[1].X < xShape2->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); } dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); // Shape 2 has come back to the original position CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(1, getShapes()); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(0, getShapes()); dispatchCommand(mxComponent, ".uno:Undo", {}); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(1, getShapes()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132637_protectTrackChanges) { load(DATA_DIRECTORY, "tdf132637_protectTrackChanges.doc"); SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); // The password should only prevent turning off track changes, not open as read-only CPPUNIT_ASSERT(!pTextDoc->GetDocShell()->IsReadOnly()); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */