sc/qa/unit/ucalc_formula.cxx | 90 ++++++++++++++++++++++++++++++++-------- sc/source/core/data/column2.cxx | 9 ++-- 2 files changed, 78 insertions(+), 21 deletions(-)
New commits: commit 62f8229ee3a05f82757d8bcae2f5c0f239955637 Author: Kohei Yoshida <[email protected]> Date: Tue Oct 15 22:27:57 2013 -0400 Add helper functions for unit test & add new test that currently fails. Change-Id: I503fc26ccc0f117c626e78a8a1dd07ff32a06432 diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index ba73d11..034e0e3 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -28,6 +28,44 @@ using namespace formula; +namespace { + +bool isEmpty( const formula::VectorRefArray& rArray, size_t nPos ) +{ + if (rArray.mpStringArray) + { + if (rArray.mpStringArray[nPos]) + return false; + } + + if (rArray.mpNumericArray) + return rtl::math::isNan(rArray.mpNumericArray[nPos]); + else + return true; +} + +bool equals( const formula::VectorRefArray& rArray, size_t nPos, double fVal ) +{ + if (rArray.mpStringArray && rArray.mpStringArray[nPos]) + // This is a string cell. + return false; + + if (rArray.mpNumericArray && rArray.mpNumericArray[nPos] == fVal) + return true; + + return false; +} + +bool equals( const formula::VectorRefArray& rArray, size_t nPos, const OUString& rVal ) +{ + if (!rArray.mpStringArray) + return false; + + return OUString(rArray.mpStringArray[nPos]).equalsIgnoreAsciiCase(rVal); +} + +} + void Test::testFetchVectorRefArray() { m_pDoc->InsertTab(0, "Test"); @@ -54,7 +92,7 @@ void Test::testFetchVectorRefArray() CPPUNIT_ASSERT_EQUAL(2.0, aArray.mpNumericArray[1]); CPPUNIT_ASSERT_EQUAL(3.0, aArray.mpNumericArray[2]); CPPUNIT_ASSERT_EQUAL(4.0, aArray.mpNumericArray[3]); - CPPUNIT_ASSERT_MESSAGE("Empty cell should be represented by a NaN.", rtl::math::isNan(aArray.mpNumericArray[4])); + CPPUNIT_ASSERT_MESSAGE("This should be empty.", isEmpty(aArray, 4)); // All string cells in Column B. Note that the fetched string arrays are // only to be compared case-insensitively. Right now, we use upper cased @@ -67,11 +105,11 @@ void Test::testFetchVectorRefArray() aArray = m_pDoc->FetchVectorRefArray(aCxt, ScAddress(1,0,0), 5); CPPUNIT_ASSERT_MESSAGE("Failed to fetch vector ref array.", aArray.isValid()); CPPUNIT_ASSERT_MESSAGE("Array is expected to be string cells only.", !aArray.mpNumericArray); - CPPUNIT_ASSERT_MESSAGE("Failed on case in-sensitive equality test.", OUString(aArray.mpStringArray[0]).equalsIgnoreAsciiCaseAscii("Andy")); - CPPUNIT_ASSERT_MESSAGE("Failed on case in-sensitive equality test.", OUString(aArray.mpStringArray[1]).equalsIgnoreAsciiCaseAscii("Bruce")); - CPPUNIT_ASSERT_MESSAGE("Failed on case in-sensitive equality test.", OUString(aArray.mpStringArray[2]).equalsIgnoreAsciiCaseAscii("Charlie")); - CPPUNIT_ASSERT_MESSAGE("Failed on case in-sensitive equality test.", OUString(aArray.mpStringArray[3]).equalsIgnoreAsciiCaseAscii("David")); - CPPUNIT_ASSERT_MESSAGE("Empty cell should be represented by a NULL pointer.", !aArray.mpStringArray[4]); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 0, "Andy")); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 1, "Bruce")); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 2, "Charlie")); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 3, "David")); + CPPUNIT_ASSERT_MESSAGE("This should be empty.", isEmpty(aArray, 4)); // Mixture of numeric, string, and empty cells in Column C. m_pDoc->SetString(ScAddress(2,0,0), "Header"); @@ -84,17 +122,35 @@ void Test::testFetchVectorRefArray() aArray = m_pDoc->FetchVectorRefArray(aCxt, ScAddress(2,0,0), 7); CPPUNIT_ASSERT_MESSAGE("Failed to fetch vector ref array.", aArray.isValid()); CPPUNIT_ASSERT_MESSAGE("Array should have both numeric and string arrays.", aArray.mpNumericArray && aArray.mpStringArray); - CPPUNIT_ASSERT_MESSAGE("Failed on case in-sensitive equality test.", OUString(aArray.mpStringArray[0]).equalsIgnoreAsciiCaseAscii("Header")); - CPPUNIT_ASSERT_MESSAGE("String value should be NULL for numeric cell.", aArray.mpStringArray[1] == NULL); - CPPUNIT_ASSERT_MESSAGE("String value should be NULL for numeric cell.", aArray.mpStringArray[2] == NULL); - CPPUNIT_ASSERT_MESSAGE("String value should be NULL for numeric cell.", aArray.mpStringArray[3] == NULL); - CPPUNIT_ASSERT_EQUAL(11.0, aArray.mpNumericArray[1]); - CPPUNIT_ASSERT_EQUAL(12.0, aArray.mpNumericArray[2]); - CPPUNIT_ASSERT_EQUAL(13.0, aArray.mpNumericArray[3]); - CPPUNIT_ASSERT_MESSAGE("This cell should be empty.", aArray.mpStringArray[4] == NULL && rtl::math::isNan(aArray.mpNumericArray[4])); - CPPUNIT_ASSERT_MESSAGE("String value should be NULL for numeric cell.", aArray.mpStringArray[5] == NULL); - CPPUNIT_ASSERT_EQUAL(36.0, aArray.mpNumericArray[5]); - CPPUNIT_ASSERT_MESSAGE("This cell should be empty.", aArray.mpStringArray[6] == NULL && rtl::math::isNan(aArray.mpNumericArray[6])); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 0, "Header")); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 1, 11)); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 2, 12)); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 3, 13)); + CPPUNIT_ASSERT_MESSAGE("This should be empty.", isEmpty(aArray, 4)); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 5, 36)); + CPPUNIT_ASSERT_MESSAGE("This should be empty.", isEmpty(aArray, 6)); + + // Mixed type again in Column D, but it starts with a numeric cell. + m_pDoc->SetValue(ScAddress(3,0,0), 10); + m_pDoc->SetString(ScAddress(3,1,0), "Below 10"); + // Leave 2 empty cells. + m_pDoc->SetValue(ScAddress(3,4,0), 11); + m_pDoc->SetString(ScAddress(3,5,0), "=12"); + m_pDoc->SetString(ScAddress(3,6,0), "=13"); + m_pDoc->SetString(ScAddress(3,7,0), "=CONCATENATE(\"A\";\"B\";\"C\")"); + m_pDoc->CalcAll(); + + aArray = m_pDoc->FetchVectorRefArray(aCxt, ScAddress(3,0,0), 8); + CPPUNIT_ASSERT_MESSAGE("Failed to fetch vector ref array.", aArray.isValid()); + CPPUNIT_ASSERT_MESSAGE("Array should have both numeric and string arrays.", aArray.mpNumericArray && aArray.mpStringArray); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 0, 10)); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 1, "Below 10")); + CPPUNIT_ASSERT_MESSAGE("This should be empty.", isEmpty(aArray, 2)); + CPPUNIT_ASSERT_MESSAGE("This should be empty.", isEmpty(aArray, 3)); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 4, 11)); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 5, 12)); + CPPUNIT_ASSERT_MESSAGE("Unexpected numeric cell.", equals(aArray, 6, 13)); + CPPUNIT_ASSERT_MESSAGE("Unexpected string cell.", equals(aArray, 7, "ABC")); m_pDoc->DeleteTab(0); } commit f7fca147210f2b018e7d724f2b099bbfc834b325 Author: Kohei Yoshida <[email protected]> Date: Tue Oct 15 22:27:32 2013 -0400 Cleanup. Change-Id: I3d6e3bceda23255a138340dcea3d847481216e73 diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 8fbfd1b..32a4ded 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -2178,7 +2178,7 @@ bool appendDouble( return false; } -formula::VectorRefArray appendBlocks( +formula::VectorRefArray appendToStringBlock( ScDocument* pDoc, sc::FormulaGroupContext& rCxt, size_t nPos, size_t nLenRequested, sc::CellStoreType::iterator it, const sc::CellStoreType::iterator& itEnd ) { @@ -2338,6 +2338,9 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( sc::FormulaGroupContext& if (nRow1 > nRow2) return formula::VectorRefArray(); + double fNan; + rtl::math::setNan(&fNan); + size_t nLenRequested = nRow2 - nRow1 + 1; sc::CellStoreType::position_type aPos = maCells.position(nRow1); size_t nLen = aPos.first->size - aPos.second; @@ -2450,7 +2453,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( sc::FormulaGroupContext& // Fill the remaining array with values from the following blocks. ++aPos.first; - return appendBlocks(pDocument, rCxt, nLen, nLenRequested, aPos.first, maCells.end()); + return appendToStringBlock(pDocument, rCxt, nLen, nLenRequested, aPos.first, maCells.end()); } break; case sc::element_type_empty: @@ -2458,8 +2461,6 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( sc::FormulaGroupContext& if (nLenRequested <= nLen) { // Fill the whole length with NaN's. - double fNan; - rtl::math::setNan(&fNan); rCxt.maNumArrays.push_back(new sc::FormulaGroupContext::NumArrayType(nLenRequested, fNan)); return formula::VectorRefArray(&rCxt.maNumArrays.back()[0]); } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
