summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Francis <dennis.francis@collabora.com>2019-01-13 21:39:25 +0530
committerDennis Francis <dennis.francis@collabora.com>2019-01-25 09:28:06 +0100
commitab9ea7f10e259e9d49bba72797fc7b252ab70868 (patch)
tree202ab33378ecce71384fa0df9f9482b3a14bccc3
parent128369d6c853b5541abe08b240ece0abe7c28a4c (diff)
Adds a unit test for multiple formula-groups...
in a single column with another formula group depending on this column. This is to protect the correctness of such a case before introducing a patch that allows the computation of just a portion (span) of a formula-group in threaded group calc mode. Change-Id: Ia685f05290aac1839816e4bdd8562766e68c8da4 Reviewed-on: https://gerrit.libreoffice.org/66840 Tested-by: Jenkins Reviewed-by: Dennis Francis <dennis.francis@collabora.com>
-rw-r--r--sc/qa/unit/parallelism.cxx64
1 files changed, 64 insertions, 0 deletions
diff --git a/sc/qa/unit/parallelism.cxx b/sc/qa/unit/parallelism.cxx
index f8f5db920c45..670e7242645d 100644
--- a/sc/qa/unit/parallelism.cxx
+++ b/sc/qa/unit/parallelism.cxx
@@ -37,6 +37,7 @@ public:
void testSUMIFImplicitRange();
void testFGCycleWithPlainFormulaCell1();
void testFGCycleWithPlainFormulaCell2();
+ void testMultipleFGColumn();
CPPUNIT_TEST_SUITE(ScParallelismTest);
CPPUNIT_TEST(testSUMIFS);
@@ -47,6 +48,7 @@ public:
CPPUNIT_TEST(testSUMIFImplicitRange);
CPPUNIT_TEST(testFGCycleWithPlainFormulaCell1);
CPPUNIT_TEST(testFGCycleWithPlainFormulaCell2);
+ CPPUNIT_TEST(testMultipleFGColumn);
CPPUNIT_TEST_SUITE_END();
private:
@@ -471,6 +473,68 @@ void ScParallelismTest::testFGCycleWithPlainFormulaCell2()
m_pDoc->DeleteTab(0);
}
+static void lcl_setupMultipleFGColumn(ScDocument* pDocument, size_t nNumRowsInBlock, size_t nNumFG, size_t nOffset)
+{
+ OUString aFormula;
+ ScAddress aAddr(1, 0, 0);
+ // Column B with multiple FG's
+ for (size_t nFGIdx = 0; nFGIdx < nNumFG; ++nFGIdx)
+ {
+ size_t nRowStart = 2*nFGIdx*nNumRowsInBlock;
+ for (size_t nRow = nRowStart; nRow < (nRowStart + nNumRowsInBlock); ++nRow)
+ {
+ aAddr.SetRow(nRow);
+ aFormula = "=$C" + OUString::number(nRow+1) + " + 0";
+ pDocument->SetFormula(aAddr, aFormula,
+ formula::FormulaGrammar::GRAM_NATIVE_UI);
+ // Fill Column C with doubles.
+ pDocument->SetValue(2, nRow, 0, static_cast<double>(nFGIdx));
+ }
+ }
+
+ // Column A with a single FG that depends on Column B.
+ size_t nNumRowsInRef = nNumRowsInBlock*2;
+ size_t nColAFGLen = 2*nNumRowsInBlock*nNumFG - nNumRowsInRef + 1;
+ aAddr.SetCol(0);
+ for (size_t nRow = nOffset; nRow < nColAFGLen; ++nRow)
+ {
+ aAddr.SetRow(nRow);
+ aFormula = "=SUM($B" + OUString::number(nRow+1) + ":$B" + OUString::number(nRow+nNumRowsInRef) + ")";
+ pDocument->SetFormula(aAddr, aFormula,
+ formula::FormulaGrammar::GRAM_NATIVE_UI);
+ }
+}
+
+void ScParallelismTest::testMultipleFGColumn()
+{
+ sc::AutoCalcSwitch aACSwitch(*m_pDoc, false);
+ m_pDoc->InsertTab(0, "1");
+
+ size_t nNumRowsInBlock = 200;
+ size_t nNumFG = 50;
+ size_t nNumRowsInRef = nNumRowsInBlock*2;
+ size_t nColAFGLen = 2*nNumRowsInBlock*nNumFG - nNumRowsInRef + 1;
+ size_t nColAStartOffset = nNumRowsInBlock/2;
+ lcl_setupMultipleFGColumn(m_pDoc, nNumRowsInBlock, nNumFG, nColAStartOffset);
+
+ m_xDocShell->DoHardRecalc();
+
+ OString aMsg;
+ // First cell in the FG in col A references nColAStartOffset cells in second formula-group of column B each having value 1.
+ size_t nExpected = nColAStartOffset;
+ size_t nIn = 0, nOut = 0;
+ for (size_t nRow = nColAStartOffset; nRow < nColAFGLen; ++nRow)
+ {
+ aMsg = "Value at Cell A" + OString::number(nRow+1);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aMsg.getStr(), nExpected, static_cast<size_t>(m_pDoc->GetValue(0, nRow, 0)));
+ nIn = static_cast<size_t>(m_pDoc->GetValue(2, nRow+nNumRowsInRef, 0));
+ nOut = static_cast<size_t>(m_pDoc->GetValue(2, nRow, 0));
+ nExpected = nExpected + nIn - nOut;
+ }
+
+ m_pDoc->DeleteTab(0);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(ScParallelismTest);
CPPUNIT_PLUGIN_IMPLEMENT();