/* -*- 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/. */ #ifndef INCLUDED_CHART2_QA_EXTRAS_CHARTTEST_HXX #define INCLUDED_CHART2_QA_EXTRAS_CHARTTEST_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 #include #include #include #include #include #include using namespace com::sun::star; using namespace com::sun::star::uno; class ChartTest : public test::BootstrapFixture, public unotest::MacrosTest { public: ChartTest():mbSkipValidation(false) {} void load( const OUString& rDir, const OUString& rFileName ); boost::shared_ptr reload( const OUString& rFileName ); uno::Sequence < OUString > getImpressChartColumnDescriptions( const char* pDir, const char* pName ); OUString getFileExtension( const OUString& rFileName ); uno::Reference< chart::XChartDocument > getChartDocFromImpress( const char* pDir, const char* pName ); virtual void setUp() SAL_OVERRIDE; virtual void tearDown() SAL_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); } void ChartTest::load( const OUString& aDir, const OUString& aName ) { OUString extension = getFileExtension(aName); if(extension == "ods" || extension == "xlsx") { maServiceName = "com.sun.star.sheet.SpreadsheetDocument"; } else if(extension == "docx") { maServiceName = "com.sun.star.text.TextDocument"; } mxComponent = loadFromDesktop(getURLFromSrc(aDir) + aName, maServiceName); CPPUNIT_ASSERT(mxComponent.is()); } boost::shared_ptr ChartTest::reload(const OUString& rFilterName) { uno::Reference xStorable(mxComponent, uno::UNO_QUERY); uno::Sequence aArgs(1); aArgs[0].Name = "FilterName"; aArgs[0].Value <<= rFilterName; boost::shared_ptr pTempFile = boost::make_shared(); pTempFile->EnableKillingFile(); xStorable->storeToURL(pTempFile->GetURL(), aArgs); 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); } CPPUNIT_ASSERT(mxComponent.is()); return pTempFile; } void ChartTest::setUp() { test::BootstrapFixture::setUp(); mxDesktop.set( com::sun::star::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 > xComponent ) { // let us assume that we only have one chart per sheet uno::Reference< sheet::XSpreadsheetDocument > xDoc(xComponent, UNO_QUERY_THROW); CPPUNIT_ASSERT(xDoc.is()); uno::Reference< container::XIndexAccess > xIA(xDoc->getSheets(), UNO_QUERY_THROW); CPPUNIT_ASSERT(xIA.is()); uno::Reference< table::XTableChartsSupplier > xChartSupplier( xIA->getByIndex(nSheet), UNO_QUERY_THROW); CPPUNIT_ASSERT(xChartSupplier.is()); uno::Reference< table::XTableCharts > xCharts = xChartSupplier->getCharts(); CPPUNIT_ASSERT(xCharts.is()); uno::Reference< container::XIndexAccess > xIACharts(xCharts, UNO_QUERY_THROW); uno::Reference< table::XTableChart > xChart( xIACharts->getByIndex(0), UNO_QUERY_THROW); CPPUNIT_ASSERT(xChart.is()); uno::Reference< document::XEmbeddedObjectSupplier > xEmbObjectSupplier(xChart, UNO_QUERY_THROW); CPPUNIT_ASSERT(xEmbObjectSupplier.is()); uno::Reference< lang::XComponent > xChartComp( xEmbObjectSupplier->getEmbeddedObject(), UNO_QUERY_THROW ); CPPUNIT_ASSERT(xChartComp.is()); return xChartComp; } Reference< chart2::XChartDocument > getChartDocFromSheet( sal_Int32 nSheet, uno::Reference< lang::XComponent > xComponent ) { uno::Reference< chart2::XChartDocument > xChartDoc ( getChartCompFromSheet(nSheet, xComponent), UNO_QUERY_THROW ); CPPUNIT_ASSERT(xChartDoc.is()); return xChartDoc; } Reference< chart2::XChartType > getChartTypeFromDoc( Reference< chart2::XChartDocument > xChartDoc, sal_Int32 nChartType, sal_Int32 nCooSys = 0 ) { CPPUNIT_ASSERT( xChartDoc.is() ); Reference xDiagram = xChartDoc->getFirstDiagram(); CPPUNIT_ASSERT( xDiagram.is() ); Reference< chart2::XCoordinateSystemContainer > xCooSysContainer( xDiagram, UNO_QUERY_THROW ); CPPUNIT_ASSERT( xCooSysContainer.is() ); Sequence< Reference< chart2::XCoordinateSystem > > xCooSysSequence( xCooSysContainer->getCoordinateSystems()); CPPUNIT_ASSERT( xCooSysSequence.getLength() > nCooSys ); Reference< chart2::XChartTypeContainer > xChartTypeContainer( xCooSysSequence[nCooSys], UNO_QUERY_THROW ); CPPUNIT_ASSERT( xChartTypeContainer.is() ); Sequence< Reference< chart2::XChartType > > xChartTypeSequence( xChartTypeContainer->getChartTypes() ); CPPUNIT_ASSERT( xChartTypeSequence.getLength() > nChartType ); return xChartTypeSequence[nChartType]; } Reference< chart2::XDataSeries > getDataSeriesFromDoc( uno::Reference< chart2::XChartDocument > xChartDoc, sal_Int32 nDataSeries, sal_Int32 nChartType = 0, sal_Int32 nCooSys = 0 ) { Reference< chart2::XChartType > xChartType = getChartTypeFromDoc( xChartDoc, nChartType, nCooSys ); Reference< chart2::XDataSeriesContainer > xDataSeriesContainer( xChartType, UNO_QUERY_THROW ); CPPUNIT_ASSERT ( xDataSeriesContainer.is() ); Sequence< Reference< chart2::XDataSeries > > xSeriesSequence( xDataSeriesContainer->getDataSeries() ); CPPUNIT_ASSERT( xSeriesSequence.getLength() > nDataSeries ); Reference< chart2::XDataSeries > xSeries = xSeriesSequence[nDataSeries]; return xSeries; } Reference< chart2::data::XDataSequence > getLabelDataSequenceFromDoc( Reference< chart2::XChartDocument > xChartDoc, sal_Int32 nDataSeries = 0, sal_Int32 nChartType = 0, sal_Int32 nCooSys = 0 ) { Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, nDataSeries, nChartType, nCooSys ); CPPUNIT_ASSERT(xDataSeries.is()); Reference< chart2::data::XDataSource > xDataSource( xDataSeries, uno::UNO_QUERY_THROW ); Sequence< Reference< chart2::data::XLabeledDataSequence > > xDataSequences = xDataSource->getDataSequences(); for(sal_Int32 i = 0; i < xDataSequences.getLength(); ++i) { Reference< chart2::data::XDataSequence> xLabelSeq = xDataSequences[i]->getLabel(); if(!xLabelSeq.is()) continue; return xLabelSeq; } CPPUNIT_FAIL("no Label sequence found"); return Reference< chart2::data::XDataSequence > (); } Reference< chart2::data::XDataSequence > getDataSequenceFromDocByRole( Reference< chart2::XChartDocument > xChartDoc, const OUString& rRole, sal_Int32 nDataSeries = 0, sal_Int32 nChartType = 0, sal_Int32 nCooSys = 0 ) { Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, nDataSeries, nChartType, nCooSys ); CPPUNIT_ASSERT(xDataSeries.is()); Reference< chart2::data::XDataSource > xDataSource( xDataSeries, uno::UNO_QUERY_THROW ); Sequence< Reference< chart2::data::XLabeledDataSequence > > xDataSequences = xDataSource->getDataSequences(); for(sal_Int32 i = 0; i < xDataSequences.getLength(); ++i) { Reference< chart2::data::XDataSequence> xLabelSeq = xDataSequences[i]->getValues(); uno::Reference< beans::XPropertySet > xProps(xLabelSeq, uno::UNO_QUERY); if(!xProps.is()) continue; OUString aRoleName = xProps->getPropertyValue("Role").get(); if(aRoleName == rRole) return xLabelSeq; } CPPUNIT_FAIL("no Label sequence found"); return Reference< chart2::data::XDataSequence > (); } uno::Sequence < OUString > getWriterChartColumnDescriptions( Reference< lang::XComponent > mxComponent ) { uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); uno::Reference xDrawPage = xDrawPageSupplier->getDrawPage(); uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); CPPUNIT_ASSERT( xShape.is() ); uno::Reference xPropertySet(xShape, uno::UNO_QUERY); uno::Reference< chart2::XChartDocument > xChartDoc; xChartDoc.set( xPropertySet->getPropertyValue( "Model" ), uno::UNO_QUERY ); CPPUNIT_ASSERT( xChartDoc.is() ); CPPUNIT_ASSERT( xChartDoc->getDataProvider().is() ); uno::Reference xProp(xChartDoc->getDataProvider(), uno::UNO_QUERY ); uno::Reference< chart2::XAnyDescriptionAccess > xAnyDescriptionAccess ( xChartDoc->getDataProvider(), uno::UNO_QUERY_THROW ); CPPUNIT_ASSERT( xAnyDescriptionAccess.is() ); uno::Sequence< OUString > seriesList = xAnyDescriptionAccess->getColumnDescriptions(); return seriesList; } uno::Reference< chart::XChartDocument > ChartTest::getChartDocFromImpress( const char* pDir, const char* pName ) { mxComponent = loadFromDesktop(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 ); CPPUNIT_ASSERT(xPage.is()); 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::Sequence < OUString > ChartTest::getImpressChartColumnDescriptions( const char* pDir, const char* pName ) { uno::Reference< chart::XChartDocument > xChartDoc = getChartDocFromImpress( pDir, pName ); uno::Reference< chart::XChartDataArray > xChartData ( xChartDoc->getData(), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT(xChartData.is()); uno::Sequence < OUString > seriesList = xChartData->getColumnDescriptions(); return seriesList; } #endif // INCLUDED_CHART2_QA_EXTRAS_CHARTTEST_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */