diff options
Diffstat (limited to 'sc/qa/unit/ucalc.cxx')
-rw-r--r-- | sc/qa/unit/ucalc.cxx | 846 |
1 files changed, 0 insertions, 846 deletions
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index 5c3ec7bf2911..b3ddaffb11b6 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -500,852 +500,6 @@ void Test::testInput() m_pDoc->DeleteTab(0); } -void Test::testFuncSUM() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - double val = 1; - double result; - m_pDoc->SetValue (0, 0, 0, val); - m_pDoc->SetValue (0, 1, 0, val); - m_pDoc->SetString (0, 2, 0, OUString("=SUM(A1:A2)")); - m_pDoc->CalcAll(); - m_pDoc->GetValue (0, 2, 0, result); - CPPUNIT_ASSERT_MESSAGE ("calculation failed", result == 2.0); - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncPRODUCT() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - double val = 1; - double result; - m_pDoc->SetValue(0, 0, 0, val); - val = 2; - m_pDoc->SetValue(0, 1, 0, val); - val = 3; - m_pDoc->SetValue(0, 2, 0, val); - m_pDoc->SetString(0, 3, 0, OUString("=PRODUCT(A1:A3)")); - m_pDoc->CalcAll(); - m_pDoc->GetValue(0, 3, 0, result); - CPPUNIT_ASSERT_MESSAGE("Calculation of PRODUCT failed", result == 6.0); - - m_pDoc->SetString(0, 4, 0, OUString("=PRODUCT({1;2;3})")); - m_pDoc->CalcAll(); - m_pDoc->GetValue(0, 4, 0, result); - CPPUNIT_ASSERT_MESSAGE("Calculation of PRODUCT with inline array failed", result == 6.0); - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncN() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - double result; - - // Clear the area first. - clearRange(m_pDoc, ScRange(0, 0, 0, 1, 20, 0)); - - // Put values to reference. - double val = 0; - m_pDoc->SetValue(0, 0, 0, val); - m_pDoc->SetString(0, 2, 0, OUString("Text")); - val = 1; - m_pDoc->SetValue(0, 3, 0, val); - val = -1; - m_pDoc->SetValue(0, 4, 0, val); - val = 12.3; - m_pDoc->SetValue(0, 5, 0, val); - m_pDoc->SetString(0, 6, 0, OUString("'12.3")); - - // Cell references - m_pDoc->SetString(1, 0, 0, OUString("=N(A1)")); - m_pDoc->SetString(1, 1, 0, OUString("=N(A2)")); - m_pDoc->SetString(1, 2, 0, OUString("=N(A3)")); - m_pDoc->SetString(1, 3, 0, OUString("=N(A4)")); - m_pDoc->SetString(1, 4, 0, OUString("=N(A5)")); - m_pDoc->SetString(1, 5, 0, OUString("=N(A6)")); - m_pDoc->SetString(1, 6, 0, OUString("=N(A9)")); - - // In-line values - m_pDoc->SetString(1, 7, 0, OUString("=N(0)")); - m_pDoc->SetString(1, 8, 0, OUString("=N(1)")); - m_pDoc->SetString(1, 9, 0, OUString("=N(-1)")); - m_pDoc->SetString(1, 10, 0, OUString("=N(123)")); - m_pDoc->SetString(1, 11, 0, OUString("=N(\"\")")); - m_pDoc->SetString(1, 12, 0, OUString("=N(\"12\")")); - m_pDoc->SetString(1, 13, 0, OUString("=N(\"foo\")")); - - // Range references - m_pDoc->SetString(2, 2, 0, OUString("=N(A1:A8)")); - m_pDoc->SetString(2, 3, 0, OUString("=N(A1:A8)")); - m_pDoc->SetString(2, 4, 0, OUString("=N(A1:A8)")); - m_pDoc->SetString(2, 5, 0, OUString("=N(A1:A8)")); - - // Calculate and check the results. - m_pDoc->CalcAll(); - double checks1[] = { - 0, 0, 0, 1, -1, 12.3, 0, // cell reference - 0, 1, -1, 123, 0, 0, 0 // in-line values - }; - for (size_t i = 0; i < SAL_N_ELEMENTS(checks1); ++i) - { - m_pDoc->GetValue(1, i, 0, result); - bool bGood = result == checks1[i]; - if (!bGood) - { - cerr << "row " << (i+1) << ": expected=" << checks1[i] << " actual=" << result << endl; - CPPUNIT_ASSERT_MESSAGE("Unexpected result for N", false); - } - } - double checks2[] = { - 0, 1, -1, 12.3 // range references - }; - for (size_t i = 0; i < SAL_N_ELEMENTS(checks2); ++i) - { - m_pDoc->GetValue(1, i+2, 0, result); - bool bGood = result == checks2[i]; - if (!bGood) - { - cerr << "row " << (i+2+1) << ": expected=" << checks2[i] << " actual=" << result << endl; - CPPUNIT_ASSERT_MESSAGE("Unexpected result for N", false); - } - } - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncCOUNTIF() -{ - // COUNTIF (test case adopted from OOo i#36381) - - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - // Empty A1:A39 first. - clearRange(m_pDoc, ScRange(0, 0, 0, 0, 40, 0)); - - // Raw data (rows 1 through 9) - const char* aData[] = { - "1999", - "2000", - "0", - "0", - "0", - "2002", - "2001", - "X", - "2002" - }; - - SCROW nRows = SAL_N_ELEMENTS(aData); - for (SCROW i = 0; i < nRows; ++i) - m_pDoc->SetString(0, i, 0, OUString::createFromAscii(aData[i])); - - printRange(m_pDoc, ScRange(0, 0, 0, 0, 8, 0), "data range for COUNTIF"); - - // formulas and results - struct { - const char* pFormula; double fResult; - } aChecks[] = { - { "=COUNTIF(A1:A12;1999)", 1 }, - { "=COUNTIF(A1:A12;2002)", 2 }, - { "=COUNTIF(A1:A12;1998)", 0 }, - { "=COUNTIF(A1:A12;\">=1999\")", 5 }, - { "=COUNTIF(A1:A12;\">1999\")", 4 }, - { "=COUNTIF(A1:A12;\"<2001\")", 5 }, - { "=COUNTIF(A1:A12;\">0\")", 5 }, - { "=COUNTIF(A1:A12;\">=0\")", 8 }, - { "=COUNTIF(A1:A12;0)", 3 }, - { "=COUNTIF(A1:A12;\"X\")", 1 }, - { "=COUNTIF(A1:A12;)", 3 } - }; - - nRows = SAL_N_ELEMENTS(aChecks); - for (SCROW i = 0; i < nRows; ++i) - { - SCROW nRow = 20 + i; - m_pDoc->SetString(0, nRow, 0, OUString::createFromAscii(aChecks[i].pFormula)); - } - m_pDoc->CalcAll(); - - for (SCROW i = 0; i < nRows; ++i) - { - double result; - SCROW nRow = 20 + i; - m_pDoc->GetValue(0, nRow, 0, result); - bool bGood = result == aChecks[i].fResult; - if (!bGood) - { - cerr << "row " << (nRow+1) << ": formula" << aChecks[i].pFormula - << " expected=" << aChecks[i].fResult << " actual=" << result << endl; - CPPUNIT_ASSERT_MESSAGE("Unexpected result for COUNTIF", false); - } - } - - // Don't count empty strings when searching for a number. - - // Clear A1:A2. - clearRange(m_pDoc, ScRange(0, 0, 0, 0, 1, 0)); - - m_pDoc->SetString(0, 0, 0, OUString("=\"\"")); - m_pDoc->SetString(0, 1, 0, OUString("=COUNTIF(A1;1)")); - m_pDoc->CalcAll(); - - double result = m_pDoc->GetValue(0, 1, 0); - CPPUNIT_ASSERT_MESSAGE("We shouldn't count empty string as valid number.", result == 0.0); - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncIFERROR() -{ - // IFERROR/IFNA (fdo#56124) - - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - // Empty A1:A39 first. - clearRange(m_pDoc, ScRange(0, 0, 0, 0, 40, 0)); - - // Raw data (rows 1 through 12) - const char* aData[] = { - "1", - "e", - "=SQRT(4)", - "=SQRT(-2)", - "=A4", - "=1/0", - "=NA()", - "bar", - "4", - "gee", - "=1/0", - "23" - }; - - SCROW nRows = SAL_N_ELEMENTS(aData); - for (SCROW i = 0; i < nRows; ++i) - m_pDoc->SetString(0, i, 0, OUString::createFromAscii(aData[i])); - - printRange(m_pDoc, ScRange(0, 0, 0, 0, nRows-1, 0), "data range for IFERROR/IFNA"); - - // formulas and results - struct { - const char* pFormula; const char* pResult; - } aChecks[] = { - { "=IFERROR(A1;9)", "1" }, - { "=IFERROR(A2;9)", "e" }, - { "=IFERROR(A3;9)", "2" }, - { "=IFERROR(A4;-7)", "-7" }, - { "=IFERROR(A5;-7)", "-7" }, - { "=IFERROR(A6;-7)", "-7" }, - { "=IFERROR(A7;-7)", "-7" }, - { "=IFNA(A6;9)", "#DIV/0!" }, - { "=IFNA(A7;-7)", "-7" }, - { "=IFNA(VLOOKUP(\"4\";A8:A10;1;0);-2)", "4" }, - { "=IFNA(VLOOKUP(\"fop\";A8:A10;1;0);-2)", "-2" }, - { "{=IFERROR(3*A11:A12;1998)}[0]", "1998" }, // um.. this is not the correct way to insert a - { "{=IFERROR(3*A11:A12;1998)}[1]", "69" } // matrix formula, just a place holder, see below - }; - - nRows = SAL_N_ELEMENTS(aChecks); - for (SCROW i = 0; i < nRows-2; ++i) - { - SCROW nRow = 20 + i; - m_pDoc->SetString(0, nRow, 0, OUString::createFromAscii(aChecks[i].pFormula)); - } - - // Create a matrix range in last two rows of the range above, actual data - // of the placeholders. - ScMarkData aMark; - aMark.SelectOneTable(0); - m_pDoc->InsertMatrixFormula(0, 20 + nRows-2, 0, 20 + nRows-1, aMark, "=IFERROR(3*A11:A12;1998)", NULL); - - m_pDoc->CalcAll(); - - for (SCROW i = 0; i < nRows; ++i) - { - SCROW nRow = 20 + i; - OUString aResult = m_pDoc->GetString(0, nRow, 0); - CPPUNIT_ASSERT_EQUAL_MESSAGE( - aChecks[i].pFormula, OUString::createFromAscii( aChecks[i].pResult), aResult); - } - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncNUMBERVALUE() -{ - // NUMBERVALUE fdo#57180 - - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - // Empty A1:A39 first. - clearRange(m_pDoc, ScRange(0, 0, 0, 0, 40, 0)); - - // Raw data (rows 1 through 6) - const char* aData[] = { - "1ag9a9b9", - "1ag34 5g g6 78b9%%", - "1 234d56E-2", - "d4", - "54.4", - "1a2b3e1%" - }; - - SCROW nRows = SAL_N_ELEMENTS(aData); - for (SCROW i = 0; i < nRows; ++i) - m_pDoc->SetString(0, i, 0, OUString::createFromAscii(aData[i])); - - printRange(m_pDoc, ScRange(0, 0, 0, 0, nRows - 1, 0), "data range for NUMBERVALUE"); - - // formulas and results - struct { - const char* pFormula; const char* pResult; - } aChecks[] = { - { "=NUMBERVALUE(A1;\"b\";\"ag\")", "199.9" }, - { "=NUMBERVALUE(A2;\"b\";\"ag\")", "134.56789" }, - { "=NUMBERVALUE(A2;\"b\";\"g\")", "#VALUE!" }, - { "=NUMBERVALUE(A3;\"d\")", "12.3456" }, - { "=NUMBERVALUE(A4;\"d\";\"foo\")", "0.4" }, - { "=NUMBERVALUE(A4;)", "Err:502" }, - { "=NUMBERVALUE(A5;)", "Err:502" }, - { "=NUMBERVALUE(A6;\"b\";\"a\")", "1.23" } - }; - - nRows = SAL_N_ELEMENTS(aChecks); - for (SCROW i = 0; i < nRows; ++i) - { - SCROW nRow = 20 + i; - m_pDoc->SetString(0, nRow, 0, OUString::createFromAscii(aChecks[i].pFormula)); - } - m_pDoc->CalcAll(); - - for (SCROW i = 0; i < nRows; ++i) - { - SCROW nRow = 20 + i; - OUString aResult = m_pDoc->GetString(0, nRow, 0); - CPPUNIT_ASSERT_EQUAL_MESSAGE( - aChecks[i].pFormula, OUString::createFromAscii( aChecks[i].pResult), aResult); - } - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncVLOOKUP() -{ - // VLOOKUP - - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - // Clear A1:F40. - clearRange(m_pDoc, ScRange(0, 0, 0, 5, 39, 0)); - - // Raw data - const char* aData[][2] = { - { "Key", "Val" }, - { "10", "3" }, - { "20", "4" }, - { "30", "5" }, - { "40", "6" }, - { "50", "7" }, - { "60", "8" }, - { "70", "9" }, - { "B", "10" }, - { "B", "11" }, - { "C", "12" }, - { "D", "13" }, - { "E", "14" }, - { "F", "15" }, - { 0, 0 } // terminator - }; - - // Insert raw data into A1:B14. - for (SCROW i = 0; aData[i][0]; ++i) - { - m_pDoc->SetString(0, i, 0, OUString::createFromAscii(aData[i][0])); - m_pDoc->SetString(1, i, 0, OUString::createFromAscii(aData[i][1])); - } - - printRange(m_pDoc, ScRange(0, 0, 0, 1, 13, 0), "raw data for VLOOKUP"); - - // Formula data - struct { - const char* pLookup; const char* pFormula; const char* pRes; - } aChecks[] = { - { "Lookup", "Formula", 0 }, - { "12", "=VLOOKUP(D2;A2:B14;2;1)", "3" }, - { "29", "=VLOOKUP(D3;A2:B14;2;1)", "4" }, - { "31", "=VLOOKUP(D4;A2:B14;2;1)", "5" }, - { "45", "=VLOOKUP(D5;A2:B14;2;1)", "6" }, - { "56", "=VLOOKUP(D6;A2:B14;2;1)", "7" }, - { "65", "=VLOOKUP(D7;A2:B14;2;1)", "8" }, - { "78", "=VLOOKUP(D8;A2:B14;2;1)", "9" }, - { "Andy", "=VLOOKUP(D9;A2:B14;2;1)", "#N/A" }, - { "Bruce", "=VLOOKUP(D10;A2:B14;2;1)", "11" }, - { "Charlie", "=VLOOKUP(D11;A2:B14;2;1)", "12" }, - { "David", "=VLOOKUP(D12;A2:B14;2;1)", "13" }, - { "Edward", "=VLOOKUP(D13;A2:B14;2;1)", "14" }, - { "Frank", "=VLOOKUP(D14;A2:B14;2;1)", "15" }, - { "Henry", "=VLOOKUP(D15;A2:B14;2;1)", "15" }, - { "100", "=VLOOKUP(D16;A2:B14;2;1)", "9" }, - { "1000", "=VLOOKUP(D17;A2:B14;2;1)", "9" }, - { "Zena", "=VLOOKUP(D18;A2:B14;2;1)", "15" } - }; - - // Insert formula data into D1:E18. - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - m_pDoc->SetString(3, i, 0, OUString::createFromAscii(aChecks[i].pLookup)); - m_pDoc->SetString(4, i, 0, OUString::createFromAscii(aChecks[i].pFormula)); - } - m_pDoc->CalcAll(); - printRange(m_pDoc, ScRange(3, 0, 0, 4, 17, 0), "formula data for VLOOKUP"); - - // Verify results. - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - if (i == 0) - // Skip the header row. - continue; - - OUString aRes = m_pDoc->GetString(4, i, 0); - bool bGood = aRes.equalsAscii(aChecks[i].pRes); - if (!bGood) - { - cerr << "row " << (i+1) << ": lookup value='" << aChecks[i].pLookup - << "' expected='" << aChecks[i].pRes << "' actual='" << aRes << "'" << endl; - CPPUNIT_ASSERT_MESSAGE("Unexpected result for VLOOKUP", false); - } - } - - m_pDoc->DeleteTab(0); -} - -struct NumStrCheck { - double fVal; - const char* pRes; -}; - -struct StrStrCheck { - const char* pVal; - const char* pRes; -}; - -template<size_t _DataSize, size_t _FormulaSize, int _Type> -void runTestMATCH(ScDocument* pDoc, const char* aData[_DataSize], StrStrCheck aChecks[_FormulaSize]) -{ - size_t nDataSize = _DataSize; - for (size_t i = 0; i < nDataSize; ++i) - pDoc->SetString(0, i, 0, OUString::createFromAscii(aData[i])); - - for (size_t i = 0; i < _FormulaSize; ++i) - { - pDoc->SetString(1, i, 0, OUString::createFromAscii(aChecks[i].pVal)); - - OUStringBuffer aBuf; - aBuf.appendAscii("=MATCH(B"); - aBuf.append(static_cast<sal_Int32>(i+1)); - aBuf.appendAscii(";A1:A"); - aBuf.append(static_cast<sal_Int32>(nDataSize)); - aBuf.appendAscii(";"); - aBuf.append(static_cast<sal_Int32>(_Type)); - aBuf.appendAscii(")"); - OUString aFormula = aBuf.makeStringAndClear(); - pDoc->SetString(2, i, 0, aFormula); - } - - pDoc->CalcAll(); - Test::printRange(pDoc, ScRange(0, 0, 0, 2, _FormulaSize-1, 0), "MATCH"); - - // verify the results. - for (size_t i = 0; i < _FormulaSize; ++i) - { - OUString aStr = pDoc->GetString(2, i, 0); - if (!aStr.equalsAscii(aChecks[i].pRes)) - { - cerr << "row " << (i+1) << ": expected='" << aChecks[i].pRes << "' actual='" << aStr << "'" - << " criterion='" << aChecks[i].pVal << "'" << endl; - CPPUNIT_ASSERT_MESSAGE("Unexpected result for MATCH", false); - } - } -} - -void Test::testFuncMATCH() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - clearRange(m_pDoc, ScRange(0, 0, 0, 4, 40, 0)); - { - // Ascending in-exact match - - // data range (A1:A9) - const char* aData[] = { - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "B", - "B", - "C", - }; - - // formula (B1:C12) - StrStrCheck aChecks[] = { - { "0.8", "#N/A" }, - { "1.2", "1" }, - { "2.3", "2" }, - { "3.9", "3" }, - { "4.1", "4" }, - { "5.99", "5" }, - { "6.1", "6" }, - { "7.2", "7" }, - { "8.569", "8" }, - { "9.59", "9" }, - { "10", "9" }, - { "100", "9" }, - { "Andy", "#N/A" }, - { "Bruce", "11" }, - { "Charlie", "12" } - }; - - runTestMATCH<SAL_N_ELEMENTS(aData),SAL_N_ELEMENTS(aChecks),1>(m_pDoc, aData, aChecks); - } - - { - // Descending in-exact match - - // data range (A1:A9) - const char* aData[] = { - "D", - "C", - "B", - "9", - "8", - "7", - "6", - "5", - "4", - "3", - "2", - "1" - }; - - // formula (B1:C12) - StrStrCheck aChecks[] = { - { "10", "#N/A" }, - { "8.9", "4" }, - { "7.8", "5" }, - { "6.7", "6" }, - { "5.5", "7" }, - { "4.6", "8" }, - { "3.3", "9" }, - { "2.2", "10" }, - { "1.1", "11" }, - { "0.8", "12" }, - { "0", "12" }, - { "-2", "12" }, - { "Andy", "3" }, - { "Bruce", "2" }, - { "Charlie", "1" }, - { "David", "#N/A" } - }; - - runTestMATCH<SAL_N_ELEMENTS(aData),SAL_N_ELEMENTS(aChecks),-1>(m_pDoc, aData, aChecks); - } - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncCELL() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - clearRange(m_pDoc, ScRange(0, 0, 0, 2, 20, 0)); // Clear A1:C21. - - { - const char* pContent = "Some random text"; - m_pDoc->SetString(2, 9, 0, OUString::createFromAscii(pContent)); // Set this value to C10. - double val = 1.2; - m_pDoc->SetValue(2, 0, 0, val); // Set numeric value to C1; - - // We don't test: FILENAME, FORMAT, WIDTH, PROTECT, PREFIX - StrStrCheck aChecks[] = { - { "=CELL(\"COL\";C10)", "3" }, - { "=CELL(\"ROW\";C10)", "10" }, - { "=CELL(\"SHEET\";C10)", "1" }, - { "=CELL(\"ADDRESS\";C10)", "$C$10" }, - { "=CELL(\"CONTENTS\";C10)", pContent }, - { "=CELL(\"COLOR\";C10)", "0" }, - { "=CELL(\"TYPE\";C9)", "b" }, - { "=CELL(\"TYPE\";C10)", "l" }, - { "=CELL(\"TYPE\";C1)", "v" }, - { "=CELL(\"PARENTHESES\";C10)", "0" } - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - m_pDoc->SetString(0, i, 0, OUString::createFromAscii(aChecks[i].pVal)); - m_pDoc->CalcAll(); - - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - OUString aVal = m_pDoc->GetString(0, i, 0); - CPPUNIT_ASSERT_MESSAGE("Unexpected result for CELL", aVal.equalsAscii(aChecks[i].pRes)); - } - } - - m_pDoc->DeleteTab(0); -} - -/** See also test case document fdo#44456 sheet cpearson */ -void Test::testFuncDATEDIF() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - - const char* aData[][5] = { - { "2007-01-01", "2007-01-10", "d", "9", "=DATEDIF(A1;B1;C1)" } , - { "2007-01-01", "2007-01-31", "m", "0", "=DATEDIF(A2;B2;C2)" } , - { "2007-01-01", "2007-02-01", "m", "1", "=DATEDIF(A3;B3;C3)" } , - { "2007-01-01", "2007-02-28", "m", "1", "=DATEDIF(A4;B4;C4)" } , - { "2007-01-01", "2007-12-31", "d", "364", "=DATEDIF(A5;B5;C5)" } , - { "2007-01-01", "2007-01-31", "y", "0", "=DATEDIF(A6;B6;C6)" } , - { "2007-01-01", "2008-07-01", "d", "547", "=DATEDIF(A7;B7;C7)" } , - { "2007-01-01", "2008-07-01", "m", "18", "=DATEDIF(A8;B8;C8)" } , - { "2007-01-01", "2008-07-01", "ym", "6", "=DATEDIF(A9;B9;C9)" } , - { "2007-01-01", "2008-07-01", "yd", "182", "=DATEDIF(A10;B10;C10)" } , - { "2008-01-01", "2009-07-01", "yd", "181", "=DATEDIF(A11;B11;C11)" } , - { "2007-01-01", "2007-01-31", "md", "30", "=DATEDIF(A12;B12;C12)" } , - { "2007-02-01", "2009-03-01", "md", "0", "=DATEDIF(A13;B13;C13)" } , - { "2008-02-01", "2009-03-01", "md", "0", "=DATEDIF(A14;B14;C14)" } , - { "2007-01-02", "2007-01-01", "md", "Err:502", "=DATEDIF(A15;B15;C15)" } // fail date1 > date2 - }; - - clearRange( m_pDoc, ScRange(0, 0, 0, 4, SAL_N_ELEMENTS(aData), 0)); - ScAddress aPos(0,0,0); - ScRange aDataRange = insertRangeData( m_pDoc, aPos, aData, SAL_N_ELEMENTS(aData)); - CPPUNIT_ASSERT_MESSAGE("failed to insert range data at correct position", aDataRange.aStart == aPos); - - m_pDoc->CalcAll(); - - for (size_t i = 0; i < SAL_N_ELEMENTS(aData); ++i) - { - OUString aVal = m_pDoc->GetString( 4, i, 0); - //std::cout << "row "<< i << ": " << OUStringToOString( aVal, RTL_TEXTENCODING_UTF8).getStr() << ", expected " << aData[i][3] << std::endl; - CPPUNIT_ASSERT_MESSAGE("Unexpected result for DATEDIF", aVal.equalsAscii( aData[i][3])); - } - - m_pDoc->DeleteTab(0); -} - -void Test::testFuncINDIRECT() -{ - OUString aTabName("foo"); - CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", - m_pDoc->InsertTab (0, aTabName)); - clearRange(m_pDoc, ScRange(0, 0, 0, 0, 10, 0)); // Clear A1:A11 - - bool bGood = m_pDoc->GetName(0, aTabName); - CPPUNIT_ASSERT_MESSAGE("failed to get sheet name.", bGood); - - OUString aTest = "Test", aRefErr = "#REF!"; - m_pDoc->SetString(0, 10, 0, aTest); - CPPUNIT_ASSERT_MESSAGE("Unexpected cell value.", m_pDoc->GetString(0,10,0) == aTest); - - OUString aPrefix = "=INDIRECT(\""; - - OUString aFormula = aPrefix + aTabName + ".A11\")"; // Calc A1 - m_pDoc->SetString(0, 0, 0, aFormula); - aFormula = aPrefix + aTabName + "!A11\")"; // Excel A1 - m_pDoc->SetString(0, 1, 0, aFormula); - aFormula = aPrefix + aTabName + "!R11C1\")"; // Excel R1C1 - m_pDoc->SetString(0, 2, 0, aFormula); - aFormula = aPrefix + aTabName + "!R11C1\";0)"; // Excel R1C1 (forced) - m_pDoc->SetString(0, 3, 0, aFormula); - - m_pDoc->CalcAll(); - { - // Default is to use the current formula syntax, which is Calc A1. - const OUString* aChecks[] = { - &aTest, &aRefErr, &aRefErr, &aTest - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - OUString aVal = m_pDoc->GetString(0, i, 0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong value!", *aChecks[i], aVal); - } - } - - ScCalcConfig aConfig; - aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_OOO; - ScInterpreter::SetGlobalConfig(aConfig); - m_pDoc->CalcAll(); - { - // Explicit Calc A1 syntax - const OUString* aChecks[] = { - &aTest, &aRefErr, &aRefErr, &aTest - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - OUString aVal = m_pDoc->GetString(0, i, 0); - CPPUNIT_ASSERT_MESSAGE("Wrong value!", aVal == *aChecks[i]); - } - } - - aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_A1; - ScInterpreter::SetGlobalConfig(aConfig); - m_pDoc->CalcAll(); - { - // Excel A1 syntax - const OUString* aChecks[] = { - &aRefErr, &aTest, &aRefErr, &aTest - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - OUString aVal = m_pDoc->GetString(0, i, 0); - CPPUNIT_ASSERT_MESSAGE("Wrong value!", aVal == *aChecks[i]); - } - } - - aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_R1C1; - ScInterpreter::SetGlobalConfig(aConfig); - m_pDoc->CalcAll(); - { - // Excel R1C1 syntax - const OUString* aChecks[] = { - &aRefErr, &aRefErr, &aTest, &aTest - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) - { - OUString aVal = m_pDoc->GetString(0, i, 0); - CPPUNIT_ASSERT_MESSAGE("Wrong value!", aVal == *aChecks[i]); - } - } - - m_pDoc->DeleteTab(0); -} - -void Test::testFormulaHashAndTag() -{ - m_pDoc->InsertTab(0, "Test"); - - ScAddress aPos1(0,0,0), aPos2(1,0,0); - - // Test formula hashing. - - struct { - const char* pFormula1; const char* pFormula2; bool bEqual; - } aHashTests[] = { - { "=1", "=2", false }, // different constants - { "=SUM(1;2;3;4;5)", "=AVERAGE(1;2;3;4;5)", false }, // different functions - { "=C2*3", "=D2*3", true }, // relative references - { "=C2*3", "=D2*4", false }, // different constants - { "=C2*4", "=D2*4", true }, // relative references - { "=3*4*5", "=3*4*\"foo\"", false }, // numeric vs string constants - { "=$C3/2", "=$C3/2", true }, // absolute column references - { "=C$3/2", "=D$3/2", true }, // absolute row references - { "=$E$30/2", "=$E$30/2", true }, // absolute references - { "=X20", "=$X$20", false }, // absolute vs relative - { "=X20", "=X$20", false }, // absolute vs relative - { "=X20", "=$X20", false }, // absolute vs relative - { "=X$20", "=$X20", false }, // column absolute vs row absolute - // similar enough for merging ... - { "=A1", "=B1", true }, - { "=$A$1", "=$B$1", true }, - { "=A1", "=C2", true }, - { "=SUM(A1)", "=SUM(B1)", true }, - { "=A1+3", "=B1+3", true }, - { "=A1+7", "=B1+42", false }, - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aHashTests); ++i) - { - m_pDoc->SetString(aPos1, OUString::createFromAscii(aHashTests[i].pFormula1)); - m_pDoc->SetString(aPos2, OUString::createFromAscii(aHashTests[i].pFormula2)); - size_t nHashVal1 = m_pDoc->GetFormulaHash(aPos1); - size_t nHashVal2 = m_pDoc->GetFormulaHash(aPos2); - - std::ostringstream os; - os << "(expr1:" << aHashTests[i].pFormula1 << "; expr2:" << aHashTests[i].pFormula2 << ")"; - if (aHashTests[i].bEqual) - { - os << " Error: these hashes should be equal." << endl; - CPPUNIT_ASSERT_MESSAGE(os.str().c_str(), nHashVal1 == nHashVal2); - } - else - { - os << " Error: these hashes should differ." << endl; - CPPUNIT_ASSERT_MESSAGE(os.str().c_str(), nHashVal1 != nHashVal2); - } - - aPos1.IncRow(); - aPos2.IncRow(); - } - - // Go back to row 1. - aPos1.SetRow(0); - aPos2.SetRow(0); - - // Test formula vectorization state. - - struct { - const char* pFormula; ScFormulaVectorState eState; - } aVectorTests[] = { - { "=SUM(1;2;3;4;5)", FormulaVectorEnabled }, - { "=NOW()", FormulaVectorDisabled }, - { "=AVERAGE(X1:Y200)", FormulaVectorCheckReference }, - { "=MAX(X1:Y200;10;20)", FormulaVectorCheckReference }, - { "=MIN(10;11;22)", FormulaVectorEnabled }, - { "=H4", FormulaVectorCheckReference }, - }; - - for (size_t i = 0; i < SAL_N_ELEMENTS(aVectorTests); ++i) - { - m_pDoc->SetString(aPos1, OUString::createFromAscii(aVectorTests[i].pFormula)); - ScFormulaVectorState eState = m_pDoc->GetFormulaVectorState(aPos1); - - if (eState != aVectorTests[i].eState) - { - std::ostringstream os; - os << "Unexpected vectorization state: expr:" << aVectorTests[i].pFormula; - CPPUNIT_ASSERT_MESSAGE(os.str().c_str(), false); - } - aPos1.IncRow(); - } - - m_pDoc->DeleteTab(0); -} - void Test::testCopyToDocument() { CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", m_pDoc->InsertTab (0, "src")); |