[Libreoffice-commits] core.git: sc/qa
Eike Rathke
erack at redhat.com
Mon Jul 27 10:52:10 PDT 2015
sc/qa/unit/ucalc.hxx | 2
sc/qa/unit/ucalc_formula.cxx | 126 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 128 insertions(+)
New commits:
commit 96aecd7ff882e96ecf8db1f649037ad011a17899
Author: Eike Rathke <erack at redhat.com>
Date: Mon Jul 27 19:48:54 2015 +0200
TableRef: add unit tests
Change-Id: Ic635188f9ebefcfd49f71c3d61405e5f4765d940
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 3b24c85..759d65d 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -182,6 +182,7 @@ public:
void testMatrixOp();
void testFuncRangeOp();
void testFuncFORMULA();
+ void testFuncTableRef();
void testExternalRef();
void testExternalRefFunctions();
@@ -510,6 +511,7 @@ public:
CPPUNIT_TEST(testMatrixOp);
CPPUNIT_TEST(testFuncRangeOp);
CPPUNIT_TEST(testFuncFORMULA);
+ CPPUNIT_TEST(testFuncTableRef);
CPPUNIT_TEST(testExternalRef);
CPPUNIT_TEST(testExternalRefFunctions);
CPPUNIT_TEST(testCopyToDocument);
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index b6a6933..38ac04a 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -5366,4 +5366,130 @@ void Test::testFuncFORMULA()
m_pDoc->DeleteTab(0);
}
+void Test::testFuncTableRef()
+{
+ sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
+
+ m_pDoc->InsertTab(0, "Sheet1");
+
+ {
+ ScDBCollection* pDBs = m_pDoc->GetDBCollection();
+ CPPUNIT_ASSERT_MESSAGE("Failed to fetch DB collection object.", pDBs);
+
+ // Insert "table" database range definition for A1:B4, with default
+ // HasHeader=true and HasTotals=false.
+ ScDBData* pData = new ScDBData( "table", 0,0,0, 1,3);
+ bool bInserted = pDBs->getNamedDBs().insert(pData);
+ CPPUNIT_ASSERT_MESSAGE( "Failed to insert \"table\" database range.", bInserted);
+ }
+
+ {
+ // Populate "table" database range with headers and data in A1:B4
+ const char* aData[][2] = {
+ { "Header1", "Header2" },
+ { "1", "2" },
+ { "4", "8" },
+ { "16", "32" }
+ };
+ ScAddress aPos(0,0,0);
+ ScRange aRange = insertRangeData(m_pDoc, aPos, aData, SAL_N_ELEMENTS(aData));
+ CPPUNIT_ASSERT(aRange.aStart == aPos);
+ }
+
+ // Named expressions that use Table structured references.
+ /* TODO: should the item/header separator really be equal to the parameter
+ * separator, thus be locale dependent and ';' semicolon here, or should it
+ * be a fixed ',' comma instead? */
+ struct {
+ const char* pName;
+ const char* pExpr;
+ const char* pCounta; // expected result when used in row 2 (first data row) as argument to COUNTA()
+ const char* pSum3; // expected result when used in row 3 (second data row) as argument to SUM().
+ const char* pSum4; // expected result when used in row 4 (third data row) as argument to SUM().
+ const char* pSumX; // expected result when used in row 5 (non-intersecting) as argument to SUM().
+ } aNames[] = {
+ { "all", "table[[#All]]", "8", "63", "63", "63" },
+ { "data_implicit", "table[]", "6", "63", "63", "63" },
+ { "data", "table[[#Data]]", "6", "63", "63", "63" },
+ { "headers", "table[[#Headers]]", "2", "0", "0", "0" },
+ { "header1", "table[[Header1]]", "3", "21", "21", "21" },
+ { "header2", "table[[Header2]]", "3", "42", "42", "42" },
+ { "data_header1", "table[[#Data];[Header1]]", "3", "21", "21", "21" },
+ { "data_header2", "table[[#Data];[Header2]]", "3", "42", "42", "42" },
+ { "this_row", "table[[#This Row]]", "2", "12", "48", "#VALUE!" },
+ { "this_row_header1", "table[[#This Row];[Header1]]", "1", "4", "16", "#VALUE!" },
+ { "this_row_header2", "table[[#This Row];[Header2]]", "1", "8", "32", "#VALUE!" },
+ { "this_row_range_header_1_to_2", "table[[#This Row];[Header1]:[Header2]]", "2", "12", "48", "#VALUE!" }
+ };
+
+ {
+ // Insert named expressions.
+ ScRangeName* pGlobalNames = m_pDoc->GetRangeName();
+ CPPUNIT_ASSERT_MESSAGE("Failed to obtain global named expression object.", pGlobalNames);
+
+ for (size_t i = 0, n = SAL_N_ELEMENTS(aNames); i < n; ++i)
+ {
+ // Choose base position that does not intersect with the database
+ // range definition to test later use of [#This Row] results in
+ // proper rows.
+ ScRangeData* pName = new ScRangeData(
+ m_pDoc, OUString::createFromAscii(aNames[i].pName), OUString::createFromAscii(aNames[i].pExpr),
+ ScAddress(2,4,0), RT_NAME, formula::FormulaGrammar::GRAM_NATIVE);
+ bool bInserted = pGlobalNames->insert(pName);
+ CPPUNIT_ASSERT_MESSAGE(
+ OString("Failed to insert named expression "+ OString(aNames[i].pName) +".").getStr(), bInserted);
+ }
+ }
+
+ // Use the named expressions in COUNTA() formulas, on row 2 that intersects.
+ for (size_t i = 0, n = SAL_N_ELEMENTS(aNames); i < n; ++i)
+ {
+ OUString aFormula( "=COUNTA(" + OUString::createFromAscii( aNames[i].pName) + ")");
+ ScAddress aPos(3+i,1,0);
+ m_pDoc->SetString( aPos, aFormula);
+ // For easier "debugability" have position and formula in assertion.
+ OUString aPrefix( aPos.Format(SCA_VALID) + " " + aFormula + " : ");
+ CPPUNIT_ASSERT_EQUAL( aPrefix + OUString::createFromAscii( aNames[i].pCounta),
+ aPrefix + m_pDoc->GetString( aPos));
+ }
+
+ // Use the named expressions in SUM() formulas, on row 3 that intersects.
+ for (size_t i = 0, n = SAL_N_ELEMENTS(aNames); i < n; ++i)
+ {
+ OUString aFormula( "=SUM(" + OUString::createFromAscii( aNames[i].pName) + ")");
+ ScAddress aPos(3+i,2,0);
+ m_pDoc->SetString( aPos, aFormula);
+ // For easier "debugability" have position and formula in assertion.
+ OUString aPrefix( aPos.Format(SCA_VALID) + " " + aFormula + " : ");
+ CPPUNIT_ASSERT_EQUAL( aPrefix + OUString::createFromAscii( aNames[i].pSum3),
+ aPrefix + m_pDoc->GetString( aPos));
+ }
+
+ // Use the named expressions in SUM() formulas, on row 4 that intersects.
+ for (size_t i = 0, n = SAL_N_ELEMENTS(aNames); i < n; ++i)
+ {
+ OUString aFormula( "=SUM(" + OUString::createFromAscii( aNames[i].pName) + ")");
+ ScAddress aPos(3+i,3,0);
+ m_pDoc->SetString( aPos, aFormula);
+ // For easier "debugability" have position and formula in assertion.
+ OUString aPrefix( aPos.Format(SCA_VALID) + " " + aFormula + " : ");
+ CPPUNIT_ASSERT_EQUAL( aPrefix + OUString::createFromAscii( aNames[i].pSum4),
+ aPrefix + m_pDoc->GetString( aPos));
+ }
+
+ // Use the named expressions in SUM() formulas, on row 5 that does not intersect.
+ for (size_t i = 0, n = SAL_N_ELEMENTS(aNames); i < n; ++i)
+ {
+ OUString aFormula( "=SUM(" + OUString::createFromAscii( aNames[i].pName) + ")");
+ ScAddress aPos(3+i,4,0);
+ m_pDoc->SetString( aPos, aFormula);
+ // For easier "debugability" have position and formula in assertion.
+ OUString aPrefix( aPos.Format(SCA_VALID) + " " + aFormula + " : ");
+ CPPUNIT_ASSERT_EQUAL( aPrefix + OUString::createFromAscii( aNames[i].pSumX),
+ aPrefix + m_pDoc->GetString( aPos));
+ }
+
+ m_pDoc->DeleteTab(0);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list