/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; namespace { /// Covers sd/source/filter/eppt/ fixes. class Test : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools { private: uno::Reference mxComponent; public: void setUp() override; void tearDown() override; void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override; uno::Reference& getComponent() { return mxComponent; } }; void Test::setUp() { test::BootstrapFixture::setUp(); mxDesktop.set(frame::Desktop::create(mxComponentContext)); } void Test::tearDown() { if (mxComponent.is()) mxComponent->dispose(); test::BootstrapFixture::tearDown(); } void Test::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) { XmlTestTools::registerOOXMLNamespaces(pXmlXpathCtx); } constexpr OUStringLiteral DATA_DIRECTORY = u"/sd/qa/filter/eppt/data/"; CPPUNIT_TEST_FIXTURE(Test, testOOXMLCustomShapeBitmapFill) { // Save the bugdoc to PPT. OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "custom-shape-bitmap-fill.pptx"; getComponent() = loadFromDesktop(aURL); utl::TempFile aTempFile; aTempFile.EnableKillingFile(); uno::Reference xStorable(getComponent(), uno::UNO_QUERY); utl::MediaDescriptor aMediaDescriptor; aMediaDescriptor["FilterName"] <<= OUString("MS PowerPoint 97"); xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); getComponent()->dispose(); getComponent() = loadFromDesktop(aTempFile.GetURL()); // Check if the bitmap shape was lost. uno::Reference xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); uno::Reference xDrawPages = xDrawPagesSupplier->getDrawPages(); uno::Reference xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY); uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); // Without the accompanying fix in place, this test would have failed with: // - Expected: com.sun.star.drawing.GraphicObjectShape // - Actual : com.sun.star.drawing.CustomShape // i.e. the custom shape geometry was kept, but the actual bitmap was lost. CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GraphicObjectShape"), xShape->getShapeType()); } CPPUNIT_TEST_FIXTURE(Test, testThemeExport) { // Given a document with a master slide and a theme, lt1 is set to 0x000002: uno::Reference xComponent = loadFromDesktop("private:factory/simpress"); uno::Reference xDrawPagesSupplier(xComponent, uno::UNO_QUERY); uno::Reference xDrawPage( xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); uno::Reference xMasterPage(xDrawPage->getMasterPage(), uno::UNO_QUERY); comphelper::SequenceAsHashMap aMap; aMap["Name"] <<= OUString("mytheme"); aMap["ColorSchemeName"] <<= OUString("mycolorscheme"); uno::Sequence aColorScheme = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc }; aMap["ColorScheme"] <<= aColorScheme; uno::Any aTheme(aMap.getAsConstPropertyValueList()); xMasterPage->setPropertyValue("Theme", aTheme); // When exporting to PPTX: utl::TempFile aTempFile; uno::Reference xStorable(xComponent, uno::UNO_QUERY); utl::MediaDescriptor aMediaDescriptor; aMediaDescriptor["FilterName"] <<= OUString("Impress Office Open XML"); aTempFile.EnableKillingFile(); xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); validate(aTempFile.GetFileName(), test::OOXML); // Then verify that this color is not lost: std::unique_ptr pStream = parseExportStream(aTempFile, "ppt/theme/theme1.xml"); xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get()); assertXPath(pXmlDoc, "//a:clrScheme/a:lt1/a:srgbClr", "val", "000002"); // Without the fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - XPath '//a:clrScheme/a:lt1/a:srgbClr' number of nodes is incorrect // i.e. the RGB color was lost on export. xComponent->dispose(); } CPPUNIT_TEST_FIXTURE(Test, testLoopingFromAnimation) { // Given a media shape that has an animation that specifies looping for the video: OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "video-loop.pptx"; getComponent() = loadFromDesktop(aURL); // When exporting that to PPTX: utl::TempFile aTempFile; uno::Reference xStorable(getComponent(), uno::UNO_QUERY); utl::MediaDescriptor aMediaDescriptor; aMediaDescriptor["FilterName"] <<= OUString("Impress Office Open XML"); aTempFile.EnableKillingFile(); xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); validate(aTempFile.GetFileName(), test::OOXML); // Then make sure that the "infinite" repeat count is written: std::unique_ptr pStream = parseExportStream(aTempFile, "ppt/slides/slide1.xml"); xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get()); // Without the fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - In <>, XPath '//p:cMediaNode/p:cTn' number of nodes is incorrect // i.e. the media node was lost on export, the video no longer looped. assertXPath(pXmlDoc, "//p:cMediaNode/p:cTn", "repeatCount", "indefinite"); } } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */