diff options
Diffstat (limited to 'chart2/qa/extras/charttest.hxx')
-rw-r--r-- | chart2/qa/extras/charttest.hxx | 257 |
1 files changed, 124 insertions, 133 deletions
diff --git a/chart2/qa/extras/charttest.hxx b/chart2/qa/extras/charttest.hxx index 9b8e98a48f96..db416affaa9f 100644 --- a/chart2/qa/extras/charttest.hxx +++ b/chart2/qa/extras/charttest.hxx @@ -7,11 +7,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef INCLUDED_CHART2_QA_EXTRAS_CHARTTEST_HXX -#define INCLUDED_CHART2_QA_EXTRAS_CHARTTEST_HXX +#pragma once -#include <test/bootstrapfixture.hxx> -#include <unotest/macros_test.hxx> +#include <test/unoapixml_test.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/propertysequence.hxx> @@ -20,6 +18,7 @@ #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> #include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/table/XTableChartsSupplier.hpp> #include <com/sun/star/table/XTableChart.hpp> #include <com/sun/star/table/XTablePivotChartsSupplier.hpp> @@ -28,9 +27,12 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/frame/XStorable.hpp> +#include <o3tl/string_view.hxx> #include <unotools/tempfile.hxx> #include <rtl/math.hxx> +#include <svx/charthelper.hxx> +#include <com/sun/star/chart2/AxisType.hpp> #include <com/sun/star/chart2/XAnyDescriptionAccess.hpp> #include <com/sun/star/chart2/XChartDocument.hpp> #include <com/sun/star/chart2/XChartTypeContainer.hpp> @@ -42,17 +44,21 @@ #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp> #include <com/sun/star/chart2/data/XDataSource.hpp> #include <com/sun/star/chart/XChartDataArray.hpp> +#include <com/sun/star/chart2/XInternalDataProvider.hpp> +#include <com/sun/star/chart/XDateCategories.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> #include <com/sun/star/chart/XChartDocument.hpp> #include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp> #include <com/sun/star/util/XNumberFormatsSupplier.hpp> #include <com/sun/star/util/NumberFormat.hpp> +#include <com/sun/star/util/NumberFormatter.hpp> #include <unonames.hxx> #include <iostream> #include <memory> +#include <string_view> #include <com/sun/star/embed/Aspects.hpp> #include <com/sun/star/embed/XVisualObject.hpp> @@ -66,119 +72,27 @@ namespace com::sun::star::chart2 { class XDiagram; } namespace com::sun::star::table { class XTableCharts; } namespace com::sun::star::table { class XTablePivotCharts; } -class ChartTest : public test::BootstrapFixture, public unotest::MacrosTest +class ChartTest : public UnoApiXmlTest { public: - ChartTest():mbSkipValidation(false) {} - void load( const OUString& rDir, const OUString& rFileName ); - std::shared_ptr<utl::TempFile> save( const OUString& rFileName ); - std::shared_ptr<utl::TempFile> reload( const OUString& rFileName ); - uno::Sequence < OUString > getImpressChartColumnDescriptions( const OUString& pDir, const char* pName ); - OUString getFileExtension( const OUString& rFileName ); + ChartTest(OUString path) + : UnoApiXmlTest(path) + { + } - uno::Reference< chart::XChartDocument > getChartDocFromImpress( const OUString& pDir, const char* pName ); + uno::Sequence < OUString > getImpressChartColumnDescriptions(sal_Int32 nPage, sal_Int32 nShape); uno::Reference<chart::XChartDocument> getChartDocFromDrawImpress( sal_Int32 nPage, sal_Int32 nShape ); + uno::Reference<chart::XChartDocument> getChartDocFromDrawImpressNamed( sal_Int32 nPage, std::u16string_view rName); + uno::Reference<chart::XChartDocument> getChartDocFromWriter( sal_Int32 nShape ); + Sequence< OUString > getFormattedDateCategories( const Reference<chart2::XChartDocument>& xChartDoc ); awt::Size getPageSize( const Reference< chart2::XChartDocument > & xChartDoc ); awt::Size getSize(css::uno::Reference<chart2::XDiagram> xDiagram, const awt::Size& rPageSize); - - virtual void setUp() override; - virtual void tearDown() override; - -protected: - Reference< lang::XComponent > mxComponent; - OUString maServiceName; - bool mbSkipValidation; // if you set this flag for a new test I'm going to haunt you! }; -OUString ChartTest::getFileExtension( const OUString& aFileName ) -{ - sal_Int32 nDotLocation = aFileName.lastIndexOf('.'); - CPPUNIT_ASSERT(nDotLocation != -1); - return aFileName.copy(nDotLocation+1); // Skip the dot. -} - -void ChartTest::load( const OUString& aDir, const OUString& aName ) -{ - OUString extension = getFileExtension(aName); - if (extension == "ods" || extension == "xlsx" || extension == "fods") - { - maServiceName = "com.sun.star.sheet.SpreadsheetDocument"; - } - else if (extension == "docx") - { - maServiceName = "com.sun.star.text.TextDocument"; - } - else if (extension == "odg") - { - maServiceName = "com.sun.star.drawing.DrawingDocument"; - } - if (mxComponent.is()) - mxComponent->dispose(); - mxComponent = loadFromDesktop(m_directories.getURLFromSrc(aDir) + aName, maServiceName); - CPPUNIT_ASSERT(mxComponent.is()); -} - -std::shared_ptr<utl::TempFile> ChartTest::save(const OUString& rFilterName) -{ - uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); - auto aArgs(::comphelper::InitPropertySequence({ - { "FilterName", Any(rFilterName) } - })); - std::shared_ptr<utl::TempFile> pTempFile = std::make_shared<utl::TempFile>(); - pTempFile->EnableKillingFile(); - xStorable->storeToURL(pTempFile->GetURL(), aArgs); - - return pTempFile; -} - -std::shared_ptr<utl::TempFile> ChartTest::reload(const OUString& rFilterName) -{ - std::shared_ptr<utl::TempFile> pTempFile = save(rFilterName); - mxComponent->dispose(); - mxComponent = loadFromDesktop(pTempFile->GetURL(), maServiceName); - std::cout << pTempFile->GetURL(); - if(rFilterName == "Calc Office Open XML") - { - validate(pTempFile->GetFileName(), test::OOXML); - } - else if(rFilterName == "Office Open XML Text") - { - // validate(pTempFile->GetFileName(), test::OOXML); - } - else if(rFilterName == "calc8") - { - if(!mbSkipValidation) - validate(pTempFile->GetFileName(), test::ODF); - } - else if(rFilterName == "MS Excel 97") - { - if(!mbSkipValidation) - validate(pTempFile->GetFileName(), test::MSBINARY); - } - CPPUNIT_ASSERT(mxComponent.is()); - return pTempFile; -} - -void ChartTest::setUp() -{ - test::BootstrapFixture::setUp(); - - mxDesktop.set( css::frame::Desktop::create( comphelper::getComponentContext(getMultiServiceFactory()) ) ); -} - -void ChartTest::tearDown() -{ - if(mxComponent.is()) - mxComponent->dispose(); - - test::BootstrapFixture::tearDown(); - -} - -Reference< lang::XComponent > getChartCompFromSheet( sal_Int32 nSheet, uno::Reference< lang::XComponent > const & xComponent ) +Reference< lang::XComponent > getChartCompFromSheet( sal_Int32 nSheet, sal_Int32 nChart, uno::Reference< lang::XComponent > const & xComponent ) { // let us assume that we only have one chart per sheet @@ -192,7 +106,7 @@ Reference< lang::XComponent > getChartCompFromSheet( sal_Int32 nSheet, uno::Refe CPPUNIT_ASSERT(xCharts.is()); uno::Reference< container::XIndexAccess > xIACharts(xCharts, UNO_QUERY_THROW); - uno::Reference< table::XTableChart > xChart( xIACharts->getByIndex(0), UNO_QUERY_THROW); + uno::Reference< table::XTableChart > xChart( xIACharts->getByIndex(nChart), UNO_QUERY_THROW); uno::Reference< document::XEmbeddedObjectSupplier > xEmbObjectSupplier(xChart, UNO_QUERY_THROW); @@ -204,7 +118,12 @@ Reference< lang::XComponent > getChartCompFromSheet( sal_Int32 nSheet, uno::Refe Reference< chart2::XChartDocument > getChartDocFromSheet( sal_Int32 nSheet, uno::Reference< lang::XComponent > const & xComponent ) { - uno::Reference< chart2::XChartDocument > xChartDoc ( getChartCompFromSheet(nSheet, xComponent), UNO_QUERY_THROW ); + uno::Reference< chart2::XChartDocument > xChartDoc ( getChartCompFromSheet(nSheet, 0, xComponent), UNO_QUERY_THROW ); + + // Update the chart view, so that its draw page is updated and ready for the test + css::uno::Reference<css::frame::XModel> xModel(xChartDoc, css::uno::UNO_QUERY_THROW); + ChartHelper::updateChart(xModel); + return xChartDoc; } @@ -344,7 +263,7 @@ Reference< chart2::data::XDataSequence > getLabelDataSequenceFromDoc( } Reference< chart2::data::XDataSequence > getDataSequenceFromDocByRole( - Reference< chart2::XChartDocument > const & xChartDoc, const OUString& rRole, + Reference< chart2::XChartDocument > const & xChartDoc, std::u16string_view rRole, sal_Int32 nDataSeries = 0, sal_Int32 nChartType = 0 ) { Reference< chart2::XDataSeries > xDataSeries = @@ -391,9 +310,6 @@ std::vector<std::vector<double> > getDataSeriesYValuesFromChartType( const Refer CPPUNIT_ASSERT(xDSCont.is()); const Sequence<uno::Reference<chart2::XDataSeries> > aDataSeriesSeq = xDSCont->getDataSeries(); - double fNan; - rtl::math::setNan(&fNan); - std::vector<std::vector<double> > aRet; for (uno::Reference<chart2::XDataSeries> const & ds : aDataSeriesSeq) { @@ -421,7 +337,7 @@ std::vector<std::vector<double> > getDataSeriesYValuesFromChartType( const Refer if (any >>= fVal) aValues.push_back(fVal); else - aValues.push_back(fNan); + aValues.push_back(std::numeric_limits<double>::quiet_NaN()); } aRet.push_back(aValues); } @@ -470,23 +386,6 @@ std::vector<uno::Sequence<uno::Any> > getDataSeriesLabelsFromChartType( const Re return aRet; } -uno::Reference< chart::XChartDocument > ChartTest::getChartDocFromImpress( const OUString& pDir, const char* pName ) -{ - mxComponent = loadFromDesktop(m_directories.getURLFromSrc(pDir) + OUString::createFromAscii(pName), "com.sun.star.comp.Draw.PresentationDocument"); - uno::Reference< drawing::XDrawPagesSupplier > xDoc(mxComponent, uno::UNO_QUERY_THROW ); - uno::Reference< drawing::XDrawPage > xPage( - xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW ); - uno::Reference< beans::XPropertySet > xShapeProps( - xPage->getByIndex(0), uno::UNO_QUERY ); - CPPUNIT_ASSERT(xShapeProps.is()); - uno::Reference< frame::XModel > xDocModel; - xShapeProps->getPropertyValue("Model") >>= xDocModel; - CPPUNIT_ASSERT(xDocModel.is()); - uno::Reference< chart::XChartDocument > xChartDoc( xDocModel, uno::UNO_QUERY_THROW ); - - return xChartDoc; -} - uno::Reference<chart::XChartDocument> ChartTest::getChartDocFromDrawImpress( sal_Int32 nPage, sal_Int32 nShape ) { @@ -512,6 +411,42 @@ uno::Reference<chart::XChartDocument> ChartTest::getChartDocFromDrawImpress( return xChartDoc; } +uno::Reference<chart::XChartDocument> ChartTest::getChartDocFromDrawImpressNamed(sal_Int32 nPage, std::u16string_view rName) +{ + uno::Reference<chart::XChartDocument> xChart; + + uno::Reference<drawing::XDrawPagesSupplier> xPages(mxComponent, uno::UNO_QUERY); + if (!xPages.is()) + return xChart; + + uno::Reference<drawing::XDrawPage> xPage(xPages->getDrawPages()->getByIndex(nPage), uno::UNO_QUERY); + if (!xPage.is()) + return xChart; + + for (sal_Int32 i=0; i < xPage->getCount(); ++i) + { + uno::Reference<container::XNamed> xNamedShape(xPage->getByIndex(i), uno::UNO_QUERY); + if (!xNamedShape.is()) + continue; + + if (xNamedShape->getName() != rName) + continue; + + uno::Reference<beans::XPropertySet> xShapeProps(xNamedShape, uno::UNO_QUERY); + if (!xShapeProps.is()) + continue; + + uno::Reference<frame::XModel> xDocModel; + xShapeProps->getPropertyValue("Model") >>= xDocModel; + if (!xDocModel.is()) + continue; + + return uno::Reference<chart::XChartDocument>(xDocModel, uno::UNO_QUERY); + } + + return xChart; +} + uno::Reference<chart::XChartDocument> ChartTest::getChartDocFromWriter( sal_Int32 nShape ) { // DO NOT use XDrawPageSupplier since SwVirtFlyDrawObj are not created @@ -532,9 +467,9 @@ uno::Reference<chart::XChartDocument> ChartTest::getChartDocFromWriter( sal_Int3 return xChartDoc; } -uno::Sequence < OUString > ChartTest::getImpressChartColumnDescriptions( const OUString& pDir, const char* pName ) +uno::Sequence < OUString > ChartTest::getImpressChartColumnDescriptions(sal_Int32 nPage, sal_Int32 nShape) { - uno::Reference< chart::XChartDocument > xChartDoc = getChartDocFromImpress( pDir, pName ); + uno::Reference< chart::XChartDocument > xChartDoc = getChartDocFromDrawImpress( nPage, nShape ); uno::Reference< chart::XChartDataArray > xChartData ( xChartDoc->getData(), uno::UNO_QUERY_THROW); uno::Sequence < OUString > seriesList = xChartData->getColumnDescriptions(); return seriesList; @@ -587,6 +522,39 @@ sal_Int16 getNumberFormatType( const Reference<chart2::XChartDocument>& xChartDo return nType; } +Sequence< double > getDateCategories(const Reference<chart2::XChartDocument>& xChartDoc) +{ + CPPUNIT_ASSERT(xChartDoc->hasInternalDataProvider()); + uno::Reference< chart2::XInternalDataProvider > xDataProvider( xChartDoc->getDataProvider(), uno::UNO_QUERY_THROW ); + uno::Reference< chart::XDateCategories > xDateCategories( xDataProvider, uno::UNO_QUERY_THROW ); + CPPUNIT_ASSERT(xDateCategories.is()); + return xDateCategories->getDateCategories(); +} + +Sequence< OUString > ChartTest::getFormattedDateCategories( const Reference<chart2::XChartDocument>& xChartDoc ) +{ + Reference<util::XNumberFormatsSupplier> xNFS(xChartDoc, uno::UNO_QUERY_THROW); + Reference< util::XNumberFormatter > xNumFormatter( + util::NumberFormatter::create(comphelper::getComponentContext(m_xSFactory)), uno::UNO_QUERY_THROW ); + xNumFormatter->attachNumberFormatsSupplier(xNFS); + + Reference<chart2::XAxis> xAxisX = getAxisFromDoc(xChartDoc, 0, 0, 0); + chart2::ScaleData aScaleData = xAxisX->getScaleData(); + CPPUNIT_ASSERT_EQUAL(chart2::AxisType::DATE, aScaleData.AxisType); + + sal_Int32 nNumFmt = getNumberFormatFromAxis(xAxisX); + + Sequence<double> aDateSeq = getDateCategories(xChartDoc); + const sal_Int32 nNumCategories = aDateSeq.getLength(); + Sequence<OUString> aFormattedDates(nNumCategories); + auto aFormattedDatesRange = asNonConstRange(aFormattedDates); + + for (sal_Int32 nIdx = 0; nIdx < nNumCategories; ++nIdx) + aFormattedDatesRange[nIdx] = xNumFormatter->convertNumberToString(nNumFmt, aDateSeq[nIdx]); + + return aFormattedDates; +} + awt::Size ChartTest::getPageSize( const Reference< chart2::XChartDocument > & xChartDoc ) { awt::Size aSize( 0, 0 ); @@ -609,6 +577,29 @@ awt::Size ChartTest::getSize(css::uno::Reference<chart2::XDiagram> xDiagram, con return aSize; } -#endif // INCLUDED_CHART2_QA_EXTRAS_CHARTTEST_HXX +uno::Reference<drawing::XShape> +getShapeByName(const uno::Reference<drawing::XShapes>& rShapes, const OUString& rName, + const std::function<bool(const uno::Reference<drawing::XShape>&)>& pCondition + = nullptr) +{ + for (sal_Int32 i = 0; i < rShapes->getCount(); ++i) + { + uno::Reference<drawing::XShapes> xShapes(rShapes->getByIndex(i), uno::UNO_QUERY); + if (xShapes.is()) + { + uno::Reference<drawing::XShape> xRet = getShapeByName(xShapes, rName, pCondition); + if (xRet.is()) + return xRet; + } + uno::Reference<container::XNamed> xNamedShape(rShapes->getByIndex(i), uno::UNO_QUERY); + if (xNamedShape->getName() == rName) + { + uno::Reference<drawing::XShape> xShape(xNamedShape, uno::UNO_QUERY); + if (pCondition == nullptr || pCondition(xShape)) + return xShape; + } + } + return uno::Reference<drawing::XShape>(); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |