summaryrefslogtreecommitdiff
path: root/sw/qa/extras/uiwriter/uiwriter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/qa/extras/uiwriter/uiwriter.cxx')
-rw-r--r--sw/qa/extras/uiwriter/uiwriter.cxx7970
1 files changed, 1011 insertions, 6959 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 9c2719f99638..59759a5dd173 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -7,668 +7,95 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-#include <memory>
-#include <string_view>
#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/document/XDocumentInsertable.hpp>
#include <com/sun/star/drawing/GraphicExportFilter.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
#include <com/sun/star/i18n/TextConversionOption.hpp>
-#include <com/sun/star/style/CaseMap.hpp>
-#include <vcl/errcode.hxx>
-#include <tools/gen.hxx>
#include <swmodeltestbase.hxx>
#include <ndtxt.hxx>
#include <wrtsh.hxx>
#include <shellio.hxx>
#include <expfld.hxx>
#include <drawdoc.hxx>
-#include <docary.hxx>
#include <redline.hxx>
-#include <section.hxx>
#include <fmtclds.hxx>
#include <dcontact.hxx>
-#include <textboxhelper.hxx>
#include <view.hxx>
#include <hhcwrp.hxx>
#include <swacorr.hxx>
#include <swmodule.hxx>
#include <modcfg.hxx>
-#include <charatr.hxx>
#include <editeng/acorrcfg.hxx>
#include <unotools/streamwrap.hxx>
-#include <unocrsr.hxx>
#include <unocrsrhelper.hxx>
-#include <unotbl.hxx>
-#include <IMark.hxx>
-#include <IDocumentMarkAccess.hxx>
-#include <IDocumentSettingAccess.hxx>
-#include <pagedesc.hxx>
-#include <PostItMgr.hxx>
-#include <AnnotationWin.hxx>
+#include <com/sun/star/text/VertOrientation.hpp>
#include <com/sun/star/text/XDefaultNumberingProvider.hpp>
-#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/text/XTextTable.hpp>
#include <vcl/TypeSerializer.hxx>
#include <svx/svdpage.hxx>
#include <svx/svdview.hxx>
-#include <svl/itemiter.hxx>
#include <svx/svxids.hrc>
-#include <unotools/localfilehelper.hxx>
#include <editeng/eeitem.hxx>
-#include <editeng/scripttypeitem.hxx>
-#include <editeng/fontitem.hxx>
-#include <editeng/lrspitem.hxx>
-#include <editeng/opaqitem.hxx>
-#include <editeng/protitem.hxx>
-#include <editeng/ulspitem.hxx>
+#include <editeng/scriptsetitem.hxx>
#include <editeng/wghtitem.hxx>
-#include <i18nutil/transliteration.hxx>
-#include <i18nutil/searchopt.hxx>
-#include <reffld.hxx>
-#include <dbfld.hxx>
-#include <txatbase.hxx>
-#include <txtftn.hxx>
#include <IDocumentDrawModelAccess.hxx>
-#include <IDocumentFieldsAccess.hxx>
#include <IDocumentRedlineAccess.hxx>
-#include <IDocumentState.hxx>
-#include <unofldmid.h>
#include <UndoManager.hxx>
-#include <textsh.hxx>
#include <frmatr.hxx>
-#include <frmmgr.hxx>
-#include <tblafmt.hxx>
-
-#include <com/sun/star/lang/Locale.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/util/XNumberFormatTypes.hpp>
-#include <com/sun/star/util/NumberFormat.hpp>
-#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
-#include <com/sun/star/util/SearchAlgorithms2.hpp>
-#include <com/sun/star/util/SearchFlags.hpp>
-#include <com/sun/star/util/SearchAlgorithms.hpp>
-#include <com/sun/star/sdb/DatabaseContext.hpp>
-#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
-#include <com/sun/star/sdbc/XDataSource.hpp>
-#include <com/sun/star/text/XParagraphCursor.hpp>
-#include <com/sun/star/util/XPropertyReplace.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/text/XTextField.hpp>
+
#include <com/sun/star/text/TextMarkupType.hpp>
-#include <com/sun/star/chart2/data/XDataSource.hpp>
-#include <com/sun/star/document/XEmbeddedObjectSupplier2.hpp>
-#include <com/sun/star/drawing/XShape.hpp>
-#include <com/sun/star/linguistic2/XLinguProperties.hpp>
-#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
-#include <com/sun/star/text/XPageCursor.hpp>
-#include <o3tl/cppunittraitshelper.hxx>
#include <osl/file.hxx>
-#include <osl/thread.hxx>
-#include <paratr.hxx>
-#include <drawfont.hxx>
-#include <txtfrm.hxx>
-#include <txttypes.hxx>
-#include <SwPortionHandler.hxx>
-#include <hyp.hxx>
-#include <swdtflvr.hxx>
-#include <editeng/svxenum.hxx>
#include <comphelper/propertysequence.hxx>
-#include <sfx2/classificationhelper.hxx>
-#include <LibreOfficeKit/LibreOfficeKitEnums.h>
-#include <sfx2/docfilt.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
-#include <comphelper/configurationhelper.hxx>
-#include <editeng/unolingu.hxx>
#include <vcl/scheduler.hxx>
-#include <config_features.h>
#include <sfx2/watermarkitem.hxx>
-#include <sfx2/fcontnr.hxx>
#include <sfx2/docfile.hxx>
-#include <test/htmltesttools.hxx>
#include <fmthdft.hxx>
#include <iodetect.hxx>
-#include <wrthtml.hxx>
-#include <dbmgr.hxx>
-#include <frameformats.hxx>
-#include <docsh.hxx>
-#include <unotxdoc.hxx>
#include <comphelper/processfactory.hxx>
+#include <unotxdoc.hxx>
+#include <swdtflvr.hxx>
+#include <sortedobjs.hxx>
#include <rootfrm.hxx>
+#include <txtfrm.hxx>
namespace
{
-constexpr OUStringLiteral DATA_DIRECTORY = u"/sw/qa/extras/uiwriter/data/";
-
-int CountFilesInDirectory(const OUString &rURL)
+void lcl_selectCharacters(SwPaM& rPaM, sal_Int32 first, sal_Int32 end)
{
- 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;
-}
+ rPaM.GetPoint()->nContent.Assign(rPaM.GetPointContentNode(), first);
+ rPaM.SetMark();
+ rPaM.GetPoint()->nContent.Assign(rPaM.GetPointContentNode(), end);
}
+} //namespace
-class SwUiWriterTest : public SwModelTestBase, public HtmlTestTools
+class SwUiWriterTest : public SwModelTestBase
{
-
public:
- void testReplaceForward();
- //Regression test of fdo#70143
- //EDITING: undo search&replace corrupt text when searching backward
- void testReplaceBackward();
- void testRedlineFrame(char const*const file);
- void testRedlineFrameAtCharStartOutside0();
- void testRedlineFrameAtCharStartOutside();
- void testRedlineFrameAtCharStartInside();
- void testRedlineFrameAtParaStartOutside();
- void testRedlineFrameAtParaEndInside();
- void testRedlineFrameAtParaOneParagraph();
- void testRedlineFrameAtPara2ndParagraph();
- void testThreadedException();
- void testBookmarkCopy();
- void testFdo69893();
- void testFdo70807();
- void testImportRTF();
- void testExportRTF();
- void testDOCXAutoTextEmpty();
- void testDOCXAutoTextMultiple();
- void testDOTMAutoText();
- void testDOCXAutoTextGallery();
- void testWatermarkDOCX();
- void testWatermarkPosition();
- void testTdf67238();
- void testFdo75110();
- void testFdo75898();
- void testFdo74981();
- void testTdf98512();
- void testShapeTextboxSelect();
- void testShapeTextboxDelete();
- void testAnchorChangeSelection();
- void testCp1000071();
- void testShapeTextboxVertadjust();
- void testShapeTextboxAutosize();
- void testFdo82191();
- void testCommentedWord();
- void testTextFieldGetAnchorGetTextInFooter();
- void testChineseConversionBlank();
- void testChineseConversionNonChineseText();
- void testChineseConversionTraditionalToSimplified();
- void testChineseConversionSimplifiedToTraditional();
- void testFdo85554();
- void testAutoCorr();
- void testTdf83260();
- void testTdf130274();
- void testMergeDoc();
- void testCreatePortions();
- void testBookmarkUndo();
- void testFdo85876();
- void testCaretPositionMovingUp();
- void testTdf93441();
- void testTdf81226();
- void testTdf79717();
- void testTdf137532();
- void testFdo87448();
- void testTextCursorInvalidation();
- void testTdf68183();
- void testCp1000115();
- void testTdf63214();
- void testTdf90003();
- void testTdf51741();
- void testDefaultsOfOutlineNumbering();
- void testDeleteTableRedlines();
- void testXFlatParagraph();
- void testTdf81995();
- void testForcepoint3();
- void testForcepoint80();
- void testExportToPicture();
- void testTdf77340();
- void testTdf79236();
- void testTextSearch();
- void testTdf69282();
- void testTdf69282WithMirror();
- void testTdf78742();
- void testUnoParagraph();
- void testTdf72788();
- void testTdf60967();
- void testSearchWithTransliterate();
- void testTdf73660();
- void testNewDocModifiedState();
- void testTdf77342();
- void testTdf63553();
- void testTdf74230();
- void testTdf74363();
- void testTdf80663();
- void testTdf57197();
- void testTdf131990();
- void testTdf90808();
- void testTdf97601();
- void testTdf75137();
- void testTdf83798();
- void testTdf89714();
- void testTdf130287();
- void testPropertyDefaults();
- void testTableBackgroundColor();
- void testTdf88899();
- void testTdf90362();
- void testUndoDelAsCharTdf107512();
- void testUndoCharAttribute();
- void testUndoDelAsChar();
- void testTdf86639();
- void testTdf90883TableBoxGetCoordinates();
- void testEmbeddedDataSource();
- void testUnoCursorPointer();
- void testUnicodeNotationToggle();
- void testTextTableCellNames();
- void testShapeAnchorUndo();
- void testTdf127635();
- void testDde();
- void testDocModState();
- void testTdf94804();
- void testTdf34957();
- void testTdf89954();
- void testTdf89720();
- void testTdf88986();
- void testTdf87922();
- void testTdf77014();
- void testTdf92648();
- void testTdf103978_backgroundTextShape();
- void testTdf96515();
- void testTdf96943();
- void testTdf96536();
- void testTdf96479();
- void testBookmarkCollapsed();
- void testRemoveBookmarkText();
- void testRemoveBookmarkTextAndAddNew();
- void testRemoveBookmarkTextAndAddNewAfterReload();
- void testTdf96961();
- void testTdf88453();
- void testTdf88453Table();
- void testClassificationPaste();
- void testSmallCaps();
- void testTdf98987();
- void testTdf99004();
- void testTdf84695();
- void testTdf84695NormalChar();
- void testTdf84695Tab();
- void testTableStyleUndo();
- void testRedlineCopyPaste();
- void testTdf135260();
- void testRedlineParam();
- void testRedlineViewAuthor();
- void testTdf91292();
- void testTdf78727();
- void testRedlineTimestamp();
- void testCursorWindows();
- void testLandscape();
- void testTdf95699();
- void testTdf104032();
- void testTdf104440();
- void testTdf104425();
- void testTdf104814();
- void testTdf66405();
- void testTdf35021_tabOverMarginDemo();
- void testTdf106701_tabOverMarginAutotab();
- void testTdf104492();
- void testTdf107025();
- void testTdf107362();
- void testTdf105417();
- void testTdf105625();
- void testTdf125151_protected();
- void testTdf125151_protectedB();
- void testTdf106736();
- void testTdf58604();
- void testTdf112025();
- void testTdf72942();
-
- void testTdf113877_mergeDocs(const char* aDestDoc, const char* aInsertDoc);
- void testTdf113877();
- void testTdf113877NoMerge();
- void testTdf113877_default_style();
- void testTdf113877_Standard_style();
- void testTdf113877_blank_bold_on();
- void testTdf113877_blank_bold_off();
-
- void testMsWordCompTrailingBlanks();
- void testCreateDocxAnnotation();
- void testTdf107976();
- void testTdf108524();
- void testRhbz1810732();
- void testTableInSection();
- void testTableInNestedSection();
- void testTableInSectionInTable();
- void testSectionInTableInTable();
- void testSectionInTableInTable2();
- void testSectionInTableInTable3();
- void testSectionInTableInTable4();
- void testTdf112160();
- void testLinesMoveBackwardsInSectionInTable();
- void testTdf112741();
- void testTdf112860();
- void testTdf113287();
- void testTdf113445();
- void testTdf113686();
- void testFontEmbedding();
- void testLinesInSectionInTable();
- void testParagraphOfTextRange();
- void testTdf99689TableOfContents();
- void testTdf99689TableOfFigures();
- void testTdf99689TableOfTables();
- void testTdf112448();
- void testTdf113790();
- void testTdf108048();
- void testTdf114306();
- void testTdf114306_2();
- void testTdf113481();
- void testTdf115013();
- void testTdf114536();
- void testTdf115065();
- void testTdf115132();
- void testXDrawPagesSupplier();
- void testTdf116403();
- void testHtmlCopyImages();
- void testTdf116789();
- void testTdf117225();
- void testTdf91801();
- void testTdf51223();
- void testTdf108423();
- void testTdf106164();
- void testTdf54409();
- void testTdf38394();
- void testTdf59666();
- void testTdf133524();
- void testTdf133524_Romanian();
- void testTdf128860();
- void testTdf123786();
- void testTdf133589();
- void testInconsistentBookmark();
- void testInsertLongDateFormat();
- void testSpellOnlineParameter();
- void testRedlineAutoCorrect();
- void testRedlineAutoCorrect2();
-#if HAVE_FEATURE_PDFIUM
- void testInsertPdf();
-#endif
-
- CPPUNIT_TEST_SUITE(SwUiWriterTest);
- CPPUNIT_TEST(testReplaceForward);
- CPPUNIT_TEST(testReplaceBackward);
- CPPUNIT_TEST(testRedlineFrameAtCharStartOutside0);
- CPPUNIT_TEST(testRedlineFrameAtCharStartOutside);
- CPPUNIT_TEST(testRedlineFrameAtCharStartInside);
- CPPUNIT_TEST(testRedlineFrameAtParaStartOutside);
- CPPUNIT_TEST(testRedlineFrameAtParaEndInside);
- CPPUNIT_TEST(testRedlineFrameAtParaOneParagraph);
- CPPUNIT_TEST(testRedlineFrameAtPara2ndParagraph);
- CPPUNIT_TEST(testThreadedException);
- CPPUNIT_TEST(testBookmarkCopy);
- CPPUNIT_TEST(testFdo69893);
- CPPUNIT_TEST(testFdo70807);
- CPPUNIT_TEST(testImportRTF);
- CPPUNIT_TEST(testExportRTF);
- CPPUNIT_TEST(testDOCXAutoTextEmpty);
- CPPUNIT_TEST(testDOCXAutoTextMultiple);
- CPPUNIT_TEST(testDOTMAutoText);
- CPPUNIT_TEST(testDOCXAutoTextGallery);
- CPPUNIT_TEST(testWatermarkDOCX);
- CPPUNIT_TEST(testWatermarkPosition);
- CPPUNIT_TEST(testTdf67238);
- CPPUNIT_TEST(testFdo75110);
- CPPUNIT_TEST(testFdo75898);
- CPPUNIT_TEST(testFdo74981);
- CPPUNIT_TEST(testTdf98512);
- CPPUNIT_TEST(testShapeTextboxSelect);
- CPPUNIT_TEST(testShapeTextboxDelete);
- CPPUNIT_TEST(testAnchorChangeSelection);
- CPPUNIT_TEST(testCp1000071);
- CPPUNIT_TEST(testShapeTextboxVertadjust);
- CPPUNIT_TEST(testShapeTextboxAutosize);
- CPPUNIT_TEST(testFdo82191);
- CPPUNIT_TEST(testCommentedWord);
- CPPUNIT_TEST(testTextFieldGetAnchorGetTextInFooter);
- CPPUNIT_TEST(testChineseConversionBlank);
- CPPUNIT_TEST(testChineseConversionNonChineseText);
- CPPUNIT_TEST(testChineseConversionTraditionalToSimplified);
- CPPUNIT_TEST(testChineseConversionSimplifiedToTraditional);
- CPPUNIT_TEST(testFdo85554);
- CPPUNIT_TEST(testAutoCorr);
- CPPUNIT_TEST(testTdf83260);
- CPPUNIT_TEST(testTdf130274);
- CPPUNIT_TEST(testMergeDoc);
- CPPUNIT_TEST(testCreatePortions);
- CPPUNIT_TEST(testBookmarkUndo);
- CPPUNIT_TEST(testFdo85876);
- CPPUNIT_TEST(testCaretPositionMovingUp);
- CPPUNIT_TEST(testTdf93441);
- CPPUNIT_TEST(testTdf81226);
- CPPUNIT_TEST(testTdf79717);
- CPPUNIT_TEST(testTdf137532);
- CPPUNIT_TEST(testFdo87448);
- CPPUNIT_TEST(testTextCursorInvalidation);
- CPPUNIT_TEST(testTdf68183);
- CPPUNIT_TEST(testCp1000115);
- CPPUNIT_TEST(testTdf63214);
- CPPUNIT_TEST(testTdf90003);
- CPPUNIT_TEST(testTdf51741);
- CPPUNIT_TEST(testDefaultsOfOutlineNumbering);
- CPPUNIT_TEST(testDeleteTableRedlines);
- CPPUNIT_TEST(testXFlatParagraph);
- CPPUNIT_TEST(testTdf81995);
- CPPUNIT_TEST(testForcepoint3);
- CPPUNIT_TEST(testForcepoint80);
- CPPUNIT_TEST(testExportToPicture);
- CPPUNIT_TEST(testTdf77340);
- CPPUNIT_TEST(testTdf79236);
- CPPUNIT_TEST(testTextSearch);
- CPPUNIT_TEST(testTdf69282);
- CPPUNIT_TEST(testTdf69282WithMirror);
- CPPUNIT_TEST(testTdf78742);
- CPPUNIT_TEST(testUnoParagraph);
- CPPUNIT_TEST(testTdf72788);
- CPPUNIT_TEST(testTdf60967);
- CPPUNIT_TEST(testSearchWithTransliterate);
- CPPUNIT_TEST(testTdf73660);
- CPPUNIT_TEST(testNewDocModifiedState);
- CPPUNIT_TEST(testTdf77342);
- CPPUNIT_TEST(testTdf63553);
- CPPUNIT_TEST(testTdf74230);
- CPPUNIT_TEST(testTdf74363);
- CPPUNIT_TEST(testTdf80663);
- CPPUNIT_TEST(testTdf57197);
- CPPUNIT_TEST(testTdf131990);
- CPPUNIT_TEST(testTdf90808);
- CPPUNIT_TEST(testTdf97601);
- CPPUNIT_TEST(testTdf75137);
- CPPUNIT_TEST(testTdf83798);
- CPPUNIT_TEST(testTdf89714);
- CPPUNIT_TEST(testTdf130287);
- CPPUNIT_TEST(testPropertyDefaults);
- CPPUNIT_TEST(testTableBackgroundColor);
- CPPUNIT_TEST(testTdf88899);
- CPPUNIT_TEST(testTdf90362);
- CPPUNIT_TEST(testUndoDelAsCharTdf107512);
- CPPUNIT_TEST(testUndoCharAttribute);
- CPPUNIT_TEST(testUndoDelAsChar);
- CPPUNIT_TEST(testTdf86639);
- CPPUNIT_TEST(testTdf90883TableBoxGetCoordinates);
- CPPUNIT_TEST(testEmbeddedDataSource);
- CPPUNIT_TEST(testUnoCursorPointer);
- CPPUNIT_TEST(testUnicodeNotationToggle);
- CPPUNIT_TEST(testTextTableCellNames);
- CPPUNIT_TEST(testShapeAnchorUndo);
- CPPUNIT_TEST(testTdf127635);
- CPPUNIT_TEST(testDde);
- CPPUNIT_TEST(testDocModState);
- CPPUNIT_TEST(testTdf94804);
- CPPUNIT_TEST(testTdf34957);
- CPPUNIT_TEST(testTdf89954);
- CPPUNIT_TEST(testTdf89720);
- CPPUNIT_TEST(testTdf88986);
- CPPUNIT_TEST(testTdf87922);
- CPPUNIT_TEST(testTdf77014);
- CPPUNIT_TEST(testTdf92648);
- CPPUNIT_TEST(testTdf103978_backgroundTextShape);
- CPPUNIT_TEST(testTdf96515);
- CPPUNIT_TEST(testTdf96943);
- CPPUNIT_TEST(testTdf96536);
- CPPUNIT_TEST(testTdf96479);
- CPPUNIT_TEST(testBookmarkCollapsed);
- CPPUNIT_TEST(testRemoveBookmarkText);
- CPPUNIT_TEST(testRemoveBookmarkTextAndAddNew);
- CPPUNIT_TEST(testRemoveBookmarkTextAndAddNewAfterReload);
- CPPUNIT_TEST(testTdf96961);
- CPPUNIT_TEST(testTdf88453);
- CPPUNIT_TEST(testTdf88453Table);
- CPPUNIT_TEST(testClassificationPaste);
- CPPUNIT_TEST(testSmallCaps);
- CPPUNIT_TEST(testTdf98987);
- CPPUNIT_TEST(testTdf99004);
- CPPUNIT_TEST(testTdf84695);
- CPPUNIT_TEST(testTdf84695NormalChar);
- CPPUNIT_TEST(testTdf84695Tab);
- CPPUNIT_TEST(testTableStyleUndo);
- CPPUNIT_TEST(testRedlineCopyPaste);
- CPPUNIT_TEST(testTdf135260);
- CPPUNIT_TEST(testRedlineParam);
- CPPUNIT_TEST(testRedlineViewAuthor);
- CPPUNIT_TEST(testTdf91292);
- CPPUNIT_TEST(testTdf78727);
- CPPUNIT_TEST(testRedlineTimestamp);
- CPPUNIT_TEST(testCursorWindows);
- CPPUNIT_TEST(testLandscape);
- CPPUNIT_TEST(testTdf95699);
- CPPUNIT_TEST(testTdf104032);
- CPPUNIT_TEST(testTdf104440);
- CPPUNIT_TEST(testTdf104425);
- CPPUNIT_TEST(testTdf104814);
- CPPUNIT_TEST(testTdf66405);
- CPPUNIT_TEST(testTdf35021_tabOverMarginDemo);
- CPPUNIT_TEST(testTdf106701_tabOverMarginAutotab);
- CPPUNIT_TEST(testTdf104492);
- CPPUNIT_TEST(testTdf107025);
- CPPUNIT_TEST(testTdf107362);
- CPPUNIT_TEST(testTdf105417);
- CPPUNIT_TEST(testTdf105625);
- CPPUNIT_TEST(testTdf125151_protected);
- CPPUNIT_TEST(testTdf125151_protectedB);
- CPPUNIT_TEST(testTdf106736);
- CPPUNIT_TEST(testTdf58604);
- CPPUNIT_TEST(testTdf112025);
- CPPUNIT_TEST(testTdf72942);
- CPPUNIT_TEST(testTdf113877);
- CPPUNIT_TEST(testTdf113877NoMerge);
- CPPUNIT_TEST(testTdf113877_default_style);
- CPPUNIT_TEST(testTdf113877_Standard_style);
- CPPUNIT_TEST(testTdf113877_blank_bold_on);
- CPPUNIT_TEST(testTdf113877_blank_bold_off);
- CPPUNIT_TEST(testMsWordCompTrailingBlanks);
- CPPUNIT_TEST(testCreateDocxAnnotation);
- CPPUNIT_TEST(testTdf107976);
- CPPUNIT_TEST(testTdf108524);
- CPPUNIT_TEST(testRhbz1810732);
- CPPUNIT_TEST(testTableInSection);
- CPPUNIT_TEST(testTableInNestedSection);
- CPPUNIT_TEST(testTableInSectionInTable);
- CPPUNIT_TEST(testSectionInTableInTable);
- CPPUNIT_TEST(testSectionInTableInTable2);
- CPPUNIT_TEST(testSectionInTableInTable3);
- CPPUNIT_TEST(testSectionInTableInTable4);
- CPPUNIT_TEST(testTdf112160);
- CPPUNIT_TEST(testLinesMoveBackwardsInSectionInTable);
- CPPUNIT_TEST(testTdf112741);
- CPPUNIT_TEST(testTdf112860);
- CPPUNIT_TEST(testTdf113287);
- CPPUNIT_TEST(testTdf113445);
- CPPUNIT_TEST(testTdf113686);
- CPPUNIT_TEST(testFontEmbedding);
- CPPUNIT_TEST(testLinesInSectionInTable);
- CPPUNIT_TEST(testParagraphOfTextRange);
- CPPUNIT_TEST(testTdf99689TableOfContents);
- CPPUNIT_TEST(testTdf99689TableOfFigures);
- CPPUNIT_TEST(testTdf99689TableOfTables);
- CPPUNIT_TEST(testTdf112448);
- CPPUNIT_TEST(testTdf113790);
- CPPUNIT_TEST(testTdf108048);
- CPPUNIT_TEST(testTdf114306);
- CPPUNIT_TEST(testTdf114306_2);
- CPPUNIT_TEST(testTdf113481);
- CPPUNIT_TEST(testTdf115013);
- CPPUNIT_TEST(testTdf114536);
- CPPUNIT_TEST(testTdf115065);
- CPPUNIT_TEST(testTdf115132);
- CPPUNIT_TEST(testXDrawPagesSupplier);
- CPPUNIT_TEST(testTdf116403);
- CPPUNIT_TEST(testHtmlCopyImages);
- CPPUNIT_TEST(testTdf116789);
- CPPUNIT_TEST(testTdf117225);
- CPPUNIT_TEST(testTdf91801);
- CPPUNIT_TEST(testTdf51223);
- CPPUNIT_TEST(testInconsistentBookmark);
- CPPUNIT_TEST(testTdf108423);
- CPPUNIT_TEST(testTdf106164);
- CPPUNIT_TEST(testTdf54409);
- CPPUNIT_TEST(testTdf38394);
- CPPUNIT_TEST(testTdf59666);
- CPPUNIT_TEST(testTdf133524);
- CPPUNIT_TEST(testTdf133524_Romanian);
- CPPUNIT_TEST(testTdf128860);
- CPPUNIT_TEST(testTdf123786);
- CPPUNIT_TEST(testTdf133589);
- CPPUNIT_TEST(testInsertLongDateFormat);
- CPPUNIT_TEST(testSpellOnlineParameter);
- CPPUNIT_TEST(testRedlineAutoCorrect);
- CPPUNIT_TEST(testRedlineAutoCorrect2);
-#if HAVE_FEATURE_PDFIUM
- CPPUNIT_TEST(testInsertPdf);
-#endif
- CPPUNIT_TEST_SUITE_END();
-
-private:
- SwDoc* createDoc(const char* pName = nullptr);
+ SwUiWriterTest() :
+ SwModelTestBase(u"/sw/qa/extras/uiwriter/data/"_ustr)
+ {}
+
std::unique_ptr<SwTextBlocks> readDOCXAutotext(
std::u16string_view sFileName, bool bEmpty = false);
+ void testRedlineFrame(char const*const file);
};
-SwDoc* SwUiWriterTest::createDoc(const char* pName)
-{
- if (!pName)
- loadURL("private:factory/swriter", nullptr);
- else
- load(DATA_DIRECTORY, pName);
-
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- return pTextDoc->GetDocShell()->GetDoc();
-}
-
std::unique_ptr<SwTextBlocks> SwUiWriterTest::readDOCXAutotext(std::u16string_view sFileName, bool bEmpty)
{
- utl::TempFile tmp;
- tmp.EnableKillingFile();
- OUString rURL = tmp.GetURL();
- CPPUNIT_ASSERT_EQUAL(
- osl::FileBase::E_None,
- osl::File::copy(m_directories.getURLFromSrc(DATA_DIRECTORY) + sFileName, rURL));
+ createTempCopy(sFileName);
- SfxMedium aSrcMed(rURL, StreamMode::STD_READ);
- SwDoc* pDoc = createDoc();
+ SfxMedium aSrcMed(maTempFile.GetURL(), StreamMode::STD_READ);
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
- SwReader aReader(aSrcMed, rURL, pDoc);
+ SwReader aReader(aSrcMed, maTempFile.GetURL(), pDoc);
Reader* pDOCXReader = SwReaderWriter::GetDOCXReader();
- auto pGlossary = std::make_unique<SwTextBlocks>(rURL);
+ auto pGlossary = std::make_unique<SwTextBlocks>(maTempFile.GetURL());
CPPUNIT_ASSERT(pDOCXReader != nullptr);
CPPUNIT_ASSERT_EQUAL(!bEmpty, aReader.ReadGlossaries(*pDOCXReader, *pGlossary, false));
@@ -676,44 +103,10 @@ std::unique_ptr<SwTextBlocks> SwUiWriterTest::readDOCXAutotext(std::u16string_vi
return pGlossary;
}
-//Replacement tests
-
-static void lcl_selectCharacters(SwPaM& rPaM, sal_Int32 first, sal_Int32 end)
-{
- rPaM.GetPoint()->nContent.Assign(rPaM.GetContentNode(), first);
- rPaM.SetMark();
- rPaM.GetPoint()->nContent.Assign(rPaM.GetContentNode(), end);
-}
-
-constexpr OUStringLiteral ORIGINAL_REPLACE_CONTENT(u"toto titi tutu");
-constexpr OUStringLiteral EXPECTED_REPLACE_CONTENT(u"toto toto tutu");
-
-void SwUiWriterTest::testReplaceForward()
-{
- SwDoc* pDoc = createDoc();
-
- sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
-
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
-
- pDoc->getIDocumentContentOperations().InsertString(aPaM, ORIGINAL_REPLACE_CONTENT);
-
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
- lcl_selectCharacters(aPaM, 5, 9);
- pDoc->getIDocumentContentOperations().ReplaceRange(aPaM, "toto", false);
-
- CPPUNIT_ASSERT_EQUAL(OUString(EXPECTED_REPLACE_CONTENT), pTextNode->GetText());
-
- rUndoManager.Undo();
-
- CPPUNIT_ASSERT_EQUAL(OUString(ORIGINAL_REPLACE_CONTENT), pTextNode->GetText());
-}
-
void SwUiWriterTest::testRedlineFrame(char const*const file)
{
- SwDoc * pDoc(createDoc(file));
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc(file);
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
// there is exactly one frame
CPPUNIT_ASSERT_EQUAL(1, getShapes());
@@ -733,46 +126,81 @@ void SwUiWriterTest::testRedlineFrame(char const*const file)
CPPUNIT_ASSERT_EQUAL(1, getShapes());
}
-void SwUiWriterTest::testRedlineFrameAtCharStartOutside0()
+//Replacement tests
+
+constexpr OUString ORIGINAL_REPLACE_CONTENT(u"toto titi tutu"_ustr);
+constexpr OUString EXPECTED_REPLACE_CONTENT(u"toto toto tutu"_ustr);
+
+// Chinese conversion tests
+
+const sal_Unicode CHINESE_TRADITIONAL_CONTENT(0x9F8D);
+const sal_Unicode CHINESE_SIMPLIFIED_CONTENT(0x9F99);
+constexpr OUString NON_CHINESE_CONTENT(u"Hippopotamus"_ustr);
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testReplaceForward)
+{
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+
+ sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
+
+ SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
+ SwPaM aPaM(aIdx);
+
+ pDoc->getIDocumentContentOperations().InsertString(aPaM, ORIGINAL_REPLACE_CONTENT);
+
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
+ lcl_selectCharacters(aPaM, 5, 9);
+ pDoc->getIDocumentContentOperations().ReplaceRange(aPaM, u"toto"_ustr, false);
+
+ CPPUNIT_ASSERT_EQUAL(EXPECTED_REPLACE_CONTENT, pTextNode->GetText());
+
+ rUndoManager.Undo();
+
+ CPPUNIT_ASSERT_EQUAL(ORIGINAL_REPLACE_CONTENT, pTextNode->GetText());
+}
+
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtCharStartOutside0)
{
testRedlineFrame("redlineFrame.fodt");
}
-void SwUiWriterTest::testRedlineFrameAtCharStartOutside()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtCharStartOutside)
{
testRedlineFrame("redlineFrame_at_char_start_outside.fodt");
}
-void SwUiWriterTest::testRedlineFrameAtCharStartInside()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtCharStartInside)
{
testRedlineFrame("redlineFrame_at_char_start_inside.fodt");
}
-void SwUiWriterTest::testRedlineFrameAtParaStartOutside()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtParaStartOutside)
{
testRedlineFrame("redline_fly_duplication_at_para_start_outside.fodt");
}
-void SwUiWriterTest::testRedlineFrameAtParaEndInside()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtParaEndInside)
{
testRedlineFrame("redline_fly_duplication_at_para_end_inside.fodt");
}
-void SwUiWriterTest::testRedlineFrameAtParaOneParagraph()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtParaOneParagraph)
{
// test ALLFLYS flag: oddly enough it didn't fail as fodt but failed as odt...
testRedlineFrame("redline_fly_at_para_one_paragraph.odt");
}
-void SwUiWriterTest::testRedlineFrameAtPara2ndParagraph()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testRedlineFrameAtPara2ndParagraph)
{
// lost via the buggy increment in Copy
testRedlineFrame("redline_fly_duplication_at_para_2nd_paragraph.fodt");
}
-void SwUiWriterTest::testThreadedException()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testThreadedException)
{
- SvFileStream aFileStream(m_directories.getURLFromSrc(DATA_DIRECTORY) + "threadedException.fodt", StreamMode::READ);
+ SvFileStream aFileStream(createFileURL(u"threadedException.fodt"), StreamMode::READ);
//threaded reading only kicks in if there is sufficient buffer to make it worthwhile, so read
//from a SvFileStream to ensure that
@@ -781,26 +209,249 @@ void SwUiWriterTest::testThreadedException()
CPPUNIT_ASSERT(!bRes);
}
-void SwUiWriterTest::testBookmarkCopy()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf149595)
{
- SwDoc * pDoc(createDoc());
+ createSwDoc("demo91.fodt");
+
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+
+ // all 4 shapes are on the 2nd paragraph
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() == nullptr);
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(4), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+
+ {
+ pWrtShell->Down(false);
+ pWrtShell->EndPara(/*bSelect=*/true);
+ dispatchCommand(mxComponent, u".uno:Cut"_ustr, {});
+
+ // one shape is anchored in the middle, others at the start/end/at-para
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() == nullptr);
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+
+ pWrtShell->Up(false);
+ dispatchCommand(mxComponent, u".uno:Paste"_ustr, {});
+
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs()->size());
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+
+ pWrtShell->Undo();
+ pWrtShell->Undo();
+
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() == nullptr);
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(4), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+ }
+
+ // now try the same with redlining enabled - should be the same result
+ dispatchCommand(mxComponent, u".uno:ShowTrackedChanges"_ustr, {});
+ dispatchCommand(mxComponent, u".uno:TrackChanges"_ustr, {});
+ {
+ pWrtShell->Down(false);
+ pWrtShell->SttPara(/*bSelect=*/false);
+ pWrtShell->EndPara(/*bSelect=*/true);
+ dispatchCommand(mxComponent, u".uno:Cut"_ustr, {});
+
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() == nullptr);
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ // problem was that this deleted all at-char flys, even at the start/end
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+
+ pWrtShell->Up(false);
+ dispatchCommand(mxComponent, u".uno:Paste"_ustr, {});
+
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs()->size());
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+
+ pWrtShell->Undo();
+ pWrtShell->Undo();
+
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs() == nullptr);
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs() != nullptr);
+ CPPUNIT_ASSERT_EQUAL(size_t(4), pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetNext()->GetDrawObjs()->size());
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf149548)
+{
+ createSwDoc("forum-mso-en-13192-min.docx");
+ SwDoc* pDoc = getSwDoc();
+
+ for (SwRangeRedline const*const pRedline : pDoc->getIDocumentRedlineAccess().GetRedlineTable())
+ {
+ if (pRedline->GetType() == RedlineType::Delete)
+ {
+ int nLevel(0);
+ for (SwNodeIndex index = pRedline->Start()->nNode; index <= pRedline->End()->nNode; ++index)
+ {
+ switch (index.GetNode().GetNodeType())
+ {
+ case SwNodeType::Start:
+ case SwNodeType::Table:
+ case SwNodeType::Section:
+ ++nLevel;
+ break;
+ case SwNodeType::End:
+ CPPUNIT_ASSERT_MESSAGE("bad overlapping redline", nLevel != 0);
+ --nLevel;
+ break;
+ default:
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("bad overlapping redline", int(0), nLevel);
+ }
+ }
+
+ dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {});
+
+ dispatchCommand(mxComponent, u".uno:Copy"_ustr, {});
+
+ // this was a use-after-free on nodes deleted by Copy
+ dispatchCommand(mxComponent, u".uno:Paste"_ustr, {});
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testPasteTableAtFlyAnchor)
+{
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+
+ SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR);
+ anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint());
+ SfxItemSet flySet(pDoc->GetAttrPool(), svl::Items<RES_ANCHOR, RES_ANCHOR>);
+ flySet.Put(anchor);
+ SwFlyFrameFormat const* pFly = dynamic_cast<SwFlyFrameFormat const*>(
+ pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true));
+ CPPUNIT_ASSERT(pFly != nullptr);
+ CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+ pWrtShell->SelFlyGrabCursor();
+ pWrtShell->GetDrawView()->UnmarkAll();
+ CPPUNIT_ASSERT(pWrtShell->GetCurrFlyFrame() != nullptr);
+
+ // insert table in fly
+ SwInsertTableOptions tableOpt(SwInsertTableFlags::DefaultBorder, 0);
+ pWrtShell->InsertTable(tableOpt, 2, 2);
+
+ // select table
+ pWrtShell->SelAll();
+
+ dispatchCommand(mxComponent, u".uno:Copy"_ustr, {});
+
+ // move cursor back to body
+ pWrtShell->ClearMark();
+ pWrtShell->SttEndDoc(/*bStt=*/true);
+ CPPUNIT_ASSERT(!pWrtShell->GetCurrFlyFrame());
+
+ dispatchCommand(mxComponent, u".uno:Paste"_ustr, {});
+
+ pWrtShell->SttEndDoc(/*bStt=*/true);
+ CPPUNIT_ASSERT(pWrtShell->IsCursorInTable());
+ CPPUNIT_ASSERT(!pFly->GetAnchor().GetContentAnchor()->GetNode().FindTableNode());
+
+ pWrtShell->Undo();
+
+ pWrtShell->SttEndDoc(/*bStt=*/true);
+ CPPUNIT_ASSERT(!pWrtShell->IsCursorInTable());
+ CPPUNIT_ASSERT(!pFly->GetAnchor().GetContentAnchor()->GetNode().FindTableNode());
+
+ // the problem was that Redo moved the fly anchor into the first table cell
+ pWrtShell->Redo();
+
+ pWrtShell->SttEndDoc(/*bStt=*/true);
+ CPPUNIT_ASSERT(pWrtShell->IsCursorInTable());
+ CPPUNIT_ASSERT(!pFly->GetAnchor().GetContentAnchor()->GetNode().FindTableNode());
+
+ pWrtShell->Undo();
+
+ pWrtShell->SttEndDoc(/*bStt=*/true);
+ CPPUNIT_ASSERT(!pWrtShell->IsCursorInTable());
+ CPPUNIT_ASSERT(!pFly->GetAnchor().GetContentAnchor()->GetNode().FindTableNode());
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testCopyPastePageBreak)
+{
+ createSwDoc("pagebreak-source.fodt");
+
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ CPPUNIT_ASSERT_EQUAL(tools::Long(5669), pWrtShell->GetLayout()->GetLower()->getFramePrintArea().Top());
+
+ pWrtShell->SelAll();
+ dispatchCommand(mxComponent, u".uno:Copy"_ustr, {});
+
+ createSwDoc("pagebreak-target.fodt");
+ SwDoc* pDoc = getSwDoc();
+ pWrtShell = getSwDocShell()->GetWrtShell();
+
+ CPPUNIT_ASSERT_EQUAL(1, getParagraphs());
+ CPPUNIT_ASSERT_EQUAL(u"WithMargin"_ustr, getProperty<OUString>(getParagraph(1), u"PageDescName"_ustr));
+ CPPUNIT_ASSERT_EQUAL(u"TargetSection"_ustr, pWrtShell->GetCurrSection()->GetSectionName().toString());
+ // page style WithMargin is used
+ CPPUNIT_ASSERT_EQUAL(tools::Long(5669), pWrtShell->GetLayout()->GetLower()->getFramePrintArea().Top());
+
+ dispatchCommand(mxComponent, u".uno:Paste"_ustr, {});
+
+ CPPUNIT_ASSERT_EQUAL(2, getParagraphs());
+ CPPUNIT_ASSERT_EQUAL(u"WithMargin"_ustr, getProperty<OUString>(getParagraph(1), u"PageDescName"_ustr));
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetSections().size());
+ CPPUNIT_ASSERT_EQUAL(u"SourceSection"_ustr, pWrtShell->GetCurrSection()->GetSectionName().toString());
+ // the problem was that there was a page break now
+ CPPUNIT_ASSERT_EQUAL(1, getPages());
+ // page style WithMargin is used
+ CPPUNIT_ASSERT_EQUAL(tools::Long(5669), pWrtShell->GetLayout()->GetLower()->getFramePrintArea().Top());
+
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(1, getParagraphs());
+ CPPUNIT_ASSERT_EQUAL(u"WithMargin"_ustr, getProperty<OUString>(getParagraph(1), u"PageDescName"_ustr));
+ CPPUNIT_ASSERT_EQUAL(u"TargetSection"_ustr, pWrtShell->GetCurrSection()->GetSectionName().toString());
+ CPPUNIT_ASSERT_EQUAL(1, getPages());
+ // page style WithMargin is used
+ CPPUNIT_ASSERT_EQUAL(tools::Long(5669), pWrtShell->GetLayout()->GetLower()->getFramePrintArea().Top());
+
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT_EQUAL(2, getParagraphs());
+ CPPUNIT_ASSERT_EQUAL(u"WithMargin"_ustr, getProperty<OUString>(getParagraph(1), u"PageDescName"_ustr));
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetSections().size());
+ CPPUNIT_ASSERT_EQUAL(u"SourceSection"_ustr, pWrtShell->GetCurrSection()->GetSectionName().toString());
+ CPPUNIT_ASSERT_EQUAL(1, getPages());
+ // page style WithMargin is used
+ CPPUNIT_ASSERT_EQUAL(tools::Long(5669), pWrtShell->GetLayout()->GetLower()->getFramePrintArea().Top());
+
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(1, getParagraphs());
+ CPPUNIT_ASSERT_EQUAL(u"WithMargin"_ustr, getProperty<OUString>(getParagraph(1), u"PageDescName"_ustr));
+ CPPUNIT_ASSERT_EQUAL(u"TargetSection"_ustr, pWrtShell->GetCurrSection()->GetSectionName().toString());
+ CPPUNIT_ASSERT_EQUAL(1, getPages());
+ // page style WithMargin is used
+ CPPUNIT_ASSERT_EQUAL(tools::Long(5669), pWrtShell->GetLayout()->GetLower()->getFramePrintArea().Top());
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testBookmarkCopy)
+{
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
// add text and bookmark
IDocumentMarkAccess & rIDMA(*pDoc->getIDocumentMarkAccess());
IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations());
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwCursor aPaM(SwPosition(aIdx), nullptr);
- rIDCO.InsertString(aPaM, "foo");
+ rIDCO.InsertString(aPaM, u"foo"_ustr);
rIDCO.SplitNode(*aPaM.GetPoint(), false);
- rIDCO.InsertString(aPaM, "bar");
+ rIDCO.InsertString(aPaM, u"bar"_ustr);
aPaM.SetMark();
aPaM.MovePara(GoCurrPara, fnParaStart);
- rIDMA.makeMark(aPaM, "Mark", IDocumentMarkAccess::MarkType::BOOKMARK,
+ rIDMA.makeMark(aPaM, SwMarkName(u"Mark"_ustr), IDocumentMarkAccess::MarkType::BOOKMARK,
::sw::mark::InsertMode::New);
aPaM.Exchange();
aPaM.DeleteMark();
rIDCO.SplitNode(*aPaM.GetPoint(), false);
- rIDCO.InsertString(aPaM, "baz");
+ rIDCO.InsertString(aPaM, u"baz"_ustr);
// copy range
rIDCO.SplitNode(*aPaM.GetPoint(), false);
@@ -817,7 +468,7 @@ void SwUiWriterTest::testBookmarkCopy()
for (auto it(rIDMA.getBookmarksBegin()); it != rIDMA.getBookmarksEnd(); ++it)
{
OUString markText(SwPaM((*it)->GetMarkPos(), (*it)->GetOtherMarkPos()).GetText());
- CPPUNIT_ASSERT_EQUAL(OUString("bar"), markText);
+ CPPUNIT_ASSERT_EQUAL(u"bar"_ustr, markText);
}
// copy 2nd time, such that bCanMoveBack is false in CopyImpl
@@ -833,15 +484,79 @@ void SwUiWriterTest::testBookmarkCopy()
for (auto it(rIDMA.getBookmarksBegin()); it != rIDMA.getBookmarksEnd(); ++it)
{
OUString markText(SwPaM((*it)->GetMarkPos(), (*it)->GetOtherMarkPos()).GetText());
- CPPUNIT_ASSERT_EQUAL(OUString("bar"), markText);
- }
+ CPPUNIT_ASSERT_EQUAL(u"bar"_ustr, markText);
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFormulaNumberWithGroupSeparator)
+{
+ createSwDoc("tdf125154.odt");
+ dispatchCommand(mxComponent, u".uno:UpdateAll"_ustr, {});
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->SttEndDoc(true);
+ SwField const* pField;
+
+ pField = pWrtShell->GetCurField();
+ CPPUNIT_ASSERT_EQUAL(u"1000"_ustr, pField->GetFormula());
+ CPPUNIT_ASSERT_EQUAL(u"1.000"_ustr, pField->ExpandField(true, nullptr));
+ pWrtShell->GoNextCell();
+ CPPUNIT_ASSERT_EQUAL(u"10000"_ustr, pWrtShell->GetCursor()->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
+ pWrtShell->GoNextCell();
+ pField = pWrtShell->GetCurField();
+ CPPUNIT_ASSERT_EQUAL(u"test"_ustr, pField->GetFormula());
+ CPPUNIT_ASSERT_EQUAL(u"1.000"_ustr, pField->ExpandField(true, nullptr));
+ pWrtShell->GoNextCell();
+ // the problem was that this was 0
+ CPPUNIT_ASSERT_EQUAL(u"10000"_ustr, pWrtShell->GetCursor()->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
+ pWrtShell->Down(false);
+ pWrtShell->SttPara(false);
+ pField = pWrtShell->GetCurField();
+ CPPUNIT_ASSERT_EQUAL(u"1000*10%"_ustr, pField->GetFormula());
+ CPPUNIT_ASSERT_EQUAL(u"100"_ustr, pField->ExpandField(true, nullptr));
+ pWrtShell->Down(false);
+ pField = pWrtShell->GetCurField();
+ CPPUNIT_ASSERT_EQUAL(u"5.000*10%"_ustr, pField->GetFormula());
+ // the problem was that this was 0
+ CPPUNIT_ASSERT_EQUAL(u"500"_ustr, pField->ExpandField(true, nullptr));
+ pWrtShell->Down(false);
+ pField = pWrtShell->GetCurField();
+ CPPUNIT_ASSERT_EQUAL(u"5.000*10%"_ustr, pField->GetFormula());
+ // the problem was that this was
+ CPPUNIT_ASSERT_EQUAL(u"500"_ustr, pField->ExpandField(true, nullptr));
+ pWrtShell->Down(false);
+ pField = pWrtShell->GetCurField();
+ CPPUNIT_ASSERT_EQUAL(u"5000*10%"_ustr, pField->GetFormula());
+ CPPUNIT_ASSERT_EQUAL(u"500"_ustr, pField->ExpandField(true, nullptr));
+ pWrtShell->Down(false);
+ CPPUNIT_ASSERT_EQUAL(u"-100,00 €"_ustr, pWrtShell->GetCursor()->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
+ pWrtShell->GoNextCell();
+ // tdf#42518 the problem was that this was 1.900,00 €
+ CPPUNIT_ASSERT_EQUAL(u"** Expression is faulty **"_ustr, pWrtShell->GetCursor()->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testInsertFileInInputFieldException)
+{
+ createSwDoc();
+ uno::Reference<text::XTextDocument> const xTextDoc(mxComponent, uno::UNO_QUERY);
+ uno::Reference<text::XText> const xBody(xTextDoc->getText());
+ uno::Reference<lang::XMultiServiceFactory> const xFactory(mxComponent, uno::UNO_QUERY);
+ uno::Reference<text::XTextCursor> const xCursor(xBody->createTextCursor());
+ uno::Reference<document::XDocumentInsertable> const xInsertable(xCursor, uno::UNO_QUERY);
+ uno::Reference<text::XTextContent> const xContent(
+ xFactory->createInstance(u"com.sun.star.text.textfield.Input"_ustr), uno::UNO_QUERY);
+ xBody->insertTextContent(xCursor, xContent, false);
+ xCursor->goLeft(1, false);
+ // try to insert some random file
+ // inserting even asserts in debug builds - document model goes invalid with input field split across 2 nodes
+ CPPUNIT_ASSERT_THROW(xInsertable->insertDocumentFromURL(createFileURL(u"fdo75110.odt"), {}), uno::RuntimeException);
}
-void SwUiWriterTest::testTdf67238()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf67238)
{
//create a new writer document
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
//insert a 3X3 table in the newly created document
SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0);
@@ -856,84 +571,192 @@ void SwUiWriterTest::testTdf67238()
//making the table protected
pWrtShell->ProtectCells();
//checking each cell's protection, it should be protected
- CPPUNIT_ASSERT(((rTable.GetTableBox("A1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("A2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("A3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
//undo the changes, make cells [un]protected
rUndoManager.Undo();
//checking each cell's protection, it should be [un]protected
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
//redo the changes, make cells protected
rUndoManager.Redo();
//checking each cell's protection, it should be protected
- CPPUNIT_ASSERT(((rTable.GetTableBox("A1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("A2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("A3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
//moving the cursor to the starting of the document
pWrtShell->StartOfSection();
//making the table [un]protected
pWrtShell->SelTable();
pWrtShell->UnProtectCells();
//checking each cell's protection, it should be [un]protected
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
//undo the changes, make cells protected
rUndoManager.Undo();
//checking each cell's protection, it should be protected
- CPPUNIT_ASSERT(((rTable.GetTableBox("A1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("A2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("A3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("B3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"A3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"B3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(((rTable.GetTableBox(u"C3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
//redo the changes, make cells [un]protected
rUndoManager.Redo();
//checking each cell's protection, it should be [un]protected
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("A3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("B3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C1"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C2"))->GetFrameFormat()->GetProtect()).IsContentProtected());
- CPPUNIT_ASSERT(!((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"A3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"B3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C1"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C2"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+ CPPUNIT_ASSERT(!((rTable.GetTableBox(u"C3"_ustr))->GetFrameFormat()->GetProtect()).IsContentProtected());
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf155685)
+{
+ createSwDoc("table-at-end-of-cell.fodt");
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->GoNextCell();
+ pWrtShell->GoNextCell();
+ pWrtShell->GoNextCell();
+ pWrtShell->SelAll();
+ pWrtShell->Delete();
+ // this crashed
+ pWrtShell->Undo();
+ pWrtShell->Undo();
+ pWrtShell->Redo();
+ // this crashed
+ pWrtShell->Redo();
}
-void SwUiWriterTest::testFdo75110()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf147220)
{
- SwDoc* pDoc = createDoc("fdo75110.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+
+ pWrtShell->Insert(u"él"_ustr);
+
+ // hide and enable
+ dispatchCommand(mxComponent, u".uno:ShowTrackedChanges"_ustr, {});
+ dispatchCommand(mxComponent, u".uno:TrackChanges"_ustr, {});
+ CPPUNIT_ASSERT(pDoc->getIDocumentRedlineAccess().IsRedlineOn());
+ CPPUNIT_ASSERT(
+ IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines());
+
+ pWrtShell->GoStartSentence();
+ pWrtShell->SetMark();
+ pWrtShell->GoEndSentence();
+
+ // this did not remove the original text from the layout
+ pWrtShell->Replace(u"Él"_ustr, false);
+
+ // currently the deleted text is before the replacement text, not sure if
+ // that is really required
+ CPPUNIT_ASSERT_EQUAL(u"élÉl"_ustr,
+ pWrtShell->GetCursor()->GetPoint()->GetNode().GetTextNode()->GetText());
+ CPPUNIT_ASSERT_EQUAL(u"Él"_ustr,
+ static_cast<SwTextFrame const*>(pWrtShell->GetCursor()->GetPoint()->GetNode().GetTextNode()->getLayoutFrame(nullptr))->GetText());
+
+ SwRedlineTable const& rRedlines(pDoc->getIDocumentRedlineAccess().GetRedlineTable());
+ CPPUNIT_ASSERT_EQUAL(SwRedlineTable::size_type(2), rRedlines.size());
+ CPPUNIT_ASSERT_EQUAL(RedlineType::Delete, rRedlines[0]->GetType());
+ CPPUNIT_ASSERT_EQUAL(u"él"_ustr, rRedlines[0]->GetText());
+ CPPUNIT_ASSERT_EQUAL(RedlineType::Insert, rRedlines[1]->GetType());
+ CPPUNIT_ASSERT_EQUAL(u"Él"_ustr, rRedlines[1]->GetText());
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf135978)
+{
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+
+ pWrtShell->Insert(u"foobar"_ustr);
+ pWrtShell->SplitNode();
+ pWrtShell->Insert(u"bazquux"_ustr);
+
+ CPPUNIT_ASSERT(pWrtShell->IsEndOfDoc());
+
+ SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR);
+ anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint());
+ SfxItemSet flySet(pDoc->GetAttrPool(), svl::Items<RES_ANCHOR, RES_ANCHOR>);
+ flySet.Put(anchor);
+ SwFlyFrameFormat const* pFly = dynamic_cast<SwFlyFrameFormat const*>(
+ pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true));
+ CPPUNIT_ASSERT(pFly != nullptr);
+ CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+ // move cursor back to body
+ pWrtShell->SttEndDoc(/*bStt=*/false);
+
+ // hide and enable
+ dispatchCommand(mxComponent, u".uno:ShowTrackedChanges"_ustr, {});
+ dispatchCommand(mxComponent, u".uno:TrackChanges"_ustr, {});
+
+ CPPUNIT_ASSERT(pDoc->getIDocumentRedlineAccess().IsRedlineOn());
+ CPPUNIT_ASSERT(
+ IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
+ CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines());
+
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 6, /*bBasicCall=*/false);
+ pWrtShell->Delete();
+
+ // now split
+ pWrtShell->SttEndDoc(/*bStt=*/true);
+ pWrtShell->SplitNode();
+ CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+
+ // the problem was that undo removed the fly frame from the layout
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo75110)
+{
+ createSwDoc("fdo75110.odt");
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->SelAll();
// The problem was that SwEditShell::DeleteSel() what this Delete() invokes took the wrong selection...
@@ -943,62 +766,65 @@ void SwUiWriterTest::testFdo75110()
rUndoManager.Undo();
}
-void SwUiWriterTest::testFdo75898()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo75898)
{
- SwDoc* pDoc = createDoc("fdo75898.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("fdo75898.odt");
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->SelAll();
pWrtShell->InsertRow(1, true);
pWrtShell->InsertRow(1, true);
// Now check if the table has 3 lines.
SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false);
- SwTableNode* pTableNode = pShellCursor->Start()->nNode.GetNode().FindTableNode();
+ SwTableNode* pTableNode = pShellCursor->Start()->GetNode().FindTableNode();
// This was 1, when doing the same using the UI, Writer even crashed.
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pTableNode->GetTable().GetTabLines().size());
}
-void SwUiWriterTest::testReplaceBackward()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testReplaceBackward)
{
- SwDoc* pDoc = createDoc();
+ //Regression test of fdo#70143
+ //EDITING: undo search&replace corrupt text when searching backward
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwPaM aPaM(aIdx);
- pDoc->getIDocumentContentOperations().InsertString(aPaM, "toto titi tutu");
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
+ pDoc->getIDocumentContentOperations().InsertString(aPaM, u"toto titi tutu"_ustr);
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
lcl_selectCharacters(aPaM, 9, 5);
- pDoc->getIDocumentContentOperations().ReplaceRange(aPaM, "toto", false);
+ pDoc->getIDocumentContentOperations().ReplaceRange(aPaM, u"toto"_ustr, false);
- CPPUNIT_ASSERT_EQUAL(OUString(EXPECTED_REPLACE_CONTENT), pTextNode->GetText());
+ CPPUNIT_ASSERT_EQUAL(EXPECTED_REPLACE_CONTENT, pTextNode->GetText());
rUndoManager.Undo();
- CPPUNIT_ASSERT_EQUAL(OUString(ORIGINAL_REPLACE_CONTENT), pTextNode->GetText());
+ CPPUNIT_ASSERT_EQUAL(ORIGINAL_REPLACE_CONTENT, pTextNode->GetText());
}
-void SwUiWriterTest::testFdo69893()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo69893)
{
- SwDoc* pDoc = createDoc("fdo69893.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("fdo69893.odt");
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->SelAll(); // A1 is empty -> selects the whole table.
pWrtShell->SelAll(); // Selects the whole document.
SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false);
- SwTextNode& rEnd = dynamic_cast<SwTextNode&>(pShellCursor->End()->nNode.GetNode());
+ SwTextNode& rEnd = dynamic_cast<SwTextNode&>(pShellCursor->End()->GetNode());
// Selection did not include the para after table, this was "B1".
- CPPUNIT_ASSERT_EQUAL(OUString("Para after table."), rEnd.GetText());
+ CPPUNIT_ASSERT_EQUAL(u"Para after table."_ustr, rEnd.GetText());
}
-void SwUiWriterTest::testFdo70807()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo70807)
{
- load(DATA_DIRECTORY, "fdo70807.odt");
+ createSwDoc("fdo70807.odt");
- uno::Reference<container::XIndexAccess> xStylesIter(getStyles("PageStyles"), uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xStylesIter(getStyles(u"PageStyles"_ustr), uno::UNO_QUERY);
for (sal_Int32 i = 0; i < xStylesIter->getCount(); ++i)
{
@@ -1022,35 +848,36 @@ void SwUiWriterTest::testFdo70807()
}
}
-void SwUiWriterTest::testImportRTF()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testImportRTF)
{
// Insert "foobar" and position the cursor between "foo" and "bar".
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("foobar");
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 3, /*bBasicCall=*/false);
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert(u"foobar"_ustr);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 3, /*bBasicCall=*/false);
// Insert the RTF at the cursor position.
- OString aData = "{\\rtf1 Hello world!\\par}";
+ OString aData = "{\\rtf1 Hello world!\\par}"_ostr;
SvMemoryStream aStream(const_cast<char*>(aData.getStr()), aData.getLength(), StreamMode::READ);
SwReader aReader(aStream, OUString(), OUString(), *pWrtShell->GetCursor());
Reader* pRTFReader = SwReaderWriter::GetRtfReader();
CPPUNIT_ASSERT(pRTFReader != nullptr);
- CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, aReader.Read(*pRTFReader));
+ CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, aReader.Read(*pRTFReader).GetCode());
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(OUString("fooHello world!"), pDoc->GetNodes()[nIndex - 1]->GetTextNode()->GetText());
- CPPUNIT_ASSERT_EQUAL(OUString("bar"), pDoc->GetNodes()[nIndex]->GetTextNode()->GetText());
+ SwNodeOffset nIndex = pWrtShell->GetCursor()->GetPointNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(u"fooHello world!"_ustr, pDoc->GetNodes()[nIndex - 1]->GetTextNode()->GetText());
+ CPPUNIT_ASSERT_EQUAL(u"bar"_ustr, pDoc->GetNodes()[nIndex]->GetTextNode()->GetText());
}
-void SwUiWriterTest::testExportRTF()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testExportRTF)
{
// Insert "aaabbbccc" and select "bbb".
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("aaabbbccc");
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 3, /*bBasicCall=*/false);
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 3, /*bBasicCall=*/false);
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert(u"aaabbbccc"_ustr);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 3, /*bBasicCall=*/false);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 3, /*bBasicCall=*/false);
// Create the clipboard document.
rtl::Reference<SwDoc> xClpDoc(new SwDoc());
@@ -1059,7 +886,7 @@ void SwUiWriterTest::testExportRTF()
// And finally export it as RTF.
WriterRef xWrt;
- SwReaderWriter::GetWriter("RTF", OUString(), xWrt);
+ SwReaderWriter::GetWriter(u"RTF", OUString(), xWrt);
SvMemoryStream aStream;
SwWriter aWrt(aStream, *xClpDoc);
aWrt.Write(xWrt);
@@ -1083,14 +910,14 @@ void SwUiWriterTest::testExportRTF()
CPPUNIT_ASSERT(aData.endsWith("bbb}" SAL_NEWLINE_STRING "}"));
}
-void SwUiWriterTest::testDOCXAutoTextEmpty()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDOCXAutoTextEmpty)
{
// file contains normal content but no AutoText
std::unique_ptr<SwTextBlocks> pGlossary = readDOCXAutotext(u"autotext-empty.dotx", true);
CPPUNIT_ASSERT(pGlossary != nullptr);
}
-void SwUiWriterTest::testDOCXAutoTextMultiple()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDOCXAutoTextMultiple)
{
// file contains three AutoText entries
std::unique_ptr<SwTextBlocks> pGlossary = readDOCXAutotext(u"autotext-multiple.dotx");
@@ -1099,9 +926,9 @@ void SwUiWriterTest::testDOCXAutoTextMultiple()
CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pGlossary->GetCount());
// check names of entries, sorted order
- CPPUNIT_ASSERT_EQUAL(OUString("Anothercomplex"), pGlossary->GetLongName(0));
- CPPUNIT_ASSERT_EQUAL(OUString("Multiple"), pGlossary->GetLongName(1));
- CPPUNIT_ASSERT_EQUAL(OUString("Second Autotext"), pGlossary->GetLongName(2));
+ CPPUNIT_ASSERT_EQUAL(u"Anothercomplex"_ustr, pGlossary->GetLongName(0));
+ CPPUNIT_ASSERT_EQUAL(u"Multiple"_ustr, pGlossary->GetLongName(1));
+ CPPUNIT_ASSERT_EQUAL(u"Second Autotext"_ustr, pGlossary->GetLongName(2));
// check if previously loaded content is correct (eg. doesn't contain title)
SwDoc* pDoc = pGlossary->GetDoc();
@@ -1116,7 +943,7 @@ void SwUiWriterTest::testDOCXAutoTextMultiple()
SwNode& rNode = aStart.GetNode();
CPPUNIT_ASSERT(rNode.IsTextNode());
SwTextNode& rTextNode = *rNode.GetTextNode();
- CPPUNIT_ASSERT_EQUAL(OUString("Another "), rTextNode.GetText());
+ CPPUNIT_ASSERT_EQUAL(u"Another "_ustr, rTextNode.GetText());
// Make sure that autotext does not set a custom page style, leading to an unexpected page break
// on insertion.
@@ -1127,10 +954,10 @@ void SwUiWriterTest::testDOCXAutoTextMultiple()
// last line
SwNodeIndex aLast(*aDocEnd.GetNode().EndOfSectionNode(), -1);
SwNode& rLastNode = aLast.GetNode();
- CPPUNIT_ASSERT_EQUAL(OUString("complex"), rLastNode.GetTextNode()->GetText());
+ CPPUNIT_ASSERT_EQUAL(u"complex"_ustr, rLastNode.GetTextNode()->GetText());
}
-void SwUiWriterTest::testDOTMAutoText()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDOTMAutoText)
{
// this is dotm file difference is that in the dotm
// there are no empty paragraphs at the end of each entry
@@ -1143,10 +970,10 @@ void SwUiWriterTest::testDOTMAutoText()
SwNodeIndex aDocEnd(pDoc->GetNodes().GetEndOfContent());
SwNodeIndex aStart(*aDocEnd.GetNode().StartOfSectionNode(), 1);
SwNode& rNode = aStart.GetNode();
- CPPUNIT_ASSERT_EQUAL(OUString("paragraph"), rNode.GetTextNode()->GetText());
+ CPPUNIT_ASSERT_EQUAL(u"paragraph"_ustr, rNode.GetTextNode()->GetText());
}
-void SwUiWriterTest::testDOCXAutoTextGallery()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDOCXAutoTextGallery)
{
// this file contains one AutoText entry and other
// entries which are not AutoText (have different "gallery" value)
@@ -1159,139 +986,29 @@ void SwUiWriterTest::testDOCXAutoTextGallery()
CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pGlossary->GetCount());
// check entry name (if not contains gallery type)
- CPPUNIT_ASSERT_EQUAL(OUString("Multiple"), pGlossary->GetLongName(0));
+ CPPUNIT_ASSERT_EQUAL(u"Multiple"_ustr, pGlossary->GetLongName(0));
}
-void SwUiWriterTest::testWatermarkDOCX()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testWatermarkDOCX)
{
- SwDoc* const pDoc = createDoc("watermark.docx");
- SwDocShell* pDocShell = pDoc->GetDocShell();
- const SfxPoolItem* pItem;
- SfxItemState eState = pDocShell->GetViewShell()->GetViewFrame()->GetDispatcher()->QueryState(SID_WATERMARK, pItem);
+ createSwDoc("watermark.docx");
+ SwDocShell* pDocShell = getSwDocShell();
+ SfxPoolItemHolder aResult;
+ SfxItemState eState = pDocShell->GetViewShell()->GetViewFrame().GetDispatcher()->QueryState(SID_WATERMARK, aResult);
+ const SfxWatermarkItem* pWatermark(static_cast<const SfxWatermarkItem*>(aResult.getItem()));
CPPUNIT_ASSERT(eState >= SfxItemState::DEFAULT);
- CPPUNIT_ASSERT(pItem);
- CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(SID_WATERMARK), pItem->Which());
+ CPPUNIT_ASSERT(pWatermark);
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(SID_WATERMARK), pWatermark->Which());
- const SfxWatermarkItem* pWatermark = static_cast<const SfxWatermarkItem*>(pItem);
- CPPUNIT_ASSERT_EQUAL(OUString("CustomWatermark"), pWatermark->GetText());
- CPPUNIT_ASSERT_EQUAL(OUString("DejaVu Sans Light"), pWatermark->GetFont());
+ CPPUNIT_ASSERT_EQUAL(u"CustomWatermark"_ustr, pWatermark->GetText());
+ CPPUNIT_ASSERT_EQUAL(u"DejaVu Sans Light"_ustr, pWatermark->GetFont());
CPPUNIT_ASSERT_EQUAL(sal_Int16(45), pWatermark->GetAngle());
CPPUNIT_ASSERT_EQUAL(Color(0x548dd4), pWatermark->GetColor());
CPPUNIT_ASSERT_EQUAL(sal_Int16(50), pWatermark->GetTransparency());
}
-CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf134252)
-{
- load(DATA_DIRECTORY, "tdf134252.fodt");
-
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xCursor(xTextViewCursorSupplier->getViewCursor());
- uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
- uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
-
- // select all with section
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("bar" SAL_NEWLINE_STRING "baz" SAL_NEWLINE_STRING), xCursor->getString());
-
- dispatchCommand(mxComponent, ".uno:Delete", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), xCursor->getString());
-
- // this would crash
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("bar" SAL_NEWLINE_STRING "baz" SAL_NEWLINE_STRING), xCursor->getString());
-
- dispatchCommand(mxComponent, ".uno:Redo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), xCursor->getString());
-
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("bar" SAL_NEWLINE_STRING "baz" SAL_NEWLINE_STRING), xCursor->getString());
-
- dispatchCommand(mxComponent, ".uno:Redo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), xCursor->getString());
-}
-
-CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf136453)
-{
- load(DATA_DIRECTORY, "tdf136453.fodt");
-
- SwXTextDocument *const pTextDoc(dynamic_cast<SwXTextDocument*>(mxComponent.get()));
- CPPUNIT_ASSERT(pTextDoc);
- SwDoc* const pDoc(pTextDoc->GetDocShell()->GetDoc());
- SwWrtShell *const pWrtShell(pDoc->GetDocShell()->GetWrtShell());
-
- sal_uLong const nNodes(pDoc->GetNodes().Count());
-
- pWrtShell->SttEndDoc(false);
- pWrtShell->SetMark();
- pWrtShell->Up(true, 1);
- pWrtShell->SttPara(true);
- pWrtShell->Delete();
-
- // one paragraph deleted, section is gone
- CPPUNIT_ASSERT_EQUAL(nNodes - 3, pDoc->GetNodes().Count());
-
- pWrtShell->Undo();
-
- CPPUNIT_ASSERT_EQUAL(nNodes, pDoc->GetNodes().Count());
-
- // check that every node has 1 frame
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page[1]/body/txt", 3);
- assertXPath(pXmlDoc, "/root/page[1]/body/section", 1);
- assertXPath(pXmlDoc, "/root/page[1]/body/section/txt", 1);
-
- pWrtShell->Redo();
-
- // one paragraph deleted, section is gone
- CPPUNIT_ASSERT_EQUAL(nNodes - 3, pDoc->GetNodes().Count());
-
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page[1]/body/txt", 3);
- assertXPath(pXmlDoc, "/root/page[1]/body/section", 0);
-
- pWrtShell->Undo();
-
- CPPUNIT_ASSERT_EQUAL(nNodes, pDoc->GetNodes().Count());
-
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page[1]/body/txt", 3);
- assertXPath(pXmlDoc, "/root/page[1]/body/section", 1);
- assertXPath(pXmlDoc, "/root/page[1]/body/section/txt", 1);
-}
-
-void SwUiWriterTest::testWatermarkPosition()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testWatermarkPosition)
{
// tdf#108494 Watermark inserted in the document with page break was outside the first page
const int aPagesInDocument = 2;
@@ -1303,14 +1020,14 @@ void SwUiWriterTest::testWatermarkPosition()
int aPages = aPagesInDocument + aAdditionalPagesCount[i];
// Empty document with one Page Break
- SwDoc* pDoc = createDoc("watermark-position.odt");
+ createSwDoc("watermark-position.odt");
+ SwDoc* pDoc = getSwDoc();
SwEditShell* pEditShell = pDoc->GetEditShell();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- uno::Reference<frame::XModel> xModel = pDoc->GetDocShell()->GetBaseModel();
- uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xModel, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(pEditShell);
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent,
+ uno::UNO_QUERY);
uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
- uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("PageStyles"), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xPageStyle(xStyleFamily->getByName("Default Page Style"), uno::UNO_QUERY);
// 1. Add additional page breaks
for (int j = 0; j < aAdditionalPagesCount[i]; ++j)
@@ -1337,8 +1054,8 @@ void SwUiWriterTest::testWatermarkPosition()
// 3. Insert Watermark
SfxWatermarkItem aWatermark;
- aWatermark.SetText("Watermark");
- aWatermark.SetFont("DejaVu Sans");
+ aWatermark.SetText(u"Watermark"_ustr);
+ aWatermark.SetFont(u"DejaVu Sans"_ustr);
pEditShell->SetWatermark(aWatermark);
@@ -1363,90 +1080,19 @@ void SwUiWriterTest::testWatermarkPosition()
CPPUNIT_ASSERT_MESSAGE(aMessage.str(), nPageHeight >= rRect.Bottom());
// Check if Watermark is centered
- CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::CENTER, getProperty<sal_Int16>(xShape, "HoriOrient"));
- CPPUNIT_ASSERT_EQUAL(text::VertOrientation::CENTER, getProperty<sal_Int16>(xShape, "VertOrient"));
+ CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::CENTER, getProperty<sal_Int16>(xShape, u"HoriOrient"_ustr));
+ CPPUNIT_ASSERT_EQUAL(text::VertOrientation::CENTER, getProperty<sal_Int16>(xShape, u"VertOrient"_ustr));
}
}
-CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf134250)
-{
- load(DATA_DIRECTORY, "tdf134250.fodt");
-
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(),
- uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
-
- uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
-
- uno::Reference<text::XTextContent> xTextContent(xSections->getByIndex(0), uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(OUString("foo" SAL_NEWLINE_STRING "bar"),
- xTextContent->getAnchor()->getString());
-
- // select all with table at start -> 3 times
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
-
- // .uno:Copy without touching shared clipboard
- SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell();
- rtl::Reference<SwTransferable> xTransfer = new SwTransferable(*pWrtShell);
- xTransfer->Copy();
-
- // .uno:Paste without touching shared clipboard
- TransferableDataHelper aHelper(xTransfer);
- SwTransferable::Paste(*pWrtShell, aHelper);
-
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
-
- // this would crash in 2 different ways
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
-
- // Without the fix in place, section's content would have been gone after undo
- CPPUNIT_ASSERT_EQUAL(OUString("foo" SAL_NEWLINE_STRING "bar"),
- xTextContent->getAnchor()->getString());
-
- dispatchCommand(mxComponent, ".uno:Redo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
-
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("foo" SAL_NEWLINE_STRING "bar"),
- xTextContent->getAnchor()->getString());
-
- dispatchCommand(mxComponent, ".uno:Redo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
-}
-
-void SwUiWriterTest::testFdo74981()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo74981)
{
// create a document with an input field
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwInputField aField(static_cast<SwInputFieldType*>(pWrtShell->GetFieldType(0, SwFieldIds::Input)), "foo", "bar", 0, 0);
- pWrtShell->Insert(aField);
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ SwInputField aField(static_cast<SwInputFieldType*>(pWrtShell->GetFieldType(0, SwFieldIds::Input)), u"foo"_ustr, u"bar"_ustr, 0, 0);
+ pWrtShell->InsertField2(aField);
{
// expect hints
@@ -1456,7 +1102,7 @@ void SwUiWriterTest::testFdo74981()
}
// go to the begin of the paragraph and split this node
- pWrtShell->Left(CRSR_SKIP_CHARS, false, 100, false);
+ pWrtShell->Left(SwCursorSkipMode::Chars, false, 100, false);
pWrtShell->SplitNode();
{
@@ -1470,17 +1116,18 @@ void SwUiWriterTest::testFdo74981()
}
}
-void SwUiWriterTest::testTdf98512()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf98512)
{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwInputFieldType *const pType(static_cast<SwInputFieldType*>(
pWrtShell->GetFieldType(0, SwFieldIds::Input)));
- SwInputField aField1(pType, "foo", "bar", INP_TXT, 0);
- pWrtShell->Insert(aField1);
+ SwInputField aField1(pType, u"foo"_ustr, u"bar"_ustr, INP_TXT, 0);
+ pWrtShell->InsertField2(aField1);
pWrtShell->SttEndDoc(/*bStt=*/true);
- SwInputField aField2(pType, "baz", "quux", INP_TXT, 0);
- pWrtShell->Insert(aField2);
+ SwInputField aField2(pType, u"baz"_ustr, u"quux"_ustr, INP_TXT, 0);
+ pWrtShell->InsertField2(aField2);
pWrtShell->SttEndDoc(/*bStt=*/true);
pWrtShell->SetMark();
pWrtShell->SttEndDoc(/*bStt=*/false);
@@ -1508,10 +1155,11 @@ void SwUiWriterTest::testTdf98512()
CPPUNIT_ASSERT_EQUAL(expected1, pWrtShell->getShellCursor(false)->GetText());
}
-void SwUiWriterTest::testShapeTextboxSelect()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testShapeTextboxSelect)
{
- SwDoc* pDoc = createDoc("shape-textbox.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("shape-textbox.odt");
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
SdrObject* pObject = pPage->GetObj(1);
SwContact* pTextBox = static_cast<SwContact*>(pObject->GetUserCall());
@@ -1526,10 +1174,11 @@ void SwUiWriterTest::testShapeTextboxSelect()
CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_DRAWFRMFMT), pShape->GetFormat()->Which());
}
-void SwUiWriterTest::testShapeTextboxDelete()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testShapeTextboxDelete)
{
- SwDoc* pDoc = createDoc("shape-textbox.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("shape-textbox.odt");
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
SdrObject* pObject = pPage->GetObj(0);
pWrtShell->SelectObj(Point(), 0, pObject);
@@ -1543,10 +1192,11 @@ void SwUiWriterTest::testShapeTextboxDelete()
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), nActual);
}
-void SwUiWriterTest::testAnchorChangeSelection()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testAnchorChangeSelection)
{
- SwDoc* pDoc = createDoc("test_anchor_as_character.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("test_anchor_as_character.odt");
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
SdrObject* pObject = pPage->GetObj(0);
CPPUNIT_ASSERT(pObject);
@@ -1562,26 +1212,27 @@ void SwUiWriterTest::testAnchorChangeSelection()
CPPUNIT_ASSERT_EQUAL(pObject, rMarkList.GetMark(0)->GetMarkedSdrObj());
}
-void SwUiWriterTest::testCp1000071()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testCp1000071)
{
- SwDoc* pDoc = createDoc("cp1000071.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("cp1000071.odt");
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
CPPUNIT_ASSERT_EQUAL( SwRedlineTable::size_type( 2 ), rTable.size());
- sal_uLong redlineStart0NodeIndex = rTable[ 0 ]->Start()->nNode.GetIndex();
- sal_Int32 redlineStart0Index = rTable[ 0 ]->Start()->nContent.GetIndex();
- sal_uLong redlineEnd0NodeIndex = rTable[ 0 ]->End()->nNode.GetIndex();
- sal_Int32 redlineEnd0Index = rTable[ 0 ]->End()->nContent.GetIndex();
- sal_uLong redlineStart1NodeIndex = rTable[ 1 ]->Start()->nNode.GetIndex();
- sal_Int32 redlineStart1Index = rTable[ 1 ]->Start()->nContent.GetIndex();
- sal_uLong redlineEnd1NodeIndex = rTable[ 1 ]->End()->nNode.GetIndex();
- sal_Int32 redlineEnd1Index = rTable[ 1 ]->End()->nContent.GetIndex();
+ SwNodeOffset redlineStart0NodeIndex = rTable[ 0 ]->Start()->GetNodeIndex();
+ sal_Int32 redlineStart0Index = rTable[ 0 ]->Start()->GetContentIndex();
+ SwNodeOffset redlineEnd0NodeIndex = rTable[ 0 ]->End()->GetNodeIndex();
+ sal_Int32 redlineEnd0Index = rTable[ 0 ]->End()->GetContentIndex();
+ SwNodeOffset redlineStart1NodeIndex = rTable[ 1 ]->Start()->GetNodeIndex();
+ sal_Int32 redlineStart1Index = rTable[ 1 ]->Start()->GetContentIndex();
+ SwNodeOffset redlineEnd1NodeIndex = rTable[ 1 ]->End()->GetNodeIndex();
+ sal_Int32 redlineEnd1Index = rTable[ 1 ]->End()->GetContentIndex();
// Change the document layout to be 2 columns, and then undo.
pWrtShell->SelAll();
- SwSectionData section(SectionType::Content, pWrtShell->GetUniqueSectionName());
- SfxItemSet set( pDoc->GetDocShell()->GetPool(), svl::Items<RES_COL, RES_COL>{} );
+ SwSectionData section(SectionType::Content, UIName(pWrtShell->GetUniqueSectionName()));
+ SfxItemSet set( getSwDocShell()->GetPool(), svl::Items<RES_COL, RES_COL> );
SwFormatCol col;
col.Init( 2, 0, 10000 );
set.Put( col );
@@ -1591,19 +1242,20 @@ void SwUiWriterTest::testCp1000071()
// Check that redlines are the same like at the beginning.
CPPUNIT_ASSERT_EQUAL( SwRedlineTable::size_type( 2 ), rTable.size());
- CPPUNIT_ASSERT_EQUAL( redlineStart0NodeIndex, rTable[ 0 ]->Start()->nNode.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineStart0Index, rTable[ 0 ]->Start()->nContent.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineEnd0NodeIndex, rTable[ 0 ]->End()->nNode.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineEnd0Index, rTable[ 0 ]->End()->nContent.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineStart1NodeIndex, rTable[ 1 ]->Start()->nNode.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineStart1Index, rTable[ 1 ]->Start()->nContent.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineEnd1NodeIndex, rTable[ 1 ]->End()->nNode.GetIndex());
- CPPUNIT_ASSERT_EQUAL( redlineEnd1Index, rTable[ 1 ]->End()->nContent.GetIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineStart0NodeIndex, rTable[ 0 ]->Start()->GetNodeIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineStart0Index, rTable[ 0 ]->Start()->GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineEnd0NodeIndex, rTable[ 0 ]->End()->GetNodeIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineEnd0Index, rTable[ 0 ]->End()->GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineStart1NodeIndex, rTable[ 1 ]->Start()->GetNodeIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineStart1Index, rTable[ 1 ]->Start()->GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineEnd1NodeIndex, rTable[ 1 ]->End()->GetNodeIndex());
+ CPPUNIT_ASSERT_EQUAL( redlineEnd1Index, rTable[ 1 ]->End()->GetContentIndex());
}
-void SwUiWriterTest::testShapeTextboxVertadjust()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testShapeTextboxVertadjust)
{
- SwDoc* pDoc = createDoc("shape-textbox-vertadjust.odt");
+ createSwDoc("shape-textbox-vertadjust.odt");
+ SwDoc* pDoc = getSwDoc();
SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
SdrObject* pObject = pPage->GetObj(1);
SwFrameFormat* pFormat = static_cast<SwContact*>(pObject->GetUserCall())->GetFormat();
@@ -1611,33 +1263,35 @@ void SwUiWriterTest::testShapeTextboxVertadjust()
CPPUNIT_ASSERT_EQUAL(SDRTEXTVERTADJUST_CENTER, pFormat->GetTextVertAdjust().GetValue());
}
-void SwUiWriterTest::testShapeTextboxAutosize()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testShapeTextboxAutosize)
{
- SwDoc* pDoc = createDoc("shape-textbox-autosize.odt");
+ createSwDoc("shape-textbox-autosize.odt");
+ SwDoc* pDoc = getSwDoc();
SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
// 0-1 is the first UI-visible shape+textbox.
SdrObject* pFirst = pPage->GetObj(0);
- CPPUNIT_ASSERT_EQUAL(OUString("1st"), pFirst->GetName());
+ CPPUNIT_ASSERT_EQUAL(u"1st"_ustr, pFirst->GetName());
// 2-3 is the second UI-visible shape+textbox.
SdrObject* pSecond = pPage->GetObj(2);
- CPPUNIT_ASSERT_EQUAL(OUString("2nd"), pSecond->GetName());
+ CPPUNIT_ASSERT_EQUAL(u"2nd"_ustr, pSecond->GetName());
// Shape -> textbox synchronization was missing, the second shape had the
// same height as the first, even though the first contained 1 paragraph
// and the other 2 ones.
- CPPUNIT_ASSERT(pFirst->GetSnapRect().getHeight() < pSecond->GetSnapRect().getHeight());
+ CPPUNIT_ASSERT(pFirst->GetSnapRect().getOpenHeight() < pSecond->GetSnapRect().getOpenHeight());
}
-void SwUiWriterTest::testFdo82191()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo82191)
{
- SwDoc* pDoc = createDoc("fdo82191.odt");
+ createSwDoc("fdo82191.odt");
+ SwDoc* pDoc = getSwDoc();
SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
// Make sure we have a single draw shape.
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), SwTextBoxHelper::getCount(pPage));
SwDoc aClipboard;
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SdrObject* pObject = pPage->GetObj(0);
// Select it, then copy and paste.
pWrtShell->SelectObj(Point(), 0, pObject);
@@ -1648,32 +1302,33 @@ void SwUiWriterTest::testFdo82191()
CPPUNIT_ASSERT_EQUAL(sal_Int32(2), SwTextBoxHelper::getCount(*pDoc));
}
-void SwUiWriterTest::testCommentedWord()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testCommentedWord)
{
// This word is commented. <- string in document
// 123456789 <- character positions
- SwDoc* pDoc = createDoc("commented-word.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc("commented-word.odt");
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
// Move the cursor into the second word.
- pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/false, 5, /*bBasicCall=*/false);
+ pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 5, /*bBasicCall=*/false);
// Select the word.
pWrtShell->SelWrd();
// Make sure that not only the word, but its comment anchor is also selected.
SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false);
// This was 9, only "word", not "word<anchor character>" was selected.
- CPPUNIT_ASSERT_EQUAL(sal_Int32(10), pShellCursor->End()->nContent.GetIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(10), pShellCursor->End()->GetContentIndex());
// Test that getAnchor() points to "word", not to an empty string.
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
uno::Reference<text::XTextContent> xField(xFields->nextElement(), uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(OUString("word"), xField->getAnchor()->getString());
+ CPPUNIT_ASSERT_EQUAL(u"word"_ustr, xField->getAnchor()->getString());
}
-void SwUiWriterTest::testTextFieldGetAnchorGetTextInFooter() {
- createDoc("textfield-getanchor-gettext-in-footer.odt");
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTextFieldGetAnchorGetTextInFooter)
+{
+ createSwDoc("textfield-getanchor-gettext-in-footer.odt");
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
@@ -1681,118 +1336,116 @@ void SwUiWriterTest::testTextFieldGetAnchorGetTextInFooter() {
uno::Reference<text::XTextContent> xField(xFields->nextElement(), uno::UNO_QUERY);
OUString value = xField->getAnchor()->getText()->getString();
- CPPUNIT_ASSERT_EQUAL(OUString("userfield_in_footer"), value );
+ CPPUNIT_ASSERT_EQUAL(u"userfield_in_footer"_ustr, value );
}
-// Chinese conversion tests
-
-const sal_Unicode CHINESE_TRADITIONAL_CONTENT(0x9F8D);
-const sal_Unicode CHINESE_SIMPLIFIED_CONTENT(0x9F99);
-constexpr OUStringLiteral NON_CHINESE_CONTENT(u"Hippopotamus");
-
// Tests that a blank document is still blank after conversion
-void SwUiWriterTest::testChineseConversionBlank()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testChineseConversionBlank)
{
// Given
- SwDoc* pDoc = createDoc();
- SwView* pView = pDoc->GetDocShell()->GetView();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwView* pView = getSwDocShell()->GetView();
const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwPaM aPaM(aIdx);
// When
- SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, nullptr,
+ SwHHCWrapper aWrap( *pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, nullptr,
i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false,
true, false, false );
aWrap.Convert();
// Then
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
CPPUNIT_ASSERT_EQUAL(OUString(), pTextNode->GetText());
}
// Tests that non Chinese text is unchanged after conversion
-void SwUiWriterTest::testChineseConversionNonChineseText()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testChineseConversionNonChineseText)
{
// Given
- SwDoc* pDoc = createDoc();
- SwView* pView = pDoc->GetDocShell()->GetView();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwView* pView = getSwDocShell()->GetView();
const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwPaM aPaM(aIdx);
pDoc->getIDocumentContentOperations().InsertString(aPaM, NON_CHINESE_CONTENT);
// When
- SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, nullptr,
+ SwHHCWrapper aWrap( *pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, nullptr,
i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false,
true, false, false );
aWrap.Convert();
// Then
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
- CPPUNIT_ASSERT_EQUAL(OUString(NON_CHINESE_CONTENT), pTextNode->GetText());
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
+ CPPUNIT_ASSERT_EQUAL(NON_CHINESE_CONTENT, pTextNode->GetText());
}
// Tests conversion of traditional Chinese characters to simplified Chinese
-void SwUiWriterTest::testChineseConversionTraditionalToSimplified()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testChineseConversionTraditionalToSimplified)
{
// Given
- SwDoc* pDoc = createDoc();
- SwView* pView = pDoc->GetDocShell()->GetView();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwView* pView = getSwDocShell()->GetView();
const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwPaM aPaM(aIdx);
pDoc->getIDocumentContentOperations().InsertString(aPaM, OUString(CHINESE_TRADITIONAL_CONTENT));
// When
- SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, nullptr,
+ SwHHCWrapper aWrap( *pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, nullptr,
i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false,
true, false, false );
aWrap.Convert();
// Then
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
CPPUNIT_ASSERT_EQUAL(OUString(CHINESE_SIMPLIFIED_CONTENT), pTextNode->GetText());
}
// Tests conversion of simplified Chinese characters to traditional Chinese
-void SwUiWriterTest::testChineseConversionSimplifiedToTraditional()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testChineseConversionSimplifiedToTraditional)
{
// Given
- SwDoc* pDoc = createDoc();
- SwView* pView = pDoc->GetDocShell()->GetView();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwView* pView = getSwDocShell()->GetView();
const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwPaM aPaM(aIdx);
pDoc->getIDocumentContentOperations().InsertString(aPaM, OUString(CHINESE_SIMPLIFIED_CONTENT));
// When
- SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_SIMPLIFIED, LANGUAGE_CHINESE_TRADITIONAL, nullptr,
+ SwHHCWrapper aWrap( *pView, xContext, LANGUAGE_CHINESE_SIMPLIFIED, LANGUAGE_CHINESE_TRADITIONAL, nullptr,
i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false,
true, false, false );
aWrap.Convert();
// Then
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
CPPUNIT_ASSERT_EQUAL(OUString(CHINESE_TRADITIONAL_CONTENT), pTextNode->GetText());
}
-void SwUiWriterTest::testFdo85554()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo85554)
{
// Load the document, it contains one shape with a textbox.
- load(u"/sw/qa/extras/uiwriter/data/", "fdo85554.odt");
+ createSwDoc("fdo85554.odt");
// Add a second shape to the document.
uno::Reference<css::lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY);
- uno::Reference<drawing::XShape> xShape(xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape(xFactory->createInstance(u"com.sun.star.drawing.RectangleShape"_ustr), uno::UNO_QUERY);
xShape->setSize(awt::Size(10000, 10000));
xShape->setPosition(awt::Point(1000, 1000));
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
@@ -1800,134 +1453,27 @@ void SwUiWriterTest::testFdo85554()
xDrawPage->add(xShape);
// Save it and load it back.
- reload("writer8", "fdo85554.odt");
+ saveAndReload(u"writer8"_ustr);
// This was 1, we lost a shape on export.
CPPUNIT_ASSERT_EQUAL(2, getShapes());
}
-void SwUiWriterTest::testAutoCorr()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- const sal_Unicode cIns = ' ';
-
- //Normal AutoCorrect
- pWrtShell->Insert("tset");
- pWrtShell->AutoCorrect(corr, cIns);
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(OUString("Test "), static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- //AutoCorrect with change style to bolt
- pWrtShell->Insert("Bolt");
- pWrtShell->AutoCorrect(corr, cIns);
- const uno::Reference< text::XTextRange > xRun = getRun(getParagraph(1), 2);
- CPPUNIT_ASSERT_EQUAL(OUString("Bolt"), xRun->getString());
- CPPUNIT_ASSERT_EQUAL(OUString("Arial"), getProperty<OUString>(xRun, "CharFontName"));
-
- //AutoCorrect inserts Table with 2 rows and 3 columns
- pWrtShell->Insert("4xx");
- pWrtShell->AutoCorrect(corr, cIns);
- const uno::Reference< text::XTextTable > xTable(getParagraphOrTable(2), uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getColumns()->getCount());
-}
-
-void SwUiWriterTest::testTdf83260()
-{
- SwDoc* const pDoc(createDoc("tdf83260-1.odt"));
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
-
- // enabled but not shown
- CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines());
-#if 0
- CPPUNIT_ASSERT(IDocumentRedlineAccess::IsHideChanges(
- pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
-#endif
- CPPUNIT_ASSERT(IDocumentRedlineAccess::IsRedlineOn(
- pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
- CPPUNIT_ASSERT(!pDoc->getIDocumentRedlineAccess().GetRedlineTable().empty());
-
- // the document contains redlines that are combined with CompressRedlines()
- // if that happens during AutoCorrect then indexes in Undo are off -> crash
- pWrtShell->Insert("tset");
- pWrtShell->AutoCorrect(corr, u' ');
- sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
- auto const nActions(rUndoManager.GetUndoActionCount());
- for (auto i = nActions; 0 < i; --i)
- {
- rUndoManager.Undo();
- }
- // check that every text node has a layout frame
- for (sal_uLong i = 0; i < pDoc->GetNodes().Count(); ++i)
- {
- if (SwTextNode const*const pNode = pDoc->GetNodes()[i]->GetTextNode())
- {
- CPPUNIT_ASSERT(pNode->getLayoutFrame(nullptr, nullptr, nullptr));
- }
- }
- for (auto i = nActions; 0 < i; --i)
- {
- rUndoManager.Redo();
- }
- for (sal_uLong i = 0; i < pDoc->GetNodes().Count(); ++i)
- {
- if (SwTextNode const*const pNode = pDoc->GetNodes()[i]->GetTextNode())
- {
- CPPUNIT_ASSERT(pNode->getLayoutFrame(nullptr, nullptr, nullptr));
- }
- }
- for (auto i = nActions; 0 < i; --i)
- {
- rUndoManager.Undo();
- }
- for (sal_uLong i = 0; i < pDoc->GetNodes().Count(); ++i)
- {
- if (SwTextNode const*const pNode = pDoc->GetNodes()[i]->GetTextNode())
- {
- CPPUNIT_ASSERT(pNode->getLayoutFrame(nullptr, nullptr, nullptr));
- }
- }
-}
-
-void SwUiWriterTest::testTdf130274()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testMergeDoc)
{
- SwDoc *const pDoc(createDoc());
- SwWrtShell *const pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
-
- CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines());
- CPPUNIT_ASSERT(!IDocumentRedlineAccess::IsRedlineOn(
- pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
-
- // "tset" may be replaced by the AutoCorrect in the test profile
- pWrtShell->Insert("tset");
- // select from left to right
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 4, /*bBasicCall=*/false);
- pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 4, /*bBasicCall=*/false);
+ createSwDoc("merge-change1.odt");
+ SwDoc* pDoc = getSwDoc();
- pWrtShell->SetRedlineFlags(pWrtShell->GetRedlineFlags() | RedlineFlags::On);
- // this would crash in AutoCorrect
- pWrtShell->AutoCorrect(corr, '.');
-
- CPPUNIT_ASSERT(!pDoc->getIDocumentRedlineAccess().GetRedlineTable().empty());
-}
-
-void SwUiWriterTest::testMergeDoc()
-{
- SwDoc* const pDoc1(createDoc("merge-change1.odt"));
-
- auto xDoc2Component(loadFromDesktop(
- m_directories.getURLFromSrc(DATA_DIRECTORY) + "merge-change2.odt",
- "com.sun.star.text.TextDocument"));
+ mxComponent2 = loadFromDesktop(
+ createFileURL(u"merge-change2.odt"),
+ u"com.sun.star.text.TextDocument"_ustr);
auto pxDoc2Document(
- dynamic_cast<SwXTextDocument *>(xDoc2Component.get()));
+ dynamic_cast<SwXTextDocument *>(mxComponent2.get()));
CPPUNIT_ASSERT(pxDoc2Document);
SwDoc* const pDoc2(pxDoc2Document->GetDocShell()->GetDoc());
- SwEditShell* const pEditShell(pDoc1->GetEditShell());
+ SwEditShell* const pEditShell(pDoc->GetEditShell());
+ CPPUNIT_ASSERT(pEditShell);
pEditShell->MergeDoc(*pDoc2);
// accept all redlines
@@ -1935,22 +1481,20 @@ void SwUiWriterTest::testMergeDoc()
pEditShell->AcceptRedline(0);
CPPUNIT_ASSERT_EQUAL(7, getParagraphs());
- getParagraph(1, "Para One: Two Three Four Five");
- getParagraph(2, "Para Two: One Three Four Five");
- getParagraph(3, "Para Three: One Two Four Five");
- getParagraph(4, "Para Four: One Two Three Four Five");
- getParagraph(5, "Para Six: One Three Four Five");
- getParagraph(6, "");
- getParagraph(7, "");
-
- xDoc2Component->dispose();
+ getParagraph(1, u"Para One: Two Three Four Five"_ustr);
+ getParagraph(2, u"Para Two: One Three Four Five"_ustr);
+ getParagraph(3, u"Para Three: One Two Four Five"_ustr);
+ getParagraph(4, u"Para Four: One Two Three Four Five"_ustr);
+ getParagraph(5, u"Para Six: One Three Four Five"_ustr);
+ getParagraph(6, u""_ustr);
+ getParagraph(7, u""_ustr);
}
-void SwUiWriterTest::testCreatePortions()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testCreatePortions)
{
- createDoc("uno-cycle.odt");
+ createSwDoc("uno-cycle.odt");
uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextContent> xText(xBookmarksSupplier->getBookmarks()->getByName("Mark"), uno::UNO_QUERY);
+ uno::Reference<text::XTextContent> xText(xBookmarksSupplier->getBookmarks()->getByName(u"Mark"_ustr), uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xTextCursor(xText->getAnchor(), uno::UNO_QUERY);
CPPUNIT_ASSERT(xTextCursor.is());
@@ -1961,14 +1505,15 @@ void SwUiWriterTest::testCreatePortions()
xParagraph->createEnumeration();
}
-void SwUiWriterTest::testBookmarkUndo()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testBookmarkUndo)
{
- SwDoc* pDoc = createDoc();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
SwPaM aPaM( SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1) );
- pMarkAccess->makeMark(aPaM, "Mark", IDocumentMarkAccess::MarkType::BOOKMARK,
+ pMarkAccess->makeMark(aPaM, SwMarkName(u"Mark"_ustr), IDocumentMarkAccess::MarkType::BOOKMARK,
::sw::mark::InsertMode::New);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
rUndoManager.Undo();
@@ -1976,20 +1521,20 @@ void SwUiWriterTest::testBookmarkUndo()
rUndoManager.Redo();
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
- IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findMark("Mark");
+ auto ppBkmk = pMarkAccess->findMark(SwMarkName(u"Mark"_ustr));
CPPUNIT_ASSERT(ppBkmk != pMarkAccess->getAllMarksEnd());
- pMarkAccess->renameMark(*ppBkmk, "Mark_");
- CPPUNIT_ASSERT(bool(pMarkAccess->findMark("Mark") == pMarkAccess->getAllMarksEnd()));
- CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") != pMarkAccess->getAllMarksEnd());
+ pMarkAccess->renameMark(*ppBkmk, SwMarkName(u"Mark_"_ustr));
+ CPPUNIT_ASSERT(bool(pMarkAccess->findMark(SwMarkName(u"Mark"_ustr)) == pMarkAccess->getAllMarksEnd()));
+ CPPUNIT_ASSERT(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)) != pMarkAccess->getAllMarksEnd());
rUndoManager.Undo();
- CPPUNIT_ASSERT(pMarkAccess->findMark("Mark") != pMarkAccess->getAllMarksEnd());
- CPPUNIT_ASSERT(bool(pMarkAccess->findMark("Mark_") == pMarkAccess->getAllMarksEnd()));
+ CPPUNIT_ASSERT(pMarkAccess->findMark(SwMarkName(u"Mark"_ustr)) != pMarkAccess->getAllMarksEnd());
+ CPPUNIT_ASSERT(bool(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)) == pMarkAccess->getAllMarksEnd()));
rUndoManager.Redo();
- CPPUNIT_ASSERT(bool(pMarkAccess->findMark("Mark") == pMarkAccess->getAllMarksEnd()));
- CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") != pMarkAccess->getAllMarksEnd());
+ CPPUNIT_ASSERT(bool(pMarkAccess->findMark(SwMarkName(u"Mark"_ustr)) == pMarkAccess->getAllMarksEnd()));
+ CPPUNIT_ASSERT(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)) != pMarkAccess->getAllMarksEnd());
- pMarkAccess->deleteMark( pMarkAccess->findMark("Mark_") );
+ pMarkAccess->deleteMark(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)), false);
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
rUndoManager.Undo();
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
@@ -1997,6 +1542,152 @@ void SwUiWriterTest::testBookmarkUndo()
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf148389_Left)
+{
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ CPPUNIT_ASSERT(pWrtShell);
+ pWrtShell->Insert(u"foo bar baz"_ustr);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 3, /*bBasicCall=*/false);
+ IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
+
+ auto pMark = pMarkAccess->makeMark(*pWrtShell->GetCursor(), SwMarkName(u"Mark"_ustr),
+ IDocumentMarkAccess::MarkType::BOOKMARK, ::sw::mark::InsertMode::New);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false);
+ pWrtShell->DelLeft();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->DelLeft();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->DelLeft();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->DelLeft();
+ // historically it wasn't deleted if empty, not sure if it should be
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ // the problem was that the end position was not restored
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ // this undo is no longer grouped, to prevent Redo deleting bookmark
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), pMark->GetOtherMarkPos().GetContentIndex());
+}
+
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf148389_Right)
+{
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ CPPUNIT_ASSERT(pWrtShell);
+ pWrtShell->Insert(u"foo bar baz"_ustr);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 3, /*bBasicCall=*/false);
+ IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
+
+ auto pMark = pMarkAccess->makeMark(*pWrtShell->GetCursor(), SwMarkName(u"Mark"_ustr),
+ IDocumentMarkAccess::MarkType::BOOKMARK, ::sw::mark::InsertMode::New);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false);
+ pWrtShell->DelRight();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->DelRight();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->DelRight();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->DelRight();
+ // historically it wasn't deleted if empty, not sure if it should be
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ // the problem was that the start position was not restored
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ // this undo is no longer grouped, to prevent Redo deleting bookmark
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ // this undo is no longer grouped, to prevent Redo deleting bookmark
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Redo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pMark->GetOtherMarkPos().GetContentIndex());
+ pWrtShell->Undo();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+ // Undo re-creates the mark...
+ pMark = *pMarkAccess->getAllMarksBegin();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pMark->GetMarkPos().GetContentIndex());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), pMark->GetOtherMarkPos().GetContentIndex());
+}
+
static void lcl_setWeight(SwWrtShell* pWrtShell, FontWeight aWeight)
{
SvxWeightItem aWeightItem(aWeight, EE_CHAR_WEIGHT);
@@ -2005,55 +1696,55 @@ static void lcl_setWeight(SwWrtShell* pWrtShell, FontWeight aWeight)
pWrtShell->SetAttrSet(aScriptSetItem.GetItemSet());
}
-void SwUiWriterTest::testFdo85876()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo85876)
{
- SwDoc* const pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
lcl_setWeight(pWrtShell, WEIGHT_BOLD);
- pWrtShell->Insert("test");
+ pWrtShell->Insert(u"test"_ustr);
lcl_setWeight(pWrtShell, WEIGHT_NORMAL);
pWrtShell->SplitNode();
pWrtShell->SplitNode();
pWrtShell->Up(false);
- pWrtShell->Insert("test");
+ pWrtShell->Insert(u"test"_ustr);
auto xText = getParagraph(1)->getText();
CPPUNIT_ASSERT(xText.is());
{
auto xCursor(xText->createTextCursorByRange(getParagraph(1)));
CPPUNIT_ASSERT(xCursor.is());
xCursor->collapseToStart();
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, "CharWeight"));
+ CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, u"CharWeight"_ustr));
}
{
auto xCursor(xText->createTextCursorByRange(getParagraph(2)));
CPPUNIT_ASSERT(xCursor.is());
xCursor->collapseToStart();
// this used to be BOLD too with fdo#85876
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, "CharWeight"));
+ CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, u"CharWeight"_ustr));
}
}
-void SwUiWriterTest::testCaretPositionMovingUp()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testCaretPositionMovingUp)
{
- SwDoc* const pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("after");
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert(u"after"_ustr);
pWrtShell->InsertLineBreak();
pWrtShell->Up(false);
- pWrtShell->Insert("before");
+ pWrtShell->Insert(u"before"_ustr);
CPPUNIT_ASSERT_EQUAL(OUString(u"beforeAfter" + OUStringChar(CH_TXTATR_NEWLINE)), getParagraph(1)->getString());
}
-void SwUiWriterTest::testTdf93441()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf93441)
{
- SwDoc* const pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("Hello");
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert(u"Hello"_ustr);
pWrtShell->InsertLineBreak();
- pWrtShell->Insert("Hello World");
+ pWrtShell->Insert(u"Hello World"_ustr);
pWrtShell->Up(false);
- pWrtShell->Insert(" World");
+ pWrtShell->Insert(u" World"_ustr);
// Without the fix in place, this test would have failed with
// - Expected: Hello World\nHello World
@@ -2061,115 +1752,66 @@ void SwUiWriterTest::testTdf93441()
CPPUNIT_ASSERT_EQUAL(OUString(u"Hello World" + OUStringChar(CH_TXTATR_NEWLINE) + u"Hello World"), getParagraph(1)->getString());
}
-void SwUiWriterTest::testTdf81226()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf81226)
{
- SwDoc* const pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("before");
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 4, /*bBasicCall=*/false);
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert(u"before"_ustr);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false);
pWrtShell->Down(false);
- pWrtShell->Insert("after");
+ pWrtShell->Insert(u"after"_ustr);
// Without the fix in place, this test would have failed with
// - Expected: beforeafter
// - Actual : beafterfore
- CPPUNIT_ASSERT_EQUAL(OUString("beforeafter"), getParagraph(1)->getString());
+ CPPUNIT_ASSERT_EQUAL(u"beforeafter"_ustr, getParagraph(1)->getString());
}
-void SwUiWriterTest::testTdf79717()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf137532)
{
- SwDoc* const pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("normal");
- lcl_setWeight(pWrtShell, WEIGHT_BOLD);
- pWrtShell->Insert("bold");
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false);
- // Select 'bol' and replace it
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 3, /*bBasicCall=*/false);
- pWrtShell->Insert("bol");
-
- // Without the fix in place, 'bol' would have been replaced with normal font weight
-
- auto xText = getParagraph(1)->getText();
- CPPUNIT_ASSERT(xText.is());
- {
- auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 1)));
- CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("normal"), xCursor->getString());
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, "CharWeight"));
- }
- {
- auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 2)));
- CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("bold"), xCursor->getString());
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, "CharWeight"));
- }
-
- // Now select characters from both runs and replace them
- pWrtShell->EndPara();
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 5, /*bBasicCall=*/false);
- pWrtShell->Insert("new");
- {
- auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 1)));
- CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("norma"), xCursor->getString());
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, "CharWeight"));
- }
- {
- auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 2)));
- CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("new"), xCursor->getString());
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, "CharWeight"));
- }
-}
-
-void SwUiWriterTest::testTdf137532()
-{
- SwDoc* const pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("test");
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert(u"test"_ustr);
//Select the word and change it to bold
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 4, /*bBasicCall=*/false);
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 4, /*bBasicCall=*/false);
lcl_setWeight(pWrtShell, WEIGHT_BOLD);
// Select first character and replace it
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false);
- pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false);
- pWrtShell->Insert("x");
+ pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false);
+ pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 1, /*bBasicCall=*/false);
+ pWrtShell->Insert(u"x"_ustr);
auto xText = getParagraph(1)->getText();
CPPUNIT_ASSERT(xText.is());
auto xCursor(xText->createTextCursorByRange(getRun(getParagraph(1), 1)));
CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("xest"), xCursor->getString());
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, "CharWeight"));
+ CPPUNIT_ASSERT_EQUAL(u"xest"_ustr, xCursor->getString());
+ CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, u"CharWeight"_ustr));
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
+ dispatchCommand(mxComponent, u".uno:Undo"_ustr, {});
xCursor.set(xText->createTextCursorByRange(getRun(getParagraph(1), 1)));
CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("test"), xCursor->getString());
+ CPPUNIT_ASSERT_EQUAL(u"test"_ustr, xCursor->getString());
// Without the fix in place, this test would have failed in
// - Expected: 150
// - Actual : 100
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, "CharWeight"));
+ CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xCursor, u"CharWeight"_ustr));
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
+ dispatchCommand(mxComponent, u".uno:Undo"_ustr, {});
xCursor.set(xText->createTextCursorByRange(getRun(getParagraph(1), 1)));
CPPUNIT_ASSERT(xCursor.is());
- CPPUNIT_ASSERT_EQUAL(OUString("test"), xCursor->getString());
- CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, "CharWeight"));
+ CPPUNIT_ASSERT_EQUAL(u"test"_ustr, xCursor->getString());
+ CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xCursor, u"CharWeight"_ustr));
}
-void SwUiWriterTest::testFdo87448()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testFdo87448)
{
- createDoc("fdo87448.odt");
+ createSwDoc("fdo87448.odt");
// Save the first shape to a metafile.
uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter = drawing::GraphicExportFilter::create(comphelper::getProcessComponentContext());
@@ -2179,8 +1821,8 @@ void SwUiWriterTest::testFdo87448()
SvMemoryStream aStream;
uno::Reference<io::XOutputStream> xOutputStream(new utl::OStreamWrapper(aStream));
uno::Sequence<beans::PropertyValue> aDescriptor( comphelper::InitPropertySequence({
- { "OutputStream", uno::makeAny(xOutputStream) },
- { "FilterName", uno::makeAny(OUString("SVM")) }
+ { "OutputStream", uno::Any(xOutputStream) },
+ { "FilterName", uno::Any(u"SVM"_ustr) }
}));
xGraphicExporter->filter(aDescriptor);
aStream.Seek(STREAM_SEEK_TO_BEGIN);
@@ -2206,68 +1848,69 @@ void SwUiWriterTest::testFdo87448()
CPPUNIT_ASSERT_MESSAGE(aMsg.getStr(), abs(nFirstEnd - nSecondEnd) < 10);
}
-void SwUiWriterTest::testTextCursorInvalidation()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTextCursorInvalidation)
{
- createDoc();
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- uno::Reference<beans::XPropertySet> xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY);
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ uno::Reference<beans::XPropertySet> xPageStyle(getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), uno::UNO_QUERY);
CPPUNIT_ASSERT(xPageStyle.is());
- xPageStyle->setPropertyValue("HeaderIsOn", uno::makeAny(true));
- uno::Reference<text::XText> xHeader(getProperty<uno::Reference<text::XText>>(xPageStyle, "HeaderText"));
+ xPageStyle->setPropertyValue(u"HeaderIsOn"_ustr, uno::Any(true));
+ uno::Reference<text::XText> xHeader(getProperty<uno::Reference<text::XText>>(xPageStyle, u"HeaderText"_ustr));
CPPUNIT_ASSERT(xHeader.is());
// create cursor inside the header text
uno::Reference<text::XTextCursor> xCursor(xHeader->createTextCursor());
// can't go right in empty header
CPPUNIT_ASSERT(!xCursor->goRight(1, false));
// this does not actually delete the header: xPageStyle->setPropertyValue("HeaderIsOn", uno::makeAny(false));
- pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", true, false, false);
+ pWrtShell->ChangeHeaderOrFooter(UIName(u"Default Page Style"_ustr), true, false, false);
// must be disposed after deleting header
- CPPUNIT_ASSERT_THROW(xCursor->goRight(1, false), uno::RuntimeException);
+ // cursor ends up in body
+ // UPDATE: this behaviour has been corrected as a side effect of the fix to tdf#46561:
+ //CPPUNIT_ASSERT_THROW(xCursor->goRight(1, false), uno::RuntimeException);
}
-void SwUiWriterTest::testTdf68183()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf68183)
{
// First disable RSID and check if indeed no such attribute is inserted.
- SwDoc* pDoc = createDoc();
- SW_MOD()->GetModuleConfig()->SetStoreRsid(false);
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert2("X");
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwModule* mod = SwModule::get();
+ mod->GetModuleConfig()->SetStoreRsid(false);
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
+ pWrtShell->Insert2(u"X"_ustr);
SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
SwPaM aPaM(aIdx);
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
+ SwTextNode* pTextNode = aPaM.GetPointNode().GetTextNode();
CPPUNIT_ASSERT_EQUAL(false, pTextNode->GetSwAttrSet().HasItem(RES_PARATR_RSID));
// Then enable storing of RSID and make sure that the attribute is inserted.
- SW_MOD()->GetModuleConfig()->SetStoreRsid(true);
+ mod->GetModuleConfig()->SetStoreRsid(true);
pWrtShell->DelToStartOfLine();
- pWrtShell->Insert2("X");
+ pWrtShell->Insert2(u"X"_ustr);
CPPUNIT_ASSERT_EQUAL(true, pTextNode->GetSwAttrSet().HasItem(RES_PARATR_RSID));
}
-void SwUiWriterTest::testCp1000115()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testCp1000115)
{
- createDoc("cp1000115.fodt");
+ createSwDoc("cp1000115.fodt");
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, "/root/page[2]/body/tab/row/cell[2]/txt");
- xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval;
// This was 1: the long paragraph in the B1 cell did flow over to the
// second page, so there was only one paragraph in the second cell of the
// second page.
- CPPUNIT_ASSERT_EQUAL(2, xmlXPathNodeSetGetLength(pXmlNodes));
- xmlXPathFreeObject(pXmlObj);
+ assertXPath(pXmlDoc, "/root/page[2]/body/tab/row/cell[2]/txt", 2);
}
-void SwUiWriterTest::testTdf63214()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf63214)
{
//This is a crash test
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
- pWrtShell->Insert("V");
+ pWrtShell->Insert(u"V"_ustr);
{ //limiting the lifetime of SwPaM with a nested scope
//the shell cursor are automatically adjusted when nodes are deleted, but the shell doesn't know about an SwPaM on the stack
IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
@@ -2275,7 +1918,7 @@ void SwUiWriterTest::testTdf63214()
aPaM.SetMark();
aPaM.Move(fnMoveForward, GoInContent);
//Inserting a crossRefBookmark
- pMarkAccess->makeMark(aPaM, "Bookmark",
+ pMarkAccess->makeMark(aPaM, SwMarkName(u"Bookmark"_ustr),
IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK,
::sw::mark::InsertMode::New);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
@@ -2288,25 +1931,26 @@ void SwUiWriterTest::testTdf63214()
rUndoManager.Redo();
}
-void SwUiWriterTest::testTdf90003()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf90003)
{
- createDoc("tdf90003.odt");
+ createSwDoc("tdf90003.odt");
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
CPPUNIT_ASSERT(pXmlDoc);
// This was 1: an unexpected fly portion was created, resulting in too
// large x position for the empty paragraph marker.
- assertXPath(pXmlDoc, "//Special[@nType='PortionType::Fly']", 0);
+ assertXPath(pXmlDoc, "//SwFixPortion[@type='PortionType::Fly']", 0);
}
-void SwUiWriterTest::testTdf51741()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf51741)
{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
SwPaM aPaM( SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1) );
//Modification 1
- pMarkAccess->makeMark(aPaM, "Mark", IDocumentMarkAccess::MarkType::BOOKMARK,
+ pMarkAccess->makeMark(aPaM, SwMarkName(u"Mark"_ustr), IDocumentMarkAccess::MarkType::BOOKMARK,
::sw::mark::InsertMode::New);
CPPUNIT_ASSERT(pWrtShell->IsModified());
pWrtShell->ResetModified();
@@ -2321,28 +1965,28 @@ void SwUiWriterTest::testTdf51741()
CPPUNIT_ASSERT(pWrtShell->IsModified());
pWrtShell->ResetModified();
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
- IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findMark("Mark");
+ auto ppBkmk = pMarkAccess->findMark(SwMarkName(u"Mark"_ustr));
CPPUNIT_ASSERT(ppBkmk != pMarkAccess->getAllMarksEnd());
//Modification 4
- pMarkAccess->renameMark(*ppBkmk, "Mark_");
+ pMarkAccess->renameMark(*ppBkmk, SwMarkName(u"Mark_"_ustr));
CPPUNIT_ASSERT(pWrtShell->IsModified());
pWrtShell->ResetModified();
- CPPUNIT_ASSERT(bool(pMarkAccess->findMark("Mark") == pMarkAccess->getAllMarksEnd()));
- CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") != pMarkAccess->getAllMarksEnd());
+ CPPUNIT_ASSERT(bool(pMarkAccess->findMark(SwMarkName(u"Mark"_ustr)) == pMarkAccess->getAllMarksEnd()));
+ CPPUNIT_ASSERT(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)) != pMarkAccess->getAllMarksEnd());
//Modification 5
rUndoManager.Undo();
CPPUNIT_ASSERT(pWrtShell->IsModified());
pWrtShell->ResetModified();
- CPPUNIT_ASSERT(pMarkAccess->findMark("Mark") != pMarkAccess->getAllMarksEnd());
- CPPUNIT_ASSERT(bool(pMarkAccess->findMark("Mark_") == pMarkAccess->getAllMarksEnd()));
+ CPPUNIT_ASSERT(pMarkAccess->findMark(SwMarkName(u"Mark"_ustr)) != pMarkAccess->getAllMarksEnd());
+ CPPUNIT_ASSERT(bool(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)) == pMarkAccess->getAllMarksEnd()));
//Modification 6
rUndoManager.Redo();
CPPUNIT_ASSERT(pWrtShell->IsModified());
pWrtShell->ResetModified();
- CPPUNIT_ASSERT(bool(pMarkAccess->findMark("Mark") == pMarkAccess->getAllMarksEnd()));
- CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") != pMarkAccess->getAllMarksEnd());
+ CPPUNIT_ASSERT(bool(pMarkAccess->findMark(SwMarkName(u"Mark"_ustr)) == pMarkAccess->getAllMarksEnd()));
+ CPPUNIT_ASSERT(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)) != pMarkAccess->getAllMarksEnd());
//Modification 7
- pMarkAccess->deleteMark( pMarkAccess->findMark("Mark_") );
+ pMarkAccess->deleteMark(pMarkAccess->findMark(SwMarkName(u"Mark_"_ustr)), false);
CPPUNIT_ASSERT(pWrtShell->IsModified());
pWrtShell->ResetModified();
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
@@ -2358,9 +2002,9 @@ void SwUiWriterTest::testTdf51741()
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
}
-void SwUiWriterTest::testDefaultsOfOutlineNumbering()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDefaultsOfOutlineNumbering)
{
- uno::Reference<text::XDefaultNumberingProvider> xDefNum(m_xSFactory->createInstance("com.sun.star.text.DefaultNumberingProvider"), uno::UNO_QUERY);
+ uno::Reference<text::XDefaultNumberingProvider> xDefNum(m_xSFactory->createInstance(u"com.sun.star.text.DefaultNumberingProvider"_ustr), uno::UNO_QUERY);
css::lang::Locale alocale;
alocale.Language = "en";
alocale.Country = "US";
@@ -2373,11 +2017,11 @@ void SwUiWriterTest::testDefaultsOfOutlineNumbering()
{
uno::Any aAny = rPropVal.Value;
if(rPropVal.Name == "Prefix" || rPropVal.Name == "Suffix" || rPropVal.Name == "Transliteration")
- CPPUNIT_ASSERT_EQUAL(OUString("string"), aAny.getValueTypeName());
+ CPPUNIT_ASSERT_EQUAL(u"string"_ustr, aAny.getValueTypeName());
else if(rPropVal.Name == "NumberingType")
- CPPUNIT_ASSERT_EQUAL(OUString("short"), aAny.getValueTypeName());
+ CPPUNIT_ASSERT_EQUAL(u"short"_ustr, aAny.getValueTypeName());
else if(rPropVal.Name == "NatNum")
- CPPUNIT_ASSERT_EQUAL(OUString("short"), aAny.getValueTypeName());
+ CPPUNIT_ASSERT_EQUAL(u"short"_ustr, aAny.getValueTypeName());
//It is expected to be long but right now its short !error!
else
CPPUNIT_FAIL("Property Name not matched");
@@ -2385,40 +2029,41 @@ void SwUiWriterTest::testDefaultsOfOutlineNumbering()
}
}
-void SwUiWriterTest::testDeleteTableRedlines()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testDeleteTableRedlines)
{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0);
const SwTable& rTable = pWrtShell->InsertTable(TableOpt, 1, 3);
uno::Reference<text::XTextTable> xTable(getParagraphOrTable(1), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount());
CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getColumns()->getCount());
uno::Sequence<beans::PropertyValue> aDescriptor;
- SwUnoCursorHelper::makeTableCellRedline((*const_cast<SwTableBox*>(rTable.GetTableBox("A1"))), u"TableCellInsert", aDescriptor);
- SwUnoCursorHelper::makeTableCellRedline((*const_cast<SwTableBox*>(rTable.GetTableBox("B1"))), u"TableCellInsert", aDescriptor);
- SwUnoCursorHelper::makeTableCellRedline((*const_cast<SwTableBox*>(rTable.GetTableBox("C1"))), u"TableCellInsert", aDescriptor);
+ SwUnoCursorHelper::makeTableCellRedline((*const_cast<SwTableBox*>(rTable.GetTableBox(u"A1"_ustr))), u"TableCellInsert", aDescriptor);
+ SwUnoCursorHelper::makeTableCellRedline((*const_cast<SwTableBox*>(rTable.GetTableBox(u"B1"_ustr))), u"TableCellInsert", aDescriptor);
+ SwUnoCursorHelper::makeTableCellRedline((*const_cast<SwTableBox*>(rTable.GetTableBox(u"C1"_ustr))), u"TableCellInsert", aDescriptor);
IDocumentRedlineAccess& rIDRA = pDoc->getIDocumentRedlineAccess();
SwExtraRedlineTable& rExtras = rIDRA.GetExtraRedlineTable();
rExtras.DeleteAllTableRedlines(*pDoc, rTable, false, RedlineType::Any);
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(0), rExtras.GetSize());
+ CPPUNIT_ASSERT_EQUAL(o3tl::narrowing<sal_uInt16>(0), rExtras.GetSize());
}
-void SwUiWriterTest::testXFlatParagraph()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testXFlatParagraph)
{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ createSwDoc();
+ SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
//Inserting some text in the document
- pWrtShell->Insert("This is sample text");
+ pWrtShell->Insert(u"This is sample text"_ustr);
pWrtShell->SplitNode();
- pWrtShell->Insert("This is another sample text");
+ pWrtShell->Insert(u"This is another sample text"_ustr);
pWrtShell->SplitNode();
- pWrtShell->Insert("This is yet another sample text");
+ pWrtShell->Insert(u"This is yet another sample text"_ustr);
//retrieving the XFlatParagraphs
uno::Reference<text::XFlatParagraphIteratorProvider> xFPIP(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XFlatParagraphIterator> xFPIterator(xFPIP->getFlatParagraphIterator(sal_Int32(text::TextMarkupType::SPELLCHECK), true));
uno::Reference<text::XFlatParagraph> xFlatPara(xFPIterator->getFirstPara());
- CPPUNIT_ASSERT_EQUAL(OUString("This is sample text"), xFlatPara->getText());
+ CPPUNIT_ASSERT_EQUAL(u"This is sample text"_ustr, xFlatPara->getText());
//checking modified status
CPPUNIT_ASSERT(!xFlatPara->isModified());
//checking "checked" status, modifying it and asserting the changes
@@ -2427,9 +2072,9 @@ void SwUiWriterTest::testXFlatParagraph()
CPPUNIT_ASSERT(xFlatPara->isChecked(sal_Int32(text::TextMarkupType::SPELLCHECK)));
//getting other XFlatParagraphs and asserting their contents
uno::Reference<text::XFlatParagraph> xFlatPara2(xFPIterator->getParaAfter(xFlatPara));
- CPPUNIT_ASSERT_EQUAL(OUString("This is another sample text"), xFlatPara2->getText());
+ CPPUNIT_ASSERT_EQUAL(u"This is another sample text"_ustr, xFlatPara2->getText());
uno::Reference<text::XFlatParagraph> xFlatPara3(xFPIterator->getParaAfter(xFlatPara2));
- CPPUNIT_ASSERT_EQUAL(OUString("This is yet another sample text"), xFlatPara3->getText());
+ CPPUNIT_ASSERT_EQUAL(u"This is yet another sample text"_ustr, xFlatPara3->getText());
uno::Reference<text::XFlatParagraph> xFlatPara4(xFPIterator->getParaBefore(xFlatPara3));
CPPUNIT_ASSERT_EQUAL(xFlatPara2->getText(), xFlatPara4->getText());
//changing the attributes of last para
@@ -2442,17 +2087,17 @@ void SwUiWriterTest::testXFlatParagraph()
CPPUNIT_ASSERT(!aLangPortions.hasElements());
//examining Language of text
css::lang::Locale alocale = xFlatPara4->getLanguageOfText(sal_Int32(0), sal_Int32(4));
- CPPUNIT_ASSERT_EQUAL(OUString("en"), alocale.Language);
- CPPUNIT_ASSERT_EQUAL(OUString("US"), alocale.Country);
+ CPPUNIT_ASSERT_EQUAL(u"en"_ustr, alocale.Language);
+ CPPUNIT_ASSERT_EQUAL(u"US"_ustr, alocale.Country);
//examining Primary Language of text
css::lang::Locale aprimarylocale = xFlatPara4->getPrimaryLanguageOfText(sal_Int32(0), sal_Int32(20));
- CPPUNIT_ASSERT_EQUAL(OUString("en"), aprimarylocale.Language);
- CPPUNIT_ASSERT_EQUAL(OUString("US"), aprimarylocale.Country);
+ CPPUNIT_ASSERT_EQUAL(u"en"_ustr, aprimarylocale.Language);
+ CPPUNIT_ASSERT_EQUAL(u"US"_ustr, aprimarylocale.Country);
}
-void SwUiWriterTest::testTdf81995()
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf81995)
{
- uno::Reference<text::XDefaultNumberingProvider> xDefNum(m_xSFactory->createInstance("com.sun.star.text.DefaultNumberingProvider"), uno::UNO_QUERY);
+ uno::Reference<text::XDefaultNumberingProvider> xDefNum(m_xSFactory->createInstance(u"com.sun.star.text.DefaultNumberingProvider"_ustr), uno::UNO_QUERY);
css::lang::Locale alocale;
alocale.Language = "en";
alocale.Country = "US";
@@ -2460,21 +2105,21 @@ void SwUiWriterTest::testTdf81995()
CPPUNIT_ASSERT_EQUAL(sal_Int32(8), aIndexAccess.getLength());
for(const auto& rIndexAccess : aIndexAccess)
{
- CPPUNIT_ASSERT_EQUAL(sal_Int32(5), rIndexAccess->getCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), rIndexAccess->getCount());
for(int j=0;j<rIndexAccess->getCount();j++)
{
uno::Sequence<beans::PropertyValue> aProps;
rIndexAccess->getByIndex(j) >>= aProps;
CPPUNIT_ASSERT_EQUAL(sal_Int32(12), aProps.getLength());
- for(const beans::PropertyValue& rProp : std::as_const(aProps))
+ for (const beans::PropertyValue& rProp : aProps)
{
uno::Any aAny = rProp.Value;
if(rProp.Name == "Prefix" || rProp.Name == "Suffix" || rProp.Name == "BulletChar" || rProp.Name == "BulletFontName" || rProp.Name == "Transliteration")
- CPPUNIT_ASSERT_EQUAL(OUString("string"), aAny.getValueTypeName());
+ CPPUNIT_ASSERT_EQUAL(u"string"_ustr, aAny.getValueTypeName());
else if(rProp.Name == "NumberingType" || rProp.Name == "ParentNumbering" || rProp.Name == "Adjust")
- CPPUNIT_ASSERT_EQUAL(OUString("short"), aAny.getValueTypeName());
+ CPPUNIT_ASSERT_EQUAL(u"short"_ustr, aAny.getValueTypeName());
else if(rProp.Name == "LeftMargin" || rProp.Name == "SymbolTextDistance" || rProp.Name == "FirstLineOffset" || rProp.Name == "NatNum")
- CPPUNIT_ASSERT_EQUAL(OUString("long"), aAny.getValueTypeName());
+ CPPUNIT_ASSERT_EQUAL(u"long"_ustr, aAny.getValueTypeName());
else
CPPUNIT_FAIL("Property Name not matched");
}
@@ -2482,5599 +2127,6 @@ void SwUiWriterTest::testTdf81995()
}
}
-void SwUiWriterTest::testForcepoint3()
-{
- createDoc("flowframe_null_ptr_deref.sample");
- uno::Sequence<beans::PropertyValue> aDescriptor( comphelper::InitPropertySequence({
- { "FilterName", uno::Any(OUString("writer_pdf_Export")) },
- }));
- utl::TempFile aTempFile;
- uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
- // printing asserted in SwFrame::GetNextSctLeaf()
- xStorable->storeToURL(aTempFile.GetURL(), aDescriptor);
- aTempFile.EnableKillingFile();
-}
-
-void SwUiWriterTest::testForcepoint80()
-{
- try
- {
- createDoc("forcepoint80-1.rtf");
- uno::Sequence<beans::PropertyValue> aDescriptor( comphelper::InitPropertySequence({
- { "FilterName", uno::Any(OUString("writer_pdf_Export")) },
- }));
- utl::TempFile aTempFile;
- uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
- // printing asserted in SwCellFrame::FindStartEndOfRowSpanCell
- xStorable->storeToURL(aTempFile.GetURL(), aDescriptor);
- aTempFile.EnableKillingFile();
- }
- catch(...)
- {
- }
-}
-
-void SwUiWriterTest::testExportToPicture()
-{
- createDoc();
- uno::Sequence<beans::PropertyValue> aFilterData( comphelper::InitPropertySequence({
- { "PixelWidth", uno::Any(sal_Int32(610)) },
- { "PixelHeight", uno::Any(sal_Int32(610)) }
- }));
- uno::Sequence<beans::PropertyValue> aDescriptor( comphelper::InitPropertySequence({
- { "FilterName", uno::Any(OUString("writer_png_Export")) },
- { "FilterData", uno::Any(aFilterData) }
- }));
- utl::TempFile aTempFile;
- uno::Reference<frame::XStorable> 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();
-}
-
-void SwUiWriterTest::testTdf77340()
-{
- createDoc();
- //Getting some paragraph style in our document
- uno::Reference<css::lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY);
- uno::Reference<style::XStyle> xStyle(xFactory->createInstance("com.sun.star.style.ParagraphStyle"), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xPropSet(xStyle, uno::UNO_QUERY_THROW);
- xPropSet->setPropertyValue("ParaBackColor", uno::makeAny(sal_Int32(0xFF00FF)));
- uno::Reference<style::XStyleFamiliesSupplier> xSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xNameAccess(xSupplier->getStyleFamilies());
- uno::Reference<container::XNameContainer> 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"));
-}
-
-void SwUiWriterTest::testTdf79236()
-{
- SwDoc* pDoc = createDoc();
- sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
- //Getting some paragraph style
- SwTextFormatColl* pTextFormat = pDoc->FindTextFormatCollByName(u"Text Body");
- const SwAttrSet& rAttrSet = pTextFormat->GetAttrSet();
- std::unique_ptr<SfxItemSet> 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);
-}
-
-void SwUiWriterTest::testTextSearch()
-{
- // Create a new empty Writer document
- SwDoc* pDoc = createDoc();
- 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<util::XSearchable> xSearch(mxComponent, uno::UNO_QUERY);
- uno::Reference<util::XSearchDescriptor> xSearchDes = xSearch->createSearchDescriptor();
- uno::Reference<util::XPropertyReplace> xProp(xSearchDes, uno::UNO_QUERY);
- //setting some properties
- uno::Sequence<beans::PropertyValue> 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<beans::PropertyValue> 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<beans::XPropertySet> 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<container::XIndexAccess> xIndex(xSearch->findAll(xSearchDes));
- CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount());
- //Replacing the searched string via XReplaceable
- uno::Reference<util::XReplaceable> xReplace(mxComponent, uno::UNO_QUERY);
- uno::Reference<util::XReplaceDescriptor> xReplaceDes = xReplace->createReplaceDescriptor();
- uno::Reference<util::XPropertyReplace> xProp2(xReplaceDes, uno::UNO_QUERY);
- xProp2->setReplaceAttributes(aDescriptor);
- //checking that the proper attributes are there or not
- uno::Sequence<beans::PropertyValue> 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<container::XIndexAccess> 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<text::XTextRange> 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("(?<!xCelly xW)o"); // only "o" in "xCello", not in "xWorld"
- xReplaceDes->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());
-}
-
-void SwUiWriterTest::testTdf69282()
-{
- mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument");
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- SwDoc* source = pTextDoc->GetDocShell()->GetDoc();
- uno::Reference<lang::XComponent> xSourceDoc = mxComponent;
- mxComponent.clear();
- SwDoc* target = createDoc();
- 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();
-}
-
-void SwUiWriterTest::testTdf69282WithMirror()
-{
- mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument");
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- SwDoc* source = pTextDoc->GetDocShell()->GetDoc();
- uno::Reference<lang::XComponent> xSourceDoc = mxComponent;
- mxComponent.clear();
- SwDoc* target = createDoc();
- 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();
-}
-
-void 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<const SfxFilter> 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<const SfxFilter> 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<const SfxFilter> 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());
-}
-
-void SwUiWriterTest::testUnoParagraph()
-{
- SwDoc* pDoc = createDoc();
- 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<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XText> xText(xTextDocument->getText());
- uno::Reference<container::XEnumerationAccess> xParaAccess(xText, uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xPara(xParaAccess->createEnumeration());
- //getting first paragraph
- uno::Reference<text::XTextContent> xFirstParaContent(xPara->nextElement(), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> 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<text::XTextContent> xSecondParaContent(xPara->nextElement(), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> 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());
-}
-
-void SwUiWriterTest::testTdf72788()
-{
- //Create a new empty Writer document
- SwDoc* pDoc = createDoc();
- 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<RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT>{});
- //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));
-}
-
-void SwUiWriterTest::testTdf60967()
-{
- SwDoc* pDoc = createDoc();
- 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);
-}
-
-void SwUiWriterTest::testSearchWithTransliterate()
-{
- SwDoc* pDoc = createDoc();
- 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<int>(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<int>(case2));
-}
-
-void SwUiWriterTest::testTdf73660()
-{
- SwDoc* pDoc = createDoc();
- 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));
-}
-
-void 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()));
-}
-
-void SwUiWriterTest::testTdf77342()
-{
- SwDoc* pDoc = createDoc();
- 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<SwGetRefFieldType*>(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->Insert(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->Insert(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->Insert(aField3);
- //updating the fields
- IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess());
- rField.UpdateExpFields(nullptr, true);
- //creating new clipboard doc
- rtl::Reference<SwDoc> 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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (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<SwTextFootnote*> (pFootnote15);
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote15->GetSeqRefNo());
-}
-
-void SwUiWriterTest::testTdf63553()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwPaM* pCursor = pDoc->GetEditShell()->GetCursor();
- //inserting sequence field 1
- SwSetExpFieldType* pSeqType = static_cast<SwSetExpFieldType*>(pWrtShell->GetFieldType(SwFieldIds::SetExp, "Illustration"));
- SwSetExpField aSetField1(pSeqType, "", SVX_NUM_ARABIC);
- pWrtShell->Insert(aSetField1);
- SwGetRefFieldType* pRefType = static_cast<SwGetRefFieldType*>(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->Insert(aGetField1);
- //now we have ref1-seq1
- //moving the cursor
- pCursor->Move(fnMoveForward);
- //inserting sequence field 2
- SwSetExpField aSetField2(pSeqType, "", SVX_NUM_ARABIC);
- pWrtShell->Insert(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->Insert(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->Insert(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->Insert(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<SwDoc> 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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (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<SwSetExpField*> (SwCursorShell::GetFieldAtCursor(pCursor, true));
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pOldSeq15->GetSeqNumber());
- CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq15->GetFieldName());
-}
-
-void SwUiWriterTest::testTdf74230()
-{
- createDoc();
- //exporting the empty document to ODT via TempFile
- uno::Sequence<beans::PropertyValue> aDescriptor;
- utl::TempFile aTempFile;
- uno::Reference<frame::XStorable> 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();
-}
-
-void SwUiWriterTest::testTdf74363()
-{
- SwDoc* pDoc = createDoc();
- 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
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(OUString("Testing "), static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf80663()
-{
- SwDoc* pDoc = createDoc();
- 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<text::XTextTable> 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());
-}
-
-void SwUiWriterTest::testTdf57197()
-{
- SwDoc* pDoc = createDoc();
- 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<text::XTextTable> 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());
-}
-
-void SwUiWriterTest::testTdf131990()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
-
- CPPUNIT_ASSERT(!pWrtShell->Up( false, 1, true ));
- CPPUNIT_ASSERT(!pWrtShell->Down( false, 1, true ));
-}
-
-void SwUiWriterTest::testTdf90808()
-{
- createDoc();
- uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xTextRange = xTextDocument->getText();
- uno::Reference<text::XText> xText = xTextRange->getText();
- uno::Reference<text::XParagraphCursor> xCursor(xText->createTextCursor(), uno::UNO_QUERY);
- //inserting text into document so that the paragraph is not empty
- xText->setString("Hello World!");
- uno::Reference<lang::XMultiServiceFactory> xFact(mxComponent, uno::UNO_QUERY);
- //creating bookmark 1
- uno::Reference<text::XTextContent> xHeadingBookmark1(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY);
- uno::Reference<container::XNamed> 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<text::XTextContent> xHeadingBookmark2(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY);
- uno::Reference<container::XNamed> 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<text::XTextContent> xNumBookmark1(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY);
- uno::Reference<container::XNamed> 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<text::XTextContent> xNumBookmark2(xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY);
- uno::Reference<container::XNamed> 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);
-}
-
-void SwUiWriterTest::testTdf97601()
-{
- // Instructions from the bugreport to trigger an infinite loop.
- createDoc("tdf97601.odt");
- uno::Reference<text::XTextEmbeddedObjectsSupplier> xEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xEmbeddedObjects = xEmbeddedObjectsSupplier->getEmbeddedObjects();
- uno::Reference<beans::XPropertySet> xChart;
- xEmbeddedObjects->getByName("myChart") >>= xChart;
- uno::Reference<chart2::data::XDataSource> xChartComponent;
- xChart->getPropertyValue("Component") >>= xChartComponent;
- uno::Sequence< uno::Reference<chart2::data::XLabeledDataSequence> > aDataSequences = xChartComponent->getDataSequences();
- uno::Reference<document::XEmbeddedObjectSupplier2> xChartState(xChart, uno::UNO_QUERY);
- xChartState->getExtendedControlOverEmbeddedObject()->changeState(1);
- uno::Reference<util::XModifiable> xDataSequenceModifiable(aDataSequences[2]->getValues(), uno::UNO_QUERY);
- xDataSequenceModifiable->setModified(true);
-
- // Make sure that the chart is marked as modified.
- uno::Reference<util::XModifiable> xModifiable(xChartComponent, uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(true, bool(xModifiable->isModified()));
- calcLayout();
- // This never returned.
- Scheduler::ProcessEventsToIdle();
-}
-
-void SwUiWriterTest::testTdf75137()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true);
- pWrtShell->InsertFootnote("This is first footnote");
- sal_uLong firstIndex = pShellCursor->GetNode().GetIndex();
- pShellCursor->GotoFootnoteAnchor();
- pWrtShell->InsertFootnote("This is second footnote");
- pWrtShell->Up(false);
- sal_uLong secondIndex = pShellCursor->GetNode().GetIndex();
- pWrtShell->Down(false);
- sal_uLong thirdIndex = pShellCursor->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(firstIndex, thirdIndex);
- CPPUNIT_ASSERT(firstIndex != secondIndex);
-}
-
-namespace
-{
- sal_Int32 lcl_getAttributeIDFromHints( const SwpHints& hints )
- {
- for (size_t i = 0; i < hints.Count(); ++i)
- {
- const SwTextAttr* hint = hints.Get(i);
- if( hint->Which() == RES_TXTATR_AUTOFMT )
- {
- const SwFormatAutoFormat& rFmt = hint->GetAutoFormat();
- SfxItemIter aIter( *rFmt.GetStyleHandle() );
- return aIter.GetCurItem()->Which();
- }
- }
- return -1;
- }
-}
-
-void SwUiWriterTest::testTdf99689TableOfContents()
-{
- SwDoc* pDoc = createDoc("tdf99689.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->GotoNextTOXBase();
- const SwTOXBase* pTOXBase = pWrtShell->GetCurTOX();
- pWrtShell->UpdateTableOf(*pTOXBase);
- SwCursorShell * pShell(pDoc->GetEditShell());
- SwTextNode* pTitleNode = pShell->GetCursor()->GetNode().GetTextNode();
- SwNodeIndex aIdx ( *pTitleNode );
- // skip the title
- pDoc->GetNodes().GoNext( &aIdx );
-
- // skip the first header. No attributes there.
- // next node should contain superscript
- SwTextNode* pNext = static_cast<SwTextNode*> (pDoc->GetNodes().GoNext( &aIdx ));
- CPPUNIT_ASSERT( pNext->HasHints() );
- sal_uInt16 nAttrType = lcl_getAttributeIDFromHints( pNext->GetSwpHints() );
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_CHRATR_ESCAPEMENT), nAttrType );
-
- // next node should contain subscript
- pNext = static_cast<SwTextNode*> (pDoc->GetNodes().GoNext( &aIdx ));
- CPPUNIT_ASSERT( pNext->HasHints() );
- nAttrType = lcl_getAttributeIDFromHints( pNext->GetSwpHints() );
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_CHRATR_ESCAPEMENT), nAttrType );
-}
-
-void SwUiWriterTest::testTdf99689TableOfFigures()
-{
- SwDoc* pDoc = createDoc("tdf99689_figures.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->GotoNextTOXBase();
- const SwTOXBase* pTOXBase = pWrtShell->GetCurTOX();
- pWrtShell->UpdateTableOf(*pTOXBase);
- SwCursorShell * pShell(pDoc->GetEditShell());
- SwTextNode* pTitleNode = pShell->GetCursor()->GetNode().GetTextNode();
- SwNodeIndex aIdx ( *pTitleNode );
-
- // skip the title
- // next node should contain subscript
- SwTextNode* pNext = static_cast<SwTextNode*> (pDoc->GetNodes().GoNext( &aIdx ));
- CPPUNIT_ASSERT( pNext->HasHints() );
- sal_uInt16 nAttrType = lcl_getAttributeIDFromHints( pNext->GetSwpHints() );
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_CHRATR_ESCAPEMENT), nAttrType );
-
- // next node should contain superscript
- pNext = static_cast<SwTextNode*> (pDoc->GetNodes().GoNext( &aIdx ));
- CPPUNIT_ASSERT( pNext->HasHints() );
- nAttrType = lcl_getAttributeIDFromHints( pNext->GetSwpHints() );
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_CHRATR_ESCAPEMENT), nAttrType );
-}
-
-void SwUiWriterTest::testTdf99689TableOfTables()
-{
- SwDoc* pDoc = createDoc("tdf99689_tables.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->GotoNextTOXBase();
- const SwTOXBase* pTOXBase = pWrtShell->GetCurTOX();
- pWrtShell->UpdateTableOf(*pTOXBase);
- SwCursorShell * pShell(pDoc->GetEditShell());
- SwTextNode* pTitleNode = pShell->GetCursor()->GetNode().GetTextNode();
- SwNodeIndex aIdx ( *pTitleNode );
-
- // skip the title
- // next node should contain superscript
- SwTextNode* pNext = static_cast<SwTextNode*> (pDoc->GetNodes().GoNext( &aIdx ));
- CPPUNIT_ASSERT( pNext->HasHints() );
- sal_uInt16 nAttrType = lcl_getAttributeIDFromHints( pNext->GetSwpHints() );
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_CHRATR_ESCAPEMENT), nAttrType );
-
- // next node should contain subscript
- pNext = static_cast<SwTextNode*> (pDoc->GetNodes().GoNext( &aIdx ));
- CPPUNIT_ASSERT( pNext->HasHints() );
- nAttrType = lcl_getAttributeIDFromHints( pNext->GetSwpHints() );
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_CHRATR_ESCAPEMENT), nAttrType );
-}
-
-void SwUiWriterTest::testTdf83798()
-{
- SwDoc* pDoc = createDoc("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();
-}
-
-void SwUiWriterTest::testTdf89714()
-{
- createDoc();
- uno::Reference<lang::XMultiServiceFactory> xFact(mxComponent, uno::UNO_QUERY);
- uno::Reference<uno::XInterface> xInterface(xFact->createInstance("com.sun.star.text.Defaults"), uno::UNO_QUERY);
- uno::Reference<beans::XPropertyState> 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") );
-}
-
-void SwUiWriterTest::testTdf130287()
-{
- //create a new writer document
- SwDoc* pDoc = createDoc();
- 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<text::XTextTable> 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<table::XCell> xCell = xTable->getCellByName("A1");
- uno::Reference<text::XText> xCellText(xCell, uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xParagraph = getParagraphOfText(1, xCellText);
- // they were 2 (orphan/widow control enabled unnecessarily in Table Contents paragraph style)
- CPPUNIT_ASSERT_EQUAL( sal_Int8(0), getProperty<sal_Int8>(xParagraph, "ParaOrphans"));
- CPPUNIT_ASSERT_EQUAL( sal_Int8(0), getProperty<sal_Int8>(xParagraph, "ParaWidows"));
-}
-
-void SwUiWriterTest::testPropertyDefaults()
-{
- createDoc();
- uno::Reference<lang::XMultiServiceFactory> xFact(mxComponent, uno::UNO_QUERY);
- uno::Reference<uno::XInterface> xInterface(xFact->createInstance("com.sun.star.text.Defaults"), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xPropSet(xInterface, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertyState> 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);
-}
-
-void SwUiWriterTest::testTableBackgroundColor()
-{
- SwDoc* pDoc = createDoc();
- 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<text::XTextTable> 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<table::XCell> xCell;
- xCell = xTable->getCellByName("A1");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0xFF00FF), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("A2");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("A3");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("B1");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("B2");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("B3");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("C1");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("C2");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
- xCell = xTable->getCellByName("C3");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty<sal_Int32>(xCell, "BackColor"));
-}
-
-void SwUiWriterTest::testTdf88899()
-{
- createDoc();
- uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<document::XDocumentProperties> xProps(xDocumentPropertiesSupplier->getDocumentProperties());
- uno::Reference<beans::XPropertyContainer> 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<lang::XMultiServiceFactory> xFact(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextField> xTextField(xFact->createInstance("com.sun.star.text.textfield.docinfo.Custom"), uno::UNO_QUERY);
- //Setting Name Property
- uno::Reference<beans::XPropertySet> xPropSet(xTextField, uno::UNO_QUERY_THROW);
- xPropSet->setPropertyValue("Name", uno::makeAny(OUString("dateTime")));
- //Setting NumberFormat
- uno::Reference<util::XNumberFormatsSupplier> xNumberFormatsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<util::XNumberFormatTypes> 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<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xTextRange = xTextDocument->getText();
- uno::Reference<text::XText> 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));
-}
-
-void SwUiWriterTest::testTdf90362()
-{
- SwDoc* pDoc = createDoc("tdf90362.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
- // Ensure correct initial setting
- comphelper::ConfigurationHelper::writeDirectKey(xComponentContext, "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea", css::uno::Any(false), comphelper::EConfigurationModes::Standard);
- // 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.
- comphelper::ConfigurationHelper::writeDirectKey(xComponentContext, "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea", css::uno::Any(true), comphelper::EConfigurationModes::Standard);
- CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel());
- // Clean up, otherwise following tests will have that option set
- comphelper::ConfigurationHelper::writeDirectKey(xComponentContext, "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea", css::uno::Any(false), comphelper::EConfigurationModes::Standard);
-}
-
-void SwUiWriterTest::testUndoDelAsCharTdf107512()
-{
- SwDoc * pDoc(createDoc());
- sw::UndoManager & rUndoManager(pDoc->GetUndoManager());
- IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations());
- SwCursorShell * pShell(pDoc->GetEditShell());
- SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items<RES_FRMATR_BEGIN, RES_FRMATR_END-1>{});
- SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items<RES_GRFATR_BEGIN, RES_GRFATR_END-1>{});
- 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->SelectText(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<RES_CHRATR_HIDDEN, 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<SvxCharHiddenItem const*>(pItem)->GetValue());
- query.ClearItem(RES_CHRATR_HIDDEN);
-
- // delete from the start
- pShell->SelectText(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<SvxCharHiddenItem const*>(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<SvxCharHiddenItem const*>(pItem)->GetValue());
- query.ClearItem(RES_CHRATR_HIDDEN);
-
- // delete from the end
- pShell->SelectText(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<SvxCharHiddenItem const*>(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<SvxCharHiddenItem const*>(pItem)->GetValue());
- query.ClearItem(RES_CHRATR_HIDDEN);
-}
-
-void SwUiWriterTest::testUndoCharAttribute()
-{
- // Create a new empty Writer document
- SwDoc* pDoc = createDoc();
- 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<RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT>{});
- // 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));
-}
-
-void SwUiWriterTest::testUndoDelAsChar()
-{
- SwDoc * pDoc(createDoc());
- sw::UndoManager & rUndoManager(pDoc->GetUndoManager());
- IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations());
- SwCursorShell * pShell(pDoc->GetEditShell());
- SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items<RES_FRMATR_BEGIN, RES_FRMATR_END-1>{});
- SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items<RES_GRFATR_BEGIN, RES_GRFATR_END-1>{});
- 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());
-}
-
-void SwUiWriterTest::testTdf86639()
-{
- SwDoc* pDoc = createDoc("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<OUString>(getRun(getParagraph(1), 1), "CharFontName"));
-}
-
-void SwUiWriterTest::testTdf90883TableBoxGetCoordinates()
-{
- SwDoc* pDoc = createDoc("tdf90883.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Down(true);
- SwSelBoxes aBoxes;
- ::GetTableSel( *pWrtShell, aBoxes );
- CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(aBoxes.size()) );
- Point pos ( aBoxes[0]->GetCoordinates() );
- CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(pos.X()) );
- CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(pos.Y()) );
- pos = aBoxes[1]->GetCoordinates();
- CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(pos.X()) );
- CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(pos.Y()) );
-}
-
-void SwUiWriterTest::testEmbeddedDataSource()
-{
- // Initially no data source.
- uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
- uno::Reference<sdb::XDatabaseContext> 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
- load(OUString(DATA_DIRECTORY + OUStringLiteral(u"hash%23path/")), "embedded-data-source.odt");
- CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source"));
-
- // Data source has a table named Sheet1.
- uno::Reference<sdbc::XDataSource> xDataSource(xDatabaseContext->getByName("calc-data-source"), uno::UNO_QUERY);
- CPPUNIT_ASSERT(xDataSource.is());
- auto xConnection = xDataSource->getConnection("", "");
- uno::Reference<container::XNameAccess> xTables =
- css::uno::Reference<css::sdbcx::XTablesSupplier>(
- 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<css::sdbcx::XTablesSupplier>(
- 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<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
- xStorable->store();
-}
-
-void SwUiWriterTest::testUnoCursorPointer()
-{
- auto xDocComponent(loadFromDesktop("private:factory/swriter",
- "com.sun.star.text.TextDocument"));
- auto pxDocDocument(
- dynamic_cast<SwXTextDocument *>(xDocComponent.get()));
- CPPUNIT_ASSERT(pxDocDocument);
- SwDoc* const pDoc(pxDocDocument->GetDocShell()->GetDoc());
- std::unique_ptr<SwNodeIndex> pIdx(new SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1));
- std::unique_ptr<SwPosition> pPos(new SwPosition(*pIdx));
- sw::UnoCursorPointer pCursor(pDoc->CreateUnoCursor(*pPos));
- CPPUNIT_ASSERT(static_cast<bool>(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<bool>(pCursor));
-}
-
-void SwUiWriterTest::testTextTableCellNames()
-{
- sal_Int32 nCol, nRow2;
- SwXTextTable::GetCellPosition( "z1", nCol, nRow2);
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(51), nCol);
- SwXTextTable::GetCellPosition( "AA1", nCol, nRow2);
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(52), nCol);
- SwXTextTable::GetCellPosition( "AB1", nCol, nRow2);
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(53), nCol);
- SwXTextTable::GetCellPosition( "BB1", nCol, nRow2);
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(105), nCol);
-}
-
-void SwUiWriterTest::testShapeAnchorUndo()
-{
- SwDoc* pDoc = createDoc("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);
-}
-
-void SwUiWriterTest::testTdf127635()
-{
- SwDoc* pDoc = createDoc();
-
- SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument *>(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());
-}
-
-void SwUiWriterTest::testDde()
-{
-#if HAVE_FEATURE_UI
- // Type asdf and copy it.
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Insert("asdf");
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 4, /*bBasicCall=*/false);
- uno::Sequence<beans::PropertyValue> 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<sal_uInt32>(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<OUString>(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;
-};
-
-}
-
-//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;
-}
-
-void SwUiWriterTest::testDocModState()
-{
- //creating a new writer document via the XDesktop(to have more shells etc.)
- SwDoc* pDoc = createDoc();
- //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()));
-}
-
-void SwUiWriterTest::testTdf94804()
-{
- //create new writer document
- SwDoc* pDoc = createDoc();
- //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__"));
-}
-
-void SwUiWriterTest::testUnicodeNotationToggle()
-{
- SwDoc* pDoc = createDoc("unicodeAltX.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- OUString sOriginalDocString;
- OUString sDocString;
- OUString sExpectedString;
- uno::Sequence<beans::PropertyValue> 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 );
-}
-
-void SwUiWriterTest::testTdf34957()
-{
- load(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") );
-}
-
-void SwUiWriterTest::testTdf89954()
-{
- SwDoc* pDoc = createDoc("tdf89954.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->EndPara();
- SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument *>(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 <fff9> (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());
-}
-
-void SwUiWriterTest::testTdf89720()
-{
- SwDoc* pDoc = createDoc("tdf89720.odt");
- SwView* pView = pDoc->GetDocShell()->GetView();
- SwPostItMgr* pPostItMgr = pView->GetPostItMgr();
- for (std::unique_ptr<SwSidebarItem> 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());
- }
-}
-
-void SwUiWriterTest::testTdf88986()
-{
- // Create a text shell.
- SwDoc* pDoc = createDoc();
- 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));
-}
-
-void SwUiWriterTest::testTdf87922()
-{
- // Create an SwDrawTextInfo.
- SwDoc* pDoc = createDoc("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<SwTextFrame*>(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<PortionItem> 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
-
-void 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 = createDoc("tdf77014.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
-
- SwTextFrame* pTextFrame = static_cast<SwTextFrame*>(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<SwTextFrame*>(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<SwTextFrame*>(pTextFrame->GetNext());
-
- pTextFrame = static_cast<SwTextFrame*>(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<SwTextFrame*>(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
-}
-
-void SwUiWriterTest::testTdf92648()
-{
- SwDoc* pDoc = createDoc("tdf92648.docx");
- SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
- // Make sure we have ten draw shapes.
- CPPUNIT_ASSERT_EQUAL(sal_Int32(10), 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);
-}
-
-void SwUiWriterTest::testTdf103978_backgroundTextShape()
-{
- SwDoc* pDoc = createDoc("tdf103978_backgroundTextShape.docx");
-
- // there is only one shape. It has an attached textbox
- bool bShapeIsOpaque = getProperty<bool>(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);
-}
-
-void SwUiWriterTest::testTdf96515()
-{
- // Enable hide whitespace mode.
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
- aViewOptions.SetHideWhitespaceMode(true);
- pWrtShell->ApplyViewOptions(aViewOptions);
- CPPUNIT_ASSERT(pWrtShell->GetViewOptions()->IsWhitespaceHidden());
-
- // Insert a new paragraph at the end of the document.
- uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XParagraphAppend> xParagraphAppend(xTextDocument->getText(), uno::UNO_QUERY);
- xParagraphAppend->finishParagraph(uno::Sequence<beans::PropertyValue>());
- calcLayout();
-
- // This was 2, a new page was created for the new paragraph.
- CPPUNIT_ASSERT_EQUAL(1, getPages());
-}
-
-void SwUiWriterTest::testTdf96943()
-{
- // Enable hide whitespace mode.
- SwDoc* pDoc = createDoc("tdf96943.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
- aViewOptions.SetHideWhitespaceMode(true);
- pWrtShell->ApplyViewOptions(aViewOptions);
-
- // Insert a new character at the end of the document.
- pWrtShell->SttEndDoc(/*bStt=*/false);
- pWrtShell->Insert("d");
-
- // This was 2, a new page was created for the new layout line.
- CPPUNIT_ASSERT_EQUAL(1, getPages());
-}
-
-void SwUiWriterTest::testTdf96536()
-{
- // Enable hide whitespace mode.
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
- aViewOptions.SetHideWhitespaceMode(true);
- pWrtShell->ApplyViewOptions(aViewOptions);
- CPPUNIT_ASSERT(pWrtShell->GetViewOptions()->IsWhitespaceHidden());
-
- // Insert a page break and go back to the first page.
- pWrtShell->InsertPageBreak();
- pWrtShell->SttEndDoc(/*bStt=*/true);
- calcLayout();
- sal_Int32 nSingleParaPageHeight = parseDump("/root/page[1]/infos/bounds", "height").toInt32();
- discardDumpedLayout();
-
- // Insert a 2nd paragraph at the end of the first page, so the page height grows at least twice...
- uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XParagraphAppend> xParagraphAppend(xTextDocument->getText(), uno::UNO_QUERY);
- const uno::Reference< text::XTextRange > xInsertPos = getRun(getParagraph(1), 1);
- xParagraphAppend->finishParagraphInsert(uno::Sequence<beans::PropertyValue>(), xInsertPos);
- calcLayout();
- CPPUNIT_ASSERT(parseDump("/root/page[1]/infos/bounds", "height").toInt32() >= 2 * nSingleParaPageHeight);
- discardDumpedLayout();
-
- // ... and then delete the 2nd paragraph, which shrinks the page to the previous size.
- uno::Reference<lang::XComponent> xParagraph(getParagraph(2), uno::UNO_QUERY);
- xParagraph->dispose();
- calcLayout();
- CPPUNIT_ASSERT_EQUAL(nSingleParaPageHeight, parseDump("/root/page[1]/infos/bounds", "height").toInt32());
-}
-
-void SwUiWriterTest::testTdf96479()
-{
- // We want to verify the empty input text field in the bookmark
- static const OUString emptyInputTextField =
- OUStringChar(CH_TXT_ATR_INPUTFIELDSTART) + OUStringChar(CH_TXT_ATR_INPUTFIELDEND);
-
- SwDoc* pDoc = createDoc();
- SwXTextDocument *pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- // So we can clean up all references for reload
- {
- // Append bookmark
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- sw::mark::IMark *pMark =
- rIDMA.makeMark(aPaM, "original",
- IDocumentMarkAccess::MarkType::BOOKMARK,
- ::sw::mark::InsertMode::New);
- CPPUNIT_ASSERT(!pMark->IsExpanded());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
-
- // Get helper objects
- uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<css::lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY);
-
- // Create cursor from bookmark
- uno::Reference<text::XTextContent> xTextContent(xBookmarksSupplier->getBookmarks()->getByName("original"), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xRange = xTextContent->getAnchor();
- uno::Reference<text::XTextCursor> xCursor = xRange->getText()->createTextCursorByRange(xRange);
- CPPUNIT_ASSERT(xCursor->isCollapsed());
-
- // Remove bookmark
- xRange->getText()->removeTextContent(xTextContent);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), rIDMA.getBookmarksCount());
-
- // Insert replacement bookmark
- uno::Reference<text::XTextContent> xBookmarkNew(xFactory->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY);
- uno::Reference<container::XNamed> xBookmarkName(xBookmarkNew, uno::UNO_QUERY);
- xBookmarkName->setName("replacement");
- CPPUNIT_ASSERT(xCursor->isCollapsed());
- // Force bookmark expansion
- xCursor->getText()->insertString(xCursor, ".", true);
- xCursor->getText()->insertTextContent(xCursor, xBookmarkNew, true);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- auto mark = *(rIDMA.getBookmarksBegin());
- CPPUNIT_ASSERT(mark->IsExpanded());
-
- // Create and insert input textfield with some content
- uno::Reference<text::XTextField> xTextField(xFactory->createInstance("com.sun.star.text.TextField.Input"), uno::UNO_QUERY);
- uno::Reference<text::XTextCursor> xCursorNew(xBookmarkNew->getAnchor()->getText()->createTextCursorByRange(xBookmarkNew->getAnchor()));
- CPPUNIT_ASSERT(!xCursorNew->isCollapsed());
- xCursorNew->getText()->insertTextContent(xCursorNew, xTextField, true);
- xBookmarkNew = uno::Reference<text::XTextContent>(xBookmarksSupplier->getBookmarks()->getByName("replacement"), uno::UNO_QUERY);
- xCursorNew = xBookmarkNew->getAnchor()->getText()->createTextCursorByRange(xBookmarkNew->getAnchor());
- CPPUNIT_ASSERT(!xCursorNew->isCollapsed());
-
- // Can't check the actual content of the text node via UNO
- mark = *(rIDMA.getBookmarksBegin());
- CPPUNIT_ASSERT(mark->IsExpanded());
- SwPaM pam(mark->GetMarkStart(), mark->GetMarkEnd());
- // Check for the actual bug, which didn't include CH_TXT_ATR_INPUTFIELDEND in the bookmark
- CPPUNIT_ASSERT_EQUAL(emptyInputTextField, pam.GetText());
- }
-
- {
- // Save and load cycle
- // Actually not needed, but the bug symptom of a missing bookmark
- // occurred because a broken bookmark was saved and loading silently
- // dropped the broken bookmark!
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
- loadURL(aTempFile.GetURL(), nullptr);
- pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- pDoc = pTextDoc->GetDocShell()->GetDoc();
-
- // Lookup "replacement" bookmark
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
- CPPUNIT_ASSERT(xBookmarksSupplier->getBookmarks()->hasByName("replacement"));
-
- uno::Reference<text::XTextContent> xTextContent(xBookmarksSupplier->getBookmarks()->getByName("replacement"), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xRange = xTextContent->getAnchor();
- uno::Reference<text::XTextCursor> xCursor = xRange->getText()->createTextCursorByRange(xRange);
- CPPUNIT_ASSERT(!xCursor->isCollapsed());
-
- // Verify bookmark content via text node / PaM
- auto mark = *(rIDMA.getBookmarksBegin());
- CPPUNIT_ASSERT(mark->IsExpanded());
- SwPaM pam(mark->GetMarkStart(), mark->GetMarkEnd());
- CPPUNIT_ASSERT_EQUAL(emptyInputTextField, pam.GetText());
- }
-}
-
-// If you resave original document the bookmark will be changed from
-//
-// <text:p text:style-name="Standard">
-// <text:bookmark-start text:name="test"/>
-// <text:bookmark-end text:name="test"/>
-// def
-// </text:p>
-//
-// to
-//
-// <text:p text:style-name="Standard">
-// <text:bookmark text:name="test"/>
-// def
-// </text:p>
-//
-void SwUiWriterTest::testBookmarkCollapsed()
-{
- // load document
- SwDoc* pDoc = createDoc("collapsed_bookmark.odt");
- CPPUNIT_ASSERT(pDoc);
-
- // save original document
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
-
- // load only content.xml from the resaved document
- if (xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(), "content.xml"))
- {
- const OString aPath("/office:document-content/office:body/office:text/text:p");
-
- const int pos1 = getXPathPosition(pXmlDoc, aPath, "bookmark");
- CPPUNIT_ASSERT_EQUAL(0, pos1); // found, and it is first
-
- CPPUNIT_ASSERT_ASSERTION_FAIL(getXPathPosition(pXmlDoc, aPath, "bookmark-start")); // not found
- CPPUNIT_ASSERT_ASSERTION_FAIL(getXPathPosition(pXmlDoc, aPath, "bookmark-end")); // not found
- }
-}
-
-// 1. Open a new writer document
-// 2. Enter the text "abcdef"
-// 3. Select "abc"
-// 4. Insert a bookmark on "abc" using Insert->Bookmark. Name the bookmark "test".
-// 5. Open the navigator (F5)
-// Select the bookmark "test" using the navigator.
-// 6. Hit Del, thus deleting "abc" (The bookmark "test" is still there).
-// 7. Save the document:
-// <text:p text:style-name="Standard">
-// <text:bookmark-start text:name="test"/>
-// <text:bookmark-end text:name="test"/>
-// def
-// </text:p>
-//
-void SwUiWriterTest::testRemoveBookmarkText()
-{
- // create document
- {
- // create a text document with "abcdef"
- SwDoc* pDoc = createDoc();
- SwXTextDocument *pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- {
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
- pDoc->getIDocumentContentOperations().InsertString(aPaM, "abcdef");
- }
-
- // mark "abc" with "testBookmark" bookmark
- {
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
-
- lcl_selectCharacters(aPaM, 0, 3);
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- sw::mark::IMark *pMark =
- rIDMA.makeMark(aPaM, "testBookmark",
- IDocumentMarkAccess::MarkType::BOOKMARK,
- ::sw::mark::InsertMode::New);
-
- // verify
- CPPUNIT_ASSERT(pMark->IsExpanded());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- }
-
- // remove text marked with bookmark
- {
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
-
- lcl_selectCharacters(aPaM, 0, 3);
- pDoc->getIDocumentContentOperations().DeleteRange(aPaM);
-
- // verify: bookmark is still exist
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- }
- }
-
- // save document
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
-
- // load only content.xml from the resaved document
- if (xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(), "content.xml"))
- {
- const OString aPath("/office:document-content/office:body/office:text/text:p");
-
- CPPUNIT_ASSERT_ASSERTION_FAIL(getXPathPosition(pXmlDoc, aPath, "bookmark")); // not found
- const int pos2 = getXPathPosition(pXmlDoc, aPath, "bookmark-start");
- const int pos3 = getXPathPosition(pXmlDoc, aPath, "bookmark-end");
-
- CPPUNIT_ASSERT_EQUAL(0, pos2); // found, and it is first
- CPPUNIT_ASSERT_EQUAL(1, pos3); // found, and it is second
- }
-}
-
-// 1. Open a new writer document
-// 2. Enter the text "abcdef"
-// 3. Select "abc"
-// 4. Insert a bookmark on "abc" using Insert->Bookmark. Name the bookmark "test".
-// 5. Open the navigator (F5)
-// Select the bookmark "test" using the navigator.
-// 6. Hit Del, thus deleting "abc" (The bookmark "test" is still there).
-// 7. Call our macro
-//
-// Sub Main
-// bookmark = ThisComponent.getBookmarks().getByName("test")
-// bookmark.getAnchor().setString("abc")
-// End Sub
-//
-// The text "abc" gets inserted inside the bookmark "test", and the document now contains the string "abcdef".
-// 7. Save the document:
-// <text:p text:style-name="Standard">
-// <text:bookmark-start text:name="test"/>
-// abc
-// <text:bookmark-end text:name="test"/>
-// def
-// </text:p>
-//
-void SwUiWriterTest::testRemoveBookmarkTextAndAddNew()
-{
- // create document
- {
- // create a text document with "abcdef"
- SwDoc* pDoc = createDoc();
- SwXTextDocument *pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- {
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
- pDoc->getIDocumentContentOperations().InsertString(aPaM, "abcdef");
- }
-
- // mark "abc" with "testBookmark" bookmark
- {
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
-
- lcl_selectCharacters(aPaM, 0, 3);
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- sw::mark::IMark *pMark =
- rIDMA.makeMark(aPaM, "testBookmark",
- IDocumentMarkAccess::MarkType::BOOKMARK,
- ::sw::mark::InsertMode::New);
-
- // verify
- CPPUNIT_ASSERT(pMark->IsExpanded());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- }
-
- // remove text marked with bookmark
- {
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
-
- lcl_selectCharacters(aPaM, 0, 3);
- pDoc->getIDocumentContentOperations().DeleteRange(aPaM);
-
- // verify: bookmark is still exist
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- }
-
- // write "abc" to area marked with "testBookmark" bookmark
- {
- // Get helper objects
- uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
-
- // Create cursor from bookmark
- uno::Reference<text::XTextContent> xTextContent(xBookmarksSupplier->getBookmarks()->getByName("testBookmark"), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xRange = xTextContent->getAnchor();
- CPPUNIT_ASSERT_EQUAL(OUString(""), xRange->getString());
-
- // write "abc"
- xRange->setString("abc");
-
- // verify: bookmark is still exist
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- }
- }
-
- // save document
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
-
- // load only content.xml from the resaved document
- if (xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(), "content.xml"))
- {
- const OString aPath("/office:document-content/office:body/office:text/text:p");
-
- CPPUNIT_ASSERT_ASSERTION_FAIL(getXPathPosition(pXmlDoc, aPath, "bookmark")); // not found
- const int pos2 = getXPathPosition(pXmlDoc, aPath, "bookmark-start");
- const int pos3 = getXPathPosition(pXmlDoc, aPath, "text");
- const int pos4 = getXPathPosition(pXmlDoc, aPath, "bookmark-end");
-
- CPPUNIT_ASSERT_EQUAL(0, pos2);
- CPPUNIT_ASSERT_EQUAL(1, pos3);
- CPPUNIT_ASSERT_EQUAL(2, pos4);
- }
-}
-
-// 1. Load document:
-// <text:p text:style-name="Standard">
-// <text:bookmark-start text:name="test"/>
-// <text:bookmark-end text:name="test"/>
-// def
-// </text:p>
-//
-// 2. Call our macro
-//
-// Sub Main
-// bookmark = ThisComponent.getBookmarks().getByName("test")
-// bookmark.getAnchor().setString("abc")
-// End Sub
-//
-// The text "abc" gets inserted inside the bookmark "test", and the document now contains the string "abcdef".
-// 3. Save the document:
-// <text:p text:style-name="Standard">
-// <text:bookmark text:name="test"/>
-// abcdef
-// </text:p>
-//
-void SwUiWriterTest::testRemoveBookmarkTextAndAddNewAfterReload()
-{
- // load document
- SwDoc* pDoc = createDoc("collapsed_bookmark.odt");
- CPPUNIT_ASSERT(pDoc);
-
- // write "abc" to area marked with "testBookmark" bookmark
- {
- // Get helper objects
- uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
-
- // Create cursor from bookmark
- uno::Reference<text::XTextContent> xTextContent(xBookmarksSupplier->getBookmarks()->getByName("test"), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xRange = xTextContent->getAnchor();
- CPPUNIT_ASSERT_EQUAL(OUString(""), xRange->getString());
-
- // write "abc"
- xRange->setString("abc");
-
- // verify: bookmark is still exist
- IDocumentMarkAccess &rIDMA = *pDoc->getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rIDMA.getBookmarksCount());
- }
-
- // save original document
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
-
- // load only content.xml from the resaved document
- if (xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(), "content.xml"))
- {
- const OString aPath("/office:document-content/office:body/office:text/text:p");
-
- const int pos1 = getXPathPosition(pXmlDoc, aPath, "bookmark");
- const int pos2 = getXPathPosition(pXmlDoc, aPath, "text");
-
- CPPUNIT_ASSERT_EQUAL(0, pos1);
- CPPUNIT_ASSERT_EQUAL(1, pos2);
-
- CPPUNIT_ASSERT_ASSERTION_FAIL(getXPathPosition(pXmlDoc, aPath, "bookmark-start")); // not found
- CPPUNIT_ASSERT_ASSERTION_FAIL(getXPathPosition(pXmlDoc, aPath, "bookmark-end")); // not found
- }
-}
-
-void SwUiWriterTest::testTdf96961()
-{
- // Insert a page break.
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->InsertPageBreak();
-
- // Enable hide whitespace mode.
- SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
- aViewOptions.SetHideWhitespaceMode(true);
- pWrtShell->ApplyViewOptions(aViewOptions);
-
- calcLayout();
-
- // Assert that the height of the last page is larger than the height of other pages.
- sal_Int32 nOther = parseDump("/root/page[1]/infos/bounds", "height").toInt32();
- sal_Int32 nLast = parseDump("/root/page[2]/infos/bounds", "height").toInt32();
- CPPUNIT_ASSERT(nLast > nOther);
-}
-
-void SwUiWriterTest::testTdf88453()
-{
- createDoc("tdf88453.odt");
- calcLayout();
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // This was 0: the table does not fit the first page, but it wasn't split
- // to continue on the second page.
- assertXPath(pXmlDoc, "/root/page[2]/body/tab", 1);
-}
-
-void SwUiWriterTest::testTdf88453Table()
-{
- createDoc("tdf88453-table.odt");
- calcLayout();
- // This was 2: layout could not split the large outer table in the document
- // into 3 pages.
- CPPUNIT_ASSERT_EQUAL(3, getPages());
-}
-
-namespace
-{
-
-int checkShells(const SwDocShell* pSource, const SwDocShell* pDestination)
-{
- return int(SfxClassificationHelper::CheckPaste(pSource->getDocProperties(), pDestination->getDocProperties()));
-}
-
-}
-
-void SwUiWriterTest::testClassificationPaste()
-{
- SwDocShell* pSourceShell = createDoc()->GetDocShell();
- uno::Reference<lang::XComponent> xSourceComponent = mxComponent;
- mxComponent.clear();
-
- SwDocShell* pDestinationShell = createDoc()->GetDocShell();
-
- // Not classified source, not classified destination.
- CPPUNIT_ASSERT_EQUAL(int(SfxClassificationCheckPasteResult::None), checkShells(pSourceShell, pDestinationShell));
-
- // Classified source, not classified destination.
- uno::Sequence<beans::PropertyValue> aInternalOnly = comphelper::InitPropertySequence({{"Name", uno::makeAny(OUString("Internal Only"))}});
- dispatchCommand(xSourceComponent, ".uno:ClassificationApply", aInternalOnly);
- CPPUNIT_ASSERT_EQUAL(int(SfxClassificationCheckPasteResult::TargetDocNotClassified), checkShells(pSourceShell, pDestinationShell));
-
- // Classified source and classified destination -- internal only has a higher level than confidential.
- uno::Sequence<beans::PropertyValue> aConfidential = comphelper::InitPropertySequence({{"Name", uno::makeAny(OUString("Confidential"))}});
- dispatchCommand(mxComponent, ".uno:ClassificationApply", aConfidential);
- CPPUNIT_ASSERT_EQUAL(int(SfxClassificationCheckPasteResult::DocClassificationTooLow), checkShells(pSourceShell, pDestinationShell));
-
- xSourceComponent->dispose();
-}
-
-void SwUiWriterTest::testSmallCaps()
-{
- // Create a document, add some characters and select them.
- createDoc();
- SwDoc* pDoc = createDoc();
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
- pWrtShell->Insert("text");
- pWrtShell->SelAll();
-
- // Dispatch the command to make them formatted small capitals.
- dispatchCommand(mxComponent, ".uno:SmallCaps", {});
-
- // This was css::style::CaseMap::NONE as the shell didn't handle the command.
- CPPUNIT_ASSERT_EQUAL(css::style::CaseMap::SMALLCAPS, getProperty<sal_Int16>(getRun(getParagraph(1), 1), "CharCaseMap"));
-}
-
-void SwUiWriterTest::testTdf98987()
-{
- createDoc("tdf98987.docx");
- calcLayout();
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[2]/SdrObject", "name", "Rectangle 1");
- sal_Int32 nRectangle1 = getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[2]/bounds", "top").toInt32();
- assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[1]/SdrObject", "name", "Rectangle 2");
- sal_Int32 nRectangle2 = getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[1]/bounds", "top").toInt32();
- CPPUNIT_ASSERT_GREATER(nRectangle1, nRectangle2);
-
- assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[3]/SdrObject", "name", "Rectangle 3");
- sal_Int32 nRectangle3 = getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[3]/bounds", "top").toInt32();
- // This failed: the 3rd rectangle had a smaller "top" value than the 2nd one, it even overlapped with the 1st one.
- CPPUNIT_ASSERT_GREATER(nRectangle2, nRectangle3);
-}
-
-void SwUiWriterTest::testTdf99004()
-{
- createDoc("tdf99004.docx");
- calcLayout();
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_Int32 nTextbox1Top = getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/bounds", "top").toInt32();
- sal_Int32 nTextBox1Height = getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/bounds", "height").toInt32();
- sal_Int32 nTextBox1Bottom = nTextbox1Top + nTextBox1Height;
-
- assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[1]/SdrObject", "name", "Rectangle 2");
- sal_Int32 nRectangle2Top = getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[1]/bounds", "top").toInt32();
- // This was 3291 and 2531, should be now around 2472 and 2531, i.e. the two rectangles should not overlap anymore.
- CPPUNIT_ASSERT(nTextBox1Bottom < nRectangle2Top);
-}
-
-void SwUiWriterTest::testTdf84695()
-{
- SwDoc* pDoc = createDoc("tdf84695.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
- SdrObject* pObject = pPage->GetObj(1);
- SwContact* pTextBox = static_cast<SwContact*>(pObject->GetUserCall());
- // First, make sure that pTextBox is a fly frame (textbox of a shape).
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_FLYFRMFMT), pTextBox->GetFormat()->Which());
-
- // Then select it.
- pWrtShell->SelectObj(Point(), 0, pObject);
-
- // Now Enter + a key should add some text.
- SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pXTextDocument);
- pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN);
- pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'a', 0);
- Scheduler::ProcessEventsToIdle();
-
- uno::Reference<text::XTextRange> xShape(getShape(1), uno::UNO_QUERY);
- // This was empty, Enter did not start the fly frame edit mode.
- CPPUNIT_ASSERT_EQUAL(OUString("a"), xShape->getString());
-}
-
-void SwUiWriterTest::testTdf84695NormalChar()
-{
- SwDoc* pDoc = createDoc("tdf84695.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
- SdrObject* pObject = pPage->GetObj(1);
- SwContact* pTextBox = static_cast<SwContact*>(pObject->GetUserCall());
- // First, make sure that pTextBox is a fly frame (textbox of a shape).
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_FLYFRMFMT), pTextBox->GetFormat()->Which());
-
- // Then select it.
- pWrtShell->SelectObj(Point(), 0, pObject);
-
- // Now pressing 'a' should add a character.
- SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pXTextDocument);
- pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'a', 0);
- Scheduler::ProcessEventsToIdle();
-
- uno::Reference<text::XTextRange> xShape(getShape(1), uno::UNO_QUERY);
- // This was empty, pressing a normal character did not start the fly frame edit mode.
- CPPUNIT_ASSERT_EQUAL(OUString("a"), xShape->getString());
-}
-
-void SwUiWriterTest::testTdf84695Tab()
-{
- SwDoc* pDoc = createDoc("tdf84695-tab.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
- SdrObject* pObject = pPage->GetObj(0);
- SwContact* pShape = static_cast<SwContact*>(pObject->GetUserCall());
- // First, make sure that pShape is a draw shape.
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_DRAWFRMFMT), pShape->GetFormat()->Which());
-
- // Then select it.
- pWrtShell->SelectObj(Point(), 0, pObject);
-
- // Now pressing 'tab' should jump to the other shape.
- SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pXTextDocument);
- pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB);
- pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_TAB);
- Scheduler::ProcessEventsToIdle();
-
- // And finally make sure the selection has changed.
- const SdrMarkList& rMarkList = pWrtShell->GetDrawView()->GetMarkedObjectList();
- SwContact* pOtherShape = static_cast<SwContact*>(rMarkList.GetMark(0)->GetMarkedSdrObj()->GetUserCall());
- // This failed, 'tab' didn't do anything -> the selected shape was the same.
- CPPUNIT_ASSERT(pOtherShape != pShape);
-}
-
-void SwUiWriterTest::testTableStyleUndo()
-{
- SwDoc* pDoc = createDoc();
- sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
-
- sal_Int32 nStyleCount = pDoc->GetTableStyles().size();
- SwTableAutoFormat* pStyle = pDoc->MakeTableStyle("Test Style");
- SvxBrushItem aBackground(Color(0xFF00FF), RES_BACKGROUND );
- pStyle->GetBoxFormat(0).SetBackground(aBackground);
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount + 1);
- rUndoManager.Undo();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount);
- rUndoManager.Redo();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount + 1);
- // check if attributes are preserved
- pStyle = pDoc->GetTableStyles().FindAutoFormat(u"Test Style");
- CPPUNIT_ASSERT(pStyle);
- CPPUNIT_ASSERT(bool(pStyle->GetBoxFormat(0).GetBackground() == aBackground));
-
- pDoc->DelTableStyle("Test Style");
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount);
- rUndoManager.Undo();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount + 1);
- pStyle = pDoc->GetTableStyles().FindAutoFormat(u"Test Style");
- // check if attributes are preserved
- CPPUNIT_ASSERT(pStyle);
- CPPUNIT_ASSERT(bool(pStyle->GetBoxFormat(0).GetBackground() == aBackground));
- rUndoManager.Redo();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount);
-
- // undo delete so we can replace the style
- rUndoManager.Undo();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount +1 );
- pStyle = pDoc->GetTableStyles().FindAutoFormat(u"Test Style");
- CPPUNIT_ASSERT(pStyle);
- CPPUNIT_ASSERT(bool(pStyle->GetBoxFormat(0).GetBackground() == aBackground));
-
- SwTableAutoFormat aNewStyle("Test Style2");
- SvxBrushItem aBackground2(Color(0x00FF00), RES_BACKGROUND);
- aNewStyle.GetBoxFormat(0).SetBackground(aBackground2);
-
- pDoc->ChgTableStyle("Test Style", aNewStyle);
- pStyle = pDoc->GetTableStyles().FindAutoFormat(u"Test Style");
- CPPUNIT_ASSERT(pStyle);
- CPPUNIT_ASSERT(bool(pStyle->GetBoxFormat(0).GetBackground() == aBackground2));
- rUndoManager.Undo();
- pStyle = pDoc->GetTableStyles().FindAutoFormat(u"Test Style");
- CPPUNIT_ASSERT(pStyle);
- CPPUNIT_ASSERT(bool(pStyle->GetBoxFormat(0).GetBackground() == aBackground));
- rUndoManager.Redo();
- pStyle = pDoc->GetTableStyles().FindAutoFormat(u"Test Style");
- CPPUNIT_ASSERT(pStyle);
- CPPUNIT_ASSERT(bool(pStyle->GetBoxFormat(0).GetBackground() == aBackground2));
-}
-
-void SwUiWriterTest::testRedlineCopyPaste()
-{
- // regressed in tdf#106746
- SwDoc* pDoc = createDoc();
-
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwPaM aPaM(aIdx);
-
- pDoc->getIDocumentContentOperations().InsertString(aPaM, "abzdezgh");
- SwTextNode* pTextNode = aPaM.GetNode().GetTextNode();
-
- // Turn on track changes, make changes, turn off track changes
- uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
- lcl_selectCharacters(aPaM, 2, 3);
- pDoc->getIDocumentContentOperations().ReplaceRange(aPaM, "c", false);
- lcl_selectCharacters(aPaM, 6, 7);
- pDoc->getIDocumentContentOperations().ReplaceRange(aPaM, "f", false);
- xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(false));
-
- // Create the clipboard document.
- SwDoc aClipboard;
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
-
- // Select the whole content, copy, delete the original and paste the copied content
- pWrtShell->SelAll();
- pWrtShell->Copy(aClipboard);
- pWrtShell->Delete();
- pWrtShell->Paste(aClipboard);
-
- // With the bug this is "abzcdefgh", ie. contains the first deleted piece, too
- CPPUNIT_ASSERT_EQUAL(OUString("abcdefgh"), pTextNode->GetText());
-}
-
-CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf134436)
-{
- load(DATA_DIRECTORY, "tdf134436.fodt");
-
- SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pXTextDocument);
- SwDoc * pDoc = pXTextDocument->GetDocShell()->GetDoc();
- CPPUNIT_ASSERT(pDoc);
- SwWrtShell * pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- CPPUNIT_ASSERT(pWrtShell);
-
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
- uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
-
- // select all 3 times, table at the start
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
- dispatchCommand(mxComponent, ".uno:SelectAll", {});
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- // the stupid SwXTextView::getString doesn't work "for symmetry" so use CursorShell
- CPPUNIT_ASSERT_EQUAL(OUString("a\nb\n"), pWrtShell->GetCursor()->GetText());
-
- // first, the section doesn't get deleted
- dispatchCommand(mxComponent, ".uno:Delete", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), pWrtShell->GetCursor()->GetText());
-
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("a\nb\n"), pWrtShell->GetCursor()->GetText());
-
- // second, the section does get deleted because point is at the end
- dispatchCommand(mxComponent, ".uno:Delete", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), pWrtShell->GetCursor()->GetText());
-
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("a\nb\n"), pWrtShell->GetCursor()->GetText());
-
- // the problem was that the section was not deleted on Redo
- dispatchCommand(mxComponent, ".uno:Redo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), pWrtShell->GetCursor()->GetText());
-
- dispatchCommand(mxComponent, ".uno:Undo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString("a\nb\n"), pWrtShell->GetCursor()->GetText());
-
- dispatchCommand(mxComponent, ".uno:Redo", {});
- Scheduler::ProcessEventsToIdle();
-
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSections->getCount());
- CPPUNIT_ASSERT_EQUAL(OUString(""), pWrtShell->GetCursor()->GetText());
-}
-
-void SwUiWriterTest::testTdf135260()
-{
- SwDoc* pDoc = createDoc();
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
- pWrtShell->Insert("test");
-
- // Turn on track changes
- uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
-
- for(int i = 0; i < 4; i++) {
- pWrtShell->DelLeft();
- }
-
- 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:
- // - Actual : tes
- CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString());
-}
-
-void SwUiWriterTest::testRedlineParam()
-{
- // Create a document with minimal content.
- SwDoc* pDoc = createDoc();
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
- pWrtShell->Insert("middle");
-
- // Turn on track changes, and add changes to the start and end of the document.
- uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
- pWrtShell->StartOfSection();
- pWrtShell->Insert("aaa");
- pWrtShell->EndOfSection();
- pWrtShell->Insert("zzz");
-
- const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
- CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(2), rTable.size());
-
- // Select the first redline.
- pWrtShell->StartOfSection();
- uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
- {
- {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(rTable[0]->GetId()))}
- }));
- dispatchCommand(mxComponent, ".uno:NextTrackedChange", aPropertyValues);
- Scheduler::ProcessEventsToIdle();
- SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false);
- // This failed: the parameter wasn't handled so the next change (zzz) was
- // selected, not the first one (aaa).
- CPPUNIT_ASSERT_EQUAL(OUString("aaa"), pShellCursor->GetText());
-
- // Select the second redline.
- pWrtShell->StartOfSection();
- aPropertyValues = comphelper::InitPropertySequence(
- {
- {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(rTable[1]->GetId()))}
- });
- dispatchCommand(mxComponent, ".uno:NextTrackedChange", aPropertyValues);
- Scheduler::ProcessEventsToIdle();
- pShellCursor = pWrtShell->getShellCursor(false);
- CPPUNIT_ASSERT_EQUAL(OUString("zzz"), pShellCursor->GetText());
-
- // Move the cursor to the start again, and reject the second change.
- pWrtShell->StartOfSection();
- aPropertyValues = comphelper::InitPropertySequence(
- {
- {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(rTable[1]->GetId()))}
- });
- dispatchCommand(mxComponent, ".uno:RejectTrackedChange", aPropertyValues);
- Scheduler::ProcessEventsToIdle();
- pShellCursor = pWrtShell->getShellCursor(false);
-
- // This was 'middlezzz', the uno command rejected the redline under the
- // cursor, instead of the requested one.
- CPPUNIT_ASSERT_EQUAL(OUString("aaamiddle"), pShellCursor->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
-}
-
-void SwUiWriterTest::testRedlineViewAuthor()
-{
- // Test that setting an author at an SwView level has effect.
-
- // Create a document with minimal content.
- SwDoc* pDoc = createDoc();
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
- pWrtShell->Insert("middle");
- SwView* pView = pDocShell->GetView();
- const OUString aAuthor("A U. Thor");
- pView->SetRedlineAuthor(aAuthor);
- pDocShell->SetView(pView);
-
- // Turn on track changes, and add changes to the start of the document.
- uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
- pWrtShell->StartOfSection();
- pWrtShell->Insert("aaa");
-
- // Now assert that SwView::SetRedlineAuthor() had an effect.
- const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
- CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(1), rTable.size());
- SwRangeRedline* pRedline = rTable[0];
- // This was 'Unknown Author' instead of 'A U. Thor'.
- CPPUNIT_ASSERT_EQUAL(aAuthor, pRedline->GetAuthorString());
-
- // Insert a comment and assert that SwView::SetRedlineAuthor() affects this as well.
- dispatchCommand(mxComponent, ".uno:.uno:InsertAnnotation", {});
- uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
- uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
- uno::Reference<beans::XPropertySet> xField(xFields->nextElement(), uno::UNO_QUERY);
- // This was 'Unknown Author' instead of 'A U. Thor'.
- CPPUNIT_ASSERT_EQUAL(aAuthor, xField->getPropertyValue("Author").get<OUString>());
-
- //Reset the redline author after using it, otherwise, it might interfere with other unittests
- pView->SetRedlineAuthor("Unknown Author");
- pDocShell->SetView(pView);
-}
-
-void SwUiWriterTest::testTdf91292()
-{
- createDoc("tdf91292_paraBackground.docx");
- uno::Reference<beans::XPropertySet> xPropertySet(getParagraph(1), uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Solid background color", drawing::FillStyle_SOLID, getProperty<drawing::FillStyle>(xPropertySet, "FillStyle"));
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Background Color", static_cast<sal_Int32>(0x5C2D91), getProperty<sal_Int32>(xPropertySet, "FillColor"));
-
- // remove background color
- xPropertySet->setPropertyValue("FillStyle", uno::makeAny( drawing::FillStyle_NONE));
-
- // Save it and load it back.
- reload("Office Open XML Text", "tdf91292_paraBackground.docx");
-
- xPropertySet.set( getParagraph(1), uno::UNO_QUERY );
- CPPUNIT_ASSERT_EQUAL_MESSAGE("No background color", drawing::FillStyle_NONE, getProperty<drawing::FillStyle>(xPropertySet, "FillStyle"));
-}
-
-void SwUiWriterTest::testTdf78727()
-{
- SwDoc* pDoc = createDoc("tdf78727.docx");
- SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
- // This was 1: make sure we don't loose the TextBox anchored inside the
- // table that is moved inside a text frame.
- CPPUNIT_ASSERT(SwTextBoxHelper::getCount(pPage) > 1);
-}
-
-void SwUiWriterTest::testRedlineTimestamp()
-{
- // Test that a redline timestamp's second is not always 0.
-
- // Create a document with minimal content.
- SwDoc* pDoc = createDoc();
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
- pWrtShell->Insert("middle");
-
- // Turn on track changes, and add changes to the start and to the end of
- // the document.
- uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
- pWrtShell->StartOfSection();
- pWrtShell->Insert("aaa");
- osl::Thread::wait(std::chrono::seconds(1));
- pWrtShell->EndOfSection();
- pWrtShell->Insert("zzz");
-
- // Inserting additional characters at the start changed the table size to
- // 3, i.e. the first and the second "aaa" wasn't combined.
- pWrtShell->StartOfSection();
- pWrtShell->Insert("aaa");
-
- // Now assert that at least one of the seconds are not 0.
- const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
- if (rTable.size() >= 2 && rTable[0]->GetRedlineData().GetTimeStamp().GetMin() != rTable[1]->GetRedlineData().GetTimeStamp().GetMin())
- // The relatively rare case when waiting for a second also changes the minute.
- return;
-
- CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(2), rTable.size());
- sal_uInt16 nSec1 = rTable[0]->GetRedlineData().GetTimeStamp().GetSec();
- sal_uInt16 nSec2 = rTable[1]->GetRedlineData().GetTimeStamp().GetSec();
- // This failed, seconds was always 0.
- CPPUNIT_ASSERT(nSec1 != 0 || nSec2 != 0);
-}
-
-void SwUiWriterTest::testCursorWindows()
-{
- // Create a new document with one window.
- SwDoc* pDoc = createDoc();
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell1 = pDocShell->GetWrtShell();
-
- // Create a second view and type something.
- pDocShell->GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON | SfxCallMode::RECORD);
- SwWrtShell* pWrtShell2 = pDocShell->GetWrtShell();
- OUString aText("foo");
- pWrtShell2->Insert(aText);
-
- // Assert that only the cursor of the actual window move, not other cursors.
- SwShellCursor* pShellCursor1 = pWrtShell1->getShellCursor(false);
- SwShellCursor* pShellCursor2 = pWrtShell2->getShellCursor(false);
- // This was 3, not 0 -- cursor of the other window moved.
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), pShellCursor1->Start()->nContent.GetIndex());
- CPPUNIT_ASSERT_EQUAL(aText.getLength(), pShellCursor2->Start()->nContent.GetIndex());
-}
-
-void SwUiWriterTest::testLandscape()
-{
- // Set page orientation to landscape.
- SwDoc* pDoc = createDoc();
- uno::Sequence<beans::PropertyValue> aPropertyValues( comphelper::InitPropertySequence({
- { "AttributePage.Landscape", uno::Any(true) }
- }));
- dispatchCommand(mxComponent, ".uno:AttributePage", aPropertyValues);
- Scheduler::ProcessEventsToIdle();
-
- // Assert that the document model was modified.
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
- size_t nPageDesc = pWrtShell->GetCurPageDesc();
- // This failed, page was still portrait.
- CPPUNIT_ASSERT(pWrtShell->GetPageDesc(nPageDesc).GetLandscape());
-}
-
-void SwUiWriterTest::testTdf95699()
-{
- // Open the document with single FORMCHECKBOX field, select all and copy to clipboard
- // then check that clipboard contains the FORMCHECKBOX in text body.
- // Previously that failed.
- SwDoc* pDoc = createDoc("tdf95699.odt");
- IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
- SwDoc aClipboard;
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->SelAll();
- pWrtShell->Copy(aClipboard);
- pMarkAccess = aClipboard.getIDocumentMarkAccess();
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
- ::sw::mark::IFieldmark* pFieldMark = pMarkAccess->getFieldmarkAfter(SwPosition(pDoc->GetNodes().GetEndOfExtras()));
- CPPUNIT_ASSERT_EQUAL(OUString("vnd.oasis.opendocument.field.FORMCHECKBOX"), pFieldMark->GetFieldname());
-}
-
-void SwUiWriterTest::testTdf104032()
-{
- // Open the document with FORMCHECKBOX field, select it and copy to clipboard
- // Go to end of document and paste it, then undo
- // Previously that asserted in debug build.
- SwDoc* pDoc = createDoc("tdf104032.odt");
- sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
- SwDoc aClipboard;
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->StartOfSection();
- pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false);
- pWrtShell->Copy(aClipboard);
- pWrtShell->EndOfSection();
- pWrtShell->Paste(aClipboard);
- rUndoManager.Undo();
-}
-
-void SwUiWriterTest::testTdf104440()
-{
- createDoc("tdf104440.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, "//page[2]/body/txt/anchored");
- xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval;
- // This was 0: both Text Frames in the document were anchored to a
- // paragraph on page 1, while we expect that the second Text Frame is
- // anchored to a paragraph on page 2.
- CPPUNIT_ASSERT_EQUAL(1, xmlXPathNodeSetGetLength(pXmlNodes));
- xmlXPathFreeObject(pXmlObj);
-}
-
-void SwUiWriterTest::testTdf104425()
-{
- createDoc("tdf104425.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // The document contains one top-level 1-cell table with minimum row height set to 70 cm,
- // and the cell contents does not exceed the minimum row height.
- // It should span over 3 pages.
- assertXPath(pXmlDoc, "//page", 3);
- sal_Int32 nHeight1 = getXPath(pXmlDoc, "//page[1]/body/tab/row/infos/bounds", "height").toInt32();
- sal_Int32 nHeight2 = getXPath(pXmlDoc, "//page[2]/body/tab/row/infos/bounds", "height").toInt32();
- sal_Int32 nHeight3 = getXPath(pXmlDoc, "//page[3]/body/tab/row/infos/bounds", "height").toInt32();
- double fSumHeight_mm = (nHeight1 + nHeight2 + nHeight3) * 25.4 / 1440.0;
- CPPUNIT_ASSERT_DOUBLES_EQUAL(700.0, fSumHeight_mm, 0.05);
-}
-
-// accepting change tracking gets stuck on change
-void SwUiWriterTest::testTdf104814()
-{
- SwDoc* const pDoc1(createDoc("tdf104814.docx"));
-
- SwEditShell* const pEditShell(pDoc1->GetEditShell());
-
- // accept all redlines
- while(pEditShell->GetRedlineCount())
- pEditShell->AcceptRedline(0);
-}
-
-void SwUiWriterTest::testTdf66405()
-{
- // Imported formula should have zero margins
- createDoc("tdf66405.docx");
- uno::Reference<text::XTextEmbeddedObjectsSupplier> xEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xEmbeddedObjects = xEmbeddedObjectsSupplier->getEmbeddedObjects();
- uno::Reference<beans::XPropertySet> xFormula;
- xEmbeddedObjects->getByName(xEmbeddedObjects->getElementNames()[0]) >>= xFormula;
- uno::Reference<beans::XPropertySet> xComponent;
- xFormula->getPropertyValue("Component") >>= xComponent;
-
- // Test embedded object's margins
- sal_Int32 nLeftMargin, nRightMargin, nTopMargin, nBottomMargin;
- xFormula->getPropertyValue("LeftMargin") >>= nLeftMargin;
- xFormula->getPropertyValue("RightMargin") >>= nRightMargin;
- xFormula->getPropertyValue("TopMargin") >>= nTopMargin;
- xFormula->getPropertyValue("BottomMargin") >>= nBottomMargin;
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nLeftMargin);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRightMargin);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nTopMargin);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nBottomMargin);
-
- // Test embedded object component's margins
- xComponent->getPropertyValue("LeftMargin") >>= nLeftMargin;
- xComponent->getPropertyValue("RightMargin") >>= nRightMargin;
- xComponent->getPropertyValue("TopMargin") >>= nTopMargin;
- xComponent->getPropertyValue("BottomMargin") >>= nBottomMargin;
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nLeftMargin);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRightMargin);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nTopMargin);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nBottomMargin);
-}
-
-void SwUiWriterTest::testTdf35021_tabOverMarginDemo()
-{
-#if HAVE_MORE_FONTS
- createDoc("tdf35021_tabOverMarginDemo.doc");
- calcLayout();
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // Tabs should go past the margin @ ~3381
- sal_Int32 nMargin = getXPath(pXmlDoc, "//body/txt[1]/infos/prtBounds", "width").toInt32();
- // left tab was 3381 because it got its own full line
- sal_Int32 nWidth = getXPath(pXmlDoc, "//Text[@nType='PortionType::TabLeft']", "nWidth").toInt32();
- CPPUNIT_ASSERT_MESSAGE("Left Tab width is ~4479", nMargin < nWidth);
- // center tab was 842
- nWidth = getXPath(pXmlDoc, "//Text[@nType='PortionType::TabCenter']", "nWidth").toInt32();
- CPPUNIT_ASSERT_MESSAGE("Center Tab width is ~3521", nMargin < nWidth);
- // right tab was probably the same as center tab.
- nWidth = getXPath(pXmlDoc, "//Text[@nType='PortionType::TabRight']", "nWidth").toInt32();
- CPPUNIT_ASSERT_MESSAGE("Right Tab width is ~2907", sal_Int32(2500) < nWidth);
- // decimal tab was 266
- nWidth = getXPath(pXmlDoc, "//Text[@nType='PortionType::TabDecimal']", "nWidth").toInt32();
- CPPUNIT_ASSERT_MESSAGE("Decimal Tab width is ~4096", nMargin < nWidth);
-#endif
-}
-
-void SwUiWriterTest::testTdf106701_tabOverMarginAutotab()
-{
- createDoc("tdf106701_tabOverMarginAutotab.doc");
- calcLayout();
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // The right margin is ~3378
- sal_Int32 nRightMargin = getXPath(pXmlDoc, "//body/txt[1]/infos/prtBounds", "width").toInt32();
- // Automatic tabstops should never be affected by tabOverMargin compatibility
- // The 1st line's width previously was ~9506
- sal_Int32 nWidth = getXPath(pXmlDoc, "//LineBreak[1]", "nWidth").toInt32();
- CPPUNIT_ASSERT_MESSAGE("1st line's width is less than the right margin", nWidth < nRightMargin);
-}
-
-void SwUiWriterTest::testTdf104492()
-{
- createDoc("tdf104492.docx");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // The document should split table over 3 pages.
- assertXPath(pXmlDoc, "//page", 3);
-}
-
-void SwUiWriterTest::testTdf107025()
-{
- // Tdf107025 - characters advance with wrong distance, so that
- // they are cluttered because of negative value or
- // break into multiple lines because of overflow.
- // The test document uses DFKAI-SB shipped with Windows.
- createDoc("tdf107025.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // Verify the number of characters in each line.
- CPPUNIT_ASSERT_EQUAL( sal_Int32(1), getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[1]", "nLength").toInt32());
- CPPUNIT_ASSERT_EQUAL( sal_Int32(9), getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[2]", "nLength").toInt32());
-
- // Do the subsequent test only if the first line can be displayed,
- // in case that the required font does not exist.
- sal_Int32 nWidth1 = getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[1]", "nWidth").toInt32();
- if (!nWidth1)
- return;
-
- CPPUNIT_ASSERT(!parseDump("(//Text[@nType='PortionType::Text'])[2]", "nWidth").isEmpty());
- // Width of the second line is expected to be 9 times of the first.
- sal_Int32 nWidth2 = getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[2]", "nWidth").toInt32();
-
- CPPUNIT_ASSERT_EQUAL( sal_Int32(9), nWidth2 / nWidth1 );
-}
-
-void SwUiWriterTest::testTdf107362()
-{
- createDoc("tdf107362.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_Int32 nHeight = getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[1]" , "nHeight").toInt32();
- sal_Int32 nWidth1 = getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[1]" , "nWidth").toInt32();
- sal_Int32 nWidth2 = getXPath(pXmlDoc, "(//Text[@nType='PortionType::Text'])[2]" , "nWidth").toInt32();
- sal_Int32 nLineWidth = getXPath(pXmlDoc, "//LineBreak" , "nWidth").toInt32();
- sal_Int32 nKernWidth = nLineWidth - nWidth1 - nWidth2;
- // Test only if fonts are available
- if ( nWidth1 > 500 && nWidth2 > 200 )
- {
- // Kern width should be smaller than 1/3 of the CJK font height.
- CPPUNIT_ASSERT( nKernWidth * 3 < nHeight );
- }
-}
-
-void SwUiWriterTest::testTdf105417()
-{
- SwDoc* pDoc = createDoc("tdf105417.odt");
- CPPUNIT_ASSERT(pDoc);
- SwView* pView = pDoc->GetDocShell()->GetView();
- CPPUNIT_ASSERT(pView);
- uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator();
- CPPUNIT_ASSERT(xHyphenator.is());
- // If there are no English hyphenation rules installed, we can't test
- // hyphenation.
- if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString())))
- return;
-
- uno::Reference<linguistic2::XLinguProperties> xLinguProperties(LinguMgr::GetLinguPropertySet());
- // Automatic hyphenation means not opening a dialog, but going ahead
- // non-interactively.
- xLinguProperties->setIsHyphAuto(true);
- SwHyphWrapper aWrap(pView, xHyphenator, /*bStart=*/false, /*bOther=*/true, /*bSelection=*/false);
- // This never returned, it kept trying to hyphenate the last word
- // (greenbacks) again and again.
- aWrap.SpellDocument();
-}
-
-void SwUiWriterTest::testTdf105625()
-{
- SwDoc* pDoc = createDoc("tdf105625.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
- // Ensure correct initial setting
- comphelper::ConfigurationHelper::writeDirectKey(xComponentContext,
- "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea",
- css::uno::Any(false), comphelper::EConfigurationModes::Standard);
- // We should be able to edit at positions adjacent to fields.
- // Check if the start and the end of the 1st paragraph are not protected
- // (they are adjacent to FORMCHECKBOX)
- pWrtShell->SttPara();
- CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel());
- pWrtShell->EndPara();
- CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel());
- // 2nd paragraph - FORMTEXT
- pWrtShell->Down(/*bSelect=*/false);
- // Check selection across FORMTEXT field boundary - must be read-only
- pWrtShell->SttPara();
- pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false);
- CPPUNIT_ASSERT_EQUAL(true, pWrtShell->HasReadonlySel());
- // Test deletion of whole field with single backspace
- // Previously it only removed right boundary of FORMTEXT, or failed removal at all
- const IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess();
- sal_Int32 nMarksBefore = pMarksAccess->getAllMarksCount();
- pWrtShell->EndPara();
- pWrtShell->DelLeft();
- sal_Int32 nMarksAfter = pMarksAccess->getAllMarksCount();
- CPPUNIT_ASSERT_EQUAL(nMarksBefore, nMarksAfter + 1);
-}
-
-void SwUiWriterTest::testTdf125151_protected()
-{
- // Similar to testTdf105625 except this is in a protected section,
- // so read-only is already true when fieldmarks are considered.
- SwDoc* pDoc = createDoc("tdf125151_protected.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
- // Ensure correct initial setting
- comphelper::ConfigurationHelper::writeDirectKey(xComponentContext,
- "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea",
- css::uno::Any(false), comphelper::EConfigurationModes::Standard);
- pWrtShell->Down(/*bSelect=*/false);
- // The cursor moved inside of the FieldMark textbox.
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Readonly 1", false, pWrtShell->HasReadonlySel());
- // Move left to the start/definition of the textbox
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false);
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Readonly 2", true, pWrtShell->HasReadonlySel());
-}
-
-void SwUiWriterTest::testTdf125151_protectedB()
-{
- // Similar to testTdf105625 except this is protected with the Protect_Form compat setting
- SwDoc* pDoc = createDoc("tdf125151_protectedB.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
- // Ensure correct initial setting
- comphelper::ConfigurationHelper::writeDirectKey(xComponentContext,
- "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea",
- css::uno::Any(false), comphelper::EConfigurationModes::Standard);
- // The cursor starts inside of the FieldMark textbox.
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Readonly 1", false, pWrtShell->HasReadonlySel());
- // Move left to the start/definition of the textbox
- pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false);
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Readonly 2", true, pWrtShell->HasReadonlySel());
-}
-
-void SwUiWriterTest::testTdf106736()
-{
- createDoc("tdf106736-grid.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_Int32 nWidth = getXPath(pXmlDoc, "(//Text[@nType='PortionType::TabLeft'])[1]", "nWidth").toInt32();
- // In tdf106736, width of tab overflow so that it got
- // width value around 9200, expected value is around 103
- CPPUNIT_ASSERT_MESSAGE("Left Tab width is ~103", nWidth < 150);
-}
-
-void SwUiWriterTest::testMsWordCompTrailingBlanks()
-{
- // The option is true in settings.xml
- SwDoc* pDoc = createDoc( "MsWordCompTrailingBlanksTrue.odt" );
- CPPUNIT_ASSERT_EQUAL( true, pDoc->getIDocumentSettingAccess().get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ) );
- calcLayout();
- // Check that trailing spaces spans have no width if option is enabled
-
- CPPUNIT_ASSERT_EQUAL( OUString(), parseDump( "/root/page/body/txt[2]/Text[4]", "nWidth" ) );
- CPPUNIT_ASSERT_EQUAL( OUString(), parseDump( "/root/page/body/txt[2]/Text[5]", "nWidth" ) );
- CPPUNIT_ASSERT_EQUAL( OUString(), parseDump( "/root/page/body/txt[3]/Text[4]", "nWidth" ) );
- CPPUNIT_ASSERT_EQUAL( OUString(), parseDump( "/root/page/body/txt[3]/Text[5]", "nWidth" ) );
-
- // The option is false in settings.xml
- pDoc = createDoc( "MsWordCompTrailingBlanksFalse.odt" );
- CPPUNIT_ASSERT_EQUAL( false, pDoc->getIDocumentSettingAccess().get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ) );
- calcLayout();
- // Check that trailing spaces spans have width if option is disabled
- CPPUNIT_ASSERT( !parseDump( "/root/page/body/txt[2]/Text[4]", "nWidth" ).isEmpty() );
- CPPUNIT_ASSERT( !parseDump( "/root/page/body/txt[2]/Text[5]", "nWidth" ).isEmpty() );
- CPPUNIT_ASSERT( !parseDump( "/root/page/body/txt[3]/Text[4]", "nWidth" ).isEmpty() );
- CPPUNIT_ASSERT( !parseDump( "/root/page/body/txt[3]/Text[5]", "nWidth" ).isEmpty() );
-
- // MsWordCompTrailingBlanks option should be false by default in new documents
- pDoc = createDoc();
- CPPUNIT_ASSERT_EQUAL( false, pDoc->getIDocumentSettingAccess().get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ) );
-
- // The option should be true if a .docx, .doc or .rtf document is opened
- pDoc = createDoc( "MsWordCompTrailingBlanks.docx" );
- CPPUNIT_ASSERT_EQUAL( true, pDoc->getIDocumentSettingAccess().get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ) );
-}
-
-void SwUiWriterTest::testCreateDocxAnnotation()
-{
- createDoc();
-
- // insert an annotation with a text
- const OUString aSomeText("some text");
- uno::Sequence<beans::PropertyValue> aPropertyValues = comphelper::InitPropertySequence(
- {
- {"Text", uno::makeAny(aSomeText)},
- {"Author", uno::makeAny(OUString("me"))},
- });
- dispatchCommand(mxComponent, ".uno:InsertAnnotation", aPropertyValues);
-
- // Save it as DOCX & load it again
- reload("Office Open XML Text", "create-docx-annotation.docx");
-
- // get the annotation
- uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
- uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
- uno::Reference<beans::XPropertySet> xField(xFields->nextElement(), uno::UNO_QUERY);
-
- // this was empty instead of "some text"
- CPPUNIT_ASSERT_EQUAL(aSomeText, xField->getPropertyValue("Content").get<OUString>());
-}
-
-void SwUiWriterTest::testTdf107976()
-{
- // Create a document and create two transferables.
- SwDoc* pDoc = createDoc();
- SwWrtShell& rShell = *pDoc->GetDocShell()->GetWrtShell();
- rtl::Reference<SwTransferable> pTransferable(new SwTransferable(rShell));
- rtl::Reference<SwTransferable> pTransferable2(new SwTransferable(rShell));
- // Now close the document.
- mxComponent->dispose();
- mxComponent.clear();
- // This failed: the first shell had a pointer to the deleted shell.
- CPPUNIT_ASSERT(!pTransferable->GetShell());
- CPPUNIT_ASSERT(!pTransferable2->GetShell());
-}
-
-void SwUiWriterTest::testTdf58604()
-{
-#ifdef _WIN32
- // Allow linebreak character follows hanging punctuation immediately instead of
- // breaking at the start of the next line.
- load(DATA_DIRECTORY, "tdf58604.odt");
- CPPUNIT_ASSERT_EQUAL( OUString("PortionType::Break"), parseDump( "(/root/page/body/txt/LineBreak[1]/preceding::Text)[last()]", "nType" ) );
-#endif
-}
-
-void SwUiWriterTest::testTdf112025()
-{
- load(DATA_DIRECTORY, "fdo112025.odt");
- const int numberOfParagraphs = getParagraphs();
- CPPUNIT_ASSERT_EQUAL(1, numberOfParagraphs);
-
- // get a page cursor
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
- xCursor->jumpToEndOfPage();
-
- OUString insertFileid = m_directories.getURLFromSrc(DATA_DIRECTORY) + "fdo112025-insert.docx";
- uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({{ "Name", uno::makeAny(insertFileid) }}));
- dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues);
- // something has been inserted + an additional paragraph
- CPPUNIT_ASSERT_GREATER(numberOfParagraphs, getParagraphs());
-
- uno::Reference<beans::XPropertySet> xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStyle, "IsLandscape"));
-}
-
-void SwUiWriterTest::testTdf72942()
-{
- load(DATA_DIRECTORY, "fdo72942.docx");
-
- // get a page cursor
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
- xCursor->jumpToEndOfPage();
-
- OUString insertFileid = m_directories.getURLFromSrc(DATA_DIRECTORY) + "fdo72942-insert.docx";
- uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({{ "Name", uno::makeAny(insertFileid) }}));
- dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues);
-
- // check styles of paragraphs added from [fdo72942.docx]
- const uno::Reference< text::XTextRange > xRun1 = getRun(getParagraph(1), 1);
- CPPUNIT_ASSERT_EQUAL(OUString("Default English (Liberation serif) text with "), xRun1->getString());
- CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), getProperty<OUString>(xRun1, "CharFontName"));
-
- const uno::Reference< text::XTextRange > xRun2 = getRun(getParagraph(2), 1);
- CPPUNIT_ASSERT_EQUAL(OUString("Header 1 English text (Liberation sans) with "), xRun2->getString());
- CPPUNIT_ASSERT_EQUAL(OUString("Liberation Sans"), getProperty<OUString>(xRun2, "CharFontName"));
-
- // check styles of paragraphs added from [fdo72942-insert.docx]
- const uno::Reference< text::XTextRange > xRun3 = getRun(getParagraph(4), 1);
- CPPUNIT_ASSERT_EQUAL(OUString("Default German text (Calibri) with "), xRun3->getString());
- CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), getProperty<OUString>(xRun3, "CharFontName"));
-
- const uno::Reference< text::XTextRange > xRun4 = getRun(getParagraph(5), 1);
- CPPUNIT_ASSERT_EQUAL(OUString("Header 1 German text (Calibri Light) with "), xRun4->getString());
- CPPUNIT_ASSERT_EQUAL(OUString("Liberation Sans"), getProperty<OUString>(xRun4, "CharFontName"));
-}
-
-void SwUiWriterTest::testTdf114306()
-{
- load(DATA_DIRECTORY, "fdo114306.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
-
- // There are 2 long paragraphs in cell A1.
- // A part of paragraph 2 should flow over to the second page but
- // *not* the whole paragraph. There should be 2 paragraphs on
- // page 1 and 1 paragraph on page 2.
- assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt", 2);
- assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt", 1);
-}
-
-void SwUiWriterTest::testTdf114306_2()
-{
- // tdf#114306 fix unexpected page break in row-spanned table
- // load regression document without writer crash
- load(DATA_DIRECTORY, "fdo114306_2.odt");
-
- // correct number of pages
- CPPUNIT_ASSERT_EQUAL(4, getPages());
-}
-
-void SwUiWriterTest::testTdf113877_mergeDocs(const char* aDestDoc, const char* aInsertDoc)
-{
- load(DATA_DIRECTORY, aDestDoc);
-
- // set a page cursor into the end of the document
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
- xCursor->jumpToEndOfPage();
-
- // insert the same document at current cursor position
- {
- const OUString insertFileid = m_directories.getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(aInsertDoc);
- uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({ { "Name", uno::makeAny(insertFileid) } }));
- dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues);
- }
-}
-
-// During insert of the document with list inside into the main document inside the list
-// we should merge both lists into one, when they have the same list properties
-void SwUiWriterTest::testTdf113877()
-{
- testTdf113877_mergeDocs("tdf113877_insert_numbered_list.odt", "tdf113877_insert_numbered_list.odt");
-
- const OUString listId1 = getProperty<OUString>(getParagraph(1), "ListId");
- const OUString listId4 = getProperty<OUString>(getParagraph(4), "ListId");
- const OUString listId5 = getProperty<OUString>(getParagraph(5), "ListId");
- const OUString listId6 = getProperty<OUString>(getParagraph(6), "ListId");
- const OUString listId7 = getProperty<OUString>(getParagraph(7), "ListId");
-
- // the initial list with 4 list items
- CPPUNIT_ASSERT_EQUAL(listId1, listId4);
-
- // the last of the first list, and the first of the inserted list
- CPPUNIT_ASSERT_EQUAL(listId4, listId5);
- CPPUNIT_ASSERT_EQUAL(listId5, listId6);
- CPPUNIT_ASSERT_EQUAL(listId6, listId7);
-}
-
-// The same test as testTdf113877() but merging of two list should not be performed.
-void SwUiWriterTest::testTdf113877NoMerge()
-{
- testTdf113877_mergeDocs("tdf113877_insert_numbered_list.odt", "tdf113877_insert_numbered_list_abcd.odt");
-
- const OUString listId1 = getProperty<OUString>(getParagraph(1), "ListId");
- const OUString listId4 = getProperty<OUString>(getParagraph(4), "ListId");
- const OUString listId5 = getProperty<OUString>(getParagraph(5), "ListId");
- const OUString listId6 = getProperty<OUString>(getParagraph(6), "ListId");
- const OUString listId7 = getProperty<OUString>(getParagraph(7), "ListId");
-
- // the initial list with 4 list items
- CPPUNIT_ASSERT_EQUAL(listId1, listId4);
-
- // the last of the first list, and the first of the inserted list
- CPPUNIT_ASSERT(listId4 != listId5);
- CPPUNIT_ASSERT_EQUAL(listId5, listId6);
- CPPUNIT_ASSERT(listId6 != listId7);
-}
-
-// Related test to testTdf113877(): Inserting into empty document a new document with list.
-// Insert position has NO its own paragraph style ("Standard" will be used).
-//
-// Resulting document should be the same for following tests:
-// - testTdf113877_default_style()
-// - testTdf113877_Standard_style()
-//
-void SwUiWriterTest::testTdf113877_default_style()
-{
- testTdf113877_mergeDocs("tdf113877_blank.odt", "tdf113877_insert_numbered_list_abcd.odt");
-
- const OUString listId1 = getProperty<OUString>(getParagraph(1), "ListId");
- const OUString listId2 = getProperty<OUString>(getParagraph(2), "ListId");
- const OUString listId3 = getProperty<OUString>(getParagraph(3), "ListId");
-
- CPPUNIT_ASSERT_EQUAL(listId1, listId2);
- CPPUNIT_ASSERT_EQUAL(listId1, listId3);
-}
-
-// Related test to testTdf113877(): Inserting into empty document a new document with list.
-// Insert position has its own paragraph style derived from "Standard", but this style is the same as "Standard".
-//
-// Resulting document should be the same for following tests:
-// - testTdf113877_default_style()
-// - testTdf113877_Standard_style()
-//
-void SwUiWriterTest::testTdf113877_Standard_style()
-{
- testTdf113877_mergeDocs("tdf113877_blank_ownStandard.odt", "tdf113877_insert_numbered_list_abcd.odt");
-
- const OUString listId1 = getProperty<OUString>(getParagraph(1), "ListId");
- const OUString listId2 = getProperty<OUString>(getParagraph(2), "ListId");
- const OUString listId3 = getProperty<OUString>(getParagraph(3), "ListId");
-
- CPPUNIT_ASSERT_EQUAL(listId1, listId2);
- CPPUNIT_ASSERT_EQUAL(listId1, listId3);
-}
-
-void SwUiWriterTest::testTdf113877_blank_bold_on()
-{
- testTdf113877_mergeDocs("tdf113877_blank_bold_on.odt", "tdf113877_insert_numbered_list_abcd.odt");
-
- const OUString listId1 = getProperty<OUString>(getParagraph(1), "ListId");
- const OUString listId2 = getProperty<OUString>(getParagraph(2), "ListId");
- const OUString listId3 = getProperty<OUString>(getParagraph(3), "ListId");
-
- CPPUNIT_ASSERT_EQUAL(listId1, listId2);
- CPPUNIT_ASSERT_EQUAL(listId1, listId3);
-}
-
-void SwUiWriterTest::testTdf113877_blank_bold_off()
-{
- testTdf113877_mergeDocs("tdf113877_blank_bold_off.odt", "tdf113877_insert_numbered_list_abcd.odt");
-
- const OUString listId1 = getProperty<OUString>(getParagraph(1), "ListId");
- const OUString listId2 = getProperty<OUString>(getParagraph(2), "ListId");
- const OUString listId3 = getProperty<OUString>(getParagraph(3), "ListId");
-
- CPPUNIT_ASSERT_EQUAL(listId1, listId2);
- CPPUNIT_ASSERT_EQUAL(listId1, listId3);
-}
-
-// just care that this does crash/assert
-void SwUiWriterTest::testRhbz1810732()
-{
- load(DATA_DIRECTORY, "tdf113877_blank.odt");
-
- // set a page cursor into the end of the document
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
- xCursor->jumpToEndOfPage();
-
- // insert the same document at current cursor position
- {
- const OUString insertFileid = m_directories.getURLFromSrc(DATA_DIRECTORY) + "rhbz1810732.docx";
- uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({ { "Name", uno::makeAny(insertFileid) } }));
- dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues);
- }
-}
-
-void SwUiWriterTest::testTdf108524()
-{
- createDoc("tdf108524.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // In total we expect two cells containing a section.
- assertXPath(pXmlDoc, "/root/page/body/tab/row/cell/section", 2);
-
- assertXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell/section", 1);
- // This was 0, section wasn't split, instead it was only on the first page
- // and it was cut off.
- assertXPath(pXmlDoc, "/root/page[2]/body/tab/row/cell/section", 1);
-}
-
-void SwUiWriterTest::testLinesInSectionInTable()
-{
- // This is similar to testTdf108524(), but the page boundary now is not in
- // the middle of a multi-line paragraph: the section only contains oneliner
- // paragraphs instead.
- createDoc("lines-in-section-in-table.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // In total we expect two cells containing a section.
- assertXPath(pXmlDoc, "/root/page/body/tab/row/cell/section", 2);
-
- assertXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell/section", 1);
- // This was 0, section wasn't split, instead it was only on the first page
- // and it was cut off.
- assertXPath(pXmlDoc, "/root/page[2]/body/tab/row/cell/section", 1);
-}
-
-void SwUiWriterTest::testLinesMoveBackwardsInSectionInTable()
-{
-#if HAVE_MORE_FONTS
- // Assert that paragraph "4" is on page 1 and "5" is on page 2.
- SwDoc* pDoc = createDoc("lines-in-section-in-table.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page", 2);
- sal_uInt32 nPara4Node = getXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell[1]/section/txt[last()]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("4"), pDoc->GetNodes()[nPara4Node]->GetTextNode()->GetText());
- sal_uInt32 nPara5Node = getXPath(pXmlDoc, "/root/page[2]/body/tab/row/cell[1]/section/txt[1]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("5"), pDoc->GetNodes()[nPara5Node]->GetTextNode()->GetText());
-
- // Remove paragraph "4".
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- while (pWrtShell->GetCursor()->GetNode().GetIndex() < nPara4Node)
- pWrtShell->Down(/*bSelect=*/false);
- pWrtShell->EndPara();
- pWrtShell->Up(/*bSelect=*/true);
- pWrtShell->DelLeft();
-
- // Assert that paragraph "5" is now moved back to page 1 and is the last paragraph there.
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
- sal_uInt32 nPage1LastNode = getXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell[1]/section/txt[last()]", "txtNodeIndex").toUInt32();
- // This was "3", paragraph "4" was deleted, but "5" was not moved backwards from page 2.
- CPPUNIT_ASSERT_EQUAL(OUString("5"), pDoc->GetNodes()[nPage1LastNode]->GetTextNode()->GetText());
-#endif
-}
-
-void SwUiWriterTest::testTableInSection()
-{
-#if HAVE_MORE_FONTS
- // The document has a section, containing a table that spans over 2 pages.
- createDoc("table-in-sect.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // In total we expect 4 cells.
- assertXPath(pXmlDoc, "/root/page/body/section/tab/row/cell", 4);
-
- // Assert that on both pages the section contains 2 cells.
- assertXPath(pXmlDoc, "/root/page[1]/body/section/tab/row/cell", 2);
- assertXPath(pXmlDoc, "/root/page[2]/body/section/tab/row/cell", 2);
-#endif
-}
-
-void SwUiWriterTest::testTableInNestedSection()
-{
-#if HAVE_MORE_FONTS
- // The document has a nested section, containing a table that spans over 2 pages.
- // This crashed the layout.
- createDoc("rhbz739252-3.odt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // Make sure the table is inside a section and spans over 2 pages.
- assertXPath(pXmlDoc, "//page[1]//section/tab", 1);
- assertXPath(pXmlDoc, "//page[2]//section/tab", 1);
-#endif
-}
-
-void SwUiWriterTest::testTdf112741()
-{
-#if HAVE_MORE_FONTS
- createDoc("tdf112741.fodt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- // This was 5 pages.
- assertXPath(pXmlDoc, "//page", 4);
- assertXPath(pXmlDoc, "//page[1]/body/tab/row/cell/tab/row/cell/section", 1);
- assertXPath(pXmlDoc, "//page[2]/body/tab/row/cell/tab/row/cell/section", 1);
- // This failed, 3rd page contained no sections.
- assertXPath(pXmlDoc, "//page[3]/body/tab/row/cell/tab/row/cell/section", 1);
- assertXPath(pXmlDoc, "//page[4]/body/tab/row/cell/tab/row/cell/section", 1);
-#endif
-}
-
-void SwUiWriterTest::testTdf112860()
-{
-#if HAVE_MORE_FONTS
- // The document has a split section inside a nested table, and also a table
- // in the footer.
- // This crashed the layout.
- createDoc("tdf112860.fodt");
-#endif
-}
-
-void SwUiWriterTest::testTdf113287()
-{
-#if HAVE_MORE_FONTS
- createDoc("tdf113287.fodt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "//page", 2);
- sal_uInt32 nCellTop = getXPath(pXmlDoc, "//page[2]/body/tab/row/cell[1]/infos/bounds", "top").toUInt32();
- sal_uInt32 nSectionTop = getXPath(pXmlDoc, "//page[2]/body/tab/row/cell[1]/section/infos/bounds", "top").toUInt32();
- // Make sure section frame is inside the cell frame.
- // Expected greater than 4593, was only 3714.
- CPPUNIT_ASSERT_GREATER(nCellTop, nSectionTop);
-#endif
-}
-
-void SwUiWriterTest::testTdf113445()
-{
-#if HAVE_MORE_FONTS
- // Force multiple-page view.
- SwDoc* pDoc = createDoc("tdf113445.fodt");
- SwDocShell* pDocShell = pDoc->GetDocShell();
- SwView* pView = pDocShell->GetView();
- pView->SetViewLayout(/*nColumns=*/2, /*bBookMode=*/false);
- calcLayout();
-
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "//page", 2);
- sal_uInt32 nPage1Left = getXPath(pXmlDoc, "//page[1]/infos/bounds", "left").toUInt32();
- sal_uInt32 nPage2Left = getXPath(pXmlDoc, "//page[2]/infos/bounds", "left").toUInt32();
- // Make sure that page 2 is on the right hand side of page 1, not below it.
- CPPUNIT_ASSERT_GREATER(nPage1Left, nPage2Left);
-
- // Insert a new paragraph at the start of the document.
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->StartOfSection();
- pWrtShell->SplitNode();
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
-
- // Make sure that Table2:C5 and Table2:D5 has its section frame inside the cell frame.
- sal_uInt32 nCell3Top = getXPath(pXmlDoc, "//page[2]/body/tab/row/cell/tab/row[4]/cell[3]/infos/bounds", "top").toUInt32();
- sal_uInt32 nSection3Top = getXPath(pXmlDoc, "//page[2]/body/tab/row/cell/tab/row[4]/cell[3]/section/infos/bounds", "top").toUInt32();
- CPPUNIT_ASSERT_GREATER(nCell3Top, nSection3Top);
- sal_uInt32 nCell4Top = getXPath(pXmlDoc, "//page[2]/body/tab/row/cell/tab/row[4]/cell[4]/infos/bounds", "top").toUInt32();
- sal_uInt32 nSection4Top = getXPath(pXmlDoc, "//page[2]/body/tab/row/cell/tab/row[4]/cell[4]/section/infos/bounds", "top").toUInt32();
- CPPUNIT_ASSERT_GREATER(nCell4Top, nSection4Top);
- // Also check if the two cells in the same row have the same top position.
- // This was 4818, expected only 1672.
- CPPUNIT_ASSERT_EQUAL(nCell3Top, nCell4Top);
-#endif
-}
-
-void SwUiWriterTest::testTdf113686()
-{
-#if HAVE_MORE_FONTS
- SwDoc* pDoc = createDoc("tdf113686.fodt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page", 2);
- sal_uInt32 nPage1LastNode = getXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell[1]/tab/row/cell[1]/txt[last()]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("Table2:A1-P10"), pDoc->GetNodes()[nPage1LastNode]->GetTextNode()->GetText());
- sal_uInt32 nPage2FirstNode = getXPath(pXmlDoc, "/root/page[2]/body/tab/row/cell[1]/section/txt[1]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("Table1:A1"), pDoc->GetNodes()[nPage2FirstNode]->GetTextNode()->GetText());
-
- // Remove page 2.
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- while (pWrtShell->GetCursor()->Start()->nNode.GetIndex() < nPage1LastNode)
- pWrtShell->Down(/*bSelect=*/false);
- pWrtShell->EndPara();
- for (int i = 0; i < 3; ++i)
- pWrtShell->Up(/*bSelect=*/true);
- pWrtShell->DelLeft();
-
- // Assert that the second page is removed.
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
- // This was still 2, content from 2nd page was not moved.
- assertXPath(pXmlDoc, "/root/page", 1);
-#endif
-}
-
-void SwUiWriterTest::testTableInSectionInTable()
-{
-#if HAVE_MORE_FONTS
- // The document has a table, containing a section, containing a nested
- // table.
- // This crashed the layout.
- createDoc("i95698.odt");
-#endif
-}
-
-void SwUiWriterTest::testSectionInTableInTable()
-{
-#if HAVE_MORE_FONTS
- // The document has a nested table, containing a multi-line section at a
- // page boundary.
- // This crashed the layout later in SwFrame::IsFootnoteAllowed().
- createDoc("tdf112109.fodt");
-#endif
-}
-
-void SwUiWriterTest::testSectionInTableInTable2()
-{
-#if HAVE_MORE_FONTS
- createDoc("split-section-in-nested-table.fodt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_uInt32 nSection1 = getXPath(pXmlDoc, "//page[1]//body/tab/row/cell/tab/row/cell/section", "id").toUInt32();
- sal_uInt32 nSection1Follow = getXPath(pXmlDoc, "//page[1]//body/tab/row/cell/tab/row/cell/section", "follow").toUInt32();
- // This failed, the section wasn't split inside a nested table.
- sal_uInt32 nSection2 = getXPath(pXmlDoc, "//page[2]//body/tab/row/cell/tab/row/cell/section", "id").toUInt32();
- sal_uInt32 nSection2Precede = getXPath(pXmlDoc, "//page[2]//body/tab/row/cell/tab/row/cell/section", "precede").toUInt32();
-
- // Make sure that the first's follow and the second's precede is correct.
- CPPUNIT_ASSERT_EQUAL(nSection2, nSection1Follow);
- CPPUNIT_ASSERT_EQUAL(nSection1, nSection2Precede);
-#endif
-}
-
-void SwUiWriterTest::testSectionInTableInTable3()
-{
-#if HAVE_MORE_FONTS
- createDoc("tdf113153.fodt");
-
- uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY);
- uno::Reference<container::XNamed> xTable(xTables->getByIndex(1), uno::UNO_QUERY);
- CPPUNIT_ASSERT_EQUAL(OUString("Table16"), xTable->getName());
-
- uno::Reference<text::XTextTable> xRowSupplier(xTable, uno::UNO_QUERY);
- uno::Reference<table::XTableRows> xRows = xRowSupplier->getRows();
- uno::Reference<beans::XPropertySet> xRow(xRows->getByIndex(1), uno::UNO_QUERY);
- xRow->setPropertyValue("IsSplitAllowed", uno::makeAny(true));
- // This never returned.
- calcLayout();
-
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_uInt32 nTable1 = getXPath(pXmlDoc, "//page[1]//body/tab", "id").toUInt32();
- sal_uInt32 nTable1Follow = getXPath(pXmlDoc, "//page[1]//body/tab", "follow").toUInt32();
- sal_uInt32 nTable2 = getXPath(pXmlDoc, "//page[2]//body/tab", "id").toUInt32();
- sal_uInt32 nTable2Precede = getXPath(pXmlDoc, "//page[2]//body/tab", "precede").toUInt32();
- sal_uInt32 nTable2Follow = getXPath(pXmlDoc, "//page[2]//body/tab", "follow").toUInt32();
- sal_uInt32 nTable3 = getXPath(pXmlDoc, "//page[3]//body/tab", "id").toUInt32();
- sal_uInt32 nTable3Precede = getXPath(pXmlDoc, "//page[3]//body/tab", "precede").toUInt32();
-
- // Make sure the outer table frames are linked together properly.
- CPPUNIT_ASSERT_EQUAL(nTable2, nTable1Follow);
- CPPUNIT_ASSERT_EQUAL(nTable1, nTable2Precede);
- CPPUNIT_ASSERT_EQUAL(nTable3, nTable2Follow);
- CPPUNIT_ASSERT_EQUAL(nTable2, nTable3Precede);
-#endif
-}
-
-void SwUiWriterTest::testSectionInTableInTable4()
-{
-#if HAVE_MORE_FONTS
- SwDoc* pDoc = createDoc("tdf113520.fodt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page", 3);
- sal_uInt32 nPage1LastNode = getXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell[1]/tab/row/cell[1]/section/txt[last()]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("Section1:P10"), pDoc->GetNodes()[nPage1LastNode]->GetTextNode()->GetText());
- sal_uInt32 nPage3FirstNode = getXPath(pXmlDoc, "/root/page[3]/body/tab/row/cell[1]/tab/row/cell[1]/section/txt[1]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("Section1:P23"), pDoc->GetNodes()[nPage3FirstNode]->GetTextNode()->GetText());
-
- // Remove page 2.
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- while (pWrtShell->GetCursor()->Start()->nNode.GetIndex() < nPage1LastNode)
- pWrtShell->Down(/*bSelect=*/false);
- pWrtShell->EndPara();
- while (pWrtShell->GetCursor()->End()->nNode.GetIndex() < nPage3FirstNode)
- pWrtShell->Down(/*bSelect=*/true);
- pWrtShell->EndPara(/*bSelect=*/true);
- pWrtShell->DelLeft();
-
- // Assert that the page is removed.
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
- // This was 3, page 2 was emptied, but it wasn't removed.
- assertXPath(pXmlDoc, "/root/page", 2);
-
- // Make sure the outer table frames are linked together properly.
- sal_uInt32 nTable1 = getXPath(pXmlDoc, "//page[1]//body/tab", "id").toUInt32();
- sal_uInt32 nTable1Follow = getXPath(pXmlDoc, "//page[1]//body/tab", "follow").toUInt32();
- sal_uInt32 nTable2 = getXPath(pXmlDoc, "//page[2]//body/tab", "id").toUInt32();
- sal_uInt32 nTable2Precede = getXPath(pXmlDoc, "//page[2]//body/tab", "precede").toUInt32();
- CPPUNIT_ASSERT_EQUAL(nTable2, nTable1Follow);
- CPPUNIT_ASSERT_EQUAL(nTable1, nTable2Precede);
-#endif
-}
-
-void SwUiWriterTest::testTdf112160()
-{
-#if HAVE_MORE_FONTS
- // Assert that the A2 cell is on page 1.
- SwDoc* pDoc = createDoc("tdf112160.fodt");
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_uInt32 nA2CellNode = getXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/section/txt[last()]", "txtNodeIndex").toUInt32();
- CPPUNIT_ASSERT_EQUAL(OUString("Table1.A2"), pDoc->GetNodes()[nA2CellNode]->GetTextNode()->GetText());
-
- // Append a new paragraph to the end of the A2 cell.
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- while (pWrtShell->GetCursor()->GetNode().GetIndex() < nA2CellNode)
- pWrtShell->Down(/*bSelect=*/false);
- pWrtShell->EndPara();
- pWrtShell->SplitNode();
-
- // Assert that after A2 got extended, D2 stays on page 1.
- discardDumpedLayout();
- pXmlDoc = parseLayoutDump();
- sal_uInt32 nD2CellNode = getXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[last()]/section/txt[last()]", "txtNodeIndex").toUInt32();
- // This was Table1.C2, Table1.D2 was moved to the next page, unexpected.
- CPPUNIT_ASSERT_EQUAL(OUString("Table1.D2"), pDoc->GetNodes()[nD2CellNode]->GetTextNode()->GetText());
-#endif
-}
-
-void SwUiWriterTest::testTdf114536()
-{
- // This crashed in SwTextFormatter::MergeCharacterBorder() due to a
- // use after free.
- createDoc("tdf114536.odt");
-}
-
-void SwUiWriterTest::testParagraphOfTextRange()
-{
- SwDoc* pDoc = createDoc("paragraph-of-text-range.odt");
-
- // Enter the table.
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- pWrtShell->Down(/*bSelect=*/false);
- CPPUNIT_ASSERT(pWrtShell->IsCursorInTable());
- // Enter the section.
- pWrtShell->Down(/*bSelect=*/false);
- CPPUNIT_ASSERT(pWrtShell->IsDirectlyInSection());
-
- // Assert that we get the right paragraph object.
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xController(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XTextRange> xViewCursor = xController->getViewCursor();
- // This failed as there were no TextParagraph property.
- auto xParagraph = getProperty< uno::Reference<text::XTextRange> >(xViewCursor->getStart(), "TextParagraph");
- CPPUNIT_ASSERT_EQUAL(OUString("In section"), xParagraph->getString());
-}
-
-// tdf#112448: Fix: take correct line height
-//
-// When line metrics is not calculated we need to call CalcRealHeight()
-// before usage of the Height() and GetRealHeight().
-void SwUiWriterTest::testTdf112448()
-{
- createDoc("tdf112448.odt");
-
- // check actual number of line breaks in the paragraph
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- assertXPath(pXmlDoc, "/root/page/body/txt/LineBreak", 2);
-}
-
-void SwUiWriterTest::testTdf113790()
-{
- SwDoc* pDoc = createDoc("tdf113790.docx");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // Create the clipboard document.
- SwDoc aClipboard;
- aClipboard.SetClipBoard(true);
-
- // Go to fourth line - to "ABCD" bulleted list item
- pWrtShell->Down(/*bSelect=*/false, 4);
- pWrtShell->SelPara(nullptr);
- CPPUNIT_ASSERT_EQUAL(OUString("ABCD"), pWrtShell->GetSelText());
- pWrtShell->Copy(aClipboard);
-
- // Go down to next-to-last (empty) line above "Title3"
- pWrtShell->Down(/*bSelect=*/false, 4);
- pWrtShell->Paste(aClipboard);
-
- // Save it as DOCX & load it again
- reload("Office Open XML Text", "tdf113790.docx");
- CPPUNIT_ASSERT(dynamic_cast<SwXTextDocument *>(mxComponent.get()));
-}
-
-void SwUiWriterTest::testTdf108048()
-{
- createDoc();
-
- uno::Sequence<beans::PropertyValue> aPropertyValues = comphelper::InitPropertySequence({
- { "Kind", uno::makeAny(sal_Int16(3)) },
- { "TemplateName", uno::makeAny(OUString("Default Page Style")) },
- { "PageNumber", uno::makeAny(sal_uInt16(6)) }, // Even number to avoid auto-inserted blank page
- { "PageNumberFilled", uno::makeAny(true) },
- });
- dispatchCommand(mxComponent, ".uno:InsertBreak", aPropertyValues);
- CPPUNIT_ASSERT_EQUAL(2, getParagraphs());
- CPPUNIT_ASSERT_EQUAL(2, getPages());
-
- // The inserted page must have page number set to 6
- uno::Reference<text::XTextRange> xPara = getParagraph(2);
- sal_uInt16 nPageNumber = getProperty< sal_uInt16 >(xPara, "PageNumberOffset");
- CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), nPageNumber);
-}
-
-void SwUiWriterTest::testTdf113481()
-{
- SwDoc* pDoc = createDoc("tdf113481-IVS.odt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
-
- // One backspace should completely remove the CJK ideograph variation sequence
- pWrtShell->EndPara();
- // Before: U+8FBA U+E0102. After: empty
- pWrtShell->DelLeft();
- const uno::Reference< text::XTextRange > xPara1 = getParagraph(1);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xPara1->getString().getLength());
-
- // In case that weak script is treated as CJK script, remove one character.
- pWrtShell->Down(false);
- pWrtShell->EndPara();
- // Before: U+4E2D U+2205 U+FE00. After: U+4E2D U+2205
- if ( pWrtShell->GetScriptType() == SvtScriptType::ASIAN )
- {
- pWrtShell->DelLeft();
- const uno::Reference< text::XTextRange > xPara2 = getParagraph(2);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xPara2->getString().getLength());
- CPPUNIT_ASSERT_EQUAL(u'\x2205', xPara2->getString()[1]);
- }
-
- // Characters of other scripts, remove one character.
- pWrtShell->Down(false);
- pWrtShell->EndPara();
- // Before: U+1820 U+180B. After: U+1820
- pWrtShell->DelLeft();
- const uno::Reference< text::XTextRange > xPara3 = getParagraph(3);
- CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPara3->getString().getLength());
- CPPUNIT_ASSERT_EQUAL(u'\x1820', xPara3->getString()[0]);
-}
-
-void SwUiWriterTest::testTdf115013()
-{
- const OUString sColumnName("Name with spaces, \"quotes\" and \\backslashes");
-
- utl::TempFile aTempDir(nullptr, true);
- const OUString aWorkDir = aTempDir.GetURL();
-
- //create new writer document
- SwDoc* pDoc = createDoc();
-
- {
- // Load and register data source
- const OUString aDataSourceURI(m_directories.getURLFromSrc(DATA_DIRECTORY) + "datasource.ods");
- OUString sDataSource = SwDBManager::LoadAndRegisterDataSource(aDataSourceURI, &aWorkDir);
- CPPUNIT_ASSERT(!sDataSource.isEmpty());
-
- // Insert a new field type for the mailmerge field
- SwDBData aDBData;
- aDBData.sDataSource = sDataSource;
- aDBData.sCommand = "Sheet1";
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- CPPUNIT_ASSERT(pWrtShell);
- SwDBFieldType* pFieldType = static_cast<SwDBFieldType*>(pWrtShell->InsertFieldType(
- SwDBFieldType(pDoc, sColumnName, aDBData)));
- CPPUNIT_ASSERT(pFieldType);
-
- // Insert the field into document
- SwDBField aField(pFieldType);
- pWrtShell->Insert(aField);
- }
- // Save it as DOCX & load it again
- reload("Office Open XML Text", "mm-field.docx");
-
- auto pXTextDocument = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pXTextDocument);
- pDoc = pXTextDocument->GetDocShell()->GetDoc();
- CPPUNIT_ASSERT(pDoc);
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- CPPUNIT_ASSERT(pWrtShell);
- SwPaM* pCursor = pDoc->GetEditShell()->GetCursor();
- CPPUNIT_ASSERT(pCursor);
-
- // Get the field at the beginning of the document
- SwDBField* pField = dynamic_cast<SwDBField*>(SwCursorShell::GetFieldAtCursor(pCursor, true));
- CPPUNIT_ASSERT(pField);
- OUString sColumn = static_cast<SwDBFieldType*>(pField->GetTyp())->GetColumnName();
- // The column name must come correct after round trip
- CPPUNIT_ASSERT_EQUAL(sColumnName, sColumn);
-
- utl::removeTree(aWorkDir);
-}
-
-void SwUiWriterTest::testTdf115065()
-{
- // In the document, the tables have table style assigned
- // Source table (first one) has two rows;
- // destination (second one) has only one row
- SwDoc* pDoc = createDoc("tdf115065.odt");
- CPPUNIT_ASSERT(pDoc);
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- CPPUNIT_ASSERT(pWrtShell);
-
- pWrtShell->GotoTable("Table2");
- SwRect aRect = pWrtShell->GetCurrFrame()->getFrameArea();
- // Destination point is the middle of the first cell of second table
- Point ptTo(aRect.Left() + aRect.Width() / 2, aRect.Top() + aRect.Height() / 2);
-
- pWrtShell->GotoTable("Table1");
- aRect = pWrtShell->GetCurrFrame()->getFrameArea();
- // Source point is the middle of the first cell of first table
- Point ptFrom(aRect.Left() + aRect.Width() / 2, aRect.Top() + aRect.Height() / 2);
-
- pWrtShell->SelTableCol();
- // The copy operation (or closing document after that) segfaulted
- pWrtShell->Copy(*pWrtShell, ptFrom, ptTo);
-}
-
-void SwUiWriterTest::testTdf115132()
-{
- SwDoc* pDoc = createDoc();
- CPPUNIT_ASSERT(pDoc);
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- CPPUNIT_ASSERT(pWrtShell);
-
- std::vector<OUString> vTestTableNames;
-
- // Create an empty paragraph that will separate first table from the rest
- pWrtShell->SplitNode();
- pWrtShell->StartOfSection();
- // Create a table at the start of document body
- SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0);
- const SwTable* pTable = &pWrtShell->InsertTable(TableOpt, 2, 3);
- const SwTableFormat* pFormat = pTable->GetFrameFormat();
- CPPUNIT_ASSERT(pFormat);
- vTestTableNames.push_back(pFormat->GetName());
- pWrtShell->EndOfSection();
- // Create a table after a paragraph
- pTable = &pWrtShell->InsertTable(TableOpt, 2, 3);
- pFormat = pTable->GetFrameFormat();
- CPPUNIT_ASSERT(pFormat);
- vTestTableNames.push_back(pFormat->GetName());
- // Create a table immediately after the previous
- pTable = &pWrtShell->InsertTable(TableOpt, 2, 3);
- pFormat = pTable->GetFrameFormat();
- CPPUNIT_ASSERT(pFormat);
- vTestTableNames.push_back(pFormat->GetName());
- // Create a nested table in the middle of last row
- pWrtShell->GotoTable(vTestTableNames.back());
- for (int i = 0; i < 4; ++i)
- pWrtShell->GoNextCell(false);
- pTable = &pWrtShell->InsertTable(TableOpt, 2, 3);
- pFormat = pTable->GetFrameFormat();
- CPPUNIT_ASSERT(pFormat);
- vTestTableNames.push_back(pFormat->GetName());
-
- // Now check that in any cell in all tables we don't go out of a cell
- // using Delete or Backspace. We test cases when a table is the first node;
- // when we are in a first/middle/last cell in a row; when there's a paragraph
- // before/after this cell; when there's another table before/after this cell;
- // in nested table.
- for (const auto& rTableName : vTestTableNames)
- {
- pWrtShell->GotoTable(rTableName);
- do {
- const SwStartNode* pNd = pWrtShell->GetSwCursor()->GetNode().FindTableBoxStartNode();
- pWrtShell->DelRight();
- CPPUNIT_ASSERT_EQUAL(pNd, pWrtShell->GetSwCursor()->GetNode().FindTableBoxStartNode());
- pWrtShell->DelLeft();
- CPPUNIT_ASSERT_EQUAL(pNd, pWrtShell->GetSwCursor()->GetNode().FindTableBoxStartNode());
- } while (pWrtShell->GoNextCell(false));
- }
-}
-
-void SwUiWriterTest::testXDrawPagesSupplier()
-{
- createDoc();
- uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
- CPPUNIT_ASSERT_MESSAGE("XDrawPagesSupplier interface is unavailable", xDrawPagesSupplier.is());
- uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
- CPPUNIT_ASSERT(xDrawPages.is());
- CPPUNIT_ASSERT_EQUAL_MESSAGE("There must be only a single DrawPage in Writer documents",
- sal_Int32(1), xDrawPages->getCount());
- uno::Any aDrawPage = xDrawPages->getByIndex(0);
- uno::Reference<drawing::XDrawPage> xDrawPageFromXDrawPages(aDrawPage, uno::UNO_QUERY);
- CPPUNIT_ASSERT(xDrawPageFromXDrawPages.is());
-
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
- CPPUNIT_ASSERT_EQUAL_MESSAGE("The DrawPage accessed using XDrawPages must be the same as using XDrawPageSupplier",
- xDrawPage.get(), xDrawPageFromXDrawPages.get());
-}
-
-void SwUiWriterTest::testTdf116403()
-{
- createDoc("tdf116403-considerborders.odt");
- // Check that before ToX update, the tab stop position is the old one
- uno::Reference<text::XTextRange> xParagraph = getParagraph(2, "1\t1");
- auto aTabs = getProperty<uno::Sequence<style::TabStop>>(xParagraph, "ParaTabStops");
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aTabs.getLength());
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(17000), aTabs[0].Position);
-
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell();
- const SwTOXBase* pTOX = pWrtShell->GetTOX(0);
- CPPUNIT_ASSERT(pTOX);
- pWrtShell->UpdateTableOf(*pTOX);
-
- xParagraph = getParagraph(2, "1\t1");
- aTabs = getProperty<uno::Sequence<style::TabStop>>(xParagraph, "ParaTabStops");
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aTabs.getLength());
- // This was still 17000, refreshing ToX didn't take borders spacings and widths into account
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Page borders must be considered for right-aligned tabstop",
- static_cast<sal_Int32>(17000 - 2 * 500 - 2 * 1), aTabs[0].Position);
-}
-
-void SwUiWriterTest::testHtmlCopyImages()
-{
- // Load a document with an image.
- SwDoc* pDoc = createDoc("image.odt");
-
- // Trigger the copy part of HTML copy&paste.
- WriterRef xWrt = new SwHTMLWriter( /*rBaseURL=*/OUString() );
- CPPUNIT_ASSERT(xWrt.is());
-
- xWrt->m_bWriteClipboardDoc = true;
- xWrt->m_bWriteOnlyFirstTable = false;
- xWrt->SetShowProgress(false);
- {
- SvFileStream aStream(maTempFile.GetURL(), StreamMode::WRITE|StreamMode::TRUNC);
- SwWriter aWrt(aStream, *pDoc);
- aWrt.Write(xWrt);
- }
- htmlDocUniquePtr pHtmlDoc = parseHtml(maTempFile);
- CPPUNIT_ASSERT(pHtmlDoc);
-
- // This failed, image was lost during HTML copy.
- OUString aImage = getXPath(pHtmlDoc, "/html/body/p/img", "src");
- // Also make sure that the image is not embedded (e.g. Word doesn't handle
- // embedded images).
- CPPUNIT_ASSERT(aImage.startsWith("file:///"));
-}
-
-void SwUiWriterTest::testTdf116789()
-{
- createDoc("tdf116789.fodt");
- uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XText> xText1;
- uno::Reference<text::XText> xText2;
- {
- uno::Reference<text::XTextContent> xBookmark(
- xBookmarksSupplier->getBookmarks()->getByName("Bookmark 1"), uno::UNO_QUERY);
- xText1 = xBookmark->getAnchor()->getText();
- }
- {
- uno::Reference<text::XTextContent> xBookmark(
- xBookmarksSupplier->getBookmarks()->getByName("Bookmark 1"), uno::UNO_QUERY);
- xText2 = xBookmark->getAnchor()->getText();
- }
- // This failed, we got two different SwXCell for the same bookmark anchor text.
- CPPUNIT_ASSERT_EQUAL(xText1, xText2);
-}
-
-void 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<frame::XStorable> 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);
-}
-
-void SwUiWriterTest::testTdf91801()
-{
- // Tests calculation with several user field variables without prior user fields
- createDoc("tdf91801.fodt");
- uno::Reference<text::XTextTable> xTable(getParagraphOrTable(1), uno::UNO_QUERY);
- uno::Reference<table::XCell> xCell(xTable->getCellByName("A1"));
- CPPUNIT_ASSERT_EQUAL(555.0, xCell->getValue());
-}
-
-void SwUiWriterTest::testTdf51223()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- pWrtShell->Insert("i");
- pWrtShell->SplitNode(true);
- CPPUNIT_ASSERT_EQUAL(OUString("I"), static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- rUndoManager.Undo();
- CPPUNIT_ASSERT_EQUAL(OUString("i"), static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
-}
-
-void SwUiWriterTest::testFontEmbedding()
-{
-#if HAVE_MORE_FONTS && !defined(MACOSX)
- createDoc("testFontEmbedding.odt");
-
- OString aContentBaseXpath("/office:document-content/office:font-face-decls");
- OString aSettingsBaseXpath("/office:document-settings/office:settings/config:config-item-set");
-
- xmlDocUniquePtr pXmlDoc;
- uno::Sequence<beans::PropertyValue> aDescriptor;
- utl::TempFile aTempFile;
- aTempFile.EnableKillingFile();
-
- // Get document settings
- uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xProps(xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY_THROW);
-
- // Check font embedding state
- CPPUNIT_ASSERT_EQUAL(false, xProps->getPropertyValue("EmbedFonts").get<bool>());
- CPPUNIT_ASSERT_EQUAL(false, xProps->getPropertyValue("EmbedOnlyUsedFonts").get<bool>());
- // Font scripts should be enabled by default, however this has no effect unless "EmbedOnlyUsedFonts" is enabled
- CPPUNIT_ASSERT_EQUAL(true, xProps->getPropertyValue("EmbedLatinScriptFonts").get<bool>());
- CPPUNIT_ASSERT_EQUAL(true, xProps->getPropertyValue("EmbedAsianScriptFonts").get<bool>());
- CPPUNIT_ASSERT_EQUAL(true, xProps->getPropertyValue("EmbedComplexScriptFonts").get<bool>());
-
- // CASE 1 - no font embedding enabled
-
- // Save the document
- uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
- xStorable->storeToURL(aTempFile.GetURL(), aDescriptor);
- CPPUNIT_ASSERT(aTempFile.IsValid());
-
- // Check setting - No font embedding should be enabled
- pXmlDoc = parseExportInternal(aTempFile.GetURL(),"settings.xml");
- CPPUNIT_ASSERT(pXmlDoc);
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedFonts']", "false");
-
- // Check content - No font-face-src nodes should be present
- pXmlDoc = parseExportInternal(aTempFile.GetURL(),"content.xml");
- CPPUNIT_ASSERT(pXmlDoc);
-
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face", 6);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans1']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans1']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif1']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif1']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Carlito']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Carlito']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Caladea']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Caladea']/svg:font-face-src", 0);
-
- // CASE 2 - font embedding enabled, but embed used fonts disabled
-
- // Enable font embedding, disable embedding used font only
- xProps->setPropertyValue("EmbedFonts", uno::makeAny(true));
- xProps->setPropertyValue("EmbedOnlyUsedFonts", uno::makeAny(false));
-
- // Save the document again
- xStorable->storeToURL(aTempFile.GetURL(), aDescriptor);
- CPPUNIT_ASSERT(aTempFile.IsValid());
-
- // Check setting - font embedding should be enabled + embed only used fonts and scripts
- pXmlDoc = parseExportInternal(aTempFile.GetURL(),"settings.xml");
- CPPUNIT_ASSERT(pXmlDoc);
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedOnlyUsedFonts']", "false");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedLatinScriptFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedAsianScriptFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedComplexScriptFonts']", "true");
-
- // Check content - font-face-src should be present only for "Liberation Sans" fonts
-
- pXmlDoc = parseExportInternal(aTempFile.GetURL(),"content.xml");
- CPPUNIT_ASSERT(pXmlDoc);
-
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face", 6);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans1']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans1']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif1']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif1']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Carlito']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Carlito']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Caladea']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Caladea']/svg:font-face-src", 1);
-
- // CASE 3 - font embedding enabled, embed only used fonts enabled
-
- // Enable font embedding and setting to embed used fonts only
- xProps->setPropertyValue("EmbedFonts", uno::makeAny(true));
- xProps->setPropertyValue("EmbedOnlyUsedFonts", uno::makeAny(true));
- xProps->setPropertyValue("EmbedLatinScriptFonts", uno::makeAny(true));
- xProps->setPropertyValue("EmbedAsianScriptFonts", uno::makeAny(true));
- xProps->setPropertyValue("EmbedComplexScriptFonts", uno::makeAny(true));
-
- // Save the document again
- xStorable->storeToURL(aTempFile.GetURL(), aDescriptor);
- CPPUNIT_ASSERT(aTempFile.IsValid());
-
- // Check setting - font embedding should be enabled + embed only used fonts and scripts
- pXmlDoc = parseExportInternal(aTempFile.GetURL(),"settings.xml");
- CPPUNIT_ASSERT(pXmlDoc);
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedOnlyUsedFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedLatinScriptFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedAsianScriptFonts']", "true");
- assertXPathContent(pXmlDoc, aSettingsBaseXpath + "/config:config-item[@config:name='EmbedComplexScriptFonts']", "true");
-
- // Check content - font-face-src should be present only for "Liberation Sans" fonts
-
- pXmlDoc = parseExportInternal(aTempFile.GetURL(),"content.xml");
- CPPUNIT_ASSERT(pXmlDoc);
-
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face", 6);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans1']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Sans1']/svg:font-face-src", 0);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif1']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Liberation Serif1']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Carlito']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Carlito']/svg:font-face-src", 1);
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Caladea']");
- assertXPath(pXmlDoc, aContentBaseXpath + "/style:font-face[@style:name='Caladea']/svg:font-face-src", 0);
-#endif
-}
-
-// Unit test for fix inconsistent bookmark behavior around at-char/as-char anchored frames
-//
-// We have a placeholder character in the sw doc model for as-char anchored frames,
-// so it's possible to have a bookmark before/after the frame or a non-collapsed bookmark
-// which covers the frame. The same is not true for at-char anchored frames,
-// where the anchor points to a doc model position, but there is no placeholder character.
-// If a bookmark is created covering the start and end of the anchor of the frame,
-// internally we create a collapsed bookmark which has the same position as the anchor of the frame.
-// When this doc model is handled by SwXParagraph::createEnumeration(),
-// first the frame and then the bookmark is appended to the text portion enumeration,
-// so your bookmark around the frame is turned into a collapsed bookmark after the frame.
-// (The same happens when we roundtrip an ODT document representing this doc model.)
-//
-// Fix the problem by inserting collapsed bookmarks with affected anchor positions
-// (same position is the anchor for an at-char frame) into the enumeration in two stages:
-// first the start of them before frames and then the end of them + other bookmarks.
-// This way UNO API users get their non-collapsed bookmarks around at-char anchored frames,
-// similar to as-char ones.
-void SwUiWriterTest::testInconsistentBookmark()
-{
- // create test document with text and bookmark
- {
- SwDoc* pDoc(createDoc("testInconsistentBookmark.ott"));
- IDocumentMarkAccess& rIDMA(*pDoc->getIDocumentMarkAccess());
- SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
- SwCursor aPaM(SwPosition(aIdx), nullptr);
- aPaM.SetMark();
- aPaM.MovePara(GoCurrPara, fnParaStart);
- aPaM.MovePara(GoCurrPara, fnParaEnd);
- rIDMA.makeMark(aPaM, "Mark", IDocumentMarkAccess::MarkType::BOOKMARK,
- ::sw::mark::InsertMode::New);
- aPaM.Exchange();
- aPaM.DeleteMark();
- }
-
- // save document and verify the bookmark scoup
- {
- // save document
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
-
- // load only content.xml
- if (xmlDocUniquePtr pXmlDoc = parseExportInternal(aTempFile.GetURL(), "content.xml"))
- {
- const OString aPath("/office:document-content/office:body/office:text/text:p");
-
- const int pos1 = getXPathPosition(pXmlDoc, aPath, "bookmark-start");
- const int pos2 = getXPathPosition(pXmlDoc, aPath, "control");
- const int pos3 = getXPathPosition(pXmlDoc, aPath, "bookmark-end");
-
- CPPUNIT_ASSERT_GREATER(pos1, pos2);
- CPPUNIT_ASSERT_GREATER(pos2, pos3);
- }
- }
-}
-
-void SwUiWriterTest::testSpellOnlineParameter()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- const SwViewOption* pOpt = pWrtShell->GetViewOptions();
- bool bSet = pOpt->IsOnlineSpell();
-
- uno::Sequence<beans::PropertyValue> params
- = comphelper::InitPropertySequence({ { "Enable", uno::makeAny(!bSet) } });
- dispatchCommand(mxComponent, ".uno:SpellOnline", params);
- CPPUNIT_ASSERT_EQUAL(!bSet, pOpt->IsOnlineSpell());
-
- // set the same state as now and we don't expect any change (no-toggle)
- params = comphelper::InitPropertySequence({ { "Enable", uno::makeAny(!bSet) } });
- dispatchCommand(mxComponent, ".uno:SpellOnline", params);
- CPPUNIT_ASSERT_EQUAL(!bSet, pOpt->IsOnlineSpell());
-}
-
-void SwUiWriterTest::testRedlineAutoCorrect()
-{
- SwDoc* pDoc = createDoc("redline-autocorrect.fodt");
-
- dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {});
-
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
-
- // show tracked deletion with enabled change tracking
- RedlineFlags const nMode(pWrtShell->GetRedlineFlags() | RedlineFlags::On);
- CPPUNIT_ASSERT(nMode & (RedlineFlags::ShowDelete | RedlineFlags::ShowInsert));
- pWrtShell->SetRedlineFlags(nMode);
- CPPUNIT_ASSERT(nMode & RedlineFlags::ShowDelete);
-
- CPPUNIT_ASSERT_MESSAGE("redlining should be on",
- pDoc->getIDocumentRedlineAccess().IsRedlineOn());
-
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->AutoCorrect(corr, ' ');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
-
- // tdf#83419 This was "Ts " removing the deletion of "t" silently by sentence capitalization
- OUString sReplaced("ts ");
- CPPUNIT_ASSERT_EQUAL(sReplaced,
- static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // hide delete redlines
- pWrtShell->SetRedlineFlags(nMode & ~RedlineFlags::ShowDelete);
-
- // repeat it with not visible redlining
- dispatchCommand(mxComponent, ".uno:Undo", {});
-
- pWrtShell->AutoCorrect(corr, ' ');
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
-
- sReplaced = "S ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // show delete redlines
- pWrtShell->SetRedlineFlags(nMode);
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
-
- // This still keep the tracked deletion, capitalize only the visible text "s"
- // with tracked deletion of the original character
- sReplaced = "tsS ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // repeat it with visible redlining and word auto replacement of "tset"
- dispatchCommand(mxComponent, ".uno:Undo", {});
- dispatchCommand(mxComponent, ".uno:Undo", {});
-
- pWrtShell->Insert("et");
- pWrtShell->AutoCorrect(corr, ' ');
- // This was "Ttest" removing the tracked deletion silently.
- // Don't replace, if a redline starts or ends within the text.
- sReplaced = "tset ";
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // Otherwise replace it
- pWrtShell->Insert("tset");
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced = "tset test ";
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // Including capitalization
- pWrtShell->Insert("end. word");
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced = "tset test end. Word ";
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // tracked deletions after the correction point doesn't affect autocorrect
- dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {});
- pWrtShell->Insert("a");
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced = "A tset test end. Word ";
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testRedlineAutoCorrect2()
-{
- SwDoc* pDoc = createDoc("redline-autocorrect2.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
-
- dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {});
-
- // show tracked deletion
- RedlineFlags const nMode(pWrtShell->GetRedlineFlags() | RedlineFlags::On);
- CPPUNIT_ASSERT(nMode & (RedlineFlags::ShowDelete | RedlineFlags::ShowInsert));
- pWrtShell->SetRedlineFlags(nMode);
- CPPUNIT_ASSERT(nMode & RedlineFlags::ShowDelete);
-
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert("...");
- pWrtShell->AutoCorrect(corr, ' ');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
-
- // This was "LoremLorem,…," (duplicating the deleted comma, but without deletion)
- // Don't replace, if a redline starts or ends within the text.
- OUString sReplaced = "Lorem,... ";
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-
- // Continue it:
- pWrtShell->Insert("Lorem,...");
- pWrtShell->AutoCorrect(corr, ' ');
- nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- sReplaced = u"Lorem,... Lorem,… ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf108423()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // testing autocorrect of i' -> I' on start of first paragraph
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert("i");
- const sal_Unicode cChar = '\'';
- pWrtShell->AutoCorrect(corr, cChar);
- // The word "i" should be capitalized due to autocorrect, followed by a typographical apostrophe
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sIApostrophe(u"I\u2019");
- CPPUNIT_ASSERT_EQUAL(sIApostrophe, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- pWrtShell->Insert(" i");
- pWrtShell->AutoCorrect(corr, cChar);
- OUString sText(sIApostrophe + u" " + sIApostrophe);
- CPPUNIT_ASSERT_EQUAL(sText, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf106164()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // testing autocorrect of we're -> We're on start of first paragraph
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"we\u2019re");
- const sal_Unicode cChar = ' ';
- pWrtShell->AutoCorrect(corr, cChar);
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(
- OUString(u"We\u2019re "), static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf54409()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // testing autocorrect of "tset -> "test with typographical double quotation mark U+201C
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"\u201Ctset");
- const sal_Unicode cChar = ' ';
- pWrtShell->AutoCorrect(corr, cChar);
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"\u201Ctest ");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // testing autocorrect of test" -> test" with typographical double quotation mark U+201D
- pWrtShell->Insert(u"and tset\u201D");
- pWrtShell->AutoCorrect(corr, cChar);
- OUString sReplaced2(sReplaced + u"and test\u201D ");
- CPPUNIT_ASSERT_EQUAL(sReplaced2, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // testing autocorrect of "tset" -> "test" with typographical double quotation mark U+201C and U+201D
- pWrtShell->Insert(u"\u201Ctset\u201D");
- pWrtShell->AutoCorrect(corr, cChar);
- OUString sReplaced3(sReplaced2 + u"\u201Ctest\u201D ");
- CPPUNIT_ASSERT_EQUAL(sReplaced3, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf38394()
-{
- SwDoc* pDoc = createDoc("tdf38394.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // testing autocorrect of French l'" -> l'« (instead of l'»)
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"l\u2019");
- const sal_Unicode cChar = '"';
- pWrtShell->AutoCorrect(corr, cChar);
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"l\u2019« ");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // tdf#132301 autocorrect of qu'«
- pWrtShell->Insert(u" qu\u2019");
- pWrtShell->AutoCorrect(corr, cChar);
- sReplaced += u" qu\u2019« ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf59666()
-{
- SwDoc* pDoc = createDoc();
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // testing missing autocorrect of single Greek letters
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"\u03C0");
- const sal_Unicode cChar = ' ';
- pWrtShell->AutoCorrect(corr, cChar);
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- CPPUNIT_ASSERT_EQUAL(
- OUString(u"\u03C0 "), static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf133524()
-{
- SwDoc* pDoc = createDoc("tdf133524.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // 1. Testing autocorrect of >> and <<
- // Example: »word«
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- // >>
- pWrtShell->Insert(u">");
- pWrtShell->AutoCorrect(corr, '>');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"»");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // <<
- pWrtShell->Insert(u"word<");
- pWrtShell->AutoCorrect(corr, '<');
- sReplaced += u"word«";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // 2. Testing autocorrect of " to >> and << inside „...”
- // Example: „Sentence and »word«.”
- // opening primary level quote
- pWrtShell->Insert(u" ");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u" „";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // opening second level quote
- pWrtShell->Insert(u"Sentence and ");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u"Sentence and »";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // closing second level quote
- pWrtShell->Insert(u"word");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u"word«";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // closing primary level quote
- pWrtShell->Insert(u".");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u".”";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // tdf#134940 avoid premature replacement of "--" in "-->"
- pWrtShell->Insert(u" --");
- pWrtShell->AutoCorrect(corr, '>');
- OUString sReplaced2(sReplaced + u" -->");
- // This was "–>" instead of "-->"
- CPPUNIT_ASSERT_EQUAL(sReplaced2, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced += u" → ";
- // This was "–>" instead of "→"
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf133524_Romanian()
-{
- SwDoc* pDoc = createDoc("tdf133524_ro.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- // 1. Testing autocorrect of " to << and >> inside „...”
- // Example: „Sentence and «word».”
- // opening primary level quote
- pWrtShell->AutoCorrect(corr, '"');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"„");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // opening second level quote
- pWrtShell->Insert(u"Sentence and ");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u"Sentence and «";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // closing second level quote
- pWrtShell->Insert(u"word");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u"word»";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // closing primary level quote
- pWrtShell->Insert(u".");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u".”";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // 2. Testing recognition of closing double quotation mark ”
- pWrtShell->Insert(u" ");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u" „";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // 3. Testing recognition of alternative closing double quotation mark “
- pWrtShell->Insert(u"Alternative.“ ");
- pWrtShell->AutoCorrect(corr, '"');
- sReplaced += u"Alternative.“ „";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf128860()
-{
- SwDoc* pDoc = createDoc("tdf128860.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // Second level ending quote: ‚word' -> ,word‘
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"‚word");
- pWrtShell->AutoCorrect(corr, '\'');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"‚word‘");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // Us apostrophe without preceding starting quote: word' -> word’
- pWrtShell->Insert(u" word");
- pWrtShell->AutoCorrect(corr, '\'');
- sReplaced += u" word’";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // But only after letters: word.' -> word.‘
- pWrtShell->Insert(u" word.");
- pWrtShell->AutoCorrect(corr, '\'');
- sReplaced += u" word.‘";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf123786()
-{
- SwDoc* pDoc = createDoc("tdf123786.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // Second level ending quote: „word' -> „word“
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"„слово");
- pWrtShell->AutoCorrect(corr, '\'');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"„слово“");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // Us apostrophe without preceding starting quote: word' -> word’
- pWrtShell->Insert(u" слово");
- pWrtShell->AutoCorrect(corr, '\'');
- sReplaced += u" слово’";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // But only after letters: word.' -> word.“
- pWrtShell->Insert(u" слово.");
- pWrtShell->AutoCorrect(corr, '\'');
- sReplaced += u" слово.“";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testTdf133589()
-{
- // Hungarian test document with right-to-left paragraph setting
- SwDoc* pDoc = createDoc("tdf133589.fodt");
- SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
- // translitere words to Old Hungarian
- SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
- pWrtShell->Insert(u"székely");
- pWrtShell->AutoCorrect(corr, ' ');
- sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
- OUString sReplaced(u"𐳥𐳋𐳓𐳉𐳗 ");
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // disambiguate consonants: asszony -> asz|szony
- pWrtShell->Insert(u"asszony");
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced += u"𐳀𐳥𐳥𐳛𐳚 ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // disambiguate consonants: kosszarv -> kos|szarv
- // (add explicit ZWSP temporarily for consonant disambiguation, because the requested
- // hu_HU hyphenation dictionary isn't installed on all testing platform)
- // pWrtShell->Insert(u"kosszarv");
- pWrtShell->Insert(u"kos​szarv");
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced += u"𐳓𐳛𐳤𐳥𐳀𐳢𐳮 ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
- // transliterate numbers to Old Hungarian
- pWrtShell->Insert(u"2020");
- pWrtShell->AutoCorrect(corr, ' ');
- sReplaced += u"𐳺𐳺𐳿𐳼𐳼 ";
- CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
-}
-
-void SwUiWriterTest::testInsertLongDateFormat()
-{
- // only for Hungarian, yet
- createDoc("tdf133524.fodt");
- dispatchCommand(mxComponent, ".uno:InsertDateField", {});
- // Make sure that the document starts with a field now, and its expanded string value contains space
- const uno::Reference< text::XTextRange > xField = getRun(getParagraph(1), 1);
- CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty<OUString>(xField, "TextPortionType"));
- // the date format was "YYYY-MM-DD", but now "YYYY. MMM DD."
- CPPUNIT_ASSERT(xField->getString().indexOf(" ") > -1);
-}
-
-#if HAVE_FEATURE_PDFIUM
-void SwUiWriterTest::testInsertPdf()
-{
- createDoc();
- SwXTextDocument *pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- // insert the PDF into the document
- uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence({
- {"FileName", uno::Any(m_directories.getURLFromSrc(DATA_DIRECTORY) + "hello-world.pdf")}
- }));
- dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs);
-
- // Save and load cycle
- utl::TempFile aTempFile;
- save("writer8", aTempFile);
- loadURL(aTempFile.GetURL(), nullptr);
- pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
-
- uno::Reference<drawing::XShape> xShape = getShape(1);
- // Assert that we have a replacement graphics
- auto xReplacementGraphic = getProperty<uno::Reference<graphic::XGraphic>>(xShape, "ReplacementGraphic");
- CPPUNIT_ASSERT(xReplacementGraphic.is());
-
- auto xGraphic = getProperty<uno::Reference<graphic::XGraphic>>(xShape, "Graphic");
- CPPUNIT_ASSERT(xGraphic.is());
- // Assert that the graphic is a PDF
- CPPUNIT_ASSERT_EQUAL(OUString("application/pdf"), getProperty<OUString>(xGraphic, "MimeType"));
-}
-#endif
-
-CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */