summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chart2/qa/extras/PivotChartTest.cxx206
1 files changed, 206 insertions, 0 deletions
diff --git a/chart2/qa/extras/PivotChartTest.cxx b/chart2/qa/extras/PivotChartTest.cxx
index 20a37b72595f..f1a345fa964c 100644
--- a/chart2/qa/extras/PivotChartTest.cxx
+++ b/chart2/qa/extras/PivotChartTest.cxx
@@ -10,6 +10,8 @@
#include "charttest.hxx"
#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
+#include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
+#include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
#include <com/sun/star/sheet/XDataPilotTable.hpp>
#include <com/sun/star/sheet/XDataPilotDescriptor.hpp>
#include <com/sun/star/sheet/XDataPilotTables.hpp>
@@ -23,6 +25,7 @@
#include <com/sun/star/sheet/GeneralFunction.hpp>
#include <com/sun/star/chart2/data/XPivotTableDataProvider.hpp>
+#include <com/sun/star/chart2/data/XTextualDataSequence.hpp>
#include <rtl/strbuf.hxx>
@@ -39,6 +42,7 @@ public:
void testPivotChartWithOneColumnField();
void testPivotChartWithOneRowField();
void testPivotTableDataProvider_PivotTableFields();
+ void testPivotChartRowFieldInOutlineMode();
CPPUNIT_TEST_SUITE(PivotChartTest);
CPPUNIT_TEST(testRoundtrip);
@@ -46,6 +50,7 @@ public:
CPPUNIT_TEST(testPivotChartWithOneColumnField);
CPPUNIT_TEST(testPivotChartWithOneRowField);
CPPUNIT_TEST(testPivotTableDataProvider_PivotTableFields);
+ CPPUNIT_TEST(testPivotChartRowFieldInOutlineMode);
CPPUNIT_TEST_SUITE_END();
};
@@ -84,6 +89,46 @@ void lclModifyFunction(uno::Reference<sheet::XDataPilotDescriptor> const & xDesc
}
}
+void lclModifyLayoutInfo(uno::Reference<sheet::XDataPilotDescriptor> const & xDescriptor,
+ OUString const & sFieldName,
+ sheet::DataPilotFieldLayoutInfo aLayoutInfo)
+{
+ uno::Reference<container::XIndexAccess> xIndexAccess(xDescriptor->getDataPilotFields(), UNO_QUERY_THROW);
+ sal_Int32 nCount = xIndexAccess->getCount();
+ for (sal_Int32 i = 0; i < nCount; ++i)
+ {
+ uno::Reference<container::XNamed> xNamed(xIndexAccess->getByIndex(i), UNO_QUERY_THROW);
+ OUString aName = xNamed->getName();
+ uno::Reference<beans::XPropertySet> xPropSet(xNamed, UNO_QUERY_THROW);
+ if (aName == sFieldName)
+ {
+ uno::Any aValue;
+ aValue <<= aLayoutInfo;
+ xPropSet->setPropertyValue("LayoutInfo", aValue);
+ }
+ }
+}
+
+void lclModifySubtotals(uno::Reference<sheet::XDataPilotDescriptor> const & xDescriptor,
+ OUString const & sFieldName,
+ uno::Sequence<sheet::GeneralFunction> const & rSubtotalFunctions)
+{
+ uno::Reference<container::XIndexAccess> xIndexAccess(xDescriptor->getDataPilotFields(), UNO_QUERY_THROW);
+ sal_Int32 nCount = xIndexAccess->getCount();
+ for (sal_Int32 i = 0; i < nCount; ++i)
+ {
+ uno::Reference<container::XNamed> xNamed(xIndexAccess->getByIndex(i), UNO_QUERY_THROW);
+ OUString aName = xNamed->getName();
+ uno::Reference<beans::XPropertySet> xPropSet(xNamed, UNO_QUERY_THROW);
+ if (aName == sFieldName)
+ {
+ uno::Any aValue;
+ aValue <<= rSubtotalFunctions;
+ xPropSet->setPropertyValue("Subtotals", aValue);
+ }
+ }
+}
+
void lclModifyColumnGrandTotal(uno::Reference<sheet::XDataPilotDescriptor> const & xDataPilotDescriptor, bool bTotal)
{
uno::Reference<beans::XPropertySet> xProperties(xDataPilotDescriptor, uno::UNO_QUERY_THROW);
@@ -108,6 +153,19 @@ void lclCheckSequence(std::vector<double> const & reference,
}
}
+void lclCheckCategories(std::vector<OUString> const & reference,
+ uno::Reference<chart2::data::XDataSequence> const & xSequence)
+{
+ uno::Reference<chart2::data::XTextualDataSequence> xTextualDataSequence(xSequence, uno::UNO_QUERY_THROW);
+ uno::Sequence<OUString> aText = xTextualDataSequence->getTextualData();
+
+ CPPUNIT_ASSERT_EQUAL(reference.size(), size_t(aText.getLength()));
+ for (size_t i = 0; i < reference.size(); ++i)
+ {
+ CPPUNIT_ASSERT_EQUAL(reference[i], aText[i]);
+ }
+}
+
OUString lclGetLabel(Reference<chart2::XChartDocument> const & xChartDoc, sal_Int32 nSeriesIndex)
{
Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, nSeriesIndex);
@@ -127,6 +185,18 @@ uno::Reference<sheet::XDataPilotTable> lclGetPivotTableByName(sal_Int32 nIndex,
return uno::Reference<sheet::XDataPilotTable>(xDataPilotTables->getByName(sPivotTableName), UNO_QUERY_THROW);
}
+uno::Sequence<uno::Reference<chart2::data::XLabeledDataSequence>>
+ lclGetCategories(Reference<chart2::XChartDocument> const & xChartDoc)
+{
+ uno::Sequence<beans::PropertyValue> aArguments(1);
+ aArguments[0] = beans::PropertyValue("CellRangeRepresentation", -1,
+ uno::makeAny<OUString>("PT@categories"),
+ beans::PropertyState_DIRECT_VALUE);
+
+ uno::Reference<chart2::data::XDataProvider> xDataProvider(xChartDoc->getDataProvider(), uno::UNO_QUERY_THROW);
+ return xDataProvider->createDataSource(aArguments)->getDataSequences();
+}
+
struct Value
{
OUString maString;
@@ -711,6 +781,142 @@ void PivotChartTest::testPivotTableDataProvider_PivotTableFields()
CPPUNIT_ASSERT_EQUAL(OUString("Sum - Sales T2"), aFieldEntries[1].Name);
}
+void PivotChartTest::testPivotChartRowFieldInOutlineMode()
+{
+ // SETUP DATA and PIVOT TABLE
+
+ if (!mxComponent.is())
+ mxComponent = loadFromDesktop("private:factory/scalc");
+
+ uno::Reference<sheet::XSpreadsheetDocument> xSheetDoc(mxComponent, uno::UNO_QUERY_THROW);
+
+ sal_Int32 nSheetIndex = 0;
+ OUString sPivotTableName("DataPilotTable");
+
+ table::CellRangeAddress sCellRangeAdress = lclCreateTestData(xSheetDoc);
+
+ uno::Reference<sheet::XDataPilotTables> xDataPilotTables;
+ xDataPilotTables = lclGetDataPilotTables(nSheetIndex, xSheetDoc);
+
+ uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor;
+ xDataPilotDescriptor = xDataPilotTables->createDataPilotDescriptor();
+ xDataPilotDescriptor->setSourceRange(sCellRangeAdress);
+
+ lclModifyOrientation(xDataPilotDescriptor, "Country", sheet::DataPilotFieldOrientation_ROW);
+ lclModifyOrientation(xDataPilotDescriptor, "City", sheet::DataPilotFieldOrientation_ROW);
+ lclModifyOrientation(xDataPilotDescriptor, "Sales T1", sheet::DataPilotFieldOrientation_DATA);
+ lclModifyFunction(xDataPilotDescriptor, "Sales T1", sheet::GeneralFunction_SUM);
+ xDataPilotTables->insertNewByName(sPivotTableName, table::CellAddress{1, 0, 0}, xDataPilotDescriptor);
+
+ // TEST
+ uno::Sequence<uno::Any> xSequence;
+ Reference<chart2::XChartDocument> xChartDoc;
+
+ // Check we have the Pivot Table
+ uno::Reference<sheet::XDataPilotTable> xDataPilotTable = lclGetPivotTableByName(1, sPivotTableName, mxComponent);
+ CPPUNIT_ASSERT(xDataPilotTable.is());
+
+ // refetch the XDataPilotDescriptor
+ xDataPilotDescriptor.set(xDataPilotTable, uno::UNO_QUERY_THROW);
+
+ // Check that we don't have any pivot chart in the document
+ uno::Reference<table::XTablePivotCharts> xTablePivotCharts = getTablePivotChartsFromSheet(1, mxComponent);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xTablePivotCharts, UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount());
+
+ // Create a new pivot chart
+ xTablePivotCharts->addNewByName("PivotChart", awt::Rectangle{ 9000, 9000, 21000, 18000 }, sPivotTableName);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount());
+
+ // Get the pivot chart document so we ca access its data
+ xChartDoc.set(getPivotChartDocFromSheet(xTablePivotCharts, 0));
+
+ CPPUNIT_ASSERT(xChartDoc.is());
+
+ // Test case with defaults
+
+ // Check when using defaults the data is as expected
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getNumberOfDataSeries(xChartDoc));
+ {
+ std::vector<double> aReference { 1116.0, 622.0, 298.0, 562.0, 1143.0, 1168.0, 768.0 };
+ OUString aExpectedLabel("Total");
+
+ xSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0)->getData();
+ lclCheckSequence(aReference, xSequence, 1E-4);
+
+ CPPUNIT_ASSERT_EQUAL(aExpectedLabel, lclGetLabel(xChartDoc, 0));
+ }
+ // Check the categories
+ {
+ lclCheckCategories({ "DE", "", "EN", "", "", "FR", ""},
+ lclGetCategories(xChartDoc)[0]->getValues());
+ lclCheckCategories({ "Berlin", "Munich", "Glasgow", "Liverpool", "London", "Nantes", "Paris"},
+ lclGetCategories(xChartDoc)[1]->getValues());
+ }
+
+ sheet::DataPilotFieldLayoutInfo aLayoutInfoValue;
+ uno::Sequence<sheet::GeneralFunction> aGeneralFunctionSequence(1);
+
+ // Test case where we enable subtotals (auto) and set the outline subtotals at the bottom
+ // We don't expect any change in data as every extra subtotal row should be ignored
+
+ // Enable subtotals - set to auto
+ aGeneralFunctionSequence[0] = sheet::GeneralFunction_AUTO;
+ lclModifySubtotals(xDataPilotDescriptor, "Country", aGeneralFunctionSequence);
+ // Set Subtotals layout to bottom + add empty lines
+ aLayoutInfoValue.AddEmptyLines = true;
+ aLayoutInfoValue.LayoutMode = sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM;
+ lclModifyLayoutInfo(xDataPilotDescriptor, "Country", aLayoutInfoValue);
+
+ // Check data is unchanged
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getNumberOfDataSeries(xChartDoc));
+ {
+ std::vector<double> aReference { 1116.0, 622.0, 298.0, 562.0, 1143.0, 1168.0, 768.0 };
+ OUString aExpectedLabel("Total");
+
+ xSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0)->getData();
+ lclCheckSequence(aReference, xSequence, 1E-4);
+
+ CPPUNIT_ASSERT_EQUAL(aExpectedLabel, lclGetLabel(xChartDoc, 0));
+ }
+ // Check categories
+ {
+ lclCheckCategories({ "DE", "", "EN", "", "", "FR", ""},
+ lclGetCategories(xChartDoc)[0]->getValues());
+ lclCheckCategories({ "Berlin", "Munich", "Glasgow", "Liverpool", "London", "Nantes", "Paris"},
+ lclGetCategories(xChartDoc)[1]->getValues());
+ }
+
+ // Test case where we enable subtotals (auto) and set the outline subtotals at the top
+ // We don't expect any change in data as every extra subtotal row should be ignored
+
+ // Enable subtotals - set to auto
+ aGeneralFunctionSequence[0] = sheet::GeneralFunction_AUTO;
+ lclModifySubtotals(xDataPilotDescriptor, "Country", aGeneralFunctionSequence);
+ // Set Subtotals layout to top + add empty lines
+ aLayoutInfoValue.AddEmptyLines = true;
+ aLayoutInfoValue.LayoutMode = sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP;
+ lclModifyLayoutInfo(xDataPilotDescriptor, "Country", aLayoutInfoValue);
+
+ // Check data is unchanged
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getNumberOfDataSeries(xChartDoc));
+ {
+ std::vector<double> aReference { 1116.0, 622.0, 298.0, 562.0, 1143.0, 1168.0, 768.0 };
+ OUString aExpectedLabel("Total");
+
+ xSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0)->getData();
+ lclCheckSequence(aReference, xSequence, 1E-4);
+
+ CPPUNIT_ASSERT_EQUAL(aExpectedLabel, lclGetLabel(xChartDoc, 0));
+ }
+ // Check categories
+ {
+ lclCheckCategories({ "DE", "", "EN", "", "", "FR", ""},
+ lclGetCategories(xChartDoc)[0]->getValues());
+ lclCheckCategories({ "Berlin", "Munich", "Glasgow", "Liverpool", "London", "Nantes", "Paris"},
+ lclGetCategories(xChartDoc)[1]->getValues());
+ }
+}
CPPUNIT_TEST_SUITE_REGISTRATION(PivotChartTest);