sc/qa/unit/ucalc.hxx | 2 + sc/qa/unit/ucalc_formula.cxx | 50 +++++++++++++++++++++++++++++++++++++++ sc/source/core/tool/scmatrix.cxx | 12 +++++++-- 3 files changed, 62 insertions(+), 2 deletions(-)
New commits: commit 5233971396b2ed8e280ad68912e1a55e803f3856 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Apr 28 13:44:18 2014 -0400 Add a bit more test code to test the normal use cases of MIN. Change-Id: Iad1e120dff49d569e5fb66905e5fe28462759c5a diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index de1fd11..1ecc5d2 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -2292,6 +2292,18 @@ void Test::testFuncMIN() CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(ScAddress(2,0,0))); CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(ScAddress(2,1,0))); + // Inline array input (A4). + m_pDoc->SetString(ScAddress(0,3,0), "=MIN({-2;4;3})"); + CPPUNIT_ASSERT_EQUAL(-2.0, m_pDoc->GetValue(ScAddress(0,3,0))); + + // Add more values to B3:B4. + m_pDoc->SetValue(ScAddress(1,2,0), 20.0); + m_pDoc->SetValue(ScAddress(1,3,0), -20.0); + + // Get the MIN of B1:B4. + m_pDoc->SetString(ScAddress(2,4,0), "=MIN(B1:B4)"); + CPPUNIT_ASSERT_EQUAL(-20.0, m_pDoc->GetValue(ScAddress(2,4,0))); + m_pDoc->DeleteTab(0); } commit 453ea919e70fa9832f11e3ef042bb80cd86892cc Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Apr 28 13:33:08 2014 -0400 fdo#77969: Return 0 in case of matrix consisting of all empty elements. Change-Id: I225d50445d7f84a17c0b9492c17247e4c1c9ef44 diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx index 32da95a..f21baed 100644 --- a/sc/source/core/tool/scmatrix.cxx +++ b/sc/source/core/tool/scmatrix.cxx @@ -1235,12 +1235,14 @@ class CalcMaxMinValue : std::unary_function<MatrixImplType::element_block_type, { double mfVal; bool mbTextAsZero; + bool mbHasValue; public: CalcMaxMinValue( bool bTextAsZero ) : mfVal(_Op::init()), - mbTextAsZero(bTextAsZero) {} + mbTextAsZero(bTextAsZero), + mbHasValue(false) {} - double getValue() const { return mfVal; } + double getValue() const { return mbHasValue ? mfVal : 0.0; } void operator() (const MatrixImplType::element_block_node_type& node) { @@ -1255,6 +1257,8 @@ public: block_type::const_iterator itEnd = block_type::end(*node.data); for (; it != itEnd; ++it) mfVal = _Op::compare(mfVal, *it); + + mbHasValue = true; } break; case mdds::mtm::element_boolean: @@ -1265,6 +1269,7 @@ public: block_type::const_iterator itEnd = block_type::end(*node.data); double fVal = _Op::boolValue(it, itEnd); mfVal = _Op::compare(mfVal, fVal); + mbHasValue = true; } break; case mdds::mtm::element_string: @@ -1272,7 +1277,10 @@ public: { // empty elements are treated as empty strings. if (mbTextAsZero) + { mfVal = _Op::compare(mfVal, 0.0); + mbHasValue = true; + } } break; default: commit a4a5f67008a931508a9d963f6b95db9cb9d45aef Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Apr 28 13:23:12 2014 -0400 fdo#77969: Write test for this corner case. Change-Id: Iac8a3d0693456a380d3290c7be06136b04b50390 diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index 71b33a7..9a81c5e 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -130,6 +130,7 @@ public: void testFuncSUM(); void testFuncPRODUCT(); void testFuncSUMPRODUCT(); + void testFuncMIN(); void testFuncN(); void testFuncCOUNTIF(); void testFuncNUMBERVALUE(); @@ -381,6 +382,7 @@ public: CPPUNIT_TEST(testFuncSUM); CPPUNIT_TEST(testFuncPRODUCT); CPPUNIT_TEST(testFuncSUMPRODUCT); + CPPUNIT_TEST(testFuncMIN); CPPUNIT_TEST(testFuncN); CPPUNIT_TEST(testFuncCOUNTIF); CPPUNIT_TEST(testFuncNUMBERVALUE); diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index b2caf22..de1fd11 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -2257,6 +2257,44 @@ void Test::testFuncSUMPRODUCT() m_pDoc->DeleteTab(0); } +void Test::testFuncMIN() +{ + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto recalc. + m_pDoc->InsertTab(0, "Formula"); + + // A1:A2 + m_pDoc->SetString(ScAddress(0,0,0), "a"); + m_pDoc->SetString(ScAddress(0,1,0), "b"); + + // B1:B2 + m_pDoc->SetValue(ScAddress(1,0,0), 1.0); + m_pDoc->SetValue(ScAddress(1,1,0), 2.0); + + // Matrix in C1:C2. + ScMarkData aMark; + aMark.SelectOneTable(0); + m_pDoc->InsertMatrixFormula(2, 0, 2, 1, aMark, "=MIN(IF(A1:A2=\"c\";B1:B2))"); + + // Formula cell in C1:C2 should be a 1x2 matrix array. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(2,0,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_MESSAGE("This formula should be an array.", pFC->GetMatrixFlag() == MM_FORMULA); + + SCCOL nCols; + SCROW nRows; + pFC->GetMatColsRows(nCols, nRows); + CPPUNIT_ASSERT_EQUAL(static_cast<SCCOL>(1), nCols); + CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), nRows); + + CPPUNIT_ASSERT_MESSAGE("Formula in C1 is invalid.", m_pDoc->GetErrCode(ScAddress(2,0,0)) == 0); + CPPUNIT_ASSERT_MESSAGE("Formula in C2 is invalid.", m_pDoc->GetErrCode(ScAddress(2,1,0)) == 0); + + CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(ScAddress(2,0,0))); + CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(ScAddress(2,1,0))); + + m_pDoc->DeleteTab(0); +} + void Test::testFuncN() { OUString aTabName("foo"); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits