unit test for MDETERM() tdf#32834
Change-Id: Icc55931f5bc64fcc2745ca68f62851ee2c59f711
Reviewed-on: https://gerrit.libreoffice.org/19569
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 29ca1e0..b1a6af2 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -193,6 +193,7 @@ public:
void testFuncGCD();
void testFuncLCM();
void testFuncSUMSQ();
void testFuncMDETERM();
void testExternalRef();
void testExternalRefFunctions();
@@ -534,6 +535,7 @@ public:
CPPUNIT_TEST(testFuncGCD);
CPPUNIT_TEST(testFuncLCM);
CPPUNIT_TEST(testFuncSUMSQ);
CPPUNIT_TEST(testFuncMDETERM);
CPPUNIT_TEST(testExternalRef);
CPPUNIT_TEST(testExternalRangeName);
CPPUNIT_TEST(testExternalRefFunctions);
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index 8538eae..1e0c06b 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -6572,6 +6572,46 @@ void Test::testFuncSUMSQ()
m_pDoc->DeleteTab(0);
}
void Test::testFuncMDETERM()
{
sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn auto calc on.
m_pDoc->InsertTab(0, "MDETERM_test");
ScAddress aPos(8,0,0);
OUString aColCodes("ABCDEFGH");
OUString aFormulaTemplate("=MDETERM(A1:B2)");
OUStringBuffer aFormulaBuffer(aFormulaTemplate);
for( SCSIZE nSize = 3; nSize <= 8; nSize++ )
{
double fVal = 1.0;
// Generate a singular integer matrix
for( SCROW nRow = 0; nRow < static_cast<SCROW>(nSize); nRow++ )
{
for( SCCOL nCol = 0; nCol < static_cast<SCCOL>(nSize); nCol++ )
{
m_pDoc->SetValue(nCol, nRow, 0, fVal);
fVal += 1.0;
}
}
aFormulaBuffer[12] = aColCodes[nSize-1];
aFormulaBuffer[13] = static_cast<sal_Unicode>( '0' + nSize );
m_pDoc->SetString(aPos, aFormulaBuffer.toString());
CPPUNIT_ASSERT_EQUAL_MESSAGE("Calculation of MDETERM incorrect for singular integer matrix",
0.0, m_pDoc->GetValue(aPos));
}
int aVals[] = {23, 31, 13, 12, 34, 64, 34, 31, 98, 32, 33, 63, 45, 54, 65, 76};
int nIdx = 0;
for( SCROW nRow = 0; nRow < 4; nRow++ )
for( SCCOL nCol = 0; nCol < 4; nCol++ )
m_pDoc->SetValue(nCol, nRow, 0, static_cast<double>(aVals[nIdx++]));
m_pDoc->SetString(aPos, "=MDETERM(A1:D4)");
// Following test is conservative in the sense that on Linux x86_64 the error is less that 1.0E-9
CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Calculation of MDETERM incorrect for non-singular integer matrix",
-180655.0, m_pDoc->GetValue(aPos), 1.0E-6);
m_pDoc->DeleteTab(0);
}
void Test::testFormulaErrorPropagation()
{
sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn auto calc on.