[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/qa sc/source

Michael Meeks michael.meeks at suse.com
Mon Mar 18 14:31:09 PDT 2013


 sc/qa/unit/ucalc.cxx            |   58 ++++++++++++++++++++++++++++++++++++++++
 sc/source/core/data/cell2.cxx   |   14 +++++++--
 sc/source/core/data/column3.cxx |    4 --
 3 files changed, 69 insertions(+), 7 deletions(-)

New commits:
commit e5617cec76d2d6ad70175d7ffddf6cbcb8eabe85
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Mon Mar 18 21:29:58 2013 +0000

    add initial formula group unit tests.
    
    Change-Id: Id4dd3cc0d3d8a4db641e316d2eda44a5b94105c7

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 3e9a14d..f530890 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -33,6 +33,7 @@
 #include <osl/file.hxx>
 
 #include "scdll.hxx"
+#include "cell.hxx"
 #include "document.hxx"
 #include "stringutil.hxx"
 #include "scmatrix.hxx"
@@ -266,6 +267,11 @@ public:
     void testAnchoredRotatedShape();
     void testCellTextWidth();
 
+    /**
+     * Test formula & formula grouping
+     */
+    void testFormulaGrouping();
+
     CPPUNIT_TEST_SUITE(Test);
     CPPUNIT_TEST(testCollator);
     CPPUNIT_TEST(testRangeList);
@@ -328,6 +334,7 @@ public:
     CPPUNIT_TEST(testDeleteCol);
     CPPUNIT_TEST(testAnchoredRotatedShape);
     CPPUNIT_TEST(testCellTextWidth);
+    CPPUNIT_TEST(testFormulaGrouping);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -6174,6 +6181,57 @@ void Test::testCellTextWidth()
     m_pDoc->DeleteTab(0);
 }
 
+void Test::testFormulaGrouping()
+{
+    static const struct {
+        const char *pFormula[3];
+        const bool  bGroup[3];
+    } aGroupTests[] = {
+        { { "=B1",  "=C1",  "" },      // single increments
+          { true,   true,    false } },
+        { { "=B1",  "=D1",  "=F1" },   // tripple increments
+          { true,  true,    true } },
+        { { "=B1",  "",     "=C1" },   // a gap
+          { false,  false,  false } },
+        { { "=B1",  "=C1+3", "=C1+D1" }, // confusion: FIXME: =C1+7
+          { false,  false,  false } },
+    };
+
+    m_pDoc->InsertTab( 0, "sheet" );
+
+    for (size_t i = 0; i < SAL_N_ELEMENTS( aGroupTests ); i++)
+    {
+        for (size_t j = 0; j < SAL_N_ELEMENTS( aGroupTests[0].pFormula ); j++)
+        {
+            OUString aFormula = OUString::createFromAscii(aGroupTests[i].pFormula[j]);
+            m_pDoc->SetString(0, (SCROW)j, 0, aFormula);
+        }
+        m_pDoc->RebuildFormulaGroups();
+
+        for (size_t j = 0; j < SAL_N_ELEMENTS( aGroupTests[0].pFormula ); j++)
+        {
+            ScBaseCell *pCell = NULL;
+            m_pDoc->GetCell( 0, (SCROW)j, 0, pCell );
+            if( !pCell )
+            {
+                CPPUNIT_ASSERT_MESSAGE("invalid empty cell", !aGroupTests[i].bGroup[j]);
+                continue;
+            }
+            CPPUNIT_ASSERT_MESSAGE("Cell expected, but not there.", pCell != NULL);
+            CPPUNIT_ASSERT_MESSAGE("Cell wrong type.",
+                                   pCell->GetCellType() == CELLTYPE_FORMULA);
+            ScFormulaCell *pCur = static_cast< ScFormulaCell *>( pCell );
+
+            if( !!pCur->GetCellGroup().get() ^ aGroupTests[i].bGroup[j] )
+            {
+                printf("expected group test %d at row %d to be %d but is %d\n",
+                       i, j, !!pCur->GetCellGroup().get(), aGroupTests[i].bGroup[j]);
+                CPPUNIT_ASSERT_MESSAGE("Failed", false);
+            }
+        }
+    }
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 }
diff --git a/sc/source/core/data/cell2.cxx b/sc/source/core/data/cell2.cxx
index 4cb4eb8..db14d58 100644
--- a/sc/source/core/data/cell2.cxx
+++ b/sc/source/core/data/cell2.cxx
@@ -1752,11 +1752,15 @@ ScSimilarFormulaDelta *ScFormulaCell::BuildDeltaTo( ScFormulaCell *pOtherCell )
             fprintf( stderr, "Incompatible type, op-code or param counts\n" );
             return NULL;
         }
-        if( pThis[ i ]->GetType() == formula::svMatrix ||
-            pOther[ i ]->GetType() == formula::svMatrix )
+        switch( pThis[ i ]->GetType() )
         {
-            fprintf( stderr, "Ignoring matrix formulae for now\n" );
+        case formula::svMatrix:
+        case formula::svExternalSingleRef:
+        case formula::svExternalDoubleRef:
+            fprintf( stderr, "Ignoring matrix and external references for now\n" );
             return NULL;
+        default:
+            break;
         }
     }
 
@@ -1765,6 +1769,10 @@ ScSimilarFormulaDelta *ScFormulaCell::BuildDeltaTo( ScFormulaCell *pOtherCell )
 
     for ( sal_uInt16 i = 0; i < pThisLen; i++ )
     {
+        if ( pThis[i]->GetType() != formula::svSingleRef &&
+             pThis[i]->GetType() != formula::svDoubleRef )
+            continue;
+
         ScToken *pThisTok = static_cast< ScToken * >( pThis[ i ] );
         ScToken *pOtherTok = static_cast< ScToken * >( pOther[ i ] );
 
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index d288625..5ddb3f1 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -2036,7 +2036,6 @@ void ScColumn::RebuildFormulaGroups()
         ScFormulaCell *pCur = static_cast< ScFormulaCell *>( rCur.pCell );
         ScFormulaCell *pPrev = static_cast< ScFormulaCell *>( rPrev.pCell );
 
-#ifdef BUILD_FORMULA_GROUPS
         fprintf( stderr, "column has contiguous formulae\n" );
         ScSimilarFormulaDelta *pDelta = pPrev->BuildDeltaTo( pCur );
 
@@ -2081,9 +2080,6 @@ void ScColumn::RebuildFormulaGroups()
 
             pCur->ReleaseDelta( pDelta );
         }
-#else
-        (void)pCur; (void) pPrev;
-#endif
     }
 
     bDirtyGroups = false;


More information about the Libreoffice-commits mailing list