/* -*- 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 "sdmodeltestbase.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class SdOOXMLExportTest4 : public SdModelTestBase { public: SdOOXMLExportTest4() : SdModelTestBase(u"/sd/qa/unit/data/"_ustr) { } }; CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf160591) { createSdImpressDoc("pptx/tdf160591.pptx"); save(u"Impress Office Open XML"_ustr); // Char scheme color xmlDocUniquePtr pXmlDoc1 = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:schemeClr"_ostr, "val"_ostr, u"lt2"_ustr); // Master slide ColorMap xmlDocUniquePtr pXmlDoc2 = parseExport(u"ppt/slideMasters/slideMaster1.xml"_ustr); assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "bg1"_ostr, u"dk1"_ustr); assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "tx1"_ostr, u"lt1"_ustr); assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "bg2"_ostr, u"dk2"_ustr); assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "tx2"_ostr, u"lt2"_ustr); // Master slide background assertXPath(pXmlDoc2, "/p:sldMaster/p:cSld/p:bg/p:bgPr/a:solidFill/a:schemeClr"_ostr, "val"_ostr, u"dk1"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testSmartArtPreserve) { createSdImpressDoc("pptx/smartart-preserve.pptx"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDoc = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:cNvPr"_ostr); assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/dgm:relIds"_ostr); assertXPath( pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:nvPr/p:extLst/p:ext"_ostr, "uri"_ostr, u"{D42A27DB-BD31-4B8C-83A1-F6EECF244321}"_ustr); assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:nvPr/" "p:extLst/p:ext/p14:modId"_ostr); xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/_rels/slide1.xml.rels"_ustr); assertXPath( pXmlDocRels, "(/rels:Relationships/rels:Relationship[@Target='../diagrams/layout1.xml'])[1]"_ostr, "Type"_ostr, u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramLayout"_ustr); assertXPath( pXmlDocRels, "(/rels:Relationships/rels:Relationship[@Target='../diagrams/data1.xml'])[1]"_ostr, "Type"_ostr, u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramData"_ustr); assertXPath( pXmlDocRels, "(/rels:Relationships/rels:Relationship[@Target='../diagrams/colors1.xml'])[1]"_ostr, "Type"_ostr, u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramColors"_ustr); assertXPath( pXmlDocRels, "(/rels:Relationships/rels:Relationship[@Target='../diagrams/quickStyle1.xml'])[1]"_ostr, "Type"_ostr, u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramQuickStyle"_ustr); xmlDocUniquePtr pXmlContentType = parseExport(u"[Content_Types].xml"_ustr); assertXPath( pXmlContentType, "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/layout1.xml']"_ostr, "ContentType"_ostr, u"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml"_ustr); assertXPath(pXmlContentType, "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/data1.xml']"_ostr, "ContentType"_ostr, u"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml"_ustr); assertXPath( pXmlContentType, "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/colors1.xml']"_ostr, "ContentType"_ostr, u"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml"_ustr); assertXPath( pXmlContentType, "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/quickStyle1.xml']"_ostr, "ContentType"_ostr, u"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125346) { // There are two themes in the test document, make sure we use the right theme createSdImpressDoc("pptx/tdf125346.pptx"); save(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); xPropSet->getPropertyValue(u"FillStyle"_ustr) >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); Color nFillColor; xPropSet->getPropertyValue(u"FillColor"_ustr) >>= nFillColor; CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125346_2) { // There are two themes in the test document, make sure we use the right theme // Test more slides with different themes createSdImpressDoc("pptx/tdf125346_2.pptx"); save(u"Impress Office Open XML"_ustr); { uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); xPropSet->getPropertyValue(u"FillStyle"_ustr) >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); Color nFillColor; xPropSet->getPropertyValue(u"FillColor"_ustr) >>= nFillColor; CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor); } { uno::Reference xShape(getShapeFromPage(0, 1)); uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); xPropSet->getPropertyValue(u"FillStyle"_ustr) >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); Color nFillColor; xPropSet->getPropertyValue(u"FillColor"_ustr) >>= nFillColor; CPPUNIT_ASSERT_EQUAL(Color(0x052F61), nFillColor); } { uno::Reference xShape(getShapeFromPage(0, 2)); uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); xPropSet->getPropertyValue(u"FillStyle"_ustr) >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); Color nFillColor; xPropSet->getPropertyValue(u"FillColor"_ustr) >>= nFillColor; CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor); } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125360) { // Check whether the changed fill transparency is exported correctly. // Color is defined by shape style createSdImpressDoc("pptx/tdf125360.pptx"); uno::Reference xShape(getShapeFromPage(0, 0)); xShape->setPropertyValue(u"FillTransparence"_ustr, uno::Any(static_cast(23))); save(u"Impress Office Open XML"_ustr); xShape.set(getShapeFromPage(0, 0)); sal_Int32 nTransparence = 0; xShape->getPropertyValue(u"FillTransparence"_ustr) >>= nTransparence; CPPUNIT_ASSERT_EQUAL(static_cast(23), nTransparence); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125360_1) { // Check whether the changed fill transparency is exported correctly. // Color is defined by color scheme createSdImpressDoc("pptx/tdf125360_1.pptx"); uno::Reference xShape(getShapeFromPage(0, 0)); xShape->setPropertyValue(u"FillTransparence"_ustr, uno::Any(static_cast(23))); save(u"Impress Office Open XML"_ustr); xShape.set(getShapeFromPage(0, 0)); sal_Int32 nTransparence = 0; xShape->getPropertyValue(u"FillTransparence"_ustr) >>= nTransparence; CPPUNIT_ASSERT_EQUAL(static_cast(23), nTransparence); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125360_2) { // Check whether the changed fill transparency is exported correctly. // Color is defined by color scheme with a transparency createSdImpressDoc("pptx/tdf125360_2.pptx"); uno::Reference xShape(getShapeFromPage(0, 0)); sal_Int32 nTransparence = 0; xShape->getPropertyValue(u"FillTransparence"_ustr) >>= nTransparence; CPPUNIT_ASSERT_EQUAL(static_cast(82), nTransparence); xShape->setPropertyValue(u"FillTransparence"_ustr, uno::Any(static_cast(23))); save(u"Impress Office Open XML"_ustr); xShape.set(getShapeFromPage(0, 0)); nTransparence = 0; xShape->getPropertyValue(u"FillTransparence"_ustr) >>= nTransparence; CPPUNIT_ASSERT_EQUAL(static_cast(23), nTransparence); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125551) { createSdImpressDoc("pptx/tdf125551.pptx"); save(u"Impress Office Open XML"_ustr); uno::Reference xGroupShape(getShapeFromPage(0, 0), uno::UNO_QUERY); uno::Reference xShapeBg(xGroupShape->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(static_cast(1024), xShapeBg->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast(576), xShapeBg->getPosition().Y); CPPUNIT_ASSERT_EQUAL(static_cast(10816), xShapeBg->getSize().Width); CPPUNIT_ASSERT_EQUAL(static_cast(8588), xShapeBg->getSize().Height); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf136830) { createSdImpressDoc("pptx/tdf136830.pptx"); save(u"Impress Office Open XML"_ustr); // Without the fix in place, the X position of the shapes would have been 0 uno::Reference xGroupShape(getShapeFromPage(0, 0), uno::UNO_QUERY); uno::Reference xShape1(xGroupShape->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(static_cast(14134), xShape1->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast(-5321), xShape1->getPosition().Y); uno::Reference xShape2(xGroupShape->getByIndex(1), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(static_cast(8085), xShape2->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast(8085), xShape2->getPosition().Y); uno::Reference xShape3(xGroupShape->getByIndex(2), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(static_cast(8283), xShape3->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast(4620), xShape3->getPosition().Y); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf126234) { createSdImpressDoc("pptx/tdf126234.pptx"); save(u"Impress Office Open XML"_ustr); // check relative size of the bullet, 400% is a legitimate value for MS Office document // Without a fix, it will fail to set the size correctly const SdrPage* pPage = GetPage(1); SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); CPPUNIT_ASSERT(pNumFmt); CPPUNIT_ASSERT_EQUAL(sal_uInt16(400), pNumFmt->GetNumRule().GetLevel(0).GetBulletRelSize()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf126741) { createSdImpressDoc("pptx/tdf126741.pptx"); save(u"Impress Office Open XML"_ustr); // dash dot dot line style import fix // The original fixed values are replaced with the percent values, because // with fix for tdf#127166 the MS Office preset styles are correctly detected. const SdrPage* pPage = GetPage(1); SdrObject* const pObj = pPage->GetObj(0); CPPUNIT_ASSERT(pObj); const XLineStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_LINESTYLE); const XLineDashItem& rDashItem = pObj->GetMergedItem(XATTR_LINEDASH); CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_DASH, rStyleItem.GetValue()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rDashItem.GetDashValue().GetDots()); CPPUNIT_ASSERT_EQUAL(800.0, rDashItem.GetDashValue().GetDotLen()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rDashItem.GetDashValue().GetDashes()); CPPUNIT_ASSERT_EQUAL(100.0, rDashItem.GetDashValue().GetDashLen()); CPPUNIT_ASSERT_EQUAL(300.0, rDashItem.GetDashValue().GetDistance()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf127372) { createSdImpressDoc("odp/tdf127372.odp"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); awt::Gradient2 aTransparenceGradient; xShape->getPropertyValue(u"FillTransparenceGradient"_ustr) >>= aTransparenceGradient; // MCGR: Use the completely imported gradient to check for correctness const basegfx::BColorStops aColorStops = model::gradient::getColorStopsFromUno(aTransparenceGradient.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_BLACK, Color(aColorStops[1].getStopColor())); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf127379) { createSdImpressDoc("odp/tdf127379.odp"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDoc->getDrawPages()->getCount()); uno::Reference xPage(getPage(0)); uno::Reference xPropSet(xPage, uno::UNO_QUERY); uno::Any aAny = xPropSet->getPropertyValue(u"Background"_ustr); CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue()); uno::Reference aXBackgroundPropSet; aAny >>= aXBackgroundPropSet; drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); aXBackgroundPropSet->getPropertyValue(u"FillStyle"_ustr) >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, aFillStyle); awt::Gradient2 aGradient; CPPUNIT_ASSERT(aXBackgroundPropSet->getPropertyValue(u"FillGradient"_ustr) >>= aGradient); // MCGR: Use the completely imported gradient to check for correctness const 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(COL_LIGHTRED, Color(aColorStops[0].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); CPPUNIT_ASSERT_EQUAL(Color(0x2a6099), Color(aColorStops[1].getStopColor())); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf98603) { createSdImpressDoc("pptx/tdf98603.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); uno::Reference xRun(getRunFromParagraph(0, xParagraph)); uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); css::lang::Locale aLocale; xPropSet->getPropertyValue(u"CharLocaleComplex"_ustr) >>= aLocale; CPPUNIT_ASSERT_EQUAL(u"he"_ustr, aLocale.Language); CPPUNIT_ASSERT_EQUAL(u"IL"_ustr, aLocale.Country); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf128213) { createSdImpressDoc("pptx/tdf128213.pptx"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDocContent = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm"_ostr, "rot"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf79082) { createSdImpressDoc("pptx/tdf79082.pptx"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDocContent = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]"_ostr, "pos"_ostr, u"360000"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]"_ostr, "algn"_ostr, u"l"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]"_ostr, "pos"_ostr, u"756000"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]"_ostr, "algn"_ostr, u"l"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]"_ostr, "pos"_ostr, u"1440000"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]"_ostr, "algn"_ostr, u"ctr"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]"_ostr, "pos"_ostr, u"1800000"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]"_ostr, "algn"_ostr, u"r"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]"_ostr, "pos"_ostr, u"3240000"_ustr); assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]"_ostr, "algn"_ostr, u"dec"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf129372) { //Without the fix in place, it would crash at import time createSdImpressDoc("pptx/tdf129372.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); const SdrPage* pPage = GetPage(1); const SdrObject* pObj = pPage->GetObj(0); CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); CPPUNIT_ASSERT_EQUAL(SdrObjKind::CustomShape, pObj->GetObjIdentifier()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeGlowEffect) { createSdImpressDoc("pptx/shape-glow-effect.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); sal_Int32 nRadius = -1; xShape->getPropertyValue(u"GlowEffectRadius"_ustr) >>= nRadius; CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 139700 EMU = 388.0556 mm/100 Color nColor; xShape->getPropertyValue(u"GlowEffectColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(Color(0xFFC000), nColor); sal_Int16 nTransparency; xShape->getPropertyValue(u"GlowEffectTransparency"_ustr) >>= nTransparency; CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nTransparency); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeTextGlowEffect) { createSdImpressDoc("pptx/shape-text-glow-effect.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); sal_Int32 nRadius = -1; xShape->getPropertyValue(u"GlowTextEffectRadius"_ustr) >>= nRadius; CPPUNIT_ASSERT_EQUAL(sal_Int32(706), nRadius); // 20 pt = 706 mm/100 Color nColor; xShape->getPropertyValue(u"GlowTextEffectColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(Color(0x4EA72E), nColor); sal_Int16 nTransparency; xShape->getPropertyValue(u"GlowTextEffectTransparency"_ustr) >>= nTransparency; CPPUNIT_ASSERT_EQUAL(sal_Int16(5), nTransparency); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testUnderline) { createSdImpressDoc("underline.fodp"); uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference xParagraph(getParagraphFromShape(0, xShape)); uno::Reference xRun(getRunFromParagraph(0, xParagraph)); uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); Color nColor; xPropSet->getPropertyValue(u"CharColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, nColor); xPropSet->getPropertyValue(u"CharUnderlineColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(COL_AUTO, nColor); sal_Int16 nUnderline; xPropSet->getPropertyValue(u"CharUnderline"_ustr) >>= nUnderline; CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::DOUBLE, nUnderline); saveAndReload(u"Impress Office Open XML"_ustr); xShape.set(getShapeFromPage(0, 0)); xParagraph.set(getParagraphFromShape(0, xShape)); xRun.set(getRunFromParagraph(0, xParagraph)); xPropSet.set(xRun, uno::UNO_QUERY_THROW); xPropSet->getPropertyValue(u"CharColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, nColor); xPropSet->getPropertyValue(u"CharUnderlineColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(COL_AUTO, nColor); xPropSet->getPropertyValue(u"CharUnderline"_ustr) >>= nUnderline; CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::DOUBLE, nUnderline); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf119087) { createSdImpressDoc("pptx/tdf119087.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); // This would fail both on export validation, and reloading the saved pptx file. // Get first paragraph of the text uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); // Get first run of the paragraph uno::Reference xRun(getRunFromParagraph(0, xParagraph)); uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); Color nColor = COL_AUTO; xPropSet->getPropertyValue(u"CharColor"_ustr) >>= nColor; CPPUNIT_ASSERT_EQUAL(Color(0x00B050), nColor); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf131554) { createSdImpressDoc("pptx/tdf131554.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(1, 0), uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL(static_cast(5622), xShape->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast(13251), xShape->getPosition().Y); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf132282) { createSdImpressDoc("pptx/tdf132282.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_QUERY); // Without the fix in place, the position would be 0,0, height = 1 and width = 1 CPPUNIT_ASSERT_EQUAL(static_cast(1736), xShape->getPosition().X); CPPUNIT_ASSERT_EQUAL(static_cast(763), xShape->getPosition().Y); CPPUNIT_ASSERT_EQUAL(static_cast(30523), xShape->getSize().Width); CPPUNIT_ASSERT_EQUAL(static_cast(2604), xShape->getSize().Height); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf132201EffectOrder) { createSdImpressDoc("pptx/effectOrder.pptx"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDocContent = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPathChildren(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst"_ostr, 2); // The relative order of effects is important: glow must be before shadow CPPUNIT_ASSERT_EQUAL( 0, getXPathPosition(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst"_ostr, "glow")); CPPUNIT_ASSERT_EQUAL( 1, getXPathPosition(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst"_ostr, "outerShdw")); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeSoftEdgeEffect) { createSdImpressDoc("pptx/shape-soft-edges.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); auto xShapeProps(getShapeFromPage(0, 0)); sal_Int32 nRadius = -1; xShapeProps->getPropertyValue(u"SoftEdgeRadius"_ustr) >>= nRadius; CPPUNIT_ASSERT_EQUAL(sal_Int32(635), nRadius); // 18 pt } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeShadowBlurEffect) { createSdImpressDoc("pptx/shape-blur-effect.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); bool bHasShadow = false; xShape->getPropertyValue(u"Shadow"_ustr) >>= bHasShadow; CPPUNIT_ASSERT(bHasShadow); sal_Int32 nRadius = -1; xShape->getPropertyValue(u"ShadowBlur"_ustr) >>= nRadius; CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 11 pt } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf119223) { createSdImpressDoc("odp/tdf119223.odp"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeCustomShape']"_ostr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomePicture']"_ostr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeFormula']"_ostr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeLine']"_ostr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeTextbox']"_ostr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeTable']"_ostr); assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeGroup']"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf128213ShapeRot) { createSdImpressDoc("pptx/tdf128213-shaperot.pptx"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:scene3d"_ostr); assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:scene3d/a:camera/a:rot"_ostr, "rev"_ostr, u"5400000"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125560_textDeflate) { createSdImpressDoc("pptx/ShapePlusImage.pptx"); // This problem did not affect the pptx export, only the ODP so assert that save(u"impress8"_ustr); xmlDocUniquePtr pXmlDocRels = parseExport(u"content.xml"_ustr); assertXPath(pXmlDocRels, "/office:document-content/office:body/office:presentation/draw:page/" "draw:custom-shape/draw:enhanced-geometry"_ostr, "type"_ostr, u"mso-spt161"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125560_textInflateTop) { createSdImpressDoc("pptx/ShapeTextInflateTop.pptx"); // This problem did not affect the pptx export, only the ODP so assert that save(u"impress8"_ustr); xmlDocUniquePtr pXmlDocRels = parseExport(u"content.xml"_ustr); assertXPath(pXmlDocRels, "/office:document-content/office:body/office:presentation/draw:page/" "draw:custom-shape/draw:enhanced-geometry"_ostr, "type"_ostr, u"mso-spt164"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf142235_TestPlaceholderTextAlignment) { createSdImpressDoc("odp/placeholder-box-textalignment.odp"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXml1 = parseExport(u"ppt/slides/slide2.xml"_ustr); xmlDocUniquePtr pXml2 = parseExport(u"ppt/slides/slide3.xml"_ustr); // Without the fix in place many of these asserts failed, because alignment was bad. assertXPath(pXml1, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr"_ostr, "anchor"_ostr, u"t"_ustr); assertXPath(pXml2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr"_ostr, "anchor"_ostr, u"t"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf96061_textHighlight) { createSdImpressDoc("pptx/tdf96061.pptx"); uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference const xParagraph1(getParagraphFromShape(0, xShape)); uno::Reference xRun1(getRunFromParagraph(0, xParagraph1)); uno::Reference xPropSet1(xRun1, uno::UNO_QUERY_THROW); Color aColor; xPropSet1->getPropertyValue(u"CharBackColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor); uno::Reference const xParagraph2(getParagraphFromShape(1, xShape)); uno::Reference xRun2(getRunFromParagraph(0, xParagraph2)); uno::Reference xPropSet2(xRun2, uno::UNO_QUERY_THROW); xPropSet2->getPropertyValue(u"CharBackColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(COL_AUTO, aColor); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape2(getShapeFromPage(0, 0)); uno::Reference const xParagraph3(getParagraphFromShape(0, xShape2)); uno::Reference xRun3(getRunFromParagraph(0, xParagraph3)); uno::Reference xPropSet3(xRun3, uno::UNO_QUERY_THROW); xPropSet3->getPropertyValue(u"CharBackColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor); uno::Reference const xParagraph4(getParagraphFromShape(1, xShape2)); uno::Reference xRun4(getRunFromParagraph(0, xParagraph4)); uno::Reference xPropSet4(xRun4, uno::UNO_QUERY_THROW); xPropSet4->getPropertyValue(u"CharBackColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(COL_AUTO, aColor); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf143222_embeddedWorksheet) { // Check import of embedded worksheet in slide. createSdImpressDoc("pptx/tdf143222.pptx"); const SdrPage* pPage = GetPage(1); const SdrOle2Obj* pOleObj = static_cast(pPage->GetObj(0)); CPPUNIT_ASSERT_MESSAGE("no object", pOleObj != nullptr); // Without the fix we lost the graphic of ole object. const Graphic* pGraphic = pOleObj->GetGraphic(); CPPUNIT_ASSERT_MESSAGE("no graphic", pGraphic != nullptr); // Check export of embedded worksheet in slide. saveAndReload(u"Impress Office Open XML"_ustr); pPage = GetPage(1); pOleObj = static_cast(pPage->GetObj(0)); CPPUNIT_ASSERT_MESSAGE("no object after the export", pOleObj != nullptr); pGraphic = pOleObj->GetGraphic(); CPPUNIT_ASSERT_MESSAGE("no graphic after the export", pGraphic != nullptr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf143315) { createSdImpressDoc("ppt/tdf143315-WordartWithoutBullet.ppt"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXml = parseExport(u"ppt/slides/slide1.xml"_ustr); // Without the fix in place, this would have failed with // - Expected: // - Actual : 216000 // - In , XPath '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr' unexpected 'marL' attribute assertXPathNoAttribute(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr"_ostr, "marL"_ostr); assertXPathNoAttribute(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr"_ostr, "indent"_ostr); assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buClr"_ostr, 0); assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buSzPct"_ostr, 0); assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buFont"_ostr, 0); assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buChar"_ostr, 0); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf147121) { // Get the bugdoc createSdImpressDoc("pptx/tdf147121.pptx"); // Get the second line props of the placeholder uno::Reference xPage(getPage(0)); uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW); uno::Reference xRun( getRunFromParagraph(2, getParagraphFromShape(0, xShape)), uno::UNO_QUERY_THROW); // Save the font size const auto nFontSizeBefore = xRun->getPropertyValue(u"CharHeight"_ustr).get() * 100; save(u"Impress Office Open XML"_ustr); // Parse the export xmlDocUniquePtr pXml = parseExport(u"ppt/slides/slide1.xml"_ustr); const auto nFontSizeAfter = getXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:br[1]/a:rPr"_ostr, "sz"_ostr) .toFloat(); // The font size was not saved before now it must be equal with the saved one. CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected font size", nFontSizeBefore, nFontSizeAfter); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf140912_PicturePlaceholder) { // Given a graphic placeholder with a custom prompt: createSdImpressDoc("pptx/tdfpictureplaceholder.pptx"); uno::Reference xShapeProps(getShapeFromPage(0, 0)); bool isEmptyPresentationObject = false; // Without the fix, it would not be imported as empty presentation object; // the text would be treated as its content. xShapeProps->getPropertyValue(u"IsEmptyPresentationObject"_ustr) >>= isEmptyPresentationObject; CPPUNIT_ASSERT(isEmptyPresentationObject); // If we supported custom prompt text, here we would also test "String" property, // which would be equal to "Insert Image". } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testEnhancedPathViewBox) { createSdImpressDoc("odp/tdf147978_enhancedPath_viewBox.odp"); saveAndReload(u"Impress Office Open XML"_ustr); auto xShapeProps(getShapeFromPage(0, 0)); awt::Rectangle aBoundRectangle; xShapeProps->getPropertyValue(u"BoundRect"_ustr) >>= aBoundRectangle; // The shape has a Bézier curve which does not touch the right edge. Prior to the fix the curve // was stretched to touch the edge, resulting in 5098 curve width instead of 2045. CPPUNIT_ASSERT_EQUAL(sal_Int32(2045), aBoundRectangle.Width); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf74670) { createSdImpressDoc("odp/tdf74670.odp"); save(u"Impress Office Open XML"_ustr); uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); const uno::Sequence aNames(xNameAccess->getElementNames()); int nImageFiles = 0; for (const auto& rElementName : aNames) if (rElementName.startsWith("ppt/media/image")) nImageFiles++; // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 2 // i.e. the embedded picture would have been saved twice. CPPUNIT_ASSERT_EQUAL(1, nImageFiles); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf109169_OctagonBevel) { // The document has a shape 'Octagon Bevel'. It consists of an octagon with 8 points and eight // facets with 4 points each, total 8+8*4=40 points. Without the patch it was exported as // rectangle and thus had 4 points. createSdImpressDoc("odp/tdf109169_Octagon.odp"); saveAndReload(u"Impress Office Open XML"_ustr); auto xPropSet(getShapeFromPage(0, 0)); auto aGeomPropSeq = xPropSet->getPropertyValue(u"CustomShapeGeometry"_ustr) .get>(); comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq); auto aPathSeq((aCustomShapeGeometry[u"Path"_ustr]).get>()); comphelper::SequenceAsHashMap aPath(aPathSeq); auto aCoordinates((aPath[u"Coordinates"_ustr]) .get>()); CPPUNIT_ASSERT_EQUAL(sal_Int32(40), aCoordinates.getLength()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf109169_DiamondBevel) { // The document has a shape 'Diamond Bevel'. It consists of a diamond with 4 points and four // facets with 4 points each, total 4+4*4=20 points. Without the patch it was exported as // rectangle and thus had 4 points. createSdImpressDoc("odp/tdf109169_Diamond.odp"); saveAndReload(u"Impress Office Open XML"_ustr); auto xPropSet(getShapeFromPage(0, 0)); auto aGeomPropSeq = xPropSet->getPropertyValue(u"CustomShapeGeometry"_ustr) .get>(); comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq); auto aPathSeq((aCustomShapeGeometry[u"Path"_ustr]).get>()); comphelper::SequenceAsHashMap aPath(aPathSeq); auto aCoordinates((aPath[u"Coordinates"_ustr]) .get>()); CPPUNIT_ASSERT_EQUAL(sal_Int32(20), aCoordinates.getLength()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf144092_emptyShapeTextProps) { // Document contains one shape and one table. Both without any text but with // text properties contained inside endParaRPr - The import and export // of endParaRPr for empty cells and shapes are tested here createSdImpressDoc("pptx/tdf144092-emptyShapeTextProps.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); Color aColor; // check text properties of empty shape uno::Reference xRectShapeProps(getShapeFromPage(1, 0)); CPPUNIT_ASSERT_EQUAL(u"Calibri"_ustr, xRectShapeProps->getPropertyValue(u"CharFontName"_ustr).get()); CPPUNIT_ASSERT_EQUAL(float(196), xRectShapeProps->getPropertyValue(u"CharHeight"_ustr).get()); xRectShapeProps->getPropertyValue(u"CharColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(Color(0x70AD47), aColor); const SdrPage* pPage = GetPage(1); sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pTableObj); uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); uno::Reference xCell; // check text properties of empty cells xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); xCell->getPropertyValue(u"CharColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor); xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); xCell->getPropertyValue(u"CharColor"_ustr) >>= aColor; CPPUNIT_ASSERT_EQUAL(Color(0x70AD47), aColor); CPPUNIT_ASSERT_EQUAL(float(96), xCell->getPropertyValue(u"CharHeight"_ustr).get()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf149551_tbrl90) { // The document contains a shape with writing mode TB_RL90. That is the same as vert="vert" in // OOXML. Without the patch it was not possible to use this writing mode at all. createSdImpressDoc("odp/tdf149551_tbrl90.odp"); // Test, that the shape has writing mode TB_RL90. uno::Reference xShapeProps(getShapeFromPage(0, 0)); sal_Int16 eWritingMode; xShapeProps->getPropertyValue(u"WritingMode"_ustr) >>= eWritingMode; CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL90, eWritingMode); // Test, that it is exported to vert="vert" save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDoc = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDoc, "//a:bodyPr"_ostr, "vert"_ostr, u"vert"_ustr); // Test, that the shape has writing mode TB_RL90 after read from pptx uno::Reference xShapeProps2(getShapeFromPage(0, 0)); sal_Int16 eWritingMode2; xShapeProps2->getPropertyValue(u"WritingMode"_ustr) >>= eWritingMode2; CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL90, eWritingMode2); // Test, that it is written to odp with loext:writing-mode="tb-rl90" save(u"impress8"_ustr); pXmlDoc = parseExport(u"content.xml"_ustr); assertXPath( pXmlDoc, "//style:style[@style:name='gr1']/style:graphic-properties[@loext:writing-mode='tb-rl90']"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf149551_btlr) { // The document contains a shape with writing mode BT_LR. That is the same as vert="vert270" in // OOXML. Without the patch it was not possible to use this writing mode at all for shapes. createSdImpressDoc("odp/tdf149551_btlr.odp"); // Test, that the shape has writing mode BT_LR. uno::Reference xShapeProps(getShapeFromPage(0, 0)); sal_Int16 eWritingMode; xShapeProps->getPropertyValue(u"WritingMode"_ustr) >>= eWritingMode; CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, eWritingMode); // Test, that it is exported to vert="vert270" save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDoc = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDoc, "//a:bodyPr"_ostr, "vert"_ostr, u"vert270"_ustr); // Test, that the shape has writing mode BT_LR after read from pptx uno::Reference xShapeProps2(getShapeFromPage(0, 0)); sal_Int16 eWritingMode2; xShapeProps2->getPropertyValue(u"WritingMode"_ustr) >>= eWritingMode2; CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, eWritingMode2); // Test, that it is written to odp with loext:writing-mode="bt-lr" save(u"impress8"_ustr); pXmlDoc = parseExport(u"content.xml"_ustr); assertXPath( pXmlDoc, "//style:style[@style:name='gr1']/style:graphic-properties[@loext:writing-mode='bt-lr']"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf94122_autoColor) { // Document contains three pages, with different scenarios for automatic // color export to pptx. // - First page: Page background light, automatic colored text on a FillType_NONE shape // - Second page: Page background dark, automatic colored text on a FillType_NONE shape // - Third page: Page background light, automatic colored text on a dark colored fill // and another automatic colored text on a light colored fill createSdImpressDoc("odp/tdf94122_autocolor.odp"); save(u"Impress Office Open XML"_ustr); // Without the accompanying fix in place, these tests would have failed with: // - Expected: 1 // - Actual : 0 // - In ..., XPath '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr' number of nodes is incorrect // i.e. automatic color wasn't resolved & exported xmlDocUniquePtr pXmlDocContent1 = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, "val"_ostr, u"000000"_ustr); xmlDocUniquePtr pXmlDocContent2 = parseExport(u"ppt/slides/slide2.xml"_ustr); assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, "val"_ostr, u"ffffff"_ustr); xmlDocUniquePtr pXmlDocContent3 = parseExport(u"ppt/slides/slide3.xml"_ustr); assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, "val"_ostr, u"ffffff"_ustr); assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, "val"_ostr, u"000000"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf124333) { // Document contains one rectangle and one embedded OLE object. createSdImpressDoc("pptx/ole.pptx"); // Without the fix in place, the number of shapes was 3. CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect", sal_Int32(2), getPage(0)->getCount()); saveAndReload(u"Impress Office Open XML"_ustr); // Check number of shapes after export. CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect after export", sal_Int32(2), getPage(0)->getCount()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testAutofittedTextboxIndent) { createSdImpressDoc("odp/autofitted-textbox-indent.odp"); save(u"Impress Office Open XML"_ustr); // Check that the indent hasn't changed and wasn't scaled when exporting // (the behaviour changed). xmlDocUniquePtr pXmlDocContent1 = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:pPr"_ostr, "marL"_ostr, u"1080000"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf151622_oleIcon) { createSdImpressDoc("odp/ole_icon.odp"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXml = parseExport(u"ppt/slides/slide1.xml"_ustr); // Without the accompanying fix in place, this test would have failed with: // - Expression: prop // - In ..., XPath '//p:oleObj' no attribute 'showAsIcon' exist // i.e. show as icon option wasn't exported. assertXPath(pXml, "//p:oleObj"_ostr, "showAsIcon"_ostr, u"1"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf152436) { createSdImpressDoc("pptx/ole-emf_min.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); // Check number of shapes after export. CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getPage(0)->getCount()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testLinkedOLE) { createSdImpressDoc("odp/linked_ole.odp"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXml = parseExport(u"ppt/slides/slide1.xml"_ustr); // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - In<>, XPath '//p:oleObj' number of nodes is incorrect // i.e. the linked ole object wasn't exported. assertXPath(pXml, "//p:oleObj"_ostr, 1); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf102261_testParaTabStopDefaultDistance) { createSdImpressDoc("pptx/tdf102261_testParaTabStopDefaultDistance.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); uno::Reference xShape(getShapeFromPage(0, 0)); { uno::Reference xPropSet(getParagraphFromShape(0, xShape), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL( sal_Int32{ 1270 }, xPropSet->getPropertyValue(u"ParaTabStopDefaultDistance"_ustr).get()); } { uno::Reference xPropSet(getParagraphFromShape(1, xShape), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL( sal_Int32{ 2540 }, xPropSet->getPropertyValue(u"ParaTabStopDefaultDistance"_ustr).get()); } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testNotesAuthorDate) { createSdImpressDoc("pptx/pres-with-notes.pptx"); auto pBatch(comphelper::ConfigurationChanges::create()); // 1. Remove all personal info, but keep note info officecfg::Office::Common::Security::Scripting::RemovePersonalInfoOnSaving::set(true, pBatch); officecfg::Office::Common::Security::Scripting::KeepNoteAuthorDateInfoOnSaving::set(true, pBatch); pBatch->commit(); saveAndReload(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXml = parseExport(u"ppt/commentAuthors.xml"_ustr); assertXPath(pXml, "/p:cmAuthorLst/p:cmAuthor[@id=0]"_ostr, "name"_ostr, "Hans Wurst"); assertXPath(pXml, "/p:cmAuthorLst/p:cmAuthor[@id=1]"_ostr, "name"_ostr, "Max Muster"); pXml = parseExport(u"ppt/comments/comment1.xml"_ustr); assertXPath(pXml, "/p:cmLst/p:cm"_ostr, "dt"_ostr, "2024-06-13T12:03:08.000000000"); // 2. Remove all personal info officecfg::Office::Common::Security::Scripting::KeepNoteAuthorDateInfoOnSaving::set(false, pBatch); pBatch->commit(); saveAndReload(u"Impress Office Open XML"_ustr); pXml = parseExport(u"ppt/commentAuthors.xml"_ustr); assertXPath(pXml, "/p:cmAuthorLst/p:cmAuthor[@id=0]"_ostr, "name"_ostr, "Author1"); assertXPath(pXml, "/p:cmAuthorLst/p:cmAuthor[@id=1]"_ostr, "name"_ostr, "Author2"); pXml = parseExport(u"ppt/comments/comment1.xml"_ustr); assertXPathNoAttribute(pXml, "/p:cmLst/p:cm"_ostr, "dt"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTableCellVerticalPropertyRoundtrip) { createSdImpressDoc("pptx/tcPr-vert-roundtrip.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXml = parseExport(u"ppt/slides/slide1.xml"_ustr); assertXPath(pXml, "(//a:tcPr)[1]"_ostr, "vert"_ostr, u"vert"_ustr); assertXPath(pXml, "(//a:tcPr)[2]"_ostr, "vert"_ostr, u"vert270"_ustr); assertXPath(pXml, "(//a:tcPr)[3]"_ostr, "vert"_ostr, u"wordArtVert"_ustr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf157740_slideMasters) { createSdImpressDoc("pptx/tdf157740.pptx"); saveAndReload(u"Impress Office Open XML"_ustr); // Test how many slidemaster we have xmlDocUniquePtr pXmlDocContent = parseExport(u"ppt/presentation.xml"_ustr); assertXPath(pXmlDocContent, "/p:presentation/p:sldMasterIdLst/p:sldMasterId"_ostr, 7); pXmlDocContent = parseExport(u"ppt/slideMasters/slideMaster1.xml"_ustr); assertXPath(pXmlDocContent, "/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId"_ostr, 1); pXmlDocContent = parseExport(u"ppt/slideMasters/slideMaster7.xml"_ustr); assertXPath(pXmlDocContent, "/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId"_ostr, 1); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf159931_slideLayouts) { createSdImpressDoc("odp/repeatBitmapMode.odp"); save(u"Impress Office Open XML"_ustr); xmlDocUniquePtr pXmlDocRels1 = parseExport(u"ppt/slides/_rels/slide1.xml.rels"_ustr); xmlDocUniquePtr pXmlDocRels2 = parseExport(u"ppt/slides/_rels/slide2.xml.rels"_ustr); assertXPath( pXmlDocRels1, "(/rels:Relationships/rels:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout'])"_ostr); // the relative target e.g. "../slideLayouts/slideLayout2.xml" OUString sRelativeLayoutPath1 = getXPathContent( pXmlDocRels1, "(/rels:Relationships/rels:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout'])/@Target"_ostr); assertXPath( pXmlDocRels2, "(/rels:Relationships/rels:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout'])"_ostr); // the relative target e.g. "../slideLayouts/slideLayout1.xml" OUString sRelativeLayoutPath2 = getXPathContent( pXmlDocRels2, "(/rels:Relationships/rels:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout'])/@Target"_ostr); uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); // Check that the referenced slideLayout files exist // Without the accompanying fix in place, this test would have failed with: // equality assertion failed // - Expected: 1 // - Actual : 0 // i.e. the referenced slideLayout file was missing on export. OUString sSlideLayoutName1 = sRelativeLayoutPath1.getToken(2, '/'); OUString sSlideLayoutName2 = sRelativeLayoutPath2.getToken(2, '/'); CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("ppt/slideLayouts/" + sSlideLayoutName1))); CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("ppt/slideLayouts/" + sSlideLayoutName2))); } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */