[Libreoffice-commits] .: 4 commits - sc/qa sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri Jan 25 04:18:04 PST 2013
dev/null |binary
sc/qa/unit/data/contentCSV/cachedValue.csv | 2
sc/qa/unit/data/contentCSV/matrix2.csv | 12 +--
sc/qa/unit/data/ods/cachedValue.ods |binary
sc/qa/unit/data/ods/matrix.ods |binary
sc/qa/unit/helper/csv_handler.hxx | 4 -
sc/qa/unit/subsequent_filters-test.cxx | 95 ++++++++++++++++++-----------
sc/source/core/data/cell.cxx | 4 -
sc/source/core/tool/formularesult.cxx | 7 ++
sc/source/filter/xml/xmlcelli.cxx | 36 ++++++----
sc/source/filter/xml/xmlcelli.hxx | 6 +
sc/source/ui/docshell/docsh.cxx | 4 -
12 files changed, 108 insertions(+), 62 deletions(-)
New commits:
commit 71a8f79f4bdf567b6fce23091ca1663455cadba9
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Fri Jan 25 13:15:09 2013 +0100
improve the tests for cached value import
The test now also tests for Err:* import and checks that these have been
imported as error values and not only as text values.
Future clean-up:
Merge the cached matrix test file into the cached value one.
Change-Id: I9c0a06f058ff6620bd7ca169b3bee07a5430997e
diff --git a/sc/qa/unit/data/contentCSV/matrix2.csv b/sc/qa/unit/data/contentCSV/matrix2.csv
index 2effd61..8450f0d 100644
--- a/sc/qa/unit/data/contentCSV/matrix2.csv
+++ b/sc/qa/unit/data/contentCSV/matrix2.csv
@@ -1,6 +1,6 @@
-Matrices with errors and other misc potential problems:,,,,
-Err:502,Err:502,Err:502,,error result
-#N/A,#N/A,#N/A,,n/a
-TRUE,TRUE,TRUE,,Display TRUE instead of 1
-FALSE,FALSE,FALSE,,Display FALSE instead of 0
-42,,42,,Display blank cell instead of 0
+Matrices with errors and other misc potential problems:
+Err:502,Err:502,Err:502,
+#N/A,#N/A,#N/A,
+TRUE,TRUE,TRUE,
+FALSE,FALSE,FALSE,
+42,,42,,
diff --git a/sc/qa/unit/data/ods/cachedValue.ods b/sc/qa/unit/data/ods/cachedValue.ods
index a802e22..8fe411a 100644
Binary files a/sc/qa/unit/data/ods/cachedValue.ods and b/sc/qa/unit/data/ods/cachedValue.ods differ
diff --git a/sc/qa/unit/data/ods/matrix.ods b/sc/qa/unit/data/ods/matrix.ods
index d3713cf..4d2f836 100644
Binary files a/sc/qa/unit/data/ods/matrix.ods and b/sc/qa/unit/data/ods/matrix.ods differ
diff --git a/sc/qa/unit/data/ods/volatile.ods b/sc/qa/unit/data/ods/volatile.ods
deleted file mode 100644
index 6278de7..0000000
Binary files a/sc/qa/unit/data/ods/volatile.ods and /dev/null differ
diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx
index a8c37cb..6182bf3 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -133,7 +133,6 @@ public:
void testHardRecalcODS();
void testFunctionsODS();
void testCachedFormulaResultsODS();
- void testVolatileFunctionsODS();
void testCachedMatrixFormulaResultsODS();
void testDatabaseRangesODS();
void testDatabaseRangesXLS();
@@ -188,7 +187,6 @@ public:
CPPUNIT_TEST(testHardRecalcODS);
CPPUNIT_TEST(testFunctionsODS);
CPPUNIT_TEST(testCachedFormulaResultsODS);
- CPPUNIT_TEST(testVolatileFunctionsODS);
CPPUNIT_TEST(testCachedMatrixFormulaResultsODS);
CPPUNIT_TEST(testDatabaseRangesODS);
CPPUNIT_TEST(testDatabaseRangesXLS);
@@ -460,29 +458,40 @@ void ScFiltersTest::testCachedFormulaResultsODS()
createCSVPath("cachedValue.", aCSVFileName);
testFile(aCSVFileName, pDoc, 0);
- xDocSh->DoClose();
- }
-}
+ //we want to me sure that volatile functions are always recalculated
+ //regardless of cached results. if you update the ods file, you must
+ //update the values here.
+ //if NOW() is recacluated, then it should never equal sTodayCache
+ OUString sTodayCache("01/25/13 01:06 PM");
+ OUString sTodayRecalc(pDoc->GetString(0,0,1));
-void ScFiltersTest::testVolatileFunctionsODS()
-{
- ScDocShellRef xDocSh = loadDoc("volatile.", ODS);
+ CPPUNIT_ASSERT(sTodayCache != sTodayRecalc);
- CPPUNIT_ASSERT_MESSAGE("Failed to load volatile.ods", xDocSh.Is());
- ScDocument* pDoc = xDocSh->GetDocument();
-
- //we want to me sure that volatile functions are always recalculated
- //regardless of cached results. if you update the ods file, you must
- //update the values here.
- //if NOW() is recacluated, then it should never equal sTodayCache
- OUString sTodayCache("07/11/12 12:28 AM");
- OUString sTodayRecalc(pDoc->GetString(0,1,0));
- CPPUNIT_ASSERT(sTodayCache != sTodayRecalc);
+ OUString sTodayRecalcRef(pDoc->GetString(1,0,1));
+ CPPUNIT_ASSERT_EQUAL(sTodayRecalc, sTodayRecalcRef);
- OUString sTodayRecalcRef(pDoc->GetString(2,1,0));
- CPPUNIT_ASSERT(sTodayCache != sTodayRecalcRef);
+ // make sure that error values are not being treated as string values
+ for(SCCOL nCol = 0; nCol < 4; ++nCol)
+ {
+ for(SCROW nRow = 0; nRow < 2; ++nRow)
+ {
+ OUStringBuffer aIsErrorFormula("=ISERROR(");
+ aIsErrorFormula.append((char)('A'+nCol)).append(OUString::number(nRow));
+ aIsErrorFormula.append(")");
+ OUString aFormula = aIsErrorFormula.makeStringAndClear();
+ pDoc->SetString(nCol, nRow + 2, 2, aFormula);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(OUStringToOString(aFormula, RTL_TEXTENCODING_UTF8).getStr(), pDoc->GetString(nCol, nRow +2, 2), OUString("TRUE"));
+
+ OUStringBuffer aIsTextFormula("=ISTEXT(");
+ aIsTextFormula.append((char)('A'+nCol)).append(OUString::number(nRow));
+ aIsTextFormula.append(")");
+ pDoc->SetString(nCol, nRow + 4, 2, aIsTextFormula.makeStringAndClear());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("", pDoc->GetString(nCol, nRow +4, 2), OUString("FALSE"));
+ }
+ }
- xDocSh->DoClose();
+ xDocSh->DoClose();
+ }
}
void ScFiltersTest::testCachedMatrixFormulaResultsODS()
commit 3a1f90a6c7fa0c0604acac6d76f9d4ef3ac20311
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Thu Jan 24 23:22:14 2013 +0100
improve handling of error cells in cahced value import
We are finally able to handle error cells of the type Err:* and the
patch drastically reduces the number of string comparisons needed during
cached value import.
Change-Id: I4c0a2ed2561862615fe745d1a556e4004fd28d8f
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index f3265ca..0eeeecb 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -122,7 +122,9 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport,
bHasTextImport(false),
bIsFirstTextImport(false),
bSolarMutexLocked(false),
- bFormulaTextResult(false)
+ bFormulaTextResult(false),
+ mbPossibleErrorCell(false),
+ mbCheckWithCompilerForError(false)
{
rtl::math::setNan(&fValue); // NaN by default
@@ -729,7 +731,7 @@ void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const
{
if( bFormulaTextResult && pOUTextValue )
{
- if (!GetScImport().IsFormulaErrorConstant(*pOUTextValue))
+ if( !IsPossibleErrorString() )
{
pFCell->SetHybridString( *pOUTextValue );
pFCell->ResetDirty();
@@ -772,7 +774,7 @@ void ScXMLTableRowCellContext::PutTextCell( const ScAddress& rCurrentPos,
if(!aCellString.isEmpty())
{
- if (bDoIncrement && !GetScImport().IsFormulaErrorConstant(aCellString))
+ if (bDoIncrement && !IsPossibleErrorString())
{
pFCell->SetHybridString( aCellString );
pFCell->ResetDirty();
@@ -1119,7 +1121,7 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos )
ScMatrixRef pMat(new ScMatrix(nMatrixCols, nMatrixRows));
if (bFormulaTextResult && pOUTextValue)
{
- if (!GetScImport().IsFormulaErrorConstant(*pOUTextValue))
+ if (!IsPossibleErrorString())
{
pFCell->SetResultMatrix(
nMatrixCols, nMatrixRows, pMat, new formula::FormulaStringToken(*pOUTextValue));
@@ -1159,14 +1161,20 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos )
// - is blank
// - has a constant error value beginning with "#" (such as "#VALUE!" or "#N/A")
// - has an "Err:[###]" (where "[###]" is an error number)
-bool ScXMLTableRowCellContext::HasSpecialCaseFormulaText() const
+void ScXMLTableRowCellContext::HasSpecialCaseFormulaText()
{
- if( pOUTextContent &&
- ( pOUTextContent->isEmpty() || (pOUTextContent->indexOf("#") > -1) ||
- (pOUTextContent->indexOf("Err:") > -1) )
- )
- return true;
- return false;
+ if( pOUTextContent )
+ {
+ if ( pOUTextContent->isEmpty() || (pOUTextContent->indexOf("Err:") > -1) )
+ mbPossibleErrorCell = true;
+ else if (pOUTextContent->indexOf("#") > -1)
+ mbCheckWithCompilerForError = true;
+ }
+}
+
+bool ScXMLTableRowCellContext::IsPossibleErrorString() const
+{
+ return mbPossibleErrorCell || ( mbCheckWithCompilerForError && GetScImport().IsFormulaErrorConstant(*pOUTextValue) );
}
@@ -1185,8 +1193,8 @@ void ScXMLTableRowCellContext::EndElement()
aTextImport->ResetCursor();
}
}
-
- if( bFormulaTextResult && HasSpecialCaseFormulaText() )
+ HasSpecialCaseFormulaText();
+ if( bFormulaTextResult && (mbPossibleErrorCell || mbCheckWithCompilerForError) )
{
pOUTextValue.reset(*pOUTextContent);
nCellType = util::NumberFormat::TEXT;
diff --git a/sc/source/filter/xml/xmlcelli.hxx b/sc/source/filter/xml/xmlcelli.hxx
index 32f0698..2bf8b8c 100644
--- a/sc/source/filter/xml/xmlcelli.hxx
+++ b/sc/source/filter/xml/xmlcelli.hxx
@@ -65,6 +65,8 @@ class ScXMLTableRowCellContext : public SvXMLImportContext
bool bIsFirstTextImport;
bool bSolarMutexLocked;
bool bFormulaTextResult;
+ bool mbPossibleErrorCell;
+ bool mbCheckWithCompilerForError;
const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
@@ -92,7 +94,9 @@ class ScXMLTableRowCellContext : public SvXMLImportContext
void PutFormulaCell ( const ScAddress& rScCurrentPos );
void AddFormulaCell ( const ScAddress& rScCellPos );
- bool HasSpecialCaseFormulaText() const;
+ void HasSpecialCaseFormulaText();
+
+ bool IsPossibleErrorString() const;
public:
commit 255bec2034fe80a53354b956e46591097880220b
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Thu Jan 24 20:23:55 2013 +0100
improve tests for cached value import
Change-Id: I8e5f8cb351792b53c89658074e41dff3a3c4d9db
diff --git a/sc/qa/unit/data/contentCSV/cachedValue.csv b/sc/qa/unit/data/contentCSV/cachedValue.csv
new file mode 100644
index 0000000..183391b
--- /dev/null
+++ b/sc/qa/unit/data/contentCSV/cachedValue.csv
@@ -0,0 +1,2 @@
+1.00,200.00%,$3.00,1/3/00,00:00,6.00E+000,7 1/5,TRUE,9,1000%,01-10
+1,200.00%,$3.00,01/03/00,120:00:00,6.00E+000,7 1/5,TRUE,9,1000.00%,01/10/00
diff --git a/sc/qa/unit/data/ods/cachedValue.ods b/sc/qa/unit/data/ods/cachedValue.ods
new file mode 100644
index 0000000..a802e22
Binary files /dev/null and b/sc/qa/unit/data/ods/cachedValue.ods differ
diff --git a/sc/qa/unit/helper/csv_handler.hxx b/sc/qa/unit/helper/csv_handler.hxx
index 8493f10..b621baa 100644
--- a/sc/qa/unit/helper/csv_handler.hxx
+++ b/sc/qa/unit/helper/csv_handler.hxx
@@ -141,7 +141,7 @@ public:
std::cout << "result: " << (int)(aCSVString == aString) << std::endl;
#endif //DEBUG_CSV_HANDLER
- CPPUNIT_ASSERT_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aString == aCSVString);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aString, aCSVString);
}
else
{
@@ -169,7 +169,7 @@ public:
std::cout << "result: " << (int)(aCSVString == aString) << std::endl;
#endif //DEBUG_CSV_HANDLER
- CPPUNIT_ASSERT_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aString == aCSVString);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aString, aCSVString);
}
else
{
diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx
index c8dcf40..a8c37cb 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -188,8 +188,8 @@ public:
CPPUNIT_TEST(testHardRecalcODS);
CPPUNIT_TEST(testFunctionsODS);
CPPUNIT_TEST(testCachedFormulaResultsODS);
- //CPPUNIT_TEST(testVolatileFunctionsODS);
- //CPPUNIT_TEST(testCachedMatrixFormulaResultsODS);
+ CPPUNIT_TEST(testVolatileFunctionsODS);
+ CPPUNIT_TEST(testCachedMatrixFormulaResultsODS);
CPPUNIT_TEST(testDatabaseRangesODS);
CPPUNIT_TEST(testDatabaseRangesXLS);
CPPUNIT_TEST(testDatabaseRangesXLSX);
@@ -428,26 +428,40 @@ void ScFiltersTest::testFunctionsODS()
void ScFiltersTest::testCachedFormulaResultsODS()
{
- ScDocShellRef xDocSh = loadDoc("functions.", ODS);
- CPPUNIT_ASSERT_MESSAGE("Failed to load functions.*", xDocSh.Is());
+ {
+ ScDocShellRef xDocSh = loadDoc("functions.", ODS);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load functions.*", xDocSh.Is());
- ScDocument* pDoc = xDocSh->GetDocument();
- rtl::OUString aCSVFileName;
+ ScDocument* pDoc = xDocSh->GetDocument();
+ rtl::OUString aCSVFileName;
- //test cached formula results of logical functions
- createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("logical-functions.")), aCSVFileName);
- testFile(aCSVFileName, pDoc, 0);
- //test cached formula results of spreadsheet functions
- createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("spreadsheet-functions.")), aCSVFileName);
- testFile(aCSVFileName, pDoc, 1);
- //test cached formula results of mathematical functions
- createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("mathematical-functions.")), aCSVFileName);
- testFile(aCSVFileName, pDoc, 2, PureString);
- //test cached formula results of informations functions
- createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("information-functions.")), aCSVFileName);
- testFile(aCSVFileName, pDoc, 3);
+ //test cached formula results of logical functions
+ createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("logical-functions.")), aCSVFileName);
+ testFile(aCSVFileName, pDoc, 0);
+ //test cached formula results of spreadsheet functions
+ createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("spreadsheet-functions.")), aCSVFileName);
+ testFile(aCSVFileName, pDoc, 1);
+ //test cached formula results of mathematical functions
+ createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("mathematical-functions.")), aCSVFileName);
+ testFile(aCSVFileName, pDoc, 2, PureString);
+ //test cached formula results of informations functions
+ createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("information-functions.")), aCSVFileName);
+ testFile(aCSVFileName, pDoc, 3);
- xDocSh->DoClose();
+ xDocSh->DoClose();
+ }
+
+ {
+ ScDocShellRef xDocSh = loadDoc("cachedValue.", ODS);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load cachedValue.*", xDocSh.Is());
+
+ ScDocument* pDoc = xDocSh->GetDocument();
+ rtl::OUString aCSVFileName;
+ createCSVPath("cachedValue.", aCSVFileName);
+ testFile(aCSVFileName, pDoc, 0);
+
+ xDocSh->DoClose();
+ }
}
void ScFiltersTest::testVolatileFunctionsODS()
commit de7985809f5e01f274e5d7a946e431ae475ea1e7
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Thu Jan 24 20:24:46 2013 +0100
a few more fixes for cached value import
Change-Id: I2b6baedc8232811df1e5525bd2884b54db5a8f70
diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx
index 8df14f1..0967e81 100644
--- a/sc/source/core/data/cell.cxx
+++ b/sc/source/core/data/cell.cxx
@@ -1587,7 +1587,7 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam )
}
else
{
- if ( eOld == svHybridCell ) // string result from SetFormulaResultString?
+ if ( eOld == svHybridCell || eOld == svHybridValueCell ) // string result from SetFormulaResultString?
eOld = svString; // ScHybridCellToken has a valid GetString method
// #i106045# use approxEqual to compare with stored value
@@ -1612,7 +1612,7 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam )
if ( bChanged && !bContentChanged && pDocument->IsStreamValid(aPos.Tab()) )
{
if ( ( eOld == svUnknown && ( eNew == svError || ( eNew == svDouble && aNewResult.GetDouble() == 0.0 ) ) ) ||
- ( eOld == svHybridCell && eNew == svString && aResult.GetString() == aNewResult.GetString() ) ||
+ ( (eOld == svHybridCell || eOld == svHybridValueCell) && eNew == svString && aResult.GetString() == aNewResult.GetString() ) ||
( eOld == svDouble && eNew == svDouble && rtl::math::approxEqual( aResult.GetDouble(), aNewResult.GetDouble() ) ) )
{
// no change, see above
diff --git a/sc/source/core/tool/formularesult.cxx b/sc/source/core/tool/formularesult.cxx
index 9602c44..791dbad 100644
--- a/sc/source/core/tool/formularesult.cxx
+++ b/sc/source/core/tool/formularesult.cxx
@@ -448,9 +448,16 @@ void ScFormulaResult::SetHybridFormula( const String & rFormula )
void ScFormulaResult::SetHybridValueString( double nVal, const OUString& rStr )
{
+ if(GetType() == formula::svMatrixCell)
+ {
+ SetDouble(nVal);
+ return;
+ }
+
ResetToDefaults();
if (mbToken && mpToken)
mpToken->DecRef();
+
mpToken = new ScHybridValueCellToken( nVal, rStr );
mpToken->IncRef();
mbToken = true;
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index e93f33d..f3265ca 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -352,7 +352,7 @@ SvXMLImportContext *ScXMLTableRowCellContext::CreateChildContext( sal_uInt16 nPr
ScAddress aCellPos = rXMLImport.GetTables().GetCurrentCellPos();
- if( ((nCellType == util::NumberFormat::TEXT) || pOUFormula) )
+ if( ((nCellType == util::NumberFormat::TEXT) || pOUFormula || bFormulaTextResult) )
{
if ( pOUFormula )
{
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 84b5364..79e7dd0 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -470,8 +470,10 @@ sal_Bool ScDocShell::LoadXML( SfxMedium* pLoadMedium, const ::com::sun::star::un
if (bHardRecalc)
DoHardRecalc(false);
else
+ {
// still need to recalc volatile formula cells.
- aDocument.CalcFormulaTree(false, true, false);
+ aDocument.Broadcast( SC_HINT_DATACHANGED, BCA_BRDCST_ALWAYS, NULL );
+ }
bool bAdjustHeightOld = aDocument.IsAdjustHeightEnabled();
aDocument.EnableAdjustHeight(false);
More information about the Libreoffice-commits
mailing list