/* -*- 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 "sdmodeltestbase.hxx" #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 using namespace css; class SdOOXMLExportTest1 : public SdModelTestBase { public: SdOOXMLExportTest1() : SdModelTestBase("/sd/qa/unit/data/") { } }; namespace { template void checkFontAttributes(const SdrTextObj* pObj, ItemValue nVal, sal_uInt32 nId) { CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); const EditTextObject& aEdit = pObj->GetOutlinerParaObject()->GetTextObject(); std::vector rLst; aEdit.GetCharAttribs(0, rLst); for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); ++it) { const ItemType* pAttrib = dynamic_cast((*it).pAttr); if (pAttrib && pAttrib->Which() == nId) { CPPUNIT_ASSERT_EQUAL(nVal, static_cast(pAttrib->GetValue())); } } } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf152335) { createSdImpressDoc("pptx/tdf152335.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDocTheme = parseExport("ppt/theme/theme1.xml"); assertXPathChildren( pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:effectStyleLst/a:effectStyle[3]"_ostr, 1); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149803) { createSdImpressDoc("pptx/tdf149803.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp"_ostr, "useBgFill"_ostr, "1"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149311) { createSdImpressDoc("odp/tdf149311.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "slide2.xml"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149128) { createSdImpressDoc("odp/tdf149128.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, "id"_ostr, "8"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, "idx"_ostr, "0"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn"_ostr, "id"_ostr, "9"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn"_ostr, "idx"_ostr, "2"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf66228) { createSdImpressDoc("odp/tdf66228.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "bentConnector3"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf147919) { createSdImpressDoc("odp/tdf147919.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "bentConnector2"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:prstGeom/a:avLst/a:gd"_ostr, "name"_ostr, "adj1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "bentConnector3"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:xfrm"_ostr, "rot"_ostr, "16200000"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, "name"_ostr, "adj1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, "name"_ostr, "adj2"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "bentConnector4"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm"_ostr, "flipV"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm"_ostr, "rot"_ostr, "10800000"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, "name"_ostr, "adj1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, "name"_ostr, "adj2"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[3]"_ostr, "name"_ostr, "adj3"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "bentConnector5"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:xfrm"_ostr, "rot"_ostr, "16200000"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "curvedConnector2"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:xfrm"_ostr, "rot"_ostr, "16200000"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:prstGeom/a:avLst/a:gd"_ostr, "name"_ostr, "adj1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "curvedConnector3"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm"_ostr, "flipV"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm"_ostr, "rot"_ostr, "10800000"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, "name"_ostr, "adj1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, "name"_ostr, "adj2"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "curvedConnector4"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:xfrm"_ostr, "flipV"_ostr, "1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:xfrm"_ostr, "rot"_ostr, "16200000"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, "name"_ostr, "adj1"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, "name"_ostr, "adj2"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[3]"_ostr, "name"_ostr, "adj3"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, "curvedConnector5"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf130165) { createSdImpressDoc("pptx/tdf146223.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld"_ostr, "showMasterSp"_ostr, "0"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf124781) { createSdImpressDoc("odp/tdf124781.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:r[2]/a:rPr"_ostr, "baseline"_ostr, "33000"); xmlDocUniquePtr pXmlDoc2 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:r[2]/a:rPr"_ostr, "baseline"_ostr, "-8000"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf144914) { createSdImpressDoc("pptx/tdf144616.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=firstslide"); xmlDocUniquePtr pXmlDoc2 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=lastslide"); xmlDocUniquePtr pXmlDoc3 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=nextslide"); xmlDocUniquePtr pXmlDoc4 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=previousslide"); xmlDocUniquePtr pXmlDoc5 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc5, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinksldjump"); xmlDocUniquePtr pRelsDoc5 = parseExport("ppt/slides/_rels/slide1.xml.rels"); assertXPath(pRelsDoc5, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "slide2.xml"); xmlDocUniquePtr pXmlDoc6 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc6, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=endshow"); xmlDocUniquePtr pXmlDoc7 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc7, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, "id"_ostr, "rId2"); xmlDocUniquePtr pRelsDoc7 = parseExport("ppt/slides/_rels/slide1.xml.rels"); assertXPath(pRelsDoc7, "/rels:Relationships/rels:Relationship[@Id='rId2']"_ostr, "Target"_ostr, "http://www.example.com/"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf124232) { createSdImpressDoc("pptx/tdf141704.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=lastslide"); xmlDocUniquePtr pXmlDoc2 = parseExport("ppt/slides/slide2.xml"); assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=nextslide"); xmlDocUniquePtr pXmlDoc3 = parseExport("ppt/slides/slide3.xml"); assertXPath(pXmlDoc3, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=previousslide"); xmlDocUniquePtr pXmlDoc4 = parseExport("ppt/slides/slide4.xml"); assertXPath(pXmlDoc4, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "id"_ostr, "rId1"); xmlDocUniquePtr pRelsDoc4 = parseExport("ppt/slides/_rels/slide4.xml.rels"); assertXPath(pRelsDoc4, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "http://www.example.com/"); xmlDocUniquePtr pXmlDoc5 = parseExport("ppt/slides/slide5.xml"); assertXPath(pXmlDoc5, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinksldjump"); xmlDocUniquePtr pRelsDoc5 = parseExport("ppt/slides/_rels/slide5.xml.rels"); assertXPath(pRelsDoc5, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "slide6.xml"); xmlDocUniquePtr pXmlDoc6 = parseExport("ppt/slides/slide6.xml"); assertXPath(pXmlDoc6, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=endshow"); xmlDocUniquePtr pXmlDoc7 = parseExport("ppt/slides/slide7.xml"); assertXPath(pXmlDoc7, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=firstslide"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf143624) { createSdImpressDoc("pptx/tdf143624.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "useTimings"_ostr, "0"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf142648) { createSdImpressDoc("pptx/tdf142648.pptx"); uno::Reference xDPS(mxComponent, uno::UNO_QUERY_THROW); uno::Reference xDrawPages(xDPS->getDrawPages(), uno::UNO_SET_THROW); uno::Reference xDrawPage; xDrawPages->getByIndex(0) >>= xDrawPage; uno::Reference xNamed(xDrawPage, uno::UNO_QUERY_THROW); xNamed->setName("#Slide 1"); save("Impress Office Open XML"); xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide2.xml.rels"); assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "slide1.xml"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf47365) { createSdImpressDoc("pptx/loopNoPause.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "loop"_ostr, "1"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf125071) { createSdImpressDoc("pptx/tdf125071.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/presentation.xml"); assertXPath(pXmlDoc, "/p:presentation/p:custShowLst/p:custShow[1]"_ostr, "name"_ostr, "Custom1"); assertXPath(pXmlDoc, "/p:presentation/p:custShowLst/p:custShow[2]"_ostr, "name"_ostr, "Custom2"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf54037) { createSdImpressDoc("pptx/tdf54037.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:r/a:rPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinksldjump"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:r/a:rPr/a:hlinkClick"_ostr, "action"_ostr, "ppaction://hlinkshowjump?jump=nextslide"); assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "slide2.xml"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf127237) { createSdImpressDoc("pptx/tdf127237.pptx"); saveAndReload("impress8"); const SdrPage* pPage = GetPage(1); CPPUNIT_ASSERT(pPage != nullptr); sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pTableObj != nullptr); uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); Color nFillColor; uno::Reference xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); xCell->getPropertyValue("FillColor") >>= nFillColor; CPPUNIT_ASSERT_EQUAL(Color(0x0070C0), nFillColor); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc887230) { createSdImpressDoc("pptx/bnc887230.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0)); // Without the fix in place, this test would have failed with //- Expected: 255 //- Actual : 13421823 checkFontAttributes(pObj, Color(0x0000ff), EE_CHAR_COLOR); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc870233_1) { createSdImpressDoc("pptx/bnc870233_1.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); // The problem was all shapes had the same font (the last parsed font attributes overwrote all previous ones) // First shape has red, bold font { const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0)); checkFontAttributes(pObj, Color(0xff0000), EE_CHAR_COLOR); checkFontAttributes(pObj, WEIGHT_BOLD, EE_CHAR_WEIGHT); } // Second shape has blue, italic font { const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(1)); checkFontAttributes(pObj, Color(0x0000ff), EE_CHAR_COLOR); checkFontAttributes(pObj, ITALIC_NORMAL, EE_CHAR_ITALIC); } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc870233_2) { createSdImpressDoc("pptx/bnc870233_2.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); // The problem was in some SmartArts font color was wrong // First smart art has blue font color (direct formatting) { const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pObjGroup); const SdrTextObj* pObj = DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1)); checkFontAttributes(pObj, Color(0x0000ff), EE_CHAR_COLOR); } // Second smart art has "dk2" font color (style) { const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(1)); CPPUNIT_ASSERT(pObjGroup); const SdrTextObj* pObj = DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1)); checkFontAttributes(pObj, Color(0x1f497d), EE_CHAR_COLOR); } // Third smart art has white font color (style) { const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(2)); CPPUNIT_ASSERT(pObjGroup); const SdrTextObj* pObj = DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1)); checkFontAttributes(pObj, Color(0xffffff), EE_CHAR_COLOR); } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testN828390_4) { bool bPassed = false; createSdImpressDoc("n828390_4.odp"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); { std::vector rLst; SdrObject* pObj = pPage->GetObj(0); SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); CPPUNIT_ASSERT(pTxtObj); const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); aEdit.GetCharAttribs(0, rLst); for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); ++it) { const SvxFontHeightItem* pFontHeight = dynamic_cast((*it).pAttr); if (pFontHeight && (*it).nStart == 18) CPPUNIT_ASSERT_EQUAL_MESSAGE("Font height is wrong", static_cast(1129), pFontHeight->GetHeight()); const SvxFontItem* pFont = dynamic_cast((*it).pAttr); if (pFont) { CPPUNIT_ASSERT_EQUAL_MESSAGE("Font is wrong", OUString("Arial"), pFont->GetFamilyName()); bPassed = true; } const SvxWeightItem* pWeight = dynamic_cast((*it).pAttr); if (pWeight && (*it).nStart == 18) CPPUNIT_ASSERT_EQUAL_MESSAGE("Font Weight is wrong", WEIGHT_BOLD, pWeight->GetWeight()); } } CPPUNIT_ASSERT(bPassed); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testN828390_5) { createSdImpressDoc("n828390_5.odp"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); { SdrObject* pObj = pPage->GetObj(0); SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); CPPUNIT_ASSERT(pTxtObj); const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); const SvxNumBulletItem& rNumFmt = aEdit.GetParaAttribs(3).Get(EE_PARA_NUMBULLET); CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's relative size is wrong!", sal_uInt16(75), rNumFmt.GetNumRule().GetLevel(1).GetBulletRelSize()); // != 25 } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testLostPlaceholders) { createSdImpressDoc("pptx/LostPlaceholder.odp"); SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pXImpressDocument); SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); CPPUNIT_ASSERT(pDoc); auto pPage = pDoc->GetPage(1); CPPUNIT_ASSERT(pPage); auto pObj = pPage->GetObj(1); CPPUNIT_ASSERT(pObj); uno::Reference xShp(pObj->getUnoShape(), uno::UNO_QUERY); CPPUNIT_ASSERT(xShp); CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong ShapeType!", u"com.sun.star.presentation.OutlinerShape"_ustr, xShp->getShapeType()); uno::Reference xShpProps(xShp, uno::UNO_QUERY); // Without the fix in place there will be the following error: // Expected: com.sun.star.presentation.OutlinerShape // Actual: com.sun.star.drawing.CustomShape CPPUNIT_ASSERT_EQUAL_MESSAGE("It must be a placeholder!", true, xShpProps->getPropertyValue("IsPresentationObject").get()); // Without the fix in place this will the following: // Expected: true // Actual: false } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testPlaceholderFillAndOutlineExport) { createSdImpressDoc("pptx/LostPlaceholderFill.odp"); uno::Any aFillStyle; uno::Any aFillColor; uno::Any aLineStyle; uno::Any aLineColor; for (int i = 1; i <= 2; i++) { SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pXImpressDocument); SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); CPPUNIT_ASSERT(pDoc); auto pPage = pDoc->GetPage(1); CPPUNIT_ASSERT(pPage); auto pObj = pPage->GetObj(1); CPPUNIT_ASSERT(pObj); uno::Reference xShp(pObj->getUnoShape(), uno::UNO_QUERY); CPPUNIT_ASSERT(xShp); CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong ShapeType!", u"com.sun.star.presentation.OutlinerShape"_ustr, xShp->getShapeType()); uno::Reference xShpProps(xShp, uno::UNO_QUERY); CPPUNIT_ASSERT_EQUAL_MESSAGE( "It must be a placeholder!", true, xShpProps->getPropertyValue("IsPresentationObject").get()); if (i == 1) { aFillStyle = xShpProps->getPropertyValue("FillStyle"); aFillColor = xShpProps->getPropertyValue("FillColor"); aLineStyle = xShpProps->getPropertyValue("LineStyle"); aLineColor = xShpProps->getPropertyValue("LineColor"); saveAndReload("Impress Office Open XML"); continue; } else { CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder fillstyle has not been exported!", aFillStyle, xShpProps->getPropertyValue("FillStyle")); CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder fillcolor has not been exported!", aFillColor, xShpProps->getPropertyValue("FillColor")); CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder linestyle has not been exported!", aLineStyle, xShpProps->getPropertyValue("LineStyle")); CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder linecolor has not been exported!", aLineColor, xShpProps->getPropertyValue("LineColor")); break; } } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo71961) { createSdImpressDoc("fdo71961.odp"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); // Export to .pptx changes all text frames to custom shape objects, which obey TextWordWrap property // (which is false for text frames otherwise and is ignored). Check that frames that should wrap still do. auto pTxtObj = pPage->GetObj(1); CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); CPPUNIT_ASSERT_EQUAL(OUString("Text to be always wrapped"), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0)); CPPUNIT_ASSERT_EQUAL(true, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue()); pTxtObj = dynamic_cast(pPage->GetObj(2)); CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); CPPUNIT_ASSERT_EQUAL(OUString("Custom shape non-wrapped text"), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0)); CPPUNIT_ASSERT_EQUAL(false, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue()); pTxtObj = dynamic_cast(pPage->GetObj(3)); CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); CPPUNIT_ASSERT_EQUAL(OUString("Custom shape wrapped text"), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0)); CPPUNIT_ASSERT_EQUAL(true, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testN828390) { bool bPassed = false; createSdImpressDoc("pptx/n828390.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); { std::vector rLst; // Get the object SdrObject* pObj = pPage->GetObj(0); SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); CPPUNIT_ASSERT(pTxtObj); const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); aEdit.GetCharAttribs(0, rLst); bPassed = std::any_of(rLst.rbegin(), rLst.rend(), [](const EECharAttrib& rCharAttr) { const SvxEscapementItem* pFontEscapement = dynamic_cast(rCharAttr.pAttr); return pFontEscapement && (pFontEscapement->GetEsc() == -25); }); } CPPUNIT_ASSERT_MESSAGE("Subscript not exported properly", bPassed); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc880763) { createSdImpressDoc("pptx/bnc880763.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); // Check z-order of the two shapes, use background color to identify them // First object in the background has blue background color const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pObjGroup); const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(1); CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); CPPUNIT_ASSERT_EQUAL( Color(0x0000ff), (static_cast(pObj->GetMergedItem(XATTR_FILLCOLOR))).GetColorValue()); // Second object at the front has green background color pObj = pPage->GetObj(1); CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); CPPUNIT_ASSERT_EQUAL( Color(0x00ff00), (static_cast(pObj->GetMergedItem(XATTR_FILLCOLOR))).GetColorValue()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc862510_5) { createSdImpressDoc("pptx/bnc862510_5.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); // Same as testBnc870237, but here we check the horizontal spacing const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pObjGroup); const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(2); CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_UPPERDIST).GetValue()); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LOWERDIST).GetValue()); CPPUNIT_ASSERT_EQUAL(sal_Int32(7510), pObj->GetMergedItem(SDRATTR_TEXT_RIGHTDIST).GetValue()); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LEFTDIST).GetValue()); } // In numbering a bullet could be defined as empty (no character). // When exporting to OOXML make sure that the bullet is ignored and // not written into the file. CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc822347_EmptyBullet) { createSdImpressDoc("bnc822347_EmptyBullet.odp"); saveAndReload("Impress Office Open XML"); SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pXImpressDocument); SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); SdrOutliner* pOutliner = pDoc->GetInternalOutliner(); const SdrPage* pPage = pDoc->GetPage(1); SdrObject* pObject = pPage->GetObj(0); SdrTextObj* pTextObject = DynCastSdrTextObj(pObject); CPPUNIT_ASSERT(pTextObject); OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject(); const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject(); OUString sText = aEdit.GetText(0); CPPUNIT_ASSERT_EQUAL(OUString("M3 Feature Test"), sText); pOutliner->SetText(*pOutlinerParagraphObject); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pOutliner->GetParagraphCount()); const sal_Int16 nDepth = pOutliner->GetDepth(0); CPPUNIT_ASSERT_EQUAL(sal_Int16(-1), nDepth); // depth >= 0 means that the paragraph has bullets enabled } //Bullets not having any text following them are not getting exported to pptx correctly. CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo90607) { createSdImpressDoc("fdo90607.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1)); CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); OutlinerParaObject* pOutlinerParagraphObject = pTxtObj->GetOutlinerParaObject(); const sal_Int16 nDepth = pOutlinerParagraphObject->GetDepth(0); CPPUNIT_ASSERT_MESSAGE("not equal", nDepth != -1); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo83751) { createSdImpressDoc("pptx/fdo83751.pptx"); saveAndReload("Impress Office Open XML"); uno::Reference xDocumentPropertiesSupplier( mxComponent, uno::UNO_QUERY); uno::Reference xProps = xDocumentPropertiesSupplier->getDocumentProperties(); uno::Reference xUDProps(xProps->getUserDefinedProperties(), uno::UNO_QUERY); OUString propValue; xUDProps->getPropertyValue("Testing") >>= propValue; CPPUNIT_ASSERT_EQUAL(OUString("Document"), propValue); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo79731) { createSdImpressDoc("fdo79731.odp"); saveAndReload("Impress Office Open XML"); SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pXImpressDocument); SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); CPPUNIT_ASSERT(pDoc); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTableCellFillProperties) { // Load the original file createSdImpressDoc("odp/Table_with_Cell_Fill.odp"); // Export the document and import again for a check saveAndReload("Impress Office Open XML"); 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; // Test Solid fill color Color nColor; xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); xCell->getPropertyValue("FillColor") >>= nColor; CPPUNIT_ASSERT_EQUAL(Color(0x66ffff), nColor); // Test Picture fill type for cell drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); xCell->getPropertyValue("FillStyle") >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_BITMAP), static_cast(aFillStyle)); // Test Gradient fill type for cell xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW); xCell->getPropertyValue("FillStyle") >>= aFillStyle; CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast(aFillStyle)); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletStartNumber) { createSdImpressDoc("pptx/n90255.pptx"); saveAndReload("Impress Office Open XML"); 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_MESSAGE("Bullet's start number is wrong!", sal_Int16(3), sal_Int16(pNumFmt->GetNumRule().GetLevel(0).GetStart())); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testLineStyle) { createSdImpressDoc("pptx/lineStyle.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); SdrObject const* pShape = pPage->GetObj(0); CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr); const XLineStyleItem& rStyleItem = pShape->GetMergedItem(XATTR_LINESTYLE); CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong style", int(drawing::LineStyle_SOLID), static_cast(rStyleItem.GetValue())); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf134862) { createSdImpressDoc("pptx/tdf134862.pptx"); uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference xParagraph(getParagraphFromShape(0, xShape)); uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); sal_Int16 nWritingMode = 0; xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; // Without the fix in place, this test would have failed here CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, nWritingMode); saveAndReload("Impress Office Open XML"); xShape.set(getShapeFromPage(0, 0)); xParagraph.set(getParagraphFromShape(0, xShape)); xPropSet.set(xParagraph, uno::UNO_QUERY_THROW); nWritingMode = 0; xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, nWritingMode); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testRightToLeftParaghraph) { createSdImpressDoc("pptx/rightToLeftParagraph.pptx"); saveAndReload("Impress Office Open XML"); uno::Reference xShape(getShapeFromPage(0, 0)); // Get first paragraph uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); sal_Int16 nWritingMode = 0; xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, nWritingMode); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTextboxWithHyperlink) { createSdImpressDoc("pptx/hyperlinktest.pptx"); saveAndReload("Impress Office Open XML"); uno::Reference xShape(getShapeFromPage(0, 0)); // Get first paragraph uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); // first chunk of text uno::Reference xRun(getRunFromParagraph(0, xParagraph)); uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); uno::Reference xField; xPropSet->getPropertyValue("TextField") >>= xField; CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); xPropSet.set(xField, uno::UNO_QUERY); OUString aURL; xPropSet->getPropertyValue("URL") >>= aURL; CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("http://www.xkcd.com/"), aURL); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf136911) { createSdImpressDoc("ppt/tdf136911.ppt"); saveAndReload("Impress Office Open XML"); uno::Reference xShape(getShapeFromPage(0, 0)); // Get second paragraph uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); // first chunk of text uno::Reference xRun(getRunFromParagraph(0, xParagraph)); uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); uno::Reference xField; xPropSet->getPropertyValue("TextField") >>= xField; CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); xPropSet.set(xField, uno::UNO_QUERY); OUString aURL; xPropSet->getPropertyValue("URL") >>= aURL; CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("http://google.com"), aURL); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletColor) { createSdImpressDoc("pptx/bulletColor.pptx"); saveAndReload("Impress Office Open XML"); 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_MESSAGE("Bullet's color is wrong!", Color(0xff0000), pNumFmt->GetNumRule().GetLevel(0).GetBulletColor()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletCharAndFont) { createSdImpressDoc("odp/bulletCharAndFont.odp"); saveAndReload("Impress Office Open XML"); uno::Reference xShape(getShapeFromPage(0, 0)); uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); uno::Reference xLevels(xPropSet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); uno::Sequence aProps; xLevels->getByIndex(0) >>= aProps; // 1st level OUString sBulletChar(u'\xf06c'); for (beans::PropertyValue const& rProp : std::as_const(aProps)) { if (rProp.Name == "BulletChar") CPPUNIT_ASSERT_EQUAL_MESSAGE("BulletChar incorrect.", sBulletChar, rProp.Value.get()); if (rProp.Name == "BulletFont") { awt::FontDescriptor aFontDescriptor; rProp.Value >>= aFontDescriptor; CPPUNIT_ASSERT_EQUAL_MESSAGE("BulletFont incorrect.", OUString("Wingdings"), aFontDescriptor.Name); } } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletMarginAndIndentation) { createSdImpressDoc("pptx/bulletMarginAndIndent.pptx"); saveAndReload("Impress Office Open XML"); 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_MESSAGE( "Bullet's left margin is wrong!", sal_Int32(1000), pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace()); // left margin is 0.79 cm CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's indentation is wrong!", sal_Int32(-1000), pNumFmt->GetNumRule().GetLevel(0).GetFirstLineOffset()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testParaMarginAndindentation) { createSdImpressDoc("pptx/paraMarginAndIndentation.pptx"); saveAndReload("Impress Office Open XML"); uno::Reference xShape(getShapeFromPage(0, 0)); // Get first paragraph uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); sal_Int32 nParaLeftMargin = 0; xPropSet->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin; CPPUNIT_ASSERT_EQUAL(sal_uInt32(1000), sal_uInt32(nParaLeftMargin)); sal_Int32 nParaFirstLineIndent = 0; xPropSet->getPropertyValue("ParaFirstLineIndent") >>= nParaFirstLineIndent; CPPUNIT_ASSERT_EQUAL(sal_Int32(-1270), nParaFirstLineIndent); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testCellLeftAndRightMargin) { createSdImpressDoc("pptx/n90223.pptx"); saveAndReload("Impress Office Open XML"); sal_Int32 nLeftMargin, nRightMargin; const SdrPage* pPage = GetPage(1); sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pTableObj); uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); uno::Reference xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); uno::Reference xCellPropSet(xCell, uno::UNO_QUERY_THROW); uno::Any aLeftMargin = xCellPropSet->getPropertyValue("TextLeftDistance"); CPPUNIT_ASSERT(aLeftMargin >>= nLeftMargin); uno::Any aRightMargin = xCellPropSet->getPropertyValue("TextRightDistance"); CPPUNIT_ASSERT(aRightMargin >>= nRightMargin); // Convert values to EMU nLeftMargin = oox::drawingml::convertHmmToEmu(nLeftMargin); nRightMargin = oox::drawingml::convertHmmToEmu(nRightMargin); CPPUNIT_ASSERT_EQUAL(sal_Int32(45720), nLeftMargin); CPPUNIT_ASSERT_EQUAL(sal_Int32(45720), nRightMargin); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testMergedCells) { createSdImpressDoc("odp/cellspan.odp"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pTableObj); uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); uno::Reference xText1(xTable->getCellByPosition(3, 0), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(OUString("0,3"), xText1->getString()); uno::Reference xText2(xTable->getCellByPosition(3, 2), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(OUString("2,3"), xText2->getString()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTableCellBorder) { createSdImpressDoc("pptx/n90190.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); CPPUNIT_ASSERT(pTableObj); table::BorderLine2 aBorderLine; uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); uno::Reference xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); uno::Reference xCellPropSet(xCell, uno::UNO_QUERY_THROW); xCellPropSet->getPropertyValue("LeftBorder") >>= aBorderLine; // While importing the table cell border line width, it converts EMU->Hmm then divided result by 2. // To get original value of LineWidth need to multiple by 2. sal_Int32 nLeftBorder = aBorderLine.LineWidth * 2; nLeftBorder = oox::drawingml::convertHmmToEmu(nLeftBorder); CPPUNIT_ASSERT(nLeftBorder); CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color)); xCellPropSet->getPropertyValue("RightBorder") >>= aBorderLine; sal_Int32 nRightBorder = aBorderLine.LineWidth * 2; nRightBorder = oox::drawingml::convertHmmToEmu(nRightBorder); CPPUNIT_ASSERT(nRightBorder); CPPUNIT_ASSERT_EQUAL(COL_WHITE, Color(ColorTransparency, aBorderLine.Color)); xCellPropSet->getPropertyValue("TopBorder") >>= aBorderLine; sal_Int32 nTopBorder = aBorderLine.LineWidth * 2; nTopBorder = oox::drawingml::convertHmmToEmu(nTopBorder); CPPUNIT_ASSERT(nTopBorder); CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color)); xCellPropSet->getPropertyValue("BottomBorder") >>= aBorderLine; sal_Int32 nBottomBorder = aBorderLine.LineWidth * 2; nBottomBorder = oox::drawingml::convertHmmToEmu(nBottomBorder); CPPUNIT_ASSERT(nBottomBorder); CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color)); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf111884) { createSdImpressDoc("pptx/tdf111884.pptx"); saveAndReload("Impress Office Open XML"); const SdrPage* pPage = GetPage(1); SdrObject const* pShape = pPage->GetObj(2); CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr); // must be a group shape CPPUNIT_ASSERT_EQUAL(SdrObjKind::Group, pShape->GetObjIdentifier()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf112633) { // Load document and export it to a temporary file createSdImpressDoc("pptx/tdf112633.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); // Check image with artistic effect exists in the slide assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:extLst/a:ext/a14:imgProps/" "a14:imgLayer/a14:imgEffect/a14:artisticPencilGrayscale"_ostr, "pencilSize"_ostr, "80"); // Check there is a relation with the .wdp file that contains the backed up image OUString sEmbedId1 = getXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:extLst/" "a:ext/a14:imgProps/a14:imgLayer"_ostr, "embed"_ostr); OUString sXmlPath = "/rels:Relationships/rels:Relationship[@Id='" + sEmbedId1 + "']"; assertXPath(pRelsDoc, OUStringToOString(sXmlPath, RTL_TEXTENCODING_UTF8), "Target"_ostr, "../media/hdphoto1.wdp"); // Check the .wdp file exists uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("ppt/media/hdphoto1.wdp"))); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128952) { createSdImpressDoc("pptx/tdf128952.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:off"_ostr, "x"_ostr, "360"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:off"_ostr, "y"_ostr, "-360"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:ext"_ostr, "cx"_ostr, "1919880"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:ext"_ostr, "cy"_ostr, "1462680"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf127090) { createSdImpressDoc("pptx/tdf127090.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr"_ostr, "rot"_ostr, "-5400000"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testCustomXml) { // Load document and export it to a temporary file createSdImpressDoc("pptx/customxml.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("customXml/item1.xml"); CPPUNIT_ASSERT(pXmlDoc); xmlDocUniquePtr pRelsDoc = parseExport("customXml/_rels/item1.xml.rels"); CPPUNIT_ASSERT(pRelsDoc); // Check there is a relation to itemProps1.xml. assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship"_ostr, 1); assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "itemProps1.xml"); std::unique_ptr pStream = parseExportStream(maTempFile.GetURL(), "ddp/ddpfile.xen"); CPPUNIT_ASSERT(pStream); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf94238) { // Load document and export it to a temporary file. createSdImpressDoc("pptx/tdf94238.pptx"); save("Impress Office Open XML"); uno::Reference xDoc(mxComponent, uno::UNO_QUERY); CPPUNIT_ASSERT(xDoc.is()); uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xPage.is()); uno::Reference xShape(getShape(0, xPage)); CPPUNIT_ASSERT(xShape.is()); awt::Gradient2 aGradient; CPPUNIT_ASSERT(xShape->getPropertyValue("FillGradient") >>= aGradient); // Without the accompanying fix in place, this test would have failed with // the following details: // - aGradient.Style was awt::GradientStyle_ELLIPTICAL // - aGradient.YOffset was 70 // - aGradient.Border was 0 CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_RADIAL, aGradient.Style); CPPUNIT_ASSERT_EQUAL(static_cast(100), aGradient.YOffset); // MCGR: 39->0 no border needed anymore with ooxml import CPPUNIT_ASSERT_EQUAL(static_cast(0), aGradient.Border); // MCGR: Use the completely imported gradient to check for correctness const basegfx::BColorStops aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); // Without the accompanying fix in place, this test would have failed with // 'Expected: 0, Actual : 10592673', i.e. the start color of the gradient // was incorrect. CPPUNIT_ASSERT_EQUAL(size_t(3), aColorStops.size()); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[0].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 0.39000000000000001)); CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[1].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[2].getStopOffset(), 1.0)); CPPUNIT_ASSERT_EQUAL(Color(0x8b8b8b), Color(aColorStops[2].getStopColor())); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testPictureTransparency) { // Load document and export it to a temporary file. createSdImpressDoc("odp/image_transparency.odp"); save("Impress Office Open XML"); uno::Reference xDoc(mxComponent, uno::UNO_QUERY); CPPUNIT_ASSERT(xDoc.is()); uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xPage.is()); uno::Reference xGraphicShape(getShape(0, xPage)); CPPUNIT_ASSERT(xGraphicShape.is()); sal_Int16 nTransparency = 0; CPPUNIT_ASSERT(xGraphicShape->getPropertyValue("Transparency") >>= nTransparency); CPPUNIT_ASSERT_EQUAL(static_cast(51), nTransparency); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf125554) { createSdImpressDoc("pptx/tdf125554.pptx"); saveAndReload("Impress Office Open XML"); uno::Reference xShape = getShapeFromPage(0, 0); uno::Any aFillTransparenceGradientName = xShape->getPropertyValue("FillTransparenceGradientName"); CPPUNIT_ASSERT(aFillTransparenceGradientName.has()); // Without the accompanying fix in place, this test would have failed, i.e. the transparency of // the shape has no gradient, so it looked like a solid fill instead of a gradient fill. CPPUNIT_ASSERT(!aFillTransparenceGradientName.get().isEmpty()); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testRoundtripOwnLineStyles) { // Load odp document and read the LineDash values. createSdImpressDoc("odp/LineStylesOwn.odp"); uno::Reference xDocodp(mxComponent, uno::UNO_QUERY); CPPUNIT_ASSERT(xDocodp.is()); uno::Reference xPageodp(xDocodp->getDrawPages()->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xPageodp.is()); drawing::LineDash aLineDashodp[10]; for (sal_uInt16 i = 0; i < 10; i++) { uno::Reference xShapeodp(getShape(i, xPageodp)); CPPUNIT_ASSERT(xShapeodp.is()); xShapeodp->getPropertyValue("LineDash") >>= aLineDashodp[i]; } // Save to pptx, reload and compare the LineDash values save("Impress Office Open XML"); uno::Reference xDocpptx(mxComponent, uno::UNO_QUERY); CPPUNIT_ASSERT(xDocpptx.is()); uno::Reference xPagepptx(xDocpptx->getDrawPages()->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xPagepptx.is()); for (sal_uInt16 i = 0; i < 10; i++) { drawing::LineDash aLineDashpptx; uno::Reference xShapepptx(getShape(i, xPagepptx)); CPPUNIT_ASSERT(xShapepptx.is()); xShapepptx->getPropertyValue("LineDash") >>= aLineDashpptx; bool bIsSameLineDash = (aLineDashodp[i].Style == aLineDashpptx.Style && aLineDashodp[i].Dots == aLineDashpptx.Dots && aLineDashodp[i].DotLen == aLineDashpptx.DotLen && aLineDashodp[i].Dashes == aLineDashpptx.Dashes && aLineDashodp[i].DashLen == aLineDashpptx.DashLen && aLineDashodp[i].Distance == aLineDashpptx.Distance); CPPUNIT_ASSERT_MESSAGE("LineDash differ", bIsSameLineDash); } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testRoundtripPrstDash) { // load and save document, compare prstDash values in saved document with original. createSdImpressDoc("pptx/presetDashDot.pptx"); save("Impress Office Open XML"); const OUString sOriginal[] = { "dash", "dashDot", "dot", "lgDash", "lgDashDot", "lgDashDotDot", "sysDash", "sysDashDot", "sysDashDotDot", "sysDot" }; xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OStringLiteral sStart = "/p:sld/p:cSld/p:spTree/p:sp["; static constexpr OStringLiteral sEnd = "]/p:spPr/a:ln/a:prstDash"; for (sal_uInt16 i = 0; i < 10; i++) { OString sXmlPath = sStart + OString::number(i + 1) + sEnd; OUString sResaved = getXPath(pXmlDoc, sXmlPath, "val"_ostr); CPPUNIT_ASSERT_EQUAL_MESSAGE("wrong prstDash", sOriginal[i], sResaved); } // tdf#126746: Make sure that dash-dot pattern starts with the longer dash, as defined in OOXML // Make sure Style is drawing::DashStyle_RECTRELATIVE uno::Reference xDoc(mxComponent, uno::UNO_QUERY); CPPUNIT_ASSERT(xDoc.is()); uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xPage.is()); for (sal_uInt16 i = 0; i < 10; i++) { drawing::LineDash aLineDash; uno::Reference xShape(getShape(i, xPage)); CPPUNIT_ASSERT(xShape.is()); xShape->getPropertyValue("LineDash") >>= aLineDash; CPPUNIT_ASSERT_MESSAGE("First dash is short", aLineDash.DotLen >= aLineDash.DashLen); bool bIsRectRelative = aLineDash.Style == drawing::DashStyle_RECTRELATIVE; CPPUNIT_ASSERT_MESSAGE("not RECTRELATIVE", bIsRectRelative); } } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testDashOnHairline) { // load and save document, make sure the custDash has 11 child elements. createSdImpressDoc("odp/tdf127267DashOnHairline.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:ln/a:custDash/a:ds"_ostr, 11); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testNarrationNonMediaShape) { createSdImpressDoc("pptx/narration-non-media-shape.pptx"); // Without the accompanying fix in place, this test would have failed, // beans::UnknownPropertyException was thrown. saveAndReload("Impress Office Open XML"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testCustomshapeBitmapfillSrcrect) { createSdImpressDoc("pptx/customshape-bitmapfill-srcrect.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); // tdf#132680 // We are preventing the side effect of DOCX improvement to PPTX case. // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - XPath '/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect' number of nodes is incorrect // i.e. was exported as in , which made part of the image // invisible. assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr); // tdf#134210 // Original values of attribute of l and r in xml files: // No core feature for handling this. We add support to import filter. We crop the bitmap // physically during import and shouldn't export the l r t b attributes anymore. In the // future if we add core feature to LibreOffice, we should change the control value with // 4393. assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, "l"_ostr); assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, "r"_ostr); assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, "t"_ostr); assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, "b"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf100348FontworkBitmapFill) { createSdImpressDoc("odp/tdf100348_FontworkBitmapFill.odp"); save("Impress Office Open XML"); // Make sure the fontwork shape has a blip bitmap fill and a colored outline. // Without the patch, fill and outline were black. xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr"_ostr); assertXPath(pXmlDoc, sPathStart + "/a:blipFill/a:blip", 1); assertXPath(pXmlDoc, sPathStart + "/a:ln/a:solidFill/a:srgbClr", "val"_ostr, "ffbf00"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf100348FontworkGradientGlow) { createSdImpressDoc("odp/tdf100348_FontworkGradientGlow.odp"); save("Impress Office Open XML"); // Make sure the fontwork shape has a gradient fill and a colored glow. // Without the patch, fill was black and no glow applied. xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr"_ostr); assertXPath(pXmlDoc, sPathStart + "/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val"_ostr, "8d281e"); assertXPath(pXmlDoc, sPathStart + "/a:effectLst/a:glow", "rad"_ostr, "63360"); assertXPath(pXmlDoc, sPathStart + "/a:effectLst/a:glow/a:srgbClr", "val"_ostr, "ff4500"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345FullTransparentGradient) { createSdImpressDoc("odp/tdf128345_FullTransparentGradient.odp"); save("Impress Office Open XML"); // Make sure the shape has no fill. Without the patch, fill was solid red. xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:noFill"_ostr); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345GradientLinear) { createSdImpressDoc("odp/tdf128345_GradientLinear.odp"); save("Impress Office Open XML"); // Make sure the shape has a lin fill. Without the patch, fill was solid red. xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill"_ostr); assertXPath(pXmlDoc, sPathStart + "/a:lin", "ang"_ostr, "3600000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs", 2); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]", "pos"_ostr, "25000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr", "val"_ostr, "ff0000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val"_ostr, "20000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]", "pos"_ostr, "100000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr", "val"_ostr, "ff0000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val"_ostr, "80000"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345GradientRadial) { createSdImpressDoc("odp/tdf128345_GradientRadial.odp"); save("Impress Office Open XML"); // Make sure the shape has transparency. In OOXML alpha means 'opacity' with default // 100000 for full opak, so only the full transparency with val 0 should be written. xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill"_ostr); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs", 2); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr", "val"_ostr, "ff0000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", 0); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr", "val"_ostr, "ffffff"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val"_ostr, "0"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345GradientAxial) { // Without the patch, symmetric linear gradient with full transparence outside and // full opak in the middle were imported as full transparent. createSdImpressDoc("odp/tdf128345_GradientAxial.odp"); saveAndReload("Impress Office Open XML"); uno::Reference xShapePropSet(getShapeFromPage(0, 0)); awt::Gradient2 aTransparenceGradient; xShapePropSet->getPropertyValue("FillTransparenceGradient") >>= 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(3), aColorStops.size()); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); CPPUNIT_ASSERT_EQUAL(Color(0xffffff), Color(aColorStops[0].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 0.5)); CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[1].getStopColor())); CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[2].getStopOffset(), 1.0)); CPPUNIT_ASSERT_EQUAL(Color(0xffffff), Color(aColorStops[2].getStopColor())); CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_LINEAR, aTransparenceGradient.Style); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf134969TransparencyOnColorGradient) { createSdImpressDoc("odp/tdf134969_TransparencyOnColorGradient.odp"); save("Impress Office Open XML"); // Make sure the shape has a transparency in gradient stops. xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill"_ostr); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs", 2); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val"_ostr, "60000"); assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val"_ostr, "60000"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testArcTo) { createSdImpressDoc("pptx/arc-validiert.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); static constexpr OString sPath("//a:custGeom/a:pathLst/a:path/a:arcTo"_ostr); assertXPath(pXmlDoc, sPath, "wR"_ostr, "3"); assertXPath(pXmlDoc, sPath, "hR"_ostr, "3"); assertXPath(pXmlDoc, sPath, "stAng"_ostr, "1800000"); assertXPath(pXmlDoc, sPath, "swAng"_ostr, "2700000"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testNarrationMimeType) { createSdImpressDoc("pptx/narration.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); // Without the accompanying fix in place, this test would have failed with: // - Expected: audio/mp4 // - Actual : application/vnd.sun.star.media // i.e. the mime type of the narration was incorrect. assertXPath(pXmlDoc, "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/media1.m4a']"_ostr, "ContentType"_ostr, "audio/mp4"); // Check if the bitmap of the media shape is exported correctly. xmlDocUniquePtr pSlideDoc = parseExport("ppt/slides/slide1.xml"); OUString aImageId = getXPath(pSlideDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip"_ostr, "embed"_ostr); xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); OUString aImagePath = "/rels:Relationships/rels:Relationship[@Id='" + aImageId + "']"; // Something like ../media/image2.png. OUString aImageStreamName = getXPath(pRelsDoc, aImagePath.toUtf8(), "Target"_ostr); OUString aImageAbsName = rtl::Uri::convertRelToAbs("file:///ppt/slides/", aImageStreamName); // Something like ppt/media/image2.png. OUString aImageRelName; CPPUNIT_ASSERT(aImageAbsName.startsWith("file:///", &aImageRelName)); std::unique_ptr pImageStream = parseExportStream(maTempFile.GetURL(), aImageRelName); vcl::PngImageReader aReader(*pImageStream); BitmapEx aBitmapEx = aReader.read(); // Without the accompanying fix in place, this test would have failed with: // - Expected: 256 // - Actual : 120 // i.e. the bitmap of the narration was lost, some default placeholder was exported instead. CPPUNIT_ASSERT_EQUAL(static_cast(256), aBitmapEx.GetSizePixel().Height()); // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // i.e. p:blipFill was missing its a:stretch child element, so the shape was invisible. assertXPath(pSlideDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:stretch/a:fillRect"_ostr, 1); // Without the accompanying fix in place, this test would have failed with: // - ... no attribute 'cmd' exist // i.e. '' was written instead of ''. assertXPath(pSlideDoc, "//p:cmd"_ostr, "cmd"_ostr, "playFrom(0.0)"); // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // i.e. had no children, the whole audio animation node was lost. assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode"_ostr, 1); // Without the accompanying fix in place, this test would have failed with: // - ... no attribute 'showWhenStopped' exist // i.e. had the default visibility -> bitmap was visible during slideshow. assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode"_ostr, "showWhenStopped"_ostr, "0"); // Without the accompanying fix in place, this test would have failed with: // - ... no attribute 'isNarration' exist // i.e. was not a narration -> could not mass-remove narrations on the UI. assertXPath(pSlideDoc, "//p:childTnLst/p:audio"_ostr, "isNarration"_ostr, "1"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf150316) { createSdImpressDoc("odp/tdf150316.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p/a:pPr"_ostr, "indent"_ostr, "-343080"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf140865Wordart3D) { createSdImpressDoc("pptx/tdf140865Wordart3D.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); // without the fix in place a:sp3d was lost on round trip, and so extrusion was lost. constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr"_ostr); assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "extrusionH"_ostr, "342900"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "contourW"_ostr, "12700"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "w"_ostr, "114300"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "h"_ostr, "38100"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "prst"_ostr, "softRound"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelB", "h"_ostr, "152400"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:extrusionClr/a:srgbClr", "val"_ostr, "990000"); assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:contourClr/a:srgbClr", "val"_ostr, "009876"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf124457) { createSdImpressDoc("pptx/tdf124457.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath( pXmlDoc, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par[1]/p:cTn"_ostr, "repeatCount"_ostr, "3000"); assertXPath( pXmlDoc, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par[2]/p:cTn"_ostr, "repeatCount"_ostr, "indefinite"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf143126) { createSdImpressDoc("pptx/tdf143126.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:sldRg"_ostr, "st"_ostr, "2"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:sldRg"_ostr, "end"_ostr, "3"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf143129) { createSdImpressDoc("pptx/tdf143129.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:custShow"_ostr, "id"_ostr, "0"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf118045) { createSdImpressDoc("odp/tdf118045.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:lnSpc/a:spcPct"_ostr, "val"_ostr, "110000"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf137675) { createSdImpressDoc("pptx/tdf137675.pptx"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path"_ostr, "fill"_ostr, "none"); } CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf151134) { createSdImpressDoc("pptx/tdf151134.odp"); save("Impress Office Open XML"); xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, "lIns"_ostr, "91440"); } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */