sw/CppunitTest_sw_uiwriter8.mk | 14 sw/Module_sw.mk | 1 sw/qa/extras/uiwriter/uiwriter3.cxx | 2335 ----------------------------------- sw/qa/extras/uiwriter/uiwriter8.cxx | 2371 ++++++++++++++++++++++++++++++++++++ 4 files changed, 2387 insertions(+), 2334 deletions(-)
New commits: commit 1f6918b458e5edee8daa7c81675b30d50533249f Author: Miklos Vajna <[email protected]> AuthorDate: Tue Aug 30 12:00:32 2022 +0200 Commit: Miklos Vajna <[email protected]> CommitDate: Tue Aug 30 12:59:16 2022 +0200 Split CppunitTest_sw_uiwriter3 into a uiwriter3 and a uiwriter8 My build with 16G ram now regularly fails with: g++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preprocessed source if appropriate. See <https://bugs.opensuse.org/> for instructions. make[1]: *** [solenv/gbuild/LinkTarget.mk:337: workdir/CxxObject/sw/qa/extras/uiwriter/uiwriter3.o] Error 4 make[1]: *** Waiting for unfinished jobs.... make: *** [Makefile:289: build] Error 2 Change-Id: Ia758f2e905a13369a9eef7eece4104bb9ea76303 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139025 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins diff --git a/sw/CppunitTest_sw_uiwriter8.mk b/sw/CppunitTest_sw_uiwriter8.mk new file mode 100644 index 000000000000..a802c0caa180 --- /dev/null +++ b/sw/CppunitTest_sw_uiwriter8.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# 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/. +# +#************************************************************************* + +$(eval $(call sw_uiwriter_test,8)) + +# vim: set noet sw=4 ts=4: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index e93ae26ceb42..a784af17d121 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -116,6 +116,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_uiwriter5 \ CppunitTest_sw_uiwriter6 \ CppunitTest_sw_uiwriter7 \ + CppunitTest_sw_uiwriter8 \ CppunitTest_sw_layoutwriter \ CppunitTest_sw_layoutwriter2 \ CppunitTest_sw_mailmerge \ diff --git a/sw/qa/extras/uiwriter/uiwriter3.cxx b/sw/qa/extras/uiwriter/uiwriter3.cxx index 062fb0acc195..ab028d9da5ce 100644 --- a/sw/qa/extras/uiwriter/uiwriter3.cxx +++ b/sw/qa/extras/uiwriter/uiwriter3.cxx @@ -9,12 +9,7 @@ #include <swmodeltestbase.hxx> #include <LibreOfficeKit/LibreOfficeKitEnums.h> -#include <vcl/filter/PDFiumLibrary.hxx> #include <vcl/scheduler.hxx> -#include <vcl/TypeSerializer.hxx> -#include <com/sun/star/awt/FontWeight.hpp> -#include <com/sun/star/drawing/GraphicExportFilter.hpp> -#include <IDocumentDrawModelAccess.hxx> #include <com/sun/star/table/TableBorder2.hpp> #include <com/sun/star/text/XDocumentIndex.hpp> #include <com/sun/star/text/XTextFrame.hpp> @@ -22,27 +17,17 @@ #include <com/sun/star/text/XTextViewCursorSupplier.hpp> #include <com/sun/star/text/XPageCursor.hpp> #include <comphelper/propertysequence.hxx> -#include <boost/property_tree/json_parser.hpp> -#include <frameformats.hxx> #include <swdtflvr.hxx> -#include <tools/json_writer.hxx> -#include <unotools/streamwrap.hxx> -#include <sfx2/linkmgr.hxx> #include <o3tl/string_view.hxx> #include <view.hxx> #include <wrtsh.hxx> #include <unotxdoc.hxx> -#include <drawdoc.hxx> -#include <dcontact.hxx> -#include <svx/svdpage.hxx> #include <ndtxt.hxx> -#include <txtfld.hxx> #include <toxmgr.hxx> #include <IDocumentFieldsAccess.hxx> -#include <IDocumentLinksAdministration.hxx> #include <IDocumentRedlineAccess.hxx> -#include <rootfrm.hxx> +#include <fmtinfmt.hxx> namespace { @@ -2302,2324 +2287,6 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf130680) CPPUNIT_ASSERT_EQUAL(sal_Int32(23), xIndexAccess->getCount()); } -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf131684) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf131684.docx"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> 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", {}); - - rtl::Reference<SwTransferable> 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); - 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, testTdf132420) -{ - createSwDoc(DATA_DIRECTORY, "tdf132420.odt"); - - CPPUNIT_ASSERT_EQUAL(12, getShapes()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Cut", {}); - Scheduler::ProcessEventsToIdle(); - CPPUNIT_ASSERT_EQUAL(0, getShapes()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - //Without the fix in place, 1 frame and 1 image would be gone and getShapes would return 10 - CPPUNIT_ASSERT_EQUAL(12, getShapes()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132744) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf132744.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - // disable change tracking to cut the table - pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::ShowDelete - | RedlineFlags::ShowInsert); - - CPPUNIT_ASSERT_MESSAGE("redlining should be off", - !pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - rtl::Reference<SwTransferable> xTransfer = new SwTransferable(*pWrtShell); - xTransfer->Cut(); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(0, getShapes()); - - TransferableDataHelper aHelper(xTransfer); - SwTransferable::Paste(*pWrtShell, aHelper); - Scheduler::ProcessEventsToIdle(); - - //Without the fix in place, the image wouldn't be pasted - CPPUNIT_ASSERT_EQUAL(1, getShapes()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf146622) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "TC-table-del-add.docx"); - CPPUNIT_ASSERT(pDoc); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - - uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTables->getCount()); - uno::Reference<container::XNameAccess> xTableNames = xTablesSupplier->getTextTables(); - CPPUNIT_ASSERT(xTableNames->hasByName("Table1")); - uno::Reference<text::XTextTable> xTable1(xTableNames->getByName("Table1"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); - - dispatchCommand(mxComponent, ".uno:DeleteRows", {}); - - // This was 3 (deleting the already deleted row with change tracking) - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:DeleteRows", {}); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:DeleteRows", {}); - // This was 2 (deleting the already deleted table with change tracking) - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTables->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); - - // check that the first table was deleted with change tracking - dispatchCommand(mxComponent, ".uno:AcceptAllTrackedChanges", {}); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); - - // Undo AcceptAllTrackedChanges and DeleteRows - dispatchCommand(mxComponent, ".uno:Undo", {}); - dispatchCommand(mxComponent, ".uno:Undo", {}); - - // now only the second table deleted by AcceptAllTrackedChanges - dispatchCommand(mxComponent, ".uno:AcceptAllTrackedChanges", {}); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf146962) -{ - // load a 2-row table, set Hide Changes mode and delete the first row with change tracking - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf116789.fodt"); - CPPUNIT_ASSERT(pDoc); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - // enable redlining - dispatchCommand(mxComponent, ".uno:TrackChanges", {}); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - // hide changes - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - dispatchCommand(mxComponent, ".uno:DeleteRows", {}); - - // Without the fix in place, the deleted row would be visible - - xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - // This was 2 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 1); - - // check it in Show Changes mode - - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // 2 rows are visible now - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - - // check it in Hide Changes mode again - - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // only a single row is visible again - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 1); - - // tdf#148227 check Undo of tracked table row deletion - - dispatchCommand(mxComponent, ".uno:Undo", {}); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // This was 1 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf147347) -{ - // load a 2-row table, set Hide Changes mode and delete the table with change tracking - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf116789.fodt"); - CPPUNIT_ASSERT(pDoc); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - // enable redlining - dispatchCommand(mxComponent, ".uno:TrackChanges", {}); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - // hide changes - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - dispatchCommand(mxComponent, ".uno:DeleteTable", {}); - - // Without the fix in place, the deleted row would be visible - - xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - // This was 1 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 0); - - // check it in Show Changes mode - - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // 2 rows are visible now - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - - // check it in Hide Changes mode again - - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // no visible row again - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 0); - - // tdf#148228 check Undo of tracked table deletion - - dispatchCommand(mxComponent, ".uno:Undo", {}); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // This was 0 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf148345) -{ - // load a 2-row table, set Hide Changes mode and delete the first row with change tracking - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf116789.fodt"); - CPPUNIT_ASSERT(pDoc); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - // enable redlining - dispatchCommand(mxComponent, ".uno:TrackChanges", {}); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - // hide changes - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - dispatchCommand(mxComponent, ".uno:DeleteRows", {}); - - // Without the fix in place, the deleted row would be visible - - xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - // This was 2 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 1); - - // check it in Show Changes mode - - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // 2 rows are visible now - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - - // check it in Hide Changes mode again - - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // only a single row is visible again - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 1); - - // tdf#148227 check Reject All of tracked table row deletion - - dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {}); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // This was 1 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf141391) -{ - // table insertion in the first paragraph of the cell - // overwrites the row content, instead of inserting a nested table - - // load a 2-row table - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf116789.fodt"); - CPPUNIT_ASSERT(pDoc); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - // select the table, and copy it into at paragraph start of cell "A2" - - dispatchCommand(mxComponent, ".uno:SelectTable", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - // remove the selection and positionate the cursor at beginning of A2 - pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - - xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - // 3-row, overwriting cells of the second row and inserting a new row - // with the 2-row clipboard table content - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 3); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt/Text", "Portion", "hello"); - - // Undo - - dispatchCommand(mxComponent, ".uno:Undo", {}); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // 2 rows again, no copied text content - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/Text", 0); - - // insert the 2-row table into the second paragraph of cell "A2" as a nested table - // For this it's enough to positionate the text cursor not in the first paragraph - - // insert some text and an empty paragraph - pWrtShell->Insert("Some text..."); - pWrtShell->SplitNode(); - Scheduler::ProcessEventsToIdle(); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt", 2); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt[1]/Text", "Portion", - "Some text..."); - // the empty paragraph in A2 - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt[2]/Text", 0); - - // insert the table, as a nested one in cell "A2" - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/tab", 1); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/tab/row", 2); - - // Undo - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // 2 rows again, no copied text content - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 2); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt[1]/Text", "Portion", - "Some text..."); - - // copy the 2-row table into the fist paragraph of cell "A2", - // but not at paragraph start (changed behaviour) - - pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); - pWrtShell->Insert("and some text again in the first paragraph to be sure..."); - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - - // 3-row, overwriting cells of the second row and inserting a new row - // with the 2-row clipboard table content - - // This was 2 (nested table) - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 3); - // This was "Some text..." with a nested table - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt/Text", "Portion", "hello"); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf148791) -{ - // test Paste as Rows Above with centered table alignment - - // load a 2-row table - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf116789.fodt"); - CPPUNIT_ASSERT(pDoc); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - // select and copy the table, and Paste As Rows Above - - dispatchCommand(mxComponent, ".uno:SelectTable", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - // remove the selection and positionate the cursor at beginning of A2 - pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); - pWrtShell->Up(/*bSelect=*/false); - dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); - Scheduler::ProcessEventsToIdle(); - - xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - // Paste as Rows Above results 4-row table with default table alignment - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 4); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[1]/cell[1]/txt/Text", "Portion", "hello"); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[3]/cell[1]/txt/Text", "Portion", "hello"); - - // set table alignment to center, select and copy the table again - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); - - uno::Reference<text::XTextTable> xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - - // Default table alignment - CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::FULL, - getProperty<sal_Int16>(xTextTable, "HoriOrient")); - - //CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xTextTable, "TableTemplateName")); - uno::Reference<beans::XPropertySet> xTableProps(xTextTable, uno::UNO_QUERY_THROW); - - xTableProps->setPropertyValue("HoriOrient", uno::Any(text::HoriOrientation::CENTER)); - - CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::CENTER, - getProperty<sal_Int16>(xTextTable, "HoriOrient")); - - dispatchCommand(mxComponent, ".uno:SelectTable", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - // remove the selection and positionate the cursor at beginning of A2 - pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); - pWrtShell->Up(/*bSelect=*/false); - pWrtShell->Up(/*bSelect=*/false); - pWrtShell->Up(/*bSelect=*/false); - dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); - Scheduler::ProcessEventsToIdle(); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // This was 5 (inserting only a single row for the 4-row clipboard content, and - // overwriting 3 existing rows) - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 8); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[1]/cell[1]/txt/Text", "Portion", "hello"); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[3]/cell[1]/txt/Text", "Portion", "hello"); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[5]/cell[1]/txt/Text", "Portion", "hello"); - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[7]/cell[1]/txt/Text", "Portion", "hello"); - - // tdf#64902 add a test case for nested tables - - // insert a nested table, and copy as paste as rows above the whole table with it - dispatchCommand(mxComponent, ".uno:PasteNestedTable", {}); - dispatchCommand(mxComponent, ".uno:SelectTable", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - // remove the selection and positionate the cursor at beginning of A2 - pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); - // skip 7 table rows plus 4 rows of the nested table - for (int i = 0; i < 7 + 4; ++i) - pWrtShell->Up(/*bSelect=*/false); - dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); - Scheduler::ProcessEventsToIdle(); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // rows of the nested table doesn't effect row number of the main table - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 16); - // there are two nested tables after the paste - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell/tab", 2); - - // tdf#64902 add a test case for repeated table headings - - xTableProps->setPropertyValue("RepeatHeadline", uno::Any(true)); - CPPUNIT_ASSERT(getProperty<bool>(xTextTable, "RepeatHeadline")); - - xTableProps->setPropertyValue("HeaderRowCount", uno::Any(sal_Int32(3))); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getProperty<sal_Int32>(xTextTable, "HeaderRowCount")); - - dispatchCommand(mxComponent, ".uno:SelectTable", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - // remove the selection and positionate the cursor at beginning of A2 - pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); - // skip 15 table rows plus 4 * 2 rows of the nested tables - for (int i = 0; i < 15 + 4 * 2; ++i) - pWrtShell->Up(/*bSelect=*/false); - dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); - Scheduler::ProcessEventsToIdle(); - - discardDumpedLayout(); - pXmlDoc = parseLayoutDump(); - // repeating table header (and its thead/tbody indentation) doesn't effect row number - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row", 32); - // there are two nested tables after the paste - assertXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell/tab", 4); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf135014) -{ - createSwDoc(); - - uno::Sequence<beans::PropertyValue> aArgs( - comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(sal_Int32(0)) } })); - - // Toggle Numbering List - dispatchCommand(mxComponent, ".uno:DefaultBullet", aArgs); - Scheduler::ProcessEventsToIdle(); - - uno::Sequence<beans::PropertyValue> aArgs2(comphelper::InitPropertySequence( - { { "Param", uno::Any(OUString("NewNumberingStyle")) }, - { "Family", uno::Any(static_cast<sal_Int16>(SfxStyleFamily::Pseudo)) } })); - - // New Style from selection - dispatchCommand(mxComponent, ".uno:StyleNewByExample", aArgs2); - Scheduler::ProcessEventsToIdle(); - - // Without the fix in place, this test would have failed here - reload("Office Open XML Text", "tdf135014.docx"); - - xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); - assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='NewNumberingStyle']/w:qFormat", 1); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf130629) -{ - createSwDoc(); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - uno::Sequence<beans::PropertyValue> aArgs( - comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } })); - - dispatchCommand(mxComponent, ".uno:BasicShapes.diamond", aArgs); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - // Undo twice - dispatchCommand(mxComponent, ".uno:Undo", {}); - dispatchCommand(mxComponent, ".uno:Undo", {}); - - CPPUNIT_ASSERT_EQUAL(0, getShapes()); - - // Shape toolbar is active, use ESC before inserting a new shape - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_ESCAPE); - Scheduler::ProcessEventsToIdle(); - - // Without the fix in place, this test would have crashed here - dispatchCommand(mxComponent, ".uno:BasicShapes.diamond", aArgs); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf145584) -{ - std::shared_ptr<vcl::pdf::PDFium> pPDFium = vcl::pdf::PDFiumLibrary::get(); - if (!pPDFium) - { - return; - } - SwDoc* const pDoc = createSwDoc(); - SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtSh); - - pWrtSh->Insert("Hello World"); - - // Select 'World' - pWrtSh->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 5, /*bBasicCall=*/false); - - // Save as PDF. - uno::Sequence<beans::PropertyValue> aFilterData( - comphelper::InitPropertySequence({ { "Selection", uno::Any(true) } })); - - uno::Sequence<beans::PropertyValue> aDescriptor(comphelper::InitPropertySequence( - { { "FilterName", uno::Any(OUString("writer_pdf_Export")) }, - { "FilterData", uno::Any(aFilterData) }, - { "URL", uno::Any(maTempFile.GetURL()) } })); - - // Without the fix in place, this test would have crashed here - dispatchCommand(mxComponent, ".uno:ExportToPDF", aDescriptor); - - // Parse the export result. - SvFileStream aFile(maTempFile.GetURL(), StreamMode::READ); - SvMemoryStream aMemory; - aMemory.WriteStream(aFile); - std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument - = pPDFium->openDocument(aMemory.GetData(), aMemory.GetSize(), OString()); - CPPUNIT_ASSERT(pPdfDocument); - CPPUNIT_ASSERT_EQUAL(1, pPdfDocument->getPageCount()); - std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0); - CPPUNIT_ASSERT(pPdfPage); - CPPUNIT_ASSERT_EQUAL(1, pPdfPage->getObjectCount()); - std::unique_ptr<vcl::pdf::PDFiumTextPage> pPdfTextPage = pPdfPage->getTextPage(); - CPPUNIT_ASSERT(pPdfTextPage); - - std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(0); - OUString sText = pPageObject->getText(pPdfTextPage); - CPPUNIT_ASSERT_EQUAL(OUString("World"), sText); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf140731) -{ - SwDoc* const pDoc = createSwDoc(); - SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtSh); - - pWrtSh->Insert("Lorem"); - - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F3); - Scheduler::ProcessEventsToIdle(); - - // generating a big text with ~60k words and several paragraphs - for (sal_Int32 i = 0; i < 8; ++i) - { - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Copy", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - } - - dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {}); - Scheduler::ProcessEventsToIdle(); - - // Format->Text operations on small selections (which would generate <~500 redlines) - // changetracking still working - dispatchCommand(mxComponent, ".uno:TrackChanges", {}); - Scheduler::ProcessEventsToIdle(); - - SwCursorShell* pShell(pDoc->GetEditShell()); - - pShell->SelectTextModel(1, 500); - - dispatchCommand(mxComponent, ".uno:ChangeCaseToTitleCase", {}); - Scheduler::ProcessEventsToIdle(); - - SwEditShell* const pEditShell(pDoc->GetEditShell()); - CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(120), - pEditShell->GetRedlineCount()); - - //Removing all the redlines. - dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(0), pEditShell->GetRedlineCount()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:ChangeCaseToTitleCase", {}); - Scheduler::ProcessEventsToIdle(); - - // Without the fix in place, on big selections writer would freeze. Now it ignores change tracking. - CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(0), pEditShell->GetRedlineCount()); - - // The patch has no effects on the Format->Text operations - CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Lorem Ipsum Dolor Sit Amet")); - - dispatchCommand(mxComponent, ".uno:ChangeCaseToUpper", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("LOREM IPSUM DOLOR SIT AMET")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf116315) -{ - SwDoc* const pDoc = createSwDoc(); - SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtSh); - - pWrtSh->Insert("This is a test"); - pWrtSh->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 4, /*bBasicCall=*/false); - - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - for (sal_Int32 i = 0; i < 5; ++i) - { - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); - Scheduler::ProcessEventsToIdle(); - - // Title Case - CPPUNIT_ASSERT_EQUAL(OUString("This is a Test"), getParagraph(1)->getString()); - - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); - Scheduler::ProcessEventsToIdle(); - - // Sentence Case - // Without the fix in place, this test would have failed with - // - Expected: This is a Test - // - Actual : This is a TEST - CPPUNIT_ASSERT_EQUAL(OUString("This is a Test"), getParagraph(1)->getString()); - - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); - Scheduler::ProcessEventsToIdle(); - - // Upper Case - CPPUNIT_ASSERT_EQUAL(OUString("This is a TEST"), getParagraph(1)->getString()); - - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); - Scheduler::ProcessEventsToIdle(); - - // Lower Case - CPPUNIT_ASSERT_EQUAL(OUString("This is a test"), getParagraph(1)->getString()); - } -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf144364) -{ - SwDoc* const pDoc = createSwDoc(); - SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtSh); - - // expands autotext (via F3) - pWrtSh->Insert("AR"); - - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F3); - Scheduler::ProcessEventsToIdle(); - - // was ...'letter of <placeholder:"November 21, 2004":"Click placeholder and overwrite">' - CPPUNIT_ASSERT_EQUAL( - OUString("We hereby acknowledge the receipt of your letter of <November 21, 2004>."), - getParagraph(1)->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf141613) -{ - SwDoc* const pDoc = createSwDoc(); - SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtSh); - - pWrtSh->Insert("Test"); - - dispatchCommand(mxComponent, - ".uno:InsertPageHeader?PageStyle:string=Default%20Page%20Style&On:bool=true", - {}); - - uno::Reference<beans::XPropertySet> xPageStyle(getStyles("PageStyles")->getByName("Standard"), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xPageStyle, "HeaderIsOn")); - CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - - CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xPageStyle, "HeaderIsOn")); - CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(1)->getString()); - - // Without the fix in place, this test would have crashed here - dispatchCommand(mxComponent, ".uno:Undo", {}); - CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf107494) -{ - createSwDoc(); - - // Create a graphic object, but don't insert it yet. - uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xTextGraphic( - xFactory->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); - - uno::Reference<text::XTextContent> xTextContent(xTextGraphic, uno::UNO_QUERY); - - uno::Reference<beans::XPropertySet> xPageStyle(getStyles("PageStyles")->getByName("Standard"), - uno::UNO_QUERY); - - xPageStyle->setPropertyValue("HeaderIsOn", uno::Any(true)); - - uno::Reference<text::XText> xHeader( - getProperty<uno::Reference<text::XText>>(xPageStyle, "HeaderText")); - CPPUNIT_ASSERT(xHeader.is()); - uno::Reference<text::XTextCursor> xHeaderCursor(xHeader->createTextCursor()); - - xHeader->insertTextContent(xHeaderCursor, xTextContent, false); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - xPageStyle->setPropertyValue("HeaderIsOn", uno::Any(false)); - - CPPUNIT_ASSERT_EQUAL(0, getShapes()); - - xPageStyle->setPropertyValue("FooterIsOn", uno::Any(true)); - - uno::Reference<text::XText> xFooter( - getProperty<uno::Reference<text::XText>>(xPageStyle, "FooterText")); - CPPUNIT_ASSERT(xFooter.is()); - uno::Reference<text::XTextCursor> xFooterCursor(xFooter->createTextCursor()); - - xTextGraphic.set(xFactory->createInstance("com.sun.star.text.TextGraphicObject"), - uno::UNO_QUERY); - - xTextContent.set(xTextGraphic, uno::UNO_QUERY); - - xFooter->insertTextContent(xFooterCursor, xTextContent, false); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - xPageStyle->setPropertyValue("FooterIsOn", uno::Any(false)); - - CPPUNIT_ASSERT_EQUAL(0, getShapes()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf133358) -{ - SwDoc* const pDoc = createSwDoc(); - SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtSh); - - pWrtSh->Insert("Test"); - - CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(1)->getString()); - - uno::Reference<beans::XPropertyState> xParagraph(getParagraph(1), uno::UNO_QUERY); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xParagraph, "ParaLeftMargin")); - - dispatchCommand(mxComponent, ".uno:IncrementIndent", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(1251), getProperty<sal_Int32>(xParagraph, "ParaLeftMargin")); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xParagraph, "ParaLeftMargin")); - - // Without the fix in place, this test would have crashed here - dispatchCommand(mxComponent, ".uno:Redo", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(1251), getProperty<sal_Int32>(xParagraph, "ParaLeftMargin")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf131771) -{ - createSwDoc(); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - Scheduler::ProcessEventsToIdle(); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); - - uno::Reference<text::XTextTable> xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - - CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xTextTable, "TableTemplateName")); - uno::Reference<beans::XPropertySet> xTableProps(xTextTable, uno::UNO_QUERY_THROW); - xTableProps->setPropertyValue("TableTemplateName", uno::Any(OUString("Default Style"))); - - CPPUNIT_ASSERT_EQUAL(OUString("Default Style"), - getProperty<OUString>(xTextTable, "TableTemplateName")); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - dispatchCommand(mxComponent, ".uno:GoDown", {}); - dispatchCommand(mxComponent, ".uno:Paste", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); - - CPPUNIT_ASSERT_EQUAL(OUString("Default Style"), - getProperty<OUString>(xTextTable, "TableTemplateName")); - - uno::Reference<text::XTextTable> xTextTable2(xIndexAccess->getByIndex(1), uno::UNO_QUERY); - - // Without the fix in place, this test would have failed with - // - Expected: Default Style - // - Actual : - CPPUNIT_ASSERT_EQUAL(OUString("Default Style"), - getProperty<OUString>(xTextTable2, "TableTemplateName")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf80663) -{ - createSwDoc(); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - Scheduler::ProcessEventsToIdle(); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> 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) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf130805.odt"); - - const SwFrameFormats& rFrmFormats = *pDoc->GetSpzFrameFormats(); - CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); - auto pShape = rFrmFormats.front(); - CPPUNIT_ASSERT(pShape); - - SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); - 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_TEST_FIXTURE(SwUiWriterTest3, testTdf107893) -{ - //Open the sample doc - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf107893.odt"); - - //Get the format of the shape - const SwFrameFormats& rFrmFormats = *pDoc->GetSpzFrameFormats(); - CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); - SwFrameFormat* pShape = rFrmFormats.front(); - CPPUNIT_ASSERT(pShape); - - //Add a textbox - SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); - SwFrameFormat* pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); - CPPUNIT_ASSERT(pTxBxFrm); - - //Remove the textbox using Undo - dispatchCommand(mxComponent, ".uno:Undo", {}); - - //Add again - SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); - pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); - - //This was nullptr because of unsuccessful re-adding - CPPUNIT_ASSERT_MESSAGE("Textbox cannot be readd after Undo!", pTxBxFrm); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf121031) -{ - createSwDoc(); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(3)) }, { "Columns", uno::Any(sal_Int32(3)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - Scheduler::ProcessEventsToIdle(); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); - - dispatchCommand(mxComponent, ".uno:DeleteTable", {}); - Scheduler::ProcessEventsToIdle(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); - - // Without the fix in place, the table would be hidden - xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - assertXPath(pXmlDoc, "/root/page[1]/body/tab", 1); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, TestTextBoxCrashAfterLineDel) -{ - // Open the desired file - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "txbx_crash.odt"); - - // Get the format of the shape - const SwFrameFormats& rFrmFormats = *pDoc->GetSpzFrameFormats(); - CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); - SwFrameFormat* pShape = rFrmFormats.front(); - CPPUNIT_ASSERT(pShape); - - // Add a textbox - SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); - SwFrameFormat* pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); - CPPUNIT_ASSERT(pTxBxFrm); - - // remove the last paragraph - auto xCursor = getParagraph(1)->getText()->createTextCursor(); - xCursor->gotoEnd(false); - xCursor->goLeft(3, true); - - // This caused crash before, now it should pass with the patch. - xCursor->setString(OUString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf121546) -{ - createSwDoc(DATA_DIRECTORY, "tdf121546.odt"); - - CPPUNIT_ASSERT_EQUAL(OUString("xxxxxxxxxxxxxxxxxxxx"), getParagraph(2)->getString()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Cut", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); - - // Create a new document - createSwDoc(); - - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString("xxxxxxxxxxxxxxxxxxxx"), getParagraph(2)->getString()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Cut", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString("xxxxxxxxxxxxxxxxxxxx"), getParagraph(2)->getString()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - // Without the fix in place, this test would have crashed here - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf145621) -{ - createSwDoc(DATA_DIRECTORY, "tdf145621.odt"); - - CPPUNIT_ASSERT_EQUAL(OUString("AAAAAA"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - - dispatchCommand(mxComponent, ".uno:Cut", {}); - - CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); - - // Without the fix in place, this test would have crashed - dispatchCommand(mxComponent, ".uno:Paste", {}); - - CPPUNIT_ASSERT_EQUAL(OUString("AAAAAA"), getParagraph(1)->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf134626) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf134626.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - CPPUNIT_ASSERT_EQUAL(OUString("Apple"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - - rtl::Reference<SwTransferable> xTransfer = new SwTransferable(*pWrtShell); - xTransfer->Copy(); - Scheduler::ProcessEventsToIdle(); - TransferableDataHelper aHelper(xTransfer); - - // Create a new document - pDoc = createSwDoc(); - pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - CPPUNIT_ASSERT(pWrtShell); - - // Without the fix in place, this test would have crashed here - for (sal_Int32 i = 0; i < 5; ++i) - { - SwTransferable::Paste(*pWrtShell, aHelper); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString("Apple"), getParagraph(1)->getString()); - - SwTransferable::Paste(*pWrtShell, aHelper); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString("AppleApple"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString("Apple"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); - } -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf139566) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtSh = pDoc->GetDocShell()->GetWrtShell(); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(1)) }, { "Columns", uno::Any(sal_Int32(1)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - Scheduler::ProcessEventsToIdle(); - - // Move the cursor outside the table - pWrtSh->Down(/*bSelect=*/false); - - pWrtSh->Insert("Test"); - - CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(2)->getString()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - Scheduler::ProcessEventsToIdle(); - - uno::Reference<frame::XFrames> xFrames = mxDesktop->getFrames(); - sal_Int32 nFrames = xFrames->getCount(); - - // Create a second window so the first window looses focus - dispatchCommand(mxComponent, ".uno:NewWindow", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(nFrames + 1, xFrames->getCount()); - - dispatchCommand(mxComponent, ".uno:CloseWin", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(nFrames, xFrames->getCount()); - - uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xSelections(xModel->getCurrentSelection(), - uno::UNO_QUERY); - - // Without the fix in place, this test would have failed here - CPPUNIT_ASSERT(xSelections.is()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf96067) -{ - createSwDoc(); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(3)) }, { "Columns", uno::Any(sal_Int32(3)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - Scheduler::ProcessEventsToIdle(); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> 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) -{ - createSwDoc(); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(1)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> 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<text::XTextRange> xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - xCellA1->setString("test1"); - - uno::Reference<text::XTextRange> 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, testTdf39828) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf39828.fodt"); - - // show changes - pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::ShowDelete - | RedlineFlags::ShowInsert); - CPPUNIT_ASSERT_MESSAGE("redlining should be off", - !pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - CPPUNIT_ASSERT_MESSAGE( - "redlines should be visible", - IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); - - uno::Reference<text::XTextRange> xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - // deleted "1", inserted "2" - CPPUNIT_ASSERT_EQUAL(OUString("12"), xCellA1->getString()); - uno::Reference<text::XTextRange> xCellA3(xTextTable->getCellByName("A3"), uno::UNO_QUERY); - // This was 14 (bad sum: 2 + A1, where A1 was 12 instead of the correct 2) - CPPUNIT_ASSERT_EQUAL(OUString("4"), xCellA3->getString()); - uno::Reference<text::XTextRange> xCellA4(xTextTable->getCellByName("A4"), uno::UNO_QUERY); - // This was 28 (bad sum: 2 + A1 + A3, where A1 was 12 and A3 was 14) - CPPUNIT_ASSERT_EQUAL(OUString("8"), xCellA4->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf146573) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf39828.fodt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - // remove redlines, add a footnote, and change the value - // of the cell with the footnote - dispatchCommand(mxComponent, ".uno:AcceptAllTrackedChanges", {}); - Scheduler::ProcessEventsToIdle(); - pWrtShell->Right(SwCursorSkipMode::Cells, /*bSelect=*/false, /*nCount=*/1, - /*bBasicCall=*/false); - dispatchCommand(mxComponent, ".uno:InsertFootnote", {}); - dispatchCommand(mxComponent, ".uno:PageUp", {}); // leave footnote - pWrtShell->Left(SwCursorSkipMode::Cells, /*bSelect=*/false, /*nCount=*/1, /*bBasicCall=*/false); - pWrtShell->Left(SwCursorSkipMode::Cells, /*bSelect=*/true, /*nCount=*/1, /*bBasicCall=*/false); - pWrtShell->Insert("100"); - - // trigger recalculation by leaving the cell - pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); - - uno::Reference<text::XTextRange> xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - // value "100" and footnote index "1" - CPPUNIT_ASSERT_EQUAL(OUString("1001"), xCellA1->getString()); - uno::Reference<text::XTextRange> xCellA3(xTextTable->getCellByName("A3"), uno::UNO_QUERY); - // This was 4 (missing recalculation) - CPPUNIT_ASSERT_EQUAL(OUString("102"), xCellA3->getString()); - uno::Reference<text::XTextRange> xCellA4(xTextTable->getCellByName("A4"), uno::UNO_QUERY); - // This was 8 (missing recalculation) - CPPUNIT_ASSERT_EQUAL(OUString("204"), xCellA4->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf148849) -{ - // load a document with a table and an empty paragraph before the table - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf148849.fodt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - // record changes - pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete - | RedlineFlags::ShowInsert); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - // hide changes - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); - - // put cursor in the first table row - pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); - - // delete a table row - pWrtShell->DeleteRow(); - - // check cursor position - - // This was "", because the text cursor jumped to the start of the document - // after deleting a table row instead of remaining in the next table row - SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode.GetTextNode()->GetText()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf150576) -{ - // load a document with a table and an empty paragraph before the table - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf148849.fodt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - // record changes - pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete - | RedlineFlags::ShowInsert); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - // hide changes - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); - - // Check deletion of the first row, if the second row deleted already - - // put cursor in the second table row - pWrtShell->Down(/*bSelect=*/false, /*nCount=*/2); - SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode.GetTextNode()->GetText()); - - // delete the second table row - pWrtShell->DeleteRow(); - - // check cursor position (row 3) - SwNode& rNode2 = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode2.GetTextNode()->GetText()); - - // put cursor in the first row - pWrtShell->Up(/*bSelect=*/false, /*nCount=*/1); - SwNode& rNode3 = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("12"), rNode3.GetTextNode()->GetText()); - - // delete the first row - pWrtShell->DeleteRow(); - - // This was empty (cursor jumped in the start of the document instead of - // the next not deleted row) - SwNode& rNode4 = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode4.GetTextNode()->GetText()); - - // Check skipping previous lines - - // restore deleted rows - dispatchCommand(mxComponent, ".uno:Undo", {}); - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - SwNode& rNode5 = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode5.GetTextNode()->GetText()); - - // delete the second row - pWrtShell->DeleteRow(); - SwNode& rNode7 = pWrtShell->GetCursor()->GetPoint()->GetNode(); - CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode7.GetTextNode()->GetText()); - - // delete the third, i.e. last row - pWrtShell->DeleteRow(); - SwNode& rNode8 = pWrtShell->GetCursor()->GetPoint()->GetNode(); - - // This was empty (cursor jumped in the start of the document instead of - // the previous not deleted row) - CPPUNIT_ASSERT_EQUAL(OUString("12"), rNode8.GetTextNode()->GetText()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf132603) -{ - createSwDoc(); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - uno::Sequence<beans::PropertyValue> aPropertyValues - = comphelper::InitPropertySequence({ { "Text", uno::Any(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(); - - tools::JsonWriter aJsonWriter; - pTextDoc->getPostIts(aJsonWriter); - char* pChar = aJsonWriter.extractData(); - std::stringstream aStream(pChar); - free(pChar); - 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<std::string>("text").c_str()); - CPPUNIT_ASSERT_EQUAL(OString("Comment"), aText); - } -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf117601) -{ - createSwDoc(); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence( - { { "Rows", uno::Any(sal_Int32(5)) }, { "Columns", uno::Any(sal_Int32(3)) } })); - - dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); - Scheduler::ProcessEventsToIdle(); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> 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<text::XTextRange> xCellB1(xTextTable->getCellByName("B1"), uno::UNO_QUERY); - xCellB1->setString("test1"); - - uno::Reference<text::XTextRange> 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, testTdf138130) -{ - createSwDoc(DATA_DIRECTORY, "tdf138130.docx"); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - uno::Reference<drawing::XShape> xShape = getShape(1); - - awt::Point aPos = xShape->getPosition(); - - //select shape and change the anchor - dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); - Scheduler::ProcessEventsToIdle(); - - // Without the fix in place, this test would have crashed here - dispatchCommand(mxComponent, ".uno:SetAnchorToPage", {}); - Scheduler::ProcessEventsToIdle(); - - //position has changed - CPPUNIT_ASSERT(aPos.X < xShape->getPosition().X); - CPPUNIT_ASSERT(aPos.Y < xShape->getPosition().Y); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(aPos.X, xShape->getPosition().X); - CPPUNIT_ASSERT_EQUAL(aPos.Y, xShape->getPosition().Y); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf136385) -{ - createSwDoc(DATA_DIRECTORY, "tdf136385.odt"); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - uno::Reference<drawing::XShape> xShape = getShape(1); - - awt::Point aPos = xShape->getPosition(); - - //select shape and change the anchor - dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:SetAnchorToPage", {}); - Scheduler::ProcessEventsToIdle(); - - //position has changed - CPPUNIT_ASSERT(aPos.X < xShape->getPosition().X); - CPPUNIT_ASSERT(aPos.Y < xShape->getPosition().Y); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - //Without the fix in place, this test would have failed with - //- Expected: 2447 - //- Actual : 446 - CPPUNIT_ASSERT_EQUAL(aPos.X, xShape->getPosition().X); - CPPUNIT_ASSERT_EQUAL(aPos.Y, xShape->getPosition().Y); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf145207) -{ - createSwDoc(DATA_DIRECTORY, "tdf145207.odt"); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - CPPUNIT_ASSERT_EQUAL(1, getPages()); - CPPUNIT_ASSERT_EQUAL(3, getShapes()); - - //select one shape and use the TAB key to iterate over the different shapes - dispatchCommand(mxComponent, ".uno:JumpToNextFrame", {}); - Scheduler::ProcessEventsToIdle(); - - for (sal_Int32 i = 0; i < 10; ++i) - { - // Without the fix in place, this test would have crashed here - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); - Scheduler::ProcessEventsToIdle(); - } -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf128782) -{ - createSwDoc(DATA_DIRECTORY, "tdf128782.odt"); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - CPPUNIT_ASSERT_EQUAL(2, getShapes()); - uno::Reference<drawing::XShape> xShape1 = getShape(1); - uno::Reference<drawing::XShape> 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) -{ - createSwDoc(DATA_DIRECTORY, "tdf135623.docx"); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - CPPUNIT_ASSERT_EQUAL(2, getShapes()); - CPPUNIT_ASSERT_EQUAL(2, getPages()); - - uno::Reference<drawing::XShape> xShape1 = getShape(1); - uno::Reference<drawing::XShape> 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) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf133490.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - - rtl::Reference<SwTransferable> xTransfer = new SwTransferable(*pWrtShell); - xTransfer->Cut(); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(0, getShapes()); - - TransferableDataHelper aHelper(xTransfer); - SwTransferable::Paste(*pWrtShell, aHelper); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - SwTransferable::Paste(*pWrtShell, aHelper); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(2, getShapes()); - - uno::Reference<drawing::XShape> xShape1 = getShape(1); - uno::Reference<drawing::XShape> 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) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf132637_protectTrackChanges.doc"); - - // The password should only prevent turning off track changes, not open as read-only - CPPUNIT_ASSERT(!pDoc->GetDocShell()->IsReadOnly()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf127652) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf127652.odt"); - SwWrtShell* const pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - // get a page cursor - uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY); - uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier( - xModel->getCurrentController(), uno::UNO_QUERY); - uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), - uno::UNO_QUERY); - - // go to the start of page 4 - xCursor->jumpToPage(4); - xCursor->jumpToStartOfPage(); - - // mark a section that overlaps multiple pages - pWrtShell->Down(false, 2); - pWrtShell->Up(true, 5); - - // delete the marked section - pWrtShell->DelRight(); - - // go to the start of page 4 - xCursor->jumpToPage(4); - xCursor->jumpToStartOfPage(); - - // move up to page 3 - pWrtShell->Up(false, 5); - - // check that we are on the third page - // in the bug one issue was that the cursor was placed incorrectly, so - // moving up to the previous page would not work any more - sal_uInt16 assertPage = 3; - SwCursorShell* pShell(pDoc->GetEditShell()); - sal_uInt16 currentPage = pShell->GetPageNumSeqNonEmpty(); - CPPUNIT_ASSERT_EQUAL_MESSAGE("We are on the wrong page!", assertPage, currentPage); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, AtPageTextBoxCrash) -{ - // Load sample file - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "AtPageTextBoxCrash.odt"); - - // Get the format of the shape - const SwFrameFormats& rFrmFormats = *pDoc->GetSpzFrameFormats(); - CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); - auto pShape = rFrmFormats.front(); - CPPUNIT_ASSERT(pShape); - - // Add a textbox to the shape - SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); - auto pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); - CPPUNIT_ASSERT(pTxBxFrm); - - // Change its anchor to page - uno::Reference<beans::XPropertySet> xShpProps(getShape(1), uno::UNO_QUERY_THROW); - xShpProps->setPropertyValue( - "AnchorType", uno::Any(text::TextContentAnchorType::TextContentAnchorType_AT_PAGE)); - - // The page anchored objects must not have content anchor - // unless this will lead to crash later, for example on - // removing the paragraph where it is anchored to... - CPPUNIT_ASSERT_EQUAL(RndStdIds::FLY_AT_PAGE, pTxBxFrm->GetAnchor().GetAnchorId()); - CPPUNIT_ASSERT(!pTxBxFrm->GetAnchor().GetContentAnchor()); - - // Remove the paragraph where the textframe should be anchored - // before. Now with the patch it must not crash... - auto xPara = getParagraph(1); - xPara->getText()->setString(OUString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf135661) -{ - createSwDoc(DATA_DIRECTORY, "tdf135661.odt"); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - uno::Reference<drawing::XShape> xShape(getShape(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3424), xShape->getPosition().X); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1545), xShape->getPosition().Y); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:Cut", {}); - - CPPUNIT_ASSERT_EQUAL(0, getShapes()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - - xShape.set(getShape(1), uno::UNO_QUERY); - - //Without the fix in place, the shape position would have been 0,0 - CPPUNIT_ASSERT_EQUAL(sal_Int32(3424), xShape->getPosition().X); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1545), xShape->getPosition().Y); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf133477) -{ - if (getDefaultDeviceBitCount() < 24) - return; - createSwDoc(DATA_DIRECTORY, "tdf133477.fodt"); - - // Save the shape to a BMP. - uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter - = drawing::GraphicExportFilter::create(mxComponentContext); - uno::Reference<lang::XComponent> xSourceDoc(getShape(1), uno::UNO_QUERY); - xGraphicExporter->setSourceDocument(xSourceDoc); - - SvMemoryStream aStream; - uno::Reference<io::XOutputStream> xOutputStream(new utl::OStreamWrapper(aStream)); - uno::Sequence<beans::PropertyValue> aDescriptor( - comphelper::InitPropertySequence({ { "OutputStream", uno::Any(xOutputStream) }, - { "FilterName", uno::Any(OUString("BMP")) } })); - xGraphicExporter->filter(aDescriptor); - aStream.Seek(STREAM_SEEK_TO_BEGIN); - - // Read it back and check the color of the first pixel. - // (Actually check at one-pixel offset, because imprecise shape positioning may - // result in blending with background for the first pixel). - Graphic aGraphic; - TypeSerializer aSerializer(aStream); - aSerializer.readGraphic(aGraphic); - - BitmapEx aBitmap = aGraphic.GetBitmapEx(); - CPPUNIT_ASSERT_EQUAL(Color(0, 102, 204), aBitmap.GetPixelColor(1, 1)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf137964) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf137964.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - - CPPUNIT_ASSERT_EQUAL(1, getShapes()); - uno::Reference<drawing::XShape> xShape(getShape(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3579), xShape->getPosition().X); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4090), xShape->getPosition().Y); - - SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); - SdrObject* pObject = pPage->GetObj(1); - SwContact* pTextBox = static_cast<SwContact*>(pObject->GetUserCall()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_FLYFRMFMT), pTextBox->GetFormat()->Which()); - - pWrtShell->SelectObj(Point(), 0, pObject); - - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_UP); - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_LEFT); - Scheduler::ProcessEventsToIdle(); - - // Without the fix in place, the shape would have stayed where it was - CPPUNIT_ASSERT_EQUAL(sal_Int32(2579), xShape->getPosition().X); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3090), xShape->getPosition().Y); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf143244) -{ - createSwDoc(DATA_DIRECTORY, "tdf143244.odt"); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); - - uno::Reference<text::XTextRange> xCell(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0x009353), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A5"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A6"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xbee3d3), getProperty<Color>(xCell, "BackColor")); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:Cut", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); - - dispatchCommand(mxComponent, ".uno:Paste", {}); - - xTextTable.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); - - dispatchCommand(mxComponent, ".uno:GoUp", {}); - - SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); - for (sal_Int32 i = 0; i < 6; ++i) - { - pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); - Scheduler::ProcessEventsToIdle(); - } - - for (sal_Int32 i = 0; i < 5; ++i) - { - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - } - - xTextTable.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); - - for (sal_Int32 i = 0; i < 5; ++i) - { - dispatchCommand(mxComponent, ".uno:Redo", {}); - Scheduler::ProcessEventsToIdle(); - } - - xTextTable.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(9), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); - - xCell.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0x009353), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A5"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A6"), uno::UNO_QUERY); - - // Without the fix in place, this test would have failed with - // - Expected: Color: R:255 G:255 B:255 A:255 - // - Actual : Color: R:190 G:227 B:211 A:0 - CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A7"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A8"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty<Color>(xCell, "BackColor")); - - xCell.set(xTextTable->getCellByName("A9"), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(Color(0xbee3d3), getProperty<Color>(xCell, "BackColor")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf136715) -{ - createSwDoc(DATA_DIRECTORY, "tdf136715.odt"); - - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); - - uno::Reference<text::XTextRange> xCell(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); - uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); - uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xPara, "CharWeight")); - - dispatchCommand(mxComponent, ".uno:GoDown", {}); - dispatchCommand(mxComponent, ".uno:GoDown", {}); - dispatchCommand(mxComponent, ".uno:LineDownSel", {}); - dispatchCommand(mxComponent, ".uno:DeleteRows", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); - - xCell.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xPara, "CharWeight")); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); - - xCell.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - - // Without the fix in place, this test would have failed with - // - Expected: 100 - // - Actual : 150 - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xPara, "CharWeight")); - - xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); - xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); - xParaEnum.set(xParaEnumAccess->createEnumeration()); - xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xPara, "CharWeight")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf138897) -{ - createSwDoc(DATA_DIRECTORY, "tdf100018-1.odt"); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:Cut", {}); - dispatchCommand(mxComponent, ".uno:Paste", {}); - // this was crashing - dispatchCommand(mxComponent, ".uno:Undo", {}); - dispatchCommand(mxComponent, ".uno:Redo", {}); - dispatchCommand(mxComponent, ".uno:Undo", {}); - dispatchCommand(mxComponent, ".uno:Redo", {}); - Scheduler::ProcessEventsToIdle(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf136740) -{ - createSwDoc(); - css::uno::Reference<css::lang::XMultiServiceFactory> xFact(mxComponent, - css::uno::UNO_QUERY_THROW); - css::uno::Reference<css::beans::XPropertySet> xTextDefaults( - xFact->createInstance("com.sun.star.text.Defaults"), css::uno::UNO_QUERY_THROW); - const css::uno::Any aOrig = xTextDefaults->getPropertyValue("TabStopDistance"); - sal_Int32 nDefTab = aOrig.get<sal_Int32>(); - CPPUNIT_ASSERT(nDefTab != 0); - - css::uno::Reference<css::text::XTextRange> const xParagraph(getParagraphOrTable(1), - css::uno::UNO_QUERY_THROW); - xParagraph->setString("Foo"); - - CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); - CPPUNIT_ASSERT_EQUAL(OUString("Foo"), xParagraph->getString()); - - dispatchCommand(mxComponent, ".uno:SelectAll", {}); - dispatchCommand(mxComponent, ".uno:Copy", {}); - dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {}); - - const css::uno::Any aNew(nDefTab * 2); - xTextDefaults->setPropertyValue("TabStopDistance", aNew); - // it may become slightly different because of conversions, so get the actual value - const css::uno::Any aNewCorrected = xTextDefaults->getPropertyValue("TabStopDistance"); - CPPUNIT_ASSERT_DOUBLES_EQUAL(nDefTab * 2, aNewCorrected.get<sal_Int32>(), 1); - - // Paste special as RTF - const auto aPropertyValues = comphelper::InitPropertySequence( - { { "SelectedFormat", - css::uno::Any(static_cast<sal_uInt32>(SotClipboardFormatId::RTF)) } }); - dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aPropertyValues); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); - CPPUNIT_ASSERT_EQUAL(OUString("FooFoo"), xParagraph->getString()); - - // Without the fix in place, this would fail with - // equality assertion failed - // - Expected: <Any: (long) 2501> - // - Actual : <Any: (long) 1251> - // i.e., pasting RTF would reset the modified default tab stop distance to hardcoded default - CPPUNIT_ASSERT_EQUAL(aNewCorrected, xTextDefaults->getPropertyValue("TabStopDistance")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf128106) -{ - SwWrtShell* pWrtShell - = createSwDoc(DATA_DIRECTORY, "cross_reference_demo_bmk.odt")->GetDocShell()->GetWrtShell(); - - utl::TempFile tempDir(nullptr, true); - - const auto aPropertyValues = comphelper::InitPropertySequence( - { { "FileName", css::uno::Any(tempDir.GetURL() + "/test.odm") } }); - dispatchCommand(mxComponent, ".uno:NewGlobalDoc", aPropertyValues); - - // new document now! - mxComponent.set(pWrtShell->GetDoc()->GetDocShell()->GetModel()); - CPPUNIT_ASSERT(mxComponent.is()); - - SwDoc* const pMasterDoc(pWrtShell->GetDoc()); - CPPUNIT_ASSERT_EQUAL( - size_t(2), - pMasterDoc->getIDocumentLinksAdministration().GetLinkManager().GetLinks().size()); - // no way to set SwDocShell::m_nUpdateDocMode away from NO_UPDATE ? - // pMasterDoc->getIDocumentLinksAdministration().UpdateLinks(); - pMasterDoc->getIDocumentLinksAdministration().GetLinkManager().UpdateAllLinks(false, false, - nullptr); - // note: this has called SwGetRefFieldType::UpdateGetReferences() - SwFieldType const* const pType( - pMasterDoc->getIDocumentFieldsAccess().GetSysFieldType(SwFieldIds::GetRef)); - std::vector<SwFormatField*> fields; - pType->GatherFields(fields); - CPPUNIT_ASSERT_EQUAL(size_t(6), fields.size()); - std::sort(fields.begin(), fields.end(), [](auto const* const pA, auto const* const pB) { - SwTextField const* const pHintA(pA->GetTextField()); - SwTextField const* const pHintB(pB->GetTextField()); - // in this document: only 1 field per node - CPPUNIT_ASSERT(pA == pB || &pHintA->GetTextNode() != &pHintB->GetTextNode()); - return pHintA->GetTextNode().GetIndex() < pHintB->GetTextNode().GetIndex(); - }); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[0]->GetField()->GetSubType()); - CPPUNIT_ASSERT_EQUAL(OUString("bookmarkchapter1_text"), - static_cast<SwGetRefField const*>(fields[0]->GetField())->GetSetRefName()); - CPPUNIT_ASSERT_EQUAL(OUString("Text"), - static_cast<SwGetRefField const*>(fields[0]->GetField()) - ->GetExpandedTextOfReferencedTextNode(*pWrtShell->GetLayout())); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[1]->GetField()->GetSubType()); - CPPUNIT_ASSERT( - static_cast<SwGetRefField const*>(fields[1]->GetField())->IsRefToHeadingCrossRefBookmark()); - CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), - static_cast<SwGetRefField const*>(fields[1]->GetField())->GetPar2()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[2]->GetField()->GetSubType()); - CPPUNIT_ASSERT_EQUAL(OUString("Bookmarkchapter1"), - static_cast<SwGetRefField const*>(fields[2]->GetField())->GetSetRefName()); - CPPUNIT_ASSERT_EQUAL(OUString("Chapter 1"), - static_cast<SwGetRefField const*>(fields[2]->GetField())->GetPar2()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[3]->GetField()->GetSubType()); - CPPUNIT_ASSERT_EQUAL(OUString("bookmarkchapter1_text"), - static_cast<SwGetRefField const*>(fields[3]->GetField())->GetSetRefName()); - CPPUNIT_ASSERT_EQUAL(OUString("Text"), - static_cast<SwGetRefField const*>(fields[3]->GetField())->GetPar2()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[4]->GetField()->GetSubType()); - CPPUNIT_ASSERT( - static_cast<SwGetRefField const*>(fields[4]->GetField())->IsRefToHeadingCrossRefBookmark()); - CPPUNIT_ASSERT_EQUAL(OUString("Chapter 1.1"), - static_cast<SwGetRefField const*>(fields[4]->GetField())->GetPar2()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[5]->GetField()->GetSubType()); - CPPUNIT_ASSERT( - static_cast<SwGetRefField const*>(fields[5]->GetField())->IsRefToHeadingCrossRefBookmark()); - CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), - static_cast<SwGetRefField const*>(fields[5]->GetField())->GetPar2()); - - tempDir.EnableKillingFile(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf103612) -{ - SwDoc* const pGlobalDoc = createSwDoc(DATA_DIRECTORY, "DUMMY.odm"); - CPPUNIT_ASSERT_EQUAL( - size_t(1), - pGlobalDoc->getIDocumentLinksAdministration().GetLinkManager().GetLinks().size()); - pGlobalDoc->getIDocumentLinksAdministration().GetLinkManager().UpdateAllLinks(false, false, - nullptr); - - xmlDocUniquePtr pLayout = parseLayoutDump(); - - assertXPath(pLayout, "/root/page[1]/body/section[1]/txt[1]/LineBreak[1]", "Line", - "Text before section"); - // the inner section and its content was hidden - assertXPath(pLayout, "/root/page[1]/body/section[2]/txt[1]/LineBreak[1]", "Line", - "Text inside section before ToC"); ... etc. - the rest is truncated
