sw/CppunitTest_sw_rtfimport2.mk | 69 ++ sw/Module_sw.mk | 1 sw/qa/extras/rtfimport/rtfimport.cxx | 1019 -------------------------------- sw/qa/extras/rtfimport/rtfimport2.cxx | 1073 ++++++++++++++++++++++++++++++++++ 4 files changed, 1143 insertions(+), 1019 deletions(-)
New commits: commit 44a17ea1ce5e2ad4fe6ea92dc394a47b8941c48b Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Tue Mar 11 12:34:24 2025 +0100 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Mar 11 14:34:36 2025 +0100 CppunitTest_sw_rtfimport: split in two it already has 109 tests Change-Id: I0fe53be21ac15f49157087991f56a4ba40975c24 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182772 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sw/CppunitTest_sw_rtfimport2.mk b/sw/CppunitTest_sw_rtfimport2.mk new file mode 100644 index 000000000000..c186948f002f --- /dev/null +++ b/sw/CppunitTest_sw_rtfimport2.mk @@ -0,0 +1,69 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sw_rtfimport2)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sw_rtfimport2)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sw_rtfimport2, \ + sw/qa/extras/rtfimport/rtfimport2 \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sw_rtfimport2, \ + comphelper \ + cppu \ + cppuhelper \ + sal \ + sfx \ + subsequenttest \ + i18nlangtag \ + svl \ + sw \ + swqahelper \ + test \ + unotest \ + vcl \ + tl \ + utl \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sw_rtfimport2,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_rtfimport2,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + -I$(SRCDIR)/sw/qa/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_api,sw_rtfimport2,\ + udkapi \ + offapi \ + oovbaapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sw_rtfimport2)) +$(eval $(call gb_CppunitTest_use_vcl,sw_rtfimport2)) + +$(eval $(call gb_CppunitTest_use_rdb,sw_rtfimport2,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sw_rtfimport2)) + +$(eval $(call gb_CppunitTest_use_uiconfigs,sw_rtfimport2,\ + modules/swriter \ +)) + +$(eval $(call gb_CppunitTest_use_more_fonts,sw_rtfimport2)) + +# vim: set noet sw=4 ts=4: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index 19fecbe6d9cf..fa65cdae1c5e 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -114,6 +114,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_ww8export4 \ CppunitTest_sw_ww8import \ CppunitTest_sw_rtfimport \ + CppunitTest_sw_rtfimport2 \ CppunitTest_sw_odfexport \ CppunitTest_sw_odfexport2 \ CppunitTest_sw_odfimport \ diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 6a79ac33d5a2..76d0257a7187 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -10,25 +10,17 @@ #include <memory> #include <swmodeltestbase.hxx> -#include <config_fonts.h> - #include <com/sun/star/awt/FontDescriptor.hpp> -#include <com/sun/star/awt/FontUnderline.hpp> #include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp> #include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp> #include <com/sun/star/drawing/FillStyle.hpp> -#include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/graphic/XGraphic.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/style/BreakType.hpp> -#include <com/sun/star/style/LineSpacing.hpp> -#include <com/sun/star/style/LineSpacingMode.hpp> #include <com/sun/star/style/ParagraphAdjust.hpp> #include <com/sun/star/style/TabStop.hpp> -#include <com/sun/star/table/BorderLine.hpp> #include <com/sun/star/table/BorderLine2.hpp> #include <com/sun/star/table/BorderLineStyle.hpp> -#include <com/sun/star/table/TableBorderDistances.hpp> #include <com/sun/star/text/RelOrientation.hpp> #include <com/sun/star/text/SizeType.hpp> #include <com/sun/star/text/TableColumnSeparator.hpp> @@ -47,23 +39,13 @@ #include <com/sun/star/lang/Locale.hpp> #include <com/sun/star/drawing/XShapes.hpp> #include <com/sun/star/text/XTextDocument.hpp> -#include <com/sun/star/text/XTextSectionsSupplier.hpp> -#include <com/sun/star/beans/XPropertyState.hpp> -#include <com/sun/star/document/XDocumentInsertable.hpp> #include <o3tl/cppunittraitshelper.hxx> #include <tools/UnitConversion.hxx> #include <rtl/ustring.hxx> -#include <vcl/settings.hxx> #include <comphelper/sequenceashashmap.hxx> #include <comphelper/configuration.hxx> -#include <editeng/charhiddenitem.hxx> - -#include <ndindex.hxx> -#include <ndtxt.hxx> -#include <fmtautofmt.hxx> - namespace { class Test : public SwModelTestBase @@ -1006,1007 +988,6 @@ CPPUNIT_TEST_FIXTURE(Test, testColumnBreak) getProperty<style::BreakType>(getParagraph(2), u"BreakType"_ustr)); } -CPPUNIT_TEST_FIXTURE(Test, testUnbalancedColumnsCompat) -{ - createSwDoc("unbalanced-columns-compat.rtf"); - uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), - uno::UNO_QUERY); - // This was false, we ignored the relevant compat setting to make this non-last section unbalanced. - CPPUNIT_ASSERT_EQUAL( - true, getProperty<bool>(xTextSections->getByIndex(0), u"DontBalanceTextColumns"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testOleInline) -{ - createSwDoc("ole-inline.rtf"); - // Problem was that inline shape had at-page anchor. - CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, - getProperty<text::TextContentAnchorType>(getShape(1), u"AnchorType"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf128611) -{ - createSwDoc("tdf128611.rtf"); - auto aPolyPolySequence - = getProperty<uno::Sequence<uno::Sequence<awt::Point>>>(getShape(1), u"PolyPolygon"_ustr); - CPPUNIT_ASSERT(aPolyPolySequence.hasElements()); - const uno::Sequence<awt::Point>& rPolygon = aPolyPolySequence[0]; - CPPUNIT_ASSERT_GREATER(static_cast<sal_uInt32>(1), rPolygon.size()); - sal_Int32 nY1 = rPolygon[0].Y; - sal_Int32 nY2 = rPolygon[1].Y; - - // Without the accompanying fix in place, this test would have failed with: - // - Expected greater than: 6242 - // - Actual : 3438 - // i.e. the vertical flip was missing, and the y1 > y2 assert failed, because the line pointed - // from top left to bottom right, not bottom left to top right. - CPPUNIT_ASSERT_GREATER(nY2, nY1); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo80742) -{ - createSwDoc("fdo80742.rtf"); - uno::Reference<beans::XPropertySet> xPropertySet( - getStyles(u"ParagraphStyles"_ustr)->getByName(u"Heading 2"_ustr), uno::UNO_QUERY); - // This was 0, outline level was body text. - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), getProperty<sal_Int32>(xPropertySet, u"OutlineLevel"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testBehindDoc) -{ - createSwDoc("behind-doc.rtf"); - // The problem was that "behind doc" didn't result in the shape being in the background, only in being wrapped as "through". - uno::Reference<drawing::XShape> xShape = getShape(1); - CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGH, - getProperty<text::WrapTextMode>(xShape, u"Surround"_ustr)); - // This was true. - CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xShape, u"Opaque"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo82114) -{ - createSwDoc("fdo82114.rtf"); - uno::Reference<text::XText> xHeaderTextPage1 = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextFirst"_ustr); - CPPUNIT_ASSERT_EQUAL(u"First page header, section 1"_ustr, xHeaderTextPage1->getString()); - - uno::Reference<text::XText> xHeaderTextPage2 = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Converted1"_ustr), u"HeaderTextFirst"_ustr); - CPPUNIT_ASSERT_EQUAL(u"First page header, section 2"_ustr, xHeaderTextPage2->getString()); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo44984) -{ - createSwDoc("fdo44984.rtf"); - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); - uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"A1"_ustr), uno::UNO_QUERY); - // This was Text, i.e. the checkbox field portion was missing. - CPPUNIT_ASSERT_EQUAL(u"TextFieldStartEnd"_ustr, - getProperty<OUString>(getRun(getParagraphOfText(1, xCell->getText()), 1), - u"TextPortionType"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf131386) -{ - createSwDoc("hidden-para-separator.rtf"); - SwDoc const* const pDoc = getSwDoc(); - SwNodeIndex ix(pDoc->GetNodes().GetEndOfContent(), -1); - CPPUNIT_ASSERT(ix.GetNode() - .GetTextNode() - ->GetAttr(RES_PARATR_LIST_AUTOFMT) - .GetStyleHandle() - ->Get(RES_CHRATR_HIDDEN) - .GetValue()); - --ix; - --ix; - CPPUNIT_ASSERT(ix.GetNode() - .GetTextNode() - ->GetAttr(RES_PARATR_LIST_AUTOFMT) - .GetStyleHandle() - ->Get(RES_CHRATR_HIDDEN) - .GetValue()); - --ix; - CPPUNIT_ASSERT(ix.GetNode() - .GetTextNode() - ->GetAttr(RES_PARATR_LIST_AUTOFMT) - .GetStyleHandle() - ->Get(RES_CHRATR_HIDDEN) - .GetValue()); - --ix; - CPPUNIT_ASSERT(ix.GetNode() - .GetTextNode() - ->GetAttr(RES_PARATR_LIST_AUTOFMT) - .GetStyleHandle() - ->Get(RES_CHRATR_HIDDEN) - .GetValue()); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo82071) -{ - createSwDoc("fdo82071.rtf"); - // The problem was that in TOC, chapter names were underlined, but they should not be. - uno::Reference<text::XTextRange> xRun = getRun(getParagraph(1), 1); - // Make sure we test the right text portion. - CPPUNIT_ASSERT_EQUAL(u"Chapter 1"_ustr, xRun->getString()); - // This was awt::FontUnderline::SINGLE. - CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::NONE, - getProperty<sal_Int16>(xRun, u"CharUnderline"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo85179) -{ - createSwDoc("fdo85179.rtf"); - // This was 0, border around the picture was ignored on import. - // 360: EMU -> MM100 - CPPUNIT_ASSERT_EQUAL(sal_uInt32(50800 / 360), - getProperty<table::BorderLine2>(getShape(1), u"TopBorder"_ustr).LineWidth); -} - -CPPUNIT_TEST_FIXTURE(Test, testPasteFirstParaDirectFormat) -{ - // Create a new document. - createSwDoc(); - { - // Set some direct formatting on the first paragraph, but leave paragraph adjust at its - // default (left). - uno::Reference<beans::XPropertySet> xParagraph(getParagraph(1), uno::UNO_QUERY); - xParagraph->setPropertyValue(u"PageNumberOffset"_ustr, uno::Any(static_cast<sal_Int16>(0))); - } - - // Paste from RTF. - uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference<text::XText> xText = xTextDocument->getText(); - uno::Reference<document::XDocumentInsertable> xCursor( - xText->createTextCursorByRange(xText->getStart()), uno::UNO_QUERY); - xCursor->insertDocumentFromURL(createFileURL(u"paste-first-para-direct-format.rtf"), {}); - - // Without the accompanying fix in place, this test would have failed with: - // - Expected: 3 (center) - // - Actual : 0 (left) - // i.e. the inserted document's first paragraph's paragraph formatting was lost. - uno::Reference<beans::XPropertySet> xParagraph(getParagraph(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(style::ParagraphAdjust_CENTER), - getProperty<sal_Int16>(xParagraph, u"ParaAdjust"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo82512) -{ - createSwDoc("fdo82512.rtf"); - // This was style::BreakType_NONE, column break was before the 3rd paragraph, not before the 2nd one. - CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, - getProperty<style::BreakType>(getParagraph(2), u"BreakType"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testUnbalancedColumns) -{ - createSwDoc("unbalanced-columns.rtf"); - uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), - uno::UNO_QUERY); - // This was false, last section was balanced, but it's unbalanced in Word. - CPPUNIT_ASSERT_EQUAL( - true, getProperty<bool>(xTextSections->getByIndex(0), u"DontBalanceTextColumns"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf126173) -{ - createSwDoc("tdf126173.rtf"); - // Without the accompanying fix in place, this test would have failed, as the TextFrame was lost - // on import. - CPPUNIT_ASSERT(getShape(1).is()); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo84685) -{ - createSwDoc("fdo84685.rtf"); - // index mark was not imported - uno::Reference<text::XDocumentIndexMark> xMark( - getProperty<uno::Reference<text::XDocumentIndexMark>>(getRun(getParagraph(1), 1), - u"DocumentIndexMark"_ustr)); - CPPUNIT_ASSERT(xMark.is()); - CPPUNIT_ASSERT_EQUAL(u"Key the 1st"_ustr, getProperty<OUString>(xMark, u"PrimaryKey"_ustr)); - // let's test toc entry too - uno::Reference<text::XDocumentIndexMark> xTOCMark( - getProperty<uno::Reference<text::XDocumentIndexMark>>(getRun(getParagraph(2), 1), - u"DocumentIndexMark"_ustr)); - CPPUNIT_ASSERT(xTOCMark.is()); - uno::Reference<lang::XServiceInfo> xTOCSI(xTOCMark, uno::UNO_QUERY); - CPPUNIT_ASSERT(xTOCSI->supportsService(u"com.sun.star.text.ContentIndexMark"_ustr)); -} - -// This testcase illustrate leveltext with multibyte strings coded in cp950 ( BIG5 ). -CPPUNIT_TEST_FIXTURE(Test, testCp950listleveltext1) -{ - createSwDoc("cp950listleveltext1.rtf"); - // suffix with Chinese only ( most common case generated by MSO2010 TC) - // This is a dot that is generally used as suffix of Chinese list number - static constexpr OUStringLiteral aExpectedNumbering = u"\u4e00\u3001"; - - uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), - getProperty<OUString>(xPara, u"ListLabelString"_ustr)); -} - -// This testcase illustrate leveltext with multibyte strings coded in cp950 ( BIG5 ). -CPPUNIT_TEST_FIXTURE(Test, testCp950listleveltext2) -{ - createSwDoc("cp950listleveltext2.rtf"); - // Prefix and suffix with Chinese only ( tweaked from default in MSO2010 TC) - static constexpr OUStringLiteral aExpectedNumbering = u"\u524d\u7f6e\u7532\u3001\u5f8c\u7f6e"; - - uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), - getProperty<OUString>(xPara, u"ListLabelString"_ustr)); -} - -// This testcase illustrate leveltext with multibyte strings coded in cp950 ( BIG5 ) -CPPUNIT_TEST_FIXTURE(Test, testCp950listleveltext3) -{ - createSwDoc("cp950listleveltext3.rtf"); - // Numbering is a mix Chinese and English ( tweaked from default in MSO2010 TC) - static constexpr OUStringLiteral aExpectedNumbering = u"\u524da\u7f6eb\u7532\u3001" - "c\u5f8cd\u7f6ee"; - - uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), - getProperty<OUString>(xPara, u"ListLabelString"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testChtOutlineNumberingRtf) -{ - createSwDoc("chtoutline.rtf"); - - static constexpr OUStringLiteral aExpectedNumbering = u"\u7b2c 1 \u7ae0"; - - uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), - getProperty<OUString>(xPara, u"ListLabelString"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf90046) -{ - createSwDoc("tdf90046.rtf"); - // this was crashing on importing the footnote - uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xFootnotes = xFootnotesSupplier->getFootnotes(); - uno::Reference<text::XTextRange> xTextRange(xFootnotes->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(u"Ma"_ustr, xTextRange->getString()); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo49893) -{ - createSwDoc("fdo49893.rtf"); - // Image from shape was not loaded, invalid size of image after load - uno::Reference<drawing::XShape> xShape = getShape(2); - CPPUNIT_ASSERT(xShape.is()); - CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(432)), xShape->getSize().Height); - CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(1296)), xShape->getSize().Width); -} - -CPPUNIT_TEST_FIXTURE(Test, testFdo49893_3) -{ - createSwDoc("fdo49893-3.rtf"); - // No artifacts (black lines in left top corner) as shape #3 are expected - CPPUNIT_ASSERT_EQUAL(2, getShapes()); - - // Correct wrapping for shape - CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGH, - getProperty<text::WrapTextMode>(getShape(2), u"Surround"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testWrapDistance) -{ - createSwDoc("wrap-distance.rtf"); - // Custom shape, handled directly in RTFSdrImport. - uno::Reference<drawing::XShape> xShape = getShape(1); - CPPUNIT_ASSERT_EQUAL(u"com.sun.star.drawing.CustomShape"_ustr, xShape->getShapeType()); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), - getProperty<sal_Int32>(xShape, u"TopMargin"_ustr) / 1000); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), - getProperty<sal_Int32>(xShape, u"BottomMargin"_ustr) / 1000); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), - getProperty<sal_Int32>(xShape, u"LeftMargin"_ustr) / 1000); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), - getProperty<sal_Int32>(xShape, u"RightMargin"_ustr) / 1000); - - // Picture, handled in GraphicImport, shared with DOCX. - xShape = getShape(2); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), - getProperty<sal_Int32>(xShape, u"TopMargin"_ustr) / 1000); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), - getProperty<sal_Int32>(xShape, u"BottomMargin"_ustr) / 1000); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), - getProperty<sal_Int32>(xShape, u"LeftMargin"_ustr) / 1000); - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), - getProperty<sal_Int32>(xShape, u"RightMargin"_ustr) / 1000); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf90260Par) -{ - createSwDoc("hello.rtf"); - uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference<text::XTextRange> xText = xTextDocument->getText(); - uno::Reference<text::XTextRange> xEnd = xText->getEnd(); - paste(u"rtfimport/data/tdf90260-par.rtf", u"com.sun.star.comp.Writer.RtfFilter"_ustr, xEnd); - CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf119599) -{ - createSwDoc("tdf119599.rtf"); - uno::Reference<beans::XPropertyState> xRun(getRun(getParagraph(1), 1), uno::UNO_QUERY); - // This was beans::PropertyState_DIRECT_VALUE, changing the font size in - // the style had no effect on the rendering result. - CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, - xRun->getPropertyState(u"CharHeight"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf90315) -{ - createSwDoc("tdf90315.rtf"); - uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), - uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xTextSection(xTextSections->getByIndex(0), uno::UNO_QUERY); - // This was 0, but default should be 720 twips. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), - getProperty<sal_Int32>(xTextSection->getPropertyValue(u"TextColumns"_ustr), - u"AutomaticDistance"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf59454) -{ - createSwDoc("tdf59454.rtf"); - // This was 1, section break was ignored right before a table. - CPPUNIT_ASSERT_EQUAL(2, getPages()); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf96308Tabpos) -{ - createSwDoc("tdf96308-tabpos.rtf"); - // Get the tab stops of the second para in the B1 cell of the first table in the document. - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); - uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"B1"_ustr), uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); - uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); - xParaEnum->nextElement(); - uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); - auto aTabStops = getProperty<uno::Sequence<style::TabStop>>(xPara, u"ParaTabStops"_ustr); - // This failed: tab stops were not deleted as direct formatting on the paragraph. - CPPUNIT_ASSERT(!aTabStops.hasElements()); -} - -CPPUNIT_TEST_FIXTURE(Test, testLndscpsxn) -{ - createSwDoc("lndscpsxn.rtf"); - // Check landscape flag. - CPPUNIT_ASSERT_EQUAL(4, getPages()); - - uno::Reference<container::XNameAccess> pageStyles = getStyles(u"PageStyles"_ustr); - - // 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); - - // check that the first page has landscape flag - xCursor->jumpToFirstPage(); - OUString pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); - uno::Reference<style::XStyle> xStylePage(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); - - // check that the second page has no landscape flag - xCursor->jumpToPage(2); - pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); - xStylePage.set(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); - - // check that the third page has landscape flag - xCursor->jumpToPage(3); - pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); - xStylePage.set(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); - - // check that the last page has no landscape flag - xCursor->jumpToLastPage(); - pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); - xStylePage.set(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf99498) -{ - createSwDoc("tdf99498.rtf"); - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - - // Table width was a tiny sub one char wide 145twips, it should now be a table wide - // enough to see all the text in the first column without breaking into multiple lines - CPPUNIT_ASSERT_EQUAL(sal_Int32(7056), - getProperty<sal_Int32>(xTables->getByIndex(0), u"Width"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testClassificatonPaste) -{ - createSwDoc("hello.rtf"); - uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference<text::XTextRange> xText = xTextDocument->getText(); - uno::Reference<text::XTextRange> xEnd = xText->getEnd(); - - // Not classified source, not classified destination: OK. - paste(u"rtfimport/data/classification-no.rtf", u"com.sun.star.comp.Writer.RtfFilter"_ustr, - xEnd); - CPPUNIT_ASSERT_EQUAL(u"classification-no"_ustr, getParagraph(2)->getString()); - - // Classified source, not classified destination: nothing should happen. - OUString aOld = xText->getString(); - paste(u"rtfimport/data/classification-yes.rtf", u"com.sun.star.comp.Writer.RtfFilter"_ustr, - xEnd); - CPPUNIT_ASSERT_EQUAL(aOld, xText->getString()); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf90097) -{ - createSwDoc("tdf90097.rtf"); - // Get the second child of the group shape. - uno::Reference<container::XIndexAccess> xGroup(getShape(1), uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xShape(xGroup->getByIndex(0), uno::UNO_QUERY); - uno::Sequence<uno::Sequence<awt::Point>> aPolyPolySequence; - xShape->getPropertyValue(u"PolyPolygon"_ustr) >>= aPolyPolySequence; - const uno::Sequence<awt::Point>& rPolygon = aPolyPolySequence[0]; - - // Vertical flip for the line shape was ignored, so Y coordinates were swapped. - CPPUNIT_ASSERT(rPolygon[0].Y > rPolygon[1].Y); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf91684) -{ - createSwDoc("tdf91684.rtf"); - // Scaling of the group shape children were incorrect, this was 3203. - // (Unit was assumed to be twips, but it was relative coordinates.) - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1337), getShape(1)->getSize().Height); -} - -CPPUNIT_TEST_FIXTURE(Test, testFlip) -{ - createSwDoc("flip.rtf"); - comphelper::SequenceAsHashMap aMap = getProperty<uno::Sequence<beans::PropertyValue>>( - getShapeByName(u"h-and-v"), u"CustomShapeGeometry"_ustr); - // This resulted in a uno::RuntimeException, as MirroredX wasn't set at all, so could not extract void to boolean. - CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredX"_ustr].get<bool>()); - CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredY"_ustr].get<bool>()); - - aMap = getProperty<uno::Sequence<beans::PropertyValue>>(getShapeByName(u"h-only"), - u"CustomShapeGeometry"_ustr); - CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredX"_ustr].get<bool>()); - CPPUNIT_ASSERT(!aMap[u"MirroredY"_ustr].hasValue()); - - aMap = getProperty<uno::Sequence<beans::PropertyValue>>(getShapeByName(u"v-only"), - u"CustomShapeGeometry"_ustr); - CPPUNIT_ASSERT(!aMap[u"MirroredX"_ustr].hasValue()); - CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredY"_ustr].get<bool>()); - - aMap = getProperty<uno::Sequence<beans::PropertyValue>>(getShapeByName(u"neither-h-nor-v"), - u"CustomShapeGeometry"_ustr); - CPPUNIT_ASSERT(!aMap[u"MirroredX"_ustr].hasValue()); - CPPUNIT_ASSERT(!aMap[u"MirroredY"_ustr].hasValue()); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf78506) -{ - createSwDoc("tdf78506.rtf"); - uno::Reference<beans::XPropertySet> xPropertySet( - getStyles(u"NumberingStyles"_ustr)->getByName(u"WWNum1"_ustr), uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xLevels( - xPropertySet->getPropertyValue(u"NumberingRules"_ustr), uno::UNO_QUERY); - uno::Sequence<beans::PropertyValue> aProps; - xLevels->getByIndex(0) >>= aProps; // 1sd level - - for (int i = 0; i < aProps.getLength(); ++i) - { - const beans::PropertyValue& rProp = aProps[i]; - - if (rProp.Name == "Suffix") - // This was '0', invalid \levelnumbers wasn't ignored. - CPPUNIT_ASSERT(rProp.Value.get<OUString>().isEmpty()); - } - - xmlDocUniquePtr pLayout = parseLayoutDump(); - // Ensure that there is a tabstop in the pseudo-numbering (numbering::NONE followed by tabstop) - assertXPath(pLayout, "//SwFixPortion", 1); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf117403) -{ - createSwDoc("tdf117403.rtf"); - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); - uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"A1"_ustr), uno::UNO_QUERY); - CPPUNIT_ASSERT(xCell.is()); - table::BorderLine2 aExpected(static_cast<sal_Int32>(COL_BLACK), 0, 4, 0, - table::BorderLineStyle::SOLID, 4); - // This failed, border was not imported, OuterLineWidth was 0 instead of 4. - CPPUNIT_ASSERT_BORDER_EQUAL(aExpected, - getProperty<table::BorderLine2>(xCell, u"BottomBorder"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testImportHeaderFooter) -{ - createSwDoc("tdf108055.rtf"); - // The RTF import sometimes added Header and Footer multiple Times - // as well as added the Header to the document body. - uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), - uno::UNO_QUERY); - uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); - - // Check if any Header or Footer text snuck into the TextBody - uno::Reference<text::XTextRange> paragraph = getParagraph(1); - OUString value = paragraph->getString(); - CPPUNIT_ASSERT_EQUAL(u"First Page"_ustr, value); - - paragraph = getParagraph(3); - value = paragraph->getString(); - CPPUNIT_ASSERT_EQUAL(u"Second Page"_ustr, value); - - paragraph = getParagraph(5); - value = paragraph->getString(); - CPPUNIT_ASSERT_EQUAL(u"Third Page"_ustr, value); - - //Check if Headers/Footers only contain what they should in this document - uno::Reference<text::XText> xHeaderText = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextFirst"_ustr); - OUString aActual = xHeaderText->getString(); - CPPUNIT_ASSERT_EQUAL(u"First Page Header"_ustr, aActual); - - uno::Reference<text::XText> xHeaderTextLeft = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextLeft"_ustr); - aActual = xHeaderTextLeft->getString(); - CPPUNIT_ASSERT_EQUAL(u"Header even"_ustr, aActual); - - uno::Reference<text::XText> xHeaderTextRight = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextRight"_ustr); - aActual = xHeaderTextRight->getString(); - CPPUNIT_ASSERT_EQUAL(u"Header uneven"_ustr, aActual); - - uno::Reference<text::XText> xFooterText = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"FooterTextFirst"_ustr); - aActual = xFooterText->getString(); - CPPUNIT_ASSERT_EQUAL(u"First Page Footer"_ustr, aActual); - - uno::Reference<text::XText> xFooterTextLeft = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"FooterTextLeft"_ustr); - aActual = xFooterTextLeft->getString(); - CPPUNIT_ASSERT_EQUAL(u"Footer even"_ustr, aActual); - - uno::Reference<text::XText> xFooterTextRight = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"FooterTextRight"_ustr); - aActual = xFooterTextRight->getString(); - CPPUNIT_ASSERT_EQUAL(u"Footer uneven"_ustr, aActual); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf108947) -{ - createSwDoc("tdf108947.rtf"); - //Check if Headers/Footers contain what they should in this document - uno::Reference<text::XText> xHeaderTextRight = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextRight"_ustr); - OUString aActual = xHeaderTextRight->getString(); - CPPUNIT_ASSERT_EQUAL(u""_ustr, aActual); - - //Document is very fragile, hence we need this guard. -#if HAVE_MORE_FONTS - uno::Reference<text::XText> xHeaderTextLeft = getProperty<uno::Reference<text::XText>>( - getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextLeft"_ustr); - aActual = xHeaderTextLeft->getString(); - CPPUNIT_ASSERT_EQUAL(u"" SAL_NEWLINE_STRING "Header Page 2 ?"_ustr, aActual); -#endif -} - -CPPUNIT_TEST_FIXTURE(Test, testWatermark) -{ - createSwDoc("watermark.rtf"); - Size aExpectedSize(14965, 7482); - uno::Reference<drawing::XShape> xShape = getShape(1); - awt::Size aActualSize(xShape->getSize()); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(aExpectedSize.Width()), aActualSize.Width); - CPPUNIT_ASSERT_EQUAL(sal_Int32(aExpectedSize.Height()), aActualSize.Height); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf104016) -{ - createSwDoc("tdf104016.rtf"); - uno::Reference<beans::XPropertyState> xParagraph(getParagraph(1), uno::UNO_QUERY); - // This was beans::PropertyState_DIRECT_VALUE, leading to lack of - // inheritance from numbering. - CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, - xParagraph->getPropertyState(u"ParaLeftMargin"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf115242) -{ - createSwDoc("tdf115242.rtf"); - // This was 0, overridden left margin was lost by too aggressive style - // deduplication. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2787), - getProperty<sal_Int32>(getParagraph(1), u"ParaLeftMargin"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf153196) -{ - createSwDoc("tdf153196.rtf"); - - xmlDocUniquePtr pLayout = parseLayoutDump(); - - CPPUNIT_ASSERT_EQUAL(4, getPages()); - - // TODO: Writer creates an empty page 1 here, which Word does not - assertXPath(pLayout, "/root/page[1]/footer", 0); - assertXPath(pLayout, "/root/page[2]/footer", 1); - // the first page (2) has a page style applied, which has a follow page - // style; the problem was that the follow page style had a footer. - assertXPath(pLayout, "/root/page[3]/footer", 0); - assertXPath(pLayout, "/root/page[4]/footer", 1); - - // TODO exporting this, wrongly produces "even" footer from stashed one - // TODO importing that, wrongly creates a footer even without evenAndOddHeaders -} - -CPPUNIT_TEST_FIXTURE(Test, testDefaultValues) -{ - createSwDoc("default-values.rtf"); - // tdf#105910: control words without values must be treated as having default values, - // instead of being silently ignored - - uno::Reference<text::XTextRange> paragraph = getParagraph(1); - - uno::Reference<text::XTextRange> run = getRun(paragraph, 1, u"scaleWidth50%"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(50), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 2, u"scaleWidth100%"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 3, u"fontSize25"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(25), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 4, u"fontSize12"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 5, u"textDown3pt"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(-25), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 6, u"textUp3pt"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 7, u"expand1pt"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL( - sal_Int64(20), - o3tl::toTwips(getProperty<sal_Int16>(run, u"CharKerning"_ustr), o3tl::Length::mm100)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 8, u"expand0pt"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 9, u"expand1pt"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL( - sal_Int64(20), - o3tl::toTwips(getProperty<sal_Int16>(run, u"CharKerning"_ustr), o3tl::Length::mm100)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 10, u"expand0pt"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 11, u"colorBlack"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_BLACK), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 12, u"colorRed"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTRED), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 13, u"colorGreen"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTGREEN), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 14, u"colorBlue"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTBLUE), getProperty<sal_Int32>(run, u"CharColor"_ustr)); - - run = getRun(paragraph, 15, u"colorAuto"_ustr); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); - CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testParaStyleBottomMargin) -{ - createSwDoc("para-style-bottom-margin.rtf"); - uno::Reference<beans::XPropertySet> xPropertySet( - getStyles(u"ParagraphStyles"_ustr)->getByName(u"Standard"_ustr), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(353), - getProperty<sal_Int32>(xPropertySet, u"ParaBottomMargin"_ustr)); - CPPUNIT_ASSERT_EQUAL( - style::LineSpacingMode::PROP, - getProperty<style::LineSpacing>(xPropertySet, u"ParaLineSpacing"_ustr).Mode); - CPPUNIT_ASSERT_EQUAL( - sal_Int16(115), - getProperty<style::LineSpacing>(xPropertySet, u"ParaLineSpacing"_ustr).Height); - - // The reason why this is 0 despite the default style containing \sa200 - // is that Word will actually interpret asedonN - // as "set style N and for every attribute of that style, - // set an attribute with default value on the style" - uno::Reference<beans::XPropertySet> xPropertySet1( - getStyles(u"ParagraphStyles"_ustr)->getByName(u"Contents 1"_ustr), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), - getProperty<sal_Int32>(xPropertySet1, u"ParaBottomMargin"_ustr)); - CPPUNIT_ASSERT_EQUAL( - style::LineSpacingMode::PROP, - getProperty<style::LineSpacing>(xPropertySet1, u"ParaLineSpacing"_ustr).Mode); - CPPUNIT_ASSERT_EQUAL( - sal_Int16(100), - getProperty<style::LineSpacing>(xPropertySet1, u"ParaLineSpacing"_ustr).Height); - auto const xPara(getParagraph(1)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, u"ParaBottomMargin"_ustr)); - CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, // 0 or 3 ??? - getProperty<style::LineSpacing>(xPara, u"ParaLineSpacing"_ustr).Mode); - CPPUNIT_ASSERT_EQUAL(sal_Int16(100), - getProperty<style::LineSpacing>(xPara, u"ParaLineSpacing"_ustr).Height); -} - -CPPUNIT_TEST_FIXTURE(Test, test158044Tdf) -{ - createSwDoc("tdf158044.rtf"); - - { - auto xPara(getParagraph(1)); - auto tabStops = getProperty<uno::Sequence<style::TabStop>>(xPara, u"ParaTabStops"_ustr); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), tabStops.getLength()); - } - - { - auto xPara(getParagraph(2)); - auto fillColor = getProperty<Color>(xPara, u"FillColor"_ustr); - auto fillStyle = getProperty<drawing::FillStyle>(xPara, u"FillStyle"_ustr); - - CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, fillStyle); - CPPUNIT_ASSERT_EQUAL(COL_WHITE, fillColor); - } - - { - auto xPara(getParagraph(3)); - auto adjust = getProperty<sal_Int16>(xPara, u"ParaAdjust"_ustr); - - CPPUNIT_ASSERT_EQUAL(sal_Int16(0), adjust); - } - - { - auto xPara(getParagraph(4)); - auto tabStops = getProperty<uno::Sequence<style::TabStop>>(xPara, u"ParaTabStops"_ustr); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(2), tabStops.getLength()); - } - - { - auto xPara(getParagraph(5)); - auto fillColor = getProperty<Color>(xPara, u"FillColor"_ustr); - auto fillStyle = getProperty<drawing::FillStyle>(xPara, u"FillStyle"_ustr); - auto tabStops = getProperty<uno::Sequence<style::TabStop>>(xPara, u"ParaTabStops"_ustr); - - CPPUNIT_ASSERT_LESS(sal_Int32(2), tabStops.getLength()); - CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, fillStyle); - CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, fillColor); - } - - { - auto xPara(getParagraph(6)); - auto fillStyle = getProperty<drawing::FillStyle>(xPara, u"FillStyle"_ustr); - auto tabStops = getProperty<uno::Sequence<style::TabStop>>(xPara, u"ParaTabStops"_ustr); - - CPPUNIT_ASSERT_LESS(sal_Int32(2), tabStops.getLength()); - CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, fillStyle); - } -} - -CPPUNIT_TEST_FIXTURE(Test, test148544Tdf) -{ - createSwDoc("tdf148544.rtf"); - uno::Reference<text::XTextTablesSupplier> tablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XNameAccess> tables = tablesSupplier->getTextTables(); - uno::Reference<text::XTextTable> xTable1(tables->getByName(u"Table2"_ustr), uno::UNO_QUERY); - const char* aCellNames[] = { "B2", "C5", "F6", "F7", "F8", "F9", "F10", "F11" }; - for (tools::ULong nName = 0; nName < sizeof(aCellNames) / sizeof(const char*); ++nName) - { - uno::Reference<table::XCell> xCell - = xTable1->getCellByName(OUString::createFromAscii(aCellNames[nName])); - uno::Reference<beans::XPropertySet> xPropSet(xCell, uno::UNO_QUERY_THROW); - - const char* aBorderNames[] = { "BottomBorder", "TopBorder", "RightBorder", "LeftBorder" }; - for (tools::ULong nBorder = 0; nBorder < sizeof(aBorderNames) / sizeof(const char*); - ++nBorder) - { - table::BorderLine bottomBorder = getProperty<table::BorderLine>( - xCell, OUString::createFromAscii(aBorderNames[nBorder])); - - CPPUNIT_ASSERT(!bottomBorder.InnerLineWidth); - CPPUNIT_ASSERT(!bottomBorder.OuterLineWidth); - } - } -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf163003) -{ - createSwDoc("tdf163003.rtf"); - uno::Reference<container::XNameAccess> xParaStyles(getStyles(u"ParagraphStyles"_ustr)); - uno::Reference<beans::XPropertySet> xStyle1(xParaStyles->getByName(u"Standard"_ustr), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStyle1, u"ParaHyphenationNoCaps"_ustr)); - - CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(1)), - getProperty<sal_Int32>(getShape(1), u"VertOrientPosition"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, testTdf152839) -{ - createSwDoc("tdf152839.rtf"); - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable->getCellNames().getLength()); -} - -CPPUNIT_TEST_FIXTURE(Test, test160553Tdf) -{ - createSwDoc("tdf160553.rtf"); - // new section should create second page - CPPUNIT_ASSERT_EQUAL(2, getPages()); -} - -CPPUNIT_TEST_FIXTURE(Test, test162198Tdf) -{ - createSwDoc("tdf162198.rtf"); - uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTable1(xTables->getByIndex(0), uno::UNO_QUERY); - - uno::Reference<table::XCell> xCell = xTable1->getCellByName(u"A1"_ustr); - uno::Reference<beans::XPropertySet> xCellPropSet(xCell, uno::UNO_QUERY_THROW); - sal_Int32 nLeftDistance = getProperty<sal_Int32>(xCellPropSet, u"LeftBorderDistance"_ustr); - sal_Int32 nRightDistance = getProperty<sal_Int32>(xCellPropSet, u"LeftBorderDistance"_ustr); - CPPUNIT_ASSERT_EQUAL_MESSAGE("left cell spacing to contents", sal_Int32(9), nLeftDistance); - CPPUNIT_ASSERT_EQUAL_MESSAGE("right cell spacing to contents", sal_Int32(9), nRightDistance); - - xCell = xTable1->getCellByName(u"B1"_ustr); - xCellPropSet = uno::Reference<beans::XPropertySet>(xCell, uno::UNO_QUERY_THROW); - nLeftDistance = getProperty<sal_Int32>(xCellPropSet, u"LeftBorderDistance"_ustr); - nRightDistance = getProperty<sal_Int32>(xCellPropSet, u"LeftBorderDistance"_ustr); - CPPUNIT_ASSERT_EQUAL_MESSAGE("left cell spacing to contents", sal_Int32(9), nLeftDistance); - CPPUNIT_ASSERT_EQUAL_MESSAGE("right cell spacing to contents", sal_Int32(9), nRightDistance); -} - -CPPUNIT_TEST_FIXTURE(Test, test153192Tdf) -{ - createSwDoc("read-only-protect.rtf"); - uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); - CPPUNIT_ASSERT(xStorable->isReadonly()); -} - -CPPUNIT_TEST_FIXTURE(Test, test118465Tdf) -{ - createSwDoc("tblrepeat.rtf"); - uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), - uno::UNO_QUERY); - uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getProperty<sal_Int32>(xTable, u"HeaderRowCount"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, test165333Tdf) -{ - createSwDoc("165333.rtf"); - uno::Reference<text::XTextRange> const xRun1( - getRun(uno::Reference<text::XTextRange>(getParagraphOrTable(1), uno::UNO_QUERY), 1)); - CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xRun1, u"CharHidden"_ustr)); - uno::Reference<text::XTextRange> const xRun2( - getRun(uno::Reference<text::XTextRange>(getParagraphOrTable(1), uno::UNO_QUERY), 2)); - CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xRun2, u"CharHidden"_ustr)); -} - -CPPUNIT_TEST_FIXTURE(Test, test165483Tdf) -{ - createSwDoc("165483.rtf"); - uno::Reference<text::XTextRange> const xRun1( - getRun(uno::Reference<text::XTextRange>(getParagraphOrTable(1), uno::UNO_QUERY), 1)); - uno::Reference<beans::XPropertySet> xStyle( - getStyles(u"ParagraphStyles"_ustr)->getByName(u"Based On Table Normal Copy"_ustr), - uno::UNO_QUERY); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xRun1, u"ParaBottomMargin"_ustr)); - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xStyle, u"ParaBottomMargin"_ustr)); -} - // tests should only be added to rtfIMPORT *if* they fail round-tripping in rtfEXPORT } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/qa/extras/rtfimport/rtfimport2.cxx b/sw/qa/extras/rtfimport/rtfimport2.cxx new file mode 100644 index 000000000000..b1bf07335cbb --- /dev/null +++ b/sw/qa/extras/rtfimport/rtfimport2.cxx @@ -0,0 +1,1073 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <memory> +#include <swmodeltestbase.hxx> + +#include <config_fonts.h> + +#include <com/sun/star/awt/FontUnderline.hpp> +#include <com/sun/star/drawing/FillStyle.hpp> +#include <com/sun/star/frame/XStorable.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/style/BreakType.hpp> +#include <com/sun/star/style/LineSpacing.hpp> +#include <com/sun/star/style/LineSpacingMode.hpp> +#include <com/sun/star/style/ParagraphAdjust.hpp> +#include <com/sun/star/style/TabStop.hpp> +#include <com/sun/star/table/BorderLine.hpp> +#include <com/sun/star/table/BorderLine2.hpp> +#include <com/sun/star/table/BorderLineStyle.hpp> +#include <com/sun/star/text/TextContentAnchorType.hpp> +#include <com/sun/star/text/XDocumentIndexMark.hpp> +#include <com/sun/star/text/XFootnotesSupplier.hpp> +#include <com/sun/star/text/XPageCursor.hpp> +#include <com/sun/star/text/XTextTablesSupplier.hpp> +#include <com/sun/star/text/XTextTable.hpp> +#include <com/sun/star/text/XTextViewCursorSupplier.hpp> +#include <com/sun/star/text/WrapTextMode.hpp> +#include <com/sun/star/text/XTextDocument.hpp> +#include <com/sun/star/text/XTextSectionsSupplier.hpp> +#include <com/sun/star/beans/XPropertyState.hpp> +#include <com/sun/star/document/XDocumentInsertable.hpp> + +#include <tools/UnitConversion.hxx> +#include <rtl/ustring.hxx> +#include <comphelper/sequenceashashmap.hxx> + +#include <editeng/charhiddenitem.hxx> + +#include <ndindex.hxx> +#include <ndtxt.hxx> +#include <fmtautofmt.hxx> + +namespace +{ +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase(u"/sw/qa/extras/rtfimport/data/"_ustr, u"Rich Text Format"_ustr) + { + } +}; +CPPUNIT_TEST_FIXTURE(Test, testColumnBreak) +{ + createSwDoc("column-break.rtf"); + // Column break at the very start of the document was ignored. + CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, + getProperty<style::BreakType>(getParagraph(2), u"BreakType"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testUnbalancedColumnsCompat) +{ + createSwDoc("unbalanced-columns-compat.rtf"); + uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), + uno::UNO_QUERY); + // This was false, we ignored the relevant compat setting to make this non-last section unbalanced. + CPPUNIT_ASSERT_EQUAL( + true, getProperty<bool>(xTextSections->getByIndex(0), u"DontBalanceTextColumns"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testOleInline) +{ + createSwDoc("ole-inline.rtf"); + // Problem was that inline shape had at-page anchor. + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, + getProperty<text::TextContentAnchorType>(getShape(1), u"AnchorType"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128611) +{ + createSwDoc("tdf128611.rtf"); + auto aPolyPolySequence + = getProperty<uno::Sequence<uno::Sequence<awt::Point>>>(getShape(1), u"PolyPolygon"_ustr); + CPPUNIT_ASSERT(aPolyPolySequence.hasElements()); + const uno::Sequence<awt::Point>& rPolygon = aPolyPolySequence[0]; + CPPUNIT_ASSERT_GREATER(static_cast<sal_uInt32>(1), rPolygon.size()); + sal_Int32 nY1 = rPolygon[0].Y; + sal_Int32 nY2 = rPolygon[1].Y; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 6242 + // - Actual : 3438 + // i.e. the vertical flip was missing, and the y1 > y2 assert failed, because the line pointed + // from top left to bottom right, not bottom left to top right. + CPPUNIT_ASSERT_GREATER(nY2, nY1); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo80742) +{ + createSwDoc("fdo80742.rtf"); + uno::Reference<beans::XPropertySet> xPropertySet( + getStyles(u"ParagraphStyles"_ustr)->getByName(u"Heading 2"_ustr), uno::UNO_QUERY); + // This was 0, outline level was body text. + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), getProperty<sal_Int32>(xPropertySet, u"OutlineLevel"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testBehindDoc) +{ + createSwDoc("behind-doc.rtf"); + // The problem was that "behind doc" didn't result in the shape being in the background, only in being wrapped as "through". + uno::Reference<drawing::XShape> xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGH, + getProperty<text::WrapTextMode>(xShape, u"Surround"_ustr)); + // This was true. + CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xShape, u"Opaque"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo82114) +{ + createSwDoc("fdo82114.rtf"); + uno::Reference<text::XText> xHeaderTextPage1 = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextFirst"_ustr); + CPPUNIT_ASSERT_EQUAL(u"First page header, section 1"_ustr, xHeaderTextPage1->getString()); + + uno::Reference<text::XText> xHeaderTextPage2 = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Converted1"_ustr), u"HeaderTextFirst"_ustr); + CPPUNIT_ASSERT_EQUAL(u"First page header, section 2"_ustr, xHeaderTextPage2->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo44984) +{ + createSwDoc("fdo44984.rtf"); + uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"A1"_ustr), uno::UNO_QUERY); + // This was Text, i.e. the checkbox field portion was missing. + CPPUNIT_ASSERT_EQUAL(u"TextFieldStartEnd"_ustr, + getProperty<OUString>(getRun(getParagraphOfText(1, xCell->getText()), 1), + u"TextPortionType"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131386) +{ + createSwDoc("hidden-para-separator.rtf"); + SwDoc const* const pDoc = getSwDoc(); + SwNodeIndex ix(pDoc->GetNodes().GetEndOfContent(), -1); + CPPUNIT_ASSERT(ix.GetNode() + .GetTextNode() + ->GetAttr(RES_PARATR_LIST_AUTOFMT) + .GetStyleHandle() + ->Get(RES_CHRATR_HIDDEN) + .GetValue()); + --ix; + --ix; + CPPUNIT_ASSERT(ix.GetNode() + .GetTextNode() + ->GetAttr(RES_PARATR_LIST_AUTOFMT) + .GetStyleHandle() + ->Get(RES_CHRATR_HIDDEN) + .GetValue()); + --ix; + CPPUNIT_ASSERT(ix.GetNode() + .GetTextNode() + ->GetAttr(RES_PARATR_LIST_AUTOFMT) + .GetStyleHandle() + ->Get(RES_CHRATR_HIDDEN) + .GetValue()); + --ix; + CPPUNIT_ASSERT(ix.GetNode() + .GetTextNode() + ->GetAttr(RES_PARATR_LIST_AUTOFMT) + .GetStyleHandle() + ->Get(RES_CHRATR_HIDDEN) + .GetValue()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo82071) +{ + createSwDoc("fdo82071.rtf"); + // The problem was that in TOC, chapter names were underlined, but they should not be. + uno::Reference<text::XTextRange> xRun = getRun(getParagraph(1), 1); + // Make sure we test the right text portion. + CPPUNIT_ASSERT_EQUAL(u"Chapter 1"_ustr, xRun->getString()); + // This was awt::FontUnderline::SINGLE. + CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::NONE, + getProperty<sal_Int16>(xRun, u"CharUnderline"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo85179) +{ + createSwDoc("fdo85179.rtf"); + // This was 0, border around the picture was ignored on import. + // 360: EMU -> MM100 + CPPUNIT_ASSERT_EQUAL(sal_uInt32(50800 / 360), + getProperty<table::BorderLine2>(getShape(1), u"TopBorder"_ustr).LineWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testPasteFirstParaDirectFormat) +{ + // Create a new document. + createSwDoc(); + { + // Set some direct formatting on the first paragraph, but leave paragraph adjust at its + // default (left). + uno::Reference<beans::XPropertySet> xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue(u"PageNumberOffset"_ustr, uno::Any(static_cast<sal_Int16>(0))); + } + + // Paste from RTF. + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XText> xText = xTextDocument->getText(); + uno::Reference<document::XDocumentInsertable> xCursor( + xText->createTextCursorByRange(xText->getStart()), uno::UNO_QUERY); + xCursor->insertDocumentFromURL(createFileURL(u"paste-first-para-direct-format.rtf"), {}); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 3 (center) + // - Actual : 0 (left) + // i.e. the inserted document's first paragraph's paragraph formatting was lost. + uno::Reference<beans::XPropertySet> xParagraph(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(style::ParagraphAdjust_CENTER), + getProperty<sal_Int16>(xParagraph, u"ParaAdjust"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo82512) +{ + createSwDoc("fdo82512.rtf"); + // This was style::BreakType_NONE, column break was before the 3rd paragraph, not before the 2nd one. + CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, + getProperty<style::BreakType>(getParagraph(2), u"BreakType"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testUnbalancedColumns) +{ + createSwDoc("unbalanced-columns.rtf"); + uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), + uno::UNO_QUERY); + // This was false, last section was balanced, but it's unbalanced in Word. + CPPUNIT_ASSERT_EQUAL( + true, getProperty<bool>(xTextSections->getByIndex(0), u"DontBalanceTextColumns"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126173) +{ + createSwDoc("tdf126173.rtf"); + // Without the accompanying fix in place, this test would have failed, as the TextFrame was lost + // on import. + CPPUNIT_ASSERT(getShape(1).is()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo84685) +{ + createSwDoc("fdo84685.rtf"); + // index mark was not imported + uno::Reference<text::XDocumentIndexMark> xMark( + getProperty<uno::Reference<text::XDocumentIndexMark>>(getRun(getParagraph(1), 1), + u"DocumentIndexMark"_ustr)); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(u"Key the 1st"_ustr, getProperty<OUString>(xMark, u"PrimaryKey"_ustr)); + // let's test toc entry too + uno::Reference<text::XDocumentIndexMark> xTOCMark( + getProperty<uno::Reference<text::XDocumentIndexMark>>(getRun(getParagraph(2), 1), + u"DocumentIndexMark"_ustr)); + CPPUNIT_ASSERT(xTOCMark.is()); + uno::Reference<lang::XServiceInfo> xTOCSI(xTOCMark, uno::UNO_QUERY); + CPPUNIT_ASSERT(xTOCSI->supportsService(u"com.sun.star.text.ContentIndexMark"_ustr)); +} + +// This testcase illustrate leveltext with multibyte strings coded in cp950 ( BIG5 ). +CPPUNIT_TEST_FIXTURE(Test, testCp950listleveltext1) +{ + createSwDoc("cp950listleveltext1.rtf"); + // suffix with Chinese only ( most common case generated by MSO2010 TC) + // This is a dot that is generally used as suffix of Chinese list number + static constexpr OUStringLiteral aExpectedNumbering = u"\u4e00\u3001"; + + uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), + getProperty<OUString>(xPara, u"ListLabelString"_ustr)); +} + +// This testcase illustrate leveltext with multibyte strings coded in cp950 ( BIG5 ). +CPPUNIT_TEST_FIXTURE(Test, testCp950listleveltext2) +{ + createSwDoc("cp950listleveltext2.rtf"); + // Prefix and suffix with Chinese only ( tweaked from default in MSO2010 TC) + static constexpr OUStringLiteral aExpectedNumbering = u"\u524d\u7f6e\u7532\u3001\u5f8c\u7f6e"; + + uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), + getProperty<OUString>(xPara, u"ListLabelString"_ustr)); +} + +// This testcase illustrate leveltext with multibyte strings coded in cp950 ( BIG5 ) +CPPUNIT_TEST_FIXTURE(Test, testCp950listleveltext3) +{ + createSwDoc("cp950listleveltext3.rtf"); + // Numbering is a mix Chinese and English ( tweaked from default in MSO2010 TC) + static constexpr OUStringLiteral aExpectedNumbering = u"\u524da\u7f6eb\u7532\u3001" + "c\u5f8cd\u7f6ee"; + + uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), + getProperty<OUString>(xPara, u"ListLabelString"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testChtOutlineNumberingRtf) +{ + createSwDoc("chtoutline.rtf"); + + static constexpr OUStringLiteral aExpectedNumbering = u"\u7b2c 1 \u7ae0"; + + uno::Reference<beans::XPropertySet> xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), + getProperty<OUString>(xPara, u"ListLabelString"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf90046) +{ + createSwDoc("tdf90046.rtf"); + // this was crashing on importing the footnote + uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference<text::XTextRange> xTextRange(xFootnotes->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(u"Ma"_ustr, xTextRange->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo49893) +{ + createSwDoc("fdo49893.rtf"); + // Image from shape was not loaded, invalid size of image after load + uno::Reference<drawing::XShape> xShape = getShape(2); + CPPUNIT_ASSERT(xShape.is()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(432)), xShape->getSize().Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(1296)), xShape->getSize().Width); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo49893_3) +{ + createSwDoc("fdo49893-3.rtf"); + // No artifacts (black lines in left top corner) as shape #3 are expected + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + + // Correct wrapping for shape + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGH, + getProperty<text::WrapTextMode>(getShape(2), u"Surround"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testWrapDistance) +{ + createSwDoc("wrap-distance.rtf"); + // Custom shape, handled directly in RTFSdrImport. + uno::Reference<drawing::XShape> xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(u"com.sun.star.drawing.CustomShape"_ustr, xShape->getShapeType()); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), + getProperty<sal_Int32>(xShape, u"TopMargin"_ustr) / 1000); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), + getProperty<sal_Int32>(xShape, u"BottomMargin"_ustr) / 1000); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), + getProperty<sal_Int32>(xShape, u"LeftMargin"_ustr) / 1000); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), + getProperty<sal_Int32>(xShape, u"RightMargin"_ustr) / 1000); + + // Picture, handled in GraphicImport, shared with DOCX. + xShape = getShape(2); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), + getProperty<sal_Int32>(xShape, u"TopMargin"_ustr) / 1000); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), + getProperty<sal_Int32>(xShape, u"BottomMargin"_ustr) / 1000); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), + getProperty<sal_Int32>(xShape, u"LeftMargin"_ustr) / 1000); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), + getProperty<sal_Int32>(xShape, u"RightMargin"_ustr) / 1000); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf90260Par) +{ + createSwDoc("hello.rtf"); + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextRange> xText = xTextDocument->getText(); + uno::Reference<text::XTextRange> xEnd = xText->getEnd(); + paste(u"rtfimport/data/tdf90260-par.rtf", u"com.sun.star.comp.Writer.RtfFilter"_ustr, xEnd); + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf119599) +{ + createSwDoc("tdf119599.rtf"); + uno::Reference<beans::XPropertyState> xRun(getRun(getParagraph(1), 1), uno::UNO_QUERY); + // This was beans::PropertyState_DIRECT_VALUE, changing the font size in + // the style had no effect on the rendering result. + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, + xRun->getPropertyState(u"CharHeight"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf90315) +{ + createSwDoc("tdf90315.rtf"); + uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xTextSection(xTextSections->getByIndex(0), uno::UNO_QUERY); + // This was 0, but default should be 720 twips. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), + getProperty<sal_Int32>(xTextSection->getPropertyValue(u"TextColumns"_ustr), + u"AutomaticDistance"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf59454) +{ + createSwDoc("tdf59454.rtf"); + // This was 1, section break was ignored right before a table. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf96308Tabpos) +{ + createSwDoc("tdf96308-tabpos.rtf"); + // Get the tab stops of the second para in the B1 cell of the first table in the document. + uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"B1"_ustr), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + xParaEnum->nextElement(); + uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + auto aTabStops = getProperty<uno::Sequence<style::TabStop>>(xPara, u"ParaTabStops"_ustr); + // This failed: tab stops were not deleted as direct formatting on the paragraph. + CPPUNIT_ASSERT(!aTabStops.hasElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testLndscpsxn) +{ + createSwDoc("lndscpsxn.rtf"); + // Check landscape flag. + CPPUNIT_ASSERT_EQUAL(4, getPages()); + + uno::Reference<container::XNameAccess> pageStyles = getStyles(u"PageStyles"_ustr); + + // 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); + + // check that the first page has landscape flag + xCursor->jumpToFirstPage(); + OUString pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); + uno::Reference<style::XStyle> xStylePage(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); + + // check that the second page has no landscape flag + xCursor->jumpToPage(2); + pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); + xStylePage.set(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); + + // check that the third page has landscape flag + xCursor->jumpToPage(3); + pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); + xStylePage.set(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); + + // check that the last page has no landscape flag + xCursor->jumpToLastPage(); + pageStyleName = getProperty<OUString>(xCursor, u"PageStyleName"_ustr); + xStylePage.set(pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty<bool>(xStylePage, u"IsLandscape"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf99498) +{ + createSwDoc("tdf99498.rtf"); + uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + // Table width was a tiny sub one char wide 145twips, it should now be a table wide + // enough to see all the text in the first column without breaking into multiple lines + CPPUNIT_ASSERT_EQUAL(sal_Int32(7056), + getProperty<sal_Int32>(xTables->getByIndex(0), u"Width"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testClassificatonPaste) +{ + createSwDoc("hello.rtf"); + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextRange> xText = xTextDocument->getText(); + uno::Reference<text::XTextRange> xEnd = xText->getEnd(); + + // Not classified source, not classified destination: OK. + paste(u"rtfimport/data/classification-no.rtf", u"com.sun.star.comp.Writer.RtfFilter"_ustr, + xEnd); + CPPUNIT_ASSERT_EQUAL(u"classification-no"_ustr, getParagraph(2)->getString()); + + // Classified source, not classified destination: nothing should happen. + OUString aOld = xText->getString(); + paste(u"rtfimport/data/classification-yes.rtf", u"com.sun.star.comp.Writer.RtfFilter"_ustr, + xEnd); + CPPUNIT_ASSERT_EQUAL(aOld, xText->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf90097) +{ + createSwDoc("tdf90097.rtf"); + // Get the second child of the group shape. + uno::Reference<container::XIndexAccess> xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + uno::Sequence<uno::Sequence<awt::Point>> aPolyPolySequence; + xShape->getPropertyValue(u"PolyPolygon"_ustr) >>= aPolyPolySequence; + const uno::Sequence<awt::Point>& rPolygon = aPolyPolySequence[0]; + + // Vertical flip for the line shape was ignored, so Y coordinates were swapped. + CPPUNIT_ASSERT(rPolygon[0].Y > rPolygon[1].Y); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf91684) +{ + createSwDoc("tdf91684.rtf"); + // Scaling of the group shape children were incorrect, this was 3203. + // (Unit was assumed to be twips, but it was relative coordinates.) + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1337), getShape(1)->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(Test, testFlip) +{ + createSwDoc("flip.rtf"); + comphelper::SequenceAsHashMap aMap = getProperty<uno::Sequence<beans::PropertyValue>>( + getShapeByName(u"h-and-v"), u"CustomShapeGeometry"_ustr); + // This resulted in a uno::RuntimeException, as MirroredX wasn't set at all, so could not extract void to boolean. + CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredX"_ustr].get<bool>()); + CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredY"_ustr].get<bool>()); + + aMap = getProperty<uno::Sequence<beans::PropertyValue>>(getShapeByName(u"h-only"), + u"CustomShapeGeometry"_ustr); + CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredX"_ustr].get<bool>()); + CPPUNIT_ASSERT(!aMap[u"MirroredY"_ustr].hasValue()); + + aMap = getProperty<uno::Sequence<beans::PropertyValue>>(getShapeByName(u"v-only"), + u"CustomShapeGeometry"_ustr); + CPPUNIT_ASSERT(!aMap[u"MirroredX"_ustr].hasValue()); + CPPUNIT_ASSERT_EQUAL(true, aMap[u"MirroredY"_ustr].get<bool>()); + + aMap = getProperty<uno::Sequence<beans::PropertyValue>>(getShapeByName(u"neither-h-nor-v"), + u"CustomShapeGeometry"_ustr); + CPPUNIT_ASSERT(!aMap[u"MirroredX"_ustr].hasValue()); + CPPUNIT_ASSERT(!aMap[u"MirroredY"_ustr].hasValue()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf78506) +{ + createSwDoc("tdf78506.rtf"); + uno::Reference<beans::XPropertySet> xPropertySet( + getStyles(u"NumberingStyles"_ustr)->getByName(u"WWNum1"_ustr), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xLevels( + xPropertySet->getPropertyValue(u"NumberingRules"_ustr), uno::UNO_QUERY); + uno::Sequence<beans::PropertyValue> aProps; + xLevels->getByIndex(0) >>= aProps; // 1sd level + + for (int i = 0; i < aProps.getLength(); ++i) + { + const beans::PropertyValue& rProp = aProps[i]; + + if (rProp.Name == "Suffix") + // This was '0', invalid \levelnumbers wasn't ignored. + CPPUNIT_ASSERT(rProp.Value.get<OUString>().isEmpty()); + } + + xmlDocUniquePtr pLayout = parseLayoutDump(); + // Ensure that there is a tabstop in the pseudo-numbering (numbering::NONE followed by tabstop) + assertXPath(pLayout, "//SwFixPortion", 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf117403) +{ + createSwDoc("tdf117403.rtf"); + uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"A1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT(xCell.is()); + table::BorderLine2 aExpected(static_cast<sal_Int32>(COL_BLACK), 0, 4, 0, + table::BorderLineStyle::SOLID, 4); + // This failed, border was not imported, OuterLineWidth was 0 instead of 4. + CPPUNIT_ASSERT_BORDER_EQUAL(aExpected, + getProperty<table::BorderLine2>(xCell, u"BottomBorder"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testImportHeaderFooter) +{ + createSwDoc("tdf108055.rtf"); + // The RTF import sometimes added Header and Footer multiple Times + // as well as added the Header to the document body. + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + + // Check if any Header or Footer text snuck into the TextBody + uno::Reference<text::XTextRange> paragraph = getParagraph(1); + OUString value = paragraph->getString(); + CPPUNIT_ASSERT_EQUAL(u"First Page"_ustr, value); + + paragraph = getParagraph(3); + value = paragraph->getString(); + CPPUNIT_ASSERT_EQUAL(u"Second Page"_ustr, value); + + paragraph = getParagraph(5); + value = paragraph->getString(); + CPPUNIT_ASSERT_EQUAL(u"Third Page"_ustr, value); + + //Check if Headers/Footers only contain what they should in this document + uno::Reference<text::XText> xHeaderText = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextFirst"_ustr); + OUString aActual = xHeaderText->getString(); + CPPUNIT_ASSERT_EQUAL(u"First Page Header"_ustr, aActual); + + uno::Reference<text::XText> xHeaderTextLeft = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextLeft"_ustr); + aActual = xHeaderTextLeft->getString(); + CPPUNIT_ASSERT_EQUAL(u"Header even"_ustr, aActual); + + uno::Reference<text::XText> xHeaderTextRight = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextRight"_ustr); + aActual = xHeaderTextRight->getString(); + CPPUNIT_ASSERT_EQUAL(u"Header uneven"_ustr, aActual); + + uno::Reference<text::XText> xFooterText = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"FooterTextFirst"_ustr); + aActual = xFooterText->getString(); + CPPUNIT_ASSERT_EQUAL(u"First Page Footer"_ustr, aActual); + + uno::Reference<text::XText> xFooterTextLeft = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"FooterTextLeft"_ustr); + aActual = xFooterTextLeft->getString(); + CPPUNIT_ASSERT_EQUAL(u"Footer even"_ustr, aActual); + + uno::Reference<text::XText> xFooterTextRight = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"FooterTextRight"_ustr); + aActual = xFooterTextRight->getString(); + CPPUNIT_ASSERT_EQUAL(u"Footer uneven"_ustr, aActual); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf108947) +{ + createSwDoc("tdf108947.rtf"); + //Check if Headers/Footers contain what they should in this document + uno::Reference<text::XText> xHeaderTextRight = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextRight"_ustr); + OUString aActual = xHeaderTextRight->getString(); + CPPUNIT_ASSERT_EQUAL(u""_ustr, aActual); + + //Document is very fragile, hence we need this guard. +#if HAVE_MORE_FONTS + uno::Reference<text::XText> xHeaderTextLeft = getProperty<uno::Reference<text::XText>>( + getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr), u"HeaderTextLeft"_ustr); + aActual = xHeaderTextLeft->getString(); + CPPUNIT_ASSERT_EQUAL(u"" SAL_NEWLINE_STRING "Header Page 2 ?"_ustr, aActual); +#endif +} + +CPPUNIT_TEST_FIXTURE(Test, testWatermark) +{ + createSwDoc("watermark.rtf"); + Size aExpectedSize(14965, 7482); + uno::Reference<drawing::XShape> xShape = getShape(1); + awt::Size aActualSize(xShape->getSize()); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(aExpectedSize.Width()), aActualSize.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(aExpectedSize.Height()), aActualSize.Height); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf104016) +{ + createSwDoc("tdf104016.rtf"); + uno::Reference<beans::XPropertyState> xParagraph(getParagraph(1), uno::UNO_QUERY); + // This was beans::PropertyState_DIRECT_VALUE, leading to lack of + // inheritance from numbering. + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, + xParagraph->getPropertyState(u"ParaLeftMargin"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf115242) +{ + createSwDoc("tdf115242.rtf"); + // This was 0, overridden left margin was lost by too aggressive style + // deduplication. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2787), + getProperty<sal_Int32>(getParagraph(1), u"ParaLeftMargin"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153196) +{ + createSwDoc("tdf153196.rtf"); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + + CPPUNIT_ASSERT_EQUAL(4, getPages()); + + // TODO: Writer creates an empty page 1 here, which Word does not + assertXPath(pLayout, "/root/page[1]/footer", 0); + assertXPath(pLayout, "/root/page[2]/footer", 1); + // the first page (2) has a page style applied, which has a follow page + // style; the problem was that the follow page style had a footer. + assertXPath(pLayout, "/root/page[3]/footer", 0); + assertXPath(pLayout, "/root/page[4]/footer", 1); + + // TODO exporting this, wrongly produces "even" footer from stashed one + // TODO importing that, wrongly creates a footer even without evenAndOddHeaders +} + +CPPUNIT_TEST_FIXTURE(Test, testDefaultValues) +{ + createSwDoc("default-values.rtf"); + // tdf#105910: control words without values must be treated as having default values, + // instead of being silently ignored + + uno::Reference<text::XTextRange> paragraph = getParagraph(1); + + uno::Reference<text::XTextRange> run = getRun(paragraph, 1, u"scaleWidth50%"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(50), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 2, u"scaleWidth100%"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 3, u"fontSize25"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(25), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 4, u"fontSize12"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 5, u"textDown3pt"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-25), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 6, u"textUp3pt"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 7, u"expand1pt"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL( + sal_Int64(20), + o3tl::toTwips(getProperty<sal_Int16>(run, u"CharKerning"_ustr), o3tl::Length::mm100)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 8, u"expand0pt"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 9, u"expand1pt"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL( + sal_Int64(20), + o3tl::toTwips(getProperty<sal_Int16>(run, u"CharKerning"_ustr), o3tl::Length::mm100)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 10, u"expand0pt"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 11, u"colorBlack"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_BLACK), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 12, u"colorRed"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTRED), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 13, u"colorGreen"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTGREEN), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 14, u"colorBlue"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTBLUE), getProperty<sal_Int32>(run, u"CharColor"_ustr)); + + run = getRun(paragraph, 15, u"colorAuto"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(run, u"CharScaleWidth"_ustr)); + CPPUNIT_ASSERT_EQUAL(double(12), getProperty<double>(run, u"CharHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(run, u"CharEscapement"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(run, u"CharEscapementHeight"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(run, u"CharKerning"_ustr)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, u"CharColor"_ustr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testParaStyleBottomMargin) +{ -e ... etc. - the rest is truncated