From 7dda56143f17f9b85bcc9630f2fad12b65541fc2 Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Fri, 8 Apr 2016 14:59:09 +0100 Subject: unit test for replacing fragments of shared formula groups, tdf#97897 Change-Id: If17b0f812c33f338e7ff5af381c1ed17b9965eba --- sc/qa/unit/ucalc.hxx | 2 + sc/qa/unit/ucalc_sharedformula.cxx | 156 +++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index 1f469b1640d9..9c930169041f 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -360,6 +360,7 @@ public: void testSharedFormulaAbsCellListener(); void testSharedFormulaUnshareAreaListeners(); void testSharedFormulaListenerDeleteArea(); + void testSharedFormulaUpdateOnReplacement(); void testFormulaPosition(); void testFormulaWizardSubformula(); @@ -654,6 +655,7 @@ public: CPPUNIT_TEST(testSharedFormulaAbsCellListener); CPPUNIT_TEST(testSharedFormulaUnshareAreaListeners); CPPUNIT_TEST(testSharedFormulaListenerDeleteArea); + CPPUNIT_TEST(testSharedFormulaUpdateOnReplacement); CPPUNIT_TEST(testFormulaPosition); CPPUNIT_TEST(testFormulaWizardSubformula); CPPUNIT_TEST(testMixData); diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx index 8ae2cf9ed83e..15db4f6a11c4 100644 --- a/sc/qa/unit/ucalc_sharedformula.cxx +++ b/sc/qa/unit/ucalc_sharedformula.cxx @@ -1800,4 +1800,160 @@ void Test::testSharedFormulaListenerDeleteArea() m_pDoc->DeleteTab(0); } +void Test::testSharedFormulaUpdateOnReplacement() +{ + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. + + m_pDoc->InsertTab(0, "Test"); + + const char* pData[][1] = { + { "1" }, + { "=SUM($A$1:$A1)" }, + { "=SUM($A$1:$A2)" }, + { "=SUM($A$1:$A3)" }, + { "=SUM($A$1:$A4)" }, + { "=SUM($A$1:$A5)" }, + { "=SUM($A$1:$A6)" }, + { "=SUM($A$1:$A7)" } + }; + + insertRangeData(m_pDoc, ScAddress(0,0,0), pData, SAL_N_ELEMENTS(pData)); + + // Check that A2:A8 is a formula group. + const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(0,1,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(7), pFC->GetSharedLength()); + + { // Check initial results. + ScAddress aPos(0,0,0); + const double fResult[] = { 1.0, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0 }; + for (SCROW nRow = 1; nRow < 8; ++nRow) + { + aPos.SetRow(nRow); + CPPUNIT_ASSERT_EQUAL( fResult[nRow], m_pDoc->GetValue( aPos)); + } + } + + // Set up an undo object for deleting A4. + ScRange aUndoRange(0,3,0,0,3,0); + ScMarkData aMark; + aMark.SelectOneTable(0); + aMark.SetMultiMarkArea(aUndoRange); + std::unique_ptr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); + pUndoDoc->InitUndo(m_pDoc, 0, 0); + m_pDoc->CopyToDocument(aUndoRange, InsertDeleteFlags::CONTENTS, false, pUndoDoc.get(), &aMark); + ScUndoDeleteContents aUndo(&getDocShell(), aMark, aUndoRange, std::move(pUndoDoc), false, InsertDeleteFlags::CONTENTS, true); + + // Delete A4. + clearRange(m_pDoc, aUndoRange); + + // Check that A2:A3 and A5:A8 are formula groups. + pFC = m_pDoc->GetFormulaCell(ScAddress(0,1,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pFC->GetSharedLength()); + pFC = m_pDoc->GetFormulaCell(ScAddress(0,4,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pFC->GetSharedLength()); + + { // Check results of A4 deleted. + ScAddress aPos(0,0,0); + const double fResult[] = { 1.0, 1.0, 2.0, 0.0, 4.0, 8.0, 16.0, 32.0 }; + for (SCROW nRow = 1; nRow < 8; ++nRow) + { + aPos.SetRow(nRow); + CPPUNIT_ASSERT_EQUAL( fResult[nRow], m_pDoc->GetValue( aPos)); + } + } + + // Restore A4. + aUndo.Undo(); + + // Check that A2:A8 is a formula group. + pFC = m_pDoc->GetFormulaCell(ScAddress(0,1,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(7), pFC->GetSharedLength()); + + { // Check initial results. + ScAddress aPos(0,0,0); + const double fResult[] = { 1.0, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0 }; + for (SCROW nRow = 1; nRow < 8; ++nRow) + { + aPos.SetRow(nRow); + CPPUNIT_ASSERT_EQUAL( fResult[nRow], m_pDoc->GetValue( aPos)); + } + } + + // Delete A4 using selection. + m_pDoc->DeleteSelection(InsertDeleteFlags::ALL, aMark); + + // Check that A2:A3 and A5:A8 are formula groups. + pFC = m_pDoc->GetFormulaCell(ScAddress(0,1,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pFC->GetSharedLength()); + pFC = m_pDoc->GetFormulaCell(ScAddress(0,4,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pFC->GetSharedLength()); + + { // Check results of A4 deleted. + ScAddress aPos(0,0,0); + const double fResult[] = { 1.0, 1.0, 2.0, 0.0, 4.0, 8.0, 16.0, 32.0 }; + for (SCROW nRow = 1; nRow < 8; ++nRow) + { + aPos.SetRow(nRow); + CPPUNIT_ASSERT_EQUAL( fResult[nRow], m_pDoc->GetValue( aPos)); + } + } + + // Restore A4. + aUndo.Undo(); + + // Check that A2:A8 is a formula group. + pFC = m_pDoc->GetFormulaCell(ScAddress(0,1,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(7), pFC->GetSharedLength()); + + { // Check initial results. + ScAddress aPos(0,0,0); + const double fResult[] = { 1.0, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0 }; + for (SCROW nRow = 1; nRow < 8; ++nRow) + { + aPos.SetRow(nRow); + CPPUNIT_ASSERT_EQUAL( fResult[nRow], m_pDoc->GetValue( aPos)); + } + } + + // Replace A4 with 0. + m_pDoc->SetString( ScAddress(0,3,0), "0"); + + // Check that A2:A3 and A5:A8 are formula groups. + pFC = m_pDoc->GetFormulaCell(ScAddress(0,1,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pFC->GetSharedLength()); + pFC = m_pDoc->GetFormulaCell(ScAddress(0,4,0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pFC->GetSharedLength()); + + { // Check results of A4 set to zero. + ScAddress aPos(0,0,0); + const double fResult[] = { 1.0, 1.0, 2.0, 0.0, 4.0, 8.0, 16.0, 32.0 }; + for (SCROW nRow = 1; nRow < 8; ++nRow) + { + aPos.SetRow(nRow); + CPPUNIT_ASSERT_EQUAL( fResult[nRow], m_pDoc->GetValue( aPos)); + } + } + + m_pDoc->DeleteTab(0); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3