/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for SwHiddenTextField::ParseIfFieldDefinition() method call #include #include #include #include #include #include #include #include #include #include namespace { class Test : public SwModelTestBase { public: Test() : SwModelTestBase(u"/sw/qa/extras/odfexport/data/"_ustr, u"writer8"_ustr) {} }; CPPUNIT_TEST_FIXTURE(Test, testMathObjectFlatExport) { comphelper::ScopeGuard g([this]() { mpFilter = "writer8"; std::shared_ptr pBatch( comphelper::ConfigurationChanges::create()); officecfg::Office::Common::Cache::Writer::OLE_Objects::set(20, pBatch); return pBatch->commit(); }); mpFilter = "OpenDocument Text Flat XML"; // doesn't happen with ODF package std::shared_ptr pBatch( comphelper::ConfigurationChanges::create()); officecfg::Office::Common::Cache::Writer::OLE_Objects::set(1, pBatch); pBatch->commit(); loadAndReload("2_MathType3.docx"); uno::Reference xModifiable(mxComponent, uno::UNO_QUERY); CPPUNIT_ASSERT(!xModifiable->isModified()); // see above, set the OLE cache to 1 for this test // and the problem was that the formulas that were in the cache // (the second one) were lost OUString formula1(getFormula(getRun(getParagraph(1), 1))); CPPUNIT_ASSERT_EQUAL(u" size 12{1+1=2} {}"_ustr, formula1); OUString formula2(getFormula(getRun(getParagraph(2), 1))); CPPUNIT_ASSERT_EQUAL(u" size 12{2+2=4} {}"_ustr, formula2); } DECLARE_ODFEXPORT_TEST(testTdf144319, "tdf144319.odt") { CPPUNIT_ASSERT_EQUAL(7, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); OUString formula1(getFormula(getRun(getParagraph(3), 1))); CPPUNIT_ASSERT_EQUAL(u"{ x = frac { { - b +- sqrt { b ^ 2 - 4 a c } } } { { 2 a } } }"_ustr, formula1); OUString formula2(getFormula(getRun(getParagraph(4), 1))); CPPUNIT_ASSERT_EQUAL(u"{ sum csup n csub { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"_ustr, formula2); OUString formula3(getFormula(getRun(getParagraph(5), 1))); CPPUNIT_ASSERT_EQUAL(u"{ sum ^ n _ { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"_ustr, formula3); OUString formula4(getFormula(getRun(getParagraph(6), 1))); CPPUNIT_ASSERT_EQUAL(u"{ sum ^ n _ { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"_ustr, formula4); // Without the fix in place, this test would have failed with // - the property is of unexpected type or void: Model OUString formula5(getFormula(getRun(getParagraph(7), 1))); CPPUNIT_ASSERT_EQUAL(u"{ y ^ 2 { nitalic m p } = left ( { x ^ 3 + 7 } right ) { nitalic m p } }"_ustr, formula5); } void testTdf43569_CheckIfFieldParse() { { OUString paramCondition; OUString paramTrue; OUString paramFalse; SwHiddenTextField::ParseIfFieldDefinition(u"IF A B C", paramCondition, paramTrue, paramFalse); CPPUNIT_ASSERT_EQUAL(u"A"_ustr, paramCondition); CPPUNIT_ASSERT_EQUAL(u"B"_ustr, paramTrue); CPPUNIT_ASSERT_EQUAL(u"C"_ustr, paramFalse); } { OUString paramCondition; OUString paramTrue; OUString paramFalse; SwHiddenTextField::ParseIfFieldDefinition(u" IF AAA BBB CCC ", paramCondition, paramTrue, paramFalse); CPPUNIT_ASSERT_EQUAL(u"AAA"_ustr, paramCondition); CPPUNIT_ASSERT_EQUAL(u"BBB"_ustr, paramTrue); CPPUNIT_ASSERT_EQUAL(u"CCC"_ustr, paramFalse); } { OUString paramCondition; OUString paramTrue; OUString paramFalse; SwHiddenTextField::ParseIfFieldDefinition(u" IF AAA \"BBB\" \"CCC\" ", paramCondition, paramTrue, paramFalse); CPPUNIT_ASSERT_EQUAL(u"AAA"_ustr, paramCondition); CPPUNIT_ASSERT_EQUAL(u"BBB"_ustr, paramTrue); CPPUNIT_ASSERT_EQUAL(u"CCC"_ustr, paramFalse); } // true-case and false-case have spaces inside { OUString paramCondition; OUString paramTrue; OUString paramFalse; SwHiddenTextField::ParseIfFieldDefinition(u" IF A A A \"B B B\" \"C C C\" ", paramCondition, paramTrue, paramFalse); CPPUNIT_ASSERT_EQUAL(u"A A A"_ustr, paramCondition); CPPUNIT_ASSERT_EQUAL(u"B B B"_ustr, paramTrue); CPPUNIT_ASSERT_EQUAL(u"C C C"_ustr, paramFalse); } // true-case and false-case have leading/trailing space { OUString paramCondition; OUString paramTrue; OUString paramFalse; SwHiddenTextField::ParseIfFieldDefinition(u"IF A1 A2 A3 \"B1 B2 \" \" C1 C2\" ", paramCondition, paramTrue, paramFalse); CPPUNIT_ASSERT_EQUAL(u"A1 A2 A3"_ustr, paramCondition); CPPUNIT_ASSERT_EQUAL(u"B1 B2 "_ustr, paramTrue); CPPUNIT_ASSERT_EQUAL(u" C1 C2"_ustr, paramFalse); } // true-case and false-case are empty { OUString paramCondition; OUString paramTrue; OUString paramFalse; SwHiddenTextField::ParseIfFieldDefinition(u"IF condition \"\" \"\" ", paramCondition, paramTrue, paramFalse); CPPUNIT_ASSERT_EQUAL(u"condition"_ustr, paramCondition); CPPUNIT_ASSERT_EQUAL(u""_ustr, paramTrue); CPPUNIT_ASSERT_EQUAL(u""_ustr, paramFalse); } } // Input document contains only one IF-field, // and it should be imported as com.sun.star.text.TextField.ConditionalText in any case, // instead of insertion of the pair of two field-marks: + . CPPUNIT_TEST_FIXTURE(Test, testTdf43569) { loadAndReload("tdf43569_conditionalfield.doc"); // check if our parser is valid testTdf43569_CheckIfFieldParse(); // now check field creation during import uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference xFields(xFieldsAccess->createEnumeration()); // at least one field should be detected CPPUNIT_ASSERT(xFields->hasMoreElements()); } CPPUNIT_TEST_FIXTURE(Test, testTdf130314) { loadAndReload("tdf130314.docx"); // Without the fix in place, this test would have hung CPPUNIT_ASSERT_EQUAL(2, getPages()); } CPPUNIT_TEST_FIXTURE(Test, testTdf133487) { loadAndReload("MadeByLO7.odt"); CPPUNIT_ASSERT_EQUAL(3, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); // shape in background has lowest index assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape", "z-index", u"0"); assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties", "run-through", u"background"); // shape in foreground, previously index 1 assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[1]/draw:custom-shape", "z-index", u"2"); assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[1]/draw:custom-shape[@draw:z-index = '2']/attribute::draw:style-name]/style:graphic-properties", "run-through", u"foreground"); // shape in foreground, previously index 0 assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[3]/draw:custom-shape", "z-index", u"1"); assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[3]/draw:custom-shape[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties", "run-through", u"foreground"); } CPPUNIT_TEST_FIXTURE(Test, testTdf141467) { loadAndReload("Formcontrol needs high z-index.odt"); CPPUNIT_ASSERT_EQUAL(2, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); // shape in foreground has lowest index assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape", "z-index", u"0"); assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties", "run-through", u"foreground"); // form control, previously index 0 assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:control", "z-index", u"1"); // no run-through on form's style assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:control[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties/attribute::run-through", 0); } DECLARE_ODFEXPORT_TEST(testTdf139126, "tdf139126.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xTables = xSupplier->getTextTables(); uno::Reference xTable(xTables->getByName(u"Table1"_ustr), uno::UNO_QUERY); uno::Reference xD2(xTable->getCellByName(u"D2"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"4.0"_ustr, xD2->getString()); // Without the fix in place, this test would have failed with // - Expected: ** Expression is faulty ** // - Actual : 17976931348623200... uno::Reference xE2(xTable->getCellByName(u"E2"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"** Expression is faulty **"_ustr, xE2->getString()); } CPPUNIT_TEST_FIXTURE(Test, testTdf125877) { loadAndReload("tdf95806.docx"); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xTables(xSupplier->getTextTables(), uno::UNO_QUERY); // This was 0 (lost table during ODT export in footnotes) // Note: fix also tdf#95806: painting table layout is correct CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); // floating table: there is a frame now uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); } CPPUNIT_TEST_FIXTURE(Test, testTdf150149) { loadAndReload("tdf150149.fodt"); CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); // This was 0 (lost table header in multi-column section) assertXPath(pXmlDoc, "//table:table-header-rows", 1); assertXPath(pXmlDoc, "//table:table-header-rows/table:table-row/table:table-cell", 3); } DECLARE_ODFEXPORT_TEST(testTdf103567, "tdf103567.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference const xShape(getShape(1)); // contour wrap polygon css::drawing::PointSequenceSequence const pointss( getProperty(xShape, u"ContourPolyPolygon"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pointss.getLength()); // for some reason this property exists with 199 points if it wasn't // imported, that would be a fail CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pointss[0].getLength()); CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][0].X); CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][0].Y); CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][1].X); CPPUNIT_ASSERT_EQUAL(sal_Int32(1111), pointss[0][1].Y); CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][2].X); CPPUNIT_ASSERT_EQUAL(sal_Int32(1111), pointss[0][2].Y); CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][3].X); CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][3].Y); CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][4].X); CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][4].Y); // image map, one rectangle uno::Reference const xImageMap( getProperty>(xShape, u"ImageMap"_ustr)); uno::Reference const xEntry(xImageMap->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"http://example.com/"_ustr, getProperty(xEntry, u"URL"_ustr)); awt::Rectangle const rect(getProperty(xEntry, u"Boundary"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32( 726), rect.X); CPPUNIT_ASSERT_EQUAL(sal_Int32(1718), rect.Y); CPPUNIT_ASSERT_EQUAL(sal_Int32(1347), rect.Width); CPPUNIT_ASSERT_EQUAL(sal_Int32( 408), rect.Height); } CPPUNIT_TEST_FIXTURE(Test, testUserFieldDecl) { loadAndReload("user-field-decl.odt"); CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // Without the accompanying fix in place, this test would have failed with 'Expected: 2; // Actual: 1', i.e. the in-table field had no declaration (in the header), while the // outside-table one had the declaration. assertXPath(pXmlDoc, "//style:header/text:user-field-decls/text:user-field-decl", 2); } CPPUNIT_TEST_FIXTURE(Test, testUserFieldDeclFly) { loadAndReload("user-field-decl-fly.odt"); CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // Without the accompanying fix in place, this test would have failed with 'Expected: 2; // Actual: 1', i.e. the in-textframe field had no declaration (in the header), while the // outside-textframe one had the declaration. assertXPath(pXmlDoc, "//style:header/text:user-field-decls/text:user-field-decl", 2); } CPPUNIT_TEST_FIXTURE(Test, testFramebackgrounds) { auto verify = [this]() { CPPUNIT_ASSERT_EQUAL(16, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); //Counting the Number of Frames and checking with the expected count uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(16), xIndexAccess->getCount()); uno::Reference xTextFrame; awt::Gradient aGradientxTextFrame; //Frame 1 xTextFrame = getShape(1); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 2 xTextFrame = getShape(2); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0x006600), getProperty(xTextFrame, u"FillColor"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 3 xTextFrame = getShape(3); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0x006600), getProperty(xTextFrame, u"FillColor"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 4 xTextFrame = getShape(4); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0x579D1C), getProperty(xTextFrame, u"FillColor"_ustr)); aGradientxTextFrame = getProperty(xTextFrame, u"FillTransparenceGradient"_ustr); CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); //Frame 5 xTextFrame = getShape(5); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillTransparence"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Subtle Tango Green"_ustr, getProperty(xTextFrame, u"FillGradientName"_ustr)); //Frame 6 xTextFrame = getShape(6); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Subtle Tango Green"_ustr, getProperty(xTextFrame, u"FillGradientName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 7 xTextFrame = getShape(7); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Subtle Tango Green"_ustr, getProperty(xTextFrame, u"FillGradientName"_ustr)); aGradientxTextFrame = getProperty(xTextFrame, u"FillTransparenceGradient"_ustr); CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); //Frame 8 xTextFrame = getShape(8); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Black 0 Degrees"_ustr, getProperty(xTextFrame, u"FillHatchName"_ustr)); CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, u"FillBackground"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 9 xTextFrame = getShape(9); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Black 0 Degrees"_ustr, getProperty(xTextFrame, u"FillHatchName"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, u"FillBackground"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 10 xTextFrame = getShape(10); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Black 0 Degrees"_ustr, getProperty(xTextFrame, u"FillHatchName"_ustr)); CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, u"FillBackground"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 11 xTextFrame = getShape(11); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Black 0 Degrees"_ustr, getProperty(xTextFrame, u"FillHatchName"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, u"FillBackground"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, u"FillTransparence"_ustr)); //Frame 12 xTextFrame = getShape(12); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Black 0 Degrees"_ustr, getProperty(xTextFrame, u"FillHatchName"_ustr)); CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, u"FillBackground"_ustr)); aGradientxTextFrame = getProperty(xTextFrame, u"FillTransparenceGradient"_ustr); CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); //Frame 13 xTextFrame = getShape(13); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Black 0 Degrees"_ustr, getProperty(xTextFrame, u"FillHatchName"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, u"FillBackground"_ustr)); aGradientxTextFrame = getProperty(xTextFrame, u"FillTransparenceGradient"_ustr); CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); //Frame 14 xTextFrame = getShape(14); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Sky"_ustr, getProperty(xTextFrame, u"FillBitmapName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillTransparence"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapPositionOffsetX"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapPositionOffsetY"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapOffsetX"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapOffsetY"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, u"FillBitmapTile"_ustr)); //Frame 15 xTextFrame = getShape(15); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Sky"_ustr, getProperty(xTextFrame, u"FillBitmapName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, u"FillTransparence"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapPositionOffsetX"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapPositionOffsetY"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapOffsetX"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapOffsetY"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, u"FillBitmapTile"_ustr)); //Frame 16 xTextFrame = getShape(16); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Sky"_ustr, getProperty(xTextFrame, u"FillBitmapName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapPositionOffsetX"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapPositionOffsetY"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapOffsetX"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, u"FillBitmapOffsetY"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, u"FillBitmapTile"_ustr)); aGradientxTextFrame = getProperty(xTextFrame, u"FillTransparenceGradient"_ustr); CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); }; createSwDoc("framebackgrounds.odt"); verify(); saveAndReload(mpFilter); verify(); xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); // check that there are 3 background-image elements assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']/style:background-image[@style:repeat='stretch']", 3); // tdf#90640: check that one of them is 55% opaque assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap' and @fo:background-color='transparent' and @draw:opacity='55%']/style:background-image[@style:repeat='stretch' and @draw:opacity='55%']", 1); // tdf#90640: check that one of them is 43% opaque // (emulated - hopefully not with rounding errors) assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap' and @fo:background-color='transparent' and @draw:opacity-name='Transparency_20_1']/style:background-image[@style:repeat='stretch' and @draw:opacity='43%']", 1); } CPPUNIT_TEST_FIXTURE(Test, testSHA1Correct) { // tdf#114939 this has both an affected password as well as content.xml const char* const sPass = "1012345678901234567890123456789012345678901234567890"; createSwDoc("sha1_correct.odt", sPass); CPPUNIT_ASSERT_EQUAL(1, getPages()); getParagraph(1, u"012"_ustr); saveAndReload(mpFilter, sPass); CPPUNIT_ASSERT_EQUAL(1, getPages()); getParagraph(1, u"012"_ustr); } CPPUNIT_TEST_FIXTURE(Test, testSHA1Wrong) { // tdf#114939 this has both an affected password as well as content.xml const char* const sPass = "1012345678901234567890123456789012345678901234567890"; createSwDoc("sha1_wrong.odt", sPass); CPPUNIT_ASSERT_EQUAL(1, getPages()); getParagraph(1, u"012"_ustr); saveAndReload(mpFilter, sPass); CPPUNIT_ASSERT_EQUAL(1, getPages()); getParagraph(1, u"012"_ustr); } CPPUNIT_TEST_FIXTURE(Test, testOOoxmlEmbedded) { loadAndReload("oooxml_embedded.sxw"); uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); uno::Sequence aSeq(xAccess->getElementNames()); CPPUNIT_ASSERT_EQUAL(sal_Int32(4), aSeq.getLength()); uno::Reference xEOSupplier1(xAccess->getByName(u"Object1"_ustr), uno::UNO_QUERY); uno::Reference xObj1(xEOSupplier1->getEmbeddedObject()); uno::Reference xEOSupplier2(xAccess->getByName(u"Object2"_ustr), uno::UNO_QUERY); uno::Reference xObj2(xEOSupplier2->getEmbeddedObject()); uno::Reference xEOSupplier3(xAccess->getByName(u"Object3"_ustr), uno::UNO_QUERY); uno::Reference xObj3(xEOSupplier3->getEmbeddedObject()); uno::Reference xEOSupplier4(xAccess->getByName(u"Object4"_ustr), uno::UNO_QUERY); uno::Reference xObj4(xEOSupplier4->getEmbeddedObject()); //checking first object uno::Reference xSBDoc1(xObj1, uno::UNO_QUERY); uno::Reference xStorage1(xSBDoc1->getDocumentStorage()); CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage1)); //checking second object uno::Reference xSBDoc2(xObj2, uno::UNO_QUERY); uno::Reference xStorage2(xSBDoc2->getDocumentStorage()); CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage2)); //checking third object uno::Reference xSBDoc3(xObj3, uno::UNO_QUERY); uno::Reference xStorage3(xSBDoc3->getDocumentStorage()); CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage3)); //checking fourth object uno::Reference xSBDoc4(xObj4, uno::UNO_QUERY); uno::Reference xStorage4(xSBDoc4->getDocumentStorage()); CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage4)); } DECLARE_ODFEXPORT_TEST(testTdf152710, "tdf152710.odt") { // Without this fix in place, this test would have crash at import time CPPUNIT_ASSERT_EQUAL(2, getPages()); } DECLARE_ODFEXPORT_TEST(testredlineTextFrame, "redlineTextFrame.odt") { CPPUNIT_ASSERT_EQUAL(2, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); //Note this is for a crash test //Counting the Number of Frames and checking with the expected count uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); } DECLARE_ODFEXPORT_TEST(testTdf107292, "tdf107292.odt") { // tracked deletions at the same position were loaded in reverse order CPPUNIT_ASSERT_EQUAL(1, getPages()); // Without this fix in place, this test would have failed with // - Expected: Lorem ipsum dolor sit... // - Actual : dolor ipsumLorem sit... CPPUNIT_ASSERT_EQUAL(u"Lorem ipsum dolor sit..."_ustr, getParagraph(1)->getString()); } DECLARE_ODFEXPORT_TEST(testTdf140437, "tdf140437.odt") { // Without the fix in place, the document would have failed to load CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference xFields(xFieldsAccess->createEnumeration()); // at least one field should be detected CPPUNIT_ASSERT(xFields->hasMoreElements()); } CPPUNIT_TEST_FIXTURE(Test, testTdf131621) { loadAndReload("tdf131621.ott"); CPPUNIT_ASSERT_EQUAL(12, getShapes()); //Crash test, Check number of pages CPPUNIT_ASSERT_EQUAL( 1, getPages() ); } CPPUNIT_TEST_FIXTURE(Test, testTdf135144) { loadAndReload("tdf135144.docx"); //Crashes at import time after roundtrip CPPUNIT_ASSERT_EQUAL(3, getPages()); CPPUNIT_ASSERT_EQUAL(4, getShapes()); } DECLARE_ODFEXPORT_TEST(testTdf130950, "tdf130950.odt") { //Crashes at import time CPPUNIT_ASSERT_EQUAL(1, getPages()); CPPUNIT_ASSERT_EQUAL(2, getShapes()); } DECLARE_ODFEXPORT_TEST(testFdo38244, "fdo38244.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // See ooxmlexport's testFdo38244(). // Test comment range feature. uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); xRunEnum->nextElement(); uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Annotation"_ustr, getProperty(xPropertySet, u"TextPortionType"_ustr)); xRunEnum->nextElement(); xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"AnnotationEnd"_ustr, getProperty(xPropertySet, u"TextPortionType"_ustr)); // Test properties uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference xFields(xFieldsAccess->createEnumeration()); xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"__Fieldmark__4_1833023242"_ustr, getProperty(xPropertySet, u"Name"_ustr)); CPPUNIT_ASSERT_EQUAL(u"M"_ustr, getProperty(xPropertySet, u"Initials"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testSenderInitials) { loadAndReload("sender-initials.fodt"); // Test sender-initial properties (both annotation metadata and text field) uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference xFields(xFieldsAccess->createEnumeration()); // first 3 are annotations, last 2 are text fields for (unsigned i = 0; i < 3; ++i) { uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"I"_ustr, getProperty(xPropertySet, u"Initials"_ustr)); } for (unsigned i = 0; i < 2; ++i) { uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(true, getProperty(xPropertySet, u"IsFixed"_ustr)); CPPUNIT_ASSERT_EQUAL(u"I"_ustr, getProperty(xPropertySet, u"Content"_ustr)); } } DECLARE_ODFEXPORT_TEST(testResolvedComment, "resolved-comment.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference xFields(xFieldsAccess->createEnumeration()); uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(true, getProperty(xPropertySet, u"Resolved"_ustr)); xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(false, getProperty(xPropertySet, u"Resolved"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testTdf92379) { auto verify = [this]() { // frame style fo:background-color was not imported uno::Reference xStyles(getStyles(u"FrameStyles"_ustr)); uno::Reference xStyle(xStyles->getByName(u"encarts"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), getProperty(xStyle, u"BackColorRGB"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xStyle, u"BackColorTransparency"_ustr)); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), getProperty(xStyle, u"FillColor"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle, u"FillTransparence"_ustr)); uno::Reference xFrameStyle2(xStyles->getByName(u"Untitled1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xFrameStyle2, u"BackColorRGB"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xFrameStyle2, u"BackTransparent"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty(xFrameStyle2, u"BackColorTransparency"_ustr)); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xFrameStyle2, u"FillStyle"_ustr)); // unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE // CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xFrameStyle2, "FillColor")); // CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xFrameStyle2, "FillTransparence")); // paragraph style fo:background-color was wrongly inherited despite being // overridden in derived style uno::Reference xParaStyles(getStyles(u"ParagraphStyles"_ustr)); uno::Reference xStyle1(xParaStyles->getByName( u"Titre Avis expert"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle1, u"ParaBackColor"_ustr)); CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle1, u"ParaBackTransparent"_ustr)); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle1, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle1, u"FillColor"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle1, u"FillTransparence"_ustr)); CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xStyle1, u"CharColor"_ustr)); uno::Reference xStyle2(xParaStyles->getByName( u"Avis expert questions"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xStyle2, u"ParaBackColor"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle2, u"ParaBackTransparent"_ustr)); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle2, u"FillStyle"_ustr)); // unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE // CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xStyle2, "FillColor")); // CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xStyle2, "FillTransparence")); CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle2, u"CharColor"_ustr)); uno::Reference xStyle31(xParaStyles->getByName( u"avis expert questions non cadres"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(Color(0x801900), getProperty(xStyle31, u"ParaBackColor"_ustr)); CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle31, u"ParaBackTransparent"_ustr)); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle31, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0x801900), getProperty(xStyle31, u"FillColor"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle31, u"FillTransparence"_ustr)); CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle31, u"CharColor"_ustr)); uno::Reference xStyle32(xParaStyles->getByName( u"Avis expert rXponses"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xStyle32, u"ParaBackColor"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle32, u"ParaBackTransparent"_ustr)); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle32, u"FillStyle"_ustr)); // unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE // CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xStyle32, "FillColor")); // CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xStyle32, "FillTransparence")); CPPUNIT_ASSERT_EQUAL(Color(0x461900), getProperty(xStyle32, u"CharColor"_ustr)); }; createSwDoc("tdf92379.fodt"); verify(); saveAndReload(mpFilter); verify(); xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // check that fo:background-color attribute is exported properly assertXPath(pXmlDoc, "//style:style[@style:family='graphic' and @style:name='encarts']/style:graphic-properties[@fo:background-color='#ffcc99']", 1); assertXPath(pXmlDoc, "//style:style[@style:family='graphic' and @style:name='Untitled1']/style:graphic-properties[@fo:background-color='transparent']", 1); // check that fo:background-color attribute is exported properly assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Titre Avis expert']/style:paragraph-properties[@fo:background-color='#661900']", 1); assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Avis expert questions']/style:paragraph-properties[@fo:background-color='transparent']", 1); assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='avis expert questions non cadres']/style:paragraph-properties[@fo:background-color='#801900']", 1); assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Avis expert rXponses']/style:paragraph-properties[@fo:background-color='transparent']", 1); } DECLARE_ODFEXPORT_TEST(testFdo79358, "fdo79358.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // the boolean properties of the index were not exported properly uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); uno::Reference xTOCIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); uno::Reference xTOCProps(xTOCIndex, uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(false, getProperty(xTOCProps, u"CreateFromOutline"_ustr)); CPPUNIT_ASSERT_EQUAL(false, getProperty(xTOCProps, u"CreateFromMarks"_ustr)); CPPUNIT_ASSERT_EQUAL(true, getProperty(xTOCProps, u"CreateFromLevelParagraphStyles"_ustr)); // check that the source styles are preserved too while at it uno::Reference xLevels( getProperty< uno::Reference >(xTOCProps, u"LevelParagraphStyles"_ustr)); uno::Sequence seq { u"Heading"_ustr }; CPPUNIT_ASSERT_EQUAL(uno::Any(seq), xLevels->getByIndex(1)); CPPUNIT_ASSERT_EQUAL(uno::Any(uno::Sequence()), xLevels->getByIndex(2)); } DECLARE_ODFEXPORT_TEST(testTextframeGradient, "textframe-gradient.odt") { CPPUNIT_ASSERT_EQUAL(2, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, u"FillStyle"_ustr)); awt::Gradient2 aGradient = getProperty(xFrame, u"FillGradient"_ustr); // MCGR: Use the completely imported gradient to check for correctness basegfx::BColorStops aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); CPPUNIT_ASSERT_EQUAL(0.0, aColorStops[0].getStopOffset()); CPPUNIT_ASSERT_EQUAL(Color(0xc0504d), Color(aColorStops[0].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); CPPUNIT_ASSERT_EQUAL(Color(0xd99594), Color(aColorStops[1].getStopColor())); CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); xFrame.set(xIndexAccess->getByIndex(1), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, u"FillStyle"_ustr)); aGradient = getProperty(xFrame, u"FillGradient"_ustr); // MCGR: Use the completely imported gradient to check for correctness aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); CPPUNIT_ASSERT_EQUAL(0.0, aColorStops[0].getStopOffset()); CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(aColorStops[0].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); CPPUNIT_ASSERT_EQUAL(COL_GRAY7, Color(aColorStops[1].getStopColor())); CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); } CPPUNIT_TEST_FIXTURE(Test, testDuplicateCrossRefHeadingBookmark) { loadAndReload("CrossRefHeadingBookmark.fodt"); // the file contains invalid duplicate heading cross reference bookmarks // but we have to round trip them, tdf#94804 uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xBookmarks = xBookmarksSupplier->getBookmarks(); uno::Reference xBookmark1( xBookmarks->getByName(u"__RefHeading__8284_1826734303"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT(xBookmark1.is()); CPPUNIT_ASSERT_THROW(xBookmarks->getByName(u"__RefHeading__1673_25705824"_ustr), container::NoSuchElementException); uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); uno::Reference xFields(xFieldsAccess->createEnumeration()); uno::Any aField1 = xFields->nextElement(); uno::Reference xField1(aField1, uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"1.1"_ustr, xField1->getPresentation(false)); uno::Any aField2 = xFields->nextElement(); uno::Reference xField2(aField2, uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"1.1"_ustr, xField2->getPresentation(false)); } DECLARE_ODFEXPORT_TEST(testFdo60769, "fdo60769.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Test multi-paragraph comment range feature. uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); while (xRunEnum->hasMoreElements()) { uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); OUString aType = getProperty(xPropertySet, u"TextPortionType"_ustr); // First paragraph: no field end, no anchor CPPUNIT_ASSERT(aType == "Text" || aType == "Annotation"); } xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); while (xRunEnum->hasMoreElements()) { uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); OUString aType = getProperty(xPropertySet, u"TextPortionType"_ustr); // Second paragraph: no field start CPPUNIT_ASSERT(aType == "Text" || aType == "AnnotationEnd"); } } DECLARE_ODFEXPORT_TEST(testTdf115815, "tdf115815.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Test comment range feature on tracked deletion. uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); bool bAnnotationStart = false; bool bBeforeAnnotation = true; OUString sTextBeforeAnnotation; while (xRunEnum->hasMoreElements()) { uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); OUString aType = getProperty(xPropertySet, u"TextPortionType"_ustr); // there is no AnnotationEnd with preceding AnnotationStart, // i.e. annotation with lost range CPPUNIT_ASSERT(aType != "AnnotationEnd" || !bAnnotationStart); bAnnotationStart = (aType == "Annotation"); // collect paragraph text before the first annotation if (bBeforeAnnotation) { if (bAnnotationStart) bBeforeAnnotation = false; else if (aType == "Text") { uno::Reference xRun(xPropertySet, uno::UNO_QUERY); sTextBeforeAnnotation += xRun->getString(); } } } // This was "Lorem ipsum" (collapsed annotation range) CPPUNIT_ASSERT_EQUAL(u"Lorem "_ustr, sTextBeforeAnnotation); } CPPUNIT_TEST_FIXTURE(Test, testFdo58949) { comphelper::ScopeGuard g([]() { std::shared_ptr pBatch( comphelper::ConfigurationChanges::create()); officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::set(true, pBatch); pBatch->commit(); }); std::shared_ptr pBatch( comphelper::ConfigurationChanges::create()); officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::set(false, pBatch); pBatch->commit(); loadAndReload("fdo58949.docx"); /* * The problem was that the exporter didn't insert "Obj102" to the * resulting zip file. No idea how to check for "broken" (missing OLE data * and replacement image) OLE objects using UNO, so we'll check the zip file directly. */ save(u"writer8"_ustr); uno::Sequence aArgs{ uno::Any(maTempFile.GetURL()) }; uno::Reference xNameAccess(m_xSFactory->createInstanceWithArguments(u"com.sun.star.packages.zip.ZipFileAccess"_ustr, aArgs), uno::UNO_QUERY); const css::uno::Sequence aNames(xNameAccess->getElementNames()); // The exported document must have three objects named ObjNNN. The names are assigned in // OLEHandler::copyOLEOStream using a static counter, and actual numbers depend on previous // tests; so just count the matching names here. int nMatches = 0; for (const OUString& sName : aNames) { OUString sRest; if (sName.startsWith("Obj", &sRest)) { // all following characters must be decimal digits; minimal value is 100 bool bMatch = sRest.getLength() >= 3 && std::all_of(sRest.getStr(), sRest.getStr() + sRest.getLength(), [](sal_Unicode ch) { return ch >= '0' && ch <= '9'; }); if (bMatch) ++nMatches; } } CPPUNIT_ASSERT_EQUAL(3, nMatches); } CPPUNIT_TEST_FIXTURE(Test, testTdf134987) { loadAndReload("tdf134987.docx"); uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); uno::Sequence aSeq(xAccess->getElementNames()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), aSeq.getLength()); OUString aMediaType; // checking first object (formula) { uno::Reference xEOSupplier(xAccess->getByName(u"Object1"_ustr), uno::UNO_QUERY); uno::Reference xObj(xEOSupplier->getEmbeddedObject()); CPPUNIT_ASSERT(xObj.is()); uno::Reference xSBDoc(xObj, uno::UNO_QUERY); uno::Reference xStorage(xSBDoc->getDocumentStorage()); CPPUNIT_ASSERT(xStorage.is()); uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); CPPUNIT_ASSERT(xStorProps->getPropertyValue(u"MediaType"_ustr) >>= aMediaType); CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_ASCII)); } // checking second object (chart) { uno::Reference xEOSupplier(xAccess->getByName(u"Diagram 1"_ustr), uno::UNO_QUERY); uno::Reference xObj(xEOSupplier->getEmbeddedObject()); CPPUNIT_ASSERT(xObj.is()); uno::Reference xSBDoc(xObj, uno::UNO_QUERY); uno::Reference xStorage(xSBDoc->getDocumentStorage()); CPPUNIT_ASSERT(xStorage.is()); uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); CPPUNIT_ASSERT(xStorProps->getPropertyValue(u"MediaType"_ustr) >>= aMediaType); CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII)); } // checking third object (chart) { uno::Reference xEOSupplier(xAccess->getByName(u"Diagram 2"_ustr), uno::UNO_QUERY); uno::Reference xObj(xEOSupplier->getEmbeddedObject()); CPPUNIT_ASSERT(xObj.is()); uno::Reference xSBDoc(xObj, uno::UNO_QUERY); uno::Reference xStorage(xSBDoc->getDocumentStorage()); CPPUNIT_ASSERT(xStorage.is()); uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); CPPUNIT_ASSERT(xStorProps->getPropertyValue(u"MediaType"_ustr) >>= aMediaType); CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII)); } } DECLARE_ODFEXPORT_TEST(testStylePageNumber, "ooo321_stylepagenumber.odt") { CPPUNIT_ASSERT_EQUAL(5, getPages()); uno::Reference xTable1(getParagraphOrTable(1)); // actually no break attribute is written in this case // CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, getProperty(xTable1, "BreakType")); CPPUNIT_ASSERT_EQUAL(u"Left Page"_ustr, getProperty(xTable1, u"PageDescName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xTable1, u"PageNumberOffset"_ustr)); uno::Reference xPara1(getParagraphOrTable(2)); CPPUNIT_ASSERT_EQUAL(u"Right Page"_ustr, getProperty(xPara1, u"PageDescName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara1, u"PageNumberOffset"_ustr)); // i#114163 tdf#77111: OOo < 3.3 bug, it wrote "auto" as "0" for tables uno::Reference xTable0(getParagraphOrTable(3), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Left Page"_ustr, getProperty(xTable0, u"PageDescName"_ustr)); CPPUNIT_ASSERT_EQUAL(uno::Any(), xTable0->getPropertyValue(u"PageNumberOffset"_ustr)); uno::Reference xPara0(getParagraphOrTable(4), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Right Page"_ustr, getProperty(xPara0, u"PageDescName"_ustr)); CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara0->getPropertyValue(u"PageNumberOffset"_ustr)); uno::Reference xParaStyles = getStyles(u"ParagraphStyles"_ustr); uno::Reference xStyle1(xParaStyles->getByName(u"stylewithbreak1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Right Page"_ustr, getProperty(xStyle1, u"PageDescName"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xStyle1, u"PageNumberOffset"_ustr)); uno::Reference xStyle0(xParaStyles->getByName(u"stylewithbreak0"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"First Page"_ustr, getProperty(xStyle0, u"PageDescName"_ustr)); CPPUNIT_ASSERT_EQUAL(uno::Any(), xStyle0->getPropertyValue(u"PageNumberOffset"_ustr)); } DECLARE_ODFEXPORT_TEST(testCharacterBorder, "charborder.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Make sure paragraph and character attributes don't interfere // First paragraph has a paragraph border and a character border included by the paragraph style // Paragraph border of first paragraph { const table::BorderLine2 aFirstParTopBorder(0x6666FF,2,26,26,7,55); const sal_Int32 aFirstParTopPadding(150); uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); // Top border CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,u"TopBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,u"TopBorderDistance"_ustr)); // Bottom border (same as top border) CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,u"BottomBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,u"BottomBorderDistance"_ustr)); // Left border (same as top border) CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,u"LeftBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,u"LeftBorderDistance"_ustr)); // Right border (same as top border) CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,u"RightBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,u"RightBorderDistance"_ustr)); // Shadow const table::ShadowFormat aShadow = getProperty(xSet,u"ParaShadowFormat"_ustr); CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(0), aShadow.Location); CPPUNIT_ASSERT_EQUAL(sal_Int16(0), aShadow.ShadowWidth); } // Character border for first paragraph { const table::BorderLine2 aFirstParCharTopBorder(0xFF3333,0,37,0,2,37); const sal_Int32 aFirstParCharTopPadding(450); uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); // Top border CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharTopBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharTopBorderDistance"_ustr)); // Bottom border (same as top border) CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharBottomBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharBottomBorderDistance"_ustr)); // Left border (same as top border) CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharLeftBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharLeftBorderDistance"_ustr)); // Right border (same as top border) CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharRightBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharRightBorderDistance"_ustr)); // Shadow const table::ShadowFormat aShadow = getProperty(xSet,u"CharShadowFormat"_ustr); CPPUNIT_ASSERT_EQUAL(Color(0xFF3333), Color(ColorTransparency, aShadow.Color)); CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(2), aShadow.Location); CPPUNIT_ASSERT_EQUAL(sal_Int16(280), aShadow.ShadowWidth); // Check autostyle { uno::Reference< style::XAutoStyleFamily > xAutoStyleFamily(getAutoStyles(u"ParagraphStyles"_ustr)); uno::Reference < container::XEnumeration > xAutoStylesEnum( xAutoStyleFamily->createEnumeration() ); CPPUNIT_ASSERT_EQUAL(true, static_cast(xAutoStylesEnum->hasMoreElements())); // Top border CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharTopBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharTopBorderDistance"_ustr)); // Bottom border CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharBottomBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharBottomBorderDistance"_ustr)); // Left border CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharLeftBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharLeftBorderDistance"_ustr)); // Right border CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,u"CharRightBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,u"CharRightBorderDistance"_ustr)); } } // Second paragraph's second text portion has a character style named CharDiffBor // This style includes border with different sides { table::BorderLine2 aBorderArray[4] = { table::BorderLine2(0xFF3333,0,37,0,14,37), // Top (fine dashed line) table::BorderLine2(0x99FF66,26,26,53,11,106), // Bottom table::BorderLine2(0x6666FF,9,26,9,12,71), // Left table::BorderLine2(0,0,0,0,table::BorderLineStyle::NONE,0) // Right }; sal_Int32 aDistances[4] = { 400 /*Top*/, 300 /*Bottom*/, 250 /*Left*/, 0 /*Right*/ }; // Get second text portion of second paragraph uno::Reference < beans::XPropertySet > xSet( getRun(getParagraph(2),2), uno::UNO_QUERY ); // Top border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[0], getProperty(xSet,u"CharTopBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[0], getProperty(xSet,u"CharTopBorderDistance"_ustr)); // Bottom border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[1], getProperty(xSet,u"CharBottomBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[1], getProperty(xSet,u"CharBottomBorderDistance"_ustr)); // Left border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[2], getProperty(xSet,u"CharLeftBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[2], getProperty(xSet,u"CharLeftBorderDistance"_ustr)); // Right border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[3], getProperty(xSet,u"CharRightBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[3], getProperty(xSet,u"CharRightBorderDistance"_ustr)); // Shadow const table::ShadowFormat aShadow = getProperty(xSet,u"CharShadowFormat"_ustr); CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(3), aShadow.Location); CPPUNIT_ASSERT_EQUAL(sal_Int16(79), aShadow.ShadowWidth); // Check character style { uno::Reference< container::XNameAccess > xStyleFamily = getStyles(u"CharacterStyles"_ustr); uno::Reference < beans::XPropertySet > xStyleSet(xStyleFamily->getByName(u"CharDiffBor"_ustr), uno::UNO_QUERY); // Top border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[0], getProperty(xStyleSet,u"CharTopBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[0], getProperty(xStyleSet,u"CharTopBorderDistance"_ustr)); // Bottom border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[1], getProperty(xStyleSet,u"CharBottomBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[1], getProperty(xStyleSet,u"CharBottomBorderDistance"_ustr)); // Left border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[2], getProperty(xStyleSet,u"CharLeftBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[2], getProperty(xStyleSet,u"CharLeftBorderDistance"_ustr)); // Right border CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[3], getProperty(xStyleSet,u"CharRightBorder"_ustr)); CPPUNIT_ASSERT_EQUAL(aDistances[3], getProperty(xStyleSet,u"CharRightBorderDistance"_ustr)); } } } CPPUNIT_TEST_FIXTURE(Test, testProtectionKey) { auto verify = [this]() { static OUString constexpr password(u"1012345678901234567890123456789012345678901234567890"_ustr); // check 1 invalid OOo legacy password and 3 valid ODF 1.2 passwords uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); uno::Reference xSect0(xSections->getByIndex(0), uno::UNO_QUERY); uno::Sequence const key0(getProperty>(xSect0, u"ProtectionKey"_ustr)); CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key0, password)); uno::Reference xSect1(xSections->getByIndex(1), uno::UNO_QUERY); uno::Sequence const key1(getProperty>(xSect1, u"ProtectionKey"_ustr)); CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key1, password)); uno::Reference xSect2(xSections->getByIndex(2), uno::UNO_QUERY); uno::Sequence const key2(getProperty>(xSect2, u"ProtectionKey"_ustr)); CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key2, password)); uno::Reference xSect3(xSections->getByIndex(3), uno::UNO_QUERY); uno::Sequence const key3(getProperty>(xSect3, u"ProtectionKey"_ustr)); CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key3, password)); }; createSwDoc("protection-key.fodt"); verify(); saveAndReload(mpFilter); verify(); // we can't assume that the user entered the password; check that we // round-trip the password as-is xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); assertXPath(pXmlDoc, "//text:section[@text:name='Section0' and @text:protected='true' and @text:protection-key='vbnhxyBKtPHCA1wB21zG1Oha8ZA=']"); assertXPath(pXmlDoc, "//text:section[@text:name='Section1' and @text:protected='true' and @text:protection-key='nLHas0RIwepGDaH4c2hpyIUvIS8=']"); assertXPath(pXmlDoc, "//text:section[@text:name='Section2' and @text:protected='true' and @text:protection-key-digest-algorithm='http://www.w3.org/2000/09/xmldsig#sha256' and @text:protection-key='1tnJohagR2T0yF/v69hLPuumSTsj32CumW97nkKGuSQ=']"); assertXPath(pXmlDoc, "//text:section[@text:name='Section3' and @text:protected='true' and @text:protection-key-digest-algorithm='http://www.w3.org/2000/09/xmldsig#sha256' and @text:protection-key='1tnJohagR2T0yF/v69hLPuumSTsj32CumW97nkKGuSQ=']"); } CPPUNIT_TEST_FIXTURE(Test, testTdf128188) { loadAndReload("footnote-collect-at-end-of-section.fodt"); SwDoc* pDoc = getSwDoc(); SwFootnoteIdxs const& rFootnotes(pDoc->GetFootnoteIdxs()); // Section1 CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[0]->GetFootnote().GetNumber()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[0]->GetFootnote().GetNumberRLHidden()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[1]->GetFootnote().GetNumber()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[1]->GetFootnote().GetNumberRLHidden()); // Section2 CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[2]->GetFootnote().GetNumber()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[2]->GetFootnote().GetNumberRLHidden()); // deleted CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[3]->GetFootnote().GetNumber()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[3]->GetFootnote().GetNumberRLHidden()); // deleted CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnotes[4]->GetFootnote().GetNumber()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[4]->GetFootnote().GetNumberRLHidden()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnotes[5]->GetFootnote().GetNumber()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[5]->GetFootnote().GetNumberRLHidden()); } DECLARE_ODFEXPORT_TEST(testFdo43807, "fdo43807.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Drop Caps"_ustr,getProperty(xSet,u"DropCapCharStyleName"_ustr)); xSet.set(getParagraph(2), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"User Defined Drop Caps"_ustr,getProperty(xSet,u"DropCapCharStyleName"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testTdf103091) { loadAndReload("tdf103091.fodt"); // check that all conditional paragraph style conditions are imported uno::Reference xParaStyles(getStyles(u"ParagraphStyles"_ustr)); uno::Reference xStyle1(xParaStyles->getByName( u"Text body"_ustr), uno::UNO_QUERY); auto conditions(getProperty>(xStyle1, u"ParaStyleConditions"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int32(28), conditions.getLength()); CPPUNIT_ASSERT_EQUAL(u"TableHeader"_ustr, conditions[0].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Addressee"_ustr), conditions[0].Value); CPPUNIT_ASSERT_EQUAL(u"Table"_ustr, conditions[1].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Bibliography 1"_ustr), conditions[1].Value); CPPUNIT_ASSERT_EQUAL(u"Frame"_ustr, conditions[2].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Bibliography Heading"_ustr), conditions[2].Value); CPPUNIT_ASSERT_EQUAL(u"Section"_ustr, conditions[3].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Caption"_ustr), conditions[3].Value); CPPUNIT_ASSERT_EQUAL(u"Footnote"_ustr, conditions[4].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Salutation"_ustr), conditions[4].Value); CPPUNIT_ASSERT_EQUAL(u"Endnote"_ustr, conditions[5].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 1"_ustr), conditions[5].Value); CPPUNIT_ASSERT_EQUAL(u"Header"_ustr, conditions[6].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 2"_ustr), conditions[6].Value); CPPUNIT_ASSERT_EQUAL(u"Footer"_ustr, conditions[7].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 3"_ustr), conditions[7].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel1"_ustr, conditions[8].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 4"_ustr), conditions[8].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel2"_ustr, conditions[9].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 5"_ustr), conditions[9].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel3"_ustr, conditions[10].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 6"_ustr), conditions[10].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel4"_ustr, conditions[11].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 7"_ustr), conditions[11].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel5"_ustr, conditions[12].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 8"_ustr), conditions[12].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel6"_ustr, conditions[13].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 9"_ustr), conditions[13].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel7"_ustr, conditions[14].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents 10"_ustr), conditions[14].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel8"_ustr, conditions[15].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Contents Heading"_ustr), conditions[15].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel9"_ustr, conditions[16].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Standard"_ustr), conditions[16].Value); CPPUNIT_ASSERT_EQUAL(u"OutlineLevel10"_ustr, conditions[17].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Drawing"_ustr), conditions[17].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel1"_ustr, conditions[18].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Endnote"_ustr), conditions[18].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel2"_ustr, conditions[19].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"First line indent"_ustr), conditions[19].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel3"_ustr, conditions[20].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Footer"_ustr), conditions[20].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel4"_ustr, conditions[21].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Footer left"_ustr), conditions[21].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel5"_ustr, conditions[22].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Footer right"_ustr), conditions[22].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel6"_ustr, conditions[23].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Footnote"_ustr), conditions[23].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel7"_ustr, conditions[24].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Frame contents"_ustr), conditions[24].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel8"_ustr, conditions[25].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Hanging indent"_ustr), conditions[25].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel9"_ustr, conditions[26].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Header"_ustr), conditions[26].Value); CPPUNIT_ASSERT_EQUAL(u"NumberingLevel10"_ustr, conditions[27].Name); CPPUNIT_ASSERT_EQUAL(uno::Any(u"Header left"_ustr), conditions[27].Value); } DECLARE_ODFEXPORT_TEST(testTextframeTransparentShadow, "textframe-transparent-shadow.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xPicture = getShape(1); // ODF stores opacity of 75%, that means 25% transparency. CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty(xPicture, u"ShadowTransparence"_ustr)); } DECLARE_ODFEXPORT_TEST(testRelhPage, "relh-page.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTextFrame = getShape(1); // This was text::RelOrientation::FRAME (the default), RelativeHeightRelation was not handled in xmloff. CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xTextFrame, u"RelativeHeightRelation"_ustr)); // Make sure rel-height-rel doesn't affect width. CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xTextFrame, u"RelativeWidthRelation"_ustr)); // This was 2601, 20% height was relative from margin, not page. xmlDocUniquePtr pXmlDoc = parseLayoutDump(); CPPUNIT_ASSERT_EQUAL(sal_Int32(3168), getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/bounds", "height").toInt32()); } DECLARE_ODFEXPORT_TEST(testRelhPageTdf80282, "relh-page-tdf80282.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTextFrame = getShape(1); xmlDocUniquePtr pXmlDoc = parseLayoutDump(); assertXPath(pXmlDoc, "//anchored/fly/infos/bounds", "height", u"8391"); assertXPath(pXmlDoc, "//anchored/fly/infos/bounds", "width", u"5953"); } DECLARE_ODFEXPORT_TEST(testRelwPage, "relw-page.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTextFrame = getShape(1); // This was text::RelOrientation::FRAME (the default), RelativeWidthRelation was not handled in xmloff. CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xTextFrame, u"RelativeWidthRelation"_ustr)); // Make sure rel-width-rel doesn't affect height. CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xTextFrame, u"RelativeHeightRelation"_ustr)); // This was 3762, 40% width was relative from margin, not page. xmlDocUniquePtr pXmlDoc = parseLayoutDump(); CPPUNIT_ASSERT_EQUAL(sal_Int32(4896), getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/bounds", "width").toInt32()); } DECLARE_ODFEXPORT_TEST(testTextFrameVertAdjust, "textframe-vertadjust.odt") { CPPUNIT_ASSERT_EQUAL(3, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); // Test import/export of new frame attribute called TextVerticalAdjust // 1st frame's context is adjusted to the top uno::Reference xFrame(getTextFrameByName(u"Rectangle 1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_TOP, getProperty(xFrame, u"TextVerticalAdjust"_ustr)); // 2nd frame's context is adjusted to the center xFrame.set(getTextFrameByName(u"Rectangle 2"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_CENTER, getProperty(xFrame, u"TextVerticalAdjust"_ustr)); // 3rd frame's context is adjusted to the bottom xFrame.set(getTextFrameByName(u"Rectangle 3"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xFrame, u"TextVerticalAdjust"_ustr)); } DECLARE_ODFEXPORT_TEST(testTdf111891_frameVertStyle, "tdf111891_frameVertStyle.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xFrame(getShape(1), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xFrame, u"TextVerticalAdjust"_ustr)); } DECLARE_ODFEXPORT_TEST(testShapeRelsize, "shape-relsize.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xShape = getShape(1); // These were all 0, as style:rel-width/height was ignored on import for shapes. CPPUNIT_ASSERT_EQUAL(sal_Int16(40), getProperty(xShape, u"RelativeWidth"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(20), getProperty(xShape, u"RelativeHeight"_ustr)); // Relation was "page" for both width and height, should be "paragraph" for width. CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xShape, u"RelativeWidthRelation"_ustr)); // And make sure that height stays "page". CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, u"RelativeHeightRelation"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testTextboxRoundedCorners) { auto verify = [this]() { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xShape = getShape(1); comphelper::SequenceAsHashMap aCustomShapeGeometry(getProperty< uno::Sequence >(xShape, u"CustomShapeGeometry"_ustr)); // Test that the shape is a rounded rectangle. CPPUNIT_ASSERT_EQUAL(u"round-rectangle"_ustr, aCustomShapeGeometry[u"Type"_ustr].get()); // The shape text should start with a table, with "a" in its A1 cell. uno::Reference xText = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); uno::Reference xTable(getParagraphOrTable(1, xText), uno::UNO_QUERY); uno::Reference xCell(xTable->getCellByName(u"A1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"a"_ustr, xCell->getString()); }; createSwDoc("textbox-rounded-corners.odt"); verify(); saveAndReload(mpFilter); verify(); // Table inside a textbox should be in the extension namespace. xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); // This failed, as draw:custom-shape had a table:table child. assertXPath(pXmlDoc, "//draw:custom-shape/loext:table", "name", u"Table1"); } // test that import whitespace collapsing is compatible with old docs DECLARE_ODFEXPORT_TEST(testWhitespace, "whitespace.odt") { CPPUNIT_ASSERT_EQUAL(4, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xPara; uno::Reference xPortions; uno::Reference xPortion; xPara.set(getParagraphOrTable(1), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(2), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); CPPUNIT_ASSERT_EQUAL(u"http://example.com/"_ustr, getProperty(xPortion, u"HyperLinkURL"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(3), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Ruby"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(OUString(), xPortion->getString()); CPPUNIT_ASSERT_EQUAL(u"foo"_ustr, getProperty(xPortion, u"RubyText"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Ruby"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(OUString(), xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(4), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"InContentMetadata"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); { // what a stupid idea to require recursively enumerating this uno::Reference xMeta( getProperty>(xPortion, u"InContentMetadata"_ustr), uno::UNO_QUERY); uno::Reference xMetaPortions = xMeta->createEnumeration(); uno::Reference xMP(xMetaPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xMP, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xMP->getString()); CPPUNIT_ASSERT(!xMetaPortions->hasMoreElements()); } xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(5), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"TextField"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); { // what a stupid idea to require recursively enumerating this uno::Reference xMeta( getProperty>(xPortion, u"TextField"_ustr), uno::UNO_QUERY); uno::Reference xMetaPortions = xMeta->createEnumeration(); uno::Reference xMP(xMetaPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xMP, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xMP->getString()); CPPUNIT_ASSERT(!xMetaPortions->hasMoreElements()); } xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(7), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Frame"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(8), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Frame"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(9), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Frame"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(10), uno::UNO_QUERY); uno::Reference xCEA(xPara, uno::UNO_QUERY); uno::Reference xFrames( xCEA->createContentEnumeration(u"com.sun.star.text.TextContent"_ustr)); xFrames->nextElement(); // one at-paragraph frame CPPUNIT_ASSERT(!xFrames->hasMoreElements()); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(11), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Footnote"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(12), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"TextField"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(13), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Annotation"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"AnnotationEnd"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(15), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Bookmark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(16), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Bookmark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Bookmark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(17), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Redline"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Redline"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(18), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Redline"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Redline"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(19), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"ReferenceMark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(20), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"ReferenceMark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"ReferenceMark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(21), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"DocumentIndexMark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); xPara.set(getParagraphOrTable(22), uno::UNO_QUERY); xPortions.set(xPara->createEnumeration()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u"X "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"DocumentIndexMark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" "_ustr, xPortion->getString()); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"DocumentIndexMark"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT(!getProperty(xPortion, u"IsCollapsed"_ustr)); xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(u"Text"_ustr, getProperty(xPortion, u"TextPortionType"_ustr)); CPPUNIT_ASSERT_EQUAL(u" X"_ustr, xPortion->getString()); CPPUNIT_ASSERT(!xPortions->hasMoreElements()); } DECLARE_ODFEXPORT_TEST(testTdf136645, "tdf136645.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseLayoutDump(); // Without the fix in place, this would have failed with //- Expected: 2640 //- Actual : 3000 CPPUNIT_ASSERT_EQUAL(sal_Int32(2640), getXPath(pXmlDoc, "/root/page/body/section/column[1]/body/infos/bounds", "width").toInt32()); //- Expected: 6000 //- Actual : 6360 CPPUNIT_ASSERT_EQUAL(sal_Int32(6000), getXPath(pXmlDoc, "/root/page/body/section/column[2]/body/infos/bounds", "width").toInt32()); } DECLARE_ODFEXPORT_TEST(testBtlrCell, "btlr-cell.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Without the accompanying fix in place, this test would have failed, as // the btlr text direction in the A1 cell was lost on ODF import and // export. uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xTables = xSupplier->getTextTables(); uno::Reference xTable(xTables->getByName(u"Table1"_ustr), uno::UNO_QUERY); uno::Reference xA1(xTable->getCellByName(u"A1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, getProperty(xA1, u"WritingMode"_ustr)); uno::Reference xB1(xTable->getCellByName(u"B1"_ustr), uno::UNO_QUERY); auto nActual = getProperty(xB1, u"WritingMode"_ustr); CPPUNIT_ASSERT(nActual == text::WritingMode2::LR_TB || nActual == text::WritingMode2::CONTEXT); uno::Reference xC1(xTable->getCellByName(u"C1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, getProperty(xC1, u"WritingMode"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testBtlrFrame) { auto verify = [this](bool bIsExport = false) { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); // Without the accompanying fix in place, this test would have failed, as // the btlr text direction in the text frame was lost on ODF import and // export. uno::Reference xTextFrame(getShape(1), uno::UNO_QUERY); CPPUNIT_ASSERT(xTextFrame.is()); auto nActual = getProperty(xTextFrame, u"WritingMode"_ustr); CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, nActual); // Without the accompanying fix in place, this test would have failed, as the fly frame had // mbVertical==true, but mbVertLRBT==false, even if the writing direction in the doc model was // btlr. SwDoc* pDoc = getSwDoc(); SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); CPPUNIT_ASSERT(pLayout); SwFrame* pPageFrame = pLayout->GetLower(); CPPUNIT_ASSERT(pPageFrame); CPPUNIT_ASSERT(pPageFrame->IsPageFrame()); SwFrame* pBodyFrame = pPageFrame->GetLower(); CPPUNIT_ASSERT(pBodyFrame); CPPUNIT_ASSERT(pBodyFrame->IsBodyFrame()); SwFrame* pBodyTextFrame = pBodyFrame->GetLower(); CPPUNIT_ASSERT(pBodyTextFrame); CPPUNIT_ASSERT(pBodyTextFrame->IsTextFrame()); CPPUNIT_ASSERT(pBodyTextFrame->GetDrawObjs()); const SwSortedObjs& rAnchored = *pBodyTextFrame->GetDrawObjs(); CPPUNIT_ASSERT_EQUAL(static_cast(1), rAnchored.size()); auto* pFlyFrame = dynamic_cast(rAnchored[0]); CPPUNIT_ASSERT(pFlyFrame); CPPUNIT_ASSERT(pFlyFrame->IsVertLRBT()); if (!bIsExport) // Not yet exported, don't modify the doc model for test purposes. return; // Make sure that btlr -> tbrl transition clears the "BT" flag. xTextFrame->setPropertyValue(u"WritingMode"_ustr, uno::Any(text::WritingMode2::TB_LR)); pFlyFrame = dynamic_cast(rAnchored[0]); CPPUNIT_ASSERT(pFlyFrame); CPPUNIT_ASSERT(!pFlyFrame->IsVertLRBT()); }; createSwDoc("btlr-frame.odt"); verify(); saveAndReload(mpFilter); verify(/*bIsExport*/ true); } CPPUNIT_TEST_FIXTURE(Test, testTdf129520) { loadAndReload("tdf129520.docx"); CPPUNIT_ASSERT_EQUAL(1, getPages()); CPPUNIT_ASSERT_EQUAL(u"M"_ustr, getParagraph(1)->getString()); // Without this fix in place, this test would have failed with // - Expected: Ma // - Actual : CPPUNIT_ASSERT_EQUAL(u"Ma"_ustr, getParagraph(2)->getString()); CPPUNIT_ASSERT_EQUAL(u"1815"_ustr, getParagraph(3)->getString()); } DECLARE_ODFEXPORT_TEST(testFdo86963, "fdo86963.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Export of this document failed with beans::UnknownPropertyException. CPPUNIT_ASSERT_EQUAL(1, getShapes()); } DECLARE_ODFEXPORT_TEST(testTdf135338_firstLeftPageFooter, "tdf135338_firstLeftPageFooter.odt") { CPPUNIT_ASSERT_EQUAL(6, getPages()); // The first page is a left page only style, but it should still show the first page footer // instead of the left footer text "EVEN/LEFT (Left page only)" xmlDocUniquePtr pXmlDoc = parseLayoutDump(); assertXPathContent(pXmlDoc, "/root/page[2]/footer/txt/text()", u"First (Left page only)"); } DECLARE_ODFEXPORT_TEST(testGerrit13858, "gerrit13858.odt") { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); // Just make sure the output is valid. } DECLARE_ODFEXPORT_TEST(testOdtBorderTypes, "border_types.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); static const sal_Int32 lineStyles[] = { 0, 1, 2, 14, 16, 17, 3, 15 }; uno::Reference textDocument(mxComponent, uno::UNO_QUERY); uno::Reference xParaEnumAccess(textDocument->getText(), uno::UNO_QUERY); // list of paragraphs uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); do { uno::Reference xServiceInfo; if (xParaEnum->nextElement() >>= xServiceInfo) { if (xServiceInfo->supportsService(u"com.sun.star.text.TextTable"_ustr)) { uno::Reference const xCellRange(xServiceInfo, uno::UNO_QUERY_THROW); for (sal_Int32 row = 0; row < 15; row += 2) { uno::Reference xCell = xCellRange->getCellByPosition(1, row); uno::Reference< beans::XPropertySet > xPropSet(xCell, uno::UNO_QUERY_THROW); uno::Any aTopBorder = xPropSet->getPropertyValue(u"TopBorder"_ustr); table::BorderLine2 aTopBorderLine; if (aTopBorder >>= aTopBorderLine) { sal_Int32 lineStyle = aTopBorderLine.LineStyle; CPPUNIT_ASSERT_EQUAL(lineStyles[row / 2], lineStyle); } } //end of the 'for' loop } } } while (xParaEnum->hasMoreElements()); } DECLARE_ODFEXPORT_TEST(testMasterPageWithDrawingPage, "sw_hatch.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xStyles(getStyles(u"PageStyles"_ustr)); uno::Reference xStyle(xStyles->getByName(u"Standard"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xStyle, u"FillStyle"_ustr)); CPPUNIT_ASSERT_EQUAL(u"Blue -45 Degrees"_ustr, getProperty(xStyle, u"FillHatchName"_ustr)); CPPUNIT_ASSERT(!getProperty(xStyle, u"FillBackground"_ustr)); CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle, u"FillTransparence"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeOOo) { loadAndReload("pagestyle_background_ooo33.odt"); CPPUNIT_ASSERT_EQUAL(3, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // Standard assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-color", u"#99ccff"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); // Endnote assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"repeat"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Footnote assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"stretch"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); } CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeLO64) { loadAndReload("pagestyle_background_lo64.odt"); CPPUNIT_ASSERT_EQUAL(6, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // Standard assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-color", u"#99ccff"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); // Endnote assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"repeat"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Footnote assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"stretch"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Landscape assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"no-repeat"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Index assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"gradient"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "gradient-step-count", u"0"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); // First Page assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"hatch"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-hatch-solid", u"false"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); } CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeLO70) { loadAndReload("pagestyle_background_lo70.odt"); CPPUNIT_ASSERT_EQUAL(6, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // Standard assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-color", u"#99ccff"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); // Endnote assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"repeat"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Footnote assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"stretch"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Landscape assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"border"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "repeat", u"no-repeat"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-image-ref-point", u"top-left"); // Index assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"gradient"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "gradient-step-count", u"0"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); // First Page assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "background-size", u"full"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill", u"hatch"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "fill-hatch-solid", u"false"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" "]/style:drawing-page-properties", "opacity", u"100%"); } CPPUNIT_TEST_FIXTURE(Test, testFillBitmapUnused) { loadAndReload("fillbitmap3.odt"); CPPUNIT_ASSERT_EQUAL(4, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); // nav_5f_home and all its references are completely gone xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // paragraph style assertXPath(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties", "fill-color", u"#c0c0c0"); assertXPath(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties[@draw:fill-image-name]", 0); // page style page-layout assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:page-layout-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:page-layout-properties", "fill-image-name", u"nav_5f_up"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:header-style/style:header-footer-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:header-style/style:header-footer-properties", "fill-image-name", u"nav_5f_up"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:footer-style/style:header-footer-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:footer-style/style:header-footer-properties", "fill-image-name", u"nav_5f_up"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:page-layout-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:page-layout-properties[@draw:fill-image-name]", 0); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:header-style/style:header-footer-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:header-style/style:header-footer-properties[@draw:fill-image-name]", 0); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:footer-style/style:header-footer-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:footer-style/style:header-footer-properties[@draw:fill-image-name]", 0); // page style drawing-page assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties", "fill", u"bitmap"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties", "fill-image-name", u"nav_5f_up"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties", "fill", u"solid"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties", "fill-color", u"#c0c0c0"); assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties[@draw:fill-image-name]", 0); // the named items assertXPath(pXmlDoc, "/office:document-styles/office:styles/draw:fill-image", 1); assertXPath(pXmlDoc, "/office:document-styles/office:styles/draw:fill-image", "name", u"nav_5f_up"); } DECLARE_ODFEXPORT_TEST(testCellUserDefineAttr, "userdefattr-tablecell.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); uno::Reference const xCellA1(xTable->getCellByName(u"A1"_ustr), uno::UNO_SET_THROW); uno::Reference const xCellB1(xTable->getCellByName(u"B1"_ustr), uno::UNO_SET_THROW); uno::Reference const xCellC1(xTable->getCellByName(u"C1"_ustr), uno::UNO_SET_THROW); getUserDefineAttribute(uno::Any(xCellA1), u"proName"_ustr, u"v1"_ustr); getUserDefineAttribute(uno::Any(xCellB1), u"proName"_ustr, u"v2"_ustr); getUserDefineAttribute(uno::Any(xCellC1), u"proName"_ustr, u"v3"_ustr); } CPPUNIT_TEST_FIXTURE(Test, testEmbeddedPdf) { auto pPdfium = vcl::pdf::PDFiumLibrary::get(); if (!pPdfium) { return; } auto verify = [this]() { CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); uno::Reference xShape = getShape(1); // This failed, pdf+png replacement graphics pair didn't survive an ODT roundtrip. auto xReplacementGraphic = getProperty>(xShape, u"ReplacementGraphic"_ustr); CPPUNIT_ASSERT(xReplacementGraphic.is()); auto xGraphic = getProperty>(xShape, u"Graphic"_ustr); CPPUNIT_ASSERT(xGraphic.is()); // This was image/x-vclgraphic, not exposing the info that the image is a PDF one. CPPUNIT_ASSERT_EQUAL(u"application/pdf"_ustr, getProperty(xGraphic, u"MimeType"_ustr)); }; createSwDoc("embedded-pdf.odt"); verify(); saveAndReload(mpFilter); verify(); uno::Sequence aArgs{ uno::Any(maTempFile.GetURL()) }; uno::Reference xNameAccess(m_xSFactory->createInstanceWithArguments(u"com.sun.star.packages.zip.ZipFileAccess"_ustr, aArgs), uno::UNO_QUERY); bool bHasBitmap = false; const uno::Sequence aNames = xNameAccess->getElementNames(); for (const auto& rElementName : aNames) { if (rElementName.startsWith("Pictures") && rElementName.endsWith("png")) { bHasBitmap = true; break; } } // This failed, replacement was an svm file. CPPUNIT_ASSERT(bHasBitmap); } DECLARE_ODFEXPORT_TEST(testTableStyles1, "table_styles_1.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Table styles basic graphic test. // Doesn't cover all attributes. uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); uno::Reference xCellFamily(xFamilies->getByName(u"CellStyles"_ustr), uno::UNO_QUERY); uno::Reference xCell1Style; xCellFamily->getByName(u"Test style.1"_ustr) >>= xCell1Style; sal_Int32 nInt32 = 0xF0F0F0; table::BorderLine2 oBorder; CPPUNIT_ASSERT_EQUAL(Color(0xCC0000), getProperty(xCell1Style, u"BackColor"_ustr)); xCell1Style->getPropertyValue(u"WritingMode"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(4), nInt32); xCell1Style->getPropertyValue(u"VertOrient"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); xCell1Style->getPropertyValue(u"BorderDistance"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); xCell1Style->getPropertyValue(u"LeftBorderDistance"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); xCell1Style->getPropertyValue(u"RightBorderDistance"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); xCell1Style->getPropertyValue(u"TopBorderDistance"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); xCell1Style->getPropertyValue(u"BottomBorderDistance"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); xCell1Style->getPropertyValue(u"RightBorder"_ustr) >>= oBorder; CPPUNIT_ASSERT_EQUAL(sal_Int32(0), oBorder.Color); xCell1Style->getPropertyValue(u"LeftBorder"_ustr) >>= oBorder; CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); xCell1Style->getPropertyValue(u"TopBorder"_ustr) >>= oBorder; CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); xCell1Style->getPropertyValue(u"BottomBorder"_ustr) >>= oBorder; CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); } DECLARE_ODFEXPORT_TEST(testTableStyles2, "table_styles_2.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Table styles paragraph and char tests // Doesn't cover all attributes. // Problem: underline for table autoformat doesn't work. uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); uno::Reference xTableFamily(xFamilies->getByName(u"TableStyles"_ustr), uno::UNO_QUERY); uno::Reference xTableStyle(xTableFamily->getByName(u"Test style2"_ustr), uno::UNO_QUERY); uno::Reference xCell1Style; float fFloat = 0.; bool bBool = true; sal_Int16 nInt16 = 0xF0; sal_Int32 nInt32 = 0xF0F0F0; OUString sString; awt::FontSlant eCharPosture; // cell 1 xTableStyle->getByName(u"first-row-start-column"_ustr) >>= xCell1Style; xCell1Style->getPropertyValue(u"ParaAdjust"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); CPPUNIT_ASSERT_EQUAL(Color(0xFF6600), getProperty(xCell1Style, u"CharColor"_ustr)); xCell1Style->getPropertyValue(u"CharContoured"_ustr) >>= bBool; CPPUNIT_ASSERT_EQUAL(false, bBool); xCell1Style->getPropertyValue(u"CharShadowed"_ustr) >>= bBool; CPPUNIT_ASSERT_EQUAL(true, bBool); xCell1Style->getPropertyValue(u"CharStrikeout"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nInt32); xCell1Style->getPropertyValue(u"CharUnderline"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); // underline color is not working for table autoformats // xCell1Style->getPropertyValue("CharUnderlineHasColor") >>= bBool; // CPPUNIT_ASSERT_EQUAL(bool(false), bBool); // xCell1Style->getPropertyValue("CharUnderlineColor") >>= nInt64; // CPPUNIT_ASSERT_EQUAL(sal_Int64(-1), nInt64); // standard font xCell1Style->getPropertyValue(u"CharHeight"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); xCell1Style->getPropertyValue(u"CharWeight"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); xCell1Style->getPropertyValue(u"CharPosture"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); xCell1Style->getPropertyValue(u"CharFontName"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Courier"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleName"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(OUString(), sString); xCell1Style->getPropertyValue(u"CharFontFamily"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); xCell1Style->getPropertyValue(u"CharFontPitch"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); // cjk font xCell1Style->getPropertyValue(u"CharHeightAsian"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); xCell1Style->getPropertyValue(u"CharWeightAsian"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); xCell1Style->getPropertyValue(u"CharPostureAsian"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); xCell1Style->getPropertyValue(u"CharFontNameAsian"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Courier"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleNameAsian"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Regularna"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontFamilyAsian"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); xCell1Style->getPropertyValue(u"CharFontPitchAsian"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); // ctl font xCell1Style->getPropertyValue(u"CharHeightComplex"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); xCell1Style->getPropertyValue(u"CharWeightComplex"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); xCell1Style->getPropertyValue(u"CharPostureComplex"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); xCell1Style->getPropertyValue(u"CharFontNameComplex"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Courier"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleNameComplex"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Regularna"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontFamilyComplex"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); xCell1Style->getPropertyValue(u"CharFontPitchComplex"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); // cell 2 xTableStyle->getByName(u"first-row"_ustr) >>= xCell1Style; xCell1Style->getPropertyValue(u"ParaAdjust"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nInt32); CPPUNIT_ASSERT_EQUAL(Color(0x9900FF), getProperty(xCell1Style, u"CharColor"_ustr)); xCell1Style->getPropertyValue(u"CharContoured"_ustr) >>= bBool; CPPUNIT_ASSERT_EQUAL(true, bBool); xCell1Style->getPropertyValue(u"CharShadowed"_ustr) >>= bBool; CPPUNIT_ASSERT_EQUAL(false, bBool); xCell1Style->getPropertyValue(u"CharStrikeout"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); xCell1Style->getPropertyValue(u"CharUnderline"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nInt32); // underline color test place // standard font xCell1Style->getPropertyValue(u"CharHeight"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); xCell1Style->getPropertyValue(u"CharWeight"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); xCell1Style->getPropertyValue(u"CharPosture"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); xCell1Style->getPropertyValue(u"CharFontName"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Liberation Serif"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleName"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(OUString(), sString); xCell1Style->getPropertyValue(u"CharFontFamily"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); xCell1Style->getPropertyValue(u"CharFontPitch"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); // cjk font xCell1Style->getPropertyValue(u"CharHeightAsian"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); xCell1Style->getPropertyValue(u"CharWeightAsian"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); xCell1Style->getPropertyValue(u"CharPostureAsian"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); xCell1Style->getPropertyValue(u"CharFontNameAsian"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Liberation Serif"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleNameAsian"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Pogrubiona"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontFamilyAsian"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); xCell1Style->getPropertyValue(u"CharFontPitchAsian"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); // ctl font xCell1Style->getPropertyValue(u"CharHeightComplex"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); xCell1Style->getPropertyValue(u"CharWeightComplex"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); xCell1Style->getPropertyValue(u"CharPostureComplex"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); xCell1Style->getPropertyValue(u"CharFontNameComplex"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Liberation Serif"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleNameComplex"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Pogrubiona"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontFamilyComplex"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); xCell1Style->getPropertyValue(u"CharFontPitchComplex"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); // cell 3 xTableStyle->getByName(u"first-row-even-column"_ustr) >>= xCell1Style; xCell1Style->getPropertyValue(u"ParaAdjust"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nInt32); CPPUNIT_ASSERT_EQUAL(COL_BLACK, getProperty(xCell1Style, u"CharColor"_ustr)); xCell1Style->getPropertyValue(u"CharContoured"_ustr) >>= bBool; CPPUNIT_ASSERT_EQUAL(true, bBool); xCell1Style->getPropertyValue(u"CharShadowed"_ustr) >>= bBool; CPPUNIT_ASSERT_EQUAL(true, bBool); xCell1Style->getPropertyValue(u"CharStrikeout"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); xCell1Style->getPropertyValue(u"CharUnderline"_ustr) >>= nInt32; CPPUNIT_ASSERT_EQUAL(sal_Int32(6), nInt32); // underline color test place // standard font xCell1Style->getPropertyValue(u"CharHeight"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); xCell1Style->getPropertyValue(u"CharWeight"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); xCell1Style->getPropertyValue(u"CharPosture"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); xCell1Style->getPropertyValue(u"CharFontName"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Open Sans"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleName"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(OUString(), sString); xCell1Style->getPropertyValue(u"CharFontFamily"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); xCell1Style->getPropertyValue(u"CharFontPitch"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); // cjk font xCell1Style->getPropertyValue(u"CharHeightAsian"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); xCell1Style->getPropertyValue(u"CharWeightAsian"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); xCell1Style->getPropertyValue(u"CharPostureAsian"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); xCell1Style->getPropertyValue(u"CharFontNameAsian"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Open Sans"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleNameAsian"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Kursywa"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontFamilyAsian"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); xCell1Style->getPropertyValue(u"CharFontPitchAsian"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); // ctl font xCell1Style->getPropertyValue(u"CharHeightComplex"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); xCell1Style->getPropertyValue(u"CharWeightComplex"_ustr) >>= fFloat; CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); xCell1Style->getPropertyValue(u"CharPostureComplex"_ustr) >>= eCharPosture; CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); xCell1Style->getPropertyValue(u"CharFontNameComplex"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Open Sans"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontStyleNameComplex"_ustr) >>= sString; CPPUNIT_ASSERT_EQUAL(u"Kursywa"_ustr, sString); xCell1Style->getPropertyValue(u"CharFontFamilyComplex"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); xCell1Style->getPropertyValue(u"CharFontPitchComplex"_ustr) >>= nInt16; CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); } CPPUNIT_TEST_FIXTURE(Test, testTableStyles3) { loadAndReload("table_styles_3.odt"); CPPUNIT_ASSERT_EQUAL(1, getPages()); // This test checks if default valued attributes aren't exported. xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); // // For this element the only exported attributes are: "border-left", "border-bottom" assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "background-color"); // border-left place assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "border-right"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "border-top"); // border-bottom place assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "padding"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "padding-left"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "padding-right"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "padding-top"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "padding-bottom"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties", "writing-mode"); // should be absent, because it has only "text-align" attribute, which shouldn't be exported. // Assume that style:paragraph-properties and style:text-properties exists. assertXPathChildren(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']", 2); // // For this element the only exported attributes are: "use-window-font-color place", "font-size-asian", "font-name-asian", "font-family-asian", "font-name-complex", "font-family-complex" // use-window-font-color place assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "text-shadow"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "text-outline"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "text-line-through-style"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "text-line-through-type"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "text-underline-style"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "text-underline-color"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-size"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-weight"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-style"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-family"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-family-generic"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-pitch"); // font-size-asian place assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-weight-asian"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-style-asian"); // font-name-asian place // font-family-asian place assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-style-name-asian"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-family-generic-asian"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-pitch-asian"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-size-complex"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-weight-complex"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-style-complex"); // font-name-complex place // font-family-complex place assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-style-name-complex"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-family-generic-complex"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties", "font-pitch-complex"); } CPPUNIT_TEST_FIXTURE(Test, testTableStyles4) { createSwDoc("table_styles_4.odt"); // Test if loaded styles overwrite existing styles uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); uno::Reference xTableFamily(xFamilies->getByName(u"TableStyles"_ustr), uno::UNO_QUERY); uno::Reference xTableStyle(xTableFamily->getByName(u"Green"_ustr), uno::UNO_QUERY); uno::Reference xCell1Style; xTableStyle->getByName(u"first-row-start-column"_ustr) >>= xCell1Style; CPPUNIT_ASSERT_EQUAL(COL_LIGHTGREEN, getProperty(xCell1Style, u"BackColor"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testTableStyles5) { loadAndReload("table_styles_5.odt"); CPPUNIT_ASSERT_EQUAL(1, getPages()); // Test if cell styles doesn't have a style:parent-style-name attribute. xmlDocUniquePtr pXmlDoc = parseExport(u"styles.xml"_ustr); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.1']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.2']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.3']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.4']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.5']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.6']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.7']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.8']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.9']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.10']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.11']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.12']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.13']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.14']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.15']", "parent-style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.16']", "parent-style-name"); } CPPUNIT_TEST_FIXTURE(Test, testTdf145226) { loadAndReload("tdf145226.fodt"); CPPUNIT_ASSERT_EQUAL(1, getPages()); xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[1]", "style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[2]", "style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[3]", "style-name"); assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[4]", "style-name"); } DECLARE_ODFEXPORT_TEST(testTdf101710, "tdf101710.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); // Test that number format of cell styles can be imported and exported. uno::Reference xStyle(getStyles(u"CellStyles"_ustr)->getByName(u"Test Style.11"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(sal_uInt32(10104), getProperty(xStyle, u"NumberFormat"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testTdf129568) { loadAndReload("tdf129568.fodt"); // Test that export doesn't fail, and that style is imported and in use. uno::Reference xStyle(getStyles(u"CellStyles"_ustr)->getByName(u"Default Style.1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT(xStyle->isInUse()); CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getProperty(xStyle, u"BackColor"_ustr)); } CPPUNIT_TEST_FIXTURE(Test, testTdf129568ui) { loadAndReload("tdf129568-ui.fodt"); // Same as above, but styles referenced by UI name. uno::Reference xStyle(getStyles(u"CellStyles"_ustr)->getByName(u"Default Style.1"_ustr), uno::UNO_QUERY); CPPUNIT_ASSERT(xStyle->isInUse()); CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getProperty(xStyle, u"BackColor"_ustr)); } DECLARE_ODFEXPORT_TEST(testTdf132642_keepWithNextTable, "tdf132642_keepWithNextTable.odt") { // Since the row is very big, it should split over two pages. // Since up to this point we haven't tried to make it match MS formats, it should start on page 1. CPPUNIT_ASSERT_EQUAL_MESSAGE("Row splits over 2 pages", 2, getPages()); } DECLARE_ODFEXPORT_TEST(testArabicZeroNumberingRTF, "arabic-zero-numbering.rtf") { auto xNumberingRules = getProperty>( getParagraph(1), u"NumberingRules"_ustr); comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); // Without the accompanying fix in place, this test would have failed with: // - Expected: 64 // - Actual : 4 // i.e. numbering type was ARABIC, not ARABIC_ZERO. CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO), aMap[u"NumberingType"_ustr].get()); } DECLARE_ODFEXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.docx") { auto xNumberingRules = getProperty>(getParagraph(1), u"NumberingRules"_ustr); comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); // Without the accompanying fix in place, this test would have failed with: // - Expected: 64 // - Actual : 4 // i.e. numbering type was ARABIC, not ARABIC_ZERO. CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO), aMap[u"NumberingType"_ustr].get()); } DECLARE_ODFEXPORT_TEST(testArabicZero3Numbering, "arabic-zero3-numbering.docx") { auto xNumberingRules = getProperty>(getParagraph(1), u"NumberingRules"_ustr); comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); // Without the accompanying fix in place, this test would have failed with: // - Expected: 65 // - Actual : 4 // i.e. numbering type was ARABIC, not ARABIC_ZERO3. CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO3), aMap[u"NumberingType"_ustr].get()); } DECLARE_ODFEXPORT_TEST(testArabicZero4Numbering, "arabic-zero4-numbering.docx") { auto xNumberingRules = getProperty>(getParagraph(1), u"NumberingRules"_ustr); comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); // Without the accompanying fix in place, this test would have failed with: // - Expected: 66 // - Actual : 4 // i.e. numbering type was ARABIC, not ARABIC_ZERO4. CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO4), aMap[u"NumberingType"_ustr].get()); } DECLARE_ODFEXPORT_TEST(testArabicZero5Numbering, "arabic-zero5-numbering.docx") { auto xNumberingRules = getProperty>(getParagraph(1), u"NumberingRules"_ustr); comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); // Without the accompanying fix in place, this test would have failed with: // - Expected: 67 // - Actual : 4 // i.e. numbering type was ARABIC, not ARABIC_ZERO5. CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO5), aMap[u"NumberingType"_ustr].get()); } CPPUNIT_TEST_FIXTURE(Test, testImageMimetype) { loadAndReload("image-mimetype.odt"); CPPUNIT_ASSERT_EQUAL(1, getShapes()); CPPUNIT_ASSERT_EQUAL(1, getPages()); // Test that the loext:mimetype attribute is written for exported images, tdf#109202 xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); // Original image (svg) assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p/draw:frame/draw:image[@draw:mime-type='image/svg+xml']"); } } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */