/* -*- 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 "charttest.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using uno::Reference; using beans::XPropertySet; class Chart2ExportTest : public ChartTest, public XmlTestTools { protected: virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override; public: Chart2ExportTest() : ChartTest() {} void testErrorBarXLSX(); void testErrorBarPropXLSX(); void testTrendline(); void testTrendlineOOXML(); void testTrendlineXLS(); void testStockChart(); void testBarChart(); void testCrosses(); void testScatterChartTextXValues(); void testScatterXAxisValues(); void testChartDataTable(); void testChartExternalData(); void testEmbeddingsGrabBag(); void testAreaChartLoad(); void testUpDownBars(); void testDoughnutChart(); void testDisplayUnits(); // void testFdo74115WallGradientFill(); void testFdo74115WallBitmapFill(); void testPieChartWallLineStyle(); void testBarChartRotation(); void testShapeFollowedByChart(); void testPieChartDataLabels(); void testSeriesIdxOrder(); void testScatterPlotLabels(); void testErrorBarDataRangeODS(); void testChartCrash(); void testPieChartRotation(); void testEmbeddingsOleObjectGrabBag(); void testGapWidthXLSX(); void testSmoothedLines(); void testLabelStringODS(); void testFdo78290LineChartMarkerX(); void testFdo78290ScatterChartMarkerX(); void testFdo78290CombinationChartMarkerX(); void testTdf126115IndividualMarker(); void testAxisNumberFormatODS(); void testAxisNumberFormatXLS(); void testDataLabelBordersDOCX(); void testDataLabel3DChartDOCX(); void testDataLabelBarChartDOCX(); void testDataLabelClusteredBarChartDOCX(); void testDataLabelRadarChartDOCX(); void testDataLabelDoughnutChartDOCX(); void testDataLabelAreaChartDOCX(); void testDataLabelDefaultLineChartDOCX(); void testIndividualDataLabelProps(); void testChartTitlePropertiesColorFillDOCX(); void testChartTitlePropertiesGradientFillDOCX(); void testChartTitlePropertiesBitmapFillDOCX(); void testColorGradientWithTransparancyDOCX(); void testColorGradientWithTransparancyODS(); void testColorGradientStopXLSX(); void testBarChartDataPointPropDOCX(); void testFdo83058dlblPos(); void testAutoTitleDelXLSX(); void testDispBlanksAsXLSX(); void testMarkerColorXLSX(); void testRoundedCornersXLSX(); void testAxisNumberFormatXLSX(); void testDataPointLabelNumberFormatXLSX(); void testDataLabelDefaultValuesXLSX(); void testTitleOverlayXLSX(); void testInvertIfNegativeXLSX(); void testBubble3DXLSX(); void testNoMarkerXLSX(); void testTitleManualLayoutXLSX(); void testPlotAreaManualLayoutXLSX(); void testLegendManualLayoutXLSX(); void testChartSubTitle(); void testChartMainWithSubTitle(); void testAutoTitleDeleted(); void testChartTitlePropertiesColorFillXLSX(); void testChartTitlePropertiesGradientFillXLSX(); void testChartTitlePropertiesBitmapFillXLSX(); void testBarChartDataPointPropXLSX(); void testDataseriesOverlapStackedChartXLSX(); void testAxisCharacterPropertiesXLSX(); void testTitleCharacterPropertiesXLSX(); void testPlotVisOnlyXLSX(); void testBarChartVaryColorsXLSX(); void testMultipleAxisXLSX(); void testSecondaryAxisXLSX(); void testSetSeriesToSecondaryAxisXLSX(); void testCombinedChartSecondaryAxisXLSX(); void testCombinedChartSecondaryAxisODS(); void testCrossBetweenXLSX(); void testCrossBetweenWithDeletedAxis(); void testCrossBetweenODS(); void testAxisTitleRotationXLSX(); void testAxisTitlePositionDOCX(); void testAxisCrossBetweenXSLX(); void testPieChartDataPointExplosionXLSX(); void testCustomDataLabel(); void testCustomDataLabelMultipleSeries(); void testNumberFormatExportPPTX(); void testLabelSeparatorExportDOCX(); void testChartTitlePropertiesColorFillPPTX(); void testChartTitlePropertiesGradientFillPPTX(); void testChartTitlePropertiesBitmapFillPPTX(); void testxAxisLabelsRotation(); void testMultipleCategoryAxisLablesXLSX(); void testMultipleCategoryAxisLablesDOCX(); void testTdf116163(); void testTdf111824(); void testTdf119029(); void testTdf108022(); void testTdf121744(); void testTdf122031(); void testTdf115012(); void testTdf123206_customLabelText(); void testCustomLabelText(); void testTdf131979(); void testTdf132594(); CPPUNIT_TEST_SUITE(Chart2ExportTest); CPPUNIT_TEST(testErrorBarXLSX); CPPUNIT_TEST(testErrorBarPropXLSX); CPPUNIT_TEST(testTrendline); CPPUNIT_TEST(testTrendlineOOXML); CPPUNIT_TEST(testTrendlineXLS); CPPUNIT_TEST(testStockChart); CPPUNIT_TEST(testBarChart); CPPUNIT_TEST(testCrosses); CPPUNIT_TEST(testScatterChartTextXValues); CPPUNIT_TEST(testScatterXAxisValues); CPPUNIT_TEST(testChartDataTable); CPPUNIT_TEST(testChartExternalData); CPPUNIT_TEST(testEmbeddingsGrabBag); CPPUNIT_TEST(testAreaChartLoad); CPPUNIT_TEST(testUpDownBars); CPPUNIT_TEST(testDoughnutChart); CPPUNIT_TEST(testDisplayUnits); // CPPUNIT_TEST(testFdo74115WallGradientFill); CPPUNIT_TEST(testFdo74115WallBitmapFill); CPPUNIT_TEST(testPieChartWallLineStyle); CPPUNIT_TEST(testBarChartRotation); CPPUNIT_TEST(testShapeFollowedByChart); CPPUNIT_TEST(testPieChartDataLabels); CPPUNIT_TEST(testSeriesIdxOrder); CPPUNIT_TEST(testScatterPlotLabels); CPPUNIT_TEST(testErrorBarDataRangeODS); CPPUNIT_TEST(testChartCrash); CPPUNIT_TEST(testPieChartRotation); CPPUNIT_TEST(testEmbeddingsOleObjectGrabBag); CPPUNIT_TEST(testGapWidthXLSX); CPPUNIT_TEST(testSmoothedLines); CPPUNIT_TEST(testLabelStringODS); CPPUNIT_TEST(testFdo78290LineChartMarkerX); CPPUNIT_TEST(testFdo78290ScatterChartMarkerX); CPPUNIT_TEST(testFdo78290CombinationChartMarkerX); CPPUNIT_TEST(testTdf126115IndividualMarker); CPPUNIT_TEST(testAxisNumberFormatODS); CPPUNIT_TEST(testAxisNumberFormatXLS); CPPUNIT_TEST(testDataLabelBordersDOCX); CPPUNIT_TEST(testDataLabel3DChartDOCX); CPPUNIT_TEST(testDataLabelBarChartDOCX); CPPUNIT_TEST(testDataLabelClusteredBarChartDOCX); CPPUNIT_TEST(testDataLabelRadarChartDOCX); CPPUNIT_TEST(testDataLabelDoughnutChartDOCX); CPPUNIT_TEST(testDataLabelAreaChartDOCX); CPPUNIT_TEST(testDataLabelDefaultLineChartDOCX); CPPUNIT_TEST(testIndividualDataLabelProps); CPPUNIT_TEST(testChartTitlePropertiesColorFillDOCX); CPPUNIT_TEST(testChartTitlePropertiesGradientFillDOCX); CPPUNIT_TEST(testChartTitlePropertiesBitmapFillDOCX); CPPUNIT_TEST(testColorGradientWithTransparancyDOCX); CPPUNIT_TEST(testColorGradientWithTransparancyODS); CPPUNIT_TEST(testColorGradientStopXLSX); CPPUNIT_TEST(testBarChartDataPointPropDOCX); CPPUNIT_TEST(testFdo83058dlblPos); CPPUNIT_TEST(testAutoTitleDelXLSX); CPPUNIT_TEST(testDispBlanksAsXLSX); CPPUNIT_TEST(testMarkerColorXLSX); CPPUNIT_TEST(testRoundedCornersXLSX); CPPUNIT_TEST(testAxisNumberFormatXLSX); CPPUNIT_TEST(testDataPointLabelNumberFormatXLSX); CPPUNIT_TEST(testDataLabelDefaultValuesXLSX); CPPUNIT_TEST(testTitleOverlayXLSX); CPPUNIT_TEST(testInvertIfNegativeXLSX); CPPUNIT_TEST(testBubble3DXLSX); CPPUNIT_TEST(testNoMarkerXLSX); CPPUNIT_TEST(testTitleManualLayoutXLSX); CPPUNIT_TEST(testPlotAreaManualLayoutXLSX); CPPUNIT_TEST(testLegendManualLayoutXLSX); CPPUNIT_TEST(testChartSubTitle); CPPUNIT_TEST(testChartMainWithSubTitle); CPPUNIT_TEST(testAutoTitleDeleted); CPPUNIT_TEST(testChartTitlePropertiesColorFillXLSX); CPPUNIT_TEST(testChartTitlePropertiesGradientFillXLSX); CPPUNIT_TEST(testChartTitlePropertiesBitmapFillXLSX); CPPUNIT_TEST(testBarChartDataPointPropXLSX); CPPUNIT_TEST(testDataseriesOverlapStackedChartXLSX); CPPUNIT_TEST(testAxisCharacterPropertiesXLSX); CPPUNIT_TEST(testTitleCharacterPropertiesXLSX); CPPUNIT_TEST(testPlotVisOnlyXLSX); CPPUNIT_TEST(testBarChartVaryColorsXLSX); CPPUNIT_TEST(testMultipleAxisXLSX); CPPUNIT_TEST(testSecondaryAxisXLSX); CPPUNIT_TEST(testSetSeriesToSecondaryAxisXLSX); CPPUNIT_TEST(testCombinedChartSecondaryAxisXLSX); CPPUNIT_TEST(testCombinedChartSecondaryAxisODS); CPPUNIT_TEST(testCrossBetweenXLSX); CPPUNIT_TEST(testCrossBetweenWithDeletedAxis); CPPUNIT_TEST(testCrossBetweenODS); CPPUNIT_TEST(testAxisTitleRotationXLSX); CPPUNIT_TEST(testAxisTitlePositionDOCX); CPPUNIT_TEST(testAxisCrossBetweenXSLX); CPPUNIT_TEST(testPieChartDataPointExplosionXLSX); CPPUNIT_TEST(testCustomDataLabel); CPPUNIT_TEST(testCustomDataLabelMultipleSeries); CPPUNIT_TEST(testNumberFormatExportPPTX); CPPUNIT_TEST(testLabelSeparatorExportDOCX); CPPUNIT_TEST(testChartTitlePropertiesColorFillPPTX); CPPUNIT_TEST(testChartTitlePropertiesGradientFillPPTX); CPPUNIT_TEST(testChartTitlePropertiesBitmapFillPPTX); CPPUNIT_TEST(testxAxisLabelsRotation); CPPUNIT_TEST(testMultipleCategoryAxisLablesXLSX); CPPUNIT_TEST(testMultipleCategoryAxisLablesDOCX); CPPUNIT_TEST(testTdf116163); CPPUNIT_TEST(testTdf111824); CPPUNIT_TEST(testTdf119029); CPPUNIT_TEST(testTdf108022); CPPUNIT_TEST(testTdf121744); CPPUNIT_TEST(testTdf122031); CPPUNIT_TEST(testTdf115012); CPPUNIT_TEST(testTdf123206_customLabelText); CPPUNIT_TEST(testCustomLabelText); CPPUNIT_TEST(testTdf131979); CPPUNIT_TEST(testTdf132594); CPPUNIT_TEST_SUITE_END(); protected: /** * Given that some problem doesn't affect the result in the importer, we * test the resulting file directly, by opening the zip file, parsing an * xml stream, and asserting an XPath expression. This method returns the * xml stream, so that you can do the asserting. */ xmlDocPtr parseExport(const OUString& rDir, const OUString& rFilterFormat); }; namespace { struct CheckForChartName { private: OUString aDir; public: explicit CheckForChartName( const OUString& rDir ): aDir(rDir) {} bool operator()(const OUString& rName) { if(!rName.startsWith(aDir)) return false; if(!rName.endsWith(".xml")) return false; return true; } }; OUString findChartFile(const OUString& rDir, uno::Reference< container::XNameAccess > const & xNames ) { uno::Sequence aNames = xNames->getElementNames(); OUString* pElement = std::find_if(aNames.begin(), aNames.end(), CheckForChartName(rDir)); CPPUNIT_ASSERT(pElement != aNames.end()); return *pElement; } } xmlDocPtr Chart2ExportTest::parseExport(const OUString& rDir, const OUString& rFilterFormat) { std::shared_ptr pTempFile = save(rFilterFormat); // Read the XML stream we're interested in. uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), pTempFile->GetURL()); uno::Reference xInputStream(xNameAccess->getByName(findChartFile(rDir, xNameAccess)), uno::UNO_QUERY); CPPUNIT_ASSERT(xInputStream.is()); std::shared_ptr pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true)); return parseXmlStream(pStream.get()); } void Chart2ExportTest::registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) { static struct { char const * pPrefix; char const * pURI; } const aNamespaces[] = { { "w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main" }, { "v", "urn:schemas-microsoft-com:vml" }, { "c", "http://schemas.openxmlformats.org/drawingml/2006/chart" }, { "a", "http://schemas.openxmlformats.org/drawingml/2006/main" }, { "mc", "http://schemas.openxmlformats.org/markup-compatibility/2006" }, { "wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape" }, { "wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" }, { "wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" }, { "office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" }, { "table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0" }, { "text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" }, { "xlink", "http://www.w3c.org/1999/xlink" } }; for(size_t i = 0; i < SAL_N_ELEMENTS(aNamespaces); ++i) { xmlXPathRegisterNs( pXmlXPathCtx, reinterpret_cast(aNamespaces[i].pPrefix), reinterpret_cast(aNamespaces[i].pURI)); } } namespace { void testErrorBar( Reference< XPropertySet > const & xErrorBar ) { sal_Int32 nErrorBarStyle; CPPUNIT_ASSERT( xErrorBar->getPropertyValue("ErrorBarStyle") >>= nErrorBarStyle); CPPUNIT_ASSERT_EQUAL(chart::ErrorBarStyle::RELATIVE, nErrorBarStyle); bool bShowPositive = bool(), bShowNegative = bool(); CPPUNIT_ASSERT( xErrorBar->getPropertyValue("ShowPositiveError") >>= bShowPositive); CPPUNIT_ASSERT(bShowPositive); CPPUNIT_ASSERT( xErrorBar->getPropertyValue("ShowNegativeError") >>= bShowNegative); CPPUNIT_ASSERT(bShowNegative); double nVal = 0.0; CPPUNIT_ASSERT(xErrorBar->getPropertyValue("PositiveError") >>= nVal); CPPUNIT_ASSERT_DOUBLES_EQUAL(10.0, nVal, 1e-10); } void checkCommonTrendline( Reference const & xCurve, double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward, bool aExpectedForceIntercept, double aExpectedInterceptValue, bool aExpectedShowEquation, bool aExpectedR2) { Reference xProperties( xCurve , uno::UNO_QUERY ); CPPUNIT_ASSERT(xProperties.is()); double aExtrapolateForward = 0.0; CPPUNIT_ASSERT(xProperties->getPropertyValue("ExtrapolateForward") >>= aExtrapolateForward); CPPUNIT_ASSERT_EQUAL(aExpectedExtrapolateForward, aExtrapolateForward); double aExtrapolateBackward = 0.0; CPPUNIT_ASSERT(xProperties->getPropertyValue("ExtrapolateBackward") >>= aExtrapolateBackward); CPPUNIT_ASSERT_EQUAL(aExpectedExtrapolateBackward, aExtrapolateBackward); bool bForceIntercept = false; CPPUNIT_ASSERT(xProperties->getPropertyValue("ForceIntercept") >>= bForceIntercept); CPPUNIT_ASSERT_EQUAL(aExpectedForceIntercept, bForceIntercept); if (bForceIntercept) { double aInterceptValue = 0.0; CPPUNIT_ASSERT(xProperties->getPropertyValue("InterceptValue") >>= aInterceptValue); CPPUNIT_ASSERT_EQUAL(aExpectedInterceptValue, aInterceptValue); } Reference< XPropertySet > xEquationProperties( xCurve->getEquationProperties() ); CPPUNIT_ASSERT(xEquationProperties.is()); bool bShowEquation = false; CPPUNIT_ASSERT(xEquationProperties->getPropertyValue("ShowEquation") >>= bShowEquation); CPPUNIT_ASSERT_EQUAL(aExpectedShowEquation, bShowEquation); bool bShowCorrelationCoefficient = false; CPPUNIT_ASSERT(xEquationProperties->getPropertyValue("ShowCorrelationCoefficient") >>= bShowCorrelationCoefficient); CPPUNIT_ASSERT_EQUAL(aExpectedR2, bShowCorrelationCoefficient); } void checkNameAndType(Reference const & xProperties, const OUString& aExpectedName, const OUString& aExpectedServiceName) { Reference< lang::XServiceName > xServiceName( xProperties, UNO_QUERY ); CPPUNIT_ASSERT(xServiceName.is()); OUString aServiceName = xServiceName->getServiceName(); CPPUNIT_ASSERT_EQUAL(aExpectedServiceName, aServiceName); OUString aCurveName; CPPUNIT_ASSERT(xProperties->getPropertyValue("CurveName") >>= aCurveName); CPPUNIT_ASSERT_EQUAL(aExpectedName, aCurveName); } void checkLinearTrendline( Reference const & xCurve, const OUString& aExpectedName, double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward, double aExpectedInterceptValue) { Reference xProperties( xCurve , uno::UNO_QUERY ); CPPUNIT_ASSERT(xProperties.is()); checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.LinearRegressionCurve"); checkCommonTrendline( xCurve, aExpectedExtrapolateForward, aExpectedExtrapolateBackward, /*aExpectedForceIntercept*/false, aExpectedInterceptValue, /*aExpectedShowEquation*/true, /*aExpectedR2*/false); } void checkPolynomialTrendline( Reference const & xCurve, const OUString& aExpectedName, sal_Int32 aExpectedDegree, double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward, double aExpectedInterceptValue) { Reference xProperties( xCurve , uno::UNO_QUERY ); CPPUNIT_ASSERT(xProperties.is()); checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.PolynomialRegressionCurve"); sal_Int32 aDegree = 2; CPPUNIT_ASSERT(xProperties->getPropertyValue("PolynomialDegree") >>= aDegree); CPPUNIT_ASSERT_EQUAL(aExpectedDegree, aDegree); checkCommonTrendline( xCurve, aExpectedExtrapolateForward, aExpectedExtrapolateBackward, /*aExpectedForceIntercept*/true, aExpectedInterceptValue, /*aExpectedShowEquation*/true, /*aExpectedR2*/true); } void checkMovingAverageTrendline( Reference const & xCurve, const OUString& aExpectedName, sal_Int32 aExpectedPeriod) { Reference xProperties( xCurve , uno::UNO_QUERY ); CPPUNIT_ASSERT(xProperties.is()); checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.MovingAverageRegressionCurve"); sal_Int32 aPeriod = 2; CPPUNIT_ASSERT(xProperties->getPropertyValue("MovingAveragePeriod") >>= aPeriod); CPPUNIT_ASSERT_EQUAL(aExpectedPeriod, aPeriod); } void checkTrendlinesInChart(uno::Reference< chart2::XChartDocument > const & xChartDoc) { CPPUNIT_ASSERT(xChartDoc.is()); Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 ); CPPUNIT_ASSERT( xDataSeries.is() ); Reference< chart2::XRegressionCurveContainer > xRegressionCurveContainer( xDataSeries, UNO_QUERY ); CPPUNIT_ASSERT( xRegressionCurveContainer.is() ); Sequence< Reference< chart2::XRegressionCurve > > xRegressionCurveSequence = xRegressionCurveContainer->getRegressionCurves(); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xRegressionCurveSequence.getLength()); Reference xCurve; xCurve = xRegressionCurveSequence[0]; CPPUNIT_ASSERT(xCurve.is()); checkPolynomialTrendline(xCurve, "col2_poly", 3, 0.1, -0.1, -1.0); xCurve = xRegressionCurveSequence[1]; CPPUNIT_ASSERT(xCurve.is()); checkLinearTrendline(xCurve, "col2_linear", -0.5, -0.5, 0.0); xCurve = xRegressionCurveSequence[2]; CPPUNIT_ASSERT(xCurve.is()); checkMovingAverageTrendline(xCurve, "col2_moving_avg", 3); } } // improve the test void Chart2ExportTest::testErrorBarXLSX() { load("/chart2/qa/extras/data/ods/", "error_bar.ods"); { // make sure the ODS import was successful uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent ); CPPUNIT_ASSERT(xChartDoc.is()); Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 ); CPPUNIT_ASSERT( xDataSeries.is() ); Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW ); // test that y error bars are there Reference< beans::XPropertySet > xErrorBarYProps; xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps; testErrorBar(xErrorBarYProps); } reload("Calc Office Open XML"); { uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent ); CPPUNIT_ASSERT(xChartDoc.is()); Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 ); CPPUNIT_ASSERT( xDataSeries.is() ); Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW ); // test that y error bars are there Reference< beans::XPropertySet > xErrorBarYProps; xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps; testErrorBar(xErrorBarYProps); } } void Chart2ExportTest::testErrorBarPropXLSX() { load("/chart2/qa/extras/data/xlsx/", "testErrorBarProp.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // test y error bars property assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[1]/c:errDir", "val", "y"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[1]/c:spPr/a:ln", "w", "12600"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[1]/c:spPr/a:ln/a:solidFill/a:srgbClr", "val", "ff0000"); // test x error bars property assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[2]/c:errDir", "val", "x"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[2]/c:spPr/a:ln", "w", "9360"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[2]/c:spPr/a:ln/a:solidFill/a:srgbClr", "val", "595959"); } // This method tests the preservation of properties for trendlines / regression curves // in an export -> import cycle using different file formats - ODS, XLS and XLSX. void Chart2ExportTest::testTrendline() { mbSkipValidation = true; load("/chart2/qa/extras/data/ods/", "trendline.ods"); checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent)); reload("calc8"); checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent)); } void Chart2ExportTest::testTrendlineOOXML() { load("/chart2/qa/extras/data/ods/", "trendline.ods"); checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent)); reload("Calc Office Open XML"); checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent)); } void Chart2ExportTest::testTrendlineXLS() { mbSkipValidation = true; load("/chart2/qa/extras/data/ods/", "trendline.ods"); checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent)); reload("MS Excel 97"); checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent)); } void Chart2ExportTest::testStockChart() { /* For attached file Stock_Chart.docx, in chart1.xml, * , there are four types of series as * Open,Low,High and Close. * For Open series, in * an attribute val of index should start from 1 and not from 0. * Which was problem area. */ load("/chart2/qa/extras/data/docx/", "testStockChart.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); if (!pXmlDoc) return; assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:idx", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:order", "val", "1"); assertXPathContent( pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:tx/c:strRef/c:strCache/c:pt/c:v", "Open"); } void Chart2ExportTest::testBarChart() { load("/chart2/qa/extras/data/docx/", "testBarChart.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); if (!pXmlDoc) return; assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:barDir", "val", "col"); } void Chart2ExportTest::testCrosses() { load("/chart2/qa/extras/data/docx/", "Bar_horizontal_cone.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:crosses", "val", "autoZero"); } void Chart2ExportTest::testScatterChartTextXValues() { load("/chart2/qa/extras/data/docx/", "scatter-chart-text-x-values.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); Reference xCT = getChartTypeFromDoc(xChartDoc, 0); CPPUNIT_ASSERT(xCT.is()); // Make sure we have exactly 3 data series. std::vector > aLabels = getDataSeriesLabelsFromChartType(xCT); CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size()); CPPUNIT_ASSERT_EQUAL(OUString("Series 1"), aLabels[0][0].get()); CPPUNIT_ASSERT_EQUAL(OUString("Series 2"), aLabels[1][0].get()); CPPUNIT_ASSERT_EQUAL(OUString("Series 3"), aLabels[2][0].get()); std::vector > aYValues = getDataSeriesYValuesFromChartType(xCT); CPPUNIT_ASSERT_EQUAL(size_t(3), aYValues.size()); // Check the Y values of "Series 1". CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[0].size()); CPPUNIT_ASSERT_EQUAL(4.3, aYValues[0][0]); CPPUNIT_ASSERT_EQUAL(2.5, aYValues[0][1]); CPPUNIT_ASSERT_EQUAL(3.5, aYValues[0][2]); CPPUNIT_ASSERT_EQUAL(4.5, aYValues[0][3]); // And "Series 2". CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[1].size()); CPPUNIT_ASSERT_EQUAL(2.4, aYValues[1][0]); CPPUNIT_ASSERT_EQUAL(4.4, aYValues[1][1]); CPPUNIT_ASSERT_EQUAL(1.8, aYValues[1][2]); CPPUNIT_ASSERT_EQUAL(2.8, aYValues[1][3]); // And "Series 3". CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[2].size()); CPPUNIT_ASSERT_EQUAL(2.0, aYValues[2][0]); CPPUNIT_ASSERT_EQUAL(2.0, aYValues[2][1]); CPPUNIT_ASSERT_EQUAL(3.0, aYValues[2][2]); CPPUNIT_ASSERT_EQUAL(5.0, aYValues[2][3]); // Test the export. xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); if (!pXmlDoc) return; assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser[1]/c:xVal[1]/c:numRef[1]/c:numCache[1]/c:pt[1]/c:v[1]", "1"); } void Chart2ExportTest::testScatterXAxisValues() { load("/chart2/qa/extras/data/odt/", "tdf114657.odt"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:ptCount", "val", "5"); assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[1]/c:v", "15"); assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[2]/c:v", "11"); assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[3]/c:v", "20"); assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[4]/c:v", "16"); } void Chart2ExportTest::testChartDataTable() { load("/chart2/qa/extras/data/docx/", "testChartDataTable.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showHorzBorder", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showVertBorder", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showOutline", "val", "1"); } void Chart2ExportTest::testChartExternalData() { load("/chart2/qa/extras/data/docx/", "testMultipleChart.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); xmlXPathObjectPtr pXmlPathObj = getXPathNode(pXmlDoc, "/c:chartSpace/c:externalData"); xmlNodeSetPtr pXmlNodes = pXmlPathObj->nodesetval; CPPUNIT_ASSERT(pXmlNodes); } void Chart2ExportTest::testEmbeddingsGrabBag() { // The problem was that .xlsx files were missing from docx file from embeddings folder // after saving file. // This test case tests whether embeddings files grabbagged properly in correct object. load("/chart2/qa/extras/data/docx/", "testMultiplechartembeddings.docx" ); uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); uno::Reference xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY); uno::Sequence aGrabBag(0); xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag; CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty bool bEmbeddings = false; const char* const testEmbeddedFileNames[] {"word/embeddings/Microsoft_Excel_Worksheet3.xlsx", "word/embeddings/Microsoft_Excel_Worksheet2.xlsx", "word/embeddings/Microsoft_Excel_Worksheet1.xlsx"}; for(int i = 0; i < aGrabBag.getLength(); ++i) { if (aGrabBag[i].Name == "OOXEmbeddings") { bEmbeddings = true; uno::Sequence aEmbeddingsList(0); uno::Reference aEmbeddingXlsxStream; OUString aEmbeddedfileName; CPPUNIT_ASSERT(aGrabBag[i].Value >>= aEmbeddingsList); // PropertyValue of proper type sal_Int32 length = aEmbeddingsList.getLength(); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), length); for(int j = 0; j < length; ++j) { aEmbeddingsList[j].Value >>= aEmbeddingXlsxStream; aEmbeddedfileName = aEmbeddingsList[j].Name; CPPUNIT_ASSERT(aEmbeddingXlsxStream.get()); // Reference not empty CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(testEmbeddedFileNames[j]),aEmbeddedfileName); } } } CPPUNIT_ASSERT(bEmbeddings); // Grab Bag has all the expected elements } void Chart2ExportTest::testAreaChartLoad() { load ("/chart2/qa/extras/data/docx/", "testAreaChartLoad.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:showVal", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLbl", 0); } void Chart2ExportTest::testUpDownBars() { /* load("/chart2/qa/extras/data/docx/", "UpDownBars.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:upDownBars"); */ } void Chart2ExportTest::testDoughnutChart() { load("/chart2/qa/extras/data/docx/", "doughnutChart.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart"); } void Chart2ExportTest::testDisplayUnits() { load("/chart2/qa/extras/data/docx/", "DisplayUnits.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:dispUnits/c:builtInUnit", "val", "billions"); } // void Chart2ExportTest::testFdo74115WallGradientFill() // { // load("/chart2/qa/extras/data/docx/", "fdo74115_WallGradientFill.docx"); // xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); // CPPUNIT_ASSERT(pXmlDoc); // // assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:gradFill"); // } void Chart2ExportTest::testFdo74115WallBitmapFill() { load("/chart2/qa/extras/data/docx/", "fdo74115_WallBitmapFill.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:blipFill"); } void Chart2ExportTest::testPieChartWallLineStyle() { load("/chart2/qa/extras/data/odt/", "testPieChartWallLineStyle.odt"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:ln/a:noFill"); } //The below test case tests the built in marker 'x' for Office 2010 in Line charts void Chart2ExportTest::testFdo78290LineChartMarkerX() { load("/chart2/qa/extras/data/docx/", "fdo78290_Line_Chart_Marker_x.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:symbol[1]","val","x"); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:size[1]","val","7"); } // We can also use the built in marker 'x' in scatter chart, hence writing the test case for the same. void Chart2ExportTest::testFdo78290ScatterChartMarkerX() { load("/chart2/qa/extras/data/docx/", "fdo78290_Scatter_Chart_Marker_x.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:scatterChart[1]/c:ser[1]/c:marker[1]/c:symbol[1]","val","x"); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:scatterChart[1]/c:ser[1]/c:marker[1]/c:size[1]","val","7"); } // Also in a combination of charts like a column chart and line chart, we can use the built in marker 'x' // for the line chart too. hence put a test case for the combination chart also. void Chart2ExportTest::testFdo78290CombinationChartMarkerX() { load("/chart2/qa/extras/data/docx/", "fdo78290_Combination_Chart_Marker_x.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:symbol[1]","val","x"); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:size[1]","val","7"); } void Chart2ExportTest::testTdf126115IndividualMarker() { // Check individual marker properties. load("/chart2/qa/extras/data/xlsx/", "tdf126115.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // 1. series assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[1]/c:dPt/c:marker/c:symbol", "val", "square"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[1]/c:dPt/c:marker/c:size", "val", "8"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[1]/c:dPt/c:marker/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000"); // 2. series assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[2]/c:dPt/c:marker/c:symbol", "val", "x"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[2]/c:dPt/c:marker/c:size", "val", "15"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[2]/c:dPt/c:marker/c:spPr/a:solidFill/a:srgbClr", "val", "7030a0"); } void Chart2ExportTest::testAxisNumberFormatODS() { struct { void check( const Reference& xChartDoc ) { Reference xAxisX = getAxisFromDoc(xChartDoc, 0, 0, 0); Reference xTitle(xAxisX, UNO_QUERY_THROW); OUString aTitleText = getTitleString(xTitle); CPPUNIT_ASSERT_EQUAL(OUString("Linked To Source"), aTitleText); sal_Int32 nNumFmt = getNumberFormatFromAxis(xAxisX); sal_Int16 nType = getNumberFormatType(xChartDoc, nNumFmt); CPPUNIT_ASSERT_MESSAGE("X axis should be percentage format.", (nType & util::NumberFormat::PERCENT)); bool bNumFmtLinked = false; Reference xPS(xAxisX, uno::UNO_QUERY_THROW); xPS->getPropertyValue("LinkNumberFormatToSource") >>= bNumFmtLinked; CPPUNIT_ASSERT_MESSAGE("X axis should have its number format linked to source.", bNumFmtLinked); Reference xAxisY = getAxisFromDoc(xChartDoc, 0, 1, 0); xTitle.set(xAxisY, UNO_QUERY_THROW); aTitleText = getTitleString(xTitle); CPPUNIT_ASSERT_EQUAL(OUString("Not Linked"), aTitleText); nNumFmt = getNumberFormatFromAxis(xAxisY); nType = getNumberFormatType(xChartDoc, nNumFmt); CPPUNIT_ASSERT_MESSAGE("Y axis should be a normal number format.", (nType & util::NumberFormat::NUMBER)); bNumFmtLinked = true; xPS.set(xAxisY, uno::UNO_QUERY_THROW); xPS->getPropertyValue("LinkNumberFormatToSource") >>= bNumFmtLinked; CPPUNIT_ASSERT_MESSAGE("Y axis should not have its number format linked to source.", !bNumFmtLinked); } } aTest; load("/chart2/qa/extras/data/ods/", "axis-numformats-linked.ods"); Reference xChartDoc = getChartDocFromSheet(0, mxComponent); aTest.check(xChartDoc); // Reload the document and make sure everything remains intact. reload("calc8"); xChartDoc = getChartDocFromSheet(0, mxComponent); aTest.check(xChartDoc); } void Chart2ExportTest::testAxisNumberFormatXLS() { struct { void check( const Reference& xChartDoc, bool bNumFmtLinkedActual, sal_Int16 nNumFmtTypeFlag ) const { Reference xAxisY = getAxisFromDoc( xChartDoc, 0, 1, 0 ); bool bNumFmtLinked = false; Reference xPS( xAxisY, uno::UNO_QUERY_THROW ); xPS->getPropertyValue( "LinkNumberFormatToSource" ) >>= bNumFmtLinked; if ( bNumFmtLinkedActual ) CPPUNIT_ASSERT_MESSAGE( "Y axis should have its number format linked to source.", bNumFmtLinked ); else { CPPUNIT_ASSERT_MESSAGE( "Y axis should not have its number format linked to source.", !bNumFmtLinked ); sal_Int32 nNumFmt = getNumberFormatFromAxis( xAxisY ); sal_Int16 nType = getNumberFormatType( xChartDoc, nNumFmt ); if ( nNumFmtTypeFlag == util::NumberFormat::PERCENT ) CPPUNIT_ASSERT_MESSAGE( "Y axis should be percentage format.", ( nType & util::NumberFormat::PERCENT ) ); else CPPUNIT_ASSERT_MESSAGE( "Y axis should be number format.", ( nType & util::NumberFormat::NUMBER ) ); } } void change( const Reference& xChartDoc, sal_Int16 nNumFmtTypeFlag ) { Reference xAxisY = getAxisFromDoc( xChartDoc, 0, 1, 0 ); Reference xPS( xAxisY, uno::UNO_QUERY_THROW ); Any aAny( false ); xPS->setPropertyValue( "LinkNumberFormatToSource", aAny ); Reference xNFS( xChartDoc, uno::UNO_QUERY_THROW ); Reference xNumberFormats = xNFS->getNumberFormats(); CPPUNIT_ASSERT( xNumberFormats.is() ); lang::Locale aLocale{ "en", "US", "" }; Sequence aNumFmts = xNumberFormats->queryKeys( nNumFmtTypeFlag, aLocale, false ); CPPUNIT_ASSERT( aNumFmts.hasElements() ); aAny <<= aNumFmts[0]; xPS->setPropertyValue( CHART_UNONAME_NUMFMT, aAny ); } } aTest; load( "/chart2/qa/extras/data/xls/", "axis_sourceformatting.xls" ); Reference xChartDoc = getChartDocFromSheet( 0, mxComponent ); aTest.check( xChartDoc, true, util::NumberFormat::PERCENT ); aTest.change( xChartDoc, util::NumberFormat::NUMBER ); // Write the document(xls) with changes made close it, load it and check if changes are intact reload( "MS Excel 97" ); xChartDoc = getChartDocFromSheet( 0, mxComponent ); aTest.check( xChartDoc, false, util::NumberFormat::NUMBER ); } void Chart2ExportTest::testDataLabelBordersDOCX() { struct Check { sal_Int32 mnIndex; css::drawing::LineStyle meStyle; sal_Int32 mnColor; }; struct { /** * Chart 1 has 4 bars of which 1st and 3rd have labels with borders * around them. */ void checkObject1( const Reference& xChartDoc ) { CPPUNIT_ASSERT(xChartDoc.is()); Reference xDataSeries = getDataSeriesFromDoc(xChartDoc, 0); CPPUNIT_ASSERT(xDataSeries.is()); // Check to make sure that data points 0 and 2 have local properties. Reference xPropSet(xDataSeries, uno::UNO_QUERY); CPPUNIT_ASSERT(xPropSet.is()); Sequence aIndices; xPropSet->getPropertyValue("AttributedDataPoints") >>= aIndices; /* CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be 2 data points with local properties.", sal_Int32(2), aIndices.getLength()); CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aIndices[0]); CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aIndices[1]); */ static const Check aDataPoints[] = { { 0, css::drawing::LineStyle_SOLID, 0x00FFFF00 }, // solid yellow { 2, css::drawing::LineStyle_SOLID, 0x00FF0000 } // solid red }; for (size_t i = 0; i < SAL_N_ELEMENTS(aDataPoints); ++i) { xPropSet = xDataSeries->getDataPointByIndex(aDataPoints[i].mnIndex); CPPUNIT_ASSERT(xPropSet.is()); css::drawing::LineStyle eLineStyle = css::drawing::LineStyle_NONE; xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_STYLE) >>= eLineStyle; CPPUNIT_ASSERT_EQUAL(aDataPoints[i].meStyle, eLineStyle); sal_Int32 nWidth = -1; xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_WIDTH) >>= nWidth; CPPUNIT_ASSERT(nWidth > 0); sal_Int32 nColor = -1; xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_COLOR) >>= nColor; CPPUNIT_ASSERT_EQUAL_MESSAGE("Border color is wrong.", aDataPoints[i].mnColor, nColor); } } /** * Chart 2 has all its data labels with identical borders. */ void checkObject2( const Reference& xChartDoc ) { CPPUNIT_ASSERT(xChartDoc.is()); Reference xDataSeries = getDataSeriesFromDoc(xChartDoc, 0); CPPUNIT_ASSERT(xDataSeries.is()); Reference xPropSet(xDataSeries, uno::UNO_QUERY); CPPUNIT_ASSERT(xPropSet.is()); css::drawing::LineStyle eLineStyle = css::drawing::LineStyle_NONE; xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_STYLE) >>= eLineStyle; CPPUNIT_ASSERT_EQUAL(css::drawing::LineStyle_SOLID, eLineStyle); sal_Int32 nWidth = -1; xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_WIDTH) >>= nWidth; CPPUNIT_ASSERT(nWidth > 0); sal_Int32 nColor = -1; xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_COLOR) >>= nColor; CPPUNIT_ASSERT_EQUAL_MESSAGE("Border color should be green.", sal_Int32(0x0000FF00), nColor); } } aTest; load("/chart2/qa/extras/data/docx/", "data-label-borders.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); // "Automatic" chart background fill in docx should be loaded as solid white. Reference xPropSet = xChartDoc->getPageBackground(); CPPUNIT_ASSERT(xPropSet.is()); drawing::FillStyle eStyle = xPropSet->getPropertyValue("FillStyle").get(); sal_Int32 nColor = xPropSet->getPropertyValue("FillColor").get(); CPPUNIT_ASSERT_EQUAL_MESSAGE("'Automatic' chart background fill in docx should be loaded as solid fill.", drawing::FillStyle_SOLID, eStyle); CPPUNIT_ASSERT_EQUAL_MESSAGE("'Automatic' chart background fill in docx should be loaded as solid white.", sal_Int32(0x00FFFFFF), sal_Int32(nColor & 0x00FFFFFF)); // highest 2 bytes are transparency which we ignore here. aTest.checkObject1(xChartDoc); xChartDoc.set(getChartDocFromWriter(1), uno::UNO_QUERY); aTest.checkObject2(xChartDoc); reload("Office Open XML Text"); xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY); aTest.checkObject1(xChartDoc); xChartDoc.set(getChartDocFromWriter(1), uno::UNO_QUERY); aTest.checkObject2(xChartDoc); } void Chart2ExportTest::testDataLabel3DChartDOCX() { load("/chart2/qa/extras/data/docx/", "3d-bar-label.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // We must not export label position attributes for 3D bar charts. The // same rule also applies to several other 3D charts, apparently. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLblPos", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0); } void Chart2ExportTest::testDataLabelBarChartDOCX() { load("/chart2/qa/extras/data/docx/", "bar-chart-labels.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLblPos", "val", "ctr"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:dLbls/c:dLblPos", "val", "inEnd"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:dLbls/c:dLblPos", "val", "inBase"); } void Chart2ExportTest::testDataLabelClusteredBarChartDOCX() { load("/chart2/qa/extras/data/docx/", "clustered-bar-chart-labels.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // This was "t", should be one of the allowed values. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLbl[2]/c:dLblPos", "val", "outEnd"); } void Chart2ExportTest::testDataLabelRadarChartDOCX() { load("/chart2/qa/extras/data/docx/", "radar-chart-labels.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // We must not export label position attributes for radar charts. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:radarChart/c:ser/c:dLbls/c:dLblPos", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:radarChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0); } void Chart2ExportTest::testDataLabelDoughnutChartDOCX() { load("/chart2/qa/extras/data/docx/", "doughnut-chart-labels.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // We must not export label position attributes for doughnut charts. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:ser/c:dLbls/c:dLblPos", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0); } void Chart2ExportTest::testDataLabelAreaChartDOCX() { load("/chart2/qa/extras/data/docx/", "area-chart-labels.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // We must not export label position attributes for area charts. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLblPos", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0); } void Chart2ExportTest::testDataLabelDefaultLineChartDOCX() { // This file was created by Word 2007, which doesn't provide default data // label position (2010 does). Make sure its default data label position // is RIGHT when exporting. load("/chart2/qa/extras/data/docx/", "line-chart-label-default-placement.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); reload("Office Open XML Text"); xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY); Reference xDataSeries = getDataSeriesFromDoc(xChartDoc, 0); Reference xPropSet(xDataSeries, uno::UNO_QUERY); CPPUNIT_ASSERT(xPropSet.is()); sal_Int32 nLabelPlacement = -1; if (xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement) // This option may not be set. Check its value only when it's set. CPPUNIT_ASSERT_EQUAL_MESSAGE("Line chart's default label placement should be 'right'.", chart::DataLabelPlacement::RIGHT, nLabelPlacement ); } void Chart2ExportTest::testIndividualDataLabelProps() { load("/chart2/qa/extras/data/xlsx/", "tdf122915.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[3]/c:dLbls/c:dLbl/c:txPr/a:p/a:pPr/a:defRPr", "b", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[3]/c:dLbls/c:dLbl/c:txPr/a:p/a:pPr/a:defRPr", "sz", "1600"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[3]/c:dLbls/c:dLbl/c:txPr/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "ff0000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[3]/c:dLbls/c:dLbl/c:txPr/a:p/a:pPr/a:defRPr/a:latin", "typeface", "Times New Roman"); } void Chart2ExportTest::testChartTitlePropertiesColorFillDOCX() { load("/chart2/qa/extras/data/docx/", "testChartTitlePropertiesColorFill.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testChartTitlePropertiesGradientFillDOCX() { load("/chart2/qa/extras/data/docx/", "testChartTitlePropertiesGradientFill.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "cccccc"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "666666"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testChartTitlePropertiesBitmapFillDOCX() { load("/chart2/qa/extras/data/docx/", "testChartTitlePropertiesBitmapFill.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:blipFill/a:blip", "embed", "rId1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testColorGradientWithTransparancyDOCX() { // Test color gradient (two color) with gradient transparency load("/chart2/qa/extras/data/docx/", "testColorGradientWithTransparancy.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // Test the transparency of the first color assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val", "60000"); // Test the transparency of the second color assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val", "90196"); } void Chart2ExportTest::testColorGradientWithTransparancyODS() { // Test color gradient (two color) with simple transparency load("/chart2/qa/extras/data/ods/", "testColorGradientWithTransparancy.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // Test the transparency of the first color assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val", "60000"); // Test the transparency of the second color assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val", "60000"); } void Chart2ExportTest::testColorGradientStopXLSX() { // Test color gradient (two color) stop of the first color load("/chart2/qa/extras/data/xlsx/", "tdf128619.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // Test the position of the first color assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[1]", "pos", "45000"); // Test the position of the second color assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[2]", "pos", "100000"); } void Chart2ExportTest::testBarChartDataPointPropDOCX() { load("/chart2/qa/extras/data/docx/", "testBarChartDataPointPropDOCX.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:idx", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "f6f8fc"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "c7d5ed"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:spPr/a:ln/a:solidFill/a:srgbClr", "val", "70ad47"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:idx", "val", "2"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:spPr/a:ln/a:solidFill/a:srgbClr", "val", "000000"); } void Chart2ExportTest::testBarChartRotation() { load ("/chart2/qa/extras/data/docx/", "barChartRotation.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotX", "val", "30"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotY", "val", "50"); } void Chart2ExportTest::testShapeFollowedByChart() { /* If there is a scenario where a chart is followed by a shape which is being exported as an alternate content then, the docPr Id is being repeated, ECMA 20.4.2.5 says that the docPr Id should be unique, ensuring the same here. */ load("/chart2/qa/extras/data/docx/", "FDO74430.docx"); xmlDocPtr pXmlDoc = parseExport("word/document", "Office Open XML Text" ); CPPUNIT_ASSERT(pXmlDoc); OUString aValueOfFirstDocPR = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/w:drawing[1]/wp:inline[1]/wp:docPr[1]", "id"); OUString aValueOfSecondDocPR = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/wp:docPr[1]", "id"); CPPUNIT_ASSERT( aValueOfFirstDocPR != aValueOfSecondDocPR ); } void Chart2ExportTest::testPieChartDataLabels() { load("/chart2/qa/extras/data/docx/", "PieChartDataLabels.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pie3DChart/c:ser[1]/c:dLbls/c:dLbl[1]/c:dLblPos", "val", "bestFit"); } void Chart2ExportTest::testSeriesIdxOrder() { load("/chart2/qa/extras/data/docx/", "testSeriesIdxOrder.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:idx[1]", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:order[1]", "val", "1"); } void Chart2ExportTest::testScatterPlotLabels() { load("/chart2/qa/extras/data/odt/", "scatter-plot-labels.odt"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); Reference xCT = getChartTypeFromDoc(xChartDoc, 0); CPPUNIT_ASSERT(xCT.is()); // Make sure the original chart has 'a', 'b', 'c' as its data labels. std::vector > aLabels = getDataSeriesLabelsFromChartType(xCT); CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size()); CPPUNIT_ASSERT_EQUAL(OUString("a"), aLabels[0][0].get()); CPPUNIT_ASSERT_EQUAL(OUString("b"), aLabels[1][0].get()); CPPUNIT_ASSERT_EQUAL(OUString("c"), aLabels[2][0].get()); // Reload the doc and check again. The labels should not change. reload("writer8"); xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xCT = getChartTypeFromDoc(xChartDoc, 0); CPPUNIT_ASSERT(xCT.is()); aLabels = getDataSeriesLabelsFromChartType(xCT); CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size()); CPPUNIT_ASSERT_EQUAL(OUString("a"), aLabels[0][0].get()); CPPUNIT_ASSERT_EQUAL(OUString("b"), aLabels[1][0].get()); CPPUNIT_ASSERT_EQUAL(OUString("c"), aLabels[2][0].get()); } void Chart2ExportTest::testErrorBarDataRangeODS() { load("/chart2/qa/extras/data/ods/", "ErrorBarRange.ods"); reload("calc8"); uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent ); CPPUNIT_ASSERT(xChartDoc.is()); Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 ); CPPUNIT_ASSERT( xDataSeries.is() ); Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW ); // test that y error bars are there Reference< beans::XPropertySet > xErrorBarYProps; xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps; uno::Any aAny = xErrorBarYProps->getPropertyValue("ErrorBarRangePositive"); CPPUNIT_ASSERT(aAny.hasValue()); OUString aPosRange; aAny >>= aPosRange; CPPUNIT_ASSERT_EQUAL(OUString("$Sheet1.$B$1:$B$3"), aPosRange); aAny = xErrorBarYProps->getPropertyValue("ErrorBarRangeNegative"); CPPUNIT_ASSERT(aAny.hasValue()); OUString aNegRange; aAny >>= aNegRange; CPPUNIT_ASSERT_EQUAL(OUString("$Sheet1.$C$1:$C$3"), aNegRange); } void Chart2ExportTest::testChartCrash() { load("/chart2/qa/extras/data/docx/", "FDO75975.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); } void Chart2ExportTest::testPieChartRotation() { load ("/chart2/qa/extras/data/docx/", "pieChartRotation.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotX", "val", "40"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotY", "val", "30"); } void Chart2ExportTest::testEmbeddingsOleObjectGrabBag() { // The problem was that .bin files were missing from docx file from embeddings folder // after saving file. // This test case tests whether embeddings files grabbagged properly in correct object. load("/chart2/qa/extras/data/docx/", "testchartoleobjectembeddings.docx" ); uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); uno::Reference xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY); uno::Sequence aGrabBag(0); xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag; CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty bool bEmbeddings = false; const char* const testEmbeddedFileNames[] = {"word/embeddings/oleObject1.bin"}; for(int i = 0; i < aGrabBag.getLength(); ++i) { if (aGrabBag[i].Name == "OOXEmbeddings") { bEmbeddings = true; uno::Sequence aEmbeddingsList(0); uno::Reference aEmbeddingXlsxStream; OUString aEmbeddedfileName; CPPUNIT_ASSERT(aGrabBag[i].Value >>= aEmbeddingsList); // PropertyValue of proper type sal_Int32 length = aEmbeddingsList.getLength(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), length); for(int j = 0; j < length; ++j) { aEmbeddingsList[j].Value >>= aEmbeddingXlsxStream; aEmbeddedfileName = aEmbeddingsList[j].Name; CPPUNIT_ASSERT(aEmbeddingXlsxStream.get()); // Reference not empty CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(testEmbeddedFileNames[j]),aEmbeddedfileName); } } } CPPUNIT_ASSERT(bEmbeddings); // Grab Bag has all the expected elements } namespace { void checkGapWidth(Reference const & xPropSet, sal_Int32 nValue) { uno::Any aAny = xPropSet->getPropertyValue("GapwidthSequence"); CPPUNIT_ASSERT(aAny.hasValue()); uno::Sequence< sal_Int32 > aSequence; aAny >>= aSequence; CPPUNIT_ASSERT(aSequence.hasElements()); CPPUNIT_ASSERT_EQUAL(nValue, aSequence[0]); } void checkOverlap(Reference const & xPropSet, sal_Int32 nValue) { uno::Any aAny = xPropSet->getPropertyValue("OverlapSequence"); CPPUNIT_ASSERT(aAny.hasValue()); uno::Sequence< sal_Int32 > aSequence; aAny >>= aSequence; CPPUNIT_ASSERT(aSequence.hasElements()); CPPUNIT_ASSERT_EQUAL(nValue, aSequence[0]); } void checkSheetForGapWidthAndOverlap(uno::Reference< chart2::XChartDocument > const & xChartDoc, sal_Int32 nExpectedGapWidth, sal_Int32 nExpectedOverlap) { CPPUNIT_ASSERT(xChartDoc.is()); Reference< chart2::XChartType > xChartType = getChartTypeFromDoc( xChartDoc, 0 ); CPPUNIT_ASSERT(xChartType.is()); Reference< beans::XPropertySet > xPropSet( xChartType, uno::UNO_QUERY_THROW ); checkGapWidth(xPropSet, nExpectedGapWidth); checkOverlap(xPropSet, nExpectedOverlap); } } void Chart2ExportTest::testGapWidthXLSX() { load("/chart2/qa/extras/data/xlsx/", "gapWidth.xlsx"); uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 120, -60); xChartDoc = getChartDocFromSheet( 1, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 50, 30); reload("Calc Office Open XML"); xChartDoc = getChartDocFromSheet( 0, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 120, -60); xChartDoc = getChartDocFromSheet( 1, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 50, 30); } void Chart2ExportTest::testSmoothedLines() { load("/chart2/qa/extras/data/ods/", "smoothedLines.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:smooth", "val", "0"); } void Chart2ExportTest::testLabelStringODS() { load("/chart2/qa/extras/data/ods/", "labelString.ods"); uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent ); Reference< chart2::data::XDataSequence > xLabelSeq = getLabelDataSequenceFromDoc(xChartDoc); CPPUNIT_ASSERT(xLabelSeq.is()); OUString aLabelString = xLabelSeq->getSourceRangeRepresentation(); CPPUNIT_ASSERT_EQUAL(OUString("\"LabelName\""), aLabelString); reload("calc8"); xChartDoc = getChartDocFromSheet( 0, mxComponent ); xLabelSeq = getLabelDataSequenceFromDoc(xChartDoc); CPPUNIT_ASSERT(xLabelSeq.is()); aLabelString = xLabelSeq->getSourceRangeRepresentation(); CPPUNIT_ASSERT_EQUAL(OUString("\"LabelName\""), aLabelString); } void Chart2ExportTest::testFdo83058dlblPos() { load ("/chart2/qa/extras/data/docx/", "fdo83058_dlblPos.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[2]/c:dLblPos", "val", "outEnd"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[3]/c:dLblPos", "val", "outEnd"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[4]/c:dLblPos", "val", "outEnd"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[5]/c:dLblPos", "val", "outEnd"); } void Chart2ExportTest::testAutoTitleDelXLSX() { load("/chart2/qa/extras/data/xlsx/", "autotitledel_2007.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:autoTitleDeleted", "val", "0"); } void Chart2ExportTest::testDispBlanksAsXLSX() { load("/chart2/qa/extras/data/xlsx/", "dispBlanksAs_2007.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:dispBlanksAs", "val", "gap"); } void Chart2ExportTest::testMarkerColorXLSX() { load("/chart2/qa/extras/data/xlsx/", "markerColor.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:marker/c:spPr/a:solidFill/a:srgbClr", "val", "92d050"); } void Chart2ExportTest::testRoundedCornersXLSX() { load("/chart2/qa/extras/data/xlsx/", "markerColor.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:roundedCorners", "val", "0"); } void Chart2ExportTest::testAxisNumberFormatXLSX() { load("/chart2/qa/extras/data/ods/", "axis_number_format.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 2); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "formatCode", "0.00E+000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "sourceLinked", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "formatCode", "[$$-409]#,##0;\\-[$$-409]#,##0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "sourceLinked", "1"); } void Chart2ExportTest::testDataPointLabelNumberFormatXLSX() { load("/chart2/qa/extras/data/ods/", "tdf123774.ods"); { xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:numFmt", "formatCode", "[$-40E]0.00%"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:numFmt", "sourceLinked", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[1]/c:numFmt", "formatCode", "[$-40E]0.00%"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[1]/c:numFmt", "sourceLinked", "0"); } load("/chart2/qa/extras/data/xlsx/", "tdf130986.xlsx"); { xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl/c:idx", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl/c:numFmt", "formatCode", "0.00E+00"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl/c:numFmt", "sourceLinked", "0"); } } void Chart2ExportTest::testDataLabelDefaultValuesXLSX() { load("/chart2/qa/extras/data/xlsx/", "data_label.xlsx"); Reference< chart2::XChartDocument> xDoc = getChartDocFromSheet(0, mxComponent); Reference xSeries = getDataSeriesFromDoc(xDoc, 0); Reference xPropSet(xSeries, uno::UNO_QUERY_THROW); uno::Any aAny = xPropSet->getPropertyValue("Label"); chart2::DataPointLabel aLabel; CPPUNIT_ASSERT(aAny >>= aLabel); CPPUNIT_ASSERT(aLabel.ShowNumber); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:showVal", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLblPos", "val", "outEnd"); } void Chart2ExportTest::testTitleOverlayXLSX() { load("/chart2/qa/extras/data/xlsx/", "chart_title.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:overlay", "val", "0"); } void Chart2ExportTest::testInvertIfNegativeXLSX() { load("/chart2/qa/extras/data/xlsx/", "bar_chart_simple.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:invertIfNegative", "val", "0"); } void Chart2ExportTest::testBubble3DXLSX() { load("/chart2/qa/extras/data/xlsx/", "bubble_chart_simple.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:ser[1]/c:bubble3D", "val", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:ser[2]/c:bubble3D", "val", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:ser[3]/c:bubble3D", "val", "0"); } void Chart2ExportTest::testNoMarkerXLSX() { load("/chart2/qa/extras/data/xlsx/", "no_marker.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:marker/c:symbol", "val", "none"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[2]/c:marker/c:symbol", "val", "none"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:marker", "val", "0"); } void Chart2ExportTest::testTitleManualLayoutXLSX() { load("/chart2/qa/extras/data/xlsx/", "title_manual_layout.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:layoutTarget", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:xMode", "val", "edge"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:yMode", "val", "edge"); OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:x", "val"); double nX = aXVal.toDouble(); CPPUNIT_ASSERT(nX > 0 && nX < 1); OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:y", "val"); double nY = aYVal.toDouble(); CPPUNIT_ASSERT(nY > 0 && nY < 1); CPPUNIT_ASSERT(nX != nY); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:bodyPr", "rot", "1200000"); } void Chart2ExportTest::testPlotAreaManualLayoutXLSX() { load("/chart2/qa/extras/data/xlsx/", "plot_area_manual_layout.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", "val", "inner"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:xMode", "val", "edge"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:yMode", "val", "edge"); OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:x", "val"); double nX = aXVal.toDouble(); CPPUNIT_ASSERT(nX > 0 && nX < 1); OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:y", "val"); double nY = aYVal.toDouble(); CPPUNIT_ASSERT(nY > 0 && nY < 1); CPPUNIT_ASSERT(nX != nY); OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:w", "val"); double nW = aWVal.toDouble(); CPPUNIT_ASSERT(nW > 0 && nW < 1); OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:h", "val"); double nH = aHVal.toDouble(); CPPUNIT_ASSERT(nH > 0 && nH < 1); CPPUNIT_ASSERT(nH != nW); } void Chart2ExportTest::testLegendManualLayoutXLSX() { load("/chart2/qa/extras/data/xlsx/", "legend_manual_layout.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:xMode", "val", "edge"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:yMode", "val", "edge"); OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:x", "val"); double nX = aXVal.toDouble(); CPPUNIT_ASSERT(nX > 0 && nX < 1); OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:y", "val"); double nY = aYVal.toDouble(); CPPUNIT_ASSERT(nY > 0 && nY < 1); CPPUNIT_ASSERT(nX != nY); OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:w", "val"); double nW = aWVal.toDouble(); CPPUNIT_ASSERT(nW > 0 && nW < 1); OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:h", "val"); double nH = aHVal.toDouble(); CPPUNIT_ASSERT(nH > 0 && nH < 1); CPPUNIT_ASSERT(nH != nW); // Make sure that default text font size is preserved after export assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900"); } void Chart2ExportTest::testChartSubTitle() { load("/chart2/qa/extras/data/ods/", "testChartSubTitle.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // test properties of subtitle assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "1100"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "00a933"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr/a:latin", "typeface", "Times New Roman"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t", "It is a Subtitle"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "b2b2b2"); } void Chart2ExportTest::testChartMainWithSubTitle() { load("/chart2/qa/extras/data/ods/", "testChartMainWithSubTitle.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // test properties of title assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "1300"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "i", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "f10d0c"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr/a:latin", "typeface", "Arial"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t", "It is a Maintitle\nIt is a Subtitle"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "81d41a"); } void Chart2ExportTest::testAutoTitleDeleted() { load("/chart2/qa/extras/data/xlsx/", "testAutoTitleDeleted.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:autoTitleDeleted", "val", "1"); } void Chart2ExportTest::testChartTitlePropertiesColorFillXLSX() { load("/chart2/qa/extras/data/xlsx/", "testChartTitlePropertiesColorFill.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testChartTitlePropertiesGradientFillXLSX() { load("/chart2/qa/extras/data/xlsx/", "testChartTitlePropertiesGradientFill.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "cccccc"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "666666"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testChartTitlePropertiesBitmapFillXLSX() { load("/chart2/qa/extras/data/xlsx/", "testChartTitlePropertiesBitmapFill.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:blipFill/a:blip", "embed", "rId1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testBarChartDataPointPropXLSX() { load("/chart2/qa/extras/data/xlsx/", "testBarChartDataPointPropXLSX.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:idx", "val", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:spPr/a:ln/a:solidFill/a:srgbClr", "val", "000000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:idx", "val", "2"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "f6f8fc"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "c7d5ed"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:spPr/a:ln/a:solidFill/a:srgbClr", "val", "70ad47"); } void Chart2ExportTest::testDataseriesOverlapStackedChartXLSX() { load("/chart2/qa/extras/data/xlsx/", "testDataseriesOverlapStackedChart.xlsx"); // test the overlap value of a simple Stacked Column Chart uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 100, 0); // test the overlap value of a Percent Stacked Bar Chart xChartDoc = getChartDocFromSheet( 1, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 100, 35); reload("Calc Office Open XML"); xChartDoc = getChartDocFromSheet( 0, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 100, 100); xChartDoc = getChartDocFromSheet( 1, mxComponent ); checkSheetForGapWidthAndOverlap(xChartDoc, 100, 100); } void Chart2ExportTest::testAxisCharacterPropertiesXLSX() { load("/chart2/qa/extras/data/xlsx/", "axis_character_properties.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "sz", "1000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "b", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "i", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "u", "sng"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "b", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "strike", "sngStrike"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "ff0000"); } void Chart2ExportTest::testTitleCharacterPropertiesXLSX() { load("/chart2/qa/extras/data/xlsx/", "title_character_properties.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "2400"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr", "sz", "2400"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr", "b", "1"); } void Chart2ExportTest::testPlotVisOnlyXLSX() { load("/chart2/qa/extras/data/xlsx/", "hidden_cells.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotVisOnly", "val", "0"); } void Chart2ExportTest::testBarChartVaryColorsXLSX() { load("/chart2/qa/extras/data/xlsx/", "tdf90876.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0"); } void Chart2ExportTest::testMultipleAxisXLSX() { load("/chart2/qa/extras/data/ods/", "multiple_axis.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart", 2); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart[1]/c:ser", 1); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart[2]/c:ser", 1); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 4); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:delete[@val='1']", 1); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:axPos[@val='l']", 1); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:axPos[@val='r']", 1); } void Chart2ExportTest::testSecondaryAxisXLSX() { load("/chart2/qa/extras/data/ods/", "secondary_axis.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart", 2); // test there is just those series in the first tag which are attached to the primary axis assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[1]/c:ser", 2); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[1]/c:ser[1]/c:tx/c:strRef/c:strCache/c:pt/c:v", "b"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[1]/c:ser[2]/c:tx/c:strRef/c:strCache/c:pt/c:v", "c"); // test there is just those series in the second tag which are attached to the secondary axis assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[2]/c:ser", 1); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[2]/c:ser[1]/c:tx/c:strRef/c:strCache/c:pt/c:v", "a"); } void Chart2ExportTest::testSetSeriesToSecondaryAxisXLSX() { load("/chart2/qa/extras/data/xlsx/", "add_series_secondary_axis.xlsx"); Reference< chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent); // Second series Reference xSeries = getDataSeriesFromDoc(xChartDoc, 1); CPPUNIT_ASSERT(xSeries.is()); Reference xPropSet(xSeries, uno::UNO_QUERY_THROW); sal_Int32 AxisIndex = 1; // Attach the second series to the secondary axis. (The third series is already attached.) xPropSet->setPropertyValue("AttachedAxisIndex", uno::Any(AxisIndex)); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // Check there are only two tag in the XML, one for the primary and one for the secondary axis. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart", 2); } void Chart2ExportTest::testCombinedChartSecondaryAxisXLSX() { // Original file was created with MS Office load("/chart2/qa/extras/data/xlsx/", "combined_chart_secondary_axis.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // Collect barchart axID on secondary Axis OUString XValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[1]", "val"); OUString YValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[2]", "val"); // Collect linechart axID on primary Axis OUString XValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[1]", "val"); OUString YValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[2]", "val"); // Check which c:catAx and c:valAx contain the AxisId of charttypes assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[1]/c:axId", "val", XValueIdOfLinechart); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:axId", "val", YValueIdOfLinechart); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[2]/c:axId", "val", XValueIdOfBarchart); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:axId", "val", YValueIdOfBarchart); } void Chart2ExportTest::testCombinedChartSecondaryAxisODS() { // Original file was created with LibreOffice load("/chart2/qa/extras/data/ods/", "combined_chart_secondary_axis.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // Collect barchart axID on secondary Axis OUString XValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[1]", "val"); OUString YValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[2]", "val"); // Collect linechart axID on primary Axis OUString XValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[1]", "val"); OUString YValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[2]", "val"); // Check which c:catAx and c:valAx contain the AxisId of charttypes assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[1]/c:axId", "val", XValueIdOfLinechart); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:axId", "val", YValueIdOfLinechart); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[2]/c:axId", "val", XValueIdOfBarchart); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:axId", "val", YValueIdOfBarchart); // do not need CT_crosses tag if the actual axis is deleted, so we need to make sure it is not saved assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[2]/c:crosses", 0); } void Chart2ExportTest::testCrossBetweenXLSX() { // Original file was created with MS Office load("/chart2/qa/extras/data/xlsx/", "tdf127777.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:crossBetween", "val", "between"); } void Chart2ExportTest::testCrossBetweenWithDeletedAxis() { // Original file was created with MS Office (the category axis is deleted in the file) load("/chart2/qa/extras/data/xlsx/", "tdf128633.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:crossBetween", "val", "between"); } void Chart2ExportTest::testCrossBetweenODS() { // Original file was created with LibreOffice load("/chart2/qa/extras/data/ods/", "test_CrossBetween.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:crossBetween", "val", "between"); } void Chart2ExportTest::testAxisTitleRotationXLSX() { load("/chart2/qa/extras/data/xlsx/", "axis_title_rotation.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:tx/c:rich/a:bodyPr", "rot", "0"); } void Chart2ExportTest::testAxisTitlePositionDOCX() { load("/chart2/qa/extras/data/docx/", "testAxisTitlePosition.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // test X Axis title position OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:title/c:layout/c:manualLayout/c:x", "val"); double nX = aXVal.toDouble(); CPPUNIT_ASSERT(nX > 0.698208 && nX < 0.698209); OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:title/c:layout/c:manualLayout/c:y", "val"); double nY = aYVal.toDouble(); CPPUNIT_ASSERT(nY > 0.805152 && nY < 0.805153); // test Y Axis title position aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:layout/c:manualLayout/c:x", "val"); nX = aXVal.toDouble(); CPPUNIT_ASSERT(nX > 0.025395 && nX < 0.025396); aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:layout/c:manualLayout/c:y", "val"); nY = aYVal.toDouble(); CPPUNIT_ASSERT(nY > 0.384407 && nY < 0.384408); } void Chart2ExportTest::testAxisCrossBetweenXSLX() { load("/chart2/qa/extras/data/odt/", "axis-position.odt"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); assertXPath(pXmlDoc, "(//c:crossBetween)[1]", "val", "midCat"); } void Chart2ExportTest::testPieChartDataPointExplosionXLSX() { load("/chart2/qa/extras/data/xlsx/", "pie_chart_datapoint_explosion.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dPt/c:explosion", "val", "28"); } void Chart2ExportTest::testCustomDataLabel() { load("/chart2/qa/extras/data/pptx/", "tdf115107.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart1", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); // Check the data labels font color for the complete data series assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:txPr/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "404040"); Reference xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); uno::Reference xDataSeries(getDataSeriesFromDoc(xChartDoc, 0)); CPPUNIT_ASSERT(xDataSeries.is()); float nFontSize; sal_Int64 nFontColor; sal_Int32 nCharUnderline; uno::Reference xPropertySet; uno::Sequence> aFields; // 1 xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_SET_THROW); xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields; CPPUNIT_ASSERT_EQUAL(static_cast(2), aFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[0]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("90.0 = "), aFields[0]->getString()); aFields[0]->getPropertyValue("CharHeight") >>= nFontSize; aFields[0]->getPropertyValue("CharColor") >>= nFontColor; CPPUNIT_ASSERT_EQUAL(static_cast(18), nFontSize); CPPUNIT_ASSERT_EQUAL(static_cast(0xed7d31), nFontColor); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[1]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("90"), aFields[1]->getString()); CPPUNIT_ASSERT_EQUAL(OUString("{0C576297-5A9F-4B4E-A675-B6BA406B7D87}"), aFields[1]->getGuid()); // 2 xPropertySet.set(xDataSeries->getDataPointByIndex(1), uno::UNO_SET_THROW); xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields; CPPUNIT_ASSERT_EQUAL(static_cast(8), aFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[0]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("Text"), aFields[0]->getString()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString(" : "), aFields[1]->getString()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_CATEGORYNAME, aFields[2]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("B"), aFields[2]->getString()); CPPUNIT_ASSERT_EQUAL(OUString("{0CCAAACD-B393-42CE-8DBD-82F9F9ADC852}"), aFields[2]->getGuid()); aFields[2]->getPropertyValue("CharHeight") >>= nFontSize; aFields[2]->getPropertyValue("CharColor") >>= nFontColor; CPPUNIT_ASSERT_EQUAL(static_cast(16), nFontSize); CPPUNIT_ASSERT_EQUAL(static_cast(0xed7d31), nFontColor); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_NEWLINE, aFields[3]->getFieldType()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[4]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("Multi"), aFields[4]->getString()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[5]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("line"), aFields[5]->getString()); aFields[5]->getPropertyValue("CharHeight") >>= nFontSize; aFields[5]->getPropertyValue("CharColor") >>= nFontColor; CPPUNIT_ASSERT_EQUAL(static_cast(13), nFontSize); CPPUNIT_ASSERT_EQUAL(static_cast(0xbf9000), nFontColor); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_NEWLINE, aFields[6]->getFieldType()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[7]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("Abc"), aFields[7]->getString()); aFields[7]->getPropertyValue("CharHeight") >>= nFontSize; aFields[7]->getPropertyValue("CharColor") >>= nFontColor; aFields[7]->getPropertyValue("CharUnderline") >>= nCharUnderline; CPPUNIT_ASSERT_EQUAL(static_cast(12), nFontSize); CPPUNIT_ASSERT_EQUAL(static_cast(0xa9d18e), nFontColor); CPPUNIT_ASSERT_EQUAL(static_cast(1), nCharUnderline); // 3 xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_SET_THROW); xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields; CPPUNIT_ASSERT_EQUAL(static_cast(1), aFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[0]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("DATA"), aFields[0]->getString()); CPPUNIT_ASSERT_EQUAL(OUString("{C8F3EB90-8960-4F9A-A3AD-B4FAC4FE4566}"), aFields[0]->getGuid()); // 4 xPropertySet.set(xDataSeries->getDataPointByIndex(3), uno::UNO_SET_THROW); xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields; CPPUNIT_ASSERT_EQUAL(static_cast(2), aFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_CELLREF, aFields[0]->getFieldType()); //CPPUNIT_ASSERT_EQUAL(OUString("70"), aFields[0]->getString()); TODO: Not implemented yet CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString(" getString()); } void Chart2ExportTest::testCustomDataLabelMultipleSeries() { load("/chart2/qa/extras/data/pptx/", "tdf115107-2.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart2", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); Reference xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); uno::Reference xDataSeries(getDataSeriesFromDoc(xChartDoc, 0)); CPPUNIT_ASSERT(xDataSeries.is()); float nFontSize; sal_Int64 nFontColor; uno::Reference xPropertySet; uno::Sequence> aFields; // First series xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_SET_THROW); xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields; CPPUNIT_ASSERT_EQUAL(static_cast(3), aFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[0]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("4.3"), aFields[0]->getString()); aFields[0]->getPropertyValue("CharHeight") >>= nFontSize; aFields[0]->getPropertyValue("CharColor") >>= nFontColor; CPPUNIT_ASSERT_EQUAL(static_cast(18), nFontSize); CPPUNIT_ASSERT_EQUAL(static_cast(0xc00000), nFontColor); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString(" "), aFields[1]->getString()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[2]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("Bars"), aFields[2]->getString()); // Second series xDataSeries = getDataSeriesFromDoc(xChartDoc, 0, 1); CPPUNIT_ASSERT(xDataSeries.is()); xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_SET_THROW); xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields; CPPUNIT_ASSERT_EQUAL(static_cast(3), aFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[0]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("2"), aFields[0]->getString()); aFields[0]->getPropertyValue("CharHeight") >>= nFontSize; aFields[0]->getPropertyValue("CharColor") >>= nFontColor; CPPUNIT_ASSERT_EQUAL(static_cast(18), nFontSize); CPPUNIT_ASSERT_EQUAL(static_cast(0xffd966), nFontColor); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString(" "), aFields[1]->getString()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[2]->getFieldType()); CPPUNIT_ASSERT_EQUAL(OUString("Line"), aFields[2]->getString()); } void Chart2ExportTest::testNumberFormatExportPPTX() { load("/chart2/qa/extras/data/pptx/", "tdf115859.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:numFmt", "formatCode", "#,##0.00,\\K"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:numFmt", "sourceLinked", "0"); } void Chart2ExportTest::testLabelSeparatorExportDOCX() { load("/chart2/qa/extras/data/docx/", "testLabelSeparator.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // The text separator should be a new line assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:separator", "\n"); // The text separator should be a comma assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:dLbls/c:separator", ", "); // The text separator should be a semicolon assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:dLbls/c:separator", "; "); } void Chart2ExportTest::testChartTitlePropertiesColorFillPPTX() { load("/chart2/qa/extras/data/pptx/", "testChartTitlePropertiesColorFill.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testChartTitlePropertiesGradientFillPPTX() { load("/chart2/qa/extras/data/pptx/", "testChartTitlePropertiesGradientFill.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "f6f8fc"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "c7d5ed"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testChartTitlePropertiesBitmapFillPPTX() { load("/chart2/qa/extras/data/pptx/", "testChartTitlePropertiesBitmapFill.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:blipFill/a:blip", "embed", "rId1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1); } void Chart2ExportTest::testxAxisLabelsRotation() { load ("/chart2/qa/extras/data/xlsx/", "xAxisLabelsRotation.xlsx"); xmlDocPtr pXmlDoc1 = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc1); // Chart1 xAxis labels should be 45 degree assertXPath(pXmlDoc1, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:bodyPr", "rot", "2700000"); } void Chart2ExportTest::testMultipleCategoryAxisLablesXLSX() { load("/chart2/qa/extras/data/ods/", "multilevelcat.ods"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // check category axis labels number of first level assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:ptCount", "val", "6"); // check category axis labels text of first level assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[1]/c:pt[1]/c:v", "Categoria 1"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[1]/c:pt[6]/c:v", "Categoria 6"); // check category axis labels text of second level assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[2]/c:pt[1]/c:v", "2011"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[2]/c:pt[3]/c:v", "2013"); // check the 'noMultiLvlLbl' tag - ChartExport.cxx:2950 FIXME: seems not support, so check the default noMultiLvlLbl value. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:noMultiLvlLbl", "val", "0"); } void Chart2ExportTest::testMultipleCategoryAxisLablesDOCX() { load("/chart2/qa/extras/data/odt/", "multilevelcat.odt"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); // check category axis labels number of first level assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:ptCount", "val", "4"); // check category axis labels text of first level assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[1]/c:pt[1]/c:v", "Categoria 1"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[1]/c:pt[4]/c:v", "Categoria 4"); // check category axis labels text of second level assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[2]/c:pt[1]/c:v", "2011"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:lvl[2]/c:pt[2]/c:v", "2012"); // check the 'noMultiLvlLbl' tag - ChartExport.cxx:2950 FIXME: seems not support, so check the default noMultiLvlLbl value. assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:noMultiLvlLbl", "val", "0"); } void Chart2ExportTest::testTdf116163() { load("/chart2/qa/extras/data/pptx/", "tdf116163.pptx"); xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:bodyPr", "rot", "-5400000"); } void Chart2ExportTest::testTdf111824() { load("/chart2/qa/extras/data/xlsx/", "tdf111824.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // Collect 3D barchart Z axID OUString zAxisIdOf3DBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:axId[3]", "val"); // 3D barchart Z axis properties should be in a serAx OOXML tag instead of catAx assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:serAx/c:axId", "val", zAxisIdOf3DBarchart); } void Chart2ExportTest::testTdf119029() { load("/chart2/qa/extras/data/odp/", "tdf119029.odp"); // Only use "chart", without number, because the number depends on the previous tests xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:txPr/a:bodyPr", "rot", "-5400000"); } void Chart2ExportTest::testTdf108022() { load("/chart2/qa/extras/data/odt/", "tdf108022.odt"); reload("Office Open XML Text"); // assert we really have two charts Reference xChartDoc1(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc1.is()); Reference xChartDoc2(getChartDocFromWriter(1), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc2.is()); } void Chart2ExportTest::testTdf121744() { load("/chart2/qa/extras/data/docx/", "tdf121744.docx"); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); OUString XValueId = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[1]", "val"); OUString YValueId = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[2]", "val"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[1]", "val", XValueId ); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[2]", "val", YValueId ); } void Chart2ExportTest::testTdf122031() { //Checks pie chart data label format. load("/chart2/qa/extras/data/xlsx/", "tdf122031.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:numFmt", "formatCode", "0.000%"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[1]/c:numFmt", "formatCode", "0.000%"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[2]/c:numFmt", "formatCode", "0.000%"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[3]/c:numFmt", "formatCode", "0.000%"); } void Chart2ExportTest::testTdf115012() { load("/chart2/qa/extras/data/xlsx/", "tdf115012.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); // workaround: use-zero instead of leave-gap to show the original line chart assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:dispBlanksAs", "val", "zero"); } void Chart2ExportTest::testTdf123206_customLabelText() { load("/chart2/qa/extras/data/docx/", "tdf123206.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[2]/c:tx/c:rich/a:p/a:r/a:t", "kiscica"); } void Chart2ExportTest::testCustomLabelText() { load("/chart2/qa/extras/data/docx/", "testCustomlabeltext.docx"); Reference xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); CPPUNIT_ASSERT(xChartDoc.is()); xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[1]/c:idx", "val", "2"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[1]/c:tx/c:rich/a:p/a:r[1]/a:t", "3.5"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[1]/c:tx/c:rich/a:p/a:r[3]/a:t", "CustomLabel 1"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[2]/c:idx", "val", "3"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[2]/c:tx/c:rich/a:p/a:r[1]/a:t", "4.5"); assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[2]/c:tx/c:rich/a:p/a:r[3]/a:t", "CustomLabel 2"); } void Chart2ExportTest::testTdf131979() { load("/chart2/qa/extras/data/ods/", "tdf131115.ods"); { reload("calc8"); Reference xChartDoc = getChartDocFromSheet(0, mxComponent); CPPUNIT_ASSERT(xChartDoc.is()); Reference xDataSeries(getDataSeriesFromDoc(xChartDoc, 0)); CPPUNIT_ASSERT(xDataSeries.is()); Reference xPropertySet; xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_SET_THROW); bool blinknumberformattosource = true; CPPUNIT_ASSERT(xPropertySet->getPropertyValue(CHART_UNONAME_LINK_TO_SRC_NUMFMT) >>= blinknumberformattosource); CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to false.", !blinknumberformattosource); } load("/chart2/qa/extras/data/ods/", "tdf131979.ods"); { reload("calc8"); Reference xChartDoc = getChartDocFromSheet(0, mxComponent); CPPUNIT_ASSERT(xChartDoc.is()); Reference xDataSeries(getDataSeriesFromDoc(xChartDoc, 0)); CPPUNIT_ASSERT(xDataSeries.is()); Reference xPropertySet; xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_SET_THROW); bool blinknumberformattosource = true; CPPUNIT_ASSERT(xPropertySet->getPropertyValue(CHART_UNONAME_LINK_TO_SRC_NUMFMT) >>= blinknumberformattosource); CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to true.", blinknumberformattosource); } } void Chart2ExportTest::testTdf132594() { load("/chart2/qa/extras/data/xlsx/", "chart_pie2007.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:cat", 1); } CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */