Change-Id: I9b0893dfde4efc10bb05e6e17b7128b016efeb71 Reviewed-on: https://gerrit.libreoffice.org/48788 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
1739 lines
74 KiB
C++
1739 lines
74 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#include "charttest.hxx"
|
|
|
|
#include <test/xmltesttools.hxx>
|
|
|
|
#include <com/sun/star/chart/ErrorBarStyle.hpp>
|
|
#include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
|
|
#include <com/sun/star/chart2/DataPointCustomLabelField.hpp>
|
|
#include <com/sun/star/chart2/DataPointCustomLabelFieldType.hpp>
|
|
#include <com/sun/star/lang/XServiceName.hpp>
|
|
#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
|
|
#include <com/sun/star/text/XTextDocument.hpp>
|
|
#include <com/sun/star/text/XTextFramesSupplier.hpp>
|
|
#include <com/sun/star/drawing/LineStyle.hpp>
|
|
#include <com/sun/star/chart2/DataPointLabel.hpp>
|
|
|
|
#include <unotools/ucbstreamhelper.hxx>
|
|
#include <rtl/strbuf.hxx>
|
|
|
|
#include <libxml/xpathInternals.h>
|
|
#include <libxml/parserInternals.h>
|
|
|
|
#include <algorithm>
|
|
|
|
using uno::Reference;
|
|
using beans::XPropertySet;
|
|
|
|
class Chart2ExportTest : public ChartTest, public XmlTestTools
|
|
{
|
|
protected:
|
|
|
|
virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override;
|
|
public:
|
|
Chart2ExportTest() : ChartTest() {}
|
|
void testErrorBarXLSX();
|
|
void testTrendline();
|
|
void testTrendlineOOXML();
|
|
void testTrendlineXLS();
|
|
void testStockChart();
|
|
void testBarChart();
|
|
void testCrosses();
|
|
void testScatterChartTextXValues();
|
|
void testChartDataTable();
|
|
void testChartExternalData();
|
|
void testEmbeddingsGrabBag();
|
|
void testAreaChartLoad();
|
|
void testUpDownBars();
|
|
void testDoughnutChart();
|
|
void testDisplayUnits();
|
|
// void testFdo74115WallGradientFill();
|
|
void testFdo74115WallBitmapFill();
|
|
void testBarChartRotation();
|
|
void testShapeFollowedByChart();
|
|
void testPieChartDataLabels();
|
|
void testSeriesIdxOrder();
|
|
void testScatterPlotLabels();
|
|
void testErrorBarDataRangeODS();
|
|
void testChartCrash();
|
|
void testPieChartRotation();
|
|
void testEmbeddingsOleObjectGrabBag();
|
|
void testGapWidthXLSX();
|
|
void testSmoothedLines();
|
|
void testLabelStringODS();
|
|
void testFdo78290LineChartMarkerX();
|
|
void testFdo78290ScatterChartMarkerX();
|
|
void testFdo78290CombinationChartMarkerX();
|
|
void testAxisNumberFormatODS();
|
|
void testAxisNumberFormatXLS();
|
|
void testDataLabelBordersDOCX();
|
|
void testDataLabel3DChartDOCX();
|
|
void testDataLabelBarChartDOCX();
|
|
void testDataLabelClusteredBarChartDOCX();
|
|
void testDataLabelRadarChartDOCX();
|
|
void testDataLabelDoughnutChartDOCX();
|
|
void testDataLabelAreaChartDOCX();
|
|
void testDataLabelDefaultLineChartDOCX();
|
|
void testFdo83058dlblPos();
|
|
void testAutoTitleDelXLSX();
|
|
void testDispBlanksAsXLSX();
|
|
void testMarkerColorXLSX();
|
|
void testRoundedCornersXLSX();
|
|
void testAxisNumberFormatXLSX();
|
|
void testDataLabelDefaultValuesXLSX();
|
|
void testTitleOverlayXLSX();
|
|
void testInvertIfNegativeXLSX();
|
|
void testBubble3DXLSX();
|
|
void testNoMarkerXLSX();
|
|
void testTitleManualLayoutXLSX();
|
|
void testPlotAreaManualLayoutXLSX();
|
|
void testLegendManualLayoutXLSX();
|
|
void testAxisCharacterPropertiesXLSX();
|
|
void testTitleCharacterPropertiesXLSX();
|
|
void testPlotVisOnlyXLSX();
|
|
void testBarChartVaryColorsXLSX();
|
|
void testMultipleAxisXLSX();
|
|
void testAxisTitleRotationXLSX();
|
|
void testAxisCrossBetweenXSLX();
|
|
void testPieChartDataPointExplosionXLSX();
|
|
void testCustomDataLabel();
|
|
void testCustomDataLabelMultipleSeries();
|
|
|
|
CPPUNIT_TEST_SUITE(Chart2ExportTest);
|
|
CPPUNIT_TEST(testErrorBarXLSX);
|
|
CPPUNIT_TEST(testTrendline);
|
|
CPPUNIT_TEST(testTrendlineOOXML);
|
|
CPPUNIT_TEST(testTrendlineXLS);
|
|
CPPUNIT_TEST(testStockChart);
|
|
CPPUNIT_TEST(testBarChart);
|
|
CPPUNIT_TEST(testCrosses);
|
|
CPPUNIT_TEST(testScatterChartTextXValues);
|
|
CPPUNIT_TEST(testChartDataTable);
|
|
CPPUNIT_TEST(testChartExternalData);
|
|
CPPUNIT_TEST(testEmbeddingsGrabBag);
|
|
CPPUNIT_TEST(testAreaChartLoad);
|
|
CPPUNIT_TEST(testUpDownBars);
|
|
CPPUNIT_TEST(testDoughnutChart);
|
|
CPPUNIT_TEST(testDisplayUnits);
|
|
// CPPUNIT_TEST(testFdo74115WallGradientFill);
|
|
CPPUNIT_TEST(testFdo74115WallBitmapFill);
|
|
CPPUNIT_TEST(testBarChartRotation);
|
|
CPPUNIT_TEST(testShapeFollowedByChart);
|
|
CPPUNIT_TEST(testPieChartDataLabels);
|
|
CPPUNIT_TEST(testSeriesIdxOrder);
|
|
CPPUNIT_TEST(testScatterPlotLabels);
|
|
CPPUNIT_TEST(testErrorBarDataRangeODS);
|
|
CPPUNIT_TEST(testChartCrash);
|
|
CPPUNIT_TEST(testPieChartRotation);
|
|
CPPUNIT_TEST(testEmbeddingsOleObjectGrabBag);
|
|
CPPUNIT_TEST(testGapWidthXLSX);
|
|
CPPUNIT_TEST(testSmoothedLines);
|
|
CPPUNIT_TEST(testLabelStringODS);
|
|
CPPUNIT_TEST(testFdo78290LineChartMarkerX);
|
|
CPPUNIT_TEST(testFdo78290ScatterChartMarkerX);
|
|
CPPUNIT_TEST(testFdo78290CombinationChartMarkerX);
|
|
CPPUNIT_TEST(testAxisNumberFormatODS);
|
|
CPPUNIT_TEST(testAxisNumberFormatXLS);
|
|
CPPUNIT_TEST(testDataLabelBordersDOCX);
|
|
CPPUNIT_TEST(testDataLabel3DChartDOCX);
|
|
CPPUNIT_TEST(testDataLabelBarChartDOCX);
|
|
CPPUNIT_TEST(testDataLabelClusteredBarChartDOCX);
|
|
CPPUNIT_TEST(testDataLabelRadarChartDOCX);
|
|
CPPUNIT_TEST(testDataLabelDoughnutChartDOCX);
|
|
CPPUNIT_TEST(testDataLabelAreaChartDOCX);
|
|
CPPUNIT_TEST(testDataLabelDefaultLineChartDOCX);
|
|
CPPUNIT_TEST(testFdo83058dlblPos);
|
|
CPPUNIT_TEST(testAutoTitleDelXLSX);
|
|
CPPUNIT_TEST(testDispBlanksAsXLSX);
|
|
CPPUNIT_TEST(testMarkerColorXLSX);
|
|
CPPUNIT_TEST(testRoundedCornersXLSX);
|
|
CPPUNIT_TEST(testAxisNumberFormatXLSX);
|
|
CPPUNIT_TEST(testDataLabelDefaultValuesXLSX);
|
|
CPPUNIT_TEST(testTitleOverlayXLSX);
|
|
CPPUNIT_TEST(testInvertIfNegativeXLSX);
|
|
CPPUNIT_TEST(testBubble3DXLSX);
|
|
CPPUNIT_TEST(testNoMarkerXLSX);
|
|
CPPUNIT_TEST(testTitleManualLayoutXLSX);
|
|
CPPUNIT_TEST(testPlotAreaManualLayoutXLSX);
|
|
CPPUNIT_TEST(testLegendManualLayoutXLSX);
|
|
CPPUNIT_TEST(testAxisCharacterPropertiesXLSX);
|
|
CPPUNIT_TEST(testTitleCharacterPropertiesXLSX);
|
|
CPPUNIT_TEST(testPlotVisOnlyXLSX);
|
|
CPPUNIT_TEST(testBarChartVaryColorsXLSX);
|
|
CPPUNIT_TEST(testMultipleAxisXLSX);
|
|
CPPUNIT_TEST(testAxisTitleRotationXLSX);
|
|
CPPUNIT_TEST(testAxisCrossBetweenXSLX);
|
|
CPPUNIT_TEST(testPieChartDataPointExplosionXLSX);
|
|
CPPUNIT_TEST(testCustomDataLabel);
|
|
CPPUNIT_TEST(testCustomDataLabelMultipleSeries);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
protected:
|
|
/**
|
|
* Given that some problem doesn't affect the result in the importer, we
|
|
* test the resulting file directly, by opening the zip file, parsing an
|
|
* xml stream, and asserting an XPath expression. This method returns the
|
|
* xml stream, so that you can do the asserting.
|
|
*/
|
|
xmlDocPtr parseExport(const OUString& rDir, const OUString& rFilterFormat);
|
|
|
|
};
|
|
|
|
namespace {
|
|
|
|
struct CheckForChartName
|
|
{
|
|
private:
|
|
OUString aDir;
|
|
|
|
public:
|
|
explicit CheckForChartName( const OUString& rDir ):
|
|
aDir(rDir) {}
|
|
|
|
bool operator()(const OUString& rName)
|
|
{
|
|
if(!rName.startsWith(aDir))
|
|
return false;
|
|
|
|
if(!rName.endsWith(".xml"))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
OUString findChartFile(const OUString& rDir, uno::Reference< container::XNameAccess > const & xNames )
|
|
{
|
|
uno::Sequence<OUString> aNames = xNames->getElementNames();
|
|
OUString* pElement = std::find_if(aNames.begin(), aNames.end(), CheckForChartName(rDir));
|
|
|
|
CPPUNIT_ASSERT(pElement != aNames.end());
|
|
return *pElement;
|
|
}
|
|
|
|
}
|
|
|
|
xmlDocPtr Chart2ExportTest::parseExport(const OUString& rDir, const OUString& rFilterFormat)
|
|
{
|
|
std::shared_ptr<utl::TempFile> pTempFile = save(rFilterFormat);
|
|
|
|
// Read the XML stream we're interested in.
|
|
uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), pTempFile->GetURL());
|
|
uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName(findChartFile(rDir, xNameAccess)), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xInputStream.is());
|
|
std::shared_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
|
|
|
|
return parseXmlStream(pStream.get());
|
|
}
|
|
|
|
void Chart2ExportTest::registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx)
|
|
{
|
|
struct { char const * pPrefix; char const * pURI; } aNamespaces[] =
|
|
{
|
|
{ "w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main" },
|
|
{ "v", "urn:schemas-microsoft-com:vml" },
|
|
{ "c", "http://schemas.openxmlformats.org/drawingml/2006/chart" },
|
|
{ "a", "http://schemas.openxmlformats.org/drawingml/2006/main" },
|
|
{ "mc", "http://schemas.openxmlformats.org/markup-compatibility/2006" },
|
|
{ "wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape" },
|
|
{ "wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" },
|
|
{ "wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" },
|
|
{ "office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" },
|
|
{ "table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0" },
|
|
{ "text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" },
|
|
{ "xlink", "http://www.w3c.org/1999/xlink" }
|
|
};
|
|
for(size_t i = 0; i < SAL_N_ELEMENTS(aNamespaces); ++i)
|
|
{
|
|
xmlXPathRegisterNs(
|
|
pXmlXPathCtx,
|
|
reinterpret_cast<xmlChar const *>(aNamespaces[i].pPrefix),
|
|
reinterpret_cast<xmlChar const *>(aNamespaces[i].pURI));
|
|
}
|
|
}
|
|
|
|
namespace {
|
|
|
|
void testErrorBar( Reference< XPropertySet > const & xErrorBar )
|
|
{
|
|
sal_Int32 nErrorBarStyle;
|
|
CPPUNIT_ASSERT(
|
|
xErrorBar->getPropertyValue("ErrorBarStyle") >>= nErrorBarStyle);
|
|
CPPUNIT_ASSERT_EQUAL(nErrorBarStyle, chart::ErrorBarStyle::RELATIVE);
|
|
bool bShowPositive = bool(), bShowNegative = bool();
|
|
CPPUNIT_ASSERT(
|
|
xErrorBar->getPropertyValue("ShowPositiveError") >>= bShowPositive);
|
|
CPPUNIT_ASSERT(bShowPositive);
|
|
CPPUNIT_ASSERT(
|
|
xErrorBar->getPropertyValue("ShowNegativeError") >>= bShowNegative);
|
|
CPPUNIT_ASSERT(bShowNegative);
|
|
double nVal = 0.0;
|
|
CPPUNIT_ASSERT(xErrorBar->getPropertyValue("PositiveError") >>= nVal);
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(10.0, nVal, 1e-10);
|
|
}
|
|
|
|
void checkCommonTrendline(
|
|
Reference<chart2::XRegressionCurve> const & xCurve,
|
|
double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward,
|
|
bool aExpectedForceIntercept, double aExpectedInterceptValue,
|
|
bool aExpectedShowEquation, bool aExpectedR2)
|
|
{
|
|
Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
|
|
CPPUNIT_ASSERT(xProperties.is());
|
|
|
|
double aExtrapolateForward = 0.0;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("ExtrapolateForward") >>= aExtrapolateForward);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedExtrapolateForward, aExtrapolateForward);
|
|
|
|
double aExtrapolateBackward = 0.0;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("ExtrapolateBackward") >>= aExtrapolateBackward);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedExtrapolateBackward, aExtrapolateBackward);
|
|
|
|
bool bForceIntercept = false;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("ForceIntercept") >>= bForceIntercept);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedForceIntercept, bForceIntercept);
|
|
|
|
if (bForceIntercept)
|
|
{
|
|
double aInterceptValue = 0.0;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("InterceptValue") >>= aInterceptValue);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedInterceptValue, aInterceptValue);
|
|
}
|
|
|
|
Reference< XPropertySet > xEquationProperties( xCurve->getEquationProperties() );
|
|
CPPUNIT_ASSERT(xEquationProperties.is());
|
|
|
|
bool bShowEquation = false;
|
|
CPPUNIT_ASSERT(xEquationProperties->getPropertyValue("ShowEquation") >>= bShowEquation);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedShowEquation, bShowEquation);
|
|
|
|
bool bShowCorrelationCoefficient = false;
|
|
CPPUNIT_ASSERT(xEquationProperties->getPropertyValue("ShowCorrelationCoefficient") >>= bShowCorrelationCoefficient);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedR2, bShowCorrelationCoefficient);
|
|
}
|
|
|
|
void checkNameAndType(Reference<XPropertySet> const & xProperties, const OUString& aExpectedName, const OUString& aExpectedServiceName)
|
|
{
|
|
Reference< lang::XServiceName > xServiceName( xProperties, UNO_QUERY );
|
|
CPPUNIT_ASSERT(xServiceName.is());
|
|
|
|
OUString aServiceName = xServiceName->getServiceName();
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedServiceName, aServiceName);
|
|
|
|
OUString aCurveName;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("CurveName") >>= aCurveName);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedName, aCurveName);
|
|
}
|
|
|
|
void checkLinearTrendline(
|
|
Reference<chart2::XRegressionCurve> const & xCurve, const OUString& aExpectedName,
|
|
double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward,
|
|
bool aExpectedForceIntercept, double aExpectedInterceptValue,
|
|
bool aExpectedShowEquation, bool aExpectedR2)
|
|
{
|
|
Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
|
|
CPPUNIT_ASSERT(xProperties.is());
|
|
|
|
checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.LinearRegressionCurve");
|
|
|
|
checkCommonTrendline(
|
|
xCurve,
|
|
aExpectedExtrapolateForward, aExpectedExtrapolateBackward,
|
|
aExpectedForceIntercept, aExpectedInterceptValue,
|
|
aExpectedShowEquation, aExpectedR2);
|
|
}
|
|
|
|
void checkPolynomialTrendline(
|
|
Reference<chart2::XRegressionCurve> const & xCurve, const OUString& aExpectedName,
|
|
sal_Int32 aExpectedDegree,
|
|
double aExpectedExtrapolateForward, double aExpectedExtrapolateBackward,
|
|
bool aExpectedForceIntercept, double aExpectedInterceptValue,
|
|
bool aExpectedShowEquation, bool aExpectedR2)
|
|
{
|
|
Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
|
|
CPPUNIT_ASSERT(xProperties.is());
|
|
|
|
checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.PolynomialRegressionCurve");
|
|
|
|
sal_Int32 aDegree = 2;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("PolynomialDegree") >>= aDegree);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedDegree, aDegree);
|
|
|
|
checkCommonTrendline(
|
|
xCurve,
|
|
aExpectedExtrapolateForward, aExpectedExtrapolateBackward,
|
|
aExpectedForceIntercept, aExpectedInterceptValue,
|
|
aExpectedShowEquation, aExpectedR2);
|
|
}
|
|
|
|
void checkMovingAverageTrendline(
|
|
Reference<chart2::XRegressionCurve> const & xCurve, const OUString& aExpectedName, sal_Int32 aExpectedPeriod)
|
|
{
|
|
Reference<XPropertySet> xProperties( xCurve , uno::UNO_QUERY );
|
|
CPPUNIT_ASSERT(xProperties.is());
|
|
|
|
checkNameAndType(xProperties, aExpectedName, "com.sun.star.chart2.MovingAverageRegressionCurve");
|
|
|
|
sal_Int32 aPeriod = 2;
|
|
CPPUNIT_ASSERT(xProperties->getPropertyValue("MovingAveragePeriod") >>= aPeriod);
|
|
CPPUNIT_ASSERT_EQUAL(aExpectedPeriod, aPeriod);
|
|
}
|
|
|
|
void checkTrendlinesInChart(uno::Reference< chart2::XChartDocument > const & xChartDoc)
|
|
{
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
|
|
CPPUNIT_ASSERT( xDataSeries.is() );
|
|
|
|
Reference< chart2::XRegressionCurveContainer > xRegressionCurveContainer( xDataSeries, UNO_QUERY );
|
|
CPPUNIT_ASSERT( xRegressionCurveContainer.is() );
|
|
|
|
Sequence< Reference< chart2::XRegressionCurve > > xRegressionCurveSequence = xRegressionCurveContainer->getRegressionCurves();
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xRegressionCurveSequence.getLength());
|
|
|
|
Reference<chart2::XRegressionCurve> xCurve;
|
|
|
|
xCurve = xRegressionCurveSequence[0];
|
|
CPPUNIT_ASSERT(xCurve.is());
|
|
checkPolynomialTrendline(xCurve, "col2_poly", 3, 0.1, -0.1, true, -1.0, true, true);
|
|
|
|
xCurve = xRegressionCurveSequence[1];
|
|
CPPUNIT_ASSERT(xCurve.is());
|
|
checkLinearTrendline(xCurve, "col2_linear", -0.5, -0.5, false, 0.0, true, false);
|
|
|
|
xCurve = xRegressionCurveSequence[2];
|
|
CPPUNIT_ASSERT(xCurve.is());
|
|
checkMovingAverageTrendline(xCurve, "col2_moving_avg", 3);
|
|
}
|
|
|
|
}
|
|
|
|
// improve the test
|
|
void Chart2ExportTest::testErrorBarXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "error_bar.ods");
|
|
{
|
|
// make sure the ODS import was successful
|
|
uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
|
|
CPPUNIT_ASSERT( xDataSeries.is() );
|
|
|
|
Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW );
|
|
CPPUNIT_ASSERT( xPropSet.is() );
|
|
|
|
// test that y error bars are there
|
|
Reference< beans::XPropertySet > xErrorBarYProps;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps;
|
|
testErrorBar(xErrorBarYProps);
|
|
}
|
|
|
|
reload("Calc Office Open XML");
|
|
{
|
|
uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
|
|
CPPUNIT_ASSERT( xDataSeries.is() );
|
|
|
|
Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW );
|
|
CPPUNIT_ASSERT( xPropSet.is() );
|
|
|
|
// test that y error bars are there
|
|
Reference< beans::XPropertySet > xErrorBarYProps;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps;
|
|
testErrorBar(xErrorBarYProps);
|
|
}
|
|
}
|
|
|
|
// This method tests the preservation of properties for trendlines / regression curves
|
|
// in an export -> import cycle using different file formats - ODS, XLS and XLSX.
|
|
void Chart2ExportTest::testTrendline()
|
|
{
|
|
mbSkipValidation = true;
|
|
load("/chart2/qa/extras/data/ods/", "trendline.ods");
|
|
checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
|
|
reload("calc8");
|
|
checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
|
|
}
|
|
|
|
void Chart2ExportTest::testTrendlineOOXML()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "trendline.ods");
|
|
checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
|
|
reload("Calc Office Open XML");
|
|
checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
|
|
}
|
|
|
|
void Chart2ExportTest::testTrendlineXLS()
|
|
{
|
|
mbSkipValidation = true;
|
|
load("/chart2/qa/extras/data/ods/", "trendline.ods");
|
|
checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
|
|
reload("MS Excel 97");
|
|
checkTrendlinesInChart(getChartDocFromSheet( 0, mxComponent));
|
|
}
|
|
|
|
void Chart2ExportTest::testStockChart()
|
|
{
|
|
/* For attached file Stock_Chart.docx, in chart1.xml,
|
|
* <c:stockChart>, there are four types of series as
|
|
* Open,Low,High and Close.
|
|
* For Open series, in <c:idx val="0" />
|
|
* an attribute val of index should start from 1 and not from 0.
|
|
* Which was problem area.
|
|
*/
|
|
load("/chart2/qa/extras/data/docx/", "testStockChart.docx");
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
if (!pXmlDoc)
|
|
return;
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:idx", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:order", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:tx/c:strRef/c:strCache/c:pt/c:v", "Open");
|
|
}
|
|
|
|
void Chart2ExportTest::testBarChart()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "testBarChart.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
if (!pXmlDoc)
|
|
return;
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:barDir", "val", "col");
|
|
}
|
|
|
|
void Chart2ExportTest::testCrosses()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "Bar_horizontal_cone.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:crosses", "val", "autoZero");
|
|
}
|
|
|
|
void Chart2ExportTest::testScatterChartTextXValues()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "scatter-chart-text-x-values.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference<chart2::XChartType> xCT = getChartTypeFromDoc(xChartDoc, 0);
|
|
CPPUNIT_ASSERT(xCT.is());
|
|
|
|
// Make sure we have exactly 3 data series.
|
|
std::vector<uno::Sequence<uno::Any> > aLabels = getDataSeriesLabelsFromChartType(xCT);
|
|
CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Series 1"), aLabels[0][0].get<OUString>());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Series 2"), aLabels[1][0].get<OUString>());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Series 3"), aLabels[2][0].get<OUString>());
|
|
|
|
std::vector<std::vector<double> > aYValues = getDataSeriesYValuesFromChartType(xCT);
|
|
CPPUNIT_ASSERT_EQUAL(size_t(3), aYValues.size());
|
|
|
|
// Check the Y values of "Series 1".
|
|
CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[0].size());
|
|
CPPUNIT_ASSERT_EQUAL(4.3, aYValues[0][0]);
|
|
CPPUNIT_ASSERT_EQUAL(2.5, aYValues[0][1]);
|
|
CPPUNIT_ASSERT_EQUAL(3.5, aYValues[0][2]);
|
|
CPPUNIT_ASSERT_EQUAL(4.5, aYValues[0][3]);
|
|
|
|
// And "Series 2".
|
|
CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[1].size());
|
|
CPPUNIT_ASSERT_EQUAL(2.4, aYValues[1][0]);
|
|
CPPUNIT_ASSERT_EQUAL(4.4, aYValues[1][1]);
|
|
CPPUNIT_ASSERT_EQUAL(1.8, aYValues[1][2]);
|
|
CPPUNIT_ASSERT_EQUAL(2.8, aYValues[1][3]);
|
|
|
|
// And "Series 3".
|
|
CPPUNIT_ASSERT_EQUAL(size_t(4), aYValues[2].size());
|
|
CPPUNIT_ASSERT_EQUAL(2.0, aYValues[2][0]);
|
|
CPPUNIT_ASSERT_EQUAL(2.0, aYValues[2][1]);
|
|
CPPUNIT_ASSERT_EQUAL(3.0, aYValues[2][2]);
|
|
CPPUNIT_ASSERT_EQUAL(5.0, aYValues[2][3]);
|
|
|
|
// Test the export.
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
if (!pXmlDoc)
|
|
return;
|
|
|
|
assertXPathContent(pXmlDoc, "//c:scatterChart/c:ser[1]/c:xVal[1]/c:numRef[1]/c:numCache[1]/c:pt[1]/c:v[1]", "1");
|
|
}
|
|
|
|
void Chart2ExportTest::testChartDataTable()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "testChartDataTable.docx");
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showHorzBorder", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showVertBorder", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:dTable/c:showOutline", "val", "1");
|
|
}
|
|
|
|
void Chart2ExportTest::testChartExternalData()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "testMultipleChart.docx");
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
xmlXPathObjectPtr pXmlPathObj = getXPathNode(pXmlDoc, "/c:chartSpace/c:externalData");
|
|
xmlNodeSetPtr pXmlNodes = pXmlPathObj->nodesetval;
|
|
CPPUNIT_ASSERT(pXmlNodes);
|
|
}
|
|
|
|
void Chart2ExportTest::testEmbeddingsGrabBag()
|
|
{
|
|
// The problem was that .xlsx files were missing from docx file from embeddings folder
|
|
// after saving file.
|
|
// This test case tests whether embeddings files grabbagged properly in correct object.
|
|
|
|
load("/chart2/qa/extras/data/docx/", "testMultiplechartembeddings.docx" );
|
|
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
|
|
uno::Reference<beans::XPropertySet> xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY);
|
|
uno::Sequence<beans::PropertyValue> aGrabBag(0);
|
|
xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
|
|
CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty
|
|
bool bEmbeddings = false;
|
|
const char* const testEmbeddedFileNames[] {"word/embeddings/Microsoft_Excel_Worksheet3.xlsx",
|
|
"word/embeddings/Microsoft_Excel_Worksheet2.xlsx",
|
|
"word/embeddings/Microsoft_Excel_Worksheet1.xlsx"};
|
|
for(int i = 0; i < aGrabBag.getLength(); ++i)
|
|
{
|
|
if (aGrabBag[i].Name == "OOXEmbeddings")
|
|
{
|
|
bEmbeddings = true;
|
|
uno::Sequence<beans::PropertyValue> aEmbeddingsList(0);
|
|
uno::Reference<io::XInputStream> aEmbeddingXlsxStream;
|
|
OUString aEmbeddedfileName;
|
|
CPPUNIT_ASSERT(aGrabBag[i].Value >>= aEmbeddingsList); // PropertyValue of proper type
|
|
sal_Int32 length = aEmbeddingsList.getLength();
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(3), length);
|
|
for(int j = 0; j < length; ++j)
|
|
{
|
|
aEmbeddingsList[j].Value >>= aEmbeddingXlsxStream;
|
|
aEmbeddedfileName = aEmbeddingsList[j].Name;
|
|
CPPUNIT_ASSERT(aEmbeddingXlsxStream.get()); // Reference not empty
|
|
CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(testEmbeddedFileNames[j]),aEmbeddedfileName);
|
|
}
|
|
}
|
|
}
|
|
CPPUNIT_ASSERT(bEmbeddings); // Grab Bag has all the expected elements
|
|
}
|
|
|
|
void Chart2ExportTest::testAreaChartLoad()
|
|
{
|
|
load ("/chart2/qa/extras/data/docx/", "testAreaChartLoad.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:showVal", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLbl", 0);
|
|
}
|
|
|
|
void Chart2ExportTest::testUpDownBars()
|
|
{
|
|
/*
|
|
load("/chart2/qa/extras/data/docx/", "UpDownBars.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:upDownBars");
|
|
*/
|
|
}
|
|
|
|
void Chart2ExportTest::testDoughnutChart()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "doughnutChart.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart", "1");
|
|
}
|
|
|
|
void Chart2ExportTest::testDisplayUnits()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "DisplayUnits.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:dispUnits/c:builtInUnit", "val", "billions");
|
|
}
|
|
|
|
// void Chart2ExportTest::testFdo74115WallGradientFill()
|
|
// {
|
|
// load("/chart2/qa/extras/data/docx/", "fdo74115_WallGradientFill.docx");
|
|
// xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
// CPPUNIT_ASSERT(pXmlDoc);
|
|
//
|
|
// assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:gradFill");
|
|
// }
|
|
|
|
void Chart2ExportTest::testFdo74115WallBitmapFill()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "fdo74115_WallBitmapFill.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:blipFill");
|
|
}
|
|
|
|
//The below test case tests the built in marker 'x' for Office 2010 in Line charts
|
|
|
|
void Chart2ExportTest::testFdo78290LineChartMarkerX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "fdo78290_Line_Chart_Marker_x.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:symbol[1]","val","x");
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:size[1]","val","7");
|
|
}
|
|
|
|
// We can also use the built in marker 'x' in scatter chart, hence writing the test case for the same.
|
|
|
|
void Chart2ExportTest::testFdo78290ScatterChartMarkerX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "fdo78290_Scatter_Chart_Marker_x.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:scatterChart[1]/c:ser[1]/c:marker[1]/c:symbol[1]","val","x");
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:scatterChart[1]/c:ser[1]/c:marker[1]/c:size[1]","val","7");
|
|
}
|
|
|
|
// Also in a combination of charts like a column chart and line chart, we can use the built in marker 'x'
|
|
// for the line chart too. hence put a test case for the combination chart also.
|
|
|
|
void Chart2ExportTest::testFdo78290CombinationChartMarkerX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "fdo78290_Combination_Chart_Marker_x.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:symbol[1]","val","x");
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:marker[1]/c:size[1]","val","7");
|
|
}
|
|
|
|
void Chart2ExportTest::testAxisNumberFormatODS()
|
|
{
|
|
struct
|
|
{
|
|
void check( const Reference<chart2::XChartDocument>& xChartDoc )
|
|
{
|
|
Reference<chart2::XAxis> xAxisX = getAxisFromDoc(xChartDoc, 0, 0, 0);
|
|
Reference<chart2::XTitled> xTitle(xAxisX, UNO_QUERY_THROW);
|
|
OUString aTitleText = getTitleString(xTitle);
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Linked To Source"), aTitleText);
|
|
|
|
sal_Int32 nNumFmt = getNumberFormatFromAxis(xAxisX);
|
|
sal_Int16 nType = getNumberFormatType(xChartDoc, nNumFmt);
|
|
CPPUNIT_ASSERT_MESSAGE("X axis should be percentage format.", (nType & util::NumberFormat::PERCENT));
|
|
|
|
bool bNumFmtLinked = false;
|
|
Reference<beans::XPropertySet> xPS(xAxisX, uno::UNO_QUERY_THROW);
|
|
xPS->getPropertyValue("LinkNumberFormatToSource") >>= bNumFmtLinked;
|
|
CPPUNIT_ASSERT_MESSAGE("X axis should have its number format linked to source.", bNumFmtLinked);
|
|
|
|
Reference<chart2::XAxis> xAxisY = getAxisFromDoc(xChartDoc, 0, 1, 0);
|
|
xTitle.set(xAxisY, UNO_QUERY_THROW);
|
|
aTitleText = getTitleString(xTitle);
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Not Linked"), aTitleText);
|
|
|
|
nNumFmt = getNumberFormatFromAxis(xAxisY);
|
|
nType = getNumberFormatType(xChartDoc, nNumFmt);
|
|
CPPUNIT_ASSERT_MESSAGE("Y axis should be a normal number format.", (nType & util::NumberFormat::NUMBER));
|
|
|
|
bNumFmtLinked = true;
|
|
xPS.set(xAxisY, uno::UNO_QUERY_THROW);
|
|
xPS->getPropertyValue("LinkNumberFormatToSource") >>= bNumFmtLinked;
|
|
CPPUNIT_ASSERT_MESSAGE("Y axis should not have its number format linked to source.", !bNumFmtLinked);
|
|
}
|
|
|
|
} aTest;
|
|
|
|
load("/chart2/qa/extras/data/ods/", "axis-numformats-linked.ods");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent);
|
|
aTest.check(xChartDoc);
|
|
|
|
// Reload the document and make sure everything remains intact.
|
|
reload("calc8");
|
|
xChartDoc = getChartDocFromSheet(0, mxComponent);
|
|
aTest.check(xChartDoc);
|
|
}
|
|
|
|
void Chart2ExportTest::testAxisNumberFormatXLS()
|
|
{
|
|
struct
|
|
{
|
|
void check( const Reference<chart2::XChartDocument>& xChartDoc, bool bNumFmtLinkedActual, sal_Int16 nNumFmtTypeFlag ) const
|
|
{
|
|
Reference<chart2::XAxis> xAxisY = getAxisFromDoc( xChartDoc, 0, 1, 0 );
|
|
bool bNumFmtLinked = false;
|
|
Reference<beans::XPropertySet> xPS( xAxisY, uno::UNO_QUERY_THROW );
|
|
xPS->getPropertyValue( "LinkNumberFormatToSource" ) >>= bNumFmtLinked;
|
|
|
|
if ( bNumFmtLinkedActual )
|
|
CPPUNIT_ASSERT_MESSAGE( "Y axis should have its number format linked to source.", bNumFmtLinked );
|
|
else
|
|
{
|
|
CPPUNIT_ASSERT_MESSAGE( "Y axis should not have its number format linked to source.", !bNumFmtLinked );
|
|
|
|
sal_Int32 nNumFmt = getNumberFormatFromAxis( xAxisY );
|
|
sal_Int16 nType = getNumberFormatType( xChartDoc, nNumFmt );
|
|
if ( nNumFmtTypeFlag == util::NumberFormat::PERCENT )
|
|
CPPUNIT_ASSERT_MESSAGE( "Y axis should be percentage format.", ( nType & util::NumberFormat::PERCENT ) );
|
|
else
|
|
CPPUNIT_ASSERT_MESSAGE( "Y axis should be number format.", ( nType & util::NumberFormat::NUMBER ) );
|
|
}
|
|
}
|
|
|
|
void change( const Reference<chart2::XChartDocument>& xChartDoc, bool bSetNumFmtLinked, sal_Int16 nNumFmtTypeFlag )
|
|
{
|
|
Reference<chart2::XAxis> xAxisY = getAxisFromDoc( xChartDoc, 0, 1, 0 );
|
|
Reference<beans::XPropertySet> xPS( xAxisY, uno::UNO_QUERY_THROW );
|
|
Any aAny( bSetNumFmtLinked );
|
|
xPS->setPropertyValue( "LinkNumberFormatToSource", aAny );
|
|
if ( !bSetNumFmtLinked )
|
|
{
|
|
Reference<util::XNumberFormatsSupplier> xNFS( xChartDoc, uno::UNO_QUERY_THROW );
|
|
Reference<util::XNumberFormats> xNumberFormats = xNFS->getNumberFormats();
|
|
CPPUNIT_ASSERT( xNumberFormats.is() );
|
|
lang::Locale aLocale{ "en", "US", "" };
|
|
Sequence<sal_Int32> aNumFmts = xNumberFormats->queryKeys( nNumFmtTypeFlag, aLocale, false );
|
|
CPPUNIT_ASSERT( aNumFmts.hasElements() );
|
|
aAny <<= aNumFmts[0];
|
|
xPS->setPropertyValue( CHART_UNONAME_NUMFMT, aAny );
|
|
}
|
|
}
|
|
|
|
} aTest;
|
|
|
|
load( "/chart2/qa/extras/data/xls/", "axis_sourceformatting.xls" );
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
aTest.check( xChartDoc, true, util::NumberFormat::PERCENT );
|
|
|
|
aTest.change( xChartDoc, false, util::NumberFormat::NUMBER );
|
|
// Write the document(xls) with changes made close it, load it and check if changes are intact
|
|
reload( "MS Excel 97" );
|
|
xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
aTest.check( xChartDoc, false, util::NumberFormat::NUMBER );
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelBordersDOCX()
|
|
{
|
|
struct Check
|
|
{
|
|
sal_Int32 mnIndex;
|
|
css::drawing::LineStyle meStyle;
|
|
sal_Int32 mnColor;
|
|
};
|
|
|
|
struct
|
|
{
|
|
/**
|
|
* Chart 1 has 4 bars of which 1st and 3rd have labels with borders
|
|
* around them.
|
|
*/
|
|
void checkObject1( const Reference<chart2::XChartDocument>& xChartDoc )
|
|
{
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference<chart2::XDataSeries> xDataSeries = getDataSeriesFromDoc(xChartDoc, 0);
|
|
CPPUNIT_ASSERT(xDataSeries.is());
|
|
|
|
// Check to make sure that data points 0 and 2 have local properties.
|
|
Reference<beans::XPropertySet> xPropSet(xDataSeries, uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xPropSet.is());
|
|
|
|
Sequence<sal_Int32> aIndices;
|
|
xPropSet->getPropertyValue("AttributedDataPoints") >>= aIndices;
|
|
/*
|
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be 2 data points with local properties.", sal_Int32(2), aIndices.getLength());
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aIndices[0]);
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aIndices[1]);
|
|
*/
|
|
|
|
const Check aDataPoints[] =
|
|
{
|
|
{ 0, css::drawing::LineStyle_SOLID, 0x00FFFF00 }, // solid yellow
|
|
{ 2, css::drawing::LineStyle_SOLID, 0x00FF0000 } // solid red
|
|
};
|
|
|
|
for (size_t i = 0; i < SAL_N_ELEMENTS(aDataPoints); ++i)
|
|
{
|
|
xPropSet = xDataSeries->getDataPointByIndex(aDataPoints[i].mnIndex);
|
|
CPPUNIT_ASSERT(xPropSet.is());
|
|
|
|
css::drawing::LineStyle eLineStyle = css::drawing::LineStyle_NONE;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_STYLE) >>= eLineStyle;
|
|
CPPUNIT_ASSERT_EQUAL(aDataPoints[i].meStyle, eLineStyle);
|
|
|
|
sal_Int32 nWidth = -1;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_WIDTH) >>= nWidth;
|
|
CPPUNIT_ASSERT(nWidth > 0);
|
|
|
|
sal_Int32 nColor = -1;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_COLOR) >>= nColor;
|
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("Border color is wrong.", aDataPoints[i].mnColor, nColor);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Chart 2 has all its data labels with identical borders.
|
|
*/
|
|
void checkObject2( const Reference<chart2::XChartDocument>& xChartDoc )
|
|
{
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference<chart2::XDataSeries> xDataSeries = getDataSeriesFromDoc(xChartDoc, 0);
|
|
CPPUNIT_ASSERT(xDataSeries.is());
|
|
|
|
Reference<beans::XPropertySet> xPropSet(xDataSeries, uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xPropSet.is());
|
|
|
|
css::drawing::LineStyle eLineStyle = css::drawing::LineStyle_NONE;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_STYLE) >>= eLineStyle;
|
|
CPPUNIT_ASSERT_EQUAL(css::drawing::LineStyle_SOLID, eLineStyle);
|
|
|
|
sal_Int32 nWidth = -1;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_WIDTH) >>= nWidth;
|
|
CPPUNIT_ASSERT(nWidth > 0);
|
|
|
|
sal_Int32 nColor = -1;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_LABEL_BORDER_COLOR) >>= nColor;
|
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("Border color should be green.", sal_Int32(0x0000FF00), nColor);
|
|
}
|
|
|
|
} aTest;
|
|
|
|
load("/chart2/qa/extras/data/docx/", "data-label-borders.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
|
|
// "Automatic" chart background fill in docx should be loaded as solid white.
|
|
Reference<beans::XPropertySet> xPropSet = xChartDoc->getPageBackground();
|
|
CPPUNIT_ASSERT(xPropSet.is());
|
|
drawing::FillStyle eStyle = xPropSet->getPropertyValue("FillStyle").get<drawing::FillStyle>();
|
|
sal_Int32 nColor = xPropSet->getPropertyValue("FillColor").get<sal_Int32>();
|
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("'Automatic' chart background fill in docx should be loaded as solid fill.",
|
|
drawing::FillStyle_SOLID, eStyle);
|
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("'Automatic' chart background fill in docx should be loaded as solid white.",
|
|
sal_Int32(0x00FFFFFF), sal_Int32(nColor & 0x00FFFFFF)); // highest 2 bytes are transparency which we ignore here.
|
|
|
|
aTest.checkObject1(xChartDoc);
|
|
xChartDoc.set(getChartDocFromWriter(1), uno::UNO_QUERY);
|
|
aTest.checkObject2(xChartDoc);
|
|
|
|
reload("Office Open XML Text");
|
|
|
|
xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
aTest.checkObject1(xChartDoc);
|
|
xChartDoc.set(getChartDocFromWriter(1), uno::UNO_QUERY);
|
|
aTest.checkObject2(xChartDoc);
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabel3DChartDOCX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "3d-bar-label.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
// We must not export label position attributes for 3D bar charts. The
|
|
// same rule also applies to several other 3D charts, apparently.
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLblPos", 0);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelBarChartDOCX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "bar-chart-labels.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLblPos", "val", "ctr");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:dLbls/c:dLblPos", "val", "inEnd");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:dLbls/c:dLblPos", "val", "inBase");
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelClusteredBarChartDOCX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "clustered-bar-chart-labels.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
// This was "t", should be one of the allowed values.
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLbl[2]/c:dLblPos", "val", "outEnd");
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelRadarChartDOCX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "radar-chart-labels.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
// We must not export label position attributes for radar charts.
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:radarChart/c:ser/c:dLbls/c:dLblPos", 0);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:radarChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelDoughnutChartDOCX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "doughnut-chart-labels.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
// We must not export label position attributes for doughnut charts.
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:ser/c:dLbls/c:dLblPos", 0);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelAreaChartDOCX()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "area-chart-labels.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
// We must not export label position attributes for area charts.
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLblPos", 0);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0);
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelDefaultLineChartDOCX()
|
|
{
|
|
// This file was created by Word 2007, which doesn't provide default data
|
|
// label position (2010 does). Make sure its default data label position
|
|
// is RIGHT when exporting.
|
|
|
|
load("/chart2/qa/extras/data/docx/", "line-chart-label-default-placement.docx");
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
reload("Office Open XML Text");
|
|
|
|
xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
Reference<chart2::XDataSeries> xDataSeries = getDataSeriesFromDoc(xChartDoc, 0);
|
|
Reference<beans::XPropertySet> xPropSet(xDataSeries, uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xPropSet.is());
|
|
sal_Int32 nLabelPlacement = -1;
|
|
if (xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement)
|
|
// This option may not be set. Check its value only when it's set.
|
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("Line chart's default label placement should be 'right'.", chart::DataLabelPlacement::RIGHT, nLabelPlacement );
|
|
}
|
|
|
|
void Chart2ExportTest::testBarChartRotation()
|
|
{
|
|
load ("/chart2/qa/extras/data/docx/", "barChartRotation.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotX", "val", "30");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotY", "val", "50");
|
|
}
|
|
|
|
void Chart2ExportTest::testShapeFollowedByChart()
|
|
{
|
|
/* If there is a scenario where a chart is followed by a shape
|
|
which is being exported as an alternate content then, the
|
|
docPr Id is being repeated, ECMA 20.4.2.5 says that the
|
|
docPr Id should be unique, ensuring the same here.
|
|
*/
|
|
load("/chart2/qa/extras/data/docx/", "FDO74430.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/document", "Office Open XML Text" );
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
OUString aValueOfFirstDocPR = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/w:drawing[1]/wp:inline[1]/wp:docPr[1]", "id");
|
|
OUString aValueOfSecondDocPR;
|
|
|
|
aValueOfSecondDocPR = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/wp:docPr[1]", "id");
|
|
|
|
CPPUNIT_ASSERT( aValueOfFirstDocPR != aValueOfSecondDocPR );
|
|
}
|
|
|
|
void Chart2ExportTest::testPieChartDataLabels()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "PieChartDataLabels.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pie3DChart/c:ser[1]/c:dLbls/c:dLbl[1]/c:dLblPos", "val", "bestFit");
|
|
}
|
|
|
|
void Chart2ExportTest::testSeriesIdxOrder()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "testSeriesIdxOrder.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:idx[1]", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace[1]/c:chart[1]/c:plotArea[1]/c:lineChart[1]/c:ser[1]/c:order[1]", "val", "1");
|
|
}
|
|
|
|
void Chart2ExportTest::testScatterPlotLabels()
|
|
{
|
|
load("/chart2/qa/extras/data/odt/", "scatter-plot-labels.odt");
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference<chart2::XChartType> xCT = getChartTypeFromDoc(xChartDoc, 0);
|
|
CPPUNIT_ASSERT(xCT.is());
|
|
|
|
// Make sure the original chart has 'a', 'b', 'c' as its data labels.
|
|
std::vector<uno::Sequence<uno::Any> > aLabels = getDataSeriesLabelsFromChartType(xCT);
|
|
CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("a"), aLabels[0][0].get<OUString>());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("b"), aLabels[1][0].get<OUString>());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("c"), aLabels[2][0].get<OUString>());
|
|
|
|
// Reload the doc and check again. The labels should not change.
|
|
reload("writer8");
|
|
|
|
xChartDoc.set(getChartDocFromWriter(0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
xCT = getChartTypeFromDoc(xChartDoc, 0);
|
|
CPPUNIT_ASSERT(xCT.is());
|
|
|
|
aLabels = getDataSeriesLabelsFromChartType(xCT);
|
|
CPPUNIT_ASSERT_EQUAL(size_t(3), aLabels.size());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("a"), aLabels[0][0].get<OUString>());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("b"), aLabels[1][0].get<OUString>());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("c"), aLabels[2][0].get<OUString>());
|
|
}
|
|
|
|
void Chart2ExportTest::testErrorBarDataRangeODS()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "ErrorBarRange.ods");
|
|
reload("calc8");
|
|
|
|
uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference< chart2::XDataSeries > xDataSeries = getDataSeriesFromDoc( xChartDoc, 0 );
|
|
CPPUNIT_ASSERT( xDataSeries.is() );
|
|
|
|
Reference< beans::XPropertySet > xPropSet( xDataSeries, UNO_QUERY_THROW );
|
|
CPPUNIT_ASSERT( xPropSet.is() );
|
|
|
|
// test that y error bars are there
|
|
Reference< beans::XPropertySet > xErrorBarYProps;
|
|
xPropSet->getPropertyValue(CHART_UNONAME_ERRORBAR_Y) >>= xErrorBarYProps;
|
|
uno::Any aAny = xErrorBarYProps->getPropertyValue("ErrorBarRangePositive");
|
|
CPPUNIT_ASSERT(aAny.hasValue());
|
|
OUString aPosRange;
|
|
aAny >>= aPosRange;
|
|
CPPUNIT_ASSERT_EQUAL(OUString("$Sheet1.$B$1:$B$3"), aPosRange);
|
|
|
|
aAny = xErrorBarYProps->getPropertyValue("ErrorBarRangeNegative");
|
|
CPPUNIT_ASSERT(aAny.hasValue());
|
|
OUString aNegRange;
|
|
aAny >>= aNegRange;
|
|
CPPUNIT_ASSERT_EQUAL(OUString("$Sheet1.$C$1:$C$3"), aNegRange);
|
|
}
|
|
|
|
void Chart2ExportTest::testChartCrash()
|
|
{
|
|
load("/chart2/qa/extras/data/docx/", "FDO75975.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
}
|
|
|
|
void Chart2ExportTest::testPieChartRotation()
|
|
{
|
|
load ("/chart2/qa/extras/data/docx/", "pieChartRotation.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotX", "val", "40");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:view3D/c:rotY", "val", "30");
|
|
}
|
|
|
|
void Chart2ExportTest::testEmbeddingsOleObjectGrabBag()
|
|
{
|
|
// The problem was that .bin files were missing from docx file from embeddings folder
|
|
// after saving file.
|
|
// This test case tests whether embeddings files grabbagged properly in correct object.
|
|
|
|
load("/chart2/qa/extras/data/docx/", "testchartoleobjectembeddings.docx" );
|
|
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
|
|
uno::Reference<beans::XPropertySet> xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY);
|
|
uno::Sequence<beans::PropertyValue> aGrabBag(0);
|
|
xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
|
|
CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty
|
|
bool bEmbeddings = false;
|
|
const char* const testEmbeddedFileNames[] = {"word/embeddings/oleObject1.bin"};
|
|
for(int i = 0; i < aGrabBag.getLength(); ++i)
|
|
{
|
|
if (aGrabBag[i].Name == "OOXEmbeddings")
|
|
{
|
|
bEmbeddings = true;
|
|
uno::Sequence<beans::PropertyValue> aEmbeddingsList(0);
|
|
uno::Reference<io::XInputStream> aEmbeddingXlsxStream;
|
|
OUString aEmbeddedfileName;
|
|
CPPUNIT_ASSERT(aGrabBag[i].Value >>= aEmbeddingsList); // PropertyValue of proper type
|
|
sal_Int32 length = aEmbeddingsList.getLength();
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), length);
|
|
for(int j = 0; j < length; ++j)
|
|
{
|
|
aEmbeddingsList[j].Value >>= aEmbeddingXlsxStream;
|
|
aEmbeddedfileName = aEmbeddingsList[j].Name;
|
|
CPPUNIT_ASSERT(aEmbeddingXlsxStream.get()); // Reference not empty
|
|
CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(testEmbeddedFileNames[j]),aEmbeddedfileName);
|
|
}
|
|
}
|
|
}
|
|
CPPUNIT_ASSERT(bEmbeddings); // Grab Bag has all the expected elements
|
|
}
|
|
|
|
namespace {
|
|
|
|
void checkGapWidth(Reference<beans::XPropertySet> const & xPropSet, sal_Int32 nValue)
|
|
{
|
|
uno::Any aAny = xPropSet->getPropertyValue("GapwidthSequence");
|
|
CPPUNIT_ASSERT(aAny.hasValue());
|
|
uno::Sequence< sal_Int32 > aSequence;
|
|
aAny >>= aSequence;
|
|
CPPUNIT_ASSERT(aSequence.getLength());
|
|
CPPUNIT_ASSERT_EQUAL(nValue, aSequence[0]);
|
|
}
|
|
|
|
void checkOverlap(Reference<beans::XPropertySet> const & xPropSet, sal_Int32 nValue)
|
|
{
|
|
uno::Any aAny = xPropSet->getPropertyValue("OverlapSequence");
|
|
CPPUNIT_ASSERT(aAny.hasValue());
|
|
uno::Sequence< sal_Int32 > aSequence;
|
|
aAny >>= aSequence;
|
|
CPPUNIT_ASSERT(aSequence.getLength());
|
|
CPPUNIT_ASSERT_EQUAL(nValue, aSequence[0]);
|
|
}
|
|
|
|
void checkSheetForGapWidthAndOverlap(uno::Reference< chart2::XChartDocument > const & xChartDoc,
|
|
sal_Int32 nExpectedGapWidth, sal_Int32 nExpectedOverlap)
|
|
{
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
Reference< chart2::XChartType > xChartType = getChartTypeFromDoc( xChartDoc, 0 );
|
|
CPPUNIT_ASSERT(xChartType.is());
|
|
|
|
Reference< beans::XPropertySet > xPropSet( xChartType, uno::UNO_QUERY_THROW );
|
|
checkGapWidth(xPropSet, nExpectedGapWidth);
|
|
checkOverlap(xPropSet, nExpectedOverlap);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void Chart2ExportTest::testGapWidthXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "gapWidth.xlsx");
|
|
|
|
uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
checkSheetForGapWidthAndOverlap(xChartDoc, 120, -60);
|
|
|
|
xChartDoc = getChartDocFromSheet( 1, mxComponent );
|
|
checkSheetForGapWidthAndOverlap(xChartDoc, 50, 30);
|
|
|
|
reload("Calc Office Open XML");
|
|
|
|
xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
checkSheetForGapWidthAndOverlap(xChartDoc, 120, -60);
|
|
|
|
xChartDoc = getChartDocFromSheet( 1, mxComponent );
|
|
checkSheetForGapWidthAndOverlap(xChartDoc, 50, 30);
|
|
}
|
|
|
|
void Chart2ExportTest::testSmoothedLines()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "smoothedLines.ods");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:smooth", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testLabelStringODS()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "labelString.ods");
|
|
|
|
uno::Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
Reference< chart2::data::XDataSequence > xLabelSeq =
|
|
getLabelDataSequenceFromDoc(xChartDoc);
|
|
CPPUNIT_ASSERT(xLabelSeq.is());
|
|
|
|
OUString aLabelString = xLabelSeq->getSourceRangeRepresentation();
|
|
CPPUNIT_ASSERT_EQUAL(OUString("\"LabelName\""), aLabelString);
|
|
|
|
reload("calc8");
|
|
|
|
xChartDoc = getChartDocFromSheet( 0, mxComponent );
|
|
xLabelSeq = getLabelDataSequenceFromDoc(xChartDoc);
|
|
CPPUNIT_ASSERT(xLabelSeq.is());
|
|
|
|
aLabelString = xLabelSeq->getSourceRangeRepresentation();
|
|
CPPUNIT_ASSERT_EQUAL(OUString("\"LabelName\""), aLabelString);
|
|
}
|
|
|
|
void Chart2ExportTest::testFdo83058dlblPos()
|
|
{
|
|
load ("/chart2/qa/extras/data/docx/", "fdo83058_dlblPos.docx");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[2]/c:dLblPos", "val", "outEnd");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[3]/c:dLblPos", "val", "outEnd");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[4]/c:dLblPos", "val", "outEnd");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls[1]/c:dLbl[5]/c:dLblPos", "val", "outEnd");
|
|
}
|
|
|
|
void Chart2ExportTest::testAutoTitleDelXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "autotitledel_2007.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:autoTitleDeleted", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testDispBlanksAsXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "dispBlanksAs_2007.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart","Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:dispBlanksAs", "val", "gap");
|
|
}
|
|
|
|
void Chart2ExportTest::testMarkerColorXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "markerColor.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:marker/c:spPr/a:solidFill/a:srgbClr", "val", "92d050");
|
|
}
|
|
|
|
void Chart2ExportTest::testRoundedCornersXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "markerColor.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:roundedCorners", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testAxisNumberFormatXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "axis_number_format.ods");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 2);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "formatCode", "0.00E+000");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "sourceLinked", "0");
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "formatCode", "[$$-409]#,##0;\\-[$$-409]#,##0");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "sourceLinked", "1");
|
|
}
|
|
|
|
void Chart2ExportTest::testDataLabelDefaultValuesXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "data_label.xlsx");
|
|
Reference< chart2::XChartDocument> xDoc = getChartDocFromSheet(0, mxComponent);
|
|
Reference<chart2::XDataSeries> xSeries = getDataSeriesFromDoc(xDoc, 0);
|
|
Reference<beans::XPropertySet> xPropSet(xSeries, uno::UNO_QUERY_THROW);
|
|
uno::Any aAny = xPropSet->getPropertyValue("Label");
|
|
chart2::DataPointLabel aLabel;
|
|
CPPUNIT_ASSERT(aAny >>= aLabel);
|
|
CPPUNIT_ASSERT(aLabel.ShowNumber);
|
|
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:showVal", "val", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:dLblPos", "val", "outEnd");
|
|
}
|
|
|
|
void Chart2ExportTest::testTitleOverlayXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "chart_title.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:overlay", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testInvertIfNegativeXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "bar_chart_simple.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:invertIfNegative", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testBubble3DXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "bubble_chart_simple.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bubbleChart/c:bubble3D", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testNoMarkerXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "no_marker.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:marker/c:symbol", "val", "none");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[2]/c:marker/c:symbol", "val", "none");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:marker", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testTitleManualLayoutXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "title_manual_layout.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:layoutTarget", 0);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:xMode", "val", "edge");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:yMode", "val", "edge");
|
|
|
|
OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:x", "val");
|
|
double nX = aXVal.toDouble();
|
|
CPPUNIT_ASSERT(nX > 0 && nX < 1);
|
|
|
|
OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:y", "val");
|
|
double nY = aYVal.toDouble();
|
|
CPPUNIT_ASSERT(nY > 0 && nY < 1);
|
|
CPPUNIT_ASSERT(nX != nY);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:bodyPr", "rot", "1200000");
|
|
}
|
|
|
|
void Chart2ExportTest::testPlotAreaManualLayoutXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "plot_area_manual_layout.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", "val", "inner");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:xMode", "val", "edge");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:yMode", "val", "edge");
|
|
|
|
OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:x", "val");
|
|
double nX = aXVal.toDouble();
|
|
CPPUNIT_ASSERT(nX > 0 && nX < 1);
|
|
|
|
OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:y", "val");
|
|
double nY = aYVal.toDouble();
|
|
CPPUNIT_ASSERT(nY > 0 && nY < 1);
|
|
CPPUNIT_ASSERT(nX != nY);
|
|
|
|
OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:w", "val");
|
|
double nW = aWVal.toDouble();
|
|
CPPUNIT_ASSERT(nW > 0 && nW < 1);
|
|
|
|
OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:h", "val");
|
|
double nH = aHVal.toDouble();
|
|
CPPUNIT_ASSERT(nH > 0 && nH < 1);
|
|
CPPUNIT_ASSERT(nH != nW);
|
|
}
|
|
|
|
void Chart2ExportTest::testLegendManualLayoutXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "legend_manual_layout.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", 0);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:xMode", "val", "edge");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:yMode", "val", "edge");
|
|
|
|
OUString aXVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:x", "val");
|
|
double nX = aXVal.toDouble();
|
|
CPPUNIT_ASSERT(nX > 0 && nX < 1);
|
|
|
|
OUString aYVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:y", "val");
|
|
double nY = aYVal.toDouble();
|
|
CPPUNIT_ASSERT(nY > 0 && nY < 1);
|
|
CPPUNIT_ASSERT(nX != nY);
|
|
|
|
OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:w", "val");
|
|
double nW = aWVal.toDouble();
|
|
CPPUNIT_ASSERT(nW > 0 && nW < 1);
|
|
|
|
OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:h", "val");
|
|
double nH = aHVal.toDouble();
|
|
CPPUNIT_ASSERT(nH > 0 && nH < 1);
|
|
CPPUNIT_ASSERT(nH != nW);
|
|
|
|
// Make sure that default text font size is preserved after export
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900");
|
|
}
|
|
|
|
void Chart2ExportTest::testAxisCharacterPropertiesXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "axis_character_properties.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "sz", "1000");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "b", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "i", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:catAx/c:txPr/a:p/a:pPr/a:defRPr", "u", "sng");
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "b", "1");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr", "strike", "sngStrike");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:p/a:pPr/a:defRPr/a:solidFill/a:srgbClr", "val", "ff0000");
|
|
}
|
|
|
|
void Chart2ExportTest::testTitleCharacterPropertiesXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "title_character_properties.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "sz", "2400");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", "b", "1");
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr", "sz", "2400");
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:rPr", "b", "1");
|
|
}
|
|
|
|
void Chart2ExportTest::testPlotVisOnlyXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "hidden_cells.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotVisOnly", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testBarChartVaryColorsXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "tdf90876.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:varyColors", "val", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testMultipleAxisXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/ods/", "multiple_axis.ods");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart", 2);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart[1]/c:ser", 1);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:scatterChart[2]/c:ser", 1);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 4);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:delete[@val='1']", 1);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:axPos[@val='l']", 1);
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:axPos[@val='r']", 1);
|
|
}
|
|
|
|
void Chart2ExportTest::testAxisTitleRotationXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "axis_title_rotation.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:title/c:tx/c:rich/a:bodyPr", "rot", "0");
|
|
}
|
|
|
|
void Chart2ExportTest::testAxisCrossBetweenXSLX()
|
|
{
|
|
load("/chart2/qa/extras/data/odt/", "axis-position.odt");
|
|
xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
|
|
assertXPath(pXmlDoc, "(//c:crossBetween)[1]", "val", "midCat");
|
|
}
|
|
|
|
void Chart2ExportTest::testPieChartDataPointExplosionXLSX()
|
|
{
|
|
load("/chart2/qa/extras/data/xlsx/", "pie_chart_datapoint_explosion.xlsx");
|
|
xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dPt/c:explosion", "val", "28");
|
|
}
|
|
|
|
void Chart2ExportTest::testCustomDataLabel()
|
|
{
|
|
load("/chart2/qa/extras/data/pptx/", "tdf115107.pptx");
|
|
xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart1", "Impress MS PowerPoint 2007 XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
uno::Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
|
|
CPPUNIT_ASSERT(xDataSeries.is());
|
|
float nFontSize;
|
|
sal_Int64 nFontColor;
|
|
sal_Int32 nCharUnderline;
|
|
uno::Reference<beans::XPropertySet> xPropertySet;
|
|
uno::Sequence<uno::Reference<chart2::XDataPointCustomLabelField>> aFields;
|
|
|
|
// 1
|
|
xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_QUERY_THROW);
|
|
xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), aFields.getLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[0]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("90.0 = "), aFields[0]->getString());
|
|
aFields[0]->getPropertyValue("CharHeight") >>= nFontSize;
|
|
aFields[0]->getPropertyValue("CharColor") >>= nFontColor;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<float>(18), nFontSize);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xed7d31), nFontColor);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[1]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("90"), aFields[1]->getString());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("{0C576297-5A9F-4B4E-A675-B6BA406B7D87}"), aFields[1]->getGuid());
|
|
|
|
// 2
|
|
xPropertySet.set(xDataSeries->getDataPointByIndex(1), uno::UNO_QUERY_THROW);
|
|
xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(8), aFields.getLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[0]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Text"), aFields[0]->getString());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString(" : "), aFields[1]->getString());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_CATEGORYNAME, aFields[2]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("B"), aFields[2]->getString());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("{0CCAAACD-B393-42CE-8DBD-82F9F9ADC852}"), aFields[2]->getGuid());
|
|
aFields[2]->getPropertyValue("CharHeight") >>= nFontSize;
|
|
aFields[2]->getPropertyValue("CharColor") >>= nFontColor;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<float>(16), nFontSize);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xed7d31), nFontColor);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_NEWLINE, aFields[3]->getFieldType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[4]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Multi"), aFields[4]->getString());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[5]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("line"), aFields[5]->getString());
|
|
aFields[5]->getPropertyValue("CharHeight") >>= nFontSize;
|
|
aFields[5]->getPropertyValue("CharColor") >>= nFontColor;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<float>(13), nFontSize);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xbf9000), nFontColor);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_NEWLINE, aFields[6]->getFieldType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[7]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Abc"), aFields[7]->getString());
|
|
aFields[7]->getPropertyValue("CharHeight") >>= nFontSize;
|
|
aFields[7]->getPropertyValue("CharColor") >>= nFontColor;
|
|
aFields[7]->getPropertyValue("CharUnderline") >>= nCharUnderline;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<float>(12), nFontSize);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xa9d18e), nFontColor);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nCharUnderline);
|
|
|
|
// 3
|
|
xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_QUERY_THROW);
|
|
xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aFields.getLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[0]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("DATA"), aFields[0]->getString());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("{C8F3EB90-8960-4F9A-A3AD-B4FAC4FE4566}"), aFields[0]->getGuid());
|
|
|
|
// 4
|
|
xPropertySet.set(xDataSeries->getDataPointByIndex(3), uno::UNO_QUERY_THROW);
|
|
xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), aFields.getLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_CELLREF, aFields[0]->getFieldType());
|
|
//CPPUNIT_ASSERT_EQUAL(OUString("70"), aFields[0]->getString()); TODO: Not implemented yet
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString(" <CELLREF"), aFields[1]->getString());
|
|
}
|
|
|
|
void Chart2ExportTest::testCustomDataLabelMultipleSeries()
|
|
{
|
|
load("/chart2/qa/extras/data/pptx/", "tdf115107-2.pptx");
|
|
xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart2", "Impress MS PowerPoint 2007 XML");
|
|
CPPUNIT_ASSERT(pXmlDoc);
|
|
|
|
Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 0), uno::UNO_QUERY);
|
|
CPPUNIT_ASSERT(xChartDoc.is());
|
|
|
|
uno::Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
|
|
CPPUNIT_ASSERT(xDataSeries.is());
|
|
float nFontSize;
|
|
sal_Int64 nFontColor;
|
|
uno::Reference<beans::XPropertySet> xPropertySet;
|
|
uno::Sequence<uno::Reference<chart2::XDataPointCustomLabelField>> aFields;
|
|
|
|
// First series
|
|
xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_QUERY_THROW);
|
|
xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), aFields.getLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[0]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("4.3"), aFields[0]->getString());
|
|
aFields[0]->getPropertyValue("CharHeight") >>= nFontSize;
|
|
aFields[0]->getPropertyValue("CharColor") >>= nFontColor;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<float>(18), nFontSize);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xc00000), nFontColor);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString(" "), aFields[1]->getString());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[2]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Bars"), aFields[2]->getString());
|
|
|
|
// Second series
|
|
xDataSeries = uno::Reference<chart2::XDataSeries>(getDataSeriesFromDoc(xChartDoc, 0, 1));
|
|
CPPUNIT_ASSERT(xDataSeries.is());
|
|
|
|
xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_QUERY_THROW);
|
|
xPropertySet->getPropertyValue("CustomLabelFields") >>= aFields;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), aFields.getLength());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_VALUE, aFields[0]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("2"), aFields[0]->getString());
|
|
aFields[0]->getPropertyValue("CharHeight") >>= nFontSize;
|
|
aFields[0]->getPropertyValue("CharColor") >>= nFontColor;
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<float>(18), nFontSize);
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int64>(0xffd966), nFontColor);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_TEXT, aFields[1]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString(" "), aFields[1]->getString());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType::DataPointCustomLabelFieldType_SERIESNAME, aFields[2]->getFieldType());
|
|
CPPUNIT_ASSERT_EQUAL(OUString("Line"), aFields[2]->getString());
|
|
|
|
}
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ExportTest);
|
|
|
|
CPPUNIT_PLUGIN_IMPLEMENT();
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|