From 31eca81bd03f012f0581480dd6f581a0185e3ff5 Mon Sep 17 00:00:00 2001 From: Xisco Fauli Date: Tue, 15 Mar 2022 18:20:52 +0100 Subject: [PATCH] sw: split CppunitTest_sw_uiwriter into uiwriter and uiwriter7 Similar to a2a2e07996a0e49164663eaec5d79481bf7bb3e0 "sw: split CppunitTest_sw_uiwriter2 into uiwriter2 and uiwriter5" it already had 117 tests Change-Id: I6bcdcd672c655b853f8f366db3b78d3da49f9078 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131635 Tested-by: Jenkins Reviewed-by: Xisco Fauli --- sw/CppunitTest_sw_uiwriter7.mk | 14 + sw/Module_sw.mk | 1 + sw/qa/extras/uiwriter/uiwriter.cxx | 2612 +------------------------ sw/qa/extras/uiwriter/uiwriter7.cxx | 2777 +++++++++++++++++++++++++++ 4 files changed, 2793 insertions(+), 2611 deletions(-) create mode 100644 sw/CppunitTest_sw_uiwriter7.mk create mode 100644 sw/qa/extras/uiwriter/uiwriter7.cxx diff --git a/sw/CppunitTest_sw_uiwriter7.mk b/sw/CppunitTest_sw_uiwriter7.mk new file mode 100644 index 000000000000..0bfd3a3528ce --- /dev/null +++ b/sw/CppunitTest_sw_uiwriter7.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,7)) + +# vim: set noet sw=4 ts=4: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index d64de370ea74..fd5b7024cc50 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -113,6 +113,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_uiwriter4 \ CppunitTest_sw_uiwriter5 \ CppunitTest_sw_uiwriter6 \ + CppunitTest_sw_uiwriter7 \ CppunitTest_sw_layoutwriter \ CppunitTest_sw_layoutwriter2 \ CppunitTest_sw_mailmerge \ diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 0d872d4e958f..d6d486919bcf 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -30,10 +30,7 @@ #include #include #include -#include -#include #include -#include #include #include @@ -42,81 +39,30 @@ #include #include -#include -#include #include -#include #include -#include -#include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include #include -#include -#include #include #include -#include #include -#include -#include #include -#include #include #include #include -#include -#include #include +#include #include -#include namespace { constexpr OUStringLiteral DATA_DIRECTORY = u"/sw/qa/extras/uiwriter/data/"; -int CountFilesInDirectory(const OUString &rURL) -{ - int nRet = 0; - - osl::Directory aDir(rURL); - CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, aDir.open()); - - osl::DirectoryItem aItem; - osl::FileStatus aFileStatus(osl_FileStatus_Mask_FileURL|osl_FileStatus_Mask_Type); - while (aDir.getNextItem(aItem) == osl::FileBase::E_None) - { - aItem.getFileStatus(aFileStatus); - if (aFileStatus.getFileType() != osl::FileStatus::Directory) - ++nRet; - } - - return nRet; -} - void lcl_selectCharacters(SwPaM& rPaM, sal_Int32 first, sal_Int32 end) { rPaM.GetPoint()->nContent.Assign(rPaM.GetContentNode(), first); @@ -1730,2562 +1676,6 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf81995) } } -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testExportToPicture) -{ - createSwDoc(); - uno::Sequence aFilterData( comphelper::InitPropertySequence({ - { "PixelWidth", uno::Any(sal_Int32(610)) }, - { "PixelHeight", uno::Any(sal_Int32(610)) } - })); - uno::Sequence aDescriptor( comphelper::InitPropertySequence({ - { "FilterName", uno::Any(OUString("writer_png_Export")) }, - { "FilterData", uno::Any(aFilterData) } - })); - utl::TempFile aTempFile; - uno::Reference xStorable(mxComponent, uno::UNO_QUERY); - xStorable->storeToURL(aTempFile.GetURL(), aDescriptor); - bool extchk = aTempFile.IsValid(); - CPPUNIT_ASSERT_EQUAL(true, extchk); - osl::File tmpFile(aTempFile.GetURL()); - tmpFile.open(sal_uInt32(osl_File_OpenFlag_Read)); - sal_uInt64 val; - CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, tmpFile.getSize(val)); - CPPUNIT_ASSERT(val > 100); - aTempFile.EnableKillingFile(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf77340) -{ - createSwDoc(); - //Getting some paragraph style in our document - uno::Reference xFactory(mxComponent, uno::UNO_QUERY); - uno::Reference xStyle(xFactory->createInstance("com.sun.star.style.ParagraphStyle"), uno::UNO_QUERY); - uno::Reference xPropSet(xStyle, uno::UNO_QUERY_THROW); - xPropSet->setPropertyValue("ParaBackColor", uno::makeAny(sal_Int32(0xFF00FF))); - uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference xNameAccess(xSupplier->getStyleFamilies()); - uno::Reference xNameCont; - xNameAccess->getByName("ParagraphStyles") >>= xNameCont; - xNameCont->insertByName("myStyle", uno::makeAny(xStyle)); - CPPUNIT_ASSERT_EQUAL(OUString("myStyle"), xStyle->getName()); - //Setting the properties with proper values - xPropSet->setPropertyValue("PageDescName", uno::makeAny(OUString("First Page"))); - xPropSet->setPropertyValue("PageNumberOffset", uno::makeAny(sal_Int16(3))); - //Getting the properties and checking that they have proper values - CPPUNIT_ASSERT_EQUAL(uno::makeAny(OUString("First Page")), xPropSet->getPropertyValue("PageDescName")); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_Int16(3)), xPropSet->getPropertyValue("PageNumberOffset")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf79236) -{ - SwDoc* pDoc = createSwDoc(); - sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); - //Getting some paragraph style - SwTextFormatColl* pTextFormat = pDoc->FindTextFormatCollByName(u"Text Body"); - const SwAttrSet& rAttrSet = pTextFormat->GetAttrSet(); - std::unique_ptr pNewSet = rAttrSet.Clone(); - sal_uInt16 initialCount = pNewSet->Count(); - SvxAdjustItem AdjustItem = rAttrSet.GetAdjust(); - SvxAdjust initialAdjust = AdjustItem.GetAdjust(); - //By default the adjust is LEFT - CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, initialAdjust); - //Changing the adjust to RIGHT - AdjustItem.SetAdjust(SvxAdjust::Right); - //Checking whether the change is made or not - SvxAdjust modifiedAdjust = AdjustItem.GetAdjust(); - CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, modifiedAdjust); - //Modifying the itemset, putting *one* item - pNewSet->Put(AdjustItem); - //The count should increment by 1 - sal_uInt16 modifiedCount = pNewSet->Count(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(initialCount + 1), modifiedCount); - //Setting the updated item set on the style - pDoc->ChgFormat(*pTextFormat, *pNewSet); - //Checking the Changes - SwTextFormatColl* pTextFormat2 = pDoc->FindTextFormatCollByName(u"Text Body"); - const SwAttrSet& rAttrSet2 = pTextFormat2->GetAttrSet(); - const SvxAdjustItem& rAdjustItem2 = rAttrSet2.GetAdjust(); - SvxAdjust Adjust2 = rAdjustItem2.GetAdjust(); - //The adjust should be RIGHT as per the modifications made - CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, Adjust2); - //Undo the changes - rUndoManager.Undo(); - SwTextFormatColl* pTextFormat3 = pDoc->FindTextFormatCollByName(u"Text Body"); - const SwAttrSet& rAttrSet3 = pTextFormat3->GetAttrSet(); - const SvxAdjustItem& rAdjustItem3 = rAttrSet3.GetAdjust(); - SvxAdjust Adjust3 = rAdjustItem3.GetAdjust(); - //The adjust should be back to default, LEFT - CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, Adjust3); - //Redo the changes - rUndoManager.Redo(); - SwTextFormatColl* pTextFormat4 = pDoc->FindTextFormatCollByName(u"Text Body"); - const SwAttrSet& rAttrSet4 = pTextFormat4->GetAttrSet(); - const SvxAdjustItem& rAdjustItem4 = rAttrSet4.GetAdjust(); - SvxAdjust Adjust4 = rAdjustItem4.GetAdjust(); - //The adjust should be RIGHT as per the modifications made - CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, Adjust4); - //Undo the changes - rUndoManager.Undo(); - SwTextFormatColl* pTextFormat5 = pDoc->FindTextFormatCollByName(u"Text Body"); - const SwAttrSet& rAttrSet5 = pTextFormat5->GetAttrSet(); - const SvxAdjustItem& rAdjustItem5 = rAttrSet5.GetAdjust(); - SvxAdjust Adjust5 = rAdjustItem5.GetAdjust(); - //The adjust should be back to default, LEFT - CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, Adjust5); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTextSearch) -{ - // Create a new empty Writer document - SwDoc* pDoc = createSwDoc(); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations()); - // Insert some text - rIDCO.InsertString(*pCursor, "Hello World This is a test"); - // Use cursor to select part of text - for (int i = 0; i < 10; i++) { - pCursor->Move(fnMoveBackward); - } - pCursor->SetMark(); - for(int i = 0; i < 4; i++) { - pCursor->Move(fnMoveBackward); - } - //Checking that the proper selection is made - CPPUNIT_ASSERT_EQUAL(OUString("This"), pCursor->GetText()); - // Apply a "Bold" attribute to selection - SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); - rIDCO.InsertPoolItem(*pCursor, aWeightItem); - //making another selection of text - for (int i = 0; i < 7; i++) { - pCursor->Move(fnMoveBackward); - } - pCursor->SetMark(); - for(int i = 0; i < 5; i++) { - pCursor->Move(fnMoveBackward); - } - //Checking that the proper selection is made - CPPUNIT_ASSERT_EQUAL(OUString("Hello"), pCursor->GetText()); - // Apply a "Bold" attribute to selection - rIDCO.InsertPoolItem(*pCursor, aWeightItem); - //Performing Search Operation and also covering the UNO coverage for setProperty - uno::Reference xSearch(mxComponent, uno::UNO_QUERY); - uno::Reference xSearchDes = xSearch->createSearchDescriptor(); - uno::Reference xProp(xSearchDes, uno::UNO_QUERY); - //setting some properties - uno::Sequence aDescriptor( comphelper::InitPropertySequence({ - { "CharWeight", uno::Any(float(css::awt::FontWeight::BOLD)) } - })); - xProp->setSearchAttributes(aDescriptor); - //receiving the defined properties and asserting them with expected values, covering UNO - uno::Sequence aPropVal2(xProp->getSearchAttributes()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aPropVal2.getLength()); - CPPUNIT_ASSERT_EQUAL(OUString("CharWeight"), aPropVal2[0].Name); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(css::awt::FontWeight::BOLD)), aPropVal2[0].Value); - //specifying the search attributes - uno::Reference xPropSet(xSearchDes, uno::UNO_QUERY_THROW); - xPropSet->setPropertyValue("SearchWords", uno::makeAny(true)); - xPropSet->setPropertyValue("SearchCaseSensitive", uno::makeAny(true)); - //this will search all the BOLD words - uno::Reference xIndex(xSearch->findAll(xSearchDes)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount()); - //Replacing the searched string via XReplaceable - uno::Reference xReplace(mxComponent, uno::UNO_QUERY); - uno::Reference xReplaceDes = xReplace->createReplaceDescriptor(); - uno::Reference xProp2(xReplaceDes, uno::UNO_QUERY); - xProp2->setReplaceAttributes(aDescriptor); - //checking that the proper attributes are there or not - uno::Sequence aRepProp(xProp2->getReplaceAttributes()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aRepProp.getLength()); - CPPUNIT_ASSERT_EQUAL(OUString("CharWeight"), aRepProp[0].Name); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(css::awt::FontWeight::BOLD)), aRepProp[0].Value); - //setting strings for replacement - xReplaceDes->setSearchString("test"); - xReplaceDes->setReplaceString("task"); - //checking the replaceString - CPPUNIT_ASSERT_EQUAL(OUString("task"), xReplaceDes->getReplaceString()); - //this will replace *normal*test to *bold*task - sal_Int32 ReplaceCount = xReplace->replaceAll(xReplaceDes); - //There should be only 1 replacement since there is only one occurrence of "test" in the document - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); - //Now performing search again for BOLD words, count should be 3 due to replacement - uno::Reference xIndex2(xReplace->findAll(xSearchDes)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndex2->getCount()); - // regex tests - xSearchDes->setPropertyValue("SearchRegularExpression", uno::makeAny(true)); - // regex: test correct matching combined with attributes like BOLD - xSearchDes->setSearchString(".*"); // should match all bold words in the text - xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndex->getCount()); - uno::Reference xFound(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xFound->getString()); - xFound.set(xIndex->getByIndex(1), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(OUString("This"), xFound->getString()); - xFound.set(xIndex->getByIndex(2), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(OUString("task"), xFound->getString()); - // regex: test anchor combined with attributes like BOLD - xSearchDes->setSearchString("^.*|.*$"); // should match first and last words (they are bold) - xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount()); - xFound.set(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xFound->getString()); - xFound.set(xIndex->getByIndex(1), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(OUString("task"), xFound->getString()); - // regex: test look-ahead/look-behind assertions outside of the bold text - xSearchDes->setSearchString("(?<= ).*(?= )"); // should match second bold word - xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndex->getCount()); - xFound.set(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(OUString("This"), xFound->getString()); - xReplaceDes->setPropertyValue("SearchRegularExpression", uno::makeAny(true)); - // regex: test correct match of paragraph start - xReplaceDes->setSearchString("^."); // should only match first character of the paragraph - xReplaceDes->setReplaceString("C"); - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); - // regex: test correct match of word start - xReplaceDes->setSearchString("\\b\\w"); // should match all words' first characters - xReplaceDes->setReplaceString("x&"); - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(6), ReplaceCount); - // regex: test negative look-behind assertion - xReplaceDes->setSearchString("(?setReplaceString("y"); - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); - // regex: test positive look-behind assertion - xReplaceDes->setSearchString("(?<=xCelly xWorld xTh)i"); // only "i" in "xThis", not in "xis" - xReplaceDes->setReplaceString("z"); - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); - // regex: use capturing group to test reference - xReplaceDes->setSearchString("\\b(\\w\\w\\w\\w)\\w"); - xReplaceDes->setReplaceString("$1q"); // only fifth characters in words should change - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), ReplaceCount); - // check of the end result - CPPUNIT_ASSERT_EQUAL(OUString("xCelqy xWorqd xThzq xis xa xtasq"), - pCursor->GetNode().GetTextNode()->GetText()); - // regex: use positive look-ahead assertion - xReplaceDes->setSearchString("Wor(?=qd xThzq xis xa xtasq)"); - xReplaceDes->setReplaceString("&p"); // testing & reference - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); - // regex: use negative look-ahead assertion - xReplaceDes->setSearchString("x(?!Worpqd xThzq xis xa xtasq)"); - xReplaceDes->setReplaceString("m"); - ReplaceCount = xReplace->replaceAll(xReplaceDes); - CPPUNIT_ASSERT_EQUAL(sal_Int32(5), ReplaceCount); // one of the 6 "x" must not be replaced - // check of the end result - CPPUNIT_ASSERT_EQUAL(OUString("mCelqy xWorpqd mThzq mis ma mtasq"), - pCursor->GetNode().GetTextNode()->GetText()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf69282) -{ - SwDoc* source = createSwDoc(); - uno::Reference xSourceDoc = mxComponent; - mxComponent.clear(); - SwDoc* target = createSwDoc(); - SwPageDesc* sPageDesc = source->MakePageDesc("SourceStyle"); - SwPageDesc* tPageDesc = target->MakePageDesc("TargetStyle"); - sPageDesc->ChgFirstShare(false); - CPPUNIT_ASSERT(!sPageDesc->IsFirstShared()); - SwFrameFormat& rSourceMasterFormat = sPageDesc->GetMaster(); - //Setting horizontal spaces on master - SvxLRSpaceItem horizontalSpace(RES_LR_SPACE); - horizontalSpace.SetLeft(11); - horizontalSpace.SetRight(12); - rSourceMasterFormat.SetFormatAttr(horizontalSpace); - //Setting vertical spaces on master - SvxULSpaceItem verticalSpace(RES_UL_SPACE); - verticalSpace.SetUpper(13); - verticalSpace.SetLower(14); - rSourceMasterFormat.SetFormatAttr(verticalSpace); - //Changing the style and copying it to target - source->ChgPageDesc("SourceStyle", *sPageDesc); - target->CopyPageDesc(*sPageDesc, *tPageDesc); - //Checking the set values on all Formats in target - SwFrameFormat& rTargetMasterFormat = tPageDesc->GetMaster(); - SwFrameFormat& rTargetLeftFormat = tPageDesc->GetLeft(); - SwFrameFormat& rTargetFirstMasterFormat = tPageDesc->GetFirstMaster(); - SwFrameFormat& rTargetFirstLeftFormat = tPageDesc->GetFirstLeft(); - //Checking horizontal spaces - const SvxLRSpaceItem MasterLRSpace = rTargetMasterFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), MasterLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), MasterLRSpace.GetRight()); - const SvxLRSpaceItem LeftLRSpace = rTargetLeftFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), LeftLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), LeftLRSpace.GetRight()); - const SvxLRSpaceItem FirstMasterLRSpace = rTargetFirstMasterFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstMasterLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstMasterLRSpace.GetRight()); - const SvxLRSpaceItem FirstLeftLRSpace = rTargetFirstLeftFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstLeftLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstLeftLRSpace.GetRight()); - //Checking vertical spaces - const SvxULSpaceItem MasterULSpace = rTargetMasterFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), MasterULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), MasterULSpace.GetLower()); - const SvxULSpaceItem LeftULSpace = rTargetLeftFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), LeftULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), LeftULSpace.GetLower()); - const SvxULSpaceItem FirstMasterULSpace = rTargetFirstMasterFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstMasterULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstMasterULSpace.GetLower()); - const SvxULSpaceItem FirstLeftULSpace = rTargetFirstLeftFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstLeftULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstLeftULSpace.GetLower()); - xSourceDoc->dispose(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf69282WithMirror) -{ - SwDoc* source = createSwDoc(); - uno::Reference xSourceDoc = mxComponent; - mxComponent.clear(); - SwDoc* target = createSwDoc(); - SwPageDesc* sPageDesc = source->MakePageDesc("SourceStyle"); - SwPageDesc* tPageDesc = target->MakePageDesc("TargetStyle"); - //Enabling Mirror - sPageDesc->SetUseOn(UseOnPage::Mirror); - SwFrameFormat& rSourceMasterFormat = sPageDesc->GetMaster(); - //Setting horizontal spaces on master - SvxLRSpaceItem horizontalSpace(RES_LR_SPACE); - horizontalSpace.SetLeft(11); - horizontalSpace.SetRight(12); - rSourceMasterFormat.SetFormatAttr(horizontalSpace); - //Setting vertical spaces on master - SvxULSpaceItem verticalSpace(RES_UL_SPACE); - verticalSpace.SetUpper(13); - verticalSpace.SetLower(14); - rSourceMasterFormat.SetFormatAttr(verticalSpace); - //Changing the style and copying it to target - source->ChgPageDesc("SourceStyle", *sPageDesc); - target->CopyPageDesc(*sPageDesc, *tPageDesc); - //Checking the set values on all Formats in target - SwFrameFormat& rTargetMasterFormat = tPageDesc->GetMaster(); - SwFrameFormat& rTargetLeftFormat = tPageDesc->GetLeft(); - SwFrameFormat& rTargetFirstMasterFormat = tPageDesc->GetFirstMaster(); - SwFrameFormat& rTargetFirstLeftFormat = tPageDesc->GetFirstLeft(); - //Checking horizontal spaces - const SvxLRSpaceItem MasterLRSpace = rTargetMasterFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), MasterLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), MasterLRSpace.GetRight()); - //mirror effect should be present - const SvxLRSpaceItem LeftLRSpace = rTargetLeftFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), LeftLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), LeftLRSpace.GetRight()); - const SvxLRSpaceItem FirstMasterLRSpace = rTargetFirstMasterFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstMasterLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstMasterLRSpace.GetRight()); - //mirror effect should be present - const SvxLRSpaceItem FirstLeftLRSpace = rTargetFirstLeftFormat.GetLRSpace(); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstLeftLRSpace.GetLeft()); - CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstLeftLRSpace.GetRight()); - //Checking vertical spaces - const SvxULSpaceItem MasterULSpace = rTargetMasterFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), MasterULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), MasterULSpace.GetLower()); - const SvxULSpaceItem LeftULSpace = rTargetLeftFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), LeftULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), LeftULSpace.GetLower()); - const SvxULSpaceItem FirstMasterULSpace = rTargetFirstMasterFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstMasterULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstMasterULSpace.GetLower()); - const SvxULSpaceItem FirstLeftULSpace = rTargetFirstLeftFormat.GetULSpace(); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstLeftULSpace.GetUpper()); - CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstLeftULSpace.GetLower()); - xSourceDoc->dispose(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf78742) -{ - //testing with service type and any .ods file - OUString path = m_directories.getURLFromSrc(DATA_DIRECTORY) + "calc-data-source.ods"; - SfxMedium aMedium(path, StreamMode::READ | StreamMode::SHARE_DENYWRITE); - SfxFilterMatcher aMatcher("com.sun.star.text.TextDocument"); - std::shared_ptr pFilter; - ErrCode filter = aMatcher.DetectFilter(aMedium, pFilter); - CPPUNIT_ASSERT_EQUAL(ERRCODE_IO_ABORT, filter); - //it should not return any Filter - CPPUNIT_ASSERT(!pFilter); - //testing without service type and any .ods file - SfxMedium aMedium2(path, StreamMode::READ | StreamMode::SHARE_DENYWRITE); - SfxFilterMatcher aMatcher2; - std::shared_ptr pFilter2; - ErrCode filter2 = aMatcher2.DetectFilter(aMedium2, pFilter2); - CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, filter2); - //Filter should be returned with proper Name - CPPUNIT_ASSERT_EQUAL(OUString("calc8"), pFilter2->GetFilterName()); - //testing with service type and any .odt file - OUString path2 = m_directories.getURLFromSrc(DATA_DIRECTORY) + "fdo69893.odt"; - SfxMedium aMedium3(path2, StreamMode::READ | StreamMode::SHARE_DENYWRITE); - SfxFilterMatcher aMatcher3("com.sun.star.text.TextDocument"); - std::shared_ptr pFilter3; - ErrCode filter3 = aMatcher3.DetectFilter(aMedium3, pFilter3); - CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, filter3); - //Filter should be returned with proper Name - CPPUNIT_ASSERT_EQUAL(OUString("writer8"), pFilter3->GetFilterName()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testUnoParagraph) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - //Inserting some text content in the document - pWrtShell->Insert("This is initial text in paragraph one"); - pWrtShell->SplitNode(); - //Inserting second paragraph - pWrtShell->Insert("This is initial text in paragraph two"); - //now testing the SwXParagraph - uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference xText(xTextDocument->getText()); - uno::Reference xParaAccess(xText, uno::UNO_QUERY); - uno::Reference xPara(xParaAccess->createEnumeration()); - //getting first paragraph - uno::Reference xFirstParaContent(xPara->nextElement(), uno::UNO_QUERY); - uno::Reference xFirstPara(xFirstParaContent, uno::UNO_QUERY); - //testing the initial text - CPPUNIT_ASSERT_EQUAL(OUString("This is initial text in paragraph one"), xFirstPara->getString()); - //changing the text content in first paragraph - xFirstPara->setString("This is modified text in paragraph one"); - //testing the changes - CPPUNIT_ASSERT_EQUAL(OUString("This is modified text in paragraph one"), xFirstPara->getString()); - //getting second paragraph - uno::Reference xSecondParaContent(xPara->nextElement(), uno::UNO_QUERY); - uno::Reference xSecondPara(xSecondParaContent, uno::UNO_QUERY); - //testing the initial text - CPPUNIT_ASSERT_EQUAL(OUString("This is initial text in paragraph two"), xSecondPara->getString()); - //changing the text content in second paragraph - xSecondPara->setString("This is modified text in paragraph two"); - //testing the changes - CPPUNIT_ASSERT_EQUAL(OUString("This is modified text in paragraph two"), xSecondPara->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf72788) -{ - //Create a new empty Writer document - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations()); - //Insert some text - two paragraphs - rIDCO.InsertString(*pCursor, "this is text"); - //Position of word 9876543210 - //Position of word 0123456789 - //Change Paragraph - pWrtShell->SplitNode(); - //Insert second paragraph - rIDCO.InsertString(*pCursor, "more text"); - //Position of word 012345678 - //Make the following selection *bold* - //this[is text - //more] text - //Move cursor back - for (int i = 0; i < 5; i++) { - pCursor->Move(fnMoveBackward); - } - //Start selection - pCursor->SetMark(); - for (int i = 0; i < 12; i++) { - pCursor->Move(fnMoveBackward); - } - //Check the text selection - CPPUNIT_ASSERT_EQUAL(OUString(u"is text" + OUStringChar(CH_TXTATR_NEWLINE) + u"more"), pCursor->GetText()); - //Apply a *Bold* attribute to selection - SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); - rIDCO.InsertPoolItem(*pCursor, aWeightItem); - SfxItemSet aSet( pDoc->GetAttrPool(), svl::Items); - //Add selected text's attributes to aSet - pCursor->GetNode().GetTextNode()->GetParaAttr(aSet, 5, 12); - SfxPoolItem const * pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); - //Check that bold is active on the selection and it's in aSet - CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem == aWeightItem)); - //Make selection to remove formatting in first paragraph - //[this is text - //]more text - pWrtShell->StartOfSection(); - //Start selection - pCursor->SetMark(); - for (int i = 0; i < 13; i++) { - pCursor->Move(fnMoveForward); - } - //Clear all the Direct Formatting ( Ctrl + M ) - SwTextNode* pTextNode = pCursor->GetNode().GetTextNode(); - SwIndex aSt( pTextNode, 0 ); - sal_Int32 nEnd = pTextNode->Len(); - pTextNode->RstTextAttr(aSt, nEnd - aSt.GetIndex()); - //In case of Regression RstTextAttr() call will result to infinite recursion - //Check that bold is removed in first paragraph - aSet.ClearItem(); - pTextNode->GetParaAttr(aSet, 5, 12); - SfxPoolItem const * pPoolItem2 = aSet.GetItem(RES_CHRATR_WEIGHT); - CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem2 != aWeightItem)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf60967) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); - pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", true, true, true); - //Inserting table - SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); - pWrtShell->InsertTable(TableOpt, 2, 2); - //getting the cursor's position just after the table insert - SwPosition aPosAfterTable(*(pCursor->GetPoint())); - //moving cursor to B2 (bottom right cell) - pCursor->Move(fnMoveBackward); - SwPosition aPosInTable(*(pCursor->GetPoint())); - //deleting paragraph following table with Ctrl+Shift+Del - bool val = pWrtShell->DelToEndOfSentence(); - CPPUNIT_ASSERT_EQUAL(true, val); - //getting the cursor's position just after the paragraph deletion - SwPosition aPosAfterDel(*(pCursor->GetPoint())); - //moving cursor forward to check whether there is any node following the table, BTW there should not be any such node - pCursor->Move(fnMoveForward); - SwPosition aPosMoveAfterDel(*(pCursor->GetPoint())); - //checking the positions to verify that the paragraph is actually deleted - CPPUNIT_ASSERT_EQUAL(aPosAfterDel, aPosInTable); - CPPUNIT_ASSERT_EQUAL(aPosMoveAfterDel, aPosInTable); - //Undo the changes - rUndoManager.Undo(); - { - //paragraph *text node* should be back - SwPosition aPosAfterUndo(*(pCursor->GetPoint())); - //after undo aPosAfterTable increases the node position by one, since this contains the position *text node* so aPosAfterUndo should be less than aPosAfterTable - CPPUNIT_ASSERT(aPosAfterTable > aPosAfterUndo); - //moving cursor forward to check whether there is any node following the paragraph, BTW there should not be any such node as paragraph node is the last one in header - pCursor->Move(fnMoveForward); - SwPosition aPosMoveAfterUndo(*(pCursor->GetPoint())); - //checking positions to verify that paragraph node is the last one and we are paragraph node only - CPPUNIT_ASSERT(aPosAfterTable > aPosMoveAfterUndo); - CPPUNIT_ASSERT_EQUAL(aPosAfterUndo, aPosMoveAfterUndo); - } - //Redo the changes - rUndoManager.Redo(); - //paragraph *text node* should not be there - SwPosition aPosAfterRedo(*(pCursor->GetPoint())); - //position should be exactly same as it was after deletion of *text node* - CPPUNIT_ASSERT_EQUAL(aPosAfterRedo, aPosMoveAfterDel); - //moving the cursor forward, but it should not actually move as there is no *text node* after the table due to this same position is expected after move as it was before move - pCursor->Move(fnMoveForward); - SwPosition aPosAfterUndoMove(*(pCursor->GetPoint())); - CPPUNIT_ASSERT_EQUAL(aPosAfterRedo, aPosAfterUndoMove); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testSearchWithTransliterate) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - { - SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); - SwPaM aPaM(aIdx); - pDoc->getIDocumentContentOperations().InsertString(aPaM,"This is paragraph one"); - pWrtShell->SplitNode(); - } - { - SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); - SwPaM aPaM(aIdx); - pDoc->getIDocumentContentOperations().InsertString(aPaM,"This is Other PARAGRAPH"); - } - i18nutil::SearchOptions2 SearchOpt; - SearchOpt.algorithmType = css::util::SearchAlgorithms_ABSOLUTE; - SearchOpt.searchFlag = css::util::SearchFlags::ALL_IGNORE_CASE; - SearchOpt.searchString = "other"; - SearchOpt.replaceString.clear(); - SearchOpt.changedChars = 0; - SearchOpt.deletedChars = 0; - SearchOpt.insertedChars = 0; - SearchOpt.transliterateFlags = TransliterationFlags::IGNORE_DIACRITICS_CTL; - SearchOpt.AlgorithmType2 = css::util::SearchAlgorithms2::ABSOLUTE; - SearchOpt.WildcardEscapeCharacter = 0; - //transliteration option set so that at least one of the search strings is not found - sal_uLong case1 = pWrtShell->SearchPattern(SearchOpt,true,SwDocPositions::Start,SwDocPositions::End); - SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true); - CPPUNIT_ASSERT_EQUAL(OUString(),pShellCursor->GetText()); - CPPUNIT_ASSERT_EQUAL(0,static_cast(case1)); - SearchOpt.searchString = "paragraph"; - SearchOpt.transliterateFlags = TransliterationFlags::IGNORE_KASHIDA_CTL; - //transliteration option set so that all search strings are found - sal_uLong case2 = pWrtShell->SearchPattern(SearchOpt,true,SwDocPositions::Start,SwDocPositions::End); - pShellCursor = pWrtShell->getShellCursor(true); - CPPUNIT_ASSERT_EQUAL(OUString("paragraph"),pShellCursor->GetText()); - CPPUNIT_ASSERT_EQUAL(1,static_cast(case2)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf73660) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - OUString aData1 = "First" + OUStringChar(CHAR_SOFTHYPHEN) + "Word"; - OUString aData2 = "Seco" + OUStringChar(CHAR_SOFTHYPHEN) + "nd"; - OUString aData3 = OUStringChar(CHAR_SOFTHYPHEN) + "Third"; - OUString aData4 = "Fourth" + OUStringChar(CHAR_SOFTHYPHEN); - pWrtShell->Insert("We are inserting some text in the document to check the search feature "); - pWrtShell->Insert(aData1 + " "); - pWrtShell->Insert(aData2 + " "); - pWrtShell->Insert(aData3 + " "); - pWrtShell->Insert(aData4 + " "); - pWrtShell->Insert("Fifth "); - pWrtShell->Insert("Now we have enough text let's test search for all the cases"); - //searching for all 5 strings entered with soft-hyphen, search string contains no soft-hyphen - i18nutil::SearchOptions2 searchOpt; - searchOpt.algorithmType = css::util::SearchAlgorithms_REGEXP; - searchOpt.searchFlag = css::util::SearchFlags::NORM_WORD_ONLY; - //case 1 - searchOpt.searchString = "First"; - CPPUNIT_ASSERT_EQUAL(sal_uLong(1), pWrtShell->SearchPattern(searchOpt,true,SwDocPositions::Start,SwDocPositions::End)); - //case 2 - searchOpt.searchString = "Second"; - CPPUNIT_ASSERT_EQUAL(sal_uLong(1), pWrtShell->SearchPattern(searchOpt,true,SwDocPositions::Start,SwDocPositions::End)); - //case 3 - searchOpt.searchString = "Third"; - CPPUNIT_ASSERT_EQUAL(sal_uLong(1), pWrtShell->SearchPattern(searchOpt,true,SwDocPositions::Start,SwDocPositions::End)); - //case 4 - searchOpt.searchString = "Fourth"; - CPPUNIT_ASSERT_EQUAL(sal_uLong(1), pWrtShell->SearchPattern(searchOpt,true,SwDocPositions::Start,SwDocPositions::End)); - //case 5 - searchOpt.searchString = "Fifth"; - CPPUNIT_ASSERT_EQUAL(sal_uLong(1), pWrtShell->SearchPattern(searchOpt,true,SwDocPositions::Start,SwDocPositions::End)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testNewDocModifiedState) -{ - //creating a new doc - SwDoc* pDoc = new SwDoc(); - //getting the state of the document via IDocumentState - IDocumentState& rState(pDoc->getIDocumentState()); - //the state should not be modified, no modifications yet - CPPUNIT_ASSERT(!(rState.IsModified())); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf77342) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - //inserting first footnote - pWrtShell->InsertFootnote(""); - SwFieldType* pField = pWrtShell->GetFieldType(0, SwFieldIds::GetRef); - SwGetRefFieldType* pRefType = static_cast(pField); - //moving cursor to the starting of document - pWrtShell->StartOfSection(); - //inserting reference field 1 - SwGetRefField aField1(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(0), REF_CONTENT); - pWrtShell->InsertField2(aField1); - //inserting second footnote - pWrtShell->InsertFootnote(""); - pWrtShell->StartOfSection(); - pCursor->Move(fnMoveForward); - //inserting reference field 2 - SwGetRefField aField2(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(1), REF_CONTENT); - pWrtShell->InsertField2(aField2); - //inserting third footnote - pWrtShell->InsertFootnote(""); - pWrtShell->StartOfSection(); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - //inserting reference field 3 - SwGetRefField aField3(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(2), REF_CONTENT); - pWrtShell->InsertField2(aField3); - //updating the fields - IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess()); - rField.UpdateExpFields(nullptr, true); - //creating new clipboard doc - rtl::Reference xClpDoc(new SwDoc()); - xClpDoc->SetClipBoard(true); - xClpDoc->getIDocumentFieldsAccess().LockExpFields(); - //selecting reference field 2 and reference field 3 and footnote 1 and footnote 2 - //selection is such that more than one and not all footnotes and ref fields are selected - pCursor->Move(fnMoveBackward); - pCursor->Move(fnMoveBackward); - //start marking - pCursor->SetMark(); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - //copying the selection to clipboard - pWrtShell->Copy(*xClpDoc); - //deleting selection mark after copy - pCursor->DeleteMark(); - //checking that the footnotes reference fields have same values after copy operation - uno::Any aAny; - sal_uInt16 aFormat; - //reference field 1 - pWrtShell->StartOfSection(); - SwField* pRef1 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pRef1->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pRef1->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); - //reference field 2 - pCursor->Move(fnMoveForward); - SwField* pRef2 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pRef2->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pRef2->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //reference field 3 - pCursor->Move(fnMoveForward); - SwField* pRef3 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pRef3->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pRef3->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //moving cursor to the end of the document - pWrtShell->EndOfSection(); - //pasting the copied selection at current cursor position - pWrtShell->Paste(*xClpDoc); - //checking the fields, both new and old, for proper values - pWrtShell->StartOfSection(); - //old reference field 1 - SwField* pOldRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef11->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); - //old reference field 2 - pCursor->Move(fnMoveForward); - SwField* pOldRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef12->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //old reference field 3 - pCursor->Move(fnMoveForward); - SwField* pOldRef13 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef13->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef13->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //old footnote 1 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd1 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote1 = pTextNd1->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote1(pFootnote1->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnote1.GetNumber()); - SwTextFootnote* pTFNote1 = static_cast (pFootnote1); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pTFNote1->GetSeqRefNo()); - //old footnote 2 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd2 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote2 = pTextNd2->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote2(pFootnote2->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnote2.GetNumber()); - SwTextFootnote* pTFNote2 = static_cast (pFootnote2); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTFNote2->GetSeqRefNo()); - //old footnote 3 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd3 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote3 = pTextNd3->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote3(pFootnote3->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnote3.GetNumber()); - SwTextFootnote* pTFNote3 = static_cast (pFootnote3); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pTFNote3->GetSeqRefNo()); - //new reference field 1 - pCursor->Move(fnMoveForward); - SwField* pNewRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef11->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //new reference field 2 - pCursor->Move(fnMoveForward); - SwField* pNewRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef12->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(3)), aAny); - //new footnote 1 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd4 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote4 = pTextNd4->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote4(pFootnote4->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnote4.GetNumber()); - SwTextFootnote* pTFNote4 = static_cast (pFootnote4); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote4->GetSeqRefNo()); - //moving the cursor to the starting of document - pWrtShell->StartOfSection(); - //pasting the selection again at current cursor position - pWrtShell->Paste(*xClpDoc); - //checking the fields, both new and old, for proper values - pWrtShell->StartOfSection(); - //new reference field 1 - SwField* pNewRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef21->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //new reference field 2 - pCursor->Move(fnMoveForward); - SwField* pNewRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef22->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(4)), aAny); - //new footnote 1 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd11 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote11 = pTextNd11->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote11(pFootnote11->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnote11.GetNumber()); - SwTextFootnote* pTFNote11 = static_cast (pFootnote11); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pTFNote11->GetSeqRefNo()); - //old reference field 1 - pCursor->Move(fnMoveForward); - SwField* pOldRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef21->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); - //old reference field 2 - pCursor->Move(fnMoveForward); - SwField* pOldRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef22->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //old reference field 3 - pCursor->Move(fnMoveForward); - SwField* pOldRef23 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef23->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef23->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //old footnote 1 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd12 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote12 = pTextNd12->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote12(pFootnote12->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnote12.GetNumber()); - SwTextFootnote* pTFNote12 = static_cast (pFootnote12); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pTFNote12->GetSeqRefNo()); - //old footnote 2 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd13 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote13 = pTextNd13->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote13(pFootnote13->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnote13.GetNumber()); - SwTextFootnote* pTFNote13 = static_cast (pFootnote13); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTFNote13->GetSeqRefNo()); - //old footnote 3 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd14 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote14 = pTextNd14->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote14(pFootnote14->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnote14.GetNumber()); - SwTextFootnote* pTFNote14 = static_cast (pFootnote14); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pTFNote14->GetSeqRefNo()); - //old reference field 4 - pCursor->Move(fnMoveForward); - SwField* pOldRef24 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef24->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef24->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //old reference field 5 - pCursor->Move(fnMoveForward); - SwField* pOldRef25 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef25->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef25->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(3)), aAny); - //old footnote 4 - pCursor->Move(fnMoveForward); - SwTextNode* pTextNd15 = pCursor->GetNode().GetTextNode(); - SwTextAttr* const pFootnote15 = pTextNd15->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); - const SwFormatFootnote& rFootnote15(pFootnote15->GetFootnote()); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), rFootnote15.GetNumber()); - SwTextFootnote* pTFNote15 = static_cast (pFootnote15); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote15->GetSeqRefNo()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf63553) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - //inserting sequence field 1 - SwSetExpFieldType* pSeqType = static_cast(pWrtShell->GetFieldType(SwFieldIds::SetExp, "Illustration")); - SwSetExpField aSetField1(pSeqType, "", SVX_NUM_ARABIC); - pWrtShell->InsertField2(aSetField1); - SwGetRefFieldType* pRefType = static_cast(pWrtShell->GetFieldType(0, SwFieldIds::GetRef)); - //moving cursor to the starting of document - pWrtShell->StartOfSection(); - //inserting reference field 1 - SwGetRefField aGetField1(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(0), REF_CONTENT); - pWrtShell->InsertField2(aGetField1); - //now we have ref1-seq1 - //moving the cursor - pCursor->Move(fnMoveForward); - //inserting sequence field 2 - SwSetExpField aSetField2(pSeqType, "", SVX_NUM_ARABIC); - pWrtShell->InsertField2(aSetField2); - //moving the cursor - pWrtShell->StartOfSection(); - pCursor->Move(fnMoveForward); - //inserting reference field 2 - SwGetRefField aGetField2(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(1), REF_CONTENT); - pWrtShell->InsertField2(aGetField2); - //now we have ref1-ref2-seq1-seq2 - //moving the cursor - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - //inserting sequence field 3 - SwSetExpField aSetField3(pSeqType, "", SVX_NUM_ARABIC); - pWrtShell->InsertField2(aSetField3); - pWrtShell->StartOfSection(); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - //inserting reference field 3 - SwGetRefField aGetField3(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(2), REF_CONTENT); - pWrtShell->InsertField2(aGetField3); - //now after insertion we have ref1-ref2-ref3-seq1-seq2-seq3 - //updating the fields - IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess()); - rField.UpdateExpFields(nullptr, true); - //creating new clipboard doc - rtl::Reference xClpDoc( new SwDoc() ); - xClpDoc->SetClipBoard(true); - xClpDoc->getIDocumentFieldsAccess().LockExpFields(); - //selecting reference field 2 and 3 and sequence field 1 and 2 - //selection is such that more than one and not all sequence fields and reference fields are selected - //ref1-[ref2-ref3-seq1-seq2]-seq3 - pWrtShell->StartOfSection(); - pCursor->Move(fnMoveForward); - //start marking - pCursor->SetMark(); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - pCursor->Move(fnMoveForward); - //copying the selection to clipboard - pWrtShell->Copy(*xClpDoc); - //deleting selection mark after copy - pCursor->DeleteMark(); - //checking whether the sequence and reference fields have same values after copy operation - uno::Any aAny; - sal_uInt16 aFormat; - //reference field 1 - pWrtShell->StartOfSection(); - SwField* pRef1 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pRef1->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pRef1->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); - //reference field 2 - pCursor->Move(fnMoveForward); - SwField* pRef2 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pRef2->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pRef2->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //reference field 3 - pCursor->Move(fnMoveForward); - SwField* pRef3 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pRef3->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pRef3->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //sequence field 1 - pCursor->Move(fnMoveForward); - SwSetExpField* pSeqF1 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pSeqF1->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF1->GetFieldName()); - //sequence field 2 - pCursor->Move(fnMoveForward); - SwSetExpField* pSeqF2 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pSeqF2->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF2->GetFieldName()); - //sequence field 3 - pCursor->Move(fnMoveForward); - SwSetExpField* pSeqF3 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pSeqF3->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF3->GetFieldName()); - //moving cursor to the end of the document - pWrtShell->EndOfSection(); - //pasting the copied selection at current cursor position - pWrtShell->Paste(*xClpDoc); - //checking the fields, both new and old, for proper values - pWrtShell->StartOfSection(); - //now we have ref1-ref2-ref3-seq1-seq2-seq3-nref1-nref2-nseq1-nseq2 - //old reference field 1 - SwField* pOldRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef11->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); - //old reference field 2 - pCursor->Move(fnMoveForward); - SwField* pOldRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef12->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //old reference field 3 - pCursor->Move(fnMoveForward); - SwField* pOldRef13 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef13->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef13->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //old sequence field 1 - pCursor->Move(fnMoveForward); - SwSetExpField* pSeq1 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pSeq1->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq1->GetFieldName()); - //old sequence field 2 - pCursor->Move(fnMoveForward); - SwSetExpField* pSeq2 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pSeq2->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq2->GetFieldName()); - //old sequence field 3 - pCursor->Move(fnMoveForward); - SwSetExpField* pSeq3 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pSeq3->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq3->GetFieldName()); - //new reference field 1 - pCursor->Move(fnMoveForward); - SwField* pNewRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef11->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(4)), aAny); - //new reference field 2 - pCursor->Move(fnMoveForward); - SwField* pNewRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef12->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //new sequence field 1 - pCursor->Move(fnMoveForward); - SwSetExpField* pNewSeq1 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pNewSeq1->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq1->GetFieldName()); - //new sequence field 2 - pCursor->Move(fnMoveForward); - SwSetExpField* pNewSeq2 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pNewSeq2->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq2->GetFieldName()); - //moving the cursor to the starting of document - pWrtShell->StartOfSection(); - //pasting the selection again at current cursor position - pWrtShell->Paste(*xClpDoc); - //checking the fields, both new and old, for proper values - pWrtShell->StartOfSection(); - //now we have [nnref1-nnref2-nnseq1-nnseq2]-ref1-[ref2-ref3-seq1-seq2]-seq3-[nref1-nref2-nseq1-nseq2] - //new reference field 1 - SwField* pNewRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef21->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(6)), aAny); - //new reference field 2 - pCursor->Move(fnMoveForward); - SwField* pNewRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pNewRef22->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pNewRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //new sequence field 1 - pCursor->Move(fnMoveForward); - SwSetExpField* pNewSeq11 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), pNewSeq11->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq11->GetFieldName()); - //new sequence field 2 - pCursor->Move(fnMoveForward); - SwSetExpField* pNewSeq12 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), pNewSeq12->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq12->GetFieldName()); - //old reference field 1 - pCursor->Move(fnMoveForward); - SwField* pOldRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef21->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); - //old reference field 2 - pCursor->Move(fnMoveForward); - SwField* pOldRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef22->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); - //old reference field 3 - pCursor->Move(fnMoveForward); - SwField* pOldRef23 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef23->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef23->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //old sequence field 1 - pCursor->Move(fnMoveForward); - SwSetExpField* pOldSeq11 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pOldSeq11->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq11->GetFieldName()); - //old sequence field 2 - pCursor->Move(fnMoveForward); - SwSetExpField* pOldSeq12 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pOldSeq12->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq12->GetFieldName()); - //old sequence field 3 - pCursor->Move(fnMoveForward); - SwSetExpField* pOldSeq13 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pOldSeq13->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq13->GetFieldName()); - //old reference field 4 - pCursor->Move(fnMoveForward); - SwField* pOldRef24 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef24->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef24->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(4)), aAny); - //old reference field 5 - pCursor->Move(fnMoveForward); - SwField* pOldRef25 = SwCursorShell::GetFieldAtCursor(pCursor, true); - aFormat = pOldRef25->GetFormat(); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); - pOldRef25->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); - //old sequence field 4 - pCursor->Move(fnMoveForward); - SwSetExpField* pOldSeq14 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pOldSeq14->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq14->GetFieldName()); - //old sequence field 5 - pCursor->Move(fnMoveForward); - SwSetExpField* pOldSeq15 = static_cast (SwCursorShell::GetFieldAtCursor(pCursor, true)); - CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pOldSeq15->GetSeqNumber()); - CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq15->GetFieldName()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf74230) -{ - createSwDoc(); - //exporting the empty document to ODT via TempFile - uno::Sequence aDescriptor; - utl::TempFile aTempFile; - uno::Reference xStorable(mxComponent, uno::UNO_QUERY); - xStorable->storeToURL(aTempFile.GetURL(), aDescriptor); - CPPUNIT_ASSERT(aTempFile.IsValid()); - //loading an XML DOM of the "styles.xml" of the TempFile - xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(),"styles.xml"); - //pXmlDoc should not be null - CPPUNIT_ASSERT(pXmlDoc); - //asserting XPath in loaded XML DOM - assertXPath(pXmlDoc, "//office:styles/style:default-style[@style:family='graphic']/style:graphic-properties[@svg:stroke-color='#3465a4']"); - assertXPath(pXmlDoc, "//office:styles/style:default-style[@style:family='graphic']/style:graphic-properties[@draw:fill-color='#729fcf']"); - //deleting the TempFile - aTempFile.EnableKillingFile(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf74363) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - //testing autocorrect of initial capitals on start of first paragraph - SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect()); - //Inserting one all-lowercase word into the first paragraph - pWrtShell->Insert("testing"); - const sal_Unicode cChar = ' '; - pWrtShell->AutoCorrect(corr, cChar); - //The word should be capitalized due to autocorrect - SwNodeOffset nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); - CPPUNIT_ASSERT_EQUAL(OUString("Testing "), static_cast(pDoc->GetNodes()[nIndex])->GetText()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf80663) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - //Inserting 2x2 Table - sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); - SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); - pWrtShell->InsertTable(TableOpt, 2, 2); - //Checking for the number of rows and columns - uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Deleting the first row - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->SelTableRow(); //selects the first row - pWrtShell->DeleteRow(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Deleting the second row - pWrtShell->GoNextCell(); //moves the cursor to next cell - pWrtShell->SelTableRow(); //selects the second row - pWrtShell->DeleteRow(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Deleting the first column - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->SelTableCol(); //selects first column - pWrtShell->DeleteCol(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Deleting the second column - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->GoNextCell(); //moves the cursor to next cell - pWrtShell->SelTableCol(); //selects second column - pWrtShell->DeleteCol(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf57197) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - //Inserting 1x1 Table - sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); - SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); - pWrtShell->InsertTable(TableOpt, 1, 1); - //Checking for the number of rows and columns - uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Inserting one row before the existing row - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->InsertRow(1, false); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Inserting one row after the existing row - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->InsertRow(1, true); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Inserting one column before the existing column - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->InsertCol(1, false); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Inserting one column after the existing column - pWrtShell->StartOfSection(); //moves the cursor to the start of Doc - pWrtShell->InsertCol(1, true); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - //Redo changes - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); - //Undo changes - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf131990) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - CPPUNIT_ASSERT(!pWrtShell->Up( false, 1, true )); - CPPUNIT_ASSERT(!pWrtShell->Down( false, 1, true )); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf90808) -{ - createSwDoc(); - uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference xTextRange = xTextDocument->getText(); - uno::Reference xText = xTextRange->getText(); - uno::Reference xCursor(xText->createTextCursor(), uno::UNO_QUERY); - //inserting text into document so that the paragraph is not empty - xText->setString("Hello World!"); - uno::Reference xFact(mxComponent, uno::UNO_QUERY); - //creating bookmark 1 - uno::Reference xHeadingBookmark1(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); - uno::Reference xHeadingName1(xHeadingBookmark1, uno::UNO_QUERY); - xHeadingName1->setName("__RefHeading__1"); - //moving cursor to the starting of paragraph - xCursor->gotoStartOfParagraph(false); - //inserting the bookmark in paragraph - xText->insertTextContent(xCursor, xHeadingBookmark1, true); - //creating bookmark 2 - uno::Reference xHeadingBookmark2(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); - uno::Reference xHeadingName2(xHeadingBookmark2, uno::UNO_QUERY); - xHeadingName2->setName("__RefHeading__2"); - //inserting the bookmark in same paragraph, at the end - //only one bookmark of this type is allowed in each paragraph an exception of com.sun.star.lang.IllegalArgumentException must be thrown when inserting the other bookmark in same paragraph - xCursor->gotoEndOfParagraph(true); - CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xHeadingBookmark2, true), css::lang::IllegalArgumentException); - //now testing for __RefNumPara__ - //creating bookmark 1 - uno::Reference xNumBookmark1(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); - uno::Reference xNumName1(xNumBookmark1, uno::UNO_QUERY); - xNumName1->setName("__RefNumPara__1"); - //moving cursor to the starting of paragraph - xCursor->gotoStartOfParagraph(false); - //inserting the bookmark in paragraph - xText->insertTextContent(xCursor, xNumBookmark1, true); - //creating bookmark 2 - uno::Reference xNumBookmark2(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); - uno::Reference xNumName2(xNumBookmark2, uno::UNO_QUERY); - xNumName2->setName("__RefNumPara__2"); - //inserting the bookmark in same paragraph, at the end - //only one bookmark of this type is allowed in each paragraph an exception of com.sun.star.lang.IllegalArgumentException must be thrown when inserting the other bookmark in same paragraph - xCursor->gotoEndOfParagraph(true); - CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xNumBookmark2, true), css::lang::IllegalArgumentException); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf97601) -{ - // Instructions from the bugreport to trigger an infinite loop. - createSwDoc(DATA_DIRECTORY, "tdf97601.odt"); - uno::Reference xEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference xEmbeddedObjects = xEmbeddedObjectsSupplier->getEmbeddedObjects(); - uno::Reference xChart; - xEmbeddedObjects->getByName("myChart") >>= xChart; - uno::Reference xChartComponent; - xChart->getPropertyValue("Component") >>= xChartComponent; - uno::Sequence< uno::Reference > aDataSequences = xChartComponent->getDataSequences(); - uno::Reference xChartState(xChart, uno::UNO_QUERY); - xChartState->getExtendedControlOverEmbeddedObject()->changeState(1); - uno::Reference xDataSequenceModifiable(aDataSequences[2]->getValues(), uno::UNO_QUERY); - xDataSequenceModifiable->setModified(true); - - // Make sure that the chart is marked as modified. - uno::Reference xModifiable(xChartComponent, uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(true, bool(xModifiable->isModified())); - calcLayout(); - // This never returned. - Scheduler::ProcessEventsToIdle(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf75137) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true); - pWrtShell->InsertFootnote("This is first footnote"); - SwNodeOffset firstIndex = pShellCursor->GetNode().GetIndex(); - pShellCursor->GotoFootnoteAnchor(); - pWrtShell->InsertFootnote("This is second footnote"); - pWrtShell->Up(false); - SwNodeOffset secondIndex = pShellCursor->GetNode().GetIndex(); - pWrtShell->Down(false); - SwNodeOffset thirdIndex = pShellCursor->GetNode().GetIndex(); - CPPUNIT_ASSERT_EQUAL(firstIndex, thirdIndex); - CPPUNIT_ASSERT(firstIndex != secondIndex); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf83798) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf83798.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->GotoNextTOXBase(); - const SwTOXBase* pTOXBase = pWrtShell->GetCurTOX(); - pWrtShell->UpdateTableOf(*pTOXBase); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - pCursor->SetMark(); - pCursor->Move(fnMoveForward, GoInNode); - pCursor->Move(fnMoveBackward, GoInContent); - CPPUNIT_ASSERT_EQUAL(OUString("Table of Contents"), pCursor->GetText()); - pCursor->Move(fnMoveForward, GoInContent); - pCursor->DeleteMark(); - pCursor->SetMark(); - pCursor->Move(fnMoveForward, GoInContent); - CPPUNIT_ASSERT_EQUAL(OUString("1"), pCursor->GetText()); - pCursor->DeleteMark(); - pCursor->Move(fnMoveForward, GoInNode); - pCursor->SetMark(); - pCursor->Move(fnMoveForward, GoInContent); - pCursor->Move(fnMoveForward, GoInContent); - pCursor->Move(fnMoveForward, GoInContent); - CPPUNIT_ASSERT_EQUAL(OUString("1.A"), pCursor->GetText()); - pCursor->DeleteMark(); - pCursor->Move(fnMoveForward, GoInNode); - pCursor->SetMark(); - pCursor->Move(fnMoveForward, GoInContent); - CPPUNIT_ASSERT_EQUAL(OUString("2"), pCursor->GetText()); - pCursor->DeleteMark(); - pCursor->Move(fnMoveForward, GoInNode); - pCursor->SetMark(); - pCursor->Move(fnMoveForward, GoInContent); - pCursor->Move(fnMoveForward, GoInContent); - pCursor->Move(fnMoveForward, GoInContent); - CPPUNIT_ASSERT_EQUAL(OUString("2.A"), pCursor->GetText()); - pCursor->DeleteMark(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf89714) -{ - createSwDoc(); - uno::Reference xFact(mxComponent, uno::UNO_QUERY); - uno::Reference xInterface(xFact->createInstance("com.sun.star.text.Defaults"), uno::UNO_QUERY); - uno::Reference xPropState(xInterface, uno::UNO_QUERY); - //enabled Paragraph Orphan and Widows by default starting in LO5.1 - CPPUNIT_ASSERT_EQUAL( uno::makeAny(sal_Int8(2)), xPropState->getPropertyDefault("ParaOrphans") ); - CPPUNIT_ASSERT_EQUAL( uno::makeAny(sal_Int8(2)), xPropState->getPropertyDefault("ParaWidows") ); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf130287) -{ - //create a new writer document - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - //insert a 1-cell table in the newly created document - SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); - pWrtShell->InsertTable(TableOpt, 1, 1); - //checking for the row and column - uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); - uno::Reference xCell = xTable->getCellByName("A1"); - uno::Reference xCellText(xCell, uno::UNO_QUERY); - uno::Reference xParagraph = getParagraphOfText(1, xCellText); - // they were 2 (orphan/widow control enabled unnecessarily in Table Contents paragraph style) - CPPUNIT_ASSERT_EQUAL( sal_Int8(0), getProperty(xParagraph, "ParaOrphans")); - CPPUNIT_ASSERT_EQUAL( sal_Int8(0), getProperty(xParagraph, "ParaWidows")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testPropertyDefaults) -{ - createSwDoc(); - uno::Reference xFact(mxComponent, uno::UNO_QUERY); - uno::Reference xInterface(xFact->createInstance("com.sun.star.text.Defaults"), uno::UNO_QUERY); - uno::Reference xPropSet(xInterface, uno::UNO_QUERY_THROW); - uno::Reference xPropState(xInterface, uno::UNO_QUERY); - //testing CharFontName from style::CharacterProperties - //getting property default - uno::Any aCharFontName = xPropState->getPropertyDefault("CharFontName"); - //asserting property default and defaults received from "css.text.Defaults" service - CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharFontName"), aCharFontName); - //changing the default value - xPropSet->setPropertyValue("CharFontName", uno::makeAny(OUString("Symbol"))); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(OUString("Symbol")), xPropSet->getPropertyValue("CharFontName")); - //resetting the value to default - xPropState->setPropertyToDefault("CharFontName"); - CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharFontName"), aCharFontName); - //testing CharHeight from style::CharacterProperties - //getting property default - uno::Any aCharHeight = xPropState->getPropertyDefault("CharHeight"); - //asserting property default and defaults received from "css.text.Defaults" service - CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharHeight"), aCharHeight); - //changing the default value - xPropSet->setPropertyValue("CharHeight", uno::makeAny(float(14))); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(14)), xPropSet->getPropertyValue("CharHeight")); - //resetting the value to default - xPropState->setPropertyToDefault("CharHeight"); - CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharHeight"), aCharHeight); - //testing CharWeight from style::CharacterProperties - uno::Any aCharWeight = xPropSet->getPropertyValue("CharWeight"); - //changing the default value - xPropSet->setPropertyValue("CharWeight", uno::makeAny(float(awt::FontWeight::BOLD))); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(awt::FontWeight::BOLD)), xPropSet->getPropertyValue("CharWeight")); - //resetting the value to default - xPropState->setPropertyToDefault("CharWeight"); - CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharWeight"), aCharWeight); - //testing CharUnderline from style::CharacterProperties - uno::Any aCharUnderline = xPropSet->getPropertyValue("CharUnderline"); - //changing the default value - xPropSet->setPropertyValue("CharUnderline", uno::makeAny(sal_Int16(awt::FontUnderline::SINGLE))); - CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_Int16(awt::FontUnderline::SINGLE)), xPropSet->getPropertyValue("CharUnderline")); - //resetting the value to default - xPropState->setPropertyToDefault("CharUnderline"); - CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharUnderline"), aCharUnderline); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTableBackgroundColor) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); - pWrtShell->InsertTable(TableOpt, 3, 3); //Inserting Table - //Checking Rows and Columns of Inserted Table - uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRows()->getCount()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getColumns()->getCount()); - pWrtShell->StartOfSection(); - pWrtShell->SelTableRow(); //Selecting First Row - pWrtShell->ClearMark(); - //Modifying the color of Table Box - pWrtShell->SetBoxBackground(SvxBrushItem(Color(sal_Int32(0xFF00FF)), sal_Int16(RES_BACKGROUND))); - //Checking cells for background color only A1 should be modified - uno::Reference xCell; - xCell = xTable->getCellByName("A1"); - CPPUNIT_ASSERT_EQUAL(Color(0xFF00FF), Color(ColorTransparency, getProperty(xCell, "BackColor"))); - xCell = xTable->getCellByName("A2"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("A3"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("B1"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("B2"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("B3"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("C1"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("C2"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); - xCell = xTable->getCellByName("C3"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf88899) -{ - createSwDoc(); - uno::Reference xDocumentPropertiesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference xProps(xDocumentPropertiesSupplier->getDocumentProperties()); - uno::Reference xUserProps = xProps->getUserDefinedProperties(); - css::util::DateTime aDateTime = {sal_uInt32(1234567), sal_uInt16(3), sal_uInt16(3), sal_uInt16(3), sal_uInt16(10), sal_uInt16(11), sal_uInt16(2014), true}; - xUserProps->addProperty("dateTime", sal_Int16(beans::PropertyAttribute::OPTIONAL), uno::makeAny(aDateTime)); - uno::Reference xFact(mxComponent, uno::UNO_QUERY); - uno::Reference xTextField(xFact->createInstance("com.sun.star.text.textfield.docinfo.Custom"), uno::UNO_QUERY); - //Setting Name Property - uno::Reference xPropSet(xTextField, uno::UNO_QUERY_THROW); - xPropSet->setPropertyValue("Name", uno::makeAny(OUString("dateTime"))); - //Setting NumberFormat - uno::Reference xNumberFormatsSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference xNumFormat(xNumberFormatsSupplier->getNumberFormats(), uno::UNO_QUERY); - css::lang::Locale alocale; - alocale.Language = "en"; - alocale.Country = "US"; - sal_Int16 key = xNumFormat->getStandardFormat(util::NumberFormat::DATETIME, alocale); - xPropSet->setPropertyValue("NumberFormat", uno::makeAny(key)); - //Inserting Text Content - uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference xTextRange = xTextDocument->getText(); - uno::Reference xText = xTextRange->getText(); - xText->insertTextContent(xTextRange, xTextField, true); - //Retrieving the contents for verification - CPPUNIT_ASSERT_EQUAL(OUString("11/10/14 03:03 AM"), xTextField->getPresentation(false)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf90362) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf90362.fodt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - // Ensure correct initial setting - std::shared_ptr batch( - comphelper::ConfigurationChanges::create()); - officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(false, batch); - batch->commit(); - // First check if the end of the second paragraph is indeed protected. - pWrtShell->EndPara(); - pWrtShell->Down(/*bSelect=*/false); - CPPUNIT_ASSERT_EQUAL(true, pWrtShell->HasReadonlySel()); - - // Then enable ignoring of protected areas and make sure that this time the cursor is read-write. - officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(true, batch); - batch->commit(); - CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel()); - // Clean up, otherwise following tests will have that option set - officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(false, batch); - batch->commit(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testUndoDelAsCharTdf107512) -{ - SwDoc * pDoc(createSwDoc()); - sw::UndoManager & rUndoManager(pDoc->GetUndoManager()); - IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations()); - SwCursorShell * pShell(pDoc->GetEditShell()); - SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); - SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); - rIDCO.InsertString(*pShell->GetCursor(), "foo"); - pShell->ClearMark(); - SwFormatAnchor anchor(RndStdIds::FLY_AS_CHAR); - frameSet.Put(anchor); - GraphicObject grf; - pShell->SttEndDoc(true); - CPPUNIT_ASSERT(rIDCO.InsertGraphicObject(*pShell->GetCursor(), grf, &frameSet, &grfSet)); - pShell->SttEndDoc(false); - CPPUNIT_ASSERT(rIDCO.InsertGraphicObject(*pShell->GetCursor(), grf, &frameSet, &grfSet)); - CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - SvxCharHiddenItem hidden(true, RES_CHRATR_HIDDEN); - pShell->SelectTextModel(1, 4); - rIDCO.InsertPoolItem(*pShell->GetCursor(), hidden); - // now we have "\1foo\1" with the "foo" hidden - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), pShell->GetCursor()->GetNode().GetTextNode()->GetText()); - SfxPoolItem const* pItem; - SfxItemSet query(pDoc->GetAttrPool(), svl::Items); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); - CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); - query.ClearItem(RES_CHRATR_HIDDEN); - - // delete from the start - pShell->SelectTextModel(0, 4); - rIDCO.DeleteAndJoin(*pShell->GetCursor()); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - rUndoManager.Undo(); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - CPPUNIT_ASSERT_EQUAL(OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), pShell->GetCursor()->GetNode().GetTextNode()->GetText()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); - CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); - query.ClearItem(RES_CHRATR_HIDDEN); - rUndoManager.Redo(); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - rUndoManager.Undo(); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - CPPUNIT_ASSERT_EQUAL(OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), pShell->GetCursor()->GetNode().GetTextNode()->GetText()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); - CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); - query.ClearItem(RES_CHRATR_HIDDEN); - - // delete from the end - pShell->SelectTextModel(1, 5); - rIDCO.DeleteAndJoin(*pShell->GetCursor()); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - rUndoManager.Undo(); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - CPPUNIT_ASSERT_EQUAL(OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), pShell->GetCursor()->GetNode().GetTextNode()->GetText()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); - CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); - query.ClearItem(RES_CHRATR_HIDDEN); - rUndoManager.Redo(); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - rUndoManager.Undo(); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); - CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - CPPUNIT_ASSERT_EQUAL(OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), pShell->GetCursor()->GetNode().GetTextNode()->GetText()); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); - CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - query.ClearItem(RES_CHRATR_HIDDEN); - pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); - CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); - CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); - query.ClearItem(RES_CHRATR_HIDDEN); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testUndoCharAttribute) -{ - // Create a new empty Writer document - SwDoc* pDoc = createSwDoc(); - SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); - sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); - IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations()); - // Insert some text - rIDCO.InsertString(*pCursor, "This will be bolded"); - // Position of word 9876543210 - // Use cursor to select part of text - pCursor->SetMark(); - for (int i = 0; i < 9; i++) { - pCursor->Move(fnMoveBackward); - } - // Check that correct text was selected - CPPUNIT_ASSERT_EQUAL(OUString("be bolded"), pCursor->GetText()); - // Apply a "Bold" attribute to selection - SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); - rIDCO.InsertPoolItem(*pCursor, aWeightItem); - SfxItemSet aSet( pDoc->GetAttrPool(), svl::Items); - // Adds selected text's attributes to aSet - pCursor->GetNode().GetTextNode()->GetParaAttr(aSet, 10, 19); - SfxPoolItem const * pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); - // Check that bold is active on the selection; checks if it's in aSet - CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem == aWeightItem)); - // Invoke Undo - rUndoManager.Undo(); - // Check that bold is no longer active - aSet.ClearItem(RES_CHRATR_WEIGHT); - pCursor->GetNode().GetTextNode()->GetParaAttr(aSet, 10, 19); - pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); - CPPUNIT_ASSERT_EQUAL(false, (*pPoolItem == aWeightItem)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testUndoDelAsChar) -{ - SwDoc * pDoc(createSwDoc()); - sw::UndoManager & rUndoManager(pDoc->GetUndoManager()); - IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations()); - SwCursorShell * pShell(pDoc->GetEditShell()); - SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); - SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); - SwFormatAnchor anchor(RndStdIds::FLY_AS_CHAR); - frameSet.Put(anchor); - GraphicObject grf; - CPPUNIT_ASSERT(rIDCO.InsertGraphicObject(*pShell->GetCursor(), grf, &frameSet, &grfSet)); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - pShell->SetMark(); - pShell->Left(1, CRSR_SKIP_CHARS); - rIDCO.DeleteAndJoin(*pShell->GetCursor()); - CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT(!pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - rUndoManager.Redo(); - CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT(!pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pShell->GetCursor()->GetNode().GetTextNode()->Len()); - rUndoManager.Undo(); - CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); - CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf86639) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf86639.rtf"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwTextFormatColl* pColl = pDoc->FindTextFormatCollByName(u"Heading"); - pWrtShell->SetTextFormatColl(pColl); - OUString aExpected = pColl->GetAttrSet().GetFont().GetFamilyName(); - // This was Calibri, should be Liberation Sans. - CPPUNIT_ASSERT_EQUAL(aExpected, getProperty(getRun(getParagraph(1), 1), "CharFontName")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf90883TableBoxGetCoordinates) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf90883.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->Down(true); - SwSelBoxes aBoxes; - ::GetTableSel( *pWrtShell, aBoxes ); - CPPUNIT_ASSERT_EQUAL( 2, static_cast(aBoxes.size()) ); - Point pos ( aBoxes[0]->GetCoordinates() ); - CPPUNIT_ASSERT_EQUAL( 1, static_cast(pos.X()) ); - CPPUNIT_ASSERT_EQUAL( 1, static_cast(pos.Y()) ); - pos = aBoxes[1]->GetCoordinates(); - CPPUNIT_ASSERT_EQUAL( 1, static_cast(pos.X()) ); - CPPUNIT_ASSERT_EQUAL( 2, static_cast(pos.Y()) ); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testEmbeddedDataSource) -{ - // Initially no data source. - uno::Reference xComponentContext(comphelper::getProcessComponentContext()); - uno::Reference xDatabaseContext = sdb::DatabaseContext::create(xComponentContext); - CPPUNIT_ASSERT(!xDatabaseContext->hasByName("calc-data-source")); - - // Load: should have a component and a data source, too. - // Path with "#" must not cause issues - createSwDoc(OUStringConcatenation(DATA_DIRECTORY + OUString::Concat(u"hash%23path/")), "embedded-data-source.odt"); - CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); - - // Data source has a table named Sheet1. - uno::Reference xDataSource(xDatabaseContext->getByName("calc-data-source"), uno::UNO_QUERY); - CPPUNIT_ASSERT(xDataSource.is()); - auto xConnection = xDataSource->getConnection("", ""); - uno::Reference xTables = - css::uno::Reference( - xConnection, uno::UNO_QUERY_THROW)->getTables(); - CPPUNIT_ASSERT(xTables.is()); - CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); - xConnection->close(); - - // Reload: should still have a component and a data source, too. - reload("writer8", "embedded-data-source.odt"); - CPPUNIT_ASSERT(mxComponent.is()); - CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); - - // Data source has a table named Sheet1 after saving to a different directory. - xDataSource.set(xDatabaseContext->getByName("calc-data-source"), uno::UNO_QUERY); - CPPUNIT_ASSERT(xDataSource.is()); - xConnection = xDataSource->getConnection("", ""); - xTables = - css::uno::Reference( - xConnection, uno::UNO_QUERY_THROW)->getTables(); - CPPUNIT_ASSERT(xTables.is()); - CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); - xConnection->close(); - - // Close: should not have a data source anymore. - mxComponent->dispose(); - mxComponent.clear(); - CPPUNIT_ASSERT(!xDatabaseContext->hasByName("calc-data-source")); - - // Now open again the saved result, and instead of 'save as', just 'save'. - mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument"); - uno::Reference xStorable(mxComponent, uno::UNO_QUERY); - xStorable->store(); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testUnoCursorPointer) -{ - auto xDocComponent(loadFromDesktop("private:factory/swriter", - "com.sun.star.text.TextDocument")); - auto pxDocDocument( - dynamic_cast(xDocComponent.get())); - CPPUNIT_ASSERT(pxDocDocument); - SwDoc* const pDoc(pxDocDocument->GetDocShell()->GetDoc()); - std::unique_ptr pIdx(new SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1)); - std::unique_ptr pPos(new SwPosition(*pIdx)); - sw::UnoCursorPointer pCursor(pDoc->CreateUnoCursor(*pPos)); - CPPUNIT_ASSERT(static_cast(pCursor)); - pPos.reset(); // we need to kill the SwPosition before disposing - pIdx.reset(); // we need to kill the SwNodeIndex before disposing - xDocComponent->dispose(); - CPPUNIT_ASSERT(!static_cast(pCursor)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTextTableCellNames) -{ - sal_Int32 nCol, nRow2; - SwXTextTable::GetCellPosition( "z1", nCol, nRow2); - CPPUNIT_ASSERT_EQUAL(static_cast(51), nCol); - SwXTextTable::GetCellPosition( "AA1", nCol, nRow2); - CPPUNIT_ASSERT_EQUAL(static_cast(52), nCol); - SwXTextTable::GetCellPosition( "AB1", nCol, nRow2); - CPPUNIT_ASSERT_EQUAL(static_cast(53), nCol); - SwXTextTable::GetCellPosition( "BB1", nCol, nRow2); - CPPUNIT_ASSERT_EQUAL(static_cast(105), nCol); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testShapeAnchorUndo) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "draw-anchor-undo.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); - SdrObject* pObject = pPage->GetObj(0); - tools::Rectangle aOrigLogicRect(pObject->GetLogicRect()); - - sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); - rUndoManager.StartUndo(SwUndoId::START, nullptr); - - pWrtShell->SelectObj(Point(), 0, pObject); - - pWrtShell->GetDrawView()->MoveMarkedObj(Size(100, 100)); - pWrtShell->ChgAnchor(RndStdIds::FLY_AT_PARA, true); - - rUndoManager.EndUndo(SwUndoId::END, nullptr); - - CPPUNIT_ASSERT(aOrigLogicRect != pObject->GetLogicRect()); - - rUndoManager.Undo(); - - CPPUNIT_ASSERT_EQUAL(pObject->GetLogicRect(), aOrigLogicRect); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf127635) -{ - SwDoc* pDoc = createSwDoc(); - - SwXTextDocument* pXTextDocument = dynamic_cast(mxComponent.get()); - CPPUNIT_ASSERT(pXTextDocument); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'a', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, ' ', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'b', 0); - Scheduler::ProcessEventsToIdle(); - - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 2, /*bBasicCall=*/false); - - //Select 'a' - pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false); - - // enable redlining - dispatchCommand(mxComponent, ".uno:TrackChanges", {}); - // hide - dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); - - CPPUNIT_ASSERT_MESSAGE("redlining should be on", - pDoc->getIDocumentRedlineAccess().IsRedlineOn()); - CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); - - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, ' ', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'd', 0); - Scheduler::ProcessEventsToIdle(); - - SwEditShell* const pEditShell(pDoc->GetEditShell()); - // accept all redlines - while(pEditShell->GetRedlineCount()) - pEditShell->AcceptRedline(0); - - // Without the fix in place, this test would have failed with - // - Expected: C d b - // - Actual : Cd b - CPPUNIT_ASSERT_EQUAL(OUString("C d b"), getParagraph(1)->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDde) -{ -#if HAVE_FEATURE_UI - // Type asdf and copy it. - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->Insert("asdf"); - pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 4, /*bBasicCall=*/false); - uno::Sequence aPropertyValues; - dispatchCommand(mxComponent, ".uno:Copy", aPropertyValues); - - // Go before the selection and paste as a DDE link. - pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false); - aPropertyValues = comphelper::InitPropertySequence( - { - {"SelectedFormat", uno::makeAny(static_cast(SotClipboardFormatId::LINK))} - }); - dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aPropertyValues); - - // Make sure that the document starts with a field now, and its expanded string value contains asdf. - const uno::Reference< text::XTextRange > xField = getRun(getParagraph(1), 1); - CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xField, "TextPortionType")); - CPPUNIT_ASSERT(xField->getString().endsWith("asdf")); -#endif -} - -namespace { - -//IdleTask class to add a low priority Idle task -class IdleTask -{ - public: - bool GetFlag() const; - IdleTask(); - DECL_LINK( FlipFlag, Timer *, void ); - private: - bool flag; - Idle maIdle { "sw uiwriter IdleTask" }; -}; - -} - -//constructor of IdleTask Class -IdleTask::IdleTask() : flag( false ) -{ - //setting the Priority of Idle task to LOW, LOWEST - maIdle.SetPriority( TaskPriority::LOWEST ); - //set idle for callback - maIdle.SetInvokeHandler( LINK( this, IdleTask, FlipFlag) ); - //starting the idle - maIdle.Start(); -} - -//GetFlag() of IdleTask Class -bool IdleTask::GetFlag() const -{ - //returning the status of current flag - return flag; -} - -//Callback function of IdleTask Class -IMPL_LINK(IdleTask, FlipFlag, Timer*, , void) -{ - //setting the flag to make sure that low priority idle task has been dispatched - flag = true; -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDocModState) -{ - //creating a new writer document via the XDesktop(to have more shells etc.) - SwDoc* pDoc = createSwDoc(); - //creating instance of IdleTask Class - IdleTask idleTask; - //checking the state of the document via IDocumentState - IDocumentState& rState(pDoc->getIDocumentState()); - //the state should not be modified - CPPUNIT_ASSERT(!(rState.IsModified())); - //checking the state of the document via SfxObjectShell - SwDocShell* pShell(pDoc->GetDocShell()); - CPPUNIT_ASSERT(!(pShell->IsModified())); - //looping around yield until low priority idle task is dispatched and flag is flipped - while(!idleTask.GetFlag()) - { - //dispatching all the events via VCL main-loop - Application::Yield(); - } - //again checking for the state via IDocumentState - CPPUNIT_ASSERT(!(rState.IsModified())); - //again checking for the state via SfxObjectShell - CPPUNIT_ASSERT(!(pShell->IsModified())); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf94804) -{ - //create new writer document - SwDoc* pDoc = createSwDoc(); - //get cursor for making bookmark at a particular location - SwPaM* pCrsr = pDoc->GetEditShell()->GetCursor(); - IDocumentMarkAccess* pIDMAccess(pDoc->getIDocumentMarkAccess()); - //make first bookmark, CROSSREF_HEADING, with *empty* name - sw::mark::IMark* pMark1(pIDMAccess->makeMark(*pCrsr, "", - IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK, - ::sw::mark::InsertMode::New)); - //get the new(autogenerated) bookmark name - OUString bookmark1name = pMark1->GetName(); - //match the bookmark name, it should be like "__RefHeading__**" - CPPUNIT_ASSERT(bookmark1name.match("__RefHeading__")); - //make second bookmark, CROSSREF_NUMITEM, with *empty* name - sw::mark::IMark* pMark2(pIDMAccess->makeMark(*pCrsr, "", - IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK, - ::sw::mark::InsertMode::New)); - //get the new(autogenerated) bookmark name - OUString bookmark2name = pMark2->GetName(); - //match the bookmark name, it should be like "__RefNumPara__**" - CPPUNIT_ASSERT(bookmark2name.match("__RefNumPara__")); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testUnicodeNotationToggle) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "unicodeAltX.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - OUString sOriginalDocString; - OUString sDocString; - OUString sExpectedString; - uno::Sequence aPropertyValues; - - pWrtShell->EndPara(); - sOriginalDocString = pWrtShell->GetCursor()->GetNode().GetTextNode()->GetText(); - CPPUNIT_ASSERT_EQUAL(OUString("uU+002b"), sOriginalDocString); - - dispatchCommand(mxComponent, ".uno:UnicodeNotationToggle", aPropertyValues); - sExpectedString = "u+"; - sDocString = pWrtShell->GetCursor()->GetNode().GetTextNode()->GetText(); - CPPUNIT_ASSERT_EQUAL( sDocString, sExpectedString ); - - dispatchCommand(mxComponent, ".uno:UnicodeNotationToggle", aPropertyValues); - sDocString = pWrtShell->GetCursor()->GetNode().GetTextNode()->GetText(); - CPPUNIT_ASSERT_EQUAL( sDocString, sOriginalDocString ); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf34957) -{ - createSwDoc(DATA_DIRECTORY, "tdf34957.odt"); - // table with "keep with next" always started on a new page if the table was large, - // regardless of whether it was already kept with the previous paragraph, - // or whether the following paragraph actually fit on the same page (MAB 3.6 - 5.0) - CPPUNIT_ASSERT_EQUAL( OUString("Row 1"), parseDump("/root/page[2]/body/tab[1]/row[2]/cell[1]/txt") ); - CPPUNIT_ASSERT_EQUAL( OUString("Row 1"), parseDump("/root/page[4]/body/tab[1]/row[2]/cell[1]/txt") ); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf89954) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf89954.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->EndPara(); - SwXTextDocument* pXTextDocument = dynamic_cast(mxComponent.get()); - CPPUNIT_ASSERT(pXTextDocument); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 't', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'e', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 's', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 't', 0); - pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, '.', 0); - Scheduler::ProcessEventsToIdle(); - - SwNodeIndex aNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); - // Placeholder character for the comment anchor was ^A (CH_TXTATR_BREAKWORD), not (CH_TXTATR_INWORD). - // As a result, autocorrect did not turn the 't' input into 'T'. - CPPUNIT_ASSERT_EQUAL( - OUString(u"Tes\uFFF9t. Test."), aNodeIndex.GetNode().GetTextNode()->GetText()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf89720) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf89720.odt"); - SwView* pView = pDoc->GetDocShell()->GetView(); - SwPostItMgr* pPostItMgr = pView->GetPostItMgr(); - for (std::unique_ptr const & pItem : *pPostItMgr) - { - if (pItem->mpPostIt->IsFollow()) - // This was non-0: reply comments had a text range overlay, - // resulting in unexpected dark color. - CPPUNIT_ASSERT(!pItem->mpPostIt->TextRange()); - } -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf88986) -{ - // Create a text shell. - SwDoc* pDoc = createSwDoc(); - SwView* pView = pDoc->GetDocShell()->GetView(); - SwTextShell aShell(*pView); - - // Create the item set that is normally passed to the insert frame dialog. - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwFlyFrameAttrMgr aMgr(true, pWrtShell, Frmmgr_Type::TEXT, nullptr); - SfxItemSet aSet = aShell.CreateInsertFrameItemSet(aMgr); - - // This was missing along with the gradient and other tables. - CPPUNIT_ASSERT(aSet.HasItem(SID_COLOR_TABLE)); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf78150) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->Insert("foobar"); - - CPPUNIT_ASSERT_EQUAL(OUString("foobar"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:DelToStartOfWord", {}); - - // Without the fix, test fails with: - // equality assertion failed - // - Expected: - // - Actual : f - CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf138873) -{ - SwDoc* pDoc = createSwDoc(); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->Insert("A B C"); - - CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); - - // Select B - pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 2, /*bBasicCall=*/false); - pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false); - - pWrtShell->Insert("DDD"); - - CPPUNIT_ASSERT_EQUAL(OUString("A DDD C"), getParagraph(1)->getString()); - - dispatchCommand(mxComponent, ".uno:Undo", {}); - Scheduler::ProcessEventsToIdle(); - - CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); - - // Select B and C - pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 2, /*bBasicCall=*/false); - - dispatchCommand(mxComponent, ".uno:Copy", {}); - Scheduler::ProcessEventsToIdle(); - - dispatchCommand(mxComponent, ".uno:Paste", {}); - Scheduler::ProcessEventsToIdle(); - - // Without the fix in place, this test would have failed with - // - Expected: A B C - // - Actual : A CB CB - CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf87922) -{ - // Create an SwDrawTextInfo. - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf87922.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - SwScriptInfo* pScriptInfo = nullptr; - // Get access to the single paragraph in the document. - SwNodeIndex aNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); - const OUString& rText = aNodeIndex.GetNode().GetTextNode()->GetText(); - sal_Int32 nLength = rText.getLength(); - SwDrawTextInfo aDrawTextInfo(pWrtShell, *pWrtShell->GetOut(), pScriptInfo, rText, TextFrameIndex(0), TextFrameIndex(nLength)); - // Root -> page -> body -> text. - SwTextFrame* pTextFrame = static_cast(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()); - aDrawTextInfo.SetFrame(pTextFrame); - - // If no color background color is found, assume white. - Color* pColor = sw::GetActiveRetoucheColor(); - *pColor = COL_WHITE; - - // Make sure that automatic color on black background is white, not black. - vcl::Font aFont; - aDrawTextInfo.ApplyAutoColor(&aFont); - CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFont.GetColor()); -} - -#if HAVE_MORE_FONTS -namespace { - -struct PortionItem -{ - PortionItem(OUString const & sItemType, sal_Int32 nLength, - PortionType nTextType) - : msItemType(sItemType) - , mnLength(nLength) - , mnTextType(nTextType) - {} - - OUString msItemType; - sal_Int32 mnLength; - PortionType mnTextType; -}; - -class PortionHandler : public SwPortionHandler -{ - public: - - std::vector mPortionItems; - explicit PortionHandler() - : SwPortionHandler() - {} - - void clear() - { - mPortionItems.clear(); - } - - virtual void Text(TextFrameIndex nLength, PortionType nType, - sal_Int32 /*nHeight*/, sal_Int32 /*nWidth*/) override - { - mPortionItems.emplace_back("text", sal_Int32(nLength), nType); - } - - virtual void Special(TextFrameIndex nLength, const OUString & /*rText*/, - PortionType nType, sal_Int32 /*nHeight*/, - sal_Int32 /*nWidth*/, const SwFont* /*pFont*/) override - { - mPortionItems.emplace_back("special", sal_Int32(nLength), nType); - } - - virtual void LineBreak(sal_Int32 /*nWidth*/) override - { - mPortionItems.emplace_back("line_break", 0, PortionType::NONE); - } - - virtual void Skip(TextFrameIndex nLength) override - { - mPortionItems.emplace_back("skip", sal_Int32(nLength), PortionType::NONE); - } - - virtual void Finish() override - { - mPortionItems.emplace_back("finish", 0, PortionType::NONE); - } -}; - -} -#endif - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf77014) -{ -#if HAVE_MORE_FONTS - // The problem described in the bug tdf#77014 is that the input - // field text ("ThisIsAllOneWord") is broken up on linebreak, but - // it should be in one piece (like normal text). - - // This test checks that the input field is in one piece and if the - // input field has more words, it is broken up at the correct place. - - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf77014.odt"); - SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - - SwTextFrame* pTextFrame = static_cast(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()); - - PortionHandler aHandler; - pTextFrame->VisitPortions(aHandler); - - { - // Input Field - "One Two Three Four Five" = 25 chars - CPPUNIT_ASSERT_EQUAL(OUString("text"), aHandler.mPortionItems[0].msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(25), aHandler.mPortionItems[0].mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::InputField, aHandler.mPortionItems[0].mnTextType); - - CPPUNIT_ASSERT_EQUAL(OUString("line_break"), aHandler.mPortionItems[1].msItemType); - - CPPUNIT_ASSERT_EQUAL(OUString("finish"), aHandler.mPortionItems[2].msItemType); - } - - aHandler.clear(); - - pTextFrame = static_cast(pTextFrame->GetNext()); - pTextFrame->VisitPortions(aHandler); - - { - // Input Field - "ThisIsAllOneWord" = 18 chars - CPPUNIT_ASSERT_EQUAL(OUString("text"), aHandler.mPortionItems[0].msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(18), aHandler.mPortionItems[0].mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::InputField, aHandler.mPortionItems[0].mnTextType); - - CPPUNIT_ASSERT_EQUAL(OUString("line_break"), aHandler.mPortionItems[1].msItemType); - - CPPUNIT_ASSERT_EQUAL(OUString("finish"), aHandler.mPortionItems[2].msItemType); - } - - aHandler.clear(); - - // skip empty paragraph - pTextFrame = static_cast(pTextFrame->GetNext()); - - pTextFrame = static_cast(pTextFrame->GetNext()); - pTextFrame->VisitPortions(aHandler); - - { - // Text "The purpose of this report is to summarize the results of the existing bug in the LO suite" - // = 91 chars - auto& rPortionItem = aHandler.mPortionItems[0]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(91), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); - - // NEW LINE - rPortionItem = aHandler.mPortionItems[1]; - CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); - - // Input Field: "ThisIsAllOneWord" = 18 chars - // which is 16 chars + 2 hidden chars (start & end input field) = 18 chars - // If this is correct then the input field is in one piece - rPortionItem = aHandler.mPortionItems[2]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(18), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); - - // Text "." - rPortionItem = aHandler.mPortionItems[3]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); - - // NEW LINE - rPortionItem = aHandler.mPortionItems[4]; - CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); - - rPortionItem = aHandler.mPortionItems[5]; - CPPUNIT_ASSERT_EQUAL(OUString("finish"), rPortionItem.msItemType); - - } - - aHandler.clear(); - - pTextFrame = static_cast(pTextFrame->GetNext()); - pTextFrame->VisitPortions(aHandler); - { - printf ("Portions:\n"); - - for (const auto& rPortionItem : aHandler.mPortionItems) - { - printf ("-- Type: %s length: %" SAL_PRIdINT32 " text type: %d\n", - rPortionItem.msItemType.toUtf8().getStr(), - rPortionItem.mnLength, - sal_uInt16(rPortionItem.mnTextType)); - } - - // Text "The purpose of this report is to summarize the results of the existing bug in the LO suite" - // 91 chars - auto& rPortionItem = aHandler.mPortionItems[0]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(91), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); - - // The input field here has more words ("One Two Three Four Five") - // and it should break after "Two". - // Input Field: "One Two" = 7 chars + 1 start input field hidden character = 8 chars - rPortionItem = aHandler.mPortionItems[1]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(8), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); - - rPortionItem = aHandler.mPortionItems[2]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::Hole, rPortionItem.mnTextType); - - // NEW LINE - rPortionItem = aHandler.mPortionItems[3]; - CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); - - // Input Field: "Three Four Five" = 16 chars + 1 end input field hidden character = 16 chars - rPortionItem = aHandler.mPortionItems[4]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(16), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); - - // Text "." - rPortionItem = aHandler.mPortionItems[5]; - CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); - CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); - - // NEW LINE - rPortionItem = aHandler.mPortionItems[6]; - CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); - - rPortionItem = aHandler.mPortionItems[7]; - CPPUNIT_ASSERT_EQUAL(OUString("finish"), rPortionItem.msItemType); - } -#endif -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf92648) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf92648.docx"); - SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); - // Make sure we have ten draw shapes. - // Yes, we have if the left/right pages have different header/footer, - // but if not we have only nine of them: - CPPUNIT_ASSERT_EQUAL(sal_Int32(9), SwTextBoxHelper::getCount(pPage)); - // and the text boxes haven't got zero height - sal_Int32 nCount = 0; - for (const SwFrameFormat* pFormat : *pDoc->GetSpzFrameFormats()) - { - if (!SwTextBoxHelper::isTextBox(pFormat, RES_FLYFRMFMT)) - continue; - SwFormatFrameSize aSize(pFormat->GetFrameSize()); - CPPUNIT_ASSERT(aSize.GetHeight() != 0); - ++nCount; - } - // and we have had five of them. - CPPUNIT_ASSERT_EQUAL(sal_Int32(5), nCount); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf103978_backgroundTextShape) -{ - SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf103978_backgroundTextShape.docx"); - - // there is only one shape. It has an attached textbox - bool bShapeIsOpaque = getProperty(getShape(1), "Opaque"); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape is in the foreground", false, bShapeIsOpaque ); - sal_Int32 nCount = 0; - for (const SwFrameFormat* pFormat : *pDoc->GetSpzFrameFormats()) - { - if (!SwTextBoxHelper::isTextBox(pFormat, RES_FLYFRMFMT)) - continue; - CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox syncs the shape's transparency", bShapeIsOpaque, pFormat->GetOpaque().GetValue() ); - ++nCount; - } - //ensure that we don't skip the for loop without an error - CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of TextBoxes", sal_Int32(1), nCount); -} - -CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf117225) -{ - // Test that saving a document with an embedded object does not leak - // tempfiles in the directory of the target file. - OUString aTargetDirectory = m_directories.getURLFromWorkdir(u"/CppunitTest/sw_uiwriter.test.user/"); - OUString aTargetFile = aTargetDirectory + "tdf117225.odt"; - OUString aSourceFile = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf117225.odt"; - osl::File::copy(aSourceFile, aTargetFile); - mxComponent = loadFromDesktop(aTargetFile); - uno::Reference xStorable(mxComponent, uno::UNO_QUERY); - int nExpected = CountFilesInDirectory(aTargetDirectory); - xStorable->store(); - int nActual = CountFilesInDirectory(aTargetDirectory); - // nActual was nExpected + 1, i.e. we leaked a tempfile. - CPPUNIT_ASSERT_EQUAL(nExpected, nActual); - - OUString aTargetFileSaveAs = aTargetDirectory + "tdf117225-save-as.odt"; - xStorable->storeAsURL(aTargetFileSaveAs, {}); - ++nExpected; - nActual = CountFilesInDirectory(aTargetDirectory); - // nActual was nExpected + 1, i.e. we leaked a tempfile. - CPPUNIT_ASSERT_EQUAL(nExpected, nActual); -} - CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/uiwriter/uiwriter7.cxx b/sw/qa/extras/uiwriter/uiwriter7.cxx new file mode 100644 index 000000000000..b8d5b2f3eff0 --- /dev/null +++ b/sw/qa/extras/uiwriter/uiwriter7.cxx @@ -0,0 +1,2777 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +constexpr OUStringLiteral DATA_DIRECTORY = u"/sw/qa/extras/uiwriter/data/"; + +int CountFilesInDirectory(const OUString& rURL) +{ + int nRet = 0; + + osl::Directory aDir(rURL); + CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, aDir.open()); + + osl::DirectoryItem aItem; + osl::FileStatus aFileStatus(osl_FileStatus_Mask_FileURL | osl_FileStatus_Mask_Type); + while (aDir.getNextItem(aItem) == osl::FileBase::E_None) + { + aItem.getFileStatus(aFileStatus); + if (aFileStatus.getFileType() != osl::FileStatus::Directory) + ++nRet; + } + + return nRet; +} + +} //namespace + +class SwUiWriterTest7 : public SwModelTestBase +{ +}; + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testExportToPicture) +{ + createSwDoc(); + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "PixelWidth", uno::Any(sal_Int32(610)) }, + { "PixelHeight", uno::Any(sal_Int32(610)) } })); + uno::Sequence aDescriptor(comphelper::InitPropertySequence( + { { "FilterName", uno::Any(OUString("writer_png_Export")) }, + { "FilterData", uno::Any(aFilterData) } })); + utl::TempFile aTempFile; + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(aTempFile.GetURL(), aDescriptor); + bool extchk = aTempFile.IsValid(); + CPPUNIT_ASSERT_EQUAL(true, extchk); + osl::File tmpFile(aTempFile.GetURL()); + tmpFile.open(sal_uInt32(osl_File_OpenFlag_Read)); + sal_uInt64 val; + CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, tmpFile.getSize(val)); + CPPUNIT_ASSERT(val > 100); + aTempFile.EnableKillingFile(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf77340) +{ + createSwDoc(); + //Getting some paragraph style in our document + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xStyle( + xFactory->createInstance("com.sun.star.style.ParagraphStyle"), uno::UNO_QUERY); + uno::Reference xPropSet(xStyle, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue("ParaBackColor", uno::makeAny(sal_Int32(0xFF00FF))); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNameAccess(xSupplier->getStyleFamilies()); + uno::Reference xNameCont; + xNameAccess->getByName("ParagraphStyles") >>= xNameCont; + xNameCont->insertByName("myStyle", uno::makeAny(xStyle)); + CPPUNIT_ASSERT_EQUAL(OUString("myStyle"), xStyle->getName()); + //Setting the properties with proper values + xPropSet->setPropertyValue("PageDescName", uno::makeAny(OUString("First Page"))); + xPropSet->setPropertyValue("PageNumberOffset", uno::makeAny(sal_Int16(3))); + //Getting the properties and checking that they have proper values + CPPUNIT_ASSERT_EQUAL(uno::makeAny(OUString("First Page")), + xPropSet->getPropertyValue("PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_Int16(3)), + xPropSet->getPropertyValue("PageNumberOffset")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf79236) +{ + SwDoc* pDoc = createSwDoc(); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + //Getting some paragraph style + SwTextFormatColl* pTextFormat = pDoc->FindTextFormatCollByName(u"Text Body"); + const SwAttrSet& rAttrSet = pTextFormat->GetAttrSet(); + std::unique_ptr pNewSet = rAttrSet.Clone(); + sal_uInt16 initialCount = pNewSet->Count(); + SvxAdjustItem AdjustItem = rAttrSet.GetAdjust(); + SvxAdjust initialAdjust = AdjustItem.GetAdjust(); + //By default the adjust is LEFT + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, initialAdjust); + //Changing the adjust to RIGHT + AdjustItem.SetAdjust(SvxAdjust::Right); + //Checking whether the change is made or not + SvxAdjust modifiedAdjust = AdjustItem.GetAdjust(); + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, modifiedAdjust); + //Modifying the itemset, putting *one* item + pNewSet->Put(AdjustItem); + //The count should increment by 1 + sal_uInt16 modifiedCount = pNewSet->Count(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(initialCount + 1), modifiedCount); + //Setting the updated item set on the style + pDoc->ChgFormat(*pTextFormat, *pNewSet); + //Checking the Changes + SwTextFormatColl* pTextFormat2 = pDoc->FindTextFormatCollByName(u"Text Body"); + const SwAttrSet& rAttrSet2 = pTextFormat2->GetAttrSet(); + const SvxAdjustItem& rAdjustItem2 = rAttrSet2.GetAdjust(); + SvxAdjust Adjust2 = rAdjustItem2.GetAdjust(); + //The adjust should be RIGHT as per the modifications made + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, Adjust2); + //Undo the changes + rUndoManager.Undo(); + SwTextFormatColl* pTextFormat3 = pDoc->FindTextFormatCollByName(u"Text Body"); + const SwAttrSet& rAttrSet3 = pTextFormat3->GetAttrSet(); + const SvxAdjustItem& rAdjustItem3 = rAttrSet3.GetAdjust(); + SvxAdjust Adjust3 = rAdjustItem3.GetAdjust(); + //The adjust should be back to default, LEFT + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, Adjust3); + //Redo the changes + rUndoManager.Redo(); + SwTextFormatColl* pTextFormat4 = pDoc->FindTextFormatCollByName(u"Text Body"); + const SwAttrSet& rAttrSet4 = pTextFormat4->GetAttrSet(); + const SvxAdjustItem& rAdjustItem4 = rAttrSet4.GetAdjust(); + SvxAdjust Adjust4 = rAdjustItem4.GetAdjust(); + //The adjust should be RIGHT as per the modifications made + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, Adjust4); + //Undo the changes + rUndoManager.Undo(); + SwTextFormatColl* pTextFormat5 = pDoc->FindTextFormatCollByName(u"Text Body"); + const SwAttrSet& rAttrSet5 = pTextFormat5->GetAttrSet(); + const SvxAdjustItem& rAdjustItem5 = rAttrSet5.GetAdjust(); + SvxAdjust Adjust5 = rAdjustItem5.GetAdjust(); + //The adjust should be back to default, LEFT + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, Adjust5); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTextSearch) +{ + // Create a new empty Writer document + SwDoc* pDoc = createSwDoc(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + // Insert some text + rIDCO.InsertString(*pCursor, "Hello World This is a test"); + // Use cursor to select part of text + for (int i = 0; i < 10; i++) + { + pCursor->Move(fnMoveBackward); + } + pCursor->SetMark(); + for (int i = 0; i < 4; i++) + { + pCursor->Move(fnMoveBackward); + } + //Checking that the proper selection is made + CPPUNIT_ASSERT_EQUAL(OUString("This"), pCursor->GetText()); + // Apply a "Bold" attribute to selection + SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + //making another selection of text + for (int i = 0; i < 7; i++) + { + pCursor->Move(fnMoveBackward); + } + pCursor->SetMark(); + for (int i = 0; i < 5; i++) + { + pCursor->Move(fnMoveBackward); + } + //Checking that the proper selection is made + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), pCursor->GetText()); + // Apply a "Bold" attribute to selection + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + //Performing Search Operation and also covering the UNO coverage for setProperty + uno::Reference xSearch(mxComponent, uno::UNO_QUERY); + uno::Reference xSearchDes = xSearch->createSearchDescriptor(); + uno::Reference xProp(xSearchDes, uno::UNO_QUERY); + //setting some properties + uno::Sequence aDescriptor(comphelper::InitPropertySequence( + { { "CharWeight", uno::Any(float(css::awt::FontWeight::BOLD)) } })); + xProp->setSearchAttributes(aDescriptor); + //receiving the defined properties and asserting them with expected values, covering UNO + uno::Sequence aPropVal2(xProp->getSearchAttributes()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aPropVal2.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("CharWeight"), aPropVal2[0].Name); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(css::awt::FontWeight::BOLD)), aPropVal2[0].Value); + //specifying the search attributes + uno::Reference xPropSet(xSearchDes, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue("SearchWords", uno::makeAny(true)); + xPropSet->setPropertyValue("SearchCaseSensitive", uno::makeAny(true)); + //this will search all the BOLD words + uno::Reference xIndex(xSearch->findAll(xSearchDes)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount()); + //Replacing the searched string via XReplaceable + uno::Reference xReplace(mxComponent, uno::UNO_QUERY); + uno::Reference xReplaceDes = xReplace->createReplaceDescriptor(); + uno::Reference xProp2(xReplaceDes, uno::UNO_QUERY); + xProp2->setReplaceAttributes(aDescriptor); + //checking that the proper attributes are there or not + uno::Sequence aRepProp(xProp2->getReplaceAttributes()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aRepProp.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("CharWeight"), aRepProp[0].Name); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(css::awt::FontWeight::BOLD)), aRepProp[0].Value); + //setting strings for replacement + xReplaceDes->setSearchString("test"); + xReplaceDes->setReplaceString("task"); + //checking the replaceString + CPPUNIT_ASSERT_EQUAL(OUString("task"), xReplaceDes->getReplaceString()); + //this will replace *normal*test to *bold*task + sal_Int32 ReplaceCount = xReplace->replaceAll(xReplaceDes); + //There should be only 1 replacement since there is only one occurrence of "test" in the document + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + //Now performing search again for BOLD words, count should be 3 due to replacement + uno::Reference xIndex2(xReplace->findAll(xSearchDes)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndex2->getCount()); + // regex tests + xSearchDes->setPropertyValue("SearchRegularExpression", uno::makeAny(true)); + // regex: test correct matching combined with attributes like BOLD + xSearchDes->setSearchString(".*"); // should match all bold words in the text + xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndex->getCount()); + uno::Reference xFound(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xFound->getString()); + xFound.set(xIndex->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("This"), xFound->getString()); + xFound.set(xIndex->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("task"), xFound->getString()); + // regex: test anchor combined with attributes like BOLD + xSearchDes->setSearchString("^.*|.*$"); // should match first and last words (they are bold) + xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount()); + xFound.set(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xFound->getString()); + xFound.set(xIndex->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("task"), xFound->getString()); + // regex: test look-ahead/look-behind assertions outside of the bold text + xSearchDes->setSearchString("(?<= ).*(?= )"); // should match second bold word + xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndex->getCount()); + xFound.set(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("This"), xFound->getString()); + xReplaceDes->setPropertyValue("SearchRegularExpression", uno::makeAny(true)); + // regex: test correct match of paragraph start + xReplaceDes->setSearchString("^."); // should only match first character of the paragraph + xReplaceDes->setReplaceString("C"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: test correct match of word start + xReplaceDes->setSearchString("\\b\\w"); // should match all words' first characters + xReplaceDes->setReplaceString("x&"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), ReplaceCount); + // regex: test negative look-behind assertion + xReplaceDes->setSearchString("(?setReplaceString("y"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: test positive look-behind assertion + xReplaceDes->setSearchString("(?<=xCelly xWorld xTh)i"); // only "i" in "xThis", not in "xis" + xReplaceDes->setReplaceString("z"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: use capturing group to test reference + xReplaceDes->setSearchString("\\b(\\w\\w\\w\\w)\\w"); + xReplaceDes->setReplaceString("$1q"); // only fifth characters in words should change + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), ReplaceCount); + // check of the end result + CPPUNIT_ASSERT_EQUAL(OUString("xCelqy xWorqd xThzq xis xa xtasq"), + pCursor->GetNode().GetTextNode()->GetText()); + // regex: use positive look-ahead assertion + xReplaceDes->setSearchString("Wor(?=qd xThzq xis xa xtasq)"); + xReplaceDes->setReplaceString("&p"); // testing & reference + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: use negative look-ahead assertion + xReplaceDes->setSearchString("x(?!Worpqd xThzq xis xa xtasq)"); + xReplaceDes->setReplaceString("m"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), ReplaceCount); // one of the 6 "x" must not be replaced + // check of the end result + CPPUNIT_ASSERT_EQUAL(OUString("mCelqy xWorpqd mThzq mis ma mtasq"), + pCursor->GetNode().GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf69282) +{ + SwDoc* source = createSwDoc(); + uno::Reference xSourceDoc = mxComponent; + mxComponent.clear(); + SwDoc* target = createSwDoc(); + SwPageDesc* sPageDesc = source->MakePageDesc("SourceStyle"); + SwPageDesc* tPageDesc = target->MakePageDesc("TargetStyle"); + sPageDesc->ChgFirstShare(false); + CPPUNIT_ASSERT(!sPageDesc->IsFirstShared()); + SwFrameFormat& rSourceMasterFormat = sPageDesc->GetMaster(); + //Setting horizontal spaces on master + SvxLRSpaceItem horizontalSpace(RES_LR_SPACE); + horizontalSpace.SetLeft(11); + horizontalSpace.SetRight(12); + rSourceMasterFormat.SetFormatAttr(horizontalSpace); + //Setting vertical spaces on master + SvxULSpaceItem verticalSpace(RES_UL_SPACE); + verticalSpace.SetUpper(13); + verticalSpace.SetLower(14); + rSourceMasterFormat.SetFormatAttr(verticalSpace); + //Changing the style and copying it to target + source->ChgPageDesc("SourceStyle", *sPageDesc); + target->CopyPageDesc(*sPageDesc, *tPageDesc); + //Checking the set values on all Formats in target + SwFrameFormat& rTargetMasterFormat = tPageDesc->GetMaster(); + SwFrameFormat& rTargetLeftFormat = tPageDesc->GetLeft(); + SwFrameFormat& rTargetFirstMasterFormat = tPageDesc->GetFirstMaster(); + SwFrameFormat& rTargetFirstLeftFormat = tPageDesc->GetFirstLeft(); + //Checking horizontal spaces + const SvxLRSpaceItem MasterLRSpace = rTargetMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), MasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), MasterLRSpace.GetRight()); + const SvxLRSpaceItem LeftLRSpace = rTargetLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), LeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), LeftLRSpace.GetRight()); + const SvxLRSpaceItem FirstMasterLRSpace = rTargetFirstMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstMasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstMasterLRSpace.GetRight()); + const SvxLRSpaceItem FirstLeftLRSpace = rTargetFirstLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstLeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstLeftLRSpace.GetRight()); + //Checking vertical spaces + const SvxULSpaceItem MasterULSpace = rTargetMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), MasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), MasterULSpace.GetLower()); + const SvxULSpaceItem LeftULSpace = rTargetLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), LeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), LeftULSpace.GetLower()); + const SvxULSpaceItem FirstMasterULSpace = rTargetFirstMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstMasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstMasterULSpace.GetLower()); + const SvxULSpaceItem FirstLeftULSpace = rTargetFirstLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstLeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstLeftULSpace.GetLower()); + xSourceDoc->dispose(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf69282WithMirror) +{ + SwDoc* source = createSwDoc(); + uno::Reference xSourceDoc = mxComponent; + mxComponent.clear(); + SwDoc* target = createSwDoc(); + SwPageDesc* sPageDesc = source->MakePageDesc("SourceStyle"); + SwPageDesc* tPageDesc = target->MakePageDesc("TargetStyle"); + //Enabling Mirror + sPageDesc->SetUseOn(UseOnPage::Mirror); + SwFrameFormat& rSourceMasterFormat = sPageDesc->GetMaster(); + //Setting horizontal spaces on master + SvxLRSpaceItem horizontalSpace(RES_LR_SPACE); + horizontalSpace.SetLeft(11); + horizontalSpace.SetRight(12); + rSourceMasterFormat.SetFormatAttr(horizontalSpace); + //Setting vertical spaces on master + SvxULSpaceItem verticalSpace(RES_UL_SPACE); + verticalSpace.SetUpper(13); + verticalSpace.SetLower(14); + rSourceMasterFormat.SetFormatAttr(verticalSpace); + //Changing the style and copying it to target + source->ChgPageDesc("SourceStyle", *sPageDesc); + target->CopyPageDesc(*sPageDesc, *tPageDesc); + //Checking the set values on all Formats in target + SwFrameFormat& rTargetMasterFormat = tPageDesc->GetMaster(); + SwFrameFormat& rTargetLeftFormat = tPageDesc->GetLeft(); + SwFrameFormat& rTargetFirstMasterFormat = tPageDesc->GetFirstMaster(); + SwFrameFormat& rTargetFirstLeftFormat = tPageDesc->GetFirstLeft(); + //Checking horizontal spaces + const SvxLRSpaceItem MasterLRSpace = rTargetMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), MasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), MasterLRSpace.GetRight()); + //mirror effect should be present + const SvxLRSpaceItem LeftLRSpace = rTargetLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), LeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), LeftLRSpace.GetRight()); + const SvxLRSpaceItem FirstMasterLRSpace = rTargetFirstMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstMasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstMasterLRSpace.GetRight()); + //mirror effect should be present + const SvxLRSpaceItem FirstLeftLRSpace = rTargetFirstLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstLeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstLeftLRSpace.GetRight()); + //Checking vertical spaces + const SvxULSpaceItem MasterULSpace = rTargetMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), MasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), MasterULSpace.GetLower()); + const SvxULSpaceItem LeftULSpace = rTargetLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), LeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), LeftULSpace.GetLower()); + const SvxULSpaceItem FirstMasterULSpace = rTargetFirstMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstMasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstMasterULSpace.GetLower()); + const SvxULSpaceItem FirstLeftULSpace = rTargetFirstLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstLeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstLeftULSpace.GetLower()); + xSourceDoc->dispose(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf78742) +{ + //testing with service type and any .ods file + OUString path = m_directories.getURLFromSrc(DATA_DIRECTORY) + "calc-data-source.ods"; + SfxMedium aMedium(path, StreamMode::READ | StreamMode::SHARE_DENYWRITE); + SfxFilterMatcher aMatcher("com.sun.star.text.TextDocument"); + std::shared_ptr pFilter; + ErrCode filter = aMatcher.DetectFilter(aMedium, pFilter); + CPPUNIT_ASSERT_EQUAL(ERRCODE_IO_ABORT, filter); + //it should not return any Filter + CPPUNIT_ASSERT(!pFilter); + //testing without service type and any .ods file + SfxMedium aMedium2(path, StreamMode::READ | StreamMode::SHARE_DENYWRITE); + SfxFilterMatcher aMatcher2; + std::shared_ptr pFilter2; + ErrCode filter2 = aMatcher2.DetectFilter(aMedium2, pFilter2); + CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, filter2); + //Filter should be returned with proper Name + CPPUNIT_ASSERT_EQUAL(OUString("calc8"), pFilter2->GetFilterName()); + //testing with service type and any .odt file + OUString path2 = m_directories.getURLFromSrc(DATA_DIRECTORY) + "fdo69893.odt"; + SfxMedium aMedium3(path2, StreamMode::READ | StreamMode::SHARE_DENYWRITE); + SfxFilterMatcher aMatcher3("com.sun.star.text.TextDocument"); + std::shared_ptr pFilter3; + ErrCode filter3 = aMatcher3.DetectFilter(aMedium3, pFilter3); + CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, filter3); + //Filter should be returned with proper Name + CPPUNIT_ASSERT_EQUAL(OUString("writer8"), pFilter3->GetFilterName()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUnoParagraph) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //Inserting some text content in the document + pWrtShell->Insert("This is initial text in paragraph one"); + pWrtShell->SplitNode(); + //Inserting second paragraph + pWrtShell->Insert("This is initial text in paragraph two"); + //now testing the SwXParagraph + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText(xTextDocument->getText()); + uno::Reference xParaAccess(xText, uno::UNO_QUERY); + uno::Reference xPara(xParaAccess->createEnumeration()); + //getting first paragraph + uno::Reference xFirstParaContent(xPara->nextElement(), uno::UNO_QUERY); + uno::Reference xFirstPara(xFirstParaContent, uno::UNO_QUERY); + //testing the initial text + CPPUNIT_ASSERT_EQUAL(OUString("This is initial text in paragraph one"), + xFirstPara->getString()); + //changing the text content in first paragraph + xFirstPara->setString("This is modified text in paragraph one"); + //testing the changes + CPPUNIT_ASSERT_EQUAL(OUString("This is modified text in paragraph one"), + xFirstPara->getString()); + //getting second paragraph + uno::Reference xSecondParaContent(xPara->nextElement(), uno::UNO_QUERY); + uno::Reference xSecondPara(xSecondParaContent, uno::UNO_QUERY); + //testing the initial text + CPPUNIT_ASSERT_EQUAL(OUString("This is initial text in paragraph two"), + xSecondPara->getString()); + //changing the text content in second paragraph + xSecondPara->setString("This is modified text in paragraph two"); + //testing the changes + CPPUNIT_ASSERT_EQUAL(OUString("This is modified text in paragraph two"), + xSecondPara->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf72788) +{ + //Create a new empty Writer document + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + //Insert some text - two paragraphs + rIDCO.InsertString(*pCursor, "this is text"); + //Position of word 9876543210 + //Position of word 0123456789 + //Change Paragraph + pWrtShell->SplitNode(); + //Insert second paragraph + rIDCO.InsertString(*pCursor, "more text"); + //Position of word 012345678 + //Make the following selection *bold* + //this[is text + //more] text + //Move cursor back + for (int i = 0; i < 5; i++) + { + pCursor->Move(fnMoveBackward); + } + //Start selection + pCursor->SetMark(); + for (int i = 0; i < 12; i++) + { + pCursor->Move(fnMoveBackward); + } + //Check the text selection + CPPUNIT_ASSERT_EQUAL(OUString(u"is text" + OUStringChar(CH_TXTATR_NEWLINE) + u"more"), + pCursor->GetText()); + //Apply a *Bold* attribute to selection + SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + SfxItemSet aSet(pDoc->GetAttrPool(), svl::Items); + //Add selected text's attributes to aSet + pCursor->GetNode().GetTextNode()->GetParaAttr(aSet, 5, 12); + SfxPoolItem const* pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); + //Check that bold is active on the selection and it's in aSet + CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem == aWeightItem)); + //Make selection to remove formatting in first paragraph + //[this is text + //]more text + pWrtShell->StartOfSection(); + //Start selection + pCursor->SetMark(); + for (int i = 0; i < 13; i++) + { + pCursor->Move(fnMoveForward); + } + //Clear all the Direct Formatting ( Ctrl + M ) + SwTextNode* pTextNode = pCursor->GetNode().GetTextNode(); + SwIndex aSt(pTextNode, 0); + sal_Int32 nEnd = pTextNode->Len(); + pTextNode->RstTextAttr(aSt, nEnd - aSt.GetIndex()); + //In case of Regression RstTextAttr() call will result to infinite recursion + //Check that bold is removed in first paragraph + aSet.ClearItem(); + pTextNode->GetParaAttr(aSet, 5, 12); + SfxPoolItem const* pPoolItem2 = aSet.GetItem(RES_CHRATR_WEIGHT); + CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem2 != aWeightItem)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf60967) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", true, true, true); + //Inserting table + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 2, 2); + //getting the cursor's position just after the table insert + SwPosition aPosAfterTable(*(pCursor->GetPoint())); + //moving cursor to B2 (bottom right cell) + pCursor->Move(fnMoveBackward); + SwPosition aPosInTable(*(pCursor->GetPoint())); + //deleting paragraph following table with Ctrl+Shift+Del + bool val = pWrtShell->DelToEndOfSentence(); + CPPUNIT_ASSERT_EQUAL(true, val); + //getting the cursor's position just after the paragraph deletion + SwPosition aPosAfterDel(*(pCursor->GetPoint())); + //moving cursor forward to check whether there is any node following the table, BTW there should not be any such node + pCursor->Move(fnMoveForward); + SwPosition aPosMoveAfterDel(*(pCursor->GetPoint())); + //checking the positions to verify that the paragraph is actually deleted + CPPUNIT_ASSERT_EQUAL(aPosAfterDel, aPosInTable); + CPPUNIT_ASSERT_EQUAL(aPosMoveAfterDel, aPosInTable); + //Undo the changes + rUndoManager.Undo(); + { + //paragraph *text node* should be back + SwPosition aPosAfterUndo(*(pCursor->GetPoint())); + //after undo aPosAfterTable increases the node position by one, since this contains the position *text node* so aPosAfterUndo should be less than aPosAfterTable + CPPUNIT_ASSERT(aPosAfterTable > aPosAfterUndo); + //moving cursor forward to check whether there is any node following the paragraph, BTW there should not be any such node as paragraph node is the last one in header + pCursor->Move(fnMoveForward); + SwPosition aPosMoveAfterUndo(*(pCursor->GetPoint())); + //checking positions to verify that paragraph node is the last one and we are paragraph node only + CPPUNIT_ASSERT(aPosAfterTable > aPosMoveAfterUndo); + CPPUNIT_ASSERT_EQUAL(aPosAfterUndo, aPosMoveAfterUndo); + } + //Redo the changes + rUndoManager.Redo(); + //paragraph *text node* should not be there + SwPosition aPosAfterRedo(*(pCursor->GetPoint())); + //position should be exactly same as it was after deletion of *text node* + CPPUNIT_ASSERT_EQUAL(aPosAfterRedo, aPosMoveAfterDel); + //moving the cursor forward, but it should not actually move as there is no *text node* after the table due to this same position is expected after move as it was before move + pCursor->Move(fnMoveForward); + SwPosition aPosAfterUndoMove(*(pCursor->GetPoint())); + CPPUNIT_ASSERT_EQUAL(aPosAfterRedo, aPosAfterUndoMove); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testSearchWithTransliterate) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + { + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, "This is paragraph one"); + pWrtShell->SplitNode(); + } + { + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, "This is Other PARAGRAPH"); + } + i18nutil::SearchOptions2 SearchOpt; + SearchOpt.algorithmType = css::util::SearchAlgorithms_ABSOLUTE; + SearchOpt.searchFlag = css::util::SearchFlags::ALL_IGNORE_CASE; + SearchOpt.searchString = "other"; + SearchOpt.replaceString.clear(); + SearchOpt.changedChars = 0; + SearchOpt.deletedChars = 0; + SearchOpt.insertedChars = 0; + SearchOpt.transliterateFlags = TransliterationFlags::IGNORE_DIACRITICS_CTL; + SearchOpt.AlgorithmType2 = css::util::SearchAlgorithms2::ABSOLUTE; + SearchOpt.WildcardEscapeCharacter = 0; + //transliteration option set so that at least one of the search strings is not found + sal_uLong case1 + = pWrtShell->SearchPattern(SearchOpt, true, SwDocPositions::Start, SwDocPositions::End); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true); + CPPUNIT_ASSERT_EQUAL(OUString(), pShellCursor->GetText()); + CPPUNIT_ASSERT_EQUAL(0, static_cast(case1)); + SearchOpt.searchString = "paragraph"; + SearchOpt.transliterateFlags = TransliterationFlags::IGNORE_KASHIDA_CTL; + //transliteration option set so that all search strings are found + sal_uLong case2 + = pWrtShell->SearchPattern(SearchOpt, true, SwDocPositions::Start, SwDocPositions::End); + pShellCursor = pWrtShell->getShellCursor(true); + CPPUNIT_ASSERT_EQUAL(OUString("paragraph"), pShellCursor->GetText()); + CPPUNIT_ASSERT_EQUAL(1, static_cast(case2)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf73660) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + OUString aData1 = "First" + OUStringChar(CHAR_SOFTHYPHEN) + "Word"; + OUString aData2 = "Seco" + OUStringChar(CHAR_SOFTHYPHEN) + "nd"; + OUString aData3 = OUStringChar(CHAR_SOFTHYPHEN) + "Third"; + OUString aData4 = "Fourth" + OUStringChar(CHAR_SOFTHYPHEN); + pWrtShell->Insert("We are inserting some text in the document to check the search feature "); + pWrtShell->Insert(aData1 + " "); + pWrtShell->Insert(aData2 + " "); + pWrtShell->Insert(aData3 + " "); + pWrtShell->Insert(aData4 + " "); + pWrtShell->Insert("Fifth "); + pWrtShell->Insert("Now we have enough text let's test search for all the cases"); + //searching for all 5 strings entered with soft-hyphen, search string contains no soft-hyphen + i18nutil::SearchOptions2 searchOpt; + searchOpt.algorithmType = css::util::SearchAlgorithms_REGEXP; + searchOpt.searchFlag = css::util::SearchFlags::NORM_WORD_ONLY; + //case 1 + searchOpt.searchString = "First"; + CPPUNIT_ASSERT_EQUAL( + sal_uLong(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 2 + searchOpt.searchString = "Second"; + CPPUNIT_ASSERT_EQUAL( + sal_uLong(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 3 + searchOpt.searchString = "Third"; + CPPUNIT_ASSERT_EQUAL( + sal_uLong(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 4 + searchOpt.searchString = "Fourth"; + CPPUNIT_ASSERT_EQUAL( + sal_uLong(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 5 + searchOpt.searchString = "Fifth"; + CPPUNIT_ASSERT_EQUAL( + sal_uLong(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testNewDocModifiedState) +{ + //creating a new doc + SwDoc* pDoc = new SwDoc(); + //getting the state of the document via IDocumentState + IDocumentState& rState(pDoc->getIDocumentState()); + //the state should not be modified, no modifications yet + CPPUNIT_ASSERT(!(rState.IsModified())); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf77342) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + //inserting first footnote + pWrtShell->InsertFootnote(""); + SwFieldType* pField = pWrtShell->GetFieldType(0, SwFieldIds::GetRef); + SwGetRefFieldType* pRefType = static_cast(pField); + //moving cursor to the starting of document + pWrtShell->StartOfSection(); + //inserting reference field 1 + SwGetRefField aField1(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(0), REF_CONTENT); + pWrtShell->InsertField2(aField1); + //inserting second footnote + pWrtShell->InsertFootnote(""); + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + //inserting reference field 2 + SwGetRefField aField2(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(1), REF_CONTENT); + pWrtShell->InsertField2(aField2); + //inserting third footnote + pWrtShell->InsertFootnote(""); + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //inserting reference field 3 + SwGetRefField aField3(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(2), REF_CONTENT); + pWrtShell->InsertField2(aField3); + //updating the fields + IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess()); + rField.UpdateExpFields(nullptr, true); + //creating new clipboard doc + rtl::Reference xClpDoc(new SwDoc()); + xClpDoc->SetClipBoard(true); + xClpDoc->getIDocumentFieldsAccess().LockExpFields(); + //selecting reference field 2 and reference field 3 and footnote 1 and footnote 2 + //selection is such that more than one and not all footnotes and ref fields are selected + pCursor->Move(fnMoveBackward); + pCursor->Move(fnMoveBackward); + //start marking + pCursor->SetMark(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //copying the selection to clipboard + pWrtShell->Copy(*xClpDoc); + //deleting selection mark after copy + pCursor->DeleteMark(); + //checking that the footnotes reference fields have same values after copy operation + uno::Any aAny; + sal_uInt16 aFormat; + //reference field 1 + pWrtShell->StartOfSection(); + SwField* pRef1 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef1->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef1->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); + //reference field 2 + pCursor->Move(fnMoveForward); + SwField* pRef2 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef2->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef2->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //reference field 3 + pCursor->Move(fnMoveForward); + SwField* pRef3 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef3->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef3->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //moving cursor to the end of the document + pWrtShell->EndOfSection(); + //pasting the copied selection at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //old reference field 1 + SwField* pOldRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef13 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef13->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef13->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //old footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd1 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote1 + = pTextNd1->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote1(pFootnote1->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnote1.GetNumber()); + SwTextFootnote* pTFNote1 = static_cast(pFootnote1); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pTFNote1->GetSeqRefNo()); + //old footnote 2 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd2 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote2 + = pTextNd2->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote2(pFootnote2->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnote2.GetNumber()); + SwTextFootnote* pTFNote2 = static_cast(pFootnote2); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTFNote2->GetSeqRefNo()); + //old footnote 3 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd3 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote3 + = pTextNd3->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote3(pFootnote3->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnote3.GetNumber()); + SwTextFootnote* pTFNote3 = static_cast(pFootnote3); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pTFNote3->GetSeqRefNo()); + //new reference field 1 + pCursor->Move(fnMoveForward); + SwField* pNewRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(3)), aAny); + //new footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd4 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote4 + = pTextNd4->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote4(pFootnote4->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnote4.GetNumber()); + SwTextFootnote* pTFNote4 = static_cast(pFootnote4); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote4->GetSeqRefNo()); + //moving the cursor to the starting of document + pWrtShell->StartOfSection(); + //pasting the selection again at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //new reference field 1 + SwField* pNewRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(4)), aAny); + //new footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd11 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote11 + = pTextNd11->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote11(pFootnote11->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnote11.GetNumber()); + SwTextFootnote* pTFNote11 = static_cast(pFootnote11); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pTFNote11->GetSeqRefNo()); + //old reference field 1 + pCursor->Move(fnMoveForward); + SwField* pOldRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef23 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef23->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef23->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //old footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd12 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote12 + = pTextNd12->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote12(pFootnote12->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnote12.GetNumber()); + SwTextFootnote* pTFNote12 = static_cast(pFootnote12); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pTFNote12->GetSeqRefNo()); + //old footnote 2 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd13 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote13 + = pTextNd13->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote13(pFootnote13->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnote13.GetNumber()); + SwTextFootnote* pTFNote13 = static_cast(pFootnote13); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTFNote13->GetSeqRefNo()); + //old footnote 3 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd14 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote14 + = pTextNd14->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote14(pFootnote14->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnote14.GetNumber()); + SwTextFootnote* pTFNote14 = static_cast(pFootnote14); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pTFNote14->GetSeqRefNo()); + //old reference field 4 + pCursor->Move(fnMoveForward); + SwField* pOldRef24 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef24->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef24->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //old reference field 5 + pCursor->Move(fnMoveForward); + SwField* pOldRef25 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef25->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef25->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(3)), aAny); + //old footnote 4 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd15 = pCursor->GetNode().GetTextNode(); + SwTextAttr* const pFootnote15 + = pTextNd15->GetTextAttrForCharAt(pCursor->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote15(pFootnote15->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), rFootnote15.GetNumber()); + SwTextFootnote* pTFNote15 = static_cast(pFootnote15); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote15->GetSeqRefNo()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf63553) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + //inserting sequence field 1 + SwSetExpFieldType* pSeqType = static_cast( + pWrtShell->GetFieldType(SwFieldIds::SetExp, "Illustration")); + SwSetExpField aSetField1(pSeqType, "", SVX_NUM_ARABIC); + pWrtShell->InsertField2(aSetField1); + SwGetRefFieldType* pRefType + = static_cast(pWrtShell->GetFieldType(0, SwFieldIds::GetRef)); + //moving cursor to the starting of document + pWrtShell->StartOfSection(); + //inserting reference field 1 + SwGetRefField aGetField1(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(0), + REF_CONTENT); + pWrtShell->InsertField2(aGetField1); + //now we have ref1-seq1 + //moving the cursor + pCursor->Move(fnMoveForward); + //inserting sequence field 2 + SwSetExpField aSetField2(pSeqType, "", SVX_NUM_ARABIC); + pWrtShell->InsertField2(aSetField2); + //moving the cursor + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + //inserting reference field 2 + SwGetRefField aGetField2(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(1), + REF_CONTENT); + pWrtShell->InsertField2(aGetField2); + //now we have ref1-ref2-seq1-seq2 + //moving the cursor + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //inserting sequence field 3 + SwSetExpField aSetField3(pSeqType, "", SVX_NUM_ARABIC); + pWrtShell->InsertField2(aSetField3); + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //inserting reference field 3 + SwGetRefField aGetField3(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(2), + REF_CONTENT); + pWrtShell->InsertField2(aGetField3); + //now after insertion we have ref1-ref2-ref3-seq1-seq2-seq3 + //updating the fields + IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess()); + rField.UpdateExpFields(nullptr, true); + //creating new clipboard doc + rtl::Reference xClpDoc(new SwDoc()); + xClpDoc->SetClipBoard(true); + xClpDoc->getIDocumentFieldsAccess().LockExpFields(); + //selecting reference field 2 and 3 and sequence field 1 and 2 + //selection is such that more than one and not all sequence fields and reference fields are selected + //ref1-[ref2-ref3-seq1-seq2]-seq3 + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + //start marking + pCursor->SetMark(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //copying the selection to clipboard + pWrtShell->Copy(*xClpDoc); + //deleting selection mark after copy + pCursor->DeleteMark(); + //checking whether the sequence and reference fields have same values after copy operation + uno::Any aAny; + sal_uInt16 aFormat; + //reference field 1 + pWrtShell->StartOfSection(); + SwField* pRef1 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef1->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef1->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); + //reference field 2 + pCursor->Move(fnMoveForward); + SwField* pRef2 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef2->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef2->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //reference field 3 + pCursor->Move(fnMoveForward); + SwField* pRef3 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef3->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef3->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeqF1 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pSeqF1->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF1->GetFieldName()); + //sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeqF2 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pSeqF2->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF2->GetFieldName()); + //sequence field 3 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeqF3 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pSeqF3->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF3->GetFieldName()); + //moving cursor to the end of the document + pWrtShell->EndOfSection(); + //pasting the copied selection at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //now we have ref1-ref2-ref3-seq1-seq2-seq3-nref1-nref2-nseq1-nseq2 + //old reference field 1 + SwField* pOldRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef13 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef13->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef13->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //old sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeq1 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pSeq1->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq1->GetFieldName()); + //old sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeq2 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pSeq2->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq2->GetFieldName()); + //old sequence field 3 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeq3 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pSeq3->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq3->GetFieldName()); + //new reference field 1 + pCursor->Move(fnMoveForward); + SwField* pNewRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(4)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //new sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq1 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pNewSeq1->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq1->GetFieldName()); + //new sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq2 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pNewSeq2->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq2->GetFieldName()); + //moving the cursor to the starting of document + pWrtShell->StartOfSection(); + //pasting the selection again at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //now we have [nnref1-nnref2-nnseq1-nnseq2]-ref1-[ref2-ref3-seq1-seq2]-seq3-[nref1-nref2-nseq1-nseq2] + //new reference field 1 + SwField* pNewRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(6)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //new sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq11 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), pNewSeq11->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq11->GetFieldName()); + //new sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq12 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), pNewSeq12->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq12->GetFieldName()); + //old reference field 1 + pCursor->Move(fnMoveForward); + SwField* pOldRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef23 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef23->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef23->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //old sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq11 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pOldSeq11->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq11->GetFieldName()); + //old sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq12 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pOldSeq12->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq12->GetFieldName()); + //old sequence field 3 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq13 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pOldSeq13->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq13->GetFieldName()); + //old reference field 4 + pCursor->Move(fnMoveForward); + SwField* pOldRef24 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef24->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef24->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(4)), aAny); + //old reference field 5 + pCursor->Move(fnMoveForward); + SwField* pOldRef25 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef25->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef25->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_uInt16(2)), aAny); + //old sequence field 4 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq14 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pOldSeq14->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq14->GetFieldName()); + //old sequence field 5 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq15 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pOldSeq15->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq15->GetFieldName()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf74230) +{ + createSwDoc(); + //exporting the empty document to ODT via TempFile + uno::Sequence aDescriptor; + utl::TempFile aTempFile; + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(aTempFile.GetURL(), aDescriptor); + CPPUNIT_ASSERT(aTempFile.IsValid()); + //loading an XML DOM of the "styles.xml" of the TempFile + xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(), "styles.xml"); + //pXmlDoc should not be null + CPPUNIT_ASSERT(pXmlDoc); + //asserting XPath in loaded XML DOM + assertXPath(pXmlDoc, "//office:styles/style:default-style[@style:family='graphic']/" + "style:graphic-properties[@svg:stroke-color='#3465a4']"); + assertXPath(pXmlDoc, "//office:styles/style:default-style[@style:family='graphic']/" + "style:graphic-properties[@draw:fill-color='#729fcf']"); + //deleting the TempFile + aTempFile.EnableKillingFile(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf74363) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //testing autocorrect of initial capitals on start of first paragraph + SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect()); + //Inserting one all-lowercase word into the first paragraph + pWrtShell->Insert("testing"); + const sal_Unicode cChar = ' '; + pWrtShell->AutoCorrect(corr, cChar); + //The word should be capitalized due to autocorrect + SwNodeOffset nIndex = pWrtShell->GetCursor()->GetNode().GetIndex(); + CPPUNIT_ASSERT_EQUAL(OUString("Testing "), + static_cast(pDoc->GetNodes()[nIndex])->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf80663) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //Inserting 2x2 Table + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 2, 2); + //Checking for the number of rows and columns + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the first row + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->SelTableRow(); //selects the first row + pWrtShell->DeleteRow(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the second row + pWrtShell->GoNextCell(); //moves the cursor to next cell + pWrtShell->SelTableRow(); //selects the second row + pWrtShell->DeleteRow(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the first column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->SelTableCol(); //selects first column + pWrtShell->DeleteCol(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the second column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->GoNextCell(); //moves the cursor to next cell + pWrtShell->SelTableCol(); //selects second column + pWrtShell->DeleteCol(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf57197) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //Inserting 1x1 Table + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 1, 1); + //Checking for the number of rows and columns + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one row before the existing row + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertRow(1, false); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one row after the existing row + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertRow(1, true); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one column before the existing column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertCol(1, false); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one column after the existing column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertCol(1, true); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf131990) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + CPPUNIT_ASSERT(!pWrtShell->Up(false, 1, true)); + CPPUNIT_ASSERT(!pWrtShell->Down(false, 1, true)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf90808) +{ + createSwDoc(); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextRange = xTextDocument->getText(); + uno::Reference xText = xTextRange->getText(); + uno::Reference xCursor(xText->createTextCursor(), uno::UNO_QUERY); + //inserting text into document so that the paragraph is not empty + xText->setString("Hello World!"); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + //creating bookmark 1 + uno::Reference xHeadingBookmark1( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xHeadingName1(xHeadingBookmark1, uno::UNO_QUERY); + xHeadingName1->setName("__RefHeading__1"); + //moving cursor to the starting of paragraph + xCursor->gotoStartOfParagraph(false); + //inserting the bookmark in paragraph + xText->insertTextContent(xCursor, xHeadingBookmark1, true); + //creating bookmark 2 + uno::Reference xHeadingBookmark2( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xHeadingName2(xHeadingBookmark2, uno::UNO_QUERY); + xHeadingName2->setName("__RefHeading__2"); + //inserting the bookmark in same paragraph, at the end + //only one bookmark of this type is allowed in each paragraph an exception of com.sun.star.lang.IllegalArgumentException must be thrown when inserting the other bookmark in same paragraph + xCursor->gotoEndOfParagraph(true); + CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xHeadingBookmark2, true), + css::lang::IllegalArgumentException); + //now testing for __RefNumPara__ + //creating bookmark 1 + uno::Reference xNumBookmark1( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xNumName1(xNumBookmark1, uno::UNO_QUERY); + xNumName1->setName("__RefNumPara__1"); + //moving cursor to the starting of paragraph + xCursor->gotoStartOfParagraph(false); + //inserting the bookmark in paragraph + xText->insertTextContent(xCursor, xNumBookmark1, true); + //creating bookmark 2 + uno::Reference xNumBookmark2( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xNumName2(xNumBookmark2, uno::UNO_QUERY); + xNumName2->setName("__RefNumPara__2"); + //inserting the bookmark in same paragraph, at the end + //only one bookmark of this type is allowed in each paragraph an exception of com.sun.star.lang.IllegalArgumentException must be thrown when inserting the other bookmark in same paragraph + xCursor->gotoEndOfParagraph(true); + CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xNumBookmark2, true), + css::lang::IllegalArgumentException); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf97601) +{ + // Instructions from the bugreport to trigger an infinite loop. + createSwDoc(DATA_DIRECTORY, "tdf97601.odt"); + uno::Reference xEmbeddedObjectsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xEmbeddedObjects + = xEmbeddedObjectsSupplier->getEmbeddedObjects(); + uno::Reference xChart; + xEmbeddedObjects->getByName("myChart") >>= xChart; + uno::Reference xChartComponent; + xChart->getPropertyValue("Component") >>= xChartComponent; + uno::Sequence> aDataSequences + = xChartComponent->getDataSequences(); + uno::Reference xChartState(xChart, uno::UNO_QUERY); + xChartState->getExtendedControlOverEmbeddedObject()->changeState(1); + uno::Reference xDataSequenceModifiable(aDataSequences[2]->getValues(), + uno::UNO_QUERY); + xDataSequenceModifiable->setModified(true); + + // Make sure that the chart is marked as modified. + uno::Reference xModifiable(xChartComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xModifiable->isModified())); + calcLayout(); + // This never returned. + Scheduler::ProcessEventsToIdle(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf75137) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true); + pWrtShell->InsertFootnote("This is first footnote"); + SwNodeOffset firstIndex = pShellCursor->GetNode().GetIndex(); + pShellCursor->GotoFootnoteAnchor(); + pWrtShell->InsertFootnote("This is second footnote"); + pWrtShell->Up(false); + SwNodeOffset secondIndex = pShellCursor->GetNode().GetIndex(); + pWrtShell->Down(false); + SwNodeOffset thirdIndex = pShellCursor->GetNode().GetIndex(); + CPPUNIT_ASSERT_EQUAL(firstIndex, thirdIndex); + CPPUNIT_ASSERT(firstIndex != secondIndex); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf83798) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf83798.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->GotoNextTOXBase(); + const SwTOXBase* pTOXBase = pWrtShell->GetCurTOX(); + pWrtShell->UpdateTableOf(*pTOXBase); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->Move(fnMoveBackward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("Table of Contents"), pCursor->GetText()); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->DeleteMark(); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("1"), pCursor->GetText()); + pCursor->DeleteMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("1.A"), pCursor->GetText()); + pCursor->DeleteMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("2"), pCursor->GetText()); + pCursor->DeleteMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("2.A"), pCursor->GetText()); + pCursor->DeleteMark(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf89714) +{ + createSwDoc(); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + uno::Reference xInterface(xFact->createInstance("com.sun.star.text.Defaults"), + uno::UNO_QUERY); + uno::Reference xPropState(xInterface, uno::UNO_QUERY); + //enabled Paragraph Orphan and Widows by default starting in LO5.1 + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_Int8(2)), xPropState->getPropertyDefault("ParaOrphans")); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_Int8(2)), xPropState->getPropertyDefault("ParaWidows")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf130287) +{ + //create a new writer document + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //insert a 1-cell table in the newly created document + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 1, 1); + //checking for the row and column + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + uno::Reference xCell = xTable->getCellByName("A1"); + uno::Reference xCellText(xCell, uno::UNO_QUERY); + uno::Reference xParagraph = getParagraphOfText(1, xCellText); + // they were 2 (orphan/widow control enabled unnecessarily in Table Contents paragraph style) + CPPUNIT_ASSERT_EQUAL(sal_Int8(0), getProperty(xParagraph, "ParaOrphans")); + CPPUNIT_ASSERT_EQUAL(sal_Int8(0), getProperty(xParagraph, "ParaWidows")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testPropertyDefaults) +{ + createSwDoc(); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + uno::Reference xInterface(xFact->createInstance("com.sun.star.text.Defaults"), + uno::UNO_QUERY); + uno::Reference xPropSet(xInterface, uno::UNO_QUERY_THROW); + uno::Reference xPropState(xInterface, uno::UNO_QUERY); + //testing CharFontName from style::CharacterProperties + //getting property default + uno::Any aCharFontName = xPropState->getPropertyDefault("CharFontName"); + //asserting property default and defaults received from "css.text.Defaults" service + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharFontName"), aCharFontName); + //changing the default value + xPropSet->setPropertyValue("CharFontName", uno::makeAny(OUString("Symbol"))); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(OUString("Symbol")), + xPropSet->getPropertyValue("CharFontName")); + //resetting the value to default + xPropState->setPropertyToDefault("CharFontName"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharFontName"), aCharFontName); + //testing CharHeight from style::CharacterProperties + //getting property default + uno::Any aCharHeight = xPropState->getPropertyDefault("CharHeight"); + //asserting property default and defaults received from "css.text.Defaults" service + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharHeight"), aCharHeight); + //changing the default value + xPropSet->setPropertyValue("CharHeight", uno::makeAny(float(14))); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(14)), xPropSet->getPropertyValue("CharHeight")); + //resetting the value to default + xPropState->setPropertyToDefault("CharHeight"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharHeight"), aCharHeight); + //testing CharWeight from style::CharacterProperties + uno::Any aCharWeight = xPropSet->getPropertyValue("CharWeight"); + //changing the default value + xPropSet->setPropertyValue("CharWeight", uno::makeAny(float(awt::FontWeight::BOLD))); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(float(awt::FontWeight::BOLD)), + xPropSet->getPropertyValue("CharWeight")); + //resetting the value to default + xPropState->setPropertyToDefault("CharWeight"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharWeight"), aCharWeight); + //testing CharUnderline from style::CharacterProperties + uno::Any aCharUnderline = xPropSet->getPropertyValue("CharUnderline"); + //changing the default value + xPropSet->setPropertyValue("CharUnderline", + uno::makeAny(sal_Int16(awt::FontUnderline::SINGLE))); + CPPUNIT_ASSERT_EQUAL(uno::makeAny(sal_Int16(awt::FontUnderline::SINGLE)), + xPropSet->getPropertyValue("CharUnderline")); + //resetting the value to default + xPropState->setPropertyToDefault("CharUnderline"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharUnderline"), aCharUnderline); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTableBackgroundColor) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 3, 3); //Inserting Table + //Checking Rows and Columns of Inserted Table + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getColumns()->getCount()); + pWrtShell->StartOfSection(); + pWrtShell->SelTableRow(); //Selecting First Row + pWrtShell->ClearMark(); + //Modifying the color of Table Box + pWrtShell->SetBoxBackground( + SvxBrushItem(Color(sal_Int32(0xFF00FF)), sal_Int16(RES_BACKGROUND))); + //Checking cells for background color only A1 should be modified + uno::Reference xCell; + xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(Color(0xFF00FF), + Color(ColorTransparency, getProperty(xCell, "BackColor"))); + xCell = xTable->getCellByName("A2"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("A3"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("B1"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("B2"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("B3"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("C1"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("C2"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("C3"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf88899) +{ + createSwDoc(); + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xProps( + xDocumentPropertiesSupplier->getDocumentProperties()); + uno::Reference xUserProps = xProps->getUserDefinedProperties(); + css::util::DateTime aDateTime + = { sal_uInt32(1234567), sal_uInt16(3), sal_uInt16(3), sal_uInt16(3), + sal_uInt16(10), sal_uInt16(11), sal_uInt16(2014), true }; + xUserProps->addProperty("dateTime", sal_Int16(beans::PropertyAttribute::OPTIONAL), + uno::makeAny(aDateTime)); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + uno::Reference xTextField( + xFact->createInstance("com.sun.star.text.textfield.docinfo.Custom"), uno::UNO_QUERY); + //Setting Name Property + uno::Reference xPropSet(xTextField, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue("Name", uno::makeAny(OUString("dateTime"))); + //Setting NumberFormat + uno::Reference xNumberFormatsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xNumFormat(xNumberFormatsSupplier->getNumberFormats(), + uno::UNO_QUERY); + css::lang::Locale alocale; + alocale.Language = "en"; + alocale.Country = "US"; + sal_Int16 key = xNumFormat->getStandardFormat(util::NumberFormat::DATETIME, alocale); + xPropSet->setPropertyValue("NumberFormat", uno::makeAny(key)); + //Inserting Text Content + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextRange = xTextDocument->getText(); + uno::Reference xText = xTextRange->getText(); + xText->insertTextContent(xTextRange, xTextField, true); + //Retrieving the contents for verification + CPPUNIT_ASSERT_EQUAL(OUString("11/10/14 03:03 AM"), xTextField->getPresentation(false)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf90362) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf90362.fodt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + // Ensure correct initial setting + std::shared_ptr batch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(false, batch); + batch->commit(); + // First check if the end of the second paragraph is indeed protected. + pWrtShell->EndPara(); + pWrtShell->Down(/*bSelect=*/false); + CPPUNIT_ASSERT_EQUAL(true, pWrtShell->HasReadonlySel()); + + // Then enable ignoring of protected areas and make sure that this time the cursor is read-write. + officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(true, batch); + batch->commit(); + CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel()); + // Clean up, otherwise following tests will have that option set + officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(false, batch); + batch->commit(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUndoDelAsCharTdf107512) +{ + SwDoc* pDoc(createSwDoc()); + sw::UndoManager& rUndoManager(pDoc->GetUndoManager()); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + SwCursorShell* pShell(pDoc->GetEditShell()); + SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); + SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); + rIDCO.InsertString(*pShell->GetCursor(), "foo"); + pShell->ClearMark(); + SwFormatAnchor anchor(RndStdIds::FLY_AS_CHAR); + frameSet.Put(anchor); + GraphicObject grf; + pShell->SttEndDoc(true); + CPPUNIT_ASSERT(rIDCO.InsertGraphicObject(*pShell->GetCursor(), grf, &frameSet, &grfSet)); + pShell->SttEndDoc(false); + CPPUNIT_ASSERT(rIDCO.InsertGraphicObject(*pShell->GetCursor(), grf, &frameSet, &grfSet)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + SvxCharHiddenItem hidden(true, RES_CHRATR_HIDDEN); + pShell->SelectTextModel(1, 4); + rIDCO.InsertPoolItem(*pShell->GetCursor(), hidden); + // now we have "\1foo\1" with the "foo" hidden + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetNode().GetTextNode()->GetText()); + SfxPoolItem const* pItem; + SfxItemSet query(pDoc->GetAttrPool(), svl::Items); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + + // delete from the start + pShell->SelectTextModel(0, 4); + rIDCO.DeleteAndJoin(*pShell->GetCursor()); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Redo(); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + + // delete from the end + pShell->SelectTextModel(1, 5); + rIDCO.DeleteAndJoin(*pShell->GetCursor()); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Redo(); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT( + pShell->GetCursor()->GetNode().GetTextNode()->GetTextAttrForCharAt(4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUndoCharAttribute) +{ + // Create a new empty Writer document + SwDoc* pDoc = createSwDoc(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + // Insert some text + rIDCO.InsertString(*pCursor, "This will be bolded"); + // Position of word 9876543210 + // Use cursor to select part of text + pCursor->SetMark(); + for (int i = 0; i < 9; i++) + { + pCursor->Move(fnMoveBackward); + } + // Check that correct text was selected + CPPUNIT_ASSERT_EQUAL(OUString("be bolded"), pCursor->GetText()); + // Apply a "Bold" attribute to selection + SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + SfxItemSet aSet(pDoc->GetAttrPool(), svl::Items); + // Adds selected text's attributes to aSet + pCursor->GetNode().GetTextNode()->GetParaAttr(aSet, 10, 19); + SfxPoolItem const* pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); + // Check that bold is active on the selection; checks if it's in aSet + CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem == aWeightItem)); + // Invoke Undo + rUndoManager.Undo(); + // Check that bold is no longer active + aSet.ClearItem(RES_CHRATR_WEIGHT); + pCursor->GetNode().GetTextNode()->GetParaAttr(aSet, 10, 19); + pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); + CPPUNIT_ASSERT_EQUAL(false, (*pPoolItem == aWeightItem)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUndoDelAsChar) +{ + SwDoc* pDoc(createSwDoc()); + sw::UndoManager& rUndoManager(pDoc->GetUndoManager()); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + SwCursorShell* pShell(pDoc->GetEditShell()); + SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); + SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); + SwFormatAnchor anchor(RndStdIds::FLY_AS_CHAR); + frameSet.Put(anchor); + GraphicObject grf; + CPPUNIT_ASSERT(rIDCO.InsertGraphicObject(*pShell->GetCursor(), grf, &frameSet, &grfSet)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + pShell->SetMark(); + pShell->Left(1, CRSR_SKIP_CHARS); + rIDCO.DeleteAndJoin(*pShell->GetCursor()); + CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(!pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(!pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pShell->GetCursor()->GetNode().GetTextNode()->Len()); + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetNode().GetTextNode()->Len()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf86639) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf86639.rtf"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwTextFormatColl* pColl = pDoc->FindTextFormatCollByName(u"Heading"); + pWrtShell->SetTextFormatColl(pColl); + OUString aExpected = pColl->GetAttrSet().GetFont().GetFamilyName(); + // This was Calibri, should be Liberation Sans. + CPPUNIT_ASSERT_EQUAL(aExpected, + getProperty(getRun(getParagraph(1), 1), "CharFontName")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf90883TableBoxGetCoordinates) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf90883.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Down(true); + SwSelBoxes aBoxes; + ::GetTableSel(*pWrtShell, aBoxes); + CPPUNIT_ASSERT_EQUAL(2, static_cast(aBoxes.size())); + Point pos(aBoxes[0]->GetCoordinates()); + CPPUNIT_ASSERT_EQUAL(1, static_cast(pos.X())); + CPPUNIT_ASSERT_EQUAL(1, static_cast(pos.Y())); + pos = aBoxes[1]->GetCoordinates(); + CPPUNIT_ASSERT_EQUAL(1, static_cast(pos.X())); + CPPUNIT_ASSERT_EQUAL(2, static_cast(pos.Y())); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testEmbeddedDataSource) +{ + // Initially no data source. + uno::Reference xComponentContext( + comphelper::getProcessComponentContext()); + uno::Reference xDatabaseContext + = sdb::DatabaseContext::create(xComponentContext); + CPPUNIT_ASSERT(!xDatabaseContext->hasByName("calc-data-source")); + + // Load: should have a component and a data source, too. + // Path with "#" must not cause issues + createSwDoc(OUStringConcatenation(DATA_DIRECTORY + OUString::Concat(u"hash%23path/")), + "embedded-data-source.odt"); + CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); + + // Data source has a table named Sheet1. + uno::Reference xDataSource(xDatabaseContext->getByName("calc-data-source"), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xDataSource.is()); + auto xConnection = xDataSource->getConnection("", ""); + uno::Reference xTables + = css::uno::Reference(xConnection, uno::UNO_QUERY_THROW) + ->getTables(); + CPPUNIT_ASSERT(xTables.is()); + CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); + xConnection->close(); + + // Reload: should still have a component and a data source, too. + reload("writer8", "embedded-data-source.odt"); + CPPUNIT_ASSERT(mxComponent.is()); + CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); + + // Data source has a table named Sheet1 after saving to a different directory. + xDataSource.set(xDatabaseContext->getByName("calc-data-source"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xDataSource.is()); + xConnection = xDataSource->getConnection("", ""); + xTables = css::uno::Reference(xConnection, uno::UNO_QUERY_THROW) + ->getTables(); + CPPUNIT_ASSERT(xTables.is()); + CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); + xConnection->close(); + + // Close: should not have a data source anymore. + mxComponent->dispose(); + mxComponent.clear(); + CPPUNIT_ASSERT(!xDatabaseContext->hasByName("calc-data-source")); + + // Now open again the saved result, and instead of 'save as', just 'save'. + mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument"); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->store(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUnoCursorPointer) +{ + auto xDocComponent( + loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument")); + auto pxDocDocument(dynamic_cast(xDocComponent.get())); + CPPUNIT_ASSERT(pxDocDocument); + SwDoc* const pDoc(pxDocDocument->GetDocShell()->GetDoc()); + std::unique_ptr pIdx(new SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1)); + std::unique_ptr pPos(new SwPosition(*pIdx)); + sw::UnoCursorPointer pCursor(pDoc->CreateUnoCursor(*pPos)); + CPPUNIT_ASSERT(static_cast(pCursor)); + pPos.reset(); // we need to kill the SwPosition before disposing + pIdx.reset(); // we need to kill the SwNodeIndex before disposing + xDocComponent->dispose(); + CPPUNIT_ASSERT(!static_cast(pCursor)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTextTableCellNames) +{ + sal_Int32 nCol, nRow2; + SwXTextTable::GetCellPosition("z1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(51), nCol); + SwXTextTable::GetCellPosition("AA1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(52), nCol); + SwXTextTable::GetCellPosition("AB1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(53), nCol); + SwXTextTable::GetCellPosition("BB1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(105), nCol); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testShapeAnchorUndo) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "draw-anchor-undo.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + SdrObject* pObject = pPage->GetObj(0); + tools::Rectangle aOrigLogicRect(pObject->GetLogicRect()); + + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + rUndoManager.StartUndo(SwUndoId::START, nullptr); + + pWrtShell->SelectObj(Point(), 0, pObject); + + pWrtShell->GetDrawView()->MoveMarkedObj(Size(100, 100)); + pWrtShell->ChgAnchor(RndStdIds::FLY_AT_PARA, true); + + rUndoManager.EndUndo(SwUndoId::END, nullptr); + + CPPUNIT_ASSERT(aOrigLogicRect != pObject->GetLogicRect()); + + rUndoManager.Undo(); + + CPPUNIT_ASSERT_EQUAL(pObject->GetLogicRect(), aOrigLogicRect); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf127635) +{ + SwDoc* pDoc = createSwDoc(); + + SwXTextDocument* pXTextDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXTextDocument); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'a', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, ' ', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'b', 0); + Scheduler::ProcessEventsToIdle(); + + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 2, /*bBasicCall=*/false); + + //Select 'a' + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, ' ', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'd', 0); + Scheduler::ProcessEventsToIdle(); + + SwEditShell* const pEditShell(pDoc->GetEditShell()); + // accept all redlines + while (pEditShell->GetRedlineCount()) + pEditShell->AcceptRedline(0); + + // Without the fix in place, this test would have failed with + // - Expected: C d b + // - Actual : Cd b + CPPUNIT_ASSERT_EQUAL(OUString("C d b"), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testDde) +{ +#if HAVE_FEATURE_UI + // Type asdf and copy it. + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("asdf"); + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 4, /*bBasicCall=*/false); + uno::Sequence aPropertyValues; + dispatchCommand(mxComponent, ".uno:Copy", aPropertyValues); + + // Go before the selection and paste as a DDE link. + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false); + aPropertyValues = comphelper::InitPropertySequence( + { { "SelectedFormat", + uno::makeAny(static_cast(SotClipboardFormatId::LINK)) } }); + dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aPropertyValues); + + // Make sure that the document starts with a field now, and its expanded string value contains asdf. + const uno::Reference xField = getRun(getParagraph(1), 1); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xField, "TextPortionType")); + CPPUNIT_ASSERT(xField->getString().endsWith("asdf")); +#endif +} + +namespace +{ +//IdleTask class to add a low priority Idle task +class IdleTask +{ +public: + bool GetFlag() const; + IdleTask(); + DECL_LINK(FlipFlag, Timer*, void); + +private: + bool flag; + Idle maIdle{ "sw uiwriter IdleTask" }; +}; +} + +//constructor of IdleTask Class +IdleTask::IdleTask() + : flag(false) +{ + //setting the Priority of Idle task to LOW, LOWEST + maIdle.SetPriority(TaskPriority::LOWEST); + //set idle for callback + maIdle.SetInvokeHandler(LINK(this, IdleTask, FlipFlag)); + //starting the idle + maIdle.Start(); +} + +//GetFlag() of IdleTask Class +bool IdleTask::GetFlag() const +{ + //returning the status of current flag + return flag; +} + +//Callback function of IdleTask Class +IMPL_LINK(IdleTask, FlipFlag, Timer*, , void) +{ + //setting the flag to make sure that low priority idle task has been dispatched + flag = true; +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testDocModState) +{ + //creating a new writer document via the XDesktop(to have more shells etc.) + SwDoc* pDoc = createSwDoc(); + //creating instance of IdleTask Class + IdleTask idleTask; + //checking the state of the document via IDocumentState + IDocumentState& rState(pDoc->getIDocumentState()); + //the state should not be modified + CPPUNIT_ASSERT(!(rState.IsModified())); + //checking the state of the document via SfxObjectShell + SwDocShell* pShell(pDoc->GetDocShell()); + CPPUNIT_ASSERT(!(pShell->IsModified())); + //looping around yield until low priority idle task is dispatched and flag is flipped + while (!idleTask.GetFlag()) + { + //dispatching all the events via VCL main-loop + Application::Yield(); + } + //again checking for the state via IDocumentState + CPPUNIT_ASSERT(!(rState.IsModified())); + //again checking for the state via SfxObjectShell + CPPUNIT_ASSERT(!(pShell->IsModified())); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf94804) +{ + //create new writer document + SwDoc* pDoc = createSwDoc(); + //get cursor for making bookmark at a particular location + SwPaM* pCrsr = pDoc->GetEditShell()->GetCursor(); + IDocumentMarkAccess* pIDMAccess(pDoc->getIDocumentMarkAccess()); + //make first bookmark, CROSSREF_HEADING, with *empty* name + sw::mark::IMark* pMark1( + pIDMAccess->makeMark(*pCrsr, "", IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK, + ::sw::mark::InsertMode::New)); + //get the new(autogenerated) bookmark name + OUString bookmark1name = pMark1->GetName(); + //match the bookmark name, it should be like "__RefHeading__**" + CPPUNIT_ASSERT(bookmark1name.match("__RefHeading__")); + //make second bookmark, CROSSREF_NUMITEM, with *empty* name + sw::mark::IMark* pMark2( + pIDMAccess->makeMark(*pCrsr, "", IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK, + ::sw::mark::InsertMode::New)); + //get the new(autogenerated) bookmark name + OUString bookmark2name = pMark2->GetName(); + //match the bookmark name, it should be like "__RefNumPara__**" + CPPUNIT_ASSERT(bookmark2name.match("__RefNumPara__")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUnicodeNotationToggle) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "unicodeAltX.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + OUString sOriginalDocString; + OUString sDocString; + OUString sExpectedString; + uno::Sequence aPropertyValues; + + pWrtShell->EndPara(); + sOriginalDocString = pWrtShell->GetCursor()->GetNode().GetTextNode()->GetText(); + CPPUNIT_ASSERT_EQUAL(OUString("uU+002b"), sOriginalDocString); + + dispatchCommand(mxComponent, ".uno:UnicodeNotationToggle", aPropertyValues); + sExpectedString = "u+"; + sDocString = pWrtShell->GetCursor()->GetNode().GetTextNode()->GetText(); + CPPUNIT_ASSERT_EQUAL(sDocString, sExpectedString); + + dispatchCommand(mxComponent, ".uno:UnicodeNotationToggle", aPropertyValues); + sDocString = pWrtShell->GetCursor()->GetNode().GetTextNode()->GetText(); + CPPUNIT_ASSERT_EQUAL(sDocString, sOriginalDocString); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf34957) +{ + createSwDoc(DATA_DIRECTORY, "tdf34957.odt"); + // table with "keep with next" always started on a new page if the table was large, + // regardless of whether it was already kept with the previous paragraph, + // or whether the following paragraph actually fit on the same page (MAB 3.6 - 5.0) + CPPUNIT_ASSERT_EQUAL(OUString("Row 1"), + parseDump("/root/page[2]/body/tab[1]/row[2]/cell[1]/txt")); + CPPUNIT_ASSERT_EQUAL(OUString("Row 1"), + parseDump("/root/page[4]/body/tab[1]/row[2]/cell[1]/txt")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf89954) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf89954.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->EndPara(); + SwXTextDocument* pXTextDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXTextDocument); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 't', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'e', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 's', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 't', 0); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, '.', 0); + Scheduler::ProcessEventsToIdle(); + + SwNodeIndex aNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); + // Placeholder character for the comment anchor was ^A (CH_TXTATR_BREAKWORD), not (CH_TXTATR_INWORD). + // As a result, autocorrect did not turn the 't' input into 'T'. + CPPUNIT_ASSERT_EQUAL(OUString(u"Tes\uFFF9t. Test."), + aNodeIndex.GetNode().GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf89720) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf89720.odt"); + SwView* pView = pDoc->GetDocShell()->GetView(); + SwPostItMgr* pPostItMgr = pView->GetPostItMgr(); + for (std::unique_ptr const& pItem : *pPostItMgr) + { + if (pItem->mpPostIt->IsFollow()) + // This was non-0: reply comments had a text range overlay, + // resulting in unexpected dark color. + CPPUNIT_ASSERT(!pItem->mpPostIt->TextRange()); + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf88986) +{ + // Create a text shell. + SwDoc* pDoc = createSwDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + SwTextShell aShell(*pView); + + // Create the item set that is normally passed to the insert frame dialog. + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwFlyFrameAttrMgr aMgr(true, pWrtShell, Frmmgr_Type::TEXT, nullptr); + SfxItemSet aSet = aShell.CreateInsertFrameItemSet(aMgr); + + // This was missing along with the gradient and other tables. + CPPUNIT_ASSERT(aSet.HasItem(SID_COLOR_TABLE)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf78150) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("foobar"); + + CPPUNIT_ASSERT_EQUAL(OUString("foobar"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:DelToStartOfWord", {}); + + // Without the fix, test fails with: + // equality assertion failed + // - Expected: + // - Actual : f + CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf138873) +{ + SwDoc* pDoc = createSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("A B C"); + + CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); + + // Select B + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false); + + pWrtShell->Insert("DDD"); + + CPPUNIT_ASSERT_EQUAL(OUString("A DDD C"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); + + // Select B and C + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 2, /*bBasicCall=*/false); + + dispatchCommand(mxComponent, ".uno:Copy", {}); + Scheduler::ProcessEventsToIdle(); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + Scheduler::ProcessEventsToIdle(); + + // Without the fix in place, this test would have failed with + // - Expected: A B C + // - Actual : A CB CB + CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf87922) +{ + // Create an SwDrawTextInfo. + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf87922.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwScriptInfo* pScriptInfo = nullptr; + // Get access to the single paragraph in the document. + SwNodeIndex aNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); + const OUString& rText = aNodeIndex.GetNode().GetTextNode()->GetText(); + sal_Int32 nLength = rText.getLength(); + SwDrawTextInfo aDrawTextInfo(pWrtShell, *pWrtShell->GetOut(), pScriptInfo, rText, + TextFrameIndex(0), TextFrameIndex(nLength)); + // Root -> page -> body -> text. + SwTextFrame* pTextFrame + = static_cast(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()); + aDrawTextInfo.SetFrame(pTextFrame); + + // If no color background color is found, assume white. + Color* pColor = sw::GetActiveRetoucheColor(); + *pColor = COL_WHITE; + + // Make sure that automatic color on black background is white, not black. + vcl::Font aFont; + aDrawTextInfo.ApplyAutoColor(&aFont); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFont.GetColor()); +} + +#if HAVE_MORE_FONTS +namespace +{ +struct PortionItem +{ + PortionItem(OUString const& sItemType, sal_Int32 nLength, PortionType nTextType) + : msItemType(sItemType) + , mnLength(nLength) + , mnTextType(nTextType) + { + } + + OUString msItemType; + sal_Int32 mnLength; + PortionType mnTextType; +}; + +class PortionHandler : public SwPortionHandler +{ +public: + std::vector mPortionItems; + explicit PortionHandler() + : SwPortionHandler() + { + } + + void clear() { mPortionItems.clear(); } + + virtual void Text(TextFrameIndex nLength, PortionType nType, sal_Int32 /*nHeight*/, + sal_Int32 /*nWidth*/) override + { + mPortionItems.emplace_back("text", sal_Int32(nLength), nType); + } + + virtual void Special(TextFrameIndex nLength, const OUString& /*rText*/, PortionType nType, + sal_Int32 /*nHeight*/, sal_Int32 /*nWidth*/, + const SwFont* /*pFont*/) override + { + mPortionItems.emplace_back("special", sal_Int32(nLength), nType); + } + + virtual void LineBreak(sal_Int32 /*nWidth*/) override + { + mPortionItems.emplace_back("line_break", 0, PortionType::NONE); + } + + virtual void Skip(TextFrameIndex nLength) override + { + mPortionItems.emplace_back("skip", sal_Int32(nLength), PortionType::NONE); + } + + virtual void Finish() override { mPortionItems.emplace_back("finish", 0, PortionType::NONE); } +}; +} +#endif + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf77014) +{ +#if HAVE_MORE_FONTS + // The problem described in the bug tdf#77014 is that the input + // field text ("ThisIsAllOneWord") is broken up on linebreak, but + // it should be in one piece (like normal text). + + // This test checks that the input field is in one piece and if the + // input field has more words, it is broken up at the correct place. + + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf77014.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + SwTextFrame* pTextFrame + = static_cast(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()); + + PortionHandler aHandler; + pTextFrame->VisitPortions(aHandler); + + { + // Input Field - "One Two Three Four Five" = 25 chars + CPPUNIT_ASSERT_EQUAL(OUString("text"), aHandler.mPortionItems[0].msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(25), aHandler.mPortionItems[0].mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, aHandler.mPortionItems[0].mnTextType); + + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), aHandler.mPortionItems[1].msItemType); + + CPPUNIT_ASSERT_EQUAL(OUString("finish"), aHandler.mPortionItems[2].msItemType); + } + + aHandler.clear(); + + pTextFrame = static_cast(pTextFrame->GetNext()); + pTextFrame->VisitPortions(aHandler); + + { + // Input Field - "ThisIsAllOneWord" = 18 chars + CPPUNIT_ASSERT_EQUAL(OUString("text"), aHandler.mPortionItems[0].msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18), aHandler.mPortionItems[0].mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, aHandler.mPortionItems[0].mnTextType); + + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), aHandler.mPortionItems[1].msItemType); + + CPPUNIT_ASSERT_EQUAL(OUString("finish"), aHandler.mPortionItems[2].msItemType); + } + + aHandler.clear(); + + // skip empty paragraph + pTextFrame = static_cast(pTextFrame->GetNext()); + + pTextFrame = static_cast(pTextFrame->GetNext()); + pTextFrame->VisitPortions(aHandler); + + { + // Text "The purpose of this report is to summarize the results of the existing bug in the LO suite" + // = 91 chars + auto& rPortionItem = aHandler.mPortionItems[0]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(91), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[1]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + // Input Field: "ThisIsAllOneWord" = 18 chars + // which is 16 chars + 2 hidden chars (start & end input field) = 18 chars + // If this is correct then the input field is in one piece + rPortionItem = aHandler.mPortionItems[2]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); + + // Text "." + rPortionItem = aHandler.mPortionItems[3]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[4]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + rPortionItem = aHandler.mPortionItems[5]; + CPPUNIT_ASSERT_EQUAL(OUString("finish"), rPortionItem.msItemType); + } + + aHandler.clear(); + + pTextFrame = static_cast(pTextFrame->GetNext()); + pTextFrame->VisitPortions(aHandler); + { + printf("Portions:\n"); + + for (const auto& rPortionItem : aHandler.mPortionItems) + { + printf("-- Type: %s length: %" SAL_PRIdINT32 " text type: %d\n", + rPortionItem.msItemType.toUtf8().getStr(), rPortionItem.mnLength, + sal_uInt16(rPortionItem.mnTextType)); + } + + // Text "The purpose of this report is to summarize the results of the existing bug in the LO suite" + // 91 chars + auto& rPortionItem = aHandler.mPortionItems[0]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(91), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // The input field here has more words ("One Two Three Four Five") + // and it should break after "Two". + // Input Field: "One Two" = 7 chars + 1 start input field hidden character = 8 chars + rPortionItem = aHandler.mPortionItems[1]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); + + rPortionItem = aHandler.mPortionItems[2]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Hole, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[3]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + // Input Field: "Three Four Five" = 16 chars + 1 end input field hidden character = 16 chars + rPortionItem = aHandler.mPortionItems[4]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(16), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); + + // Text "." + rPortionItem = aHandler.mPortionItems[5]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[6]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + rPortionItem = aHandler.mPortionItems[7]; + CPPUNIT_ASSERT_EQUAL(OUString("finish"), rPortionItem.msItemType); + } +#endif +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf92648) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf92648.docx"); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + // Make sure we have ten draw shapes. + // Yes, we have if the left/right pages have different header/footer, + // but if not we have only nine of them: + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), SwTextBoxHelper::getCount(pPage)); + // and the text boxes haven't got zero height + sal_Int32 nCount = 0; + for (const SwFrameFormat* pFormat : *pDoc->GetSpzFrameFormats()) + { + if (!SwTextBoxHelper::isTextBox(pFormat, RES_FLYFRMFMT)) + continue; + SwFormatFrameSize aSize(pFormat->GetFrameSize()); + CPPUNIT_ASSERT(aSize.GetHeight() != 0); + ++nCount; + } + // and we have had five of them. + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), nCount); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf103978_backgroundTextShape) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf103978_backgroundTextShape.docx"); + + // there is only one shape. It has an attached textbox + bool bShapeIsOpaque = getProperty(getShape(1), "Opaque"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape is in the foreground", false, bShapeIsOpaque); + sal_Int32 nCount = 0; + for (const SwFrameFormat* pFormat : *pDoc->GetSpzFrameFormats()) + { + if (!SwTextBoxHelper::isTextBox(pFormat, RES_FLYFRMFMT)) + continue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox syncs the shape's transparency", bShapeIsOpaque, + pFormat->GetOpaque().GetValue()); + ++nCount; + } + //ensure that we don't skip the for loop without an error + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of TextBoxes", sal_Int32(1), nCount); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf117225) +{ + // Test that saving a document with an embedded object does not leak + // tempfiles in the directory of the target file. + OUString aTargetDirectory + = m_directories.getURLFromWorkdir(u"/CppunitTest/sw_uiwriter7.test.user/"); + OUString aTargetFile = aTargetDirectory + "tdf117225.odt"; + OUString aSourceFile = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf117225.odt"; + osl::File::copy(aSourceFile, aTargetFile); + mxComponent = loadFromDesktop(aTargetFile); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + int nExpected = CountFilesInDirectory(aTargetDirectory); + xStorable->store(); + int nActual = CountFilesInDirectory(aTargetDirectory); + // nActual was nExpected + 1, i.e. we leaked a tempfile. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); + + OUString aTargetFileSaveAs = aTargetDirectory + "tdf117225-save-as.odt"; + xStorable->storeAsURL(aTargetFileSaveAs, {}); + ++nExpected; + nActual = CountFilesInDirectory(aTargetDirectory); + // nActual was nExpected + 1, i.e. we leaked a tempfile. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */