1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include "charttest.hxx"
11 
12 #include <test/xmltesttools.hxx>
13 
14 #include <com/sun/star/chart/ErrorBarStyle.hpp>
15 #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
16 #include <com/sun/star/chart2/XDataPointCustomLabelField.hpp>
17 #include <com/sun/star/chart2/DataPointCustomLabelFieldType.hpp>
18 #include <com/sun/star/lang/XServiceName.hpp>
19 #include <com/sun/star/packages/zip/ZipFileAccess.hpp>
20 #include <com/sun/star/text/XTextDocument.hpp>
21 #include <com/sun/star/drawing/LineStyle.hpp>
22 #include <com/sun/star/drawing/FillStyle.hpp>
23 #include <com/sun/star/chart2/DataPointLabel.hpp>
24 #include <com/sun/star/chart/DataLabelPlacement.hpp>
25 
26 #include <unotools/ucbstreamhelper.hxx>
27 
28 #include <libxml/xpathInternals.h>
29 
30 #include <algorithm>
31 
32 using uno::Reference;
33 using beans::XPropertySet;
34 
35 class Chart2ExportTest : public ChartTest, public XmlTestTools
36 {
37 protected:
38 
39     virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override;
40 public:
Chart2ExportTest()41     Chart2ExportTest() : ChartTest() {}
42     void testErrorBarXLSX();
43     void testErrorBarPropXLSX();
44     void testTrendline();
45     void testTrendlineOOXML();
46     void testTrendlineXLS();
47     void testStockChart();
48     void testBarChart();
49     void testCrosses();
50     void testScatterChartTextXValues();
51     void testScatterXAxisValues();
52     void testChartDataTable();
53     void testChartExternalData();
54     void testEmbeddingsGrabBag();
55     void testAreaChartLoad();
56     void testUpDownBars();
57     void testDoughnutChart();
58     void testDisplayUnits();
59     // void testFdo74115WallGradientFill();
60     void testFdo74115WallBitmapFill();
61     void testPieChartWallLineStyle();
62     void testBarChartRotation();
63     void testShapeFollowedByChart();
64     void testPieChartDataLabels();
65     void testSeriesIdxOrder();
66     void testScatterPlotLabels();
67     void testErrorBarDataRangeODS();
68     void testChartCrash();
69     void testPieChartRotation();
70     void testEmbeddingsOleObjectGrabBag();
71     void testGapWidthXLSX();
72     void testSmoothedLines();
73     void testLabelStringODS();
74     void testFdo78290LineChartMarkerX();
75     void testFdo78290ScatterChartMarkerX();
76     void testFdo78290CombinationChartMarkerX();
77     void testTdf126115IndividualMarker();
78     void testAxisNumberFormatODS();
79     void testAxisNumberFormatXLS();
80     void testDataLabelBordersDOCX();
81     void testDataLabel3DChartDOCX();
82     void testDataLabelBarChartDOCX();
83     void testDataLabelClusteredBarChartDOCX();
84     void testDataLabelRadarChartDOCX();
85     void testDataLabelDoughnutChartDOCX();
86     void testDataLabelAreaChartDOCX();
87     void testDataLabelDefaultLineChartDOCX();
88     void testIndividualDataLabelProps();
89     void testChartTitlePropertiesColorFillDOCX();
90     void testChartTitlePropertiesGradientFillDOCX();
91     void testChartTitlePropertiesBitmapFillDOCX();
92     void testColorGradientWithTransparancyDOCX();
93     void testColorGradientWithTransparancyODS();
94     void testColorGradientStopXLSX();
95     void testBarChartDataPointPropDOCX();
96     void testFdo83058dlblPos();
97     void testAutoTitleDelXLSX();
98     void testDispBlanksAsXLSX();
99     void testMarkerColorXLSX();
100     void testRoundedCornersXLSX();
101     void testAxisNumberFormatXLSX();
102     void testDataPointLabelNumberFormatXLSX();
103     void testDataLabelDefaultValuesXLSX();
104     void testTitleOverlayXLSX();
105     void testInvertIfNegativeXLSX();
106     void testBubble3DXLSX();
107     void testNoMarkerXLSX();
108     void testTitleManualLayoutXLSX();
109     void testPlotAreaManualLayoutXLSX();
110     void testLegendManualLayoutXLSX();
111     void testChartSubTitle();
112     void testChartMainWithSubTitle();
113     void testAutoTitleDeleted();
114     void testChartTitlePropertiesColorFillXLSX();
115     void testChartTitlePropertiesGradientFillXLSX();
116     void testChartTitlePropertiesBitmapFillXLSX();
117     void testBarChartDataPointPropXLSX();
118     void testDataseriesOverlapStackedChartXLSX();
119     void testAxisCharacterPropertiesXLSX();
120     void testTitleCharacterPropertiesXLSX();
121     void testPlotVisOnlyXLSX();
122     void testBarChartVaryColorsXLSX();
123     void testMultipleAxisXLSX();
124     void testSecondaryAxisXLSX();
125     void testSetSeriesToSecondaryAxisXLSX();
126     void testCombinedChartSecondaryAxisXLSX();
127     void testCombinedChartSecondaryAxisODS();
128     void testCrossBetweenXLSX();
129     void testCrossBetweenWithDeletedAxis();
130     void testCrossBetweenODS();
131     void testAxisTitleRotationXLSX();
132     void testAxisTitlePositionDOCX();
133     void testAxisCrossBetweenXSLX();
134     void testPieChartDataPointExplosionXLSX();
135     void testCustomDataLabel();
136     void testCustomDataLabelMultipleSeries();
137     void testNumberFormatExportPPTX();
138     void testLabelSeparatorExportDOCX();
139     void testChartTitlePropertiesColorFillPPTX();
140     void testChartTitlePropertiesGradientFillPPTX();
141     void testChartTitlePropertiesBitmapFillPPTX();
142     void testxAxisLabelsRotation();
143     void testMultipleCategoryAxisLablesXLSX();
144     void testMultipleCategoryAxisLablesDOCX();
145     void testTdf116163();
146     void testTdf111824();
147     void testTdf119029();
148     void testTdf108022();
149     void testTdf121744();
150     void testTdf122031();
151     void testTdf115012();
152     void testTdf123206_customLabelText();
153     void testCustomLabelText();
154     void testTdf131979();
155     void testTdf132594();
156 
157     CPPUNIT_TEST_SUITE(Chart2ExportTest);
158     CPPUNIT_TEST(testErrorBarXLSX);
159     CPPUNIT_TEST(testErrorBarPropXLSX);
160     CPPUNIT_TEST(testTrendline);
161     CPPUNIT_TEST(testTrendlineOOXML);
162     CPPUNIT_TEST(testTrendlineXLS);
163     CPPUNIT_TEST(testStockChart);
164     CPPUNIT_TEST(testBarChart);
165     CPPUNIT_TEST(testCrosses);
166     CPPUNIT_TEST(testScatterChartTextXValues);
167     CPPUNIT_TEST(testScatterXAxisValues);
168     CPPUNIT_TEST(testChartDataTable);
169     CPPUNIT_TEST(testChartExternalData);
170     CPPUNIT_TEST(testEmbeddingsGrabBag);
171     CPPUNIT_TEST(testAreaChartLoad);
172     CPPUNIT_TEST(testUpDownBars);
173     CPPUNIT_TEST(testDoughnutChart);
174     CPPUNIT_TEST(testDisplayUnits);
175     // CPPUNIT_TEST(testFdo74115WallGradientFill);
176     CPPUNIT_TEST(testFdo74115WallBitmapFill);
177     CPPUNIT_TEST(testPieChartWallLineStyle);
178     CPPUNIT_TEST(testBarChartRotation);
179     CPPUNIT_TEST(testShapeFollowedByChart);
180     CPPUNIT_TEST(testPieChartDataLabels);
181     CPPUNIT_TEST(testSeriesIdxOrder);
182     CPPUNIT_TEST(testScatterPlotLabels);
183     CPPUNIT_TEST(testErrorBarDataRangeODS);
184     CPPUNIT_TEST(testChartCrash);
185     CPPUNIT_TEST(testPieChartRotation);
186     CPPUNIT_TEST(testEmbeddingsOleObjectGrabBag);
187     CPPUNIT_TEST(testGapWidthXLSX);
188     CPPUNIT_TEST(testSmoothedLines);
189     CPPUNIT_TEST(testLabelStringODS);
190     CPPUNIT_TEST(testFdo78290LineChartMarkerX);
191     CPPUNIT_TEST(testFdo78290ScatterChartMarkerX);
192     CPPUNIT_TEST(testFdo78290CombinationChartMarkerX);
193     CPPUNIT_TEST(testTdf126115IndividualMarker);
194     CPPUNIT_TEST(testAxisNumberFormatODS);
195     CPPUNIT_TEST(testAxisNumberFormatXLS);
196     CPPUNIT_TEST(testDataLabelBordersDOCX);
197     CPPUNIT_TEST(testDataLabel3DChartDOCX);
198     CPPUNIT_TEST(testDataLabelBarChartDOCX);
199     CPPUNIT_TEST(testDataLabelClusteredBarChartDOCX);
200     CPPUNIT_TEST(testDataLabelRadarChartDOCX);
201     CPPUNIT_TEST(testDataLabelDoughnutChartDOCX);
202     CPPUNIT_TEST(testDataLabelAreaChartDOCX);
203     CPPUNIT_TEST(testDataLabelDefaultLineChartDOCX);
204     CPPUNIT_TEST(testIndividualDataLabelProps);
205     CPPUNIT_TEST(testChartTitlePropertiesColorFillDOCX);
206     CPPUNIT_TEST(testChartTitlePropertiesGradientFillDOCX);
207     CPPUNIT_TEST(testChartTitlePropertiesBitmapFillDOCX);
208     CPPUNIT_TEST(testColorGradientWithTransparancyDOCX);
209     CPPUNIT_TEST(testColorGradientWithTransparancyODS);
210     CPPUNIT_TEST(testColorGradientStopXLSX);
211     CPPUNIT_TEST(testBarChartDataPointPropDOCX);
212     CPPUNIT_TEST(testFdo83058dlblPos);
213     CPPUNIT_TEST(testAutoTitleDelXLSX);
214     CPPUNIT_TEST(testDispBlanksAsXLSX);
215     CPPUNIT_TEST(testMarkerColorXLSX);
216     CPPUNIT_TEST(testRoundedCornersXLSX);
217     CPPUNIT_TEST(testAxisNumberFormatXLSX);
218     CPPUNIT_TEST(testDataPointLabelNumberFormatXLSX);
219     CPPUNIT_TEST(testDataLabelDefaultValuesXLSX);
220     CPPUNIT_TEST(testTitleOverlayXLSX);
221     CPPUNIT_TEST(testInvertIfNegativeXLSX);
222     CPPUNIT_TEST(testBubble3DXLSX);
223     CPPUNIT_TEST(testNoMarkerXLSX);
224     CPPUNIT_TEST(testTitleManualLayoutXLSX);
225     CPPUNIT_TEST(testPlotAreaManualLayoutXLSX);
226     CPPUNIT_TEST(testLegendManualLayoutXLSX);
227     CPPUNIT_TEST(testChartSubTitle);
228     CPPUNIT_TEST(testChartMainWithSubTitle);
229     CPPUNIT_TEST(testAutoTitleDeleted);
230     CPPUNIT_TEST(testChartTitlePropertiesColorFillXLSX);
231     CPPUNIT_TEST(testChartTitlePropertiesGradientFillXLSX);
232     CPPUNIT_TEST(testChartTitlePropertiesBitmapFillXLSX);
233     CPPUNIT_TEST(testBarChartDataPointPropXLSX);
234     CPPUNIT_TEST(testDataseriesOverlapStackedChartXLSX);
235     CPPUNIT_TEST(testAxisCharacterPropertiesXLSX);
236     CPPUNIT_TEST(testTitleCharacterPropertiesXLSX);
237     CPPUNIT_TEST(testPlotVisOnlyXLSX);
238     CPPUNIT_TEST(testBarChartVaryColorsXLSX);
239     CPPUNIT_TEST(testMultipleAxisXLSX);
240     CPPUNIT_TEST(testSecondaryAxisXLSX);
241     CPPUNIT_TEST(testSetSeriesToSecondaryAxisXLSX);
242     CPPUNIT_TEST(testCombinedChartSecondaryAxisXLSX);
243     CPPUNIT_TEST(testCombinedChartSecondaryAxisODS);
244     CPPUNIT_TEST(testCrossBetweenXLSX);
245     CPPUNIT_TEST(testCrossBetweenWithDeletedAxis);
246     CPPUNIT_TEST(testCrossBetweenODS);
247     CPPUNIT_TEST(testAxisTitleRotationXLSX);
248     CPPUNIT_TEST(testAxisTitlePositionDOCX);
249     CPPUNIT_TEST(testAxisCrossBetweenXSLX);
250     CPPUNIT_TEST(testPieChartDataPointExplosionXLSX);
251     CPPUNIT_TEST(testCustomDataLabel);
252     CPPUNIT_TEST(testCustomDataLabelMultipleSeries);
253     CPPUNIT_TEST(testNumberFormatExportPPTX);
254     CPPUNIT_TEST(testLabelSeparatorExportDOCX);
255     CPPUNIT_TEST(testChartTitlePropertiesColorFillPPTX);
256     CPPUNIT_TEST(testChartTitlePropertiesGradientFillPPTX);
257     CPPUNIT_TEST(testChartTitlePropertiesBitmapFillPPTX);
258     CPPUNIT_TEST(testxAxisLabelsRotation);
259     CPPUNIT_TEST(testMultipleCategoryAxisLablesXLSX);
260     CPPUNIT_TEST(testMultipleCategoryAxisLablesDOCX);
261     CPPUNIT_TEST(testTdf116163);
262     CPPUNIT_TEST(testTdf111824);
263     CPPUNIT_TEST(testTdf119029);
264     CPPUNIT_TEST(testTdf108022);
265     CPPUNIT_TEST(testTdf121744);
266     CPPUNIT_TEST(testTdf122031);
267     CPPUNIT_TEST(testTdf115012);
268     CPPUNIT_TEST(testTdf123206_customLabelText);
269     CPPUNIT_TEST(testCustomLabelText);
270     CPPUNIT_TEST(testTdf131979);
271     CPPUNIT_TEST(testTdf132594);
272 
273     CPPUNIT_TEST_SUITE_END();
274 
275 protected:
276     /**
277      * Given that some problem doesn't affect the result in the importer, we
278      * test the resulting file directly, by opening the zip file, parsing an
279      * xml stream, and asserting an XPath expression. This method returns the
280      * xml stream, so that you can do the asserting.
281      */
282     xmlDocPtr parseExport(const OUString& rDir, const OUString& rFilterFormat);
283 
284 };
285 
286 namespace {
287 
288 struct CheckForChartName
289 {
290 private:
291     OUString aDir;
292 
293 public:
CheckForChartName__anon2b64bac60111::CheckForChartName294     explicit CheckForChartName( const OUString& rDir ):
295         aDir(rDir) {}
296 
operator ()__anon2b64bac60111::CheckForChartName297     bool operator()(const OUString& rName)
298     {
299         if(!rName.startsWith(aDir))
300             return false;
301 
302         if(!rName.endsWith(".xml"))
303             return false;
304 
305         return true;
306     }
307 };
308 
findChartFile(const OUString & rDir,uno::Reference<container::XNameAccess> const & xNames)309 OUString findChartFile(const OUString& rDir, uno::Reference< container::XNameAccess > const & xNames )
310 {
311     uno::Sequence<OUString> aNames = xNames->getElementNames();
312     OUString* pElement = std::find_if(aNames.begin(), aNames.end(), CheckForChartName(rDir));
313 
314     CPPUNIT_ASSERT(pElement != aNames.end());
315     return *pElement;
316 }
317 
318 }
319 
parseExport(const OUString & rDir,const OUString & rFilterFormat)320 xmlDocPtr Chart2ExportTest::parseExport(const OUString& rDir, const OUString& rFilterFormat)
321 {
322     std::shared_ptr<utl::TempFile> pTempFile = save(rFilterFormat);
323 
324     // Read the XML stream we're interested in.
325     uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), pTempFile->GetURL());
326     uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName(findChartFile(rDir, xNameAccess)), uno::UNO_QUERY);
327     CPPUNIT_ASSERT(xInputStream.is());
328     std::shared_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
329 
330     return parseXmlStream(pStream.get());
331 }
332 
registerNamespaces(xmlXPathContextPtr & pXmlXPathCtx)333 void Chart2ExportTest::registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx)
334 {
335     static struct { char const * pPrefix; char const * pURI; } const aNamespaces[] =
336     {
337         { "w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main" },
338         { "v", "urn:schemas-microsoft-com:vml" },
339         { "c", "http://schemas.openxmlformats.org/drawingml/2006/chart" },
340         { "a", "http://schemas.openxmlformats.org/drawingml/2006/main" },
341         { "mc", "http://schemas.openxmlformats.org/markup-compatibility/2006" },
342         { "wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape" },
343         { "wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" },
344         { "wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" },
345         { "office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" },
346         { "table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0" },
347         { "text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" },
348         { "xlink", "http://www.w3c.org/1999/xlink" }
349     };
350     for(size_t i = 0; i < SAL_N_ELEMENTS(aNamespaces); ++i)
351     {
352         xmlXPathRegisterNs(
353             pXmlXPathCtx,
354             reinterpret_cast<xmlChar const *>(aNamespaces[i].pPrefix),
355             reinterpret_cast<xmlChar const *>(aNamespaces[i].pURI));
356     }
357 }
358 
359 namespace {
360 
testErrorBar(Reference<XPropertySet> const & xErrorBar)361 void testErrorBar( Reference< XPropertySet > const & xErrorBar )
362 {
363     sal_Int32 nErrorBarStyle;
364     CPPUNIT_ASSERT(
365         xErrorBar->getPropertyValue("ErrorBarStyle") >>= nErrorBarStyle);
366     CPPUNIT_ASSERT_EQUAL(chart::ErrorBarStyle::RELATIVE, nErrorBarStyle);
367     bool bShowPositive = bool(), bShowNegative = bool();
368     CPPUNIT_ASSERT(
369         xErrorBar->getPropertyValue("ShowPositiveError") >>= bShowPositive);
370     CPPUNIT_ASSERT(bShowPositive);
371     CPPUNIT_ASSERT(
372         xErrorBar->getPropertyValue("ShowNegativeError") >>= bShowNegative);
373     CPPUNIT_ASSERT(bShowNegative);
374     double nVal = 0.0;
375     CPPUNIT_ASSERT(xErrorBar->getPropertyValue("PositiveError") >>= nVal);
376     CPPUNIT_ASSERT_DOUBLES_EQUAL(10.0, nVal, 1e-10);
377 }
378 
checkCommonTrendline(Reference<chart2::XRegressionCurve> const & xCurve,double aExpectedExtrapolateForward,double aExpectedExtrapolateBackward,bool aExpectedForceIntercept,double aExpectedInterceptValue,bool aExpectedShowEquation,bool aExpectedR2)379 void checkCommonTrendline(
380         Reference<chart2::XRegressionCurve> const & xCurve,
381         double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward,
382         bool aExpectedForceIntercept, double aExpectedInterceptValue,
383         bool aExpectedShowEquation, bool aExpectedR2)
384 {
385     Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
386     CPPUNIT_ASSERT(xProperties.is());
387 
388     double aExtrapolateForward = 0.0;
389     CPPUNIT_ASSERT(xProperties->getPropertyValue("ExtrapolateForward") >>= aExtrapolateForward);
390     CPPUNIT_ASSERT_EQUAL(aExpectedExtrapolateForward, aExtrapolateForward);
391 
392     double aExtrapolateBackward = 0.0;
393     CPPUNIT_ASSERT(xProperties->getPropertyValue("ExtrapolateBackward") >>= aExtrapolateBackward);
394     CPPUNIT_ASSERT_EQUAL(aExpectedExtrapolateBackward, aExtrapolateBackward);
395 
396     bool bForceIntercept = false;
397     CPPUNIT_ASSERT(xProperties->getPropertyValue("ForceIntercept") >>= bForceIntercept);
398     CPPUNIT_ASSERT_EQUAL(aExpectedForceIntercept, bForceIntercept);
399 
400     if (bForceIntercept)
401     {
402         double aInterceptValue = 0.0;
403         CPPUNIT_ASSERT(xProperties->getPropertyValue("InterceptValue") >>= aInterceptValue);
404         CPPUNIT_ASSERT_EQUAL(aExpectedInterceptValue, aInterceptValue);
405     }
406 
407     Reference< XPropertySet > xEquationProperties( xCurve->getEquationProperties() );
408     CPPUNIT_ASSERT(xEquationProperties.is());
409 
410     bool bShowEquation = false;
411     CPPUNIT_ASSERT(xEquationProperties->getPropertyValue("ShowEquation") >>= bShowEquation);
412     CPPUNIT_ASSERT_EQUAL(aExpectedShowEquation, bShowEquation);
413 
414     bool bShowCorrelationCoefficient = false;
415     CPPUNIT_ASSERT(xEquationProperties->getPropertyValue("ShowCorrelationCoefficient") >>= bShowCorrelationCoefficient);
416     CPPUNIT_ASSERT_EQUAL(aExpectedR2, bShowCorrelationCoefficient);
417 }
418 
checkNameAndType(Reference<XPropertySet> const & xProperties,const OUString & aExpectedName,const OUString & aExpectedServiceName)419 void checkNameAndType(Reference<XPropertySet> const & xProperties, const OUString& aExpectedName, const OUString& aExpectedServiceName)
420 {
421     Reference< lang::XServiceName > xServiceName( xProperties, UNO_QUERY );
422     CPPUNIT_ASSERT(xServiceName.is());
423 
424     OUString aServiceName = xServiceName->getServiceName();
425     CPPUNIT_ASSERT_EQUAL(aExpectedServiceName, aServiceName);
426 
427     OUString aCurveName;
428     CPPUNIT_ASSERT(xProperties->getPropertyValue("CurveName") >>= aCurveName);
429     CPPUNIT_ASSERT_EQUAL(aExpectedName, aCurveName);
430 }
431 
checkLinearTrendline(Reference<chart2::XRegressionCurve> const & xCurve,const OUString & aExpectedName,double aExpectedExtrapolateForward,double aExpectedExtrapolateBackward,double aExpectedInterceptValue)432 void checkLinearTrendline(
433         Reference<chart2::XRegressionCurve> const & xCurve, const OUString& aExpectedName,
434         double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward,
435         double aExpectedInterceptValue)
436 {
437     Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
438     CPPUNIT_ASSERT(xProperties.is());
439 
440     checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.LinearRegressionCurve");
441 
442     checkCommonTrendline(
443         xCurve,
444         aExpectedExtrapolateForward, aExpectedExtrapolateBackward,
445         /*aExpectedForceIntercept*/false, aExpectedInterceptValue,
446         /*aExpectedShowEquation*/true, /*aExpectedR2*/false);
447 }
448 
checkPolynomialTrendline(Reference<chart2::XRegressionCurve> const & xCurve,const OUString & aExpectedName,sal_Int32 aExpectedDegree,double aExpectedExtrapolateForward,double aExpectedExtrapolateBackward,double aExpectedInterceptValue)449 void checkPolynomialTrendline(
450         Reference<chart2::XRegressionCurve> const & xCurve, const OUString& aExpectedName,
451         sal_Int32 aExpectedDegree,
452         double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward,
453         double aExpectedInterceptValue)
454 {
455     Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
456     CPPUNIT_ASSERT(xProperties.is());
457 
458     checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.PolynomialRegressionCurve");
459 
460     sal_Int32 aDegree = 2;
461     CPPUNIT_ASSERT(xProperties->getPropertyValue("PolynomialDegree") >>= aDegree);
462     CPPUNIT_ASSERT_EQUAL(aExpectedDegree, aDegree);
463 
464     checkCommonTrendline(
465         xCurve,
466         aExpectedExtrapolateForward, aExpectedExtrapolateBackward,
467         /*aExpectedForceIntercept*/true, aExpectedInterceptValue,
468         /*aExpectedShowEquation*/true, /*aExpectedR2*/true);
469 }
470 
checkMovingAverageTrendline(Reference<chart2::XRegressionCurve> const & xCurve,const OUString & aExpectedName,sal_Int32 aExpectedPeriod)471 void checkMovingAverageTrendline(
472         Reference<chart2::XRegressionCurve> const & xCurve, const OUString& aExpectedName, sal_Int32 aExpectedPeriod)
473 {
474     Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
475     CPPUNIT_ASSERT(xProperties.is());
476 
477     checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.MovingAverageRegressionCurve");
478 
479     sal_Int32 aPeriod = 2;
480     CPPUNIT_ASSERT(xProperties->getPropertyValue("MovingAveragePeriod") >>= aPeriod);
481     CPPUNIT_ASSERT_EQUAL(aExpectedPeriod, aPeriod);
482 }
483 
checkTrendlinesInChart(uno::Reference<chart2::XChartDocument> const & xChartDoc)484 void checkTrendlinesInChart(uno::Reference< chart2::XChartDocument > const & xChartDoc)
485 {
486     CPPUNIT_ASSERT(xChartDoc.is());
487 
488     Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
489     CPPUNIT_ASSERT( xDataSeries.is() );
490 
491     Reference< chart2::XRegressionCurveContainer > xRegressionCurveContainer( xDataSeries, UNO_QUERY );
492     CPPUNIT_ASSERT( xRegressionCurveContainer.is() );
493 
494     Sequence< Reference< chart2::XRegressionCurve > > xRegressionCurveSequence = xRegressionCurveContainer->getRegressionCurves();
495     CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xRegressionCurveSequence.getLength());
496 
497     Reference<chart2::XRegressionCurve> xCurve;
498 
499     xCurve = xRegressionCurveSequence[0];
500     CPPUNIT_ASSERT(xCurve.is());
501     checkPolynomialTrendline(xCurve, "col2_poly", 3, 0.1, -0.1, -1.0);
502 
503     xCurve = xRegressionCurveSequence[1];
504     CPPUNIT_ASSERT(xCurve.is());
505     checkLinearTrendline(xCurve, "col2_linear", -0.5, -0.5, 0.0);
506 
507     xCurve = xRegressionCurveSequence[2];
508     CPPUNIT_ASSERT(xCurve.is());
509     checkMovingAverageTrendline(xCurve, "col2_moving_avg", 3);
510 }
511 
512 }
513 
514 // improve the test
testErrorBarXLSX()515 void Chart2ExportTest::testErrorBarXLSX()
516 {
517     load("/chart2/qa/extras/data/ods/", "error_bar.ods");
518     {
519         // make sure the ODS import was successful
520         uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
521         CPPUNIT_ASSERT(xChartDoc.is());
522 
523         Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
524         CPPUNIT_ASSERT( xDataSeries.is() );
525 
526         Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW );
527 
528         // test that y error bars are there
529         Reference< beans::XPropertySet > xErrorBarYProps;
530         xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps;
531         testErrorBar(xErrorBarYProps);
532     }
533 
534     reload("Calc Office Open XML");
535     {
536         uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
537         CPPUNIT_ASSERT(xChartDoc.is());
538 
539         Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
540         CPPUNIT_ASSERT( xDataSeries.is() );
541 
542         Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW );
543 
544         // test that y error bars are there
545         Reference< beans::XPropertySet > xErrorBarYProps;
546         xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps;
547         testErrorBar(xErrorBarYProps);
548     }
549 }
550 
testErrorBarPropXLSX()551 void Chart2ExportTest::testErrorBarPropXLSX()
552 {
553     load("/chart2/qa/extras/data/xlsx/", "testErrorBarProp.xlsx");
554     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
555     CPPUNIT_ASSERT(pXmlDoc);
556 
557     // test y error bars property
558     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[1]/c:errDir", "val", "y");
559     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[1]/c:spPr/a:ln", "w", "12600");
560     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");
561 
562     // test x error bars property
563     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[2]/c:errDir", "val", "x");
564     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:errBars[2]/c:spPr/a:ln", "w", "9360");
565     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");
566 }
567 
568 // This method tests the preservation of properties for trendlines / regression curves
569 // in an export -> import cycle using different file formats - ODS, XLS and XLSX.
testTrendline()570 void Chart2ExportTest::testTrendline()
571 {
572     mbSkipValidation = true;
573     load("/chart2/qa/extras/data/ods/", "trendline.ods");
574     checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
575     reload("calc8");
576     checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
577 }
578 
testTrendlineOOXML()579 void Chart2ExportTest::testTrendlineOOXML()
580 {
581     load("/chart2/qa/extras/data/ods/", "trendline.ods");
582     checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
583     reload("Calc Office Open XML");
584     checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
585 }
586 
testTrendlineXLS()587 void Chart2ExportTest::testTrendlineXLS()
588 {
589     mbSkipValidation = true;
590     load("/chart2/qa/extras/data/ods/", "trendline.ods");
591     checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
592     reload("MS Excel 97");
593     checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
594 }
595 
testStockChart()596 void Chart2ExportTest::testStockChart()
597 {
598     /*  For attached file Stock_Chart.docx, in chart1.xml,
599      * <c:stockChart>, there are four types of series as
600      * Open,Low,High and Close.
601      * For Open series, in <c:idx val="0" />
602      * an attribute val of index should start from 1 and not from 0.
603      * Which was problem area.
604      */
605     load("/chart2/qa/extras/data/docx/", "testStockChart.docx");
606 
607     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
608     if (!pXmlDoc)
609        return;
610 
611     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:idx", "val", "1");
612     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:order", "val", "1");
613     assertXPathContent(
614         pXmlDoc,
615         "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:tx/c:strRef/c:strCache/c:pt/c:v",
616         "Open");
617 }
618 
testBarChart()619 void Chart2ExportTest::testBarChart()
620 {
621     load("/chart2/qa/extras/data/docx/", "testBarChart.docx");
622     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
623     if (!pXmlDoc)
624        return;
625 
626     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:barDir", "val", "col");
627 }
628 
testCrosses()629 void Chart2ExportTest::testCrosses()
630 {
631     load("/chart2/qa/extras/data/docx/", "Bar_horizontal_cone.docx");
632     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
633 
634     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:crosses", "val", "autoZero");
635 }
636 
testScatterChartTextXValues()637 void Chart2ExportTest::testScatterChartTextXValues()
638 {
639     load("/chart2/qa/extras/data/docx/", "scatter-chart-text-x-values.docx");
640 
641     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
642     CPPUNIT_ASSERT(xChartDoc.is());
643 
644     Reference<chart2::XChartType> xCT = getChartTypeFromDoc(xChartDoc, 0);
645     CPPUNIT_ASSERT(xCT.is());
646 
647     // Make sure we have exactly 3 data series.
648     std::vector<uno::Sequence<uno::Any> > aLabels = getDataSeriesLabelsFromChartType(xCT);
649     CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size());
650     CPPUNIT_ASSERT_EQUAL(OUString("Series 1"), aLabels[0][0].get<OUString>());
651     CPPUNIT_ASSERT_EQUAL(OUString("Series 2"), aLabels[1][0].get<OUString>());
652     CPPUNIT_ASSERT_EQUAL(OUString("Series 3"), aLabels[2][0].get<OUString>());
653 
654     std::vector<std::vector<double> > aYValues = getDataSeriesYValuesFromChartType(xCT);
655     CPPUNIT_ASSERT_EQUAL(size_t(3), aYValues.size());
656 
657     // Check the Y values of "Series 1".
658     CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[0].size());
659     CPPUNIT_ASSERT_EQUAL(4.3, aYValues[0][0]);
660     CPPUNIT_ASSERT_EQUAL(2.5, aYValues[0][1]);
661     CPPUNIT_ASSERT_EQUAL(3.5, aYValues[0][2]);
662     CPPUNIT_ASSERT_EQUAL(4.5, aYValues[0][3]);
663 
664     // And "Series 2".
665     CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[1].size());
666     CPPUNIT_ASSERT_EQUAL(2.4, aYValues[1][0]);
667     CPPUNIT_ASSERT_EQUAL(4.4, aYValues[1][1]);
668     CPPUNIT_ASSERT_EQUAL(1.8, aYValues[1][2]);
669     CPPUNIT_ASSERT_EQUAL(2.8, aYValues[1][3]);
670 
671     // And "Series 3".
672     CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[2].size());
673     CPPUNIT_ASSERT_EQUAL(2.0, aYValues[2][0]);
674     CPPUNIT_ASSERT_EQUAL(2.0, aYValues[2][1]);
675     CPPUNIT_ASSERT_EQUAL(3.0, aYValues[2][2]);
676     CPPUNIT_ASSERT_EQUAL(5.0, aYValues[2][3]);
677 
678     // Test the export.
679     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
680     if (!pXmlDoc)
681        return;
682 
683     assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser[1]/c:xVal[1]/c:numRef[1]/c:numCache[1]/c:pt[1]/c:v[1]", "1");
684 }
685 
testScatterXAxisValues()686 void Chart2ExportTest::testScatterXAxisValues()
687 {
688     load("/chart2/qa/extras/data/odt/", "tdf114657.odt");
689 
690     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
691     CPPUNIT_ASSERT(pXmlDoc);
692 
693     assertXPath(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:ptCount", "val", "5");
694     assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[1]/c:v", "15");
695     assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[2]/c:v", "11");
696     assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[3]/c:v", "20");
697     assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser/c:xVal/c:numRef/c:numCache/c:pt[4]/c:v", "16");
698 }
699 
testChartDataTable()700 void Chart2ExportTest::testChartDataTable()
701 {
702     load("/chart2/qa/extras/data/docx/", "testChartDataTable.docx");
703 
704     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
705     CPPUNIT_ASSERT(pXmlDoc);
706     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showHorzBorder", "val", "1");
707     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showVertBorder", "val", "1");
708     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showOutline", "val", "1");
709 }
710 
testChartExternalData()711 void Chart2ExportTest::testChartExternalData()
712 {
713     load("/chart2/qa/extras/data/docx/", "testMultipleChart.docx");
714 
715     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
716     CPPUNIT_ASSERT(pXmlDoc);
717     xmlXPathObjectPtr pXmlPathObj = getXPathNode(pXmlDoc, "/c:chartSpace/c:externalData");
718     xmlNodeSetPtr pXmlNodes = pXmlPathObj->nodesetval;
719     CPPUNIT_ASSERT(pXmlNodes);
720 }
721 
testEmbeddingsGrabBag()722 void Chart2ExportTest::testEmbeddingsGrabBag()
723 {
724    // The problem was that .xlsx files were missing from docx file from embeddings folder
725    // after saving file.
726    // This test case tests whether embeddings files grabbagged properly in correct object.
727 
728    load("/chart2/qa/extras/data/docx/", "testMultiplechartembeddings.docx" );
729    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
730    uno::Reference<beans::XPropertySet> xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY);
731    uno::Sequence<beans::PropertyValue> aGrabBag(0);
732    xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
733    CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty
734    bool bEmbeddings = false;
735    const char* const testEmbeddedFileNames[] {"word/embeddings/Microsoft_Excel_Worksheet3.xlsx",
736                                         "word/embeddings/Microsoft_Excel_Worksheet2.xlsx",
737                                         "word/embeddings/Microsoft_Excel_Worksheet1.xlsx"};
738    for(int i = 0; i < aGrabBag.getLength(); ++i)
739    {
740        if (aGrabBag[i].Name == "OOXEmbeddings")
741        {
742            bEmbeddings = true;
743            uno::Sequence<beans::PropertyValue> aEmbeddingsList(0);
744            uno::Reference<io::XInputStream> aEmbeddingXlsxStream;
745            OUString aEmbeddedfileName;
746            CPPUNIT_ASSERT(aGrabBag[i].Value >>= aEmbeddingsList); // PropertyValue of proper type
747            sal_Int32 length = aEmbeddingsList.getLength();
748            CPPUNIT_ASSERT_EQUAL(sal_Int32(3), length);
749            for(int j = 0; j < length; ++j)
750            {
751                aEmbeddingsList[j].Value >>= aEmbeddingXlsxStream;
752                aEmbeddedfileName = aEmbeddingsList[j].Name;
753                CPPUNIT_ASSERT(aEmbeddingXlsxStream.get()); // Reference not empty
754                CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(testEmbeddedFileNames[j]),aEmbeddedfileName);
755            }
756        }
757    }
758    CPPUNIT_ASSERT(bEmbeddings); // Grab Bag has all the expected elements
759 }
760 
testAreaChartLoad()761 void Chart2ExportTest::testAreaChartLoad()
762 {
763     load ("/chart2/qa/extras/data/docx/", "testAreaChartLoad.docx");
764     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
765     CPPUNIT_ASSERT(pXmlDoc);
766     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:showVal", "val", "1");
767     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLbl", 0);
768 }
769 
testUpDownBars()770 void Chart2ExportTest::testUpDownBars()
771 {
772     /*
773     load("/chart2/qa/extras/data/docx/", "UpDownBars.docx");
774     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
775     CPPUNIT_ASSERT(pXmlDoc);
776     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:upDownBars");
777     */
778 }
779 
testDoughnutChart()780 void Chart2ExportTest::testDoughnutChart()
781 {
782     load("/chart2/qa/extras/data/docx/", "doughnutChart.docx");
783     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
784     CPPUNIT_ASSERT(pXmlDoc);
785 
786     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart");
787 }
788 
testDisplayUnits()789 void Chart2ExportTest::testDisplayUnits()
790 {
791     load("/chart2/qa/extras/data/docx/", "DisplayUnits.docx");
792     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
793     CPPUNIT_ASSERT(pXmlDoc);
794 
795     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:dispUnits/c:builtInUnit", "val", "billions");
796 }
797 
798 // void Chart2ExportTest::testFdo74115WallGradientFill()
799 // {
800 //     load("/chart2/qa/extras/data/docx/", "fdo74115_WallGradientFill.docx");
801 //     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
802 //     CPPUNIT_ASSERT(pXmlDoc);
803 //
804 //     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:gradFill");
805 // }
806 
testFdo74115WallBitmapFill()807 void Chart2ExportTest::testFdo74115WallBitmapFill()
808 {
809     load("/chart2/qa/extras/data/docx/", "fdo74115_WallBitmapFill.docx");
810     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
811     CPPUNIT_ASSERT(pXmlDoc);
812     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:blipFill");
813 }
814 
testPieChartWallLineStyle()815 void Chart2ExportTest::testPieChartWallLineStyle()
816 {
817     load("/chart2/qa/extras/data/odt/", "testPieChartWallLineStyle.odt");
818     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
819     CPPUNIT_ASSERT(pXmlDoc);
820     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:ln/a:noFill");
821 }
822 
823 //The below test case tests the built in marker 'x' for Office 2010 in Line charts
824 
testFdo78290LineChartMarkerX()825 void Chart2ExportTest::testFdo78290LineChartMarkerX()
826 {
827     load("/chart2/qa/extras/data/docx/", "fdo78290_Line_Chart_Marker_x.docx");
828     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
829     CPPUNIT_ASSERT(pXmlDoc);
830     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");
831     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");
832 }
833 
834 // We can also use the built in marker 'x' in scatter chart, hence writing the test case for the same.
835 
testFdo78290ScatterChartMarkerX()836 void Chart2ExportTest::testFdo78290ScatterChartMarkerX()
837 {
838     load("/chart2/qa/extras/data/docx/", "fdo78290_Scatter_Chart_Marker_x.docx");
839     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
840     CPPUNIT_ASSERT(pXmlDoc);
841     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");
842     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");
843 }
844 
845 // Also in a combination of charts like a column chart and line chart, we can use the built in marker 'x'
846 // for the line chart too. hence put a test case for the combination chart also.
847 
testFdo78290CombinationChartMarkerX()848 void Chart2ExportTest::testFdo78290CombinationChartMarkerX()
849 {
850     load("/chart2/qa/extras/data/docx/", "fdo78290_Combination_Chart_Marker_x.docx");
851     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
852     CPPUNIT_ASSERT(pXmlDoc);
853     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");
854     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");
855 }
856 
testTdf126115IndividualMarker()857 void Chart2ExportTest::testTdf126115IndividualMarker()
858 {
859     // Check individual marker properties.
860     load("/chart2/qa/extras/data/xlsx/", "tdf126115.xlsx");
861     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
862     CPPUNIT_ASSERT(pXmlDoc);
863     // 1. series
864     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[1]/c:dPt/c:marker/c:symbol", "val", "square");
865     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[1]/c:dPt/c:marker/c:size", "val", "8");
866     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");
867     // 2. series
868     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[2]/c:dPt/c:marker/c:symbol", "val", "x");
869     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser[2]/c:dPt/c:marker/c:size", "val", "15");
870     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");
871 }
872 
testAxisNumberFormatODS()873 void Chart2ExportTest::testAxisNumberFormatODS()
874 {
875     struct
876     {
877         void check( const Reference<chart2::XChartDocument>& xChartDoc )
878         {
879             Reference<chart2::XAxis> xAxisX = getAxisFromDoc(xChartDoc, 0, 0, 0);
880             Reference<chart2::XTitled> xTitle(xAxisX, UNO_QUERY_THROW);
881             OUString aTitleText = getTitleString(xTitle);
882             CPPUNIT_ASSERT_EQUAL(OUString("Linked To Source"), aTitleText);
883 
884             sal_Int32 nNumFmt = getNumberFormatFromAxis(xAxisX);
885             sal_Int16 nType = getNumberFormatType(xChartDoc, nNumFmt);
886             CPPUNIT_ASSERT_MESSAGE("X axis should be percentage format.", (nType & util::NumberFormat::PERCENT));
887 
888             bool bNumFmtLinked = false;
889             Reference<beans::XPropertySet> xPS(xAxisX, uno::UNO_QUERY_THROW);
890             xPS->getPropertyValue("LinkNumberFormatToSource") >>= bNumFmtLinked;
891             CPPUNIT_ASSERT_MESSAGE("X axis should have its number format linked to source.", bNumFmtLinked);
892 
893             Reference<chart2::XAxis> xAxisY = getAxisFromDoc(xChartDoc, 0, 1, 0);
894             xTitle.set(xAxisY, UNO_QUERY_THROW);
895             aTitleText = getTitleString(xTitle);
896             CPPUNIT_ASSERT_EQUAL(OUString("Not Linked"), aTitleText);
897 
898             nNumFmt = getNumberFormatFromAxis(xAxisY);
899             nType = getNumberFormatType(xChartDoc, nNumFmt);
900             CPPUNIT_ASSERT_MESSAGE("Y axis should be a normal number format.", (nType & util::NumberFormat::NUMBER));
901 
902             bNumFmtLinked = true;
903             xPS.set(xAxisY, uno::UNO_QUERY_THROW);
904             xPS->getPropertyValue("LinkNumberFormatToSource") >>= bNumFmtLinked;
905             CPPUNIT_ASSERT_MESSAGE("Y axis should not have its number format linked to source.", !bNumFmtLinked);
906         }
907 
908     } aTest;
909 
910     load("/chart2/qa/extras/data/ods/", "axis-numformats-linked.ods");
911 
912     Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent);
913     aTest.check(xChartDoc);
914 
915     // Reload the document and make sure everything remains intact.
916     reload("calc8");
917     xChartDoc = getChartDocFromSheet(0, mxComponent);
918     aTest.check(xChartDoc);
919 }
920 
testAxisNumberFormatXLS()921 void Chart2ExportTest::testAxisNumberFormatXLS()
922 {
923     struct
924     {
925         void check( const Reference<chart2::XChartDocument>& xChartDoc, bool bNumFmtLinkedActual, sal_Int16 nNumFmtTypeFlag ) const
926         {
927             Reference<chart2::XAxis> xAxisY = getAxisFromDoc( xChartDoc, 0, 1, 0 );
928             bool bNumFmtLinked = false;
929             Reference<beans::XPropertySet> xPS( xAxisY, uno::UNO_QUERY_THROW );
930             xPS->getPropertyValue( "LinkNumberFormatToSource" ) >>= bNumFmtLinked;
931 
932             if ( bNumFmtLinkedActual )
933                 CPPUNIT_ASSERT_MESSAGE( "Y axis should have its number format linked to source.", bNumFmtLinked );
934             else
935             {
936                 CPPUNIT_ASSERT_MESSAGE( "Y axis should not have its number format linked to source.", !bNumFmtLinked );
937 
938                 sal_Int32 nNumFmt = getNumberFormatFromAxis( xAxisY );
939                 sal_Int16 nType = getNumberFormatType( xChartDoc, nNumFmt );
940                 if ( nNumFmtTypeFlag == util::NumberFormat::PERCENT )
941                     CPPUNIT_ASSERT_MESSAGE( "Y axis should be percentage format.", ( nType & util::NumberFormat::PERCENT ) );
942                 else
943                     CPPUNIT_ASSERT_MESSAGE( "Y axis should be number format.", ( nType & util::NumberFormat::NUMBER ) );
944             }
945         }
946 
947         void change( const Reference<chart2::XChartDocument>& xChartDoc, sal_Int16 nNumFmtTypeFlag )
948         {
949             Reference<chart2::XAxis> xAxisY = getAxisFromDoc( xChartDoc, 0, 1, 0 );
950             Reference<beans::XPropertySet> xPS( xAxisY, uno::UNO_QUERY_THROW );
951             Any aAny( false );
952             xPS->setPropertyValue( "LinkNumberFormatToSource", aAny );
953 
954             Reference<util::XNumberFormatsSupplier> xNFS( xChartDoc, uno::UNO_QUERY_THROW );
955             Reference<util::XNumberFormats> xNumberFormats = xNFS->getNumberFormats();
956             CPPUNIT_ASSERT( xNumberFormats.is() );
957             lang::Locale aLocale{ "en", "US", "" };
958             Sequence<sal_Int32> aNumFmts = xNumberFormats->queryKeys( nNumFmtTypeFlag, aLocale, false );
959             CPPUNIT_ASSERT( aNumFmts.hasElements() );
960             aAny <<= aNumFmts[0];
961             xPS->setPropertyValue( CHART_UNONAME_NUMFMT, aAny );
962         }
963 
964     } aTest;
965 
966     load( "/chart2/qa/extras/data/xls/", "axis_sourceformatting.xls" );
967 
968     Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet( 0, mxComponent );
969     aTest.check( xChartDoc, true, util::NumberFormat::PERCENT );
970 
971     aTest.change( xChartDoc, util::NumberFormat::NUMBER );
972     // Write the document(xls) with changes made close it, load it and check if changes are intact
973     reload( "MS Excel 97" );
974     xChartDoc = getChartDocFromSheet( 0, mxComponent );
975     aTest.check( xChartDoc, false, util::NumberFormat::NUMBER );
976 }
977 
testDataLabelBordersDOCX()978 void Chart2ExportTest::testDataLabelBordersDOCX()
979 {
980     struct Check
981     {
982         sal_Int32 mnIndex;
983         css::drawing::LineStyle meStyle;
984         sal_Int32 mnColor;
985     };
986 
987     struct
988     {
989         /**
990          * Chart 1 has 4 bars of which 1st and 3rd have labels with borders
991          * around them.
992          */
993         void checkObject1( const Reference<chart2::XChartDocument>& xChartDoc )
994         {
995             CPPUNIT_ASSERT(xChartDoc.is());
996 
997             Reference<chart2::XDataSeries> xDataSeries = getDataSeriesFromDoc(xChartDoc, 0);
998             CPPUNIT_ASSERT(xDataSeries.is());
999 
1000             // Check to make sure that data points 0 and 2 have local properties.
1001             Reference<beans::XPropertySet> xPropSet(xDataSeries, uno::UNO_QUERY);
1002             CPPUNIT_ASSERT(xPropSet.is());
1003 
1004             Sequence<sal_Int32> aIndices;
1005             xPropSet->getPropertyValue("AttributedDataPoints") >>= aIndices;
1006             /*
1007             CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be 2 data points with local properties.", sal_Int32(2), aIndices.getLength());
1008             CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aIndices[0]);
1009             CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aIndices[1]);
1010             */
1011 
1012             static const Check aDataPoints[] =
1013             {
1014                 { 0, css::drawing::LineStyle_SOLID, 0x00FFFF00 }, // solid yellow
1015                 { 2, css::drawing::LineStyle_SOLID, 0x00FF0000 }  // solid red
1016             };
1017 
1018             for (size_t i = 0; i < SAL_N_ELEMENTS(aDataPoints); ++i)
1019             {
1020                 xPropSet = xDataSeries->getDataPointByIndex(aDataPoints[i].mnIndex);
1021                 CPPUNIT_ASSERT(xPropSet.is());
1022 
1023                 css::drawing::LineStyle eLineStyle = css::drawing::LineStyle_NONE;
1024                 xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_STYLE) >>= eLineStyle;
1025                 CPPUNIT_ASSERT_EQUAL(aDataPoints[i].meStyle, eLineStyle);
1026 
1027                 sal_Int32 nWidth = -1;
1028                 xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_WIDTH) >>= nWidth;
1029                 CPPUNIT_ASSERT(nWidth > 0);
1030 
1031                 sal_Int32 nColor = -1;
1032                 xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_COLOR) >>= nColor;
1033                 CPPUNIT_ASSERT_EQUAL_MESSAGE("Border color is wrong.", aDataPoints[i].mnColor, nColor);
1034             }
1035         }
1036 
1037         /**
1038          * Chart 2 has all its data labels with identical borders.
1039          */
1040         void checkObject2( const Reference<chart2::XChartDocument>& xChartDoc )
1041         {
1042             CPPUNIT_ASSERT(xChartDoc.is());
1043 
1044             Reference<chart2::XDataSeries> xDataSeries = getDataSeriesFromDoc(xChartDoc, 0);
1045             CPPUNIT_ASSERT(xDataSeries.is());
1046 
1047             Reference<beans::XPropertySet> xPropSet(xDataSeries, uno::UNO_QUERY);
1048             CPPUNIT_ASSERT(xPropSet.is());
1049 
1050             css::drawing::LineStyle eLineStyle = css::drawing::LineStyle_NONE;
1051             xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_STYLE) >>= eLineStyle;
1052             CPPUNIT_ASSERT_EQUAL(css::drawing::LineStyle_SOLID, eLineStyle);
1053 
1054             sal_Int32 nWidth = -1;
1055             xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_WIDTH) >>= nWidth;
1056             CPPUNIT_ASSERT(nWidth > 0);
1057 
1058             sal_Int32 nColor = -1;
1059             xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_COLOR) >>= nColor;
1060             CPPUNIT_ASSERT_EQUAL_MESSAGE("Border color should be green.", sal_Int32(0x0000FF00), nColor);
1061         }
1062 
1063     } aTest;
1064 
1065     load("/chart2/qa/extras/data/docx/", "data-label-borders.docx");
1066 
1067     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1068 
1069     // "Automatic" chart background fill in docx should be loaded as solid white.
1070     Reference<beans::XPropertySet> xPropSet = xChartDoc->getPageBackground();
1071     CPPUNIT_ASSERT(xPropSet.is());
1072     drawing::FillStyle eStyle = xPropSet->getPropertyValue("FillStyle").get<drawing::FillStyle>();
1073     sal_Int32 nColor = xPropSet->getPropertyValue("FillColor").get<sal_Int32>();
1074     CPPUNIT_ASSERT_EQUAL_MESSAGE("'Automatic' chart background fill in docx should be loaded as solid fill.",
1075         drawing::FillStyle_SOLID, eStyle);
1076     CPPUNIT_ASSERT_EQUAL_MESSAGE("'Automatic' chart background fill in docx should be loaded as solid white.",
1077          sal_Int32(0x00FFFFFF), sal_Int32(nColor & 0x00FFFFFF)); // highest 2 bytes are transparency which we ignore here.
1078 
1079     aTest.checkObject1(xChartDoc);
1080     xChartDoc.set(getChartDocFromWriter(1), uno::UNO_QUERY);
1081     aTest.checkObject2(xChartDoc);
1082 
1083     reload("Office Open XML Text");
1084 
1085     xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY);
1086     aTest.checkObject1(xChartDoc);
1087     xChartDoc.set(getChartDocFromWriter(1), uno::UNO_QUERY);
1088     aTest.checkObject2(xChartDoc);
1089 }
1090 
testDataLabel3DChartDOCX()1091 void Chart2ExportTest::testDataLabel3DChartDOCX()
1092 {
1093     load("/chart2/qa/extras/data/docx/", "3d-bar-label.docx");
1094 
1095     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1096     CPPUNIT_ASSERT(xChartDoc.is());
1097 
1098     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1099     CPPUNIT_ASSERT(pXmlDoc);
1100 
1101     // We must not export label position attributes for 3D bar charts. The
1102     // same rule also applies to several other 3D charts, apparently.
1103     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLblPos", 0);
1104     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
1105 }
1106 
testDataLabelBarChartDOCX()1107 void Chart2ExportTest::testDataLabelBarChartDOCX()
1108 {
1109     load("/chart2/qa/extras/data/docx/", "bar-chart-labels.docx");
1110 
1111     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1112     CPPUNIT_ASSERT(xChartDoc.is());
1113 
1114     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1115     CPPUNIT_ASSERT(pXmlDoc);
1116 
1117     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLblPos", "val", "ctr");
1118     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:dLbls/c:dLblPos", "val", "inEnd");
1119     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:dLbls/c:dLblPos", "val", "inBase");
1120 }
1121 
testDataLabelClusteredBarChartDOCX()1122 void Chart2ExportTest::testDataLabelClusteredBarChartDOCX()
1123 {
1124     load("/chart2/qa/extras/data/docx/", "clustered-bar-chart-labels.docx");
1125 
1126     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1127     CPPUNIT_ASSERT(xChartDoc.is());
1128 
1129     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1130     CPPUNIT_ASSERT(pXmlDoc);
1131 
1132     // This was "t", should be one of the allowed values.
1133     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLbl[2]/c:dLblPos", "val", "outEnd");
1134 }
1135 
testDataLabelRadarChartDOCX()1136 void Chart2ExportTest::testDataLabelRadarChartDOCX()
1137 {
1138     load("/chart2/qa/extras/data/docx/", "radar-chart-labels.docx");
1139 
1140     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1141     CPPUNIT_ASSERT(xChartDoc.is());
1142 
1143     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1144     CPPUNIT_ASSERT(pXmlDoc);
1145 
1146     // We must not export label position attributes for radar charts.
1147     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:radarChart/c:ser/c:dLbls/c:dLblPos", 0);
1148     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:radarChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
1149 }
1150 
testDataLabelDoughnutChartDOCX()1151 void Chart2ExportTest::testDataLabelDoughnutChartDOCX()
1152 {
1153     load("/chart2/qa/extras/data/docx/", "doughnut-chart-labels.docx");
1154 
1155     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1156     CPPUNIT_ASSERT(xChartDoc.is());
1157 
1158     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1159     CPPUNIT_ASSERT(pXmlDoc);
1160 
1161     // We must not export label position attributes for doughnut charts.
1162     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:ser/c:dLbls/c:dLblPos", 0);
1163     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
1164 }
1165 
testDataLabelAreaChartDOCX()1166 void Chart2ExportTest::testDataLabelAreaChartDOCX()
1167 {
1168     load("/chart2/qa/extras/data/docx/", "area-chart-labels.docx");
1169 
1170     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1171     CPPUNIT_ASSERT(xChartDoc.is());
1172 
1173     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1174     CPPUNIT_ASSERT(pXmlDoc);
1175 
1176     // We must not export label position attributes for area charts.
1177     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLblPos", 0);
1178     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
1179 }
1180 
testDataLabelDefaultLineChartDOCX()1181 void Chart2ExportTest::testDataLabelDefaultLineChartDOCX()
1182 {
1183     // This file was created by Word 2007, which doesn't provide default data
1184     // label position (2010 does).  Make sure its default data label position
1185     // is RIGHT when exporting.
1186 
1187     load("/chart2/qa/extras/data/docx/", "line-chart-label-default-placement.docx");
1188 
1189     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1190     CPPUNIT_ASSERT(xChartDoc.is());
1191 
1192     reload("Office Open XML Text");
1193 
1194     xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY);
1195     Reference<chart2::XDataSeries> xDataSeries = getDataSeriesFromDoc(xChartDoc, 0);
1196     Reference<beans::XPropertySet> xPropSet(xDataSeries, uno::UNO_QUERY);
1197     CPPUNIT_ASSERT(xPropSet.is());
1198     sal_Int32 nLabelPlacement = -1;
1199     if (xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement)
1200         // This option may not be set.  Check its value only when it's set.
1201         CPPUNIT_ASSERT_EQUAL_MESSAGE("Line chart's default label placement should be 'right'.", chart::DataLabelPlacement::RIGHT, nLabelPlacement );
1202 }
1203 
testIndividualDataLabelProps()1204 void Chart2ExportTest::testIndividualDataLabelProps()
1205 {
1206     load("/chart2/qa/extras/data/xlsx/", "tdf122915.xlsx");
1207     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
1208     CPPUNIT_ASSERT(pXmlDoc);
1209     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");
1210     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");
1211     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");
1212     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");
1213 }
1214 
testChartTitlePropertiesColorFillDOCX()1215 void Chart2ExportTest::testChartTitlePropertiesColorFillDOCX()
1216 {
1217     load("/chart2/qa/extras/data/docx/", "testChartTitlePropertiesColorFill.docx");
1218     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1219     CPPUNIT_ASSERT(pXmlDoc);
1220     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000");
1221     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
1222 }
1223 
testChartTitlePropertiesGradientFillDOCX()1224 void Chart2ExportTest::testChartTitlePropertiesGradientFillDOCX()
1225 {
1226     load("/chart2/qa/extras/data/docx/", "testChartTitlePropertiesGradientFill.docx");
1227     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1228     CPPUNIT_ASSERT(pXmlDoc);
1229     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "cccccc");
1230     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "666666");
1231     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
1232 }
1233 
testChartTitlePropertiesBitmapFillDOCX()1234 void Chart2ExportTest::testChartTitlePropertiesBitmapFillDOCX()
1235 {
1236     load("/chart2/qa/extras/data/docx/", "testChartTitlePropertiesBitmapFill.docx");
1237     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1238     CPPUNIT_ASSERT(pXmlDoc);
1239     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:blipFill/a:blip", "embed", "rId1");
1240     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
1241 }
1242 
testColorGradientWithTransparancyDOCX()1243 void Chart2ExportTest::testColorGradientWithTransparancyDOCX()
1244 {
1245     // Test color gradient (two color) with gradient transparency
1246     load("/chart2/qa/extras/data/docx/", "testColorGradientWithTransparancy.docx");
1247     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
1248     CPPUNIT_ASSERT(pXmlDoc);
1249     // Test the transparency of the first color
1250     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");
1251     // Test the transparency of the second color
1252     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");
1253 }
1254 
testColorGradientWithTransparancyODS()1255 void Chart2ExportTest::testColorGradientWithTransparancyODS()
1256 {
1257     // Test color gradient (two color) with simple transparency
1258     load("/chart2/qa/extras/data/ods/", "testColorGradientWithTransparancy.ods");
1259     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1260     CPPUNIT_ASSERT(pXmlDoc);
1261     // Test the transparency of the first color
1262     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");
1263     // Test the transparency of the second color
1264     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");
1265 }
1266 
testColorGradientStopXLSX()1267 void Chart2ExportTest::testColorGradientStopXLSX()
1268 {
1269     // Test color gradient (two color) stop of the first color
1270     load("/chart2/qa/extras/data/xlsx/", "tdf128619.xlsx");
1271     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1272     CPPUNIT_ASSERT(pXmlDoc);
1273     // Test the position of the first color
1274     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[1]", "pos", "45000");
1275     // Test the position of the second color
1276     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[2]", "pos", "100000");
1277 }
1278 
testBarChartDataPointPropDOCX()1279 void Chart2ExportTest::testBarChartDataPointPropDOCX()
1280 {
1281     load("/chart2/qa/extras/data/docx/", "testBarChartDataPointPropDOCX.docx");
1282     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
1283     CPPUNIT_ASSERT(pXmlDoc);
1284 
1285     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0");
1286 
1287     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:idx", "val", "1");
1288     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");
1289     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");
1290     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");
1291 
1292     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:idx", "val", "2");
1293     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000");
1294     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");
1295 }
1296 
testBarChartRotation()1297 void Chart2ExportTest::testBarChartRotation()
1298 {
1299     load ("/chart2/qa/extras/data/docx/", "barChartRotation.docx");
1300     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1301     CPPUNIT_ASSERT(pXmlDoc);
1302 
1303     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotX", "val", "30");
1304     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotY", "val", "50");
1305 }
1306 
testShapeFollowedByChart()1307 void Chart2ExportTest::testShapeFollowedByChart()
1308 {
1309     /* If there is a scenario where a chart is followed by a shape
1310        which is being exported as an alternate content then, the
1311        docPr Id is being repeated, ECMA 20.4.2.5 says that the
1312        docPr Id should be unique, ensuring the same here.
1313     */
1314     load("/chart2/qa/extras/data/docx/", "FDO74430.docx");
1315     xmlDocPtr pXmlDoc = parseExport("word/document", "Office Open XML Text" );
1316     CPPUNIT_ASSERT(pXmlDoc);
1317 
1318     OUString aValueOfFirstDocPR = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/w:drawing[1]/wp:inline[1]/wp:docPr[1]", "id");
1319     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");
1320 
1321     CPPUNIT_ASSERT( aValueOfFirstDocPR != aValueOfSecondDocPR );
1322 }
1323 
testPieChartDataLabels()1324 void Chart2ExportTest::testPieChartDataLabels()
1325 {
1326     load("/chart2/qa/extras/data/docx/", "PieChartDataLabels.docx");
1327     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
1328     CPPUNIT_ASSERT(pXmlDoc);
1329     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pie3DChart/c:ser[1]/c:dLbls/c:dLbl[1]/c:dLblPos", "val", "bestFit");
1330 }
1331 
testSeriesIdxOrder()1332 void Chart2ExportTest::testSeriesIdxOrder()
1333 {
1334     load("/chart2/qa/extras/data/docx/", "testSeriesIdxOrder.docx");
1335     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
1336     CPPUNIT_ASSERT(pXmlDoc);
1337     assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:idx[1]", "val", "1");
1338     assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:order[1]", "val", "1");
1339 }
1340 
testScatterPlotLabels()1341 void Chart2ExportTest::testScatterPlotLabels()
1342 {
1343     load("/chart2/qa/extras/data/odt/", "scatter-plot-labels.odt");
1344     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
1345     CPPUNIT_ASSERT(xChartDoc.is());
1346 
1347     Reference<chart2::XChartType> xCT = getChartTypeFromDoc(xChartDoc, 0);
1348     CPPUNIT_ASSERT(xCT.is());
1349 
1350     // Make sure the original chart has 'a', 'b', 'c' as its data labels.
1351     std::vector<uno::Sequence<uno::Any> > aLabels = getDataSeriesLabelsFromChartType(xCT);
1352     CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size());
1353     CPPUNIT_ASSERT_EQUAL(OUString("a"), aLabels[0][0].get<OUString>());
1354     CPPUNIT_ASSERT_EQUAL(OUString("b"), aLabels[1][0].get<OUString>());
1355     CPPUNIT_ASSERT_EQUAL(OUString("c"), aLabels[2][0].get<OUString>());
1356 
1357     // Reload the doc and check again.  The labels should not change.
1358     reload("writer8");
1359 
1360     xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY);
1361     CPPUNIT_ASSERT(xChartDoc.is());
1362 
1363     xCT = getChartTypeFromDoc(xChartDoc, 0);
1364     CPPUNIT_ASSERT(xCT.is());
1365 
1366     aLabels = getDataSeriesLabelsFromChartType(xCT);
1367     CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size());
1368     CPPUNIT_ASSERT_EQUAL(OUString("a"), aLabels[0][0].get<OUString>());
1369     CPPUNIT_ASSERT_EQUAL(OUString("b"), aLabels[1][0].get<OUString>());
1370     CPPUNIT_ASSERT_EQUAL(OUString("c"), aLabels[2][0].get<OUString>());
1371 }
1372 
testErrorBarDataRangeODS()1373 void Chart2ExportTest::testErrorBarDataRangeODS()
1374 {
1375     load("/chart2/qa/extras/data/ods/", "ErrorBarRange.ods");
1376     reload("calc8");
1377 
1378     uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
1379     CPPUNIT_ASSERT(xChartDoc.is());
1380 
1381     Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
1382     CPPUNIT_ASSERT( xDataSeries.is() );
1383 
1384     Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW );
1385 
1386     // test that y error bars are there
1387     Reference< beans::XPropertySet > xErrorBarYProps;
1388     xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps;
1389     uno::Any aAny = xErrorBarYProps->getPropertyValue("ErrorBarRangePositive");
1390     CPPUNIT_ASSERT(aAny.hasValue());
1391     OUString aPosRange;
1392     aAny >>= aPosRange;
1393     CPPUNIT_ASSERT_EQUAL(OUString("$Sheet1.$B$1:$B$3"), aPosRange);
1394 
1395     aAny = xErrorBarYProps->getPropertyValue("ErrorBarRangeNegative");
1396     CPPUNIT_ASSERT(aAny.hasValue());
1397     OUString aNegRange;
1398     aAny >>= aNegRange;
1399     CPPUNIT_ASSERT_EQUAL(OUString("$Sheet1.$C$1:$C$3"), aNegRange);
1400 }
1401 
testChartCrash()1402 void Chart2ExportTest::testChartCrash()
1403 {
1404     load("/chart2/qa/extras/data/docx/", "FDO75975.docx");
1405     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
1406     CPPUNIT_ASSERT(pXmlDoc);
1407 }
1408 
testPieChartRotation()1409 void Chart2ExportTest::testPieChartRotation()
1410 {
1411     load ("/chart2/qa/extras/data/docx/", "pieChartRotation.docx");
1412     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1413     CPPUNIT_ASSERT(pXmlDoc);
1414     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotX", "val", "40");
1415     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotY", "val", "30");
1416 }
1417 
testEmbeddingsOleObjectGrabBag()1418 void Chart2ExportTest::testEmbeddingsOleObjectGrabBag()
1419 {
1420    // The problem was that .bin files were missing from docx file from embeddings folder
1421    // after saving file.
1422    // This test case tests whether embeddings files grabbagged properly in correct object.
1423 
1424    load("/chart2/qa/extras/data/docx/", "testchartoleobjectembeddings.docx" );
1425    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
1426    uno::Reference<beans::XPropertySet> xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY);
1427    uno::Sequence<beans::PropertyValue> aGrabBag(0);
1428    xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
1429    CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty
1430    bool bEmbeddings = false;
1431    const char* const testEmbeddedFileNames[] = {"word/embeddings/oleObject1.bin"};
1432    for(int i = 0; i < aGrabBag.getLength(); ++i)
1433    {
1434        if (aGrabBag[i].Name == "OOXEmbeddings")
1435        {
1436            bEmbeddings = true;
1437            uno::Sequence<beans::PropertyValue> aEmbeddingsList(0);
1438            uno::Reference<io::XInputStream> aEmbeddingXlsxStream;
1439            OUString aEmbeddedfileName;
1440            CPPUNIT_ASSERT(aGrabBag[i].Value >>= aEmbeddingsList); // PropertyValue of proper type
1441            sal_Int32 length = aEmbeddingsList.getLength();
1442            CPPUNIT_ASSERT_EQUAL(sal_Int32(1), length);
1443            for(int j = 0; j < length; ++j)
1444            {
1445                aEmbeddingsList[j].Value >>= aEmbeddingXlsxStream;
1446                aEmbeddedfileName = aEmbeddingsList[j].Name;
1447                CPPUNIT_ASSERT(aEmbeddingXlsxStream.get()); // Reference not empty
1448                CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(testEmbeddedFileNames[j]),aEmbeddedfileName);
1449            }
1450        }
1451    }
1452    CPPUNIT_ASSERT(bEmbeddings); // Grab Bag has all the expected elements
1453 }
1454 
1455 namespace {
1456 
checkGapWidth(Reference<beans::XPropertySet> const & xPropSet,sal_Int32 nValue)1457 void checkGapWidth(Reference<beans::XPropertySet> const & xPropSet, sal_Int32 nValue)
1458 {
1459     uno::Any aAny = xPropSet->getPropertyValue("GapwidthSequence");
1460     CPPUNIT_ASSERT(aAny.hasValue());
1461     uno::Sequence< sal_Int32 > aSequence;
1462     aAny >>= aSequence;
1463     CPPUNIT_ASSERT(aSequence.hasElements());
1464     CPPUNIT_ASSERT_EQUAL(nValue, aSequence[0]);
1465 }
1466 
checkOverlap(Reference<beans::XPropertySet> const & xPropSet,sal_Int32 nValue)1467 void checkOverlap(Reference<beans::XPropertySet> const & xPropSet, sal_Int32 nValue)
1468 {
1469     uno::Any aAny = xPropSet->getPropertyValue("OverlapSequence");
1470     CPPUNIT_ASSERT(aAny.hasValue());
1471     uno::Sequence< sal_Int32 > aSequence;
1472     aAny >>= aSequence;
1473     CPPUNIT_ASSERT(aSequence.hasElements());
1474     CPPUNIT_ASSERT_EQUAL(nValue, aSequence[0]);
1475 }
1476 
checkSheetForGapWidthAndOverlap(uno::Reference<chart2::XChartDocument> const & xChartDoc,sal_Int32 nExpectedGapWidth,sal_Int32 nExpectedOverlap)1477 void checkSheetForGapWidthAndOverlap(uno::Reference< chart2::XChartDocument > const & xChartDoc,
1478         sal_Int32 nExpectedGapWidth, sal_Int32 nExpectedOverlap)
1479 {
1480     CPPUNIT_ASSERT(xChartDoc.is());
1481 
1482     Reference< chart2::XChartType > xChartType = getChartTypeFromDoc( xChartDoc, 0 );
1483     CPPUNIT_ASSERT(xChartType.is());
1484 
1485     Reference< beans::XPropertySet > xPropSet( xChartType, uno::UNO_QUERY_THROW );
1486     checkGapWidth(xPropSet, nExpectedGapWidth);
1487     checkOverlap(xPropSet, nExpectedOverlap);
1488 
1489 }
1490 
1491 }
1492 
testGapWidthXLSX()1493 void Chart2ExportTest::testGapWidthXLSX()
1494 {
1495     load("/chart2/qa/extras/data/xlsx/", "gapWidth.xlsx");
1496 
1497     uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
1498     checkSheetForGapWidthAndOverlap(xChartDoc, 120, -60);
1499 
1500     xChartDoc = getChartDocFromSheet( 1, mxComponent );
1501     checkSheetForGapWidthAndOverlap(xChartDoc, 50, 30);
1502 
1503     reload("Calc Office Open XML");
1504 
1505     xChartDoc = getChartDocFromSheet( 0, mxComponent );
1506     checkSheetForGapWidthAndOverlap(xChartDoc, 120, -60);
1507 
1508     xChartDoc = getChartDocFromSheet( 1, mxComponent );
1509     checkSheetForGapWidthAndOverlap(xChartDoc, 50, 30);
1510 }
1511 
testSmoothedLines()1512 void Chart2ExportTest::testSmoothedLines()
1513 {
1514     load("/chart2/qa/extras/data/ods/", "smoothedLines.ods");
1515     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1516     CPPUNIT_ASSERT(pXmlDoc);
1517     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:smooth", "val", "0");
1518 }
1519 
testLabelStringODS()1520 void Chart2ExportTest::testLabelStringODS()
1521 {
1522     load("/chart2/qa/extras/data/ods/", "labelString.ods");
1523 
1524     uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
1525     Reference< chart2::data::XDataSequence > xLabelSeq =
1526         getLabelDataSequenceFromDoc(xChartDoc);
1527     CPPUNIT_ASSERT(xLabelSeq.is());
1528 
1529     OUString aLabelString = xLabelSeq->getSourceRangeRepresentation();
1530     CPPUNIT_ASSERT_EQUAL(OUString("\"LabelName\""), aLabelString);
1531 
1532     reload("calc8");
1533 
1534     xChartDoc = getChartDocFromSheet( 0, mxComponent );
1535     xLabelSeq = getLabelDataSequenceFromDoc(xChartDoc);
1536     CPPUNIT_ASSERT(xLabelSeq.is());
1537 
1538     aLabelString = xLabelSeq->getSourceRangeRepresentation();
1539     CPPUNIT_ASSERT_EQUAL(OUString("\"LabelName\""), aLabelString);
1540 }
1541 
testFdo83058dlblPos()1542 void Chart2ExportTest::testFdo83058dlblPos()
1543 {
1544     load ("/chart2/qa/extras/data/docx/", "fdo83058_dlblPos.docx");
1545     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
1546     CPPUNIT_ASSERT(pXmlDoc);
1547     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[2]/c:dLblPos", "val", "outEnd");
1548     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[3]/c:dLblPos", "val", "outEnd");
1549     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[4]/c:dLblPos", "val", "outEnd");
1550     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[5]/c:dLblPos", "val", "outEnd");
1551 }
1552 
testAutoTitleDelXLSX()1553 void Chart2ExportTest::testAutoTitleDelXLSX()
1554 {
1555     load("/chart2/qa/extras/data/xlsx/", "autotitledel_2007.xlsx");
1556     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
1557     CPPUNIT_ASSERT(pXmlDoc);
1558     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:autoTitleDeleted", "val", "0");
1559 }
1560 
testDispBlanksAsXLSX()1561 void Chart2ExportTest::testDispBlanksAsXLSX()
1562 {
1563     load("/chart2/qa/extras/data/xlsx/", "dispBlanksAs_2007.xlsx");
1564     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
1565     CPPUNIT_ASSERT(pXmlDoc);
1566     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:dispBlanksAs", "val", "gap");
1567 }
1568 
testMarkerColorXLSX()1569 void Chart2ExportTest::testMarkerColorXLSX()
1570 {
1571     load("/chart2/qa/extras/data/xlsx/", "markerColor.xlsx");
1572     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1573     CPPUNIT_ASSERT(pXmlDoc);
1574     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:marker/c:spPr/a:solidFill/a:srgbClr", "val", "92d050");
1575 }
1576 
testRoundedCornersXLSX()1577 void Chart2ExportTest::testRoundedCornersXLSX()
1578 {
1579     load("/chart2/qa/extras/data/xlsx/", "markerColor.xlsx");
1580     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1581     CPPUNIT_ASSERT(pXmlDoc);
1582     assertXPath(pXmlDoc, "/c:chartSpace/c:roundedCorners", "val", "0");
1583 }
1584 
testAxisNumberFormatXLSX()1585 void Chart2ExportTest::testAxisNumberFormatXLSX()
1586 {
1587     load("/chart2/qa/extras/data/ods/", "axis_number_format.ods");
1588     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1589     CPPUNIT_ASSERT(pXmlDoc);
1590     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 2);
1591     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "formatCode", "0.00E+000");
1592     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "sourceLinked", "0");
1593 
1594     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "formatCode", "[$$-409]#,##0;\\-[$$-409]#,##0");
1595     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "sourceLinked", "1");
1596 }
1597 
testDataPointLabelNumberFormatXLSX()1598 void Chart2ExportTest::testDataPointLabelNumberFormatXLSX()
1599 {
1600     load("/chart2/qa/extras/data/ods/", "tdf123774.ods");
1601     {
1602         xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1603         CPPUNIT_ASSERT(pXmlDoc);
1604         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:numFmt", "formatCode", "[$-40E]0.00%");
1605         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:numFmt", "sourceLinked", "0");
1606 
1607         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[1]/c:numFmt", "formatCode", "[$-40E]0.00%");
1608         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[1]/c:numFmt", "sourceLinked", "0");
1609     }
1610 
1611     load("/chart2/qa/extras/data/xlsx/", "tdf130986.xlsx");
1612     {
1613         xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1614         CPPUNIT_ASSERT(pXmlDoc);
1615         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl/c:idx", "val", "1");
1616         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl/c:numFmt", "formatCode", "0.00E+00");
1617         assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl/c:numFmt", "sourceLinked", "0");
1618     }
1619 }
1620 
testDataLabelDefaultValuesXLSX()1621 void Chart2ExportTest::testDataLabelDefaultValuesXLSX()
1622 {
1623     load("/chart2/qa/extras/data/xlsx/", "data_label.xlsx");
1624     Reference< chart2::XChartDocument> xDoc = getChartDocFromSheet(0, mxComponent);
1625     Reference<chart2::XDataSeries> xSeries = getDataSeriesFromDoc(xDoc, 0);
1626     Reference<beans::XPropertySet> xPropSet(xSeries, uno::UNO_QUERY_THROW);
1627     uno::Any aAny = xPropSet->getPropertyValue("Label");
1628     chart2::DataPointLabel aLabel;
1629     CPPUNIT_ASSERT(aAny >>= aLabel);
1630     CPPUNIT_ASSERT(aLabel.ShowNumber);
1631 
1632     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1633     CPPUNIT_ASSERT(pXmlDoc);
1634     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:showVal", "val", "1");
1635     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLblPos", "val", "outEnd");
1636 }
1637 
testTitleOverlayXLSX()1638 void Chart2ExportTest::testTitleOverlayXLSX()
1639 {
1640     load("/chart2/qa/extras/data/xlsx/", "chart_title.xlsx");
1641     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1642     CPPUNIT_ASSERT(pXmlDoc);
1643     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:overlay", "val", "0");
1644 }
1645 
testInvertIfNegativeXLSX()1646 void Chart2ExportTest::testInvertIfNegativeXLSX()
1647 {
1648     load("/chart2/qa/extras/data/xlsx/", "bar_chart_simple.xlsx");
1649     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1650     CPPUNIT_ASSERT(pXmlDoc);
1651     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:invertIfNegative", "val", "0");
1652 }
1653 
testBubble3DXLSX()1654 void Chart2ExportTest::testBubble3DXLSX()
1655 {
1656     load("/chart2/qa/extras/data/xlsx/", "bubble_chart_simple.xlsx");
1657     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1658     CPPUNIT_ASSERT(pXmlDoc);
1659     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:ser[1]/c:bubble3D", "val", "0");
1660     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:ser[2]/c:bubble3D", "val", "0");
1661     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:ser[3]/c:bubble3D", "val", "0");
1662 }
1663 
testNoMarkerXLSX()1664 void Chart2ExportTest::testNoMarkerXLSX()
1665 {
1666     load("/chart2/qa/extras/data/xlsx/", "no_marker.xlsx");
1667     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1668     CPPUNIT_ASSERT(pXmlDoc);
1669     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:marker/c:symbol", "val", "none");
1670     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[2]/c:marker/c:symbol", "val", "none");
1671     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:marker", "val", "0");
1672 }
1673 
testTitleManualLayoutXLSX()1674 void Chart2ExportTest::testTitleManualLayoutXLSX()
1675 {
1676     load("/chart2/qa/extras/data/xlsx/", "title_manual_layout.xlsx");
1677     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1678     CPPUNIT_ASSERT(pXmlDoc);
1679     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:layoutTarget", 0);
1680     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:xMode", "val", "edge");
1681     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:yMode", "val", "edge");
1682 
1683     OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:x", "val");
1684     double nX = aXVal.toDouble();
1685     CPPUNIT_ASSERT(nX > 0 && nX < 1);
1686 
1687     OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:y", "val");
1688     double nY = aYVal.toDouble();
1689     CPPUNIT_ASSERT(nY > 0 && nY < 1);
1690     CPPUNIT_ASSERT(nX != nY);
1691 
1692     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:bodyPr", "rot", "1200000");
1693 }
1694 
testPlotAreaManualLayoutXLSX()1695 void Chart2ExportTest::testPlotAreaManualLayoutXLSX()
1696 {
1697     load("/chart2/qa/extras/data/xlsx/", "plot_area_manual_layout.xlsx");
1698     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1699     CPPUNIT_ASSERT(pXmlDoc);
1700 
1701     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", "val", "inner");
1702     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:xMode", "val", "edge");
1703     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:yMode", "val", "edge");
1704 
1705     OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:x", "val");
1706     double nX = aXVal.toDouble();
1707     CPPUNIT_ASSERT(nX > 0 && nX < 1);
1708 
1709     OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:y", "val");
1710     double nY = aYVal.toDouble();
1711     CPPUNIT_ASSERT(nY > 0 && nY < 1);
1712     CPPUNIT_ASSERT(nX != nY);
1713 
1714     OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:w", "val");
1715     double nW = aWVal.toDouble();
1716     CPPUNIT_ASSERT(nW > 0 && nW < 1);
1717 
1718     OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:h", "val");
1719     double nH = aHVal.toDouble();
1720     CPPUNIT_ASSERT(nH > 0 && nH < 1);
1721     CPPUNIT_ASSERT(nH != nW);
1722 }
1723 
testLegendManualLayoutXLSX()1724 void Chart2ExportTest::testLegendManualLayoutXLSX()
1725 {
1726     load("/chart2/qa/extras/data/xlsx/", "legend_manual_layout.xlsx");
1727     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1728     CPPUNIT_ASSERT(pXmlDoc);
1729 
1730     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", 0);
1731     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:xMode", "val", "edge");
1732     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:yMode", "val", "edge");
1733 
1734     OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:x", "val");
1735     double nX = aXVal.toDouble();
1736     CPPUNIT_ASSERT(nX > 0 && nX < 1);
1737 
1738     OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:y", "val");
1739     double nY = aYVal.toDouble();
1740     CPPUNIT_ASSERT(nY > 0 && nY < 1);
1741     CPPUNIT_ASSERT(nX != nY);
1742 
1743     OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:w", "val");
1744     double nW = aWVal.toDouble();
1745     CPPUNIT_ASSERT(nW > 0 && nW < 1);
1746 
1747     OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:h", "val");
1748     double nH = aHVal.toDouble();
1749     CPPUNIT_ASSERT(nH > 0 && nH < 1);
1750     CPPUNIT_ASSERT(nH != nW);
1751 
1752     // Make sure that default text font size is preserved after export
1753     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900");
1754 }
1755 
testChartSubTitle()1756 void Chart2ExportTest::testChartSubTitle()
1757 {
1758     load("/chart2/qa/extras/data/ods/", "testChartSubTitle.ods");
1759     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1760     CPPUNIT_ASSERT(pXmlDoc);
1761     // test properties of subtitle
1762     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "1100");
1763     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "1");
1764     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "00a933");
1765     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr/a:latin", "typeface", "Times New Roman");
1766     assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t", "It is a Subtitle");
1767     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "b2b2b2");
1768 }
1769 
testChartMainWithSubTitle()1770 void Chart2ExportTest::testChartMainWithSubTitle()
1771 {
1772     load("/chart2/qa/extras/data/ods/", "testChartMainWithSubTitle.ods");
1773     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1774     CPPUNIT_ASSERT(pXmlDoc);
1775     // test properties of title
1776     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "1300");
1777     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "0");
1778     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "i", "1");
1779     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "f10d0c");
1780     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr/a:latin", "typeface", "Arial");
1781     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");
1782     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "81d41a");
1783 }
1784 
testAutoTitleDeleted()1785 void Chart2ExportTest::testAutoTitleDeleted()
1786 {
1787     load("/chart2/qa/extras/data/xlsx/", "testAutoTitleDeleted.xlsx");
1788     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1789     CPPUNIT_ASSERT(pXmlDoc);
1790     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:autoTitleDeleted", "val", "1");
1791 }
1792 
testChartTitlePropertiesColorFillXLSX()1793 void Chart2ExportTest::testChartTitlePropertiesColorFillXLSX()
1794 {
1795     load("/chart2/qa/extras/data/xlsx/", "testChartTitlePropertiesColorFill.xlsx");
1796     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1797     CPPUNIT_ASSERT(pXmlDoc);
1798     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000");
1799     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
1800 }
1801 
testChartTitlePropertiesGradientFillXLSX()1802 void Chart2ExportTest::testChartTitlePropertiesGradientFillXLSX()
1803 {
1804     load("/chart2/qa/extras/data/xlsx/", "testChartTitlePropertiesGradientFill.xlsx");
1805     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1806     CPPUNIT_ASSERT(pXmlDoc);
1807     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "cccccc");
1808     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "666666");
1809     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
1810 }
1811 
testChartTitlePropertiesBitmapFillXLSX()1812 void Chart2ExportTest::testChartTitlePropertiesBitmapFillXLSX()
1813 {
1814     load("/chart2/qa/extras/data/xlsx/", "testChartTitlePropertiesBitmapFill.xlsx");
1815     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1816     CPPUNIT_ASSERT(pXmlDoc);
1817     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:blipFill/a:blip", "embed", "rId1");
1818     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
1819 }
1820 
testBarChartDataPointPropXLSX()1821 void Chart2ExportTest::testBarChartDataPointPropXLSX()
1822 {
1823     load("/chart2/qa/extras/data/xlsx/", "testBarChartDataPointPropXLSX.xlsx");
1824     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1825     CPPUNIT_ASSERT(pXmlDoc);
1826 
1827     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0");
1828 
1829     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:idx", "val", "1");
1830     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[1]/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000");
1831     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");
1832 
1833     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dPt[2]/c:idx", "val", "2");
1834     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");
1835     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");
1836     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");
1837 }
1838 
testDataseriesOverlapStackedChartXLSX()1839 void Chart2ExportTest::testDataseriesOverlapStackedChartXLSX()
1840 {
1841     load("/chart2/qa/extras/data/xlsx/", "testDataseriesOverlapStackedChart.xlsx");
1842 
1843     // test the overlap value of a simple Stacked Column Chart
1844     uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
1845     checkSheetForGapWidthAndOverlap(xChartDoc, 100, 0);
1846 
1847     // test the overlap value of a Percent Stacked Bar Chart
1848     xChartDoc = getChartDocFromSheet( 1, mxComponent );
1849     checkSheetForGapWidthAndOverlap(xChartDoc, 100, 35);
1850 
1851     reload("Calc Office Open XML");
1852 
1853     xChartDoc = getChartDocFromSheet( 0, mxComponent );
1854     checkSheetForGapWidthAndOverlap(xChartDoc, 100, 100);
1855 
1856     xChartDoc = getChartDocFromSheet( 1, mxComponent );
1857     checkSheetForGapWidthAndOverlap(xChartDoc, 100, 100);
1858 }
1859 
testAxisCharacterPropertiesXLSX()1860 void Chart2ExportTest::testAxisCharacterPropertiesXLSX()
1861 {
1862     load("/chart2/qa/extras/data/xlsx/", "axis_character_properties.xlsx");
1863     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1864     CPPUNIT_ASSERT(pXmlDoc);
1865 
1866     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "sz", "1000");
1867     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "b", "1");
1868     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "i", "1");
1869     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "u", "sng");
1870 
1871     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900");
1872     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "b", "1");
1873     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "strike", "sngStrike");
1874     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "ff0000");
1875 }
1876 
testTitleCharacterPropertiesXLSX()1877 void Chart2ExportTest::testTitleCharacterPropertiesXLSX()
1878 {
1879     load("/chart2/qa/extras/data/xlsx/", "title_character_properties.xlsx");
1880     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1881     CPPUNIT_ASSERT(pXmlDoc);
1882 
1883     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "2400");
1884     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "1");
1885 
1886     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr", "sz", "2400");
1887     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr", "b", "1");
1888 }
1889 
testPlotVisOnlyXLSX()1890 void Chart2ExportTest::testPlotVisOnlyXLSX()
1891 {
1892     load("/chart2/qa/extras/data/xlsx/", "hidden_cells.xlsx");
1893     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1894     CPPUNIT_ASSERT(pXmlDoc);
1895 
1896     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotVisOnly", "val", "0");
1897 }
1898 
testBarChartVaryColorsXLSX()1899 void Chart2ExportTest::testBarChartVaryColorsXLSX()
1900 {
1901     load("/chart2/qa/extras/data/xlsx/", "tdf90876.xlsx");
1902     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1903     CPPUNIT_ASSERT(pXmlDoc);
1904 
1905     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0");
1906 }
1907 
testMultipleAxisXLSX()1908 void Chart2ExportTest::testMultipleAxisXLSX()
1909 {
1910     load("/chart2/qa/extras/data/ods/", "multiple_axis.ods");
1911     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1912     CPPUNIT_ASSERT(pXmlDoc);
1913 
1914     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart", 2);
1915     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart[1]/c:ser", 1);
1916     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart[2]/c:ser", 1);
1917     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 4);
1918     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:delete[@val='1']", 1);
1919     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:axPos[@val='l']", 1);
1920     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:axPos[@val='r']", 1);
1921 }
1922 
testSecondaryAxisXLSX()1923 void Chart2ExportTest::testSecondaryAxisXLSX()
1924 {
1925     load("/chart2/qa/extras/data/ods/", "secondary_axis.ods");
1926     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1927     CPPUNIT_ASSERT(pXmlDoc);
1928 
1929     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart", 2);
1930     // test there is just those series in the first <lineChart> tag which are attached to the primary axis
1931     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[1]/c:ser", 2);
1932     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");
1933     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");
1934     // test there is just those series in the second <lineChart> tag which are attached to the secondary axis
1935     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart[2]/c:ser", 1);
1936     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");
1937 }
1938 
testSetSeriesToSecondaryAxisXLSX()1939 void Chart2ExportTest::testSetSeriesToSecondaryAxisXLSX()
1940 {
1941     load("/chart2/qa/extras/data/xlsx/", "add_series_secondary_axis.xlsx");
1942     Reference< chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent);
1943     // Second series
1944     Reference<chart2::XDataSeries> xSeries = getDataSeriesFromDoc(xChartDoc, 1);
1945     CPPUNIT_ASSERT(xSeries.is());
1946 
1947     Reference<beans::XPropertySet> xPropSet(xSeries, uno::UNO_QUERY_THROW);
1948     sal_Int32 AxisIndex = 1;
1949     // Attach the second series to the secondary axis. (The third series is already attached.)
1950     xPropSet->setPropertyValue("AttachedAxisIndex", uno::Any(AxisIndex));
1951 
1952     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1953     CPPUNIT_ASSERT(pXmlDoc);
1954     // Check there are only two <lineChart> tag in the XML, one for the primary and one for the secondary axis.
1955     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart", 2);
1956 }
1957 
testCombinedChartSecondaryAxisXLSX()1958 void Chart2ExportTest::testCombinedChartSecondaryAxisXLSX()
1959 {
1960     // Original file was created with MS Office
1961     load("/chart2/qa/extras/data/xlsx/", "combined_chart_secondary_axis.xlsx");
1962     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1963     CPPUNIT_ASSERT(pXmlDoc);
1964     // Collect barchart axID on secondary Axis
1965     OUString XValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[1]", "val");
1966     OUString YValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[2]", "val");
1967     // Collect linechart axID on primary Axis
1968     OUString XValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[1]", "val");
1969     OUString YValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[2]", "val");
1970     // Check which c:catAx and c:valAx contain the AxisId of charttypes
1971     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[1]/c:axId", "val", XValueIdOfLinechart);
1972     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:axId", "val", YValueIdOfLinechart);
1973     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[2]/c:axId", "val", XValueIdOfBarchart);
1974     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:axId", "val", YValueIdOfBarchart);
1975 }
1976 
testCombinedChartSecondaryAxisODS()1977 void Chart2ExportTest::testCombinedChartSecondaryAxisODS()
1978 {
1979     // Original file was created with LibreOffice
1980     load("/chart2/qa/extras/data/ods/", "combined_chart_secondary_axis.ods");
1981     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
1982     CPPUNIT_ASSERT(pXmlDoc);
1983     // Collect barchart axID on secondary Axis
1984     OUString XValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[1]", "val");
1985     OUString YValueIdOfBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[2]", "val");
1986     // Collect linechart axID on primary Axis
1987     OUString XValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[1]", "val");
1988     OUString YValueIdOfLinechart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[2]", "val");
1989     // Check which c:catAx and c:valAx contain the AxisId of charttypes
1990     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[1]/c:axId", "val", XValueIdOfLinechart);
1991     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:axId", "val", YValueIdOfLinechart);
1992     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[2]/c:axId", "val", XValueIdOfBarchart);
1993     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:axId", "val", YValueIdOfBarchart);
1994     // do not need CT_crosses tag if the actual axis is deleted, so we need to make sure it is not saved
1995     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx[2]/c:crosses", 0);
1996 }
1997 
testCrossBetweenXLSX()1998 void Chart2ExportTest::testCrossBetweenXLSX()
1999 {
2000     // Original file was created with MS Office
2001     load("/chart2/qa/extras/data/xlsx/", "tdf127777.xlsx");
2002     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2003     CPPUNIT_ASSERT(pXmlDoc);
2004     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:crossBetween", "val", "between");
2005 }
2006 
testCrossBetweenWithDeletedAxis()2007 void Chart2ExportTest::testCrossBetweenWithDeletedAxis()
2008 {
2009     // Original file was created with MS Office (the category axis is deleted in the file)
2010     load("/chart2/qa/extras/data/xlsx/", "tdf128633.xlsx");
2011     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2012     CPPUNIT_ASSERT(pXmlDoc);
2013     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:crossBetween", "val", "between");
2014 }
2015 
testCrossBetweenODS()2016 void Chart2ExportTest::testCrossBetweenODS()
2017 {
2018     // Original file was created with LibreOffice
2019     load("/chart2/qa/extras/data/ods/", "test_CrossBetween.ods");
2020     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2021     CPPUNIT_ASSERT(pXmlDoc);
2022     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:crossBetween", "val", "between");
2023 }
2024 
testAxisTitleRotationXLSX()2025 void Chart2ExportTest::testAxisTitleRotationXLSX()
2026 {
2027     load("/chart2/qa/extras/data/xlsx/", "axis_title_rotation.xlsx");
2028     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2029     CPPUNIT_ASSERT(pXmlDoc);
2030 
2031     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:tx/c:rich/a:bodyPr", "rot", "0");
2032 }
2033 
testAxisTitlePositionDOCX()2034 void Chart2ExportTest::testAxisTitlePositionDOCX()
2035 {
2036     load("/chart2/qa/extras/data/docx/", "testAxisTitlePosition.docx");
2037     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
2038     CPPUNIT_ASSERT(pXmlDoc);
2039 
2040     // test X Axis title position
2041     OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:title/c:layout/c:manualLayout/c:x", "val");
2042     double nX = aXVal.toDouble();
2043     CPPUNIT_ASSERT(nX > 0.698208 && nX < 0.698209);
2044     OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:title/c:layout/c:manualLayout/c:y", "val");
2045     double nY = aYVal.toDouble();
2046     CPPUNIT_ASSERT(nY > 0.805152 && nY < 0.805153);
2047 
2048     // test Y Axis title position
2049     aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:layout/c:manualLayout/c:x", "val");
2050     nX = aXVal.toDouble();
2051     CPPUNIT_ASSERT(nX > 0.025395 && nX < 0.025396);
2052     aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:layout/c:manualLayout/c:y", "val");
2053     nY = aYVal.toDouble();
2054     CPPUNIT_ASSERT(nY > 0.384407 && nY < 0.384408);
2055 }
2056 
testAxisCrossBetweenXSLX()2057 void Chart2ExportTest::testAxisCrossBetweenXSLX()
2058 {
2059     load("/chart2/qa/extras/data/odt/", "axis-position.odt");
2060     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
2061     assertXPath(pXmlDoc, "(//c:crossBetween)[1]", "val", "midCat");
2062 }
2063 
testPieChartDataPointExplosionXLSX()2064 void Chart2ExportTest::testPieChartDataPointExplosionXLSX()
2065 {
2066     load("/chart2/qa/extras/data/xlsx/", "pie_chart_datapoint_explosion.xlsx");
2067     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2068     CPPUNIT_ASSERT(pXmlDoc);
2069 
2070     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dPt/c:explosion", "val", "28");
2071 }
2072 
testCustomDataLabel()2073 void Chart2ExportTest::testCustomDataLabel()
2074 {
2075     load("/chart2/qa/extras/data/pptx/", "tdf115107.pptx");
2076     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart1", "Impress MS PowerPoint 2007 XML");
2077     CPPUNIT_ASSERT(pXmlDoc);
2078     // Check the data labels font color for the complete data series
2079     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");
2080 
2081     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY);
2082     CPPUNIT_ASSERT(xChartDoc.is());
2083 
2084     uno::Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
2085     CPPUNIT_ASSERT(xDataSeries.is());
2086     float nFontSize;
2087     sal_Int64 nFontColor;
2088     sal_Int32 nCharUnderline;
2089     uno::Reference<beans::XPropertySet> xPropertySet;
2090     uno::Sequence<uno::Reference<chart2::XDataPointCustomLabelField>> aFields;
2091 
2092     // 1
2093     xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_SET_THROW);
2094     xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
2095     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), aFields.getLength());
2096 
2097     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[0]->getFieldType());
2098     CPPUNIT_ASSERT_EQUAL(OUString("90.0 = "), aFields[0]->getString());
2099     aFields[0]->getPropertyValue("CharHeight") >>= nFontSize;
2100     aFields[0]->getPropertyValue("CharColor") >>= nFontColor;
2101     CPPUNIT_ASSERT_EQUAL(static_cast<float>(18), nFontSize);
2102     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xed7d31), nFontColor);
2103 
2104     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[1]->getFieldType());
2105     CPPUNIT_ASSERT_EQUAL(OUString("90"), aFields[1]->getString());
2106     CPPUNIT_ASSERT_EQUAL(OUString("{0C576297-5A9F-4B4E-A675-B6BA406B7D87}"), aFields[1]->getGuid());
2107 
2108     // 2
2109     xPropertySet.set(xDataSeries->getDataPointByIndex(1), uno::UNO_SET_THROW);
2110     xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
2111     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(8), aFields.getLength());
2112 
2113     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[0]->getFieldType());
2114     CPPUNIT_ASSERT_EQUAL(OUString("Text"), aFields[0]->getString());
2115 
2116     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
2117     CPPUNIT_ASSERT_EQUAL(OUString(" : "), aFields[1]->getString());
2118 
2119     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_CATEGORYNAME, aFields[2]->getFieldType());
2120     CPPUNIT_ASSERT_EQUAL(OUString("B"), aFields[2]->getString());
2121     CPPUNIT_ASSERT_EQUAL(OUString("{0CCAAACD-B393-42CE-8DBD-82F9F9ADC852}"), aFields[2]->getGuid());
2122     aFields[2]->getPropertyValue("CharHeight") >>= nFontSize;
2123     aFields[2]->getPropertyValue("CharColor") >>= nFontColor;
2124     CPPUNIT_ASSERT_EQUAL(static_cast<float>(16), nFontSize);
2125     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xed7d31), nFontColor);
2126 
2127     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_NEWLINE, aFields[3]->getFieldType());
2128 
2129     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[4]->getFieldType());
2130     CPPUNIT_ASSERT_EQUAL(OUString("Multi"), aFields[4]->getString());
2131 
2132     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[5]->getFieldType());
2133     CPPUNIT_ASSERT_EQUAL(OUString("line"), aFields[5]->getString());
2134     aFields[5]->getPropertyValue("CharHeight") >>= nFontSize;
2135     aFields[5]->getPropertyValue("CharColor") >>= nFontColor;
2136     CPPUNIT_ASSERT_EQUAL(static_cast<float>(13), nFontSize);
2137     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xbf9000), nFontColor);
2138 
2139     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_NEWLINE, aFields[6]->getFieldType());
2140 
2141     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[7]->getFieldType());
2142     CPPUNIT_ASSERT_EQUAL(OUString("Abc"), aFields[7]->getString());
2143     aFields[7]->getPropertyValue("CharHeight") >>= nFontSize;
2144     aFields[7]->getPropertyValue("CharColor") >>= nFontColor;
2145     aFields[7]->getPropertyValue("CharUnderline") >>= nCharUnderline;
2146     CPPUNIT_ASSERT_EQUAL(static_cast<float>(12), nFontSize);
2147     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xa9d18e), nFontColor);
2148     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nCharUnderline);
2149 
2150     // 3
2151     xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_SET_THROW);
2152     xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
2153     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aFields.getLength());
2154 
2155     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[0]->getFieldType());
2156     CPPUNIT_ASSERT_EQUAL(OUString("DATA"), aFields[0]->getString());
2157     CPPUNIT_ASSERT_EQUAL(OUString("{C8F3EB90-8960-4F9A-A3AD-B4FAC4FE4566}"), aFields[0]->getGuid());
2158 
2159     // 4
2160     xPropertySet.set(xDataSeries->getDataPointByIndex(3), uno::UNO_SET_THROW);
2161     xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
2162     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), aFields.getLength());
2163 
2164     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_CELLREF, aFields[0]->getFieldType());
2165     //CPPUNIT_ASSERT_EQUAL(OUString("70"), aFields[0]->getString()); TODO: Not implemented yet
2166 
2167     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
2168     CPPUNIT_ASSERT_EQUAL(OUString(" <CELLREF"), aFields[1]->getString());
2169 }
2170 
testCustomDataLabelMultipleSeries()2171 void Chart2ExportTest::testCustomDataLabelMultipleSeries()
2172 {
2173     load("/chart2/qa/extras/data/pptx/", "tdf115107-2.pptx");
2174     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart2", "Impress MS PowerPoint 2007 XML");
2175     CPPUNIT_ASSERT(pXmlDoc);
2176 
2177     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY);
2178     CPPUNIT_ASSERT(xChartDoc.is());
2179 
2180     uno::Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
2181     CPPUNIT_ASSERT(xDataSeries.is());
2182     float nFontSize;
2183     sal_Int64 nFontColor;
2184     uno::Reference<beans::XPropertySet> xPropertySet;
2185     uno::Sequence<uno::Reference<chart2::XDataPointCustomLabelField>> aFields;
2186 
2187     // First series
2188     xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_SET_THROW);
2189     xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
2190     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), aFields.getLength());
2191 
2192     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[0]->getFieldType());
2193     CPPUNIT_ASSERT_EQUAL(OUString("4.3"), aFields[0]->getString());
2194     aFields[0]->getPropertyValue("CharHeight") >>= nFontSize;
2195     aFields[0]->getPropertyValue("CharColor") >>= nFontColor;
2196     CPPUNIT_ASSERT_EQUAL(static_cast<float>(18), nFontSize);
2197     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xc00000), nFontColor);
2198 
2199     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
2200     CPPUNIT_ASSERT_EQUAL(OUString(" "), aFields[1]->getString());
2201 
2202     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[2]->getFieldType());
2203     CPPUNIT_ASSERT_EQUAL(OUString("Bars"), aFields[2]->getString());
2204 
2205     // Second series
2206     xDataSeries = getDataSeriesFromDoc(xChartDoc, 0, 1);
2207     CPPUNIT_ASSERT(xDataSeries.is());
2208 
2209     xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_SET_THROW);
2210     xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
2211     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), aFields.getLength());
2212 
2213     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[0]->getFieldType());
2214     CPPUNIT_ASSERT_EQUAL(OUString("2"), aFields[0]->getString());
2215     aFields[0]->getPropertyValue("CharHeight") >>= nFontSize;
2216     aFields[0]->getPropertyValue("CharColor") >>= nFontColor;
2217     CPPUNIT_ASSERT_EQUAL(static_cast<float>(18), nFontSize);
2218     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xffd966), nFontColor);
2219 
2220     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
2221     CPPUNIT_ASSERT_EQUAL(OUString(" "), aFields[1]->getString());
2222 
2223     CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[2]->getFieldType());
2224     CPPUNIT_ASSERT_EQUAL(OUString("Line"), aFields[2]->getString());
2225 
2226 }
2227 
testNumberFormatExportPPTX()2228 void Chart2ExportTest::testNumberFormatExportPPTX()
2229 {
2230     load("/chart2/qa/extras/data/pptx/", "tdf115859.pptx");
2231     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
2232     CPPUNIT_ASSERT(pXmlDoc);
2233 
2234     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:numFmt", "formatCode", "#,##0.00,\\K");
2235     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:numFmt", "sourceLinked", "0");
2236 }
2237 
testLabelSeparatorExportDOCX()2238 void Chart2ExportTest::testLabelSeparatorExportDOCX()
2239 {
2240     load("/chart2/qa/extras/data/docx/", "testLabelSeparator.docx");
2241 
2242     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
2243     CPPUNIT_ASSERT(xChartDoc.is());
2244 
2245     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
2246     CPPUNIT_ASSERT(pXmlDoc);
2247 
2248     // The text separator should be a new line
2249     assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:separator", "\n");
2250     // The text separator should be a comma
2251     assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:dLbls/c:separator", ", ");
2252     // The text separator should be a semicolon
2253     assertXPathContent(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:dLbls/c:separator", "; ");
2254 }
2255 
testChartTitlePropertiesColorFillPPTX()2256 void Chart2ExportTest::testChartTitlePropertiesColorFillPPTX()
2257 {
2258     load("/chart2/qa/extras/data/pptx/", "testChartTitlePropertiesColorFill.pptx");
2259     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
2260     CPPUNIT_ASSERT(pXmlDoc);
2261     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:solidFill/a:srgbClr", "val", "ff0000");
2262     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
2263 }
2264 
testChartTitlePropertiesGradientFillPPTX()2265 void Chart2ExportTest::testChartTitlePropertiesGradientFillPPTX()
2266 {
2267     load("/chart2/qa/extras/data/pptx/", "testChartTitlePropertiesGradientFill.pptx");
2268     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
2269     CPPUNIT_ASSERT(pXmlDoc);
2270     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "f6f8fc");
2271     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr", "val", "c7d5ed");
2272     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
2273 }
2274 
testChartTitlePropertiesBitmapFillPPTX()2275 void Chart2ExportTest::testChartTitlePropertiesBitmapFillPPTX()
2276 {
2277     load("/chart2/qa/extras/data/pptx/", "testChartTitlePropertiesBitmapFill.pptx");
2278     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
2279     CPPUNIT_ASSERT(pXmlDoc);
2280     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:blipFill/a:blip", "embed", "rId1");
2281     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 1);
2282 }
2283 
testxAxisLabelsRotation()2284 void Chart2ExportTest::testxAxisLabelsRotation()
2285 {
2286     load ("/chart2/qa/extras/data/xlsx/", "xAxisLabelsRotation.xlsx");
2287     xmlDocPtr pXmlDoc1 = parseExport("xl/charts/chart","Calc Office Open XML");
2288     CPPUNIT_ASSERT(pXmlDoc1);
2289 
2290     // Chart1 xAxis labels should be 45 degree
2291     assertXPath(pXmlDoc1, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:bodyPr", "rot", "2700000");
2292 }
2293 
testMultipleCategoryAxisLablesXLSX()2294 void Chart2ExportTest::testMultipleCategoryAxisLablesXLSX()
2295 {
2296     load("/chart2/qa/extras/data/ods/", "multilevelcat.ods");
2297     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2298     CPPUNIT_ASSERT(pXmlDoc);
2299     // check category axis labels number of first level
2300     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:ptCount", "val", "6");
2301     // check category axis labels text of first level
2302     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");
2303     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");
2304     // check category axis labels text of second level
2305     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");
2306     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");
2307     // check the 'noMultiLvlLbl' tag - ChartExport.cxx:2950 FIXME: seems not support, so check the default noMultiLvlLbl value.
2308     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:noMultiLvlLbl", "val", "0");
2309 }
2310 
testMultipleCategoryAxisLablesDOCX()2311 void Chart2ExportTest::testMultipleCategoryAxisLablesDOCX()
2312 {
2313     load("/chart2/qa/extras/data/odt/", "multilevelcat.odt");
2314     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
2315     CPPUNIT_ASSERT(pXmlDoc);
2316     // check category axis labels number of first level
2317     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:cat/c:multiLvlStrRef/c:multiLvlStrCache/c:ptCount", "val", "4");
2318     // check category axis labels text of first level
2319     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");
2320     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");
2321     // check category axis labels text of second level
2322     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");
2323     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");
2324     // check the 'noMultiLvlLbl' tag - ChartExport.cxx:2950 FIXME: seems not support, so check the default noMultiLvlLbl value.
2325     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:noMultiLvlLbl", "val", "0");
2326 }
2327 
testTdf116163()2328 void Chart2ExportTest::testTdf116163()
2329 {
2330     load("/chart2/qa/extras/data/pptx/", "tdf116163.pptx");
2331     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
2332     CPPUNIT_ASSERT(pXmlDoc);
2333 
2334     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:bodyPr", "rot", "-5400000");
2335 }
2336 
testTdf111824()2337 void Chart2ExportTest::testTdf111824()
2338 {
2339     load("/chart2/qa/extras/data/xlsx/", "tdf111824.xlsx");
2340     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2341     CPPUNIT_ASSERT(pXmlDoc);
2342 
2343     // Collect 3D barchart Z axID
2344     OUString zAxisIdOf3DBarchart = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:axId[3]", "val");
2345     // 3D barchart Z axis properties should be in a serAx OOXML tag instead of catAx
2346     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:serAx/c:axId", "val", zAxisIdOf3DBarchart);
2347 }
2348 
testTdf119029()2349 void Chart2ExportTest::testTdf119029()
2350 {
2351     load("/chart2/qa/extras/data/odp/", "tdf119029.odp");
2352     // Only use "chart", without number, because the number depends on the previous tests
2353     xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
2354     CPPUNIT_ASSERT(pXmlDoc);
2355 
2356     assertXPath(pXmlDoc,
2357                 "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:txPr/a:bodyPr", "rot",
2358                 "-5400000");
2359 }
2360 
testTdf108022()2361 void Chart2ExportTest::testTdf108022()
2362 {
2363     load("/chart2/qa/extras/data/odt/", "tdf108022.odt");
2364     reload("Office Open XML Text");
2365 
2366     // assert we really have two charts
2367     Reference<chart2::XChartDocument> xChartDoc1(getChartDocFromWriter(0), uno::UNO_QUERY);
2368     CPPUNIT_ASSERT(xChartDoc1.is());
2369     Reference<chart2::XChartDocument> xChartDoc2(getChartDocFromWriter(1), uno::UNO_QUERY);
2370     CPPUNIT_ASSERT(xChartDoc2.is());
2371 }
2372 
testTdf121744()2373 void Chart2ExportTest::testTdf121744()
2374 {
2375     load("/chart2/qa/extras/data/docx/", "tdf121744.docx");
2376     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
2377     CPPUNIT_ASSERT(pXmlDoc);
2378 
2379     OUString XValueId = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[1]", "val");
2380     OUString YValueId = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:axId[2]", "val");
2381 
2382     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[1]", "val", XValueId );
2383     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:axId[2]", "val", YValueId );
2384 }
2385 
testTdf122031()2386 void Chart2ExportTest::testTdf122031()
2387 {
2388     //Checks pie chart data label format.
2389 
2390     load("/chart2/qa/extras/data/xlsx/", "tdf122031.xlsx");
2391     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
2392     CPPUNIT_ASSERT(pXmlDoc);
2393 
2394     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:numFmt", "formatCode", "0.000%");
2395     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[1]/c:numFmt", "formatCode", "0.000%");
2396     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[2]/c:numFmt", "formatCode", "0.000%");
2397     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls/c:dLbl[3]/c:numFmt", "formatCode", "0.000%");
2398 }
2399 
testTdf115012()2400 void Chart2ExportTest::testTdf115012()
2401 {
2402     load("/chart2/qa/extras/data/xlsx/", "tdf115012.xlsx");
2403     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
2404     CPPUNIT_ASSERT(pXmlDoc);
2405     // workaround: use-zero instead of leave-gap to show the original line chart
2406     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:dispBlanksAs", "val", "zero");
2407 }
2408 
testTdf123206_customLabelText()2409 void Chart2ExportTest::testTdf123206_customLabelText()
2410 {
2411     load("/chart2/qa/extras/data/docx/", "tdf123206.docx");
2412 
2413     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
2414     CPPUNIT_ASSERT(xChartDoc.is());
2415 
2416     xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
2417     CPPUNIT_ASSERT(pXmlDoc);
2418 
2419     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");
2420 }
2421 
testCustomLabelText()2422 void Chart2ExportTest::testCustomLabelText()
2423 {
2424     load("/chart2/qa/extras/data/docx/", "testCustomlabeltext.docx");
2425 
2426     Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
2427     CPPUNIT_ASSERT(xChartDoc.is());
2428 
2429     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
2430     CPPUNIT_ASSERT(pXmlDoc);
2431 
2432     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[1]/c:idx", "val", "2");
2433     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");
2434     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");
2435 
2436     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLbl[2]/c:idx", "val", "3");
2437     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");
2438     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");
2439 }
2440 
testTdf131979()2441 void Chart2ExportTest::testTdf131979()
2442 {
2443     load("/chart2/qa/extras/data/ods/", "tdf131115.ods");
2444     {
2445         reload("calc8");
2446         Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent);
2447         CPPUNIT_ASSERT(xChartDoc.is());
2448         Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
2449         CPPUNIT_ASSERT(xDataSeries.is());
2450         Reference<beans::XPropertySet> xPropertySet;
2451         xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_SET_THROW);
2452         bool blinknumberformattosource = true;
2453         CPPUNIT_ASSERT(xPropertySet->getPropertyValue(CHART_UNONAME_LINK_TO_SRC_NUMFMT) >>= blinknumberformattosource);
2454         CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to false.", !blinknumberformattosource);
2455     }
2456 
2457     load("/chart2/qa/extras/data/ods/", "tdf131979.ods");
2458     {
2459         reload("calc8");
2460         Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent);
2461         CPPUNIT_ASSERT(xChartDoc.is());
2462         Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
2463         CPPUNIT_ASSERT(xDataSeries.is());
2464         Reference<beans::XPropertySet> xPropertySet;
2465         xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_SET_THROW);
2466         bool blinknumberformattosource = true;
2467         CPPUNIT_ASSERT(xPropertySet->getPropertyValue(CHART_UNONAME_LINK_TO_SRC_NUMFMT) >>= blinknumberformattosource);
2468         CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to true.", blinknumberformattosource);
2469     }
2470 }
2471 
testTdf132594()2472 void Chart2ExportTest::testTdf132594()
2473 {
2474     load("/chart2/qa/extras/data/xlsx/", "chart_pie2007.xlsx");
2475     xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
2476     CPPUNIT_ASSERT(pXmlDoc);
2477 
2478     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:cat", 1);
2479 }
2480 
2481 CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ExportTest);
2482 
2483 CPPUNIT_PLUGIN_IMPLEMENT();
2484 
2485 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
2486