From 6ec9e87ced60add494f8d397017f8f9ffc65a00a Mon Sep 17 00:00:00 2001 From: László Németh Date: Mon, 30 Mar 2015 12:24:28 +0200 Subject: Unit tests for SkipImages SkipImages filter option skips image loading during DOC and DOCX imports, but it keeps the text of textboxes and custom shapes. Change-Id: Ia0ab3b350b9da22d9375787883678cc357a704b3 --- include/unotest/macros_test.hxx | 3 +- sw/qa/extras/globalfilter/data/skipimages.doc | Bin 0 -> 19968 bytes sw/qa/extras/globalfilter/data/skipimages.docx | Bin 0 -> 10925 bytes sw/qa/extras/globalfilter/globalfilter.cxx | 72 +++++++++++++++++++++++++ unotest/source/cpp/macros_test.cxx | 15 +++++- 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 sw/qa/extras/globalfilter/data/skipimages.doc create mode 100644 sw/qa/extras/globalfilter/data/skipimages.docx diff --git a/include/unotest/macros_test.hxx b/include/unotest/macros_test.hxx index 12108baa721b..ae006fc3570d 100644 --- a/include/unotest/macros_test.hxx +++ b/include/unotest/macros_test.hxx @@ -27,7 +27,8 @@ namespace unotest { class OOO_DLLPUBLIC_UNOTEST MacrosTest { public: - css::uno::Reference< css::lang::XComponent > loadFromDesktop(const OUString& rURL, const OUString& rDocService = OUString() ); + css::uno::Reference< css::lang::XComponent > loadFromDesktop(const OUString& rURL, const OUString& rDocService = OUString(), + css::uno::Sequence extra_args = css::uno::Sequence() ); protected: css::uno::Reference< css::frame::XDesktop2> mxDesktop; diff --git a/sw/qa/extras/globalfilter/data/skipimages.doc b/sw/qa/extras/globalfilter/data/skipimages.doc new file mode 100644 index 000000000000..3c40599b083a Binary files /dev/null and b/sw/qa/extras/globalfilter/data/skipimages.doc differ diff --git a/sw/qa/extras/globalfilter/data/skipimages.docx b/sw/qa/extras/globalfilter/data/skipimages.docx new file mode 100644 index 000000000000..cc6a4f4ceab4 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/skipimages.docx differ diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx index c0c51912d1e0..2e95927af8cd 100644 --- a/sw/qa/extras/globalfilter/globalfilter.cxx +++ b/sw/qa/extras/globalfilter/globalfilter.cxx @@ -33,6 +33,7 @@ public: void testCharHighlightBody(); void testMSCharBackgroundEditing(); void testCharBackgroundToHighlighting(); + void testSkipImages(); CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testSwappedOutImageExport); @@ -42,6 +43,7 @@ public: CPPUNIT_TEST(testCharHighlight); CPPUNIT_TEST(testMSCharBackgroundEditing); CPPUNIT_TEST(testCharBackgroundToHighlighting); + CPPUNIT_TEST(testSkipImages); CPPUNIT_TEST_SUITE_END(); }; @@ -653,6 +655,76 @@ void Test::testCharBackgroundToHighlighting() } } +void Test::testSkipImages() +{ + // Check how LO skips image loading (but not texts of textboxes and custom shapes) + // during DOC and DOCX import, using the "SkipImages" FilterOptions. + + const char* aFilterNames[][2] = { + { "/sw/qa/extras/globalfilter/data/skipimages.doc", "" }, + { "/sw/qa/extras/globalfilter/data/skipimages.doc", "SkipImages" }, + { "/sw/qa/extras/globalfilter/data/skipimages.docx", "" }, + { "/sw/qa/extras/globalfilter/data/skipimages.docx", "SkipImages" } + }; + + // FilterOptions parameter (Value will be set before loadFromDesktop call) + + uno::Sequence args(1); + args[0].Name = "FilterOptions"; + args[0].Handle = -1; + args[0].State = beans::PropertyState_DIRECT_VALUE; + + for( size_t nFilter = 0; nFilter < SAL_N_ELEMENTS(aFilterNames); ++nFilter ) + { + bool bSkipImages = *(aFilterNames[nFilter][1]) != '\0'; + + if (mxComponent.is()) + mxComponent->dispose(); + + args[0].Value <<= OUString::createFromAscii(aFilterNames[nFilter][1]); + + mxComponent = loadFromDesktop(getURLFromSrc(aFilterNames[nFilter][0]), "com.sun.star.text.TextDocument", args); + + // Check shapes (images, textboxes, custom shapes + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY); + + const OString sFailedMessage = OString("Failed on filter: ") + aFilterNames[nFilter][0] + " - " + aFilterNames[nFilter][1]; + + uno::Reference xShape; + uno::Reference xGraphic; + uno::Reference< beans::XPropertySet > XPropSet; + uno::Reference xBitmap; + + bool bHasTextboxText = false; + bool bHasCustomShapeText = false; + sal_Int32 nImageCount = 0; + + for (int i = 1; i<= xDraws->getCount(); i++) + { + xShape = getShape(i); + XPropSet.set( xShape, uno::UNO_QUERY_THROW ); + try + { + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + xBitmap.set(xGraphic, uno::UNO_QUERY); + if (xBitmap.is()) nImageCount++; + } + catch (beans::UnknownPropertyException &) + { + uno::Reference xText(xShape, uno::UNO_QUERY); + if (xText->getString().startsWith("Lorem ipsum")) bHasTextboxText = true; + if (xText->getString().startsWith("Nam pretium")) bHasCustomShapeText = true; + } + } + + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), bHasTextboxText); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), bHasCustomShapeText); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(bSkipImages ? 0 : 3), nImageCount ); + } +} + + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/unotest/source/cpp/macros_test.cxx b/unotest/source/cpp/macros_test.cxx index 44f0d56e5540..02b14ba9f3e3 100644 --- a/unotest/source/cpp/macros_test.cxx +++ b/unotest/source/cpp/macros_test.cxx @@ -19,7 +19,7 @@ using namespace css; namespace unotest { -uno::Reference MacrosTest::loadFromDesktop(const OUString& rURL, const OUString& rDocService) +uno::Reference MacrosTest::loadFromDesktop(const OUString& rURL, const OUString& rDocService, uno::Sequence extraArgs) { CPPUNIT_ASSERT_MESSAGE("no desktop", mxDesktop.is()); uno::Reference xLoader = uno::Reference(mxDesktop, uno::UNO_QUERY); @@ -39,6 +39,19 @@ uno::Reference MacrosTest::loadFromDesktop(const OUString args[1].State = beans::PropertyState_DIRECT_VALUE; } + if (extraArgs.getLength() > 0) + { + sal_Int32 aSize = args.getLength(); + args.realloc(aSize + extraArgs.getLength()); + for (int i = 0; i < extraArgs.getLength(); i++) + { + args[aSize + i].Name = extraArgs[i].Name; + args[aSize + i].Handle = extraArgs[i].Handle; + args[aSize + i].Value = extraArgs[i].Value; + args[aSize + i].State = extraArgs[i].State; + } + } + uno::Reference xComponent = xLoader->loadComponentFromURL(rURL, OUString("_default"), 0, args); OUString sMessage = "loading failed: " + rURL; CPPUNIT_ASSERT_MESSAGE(OUStringToOString( sMessage, RTL_TEXTENCODING_UTF8 ).getStr( ), xComponent.is()); -- cgit