diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-28 09:58:05 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-28 21:28:56 -0500 |
commit | aa6c5b7faecdb57cbdeac051e304531c1a1cf63b (patch) | |
tree | 3c0cfe7f77e9456e3173e00632174e541f4dadc2 | |
parent | f821b00c6d2b362974c4a78d3bc8d57839289121 (diff) |
fdo#75053: Write test for this.
Change-Id: I51c552c23af5d1669e35817e4f54f75be6b54180
-rw-r--r-- | sc/qa/unit/ucalc.hxx | 2 | ||||
-rw-r--r-- | sc/qa/unit/ucalc_sharedformula.cxx | 90 |
2 files changed, 92 insertions, 0 deletions
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index 4f8810aaac50..f51556f90208 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -267,6 +267,7 @@ public: void testSharedFormulasRefUpdate(); void testSharedFormulasRefUpdateRange(); void testSharedFormulasDeleteRows(); + void testSharedFormulasDeleteColumns(); void testSharedFormulasRefUpdateMoveSheets(); void testSharedFormulasRefUpdateCopySheets(); void testSharedFormulasCopyPaste(); @@ -439,6 +440,7 @@ public: CPPUNIT_TEST(testSharedFormulasRefUpdate); CPPUNIT_TEST(testSharedFormulasRefUpdateRange); CPPUNIT_TEST(testSharedFormulasDeleteRows); + CPPUNIT_TEST(testSharedFormulasDeleteColumns); CPPUNIT_TEST(testSharedFormulasRefUpdateMoveSheets); CPPUNIT_TEST(testSharedFormulasRefUpdateCopySheets); CPPUNIT_TEST(testSharedFormulasCopyPaste); diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx index d8974aefda85..677b0e20006e 100644 --- a/sc/qa/unit/ucalc_sharedformula.cxx +++ b/sc/qa/unit/ucalc_sharedformula.cxx @@ -16,6 +16,8 @@ #include "undoblk.hxx" #include "scopetools.hxx" #include <docfunc.hxx> +#include <tokenarray.hxx> +#include <tokenstringcontext.hxx> #include "svl/sharedstring.hxx" #include "formula/grammar.hxx" @@ -519,6 +521,94 @@ void Test::testSharedFormulasDeleteRows() CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedLength()); } +void Test::testSharedFormulasDeleteColumns() +{ + using namespace formula; + + m_pDoc->InsertTab(0, "Test"); + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. + FormulaGrammarSwitch aFGSwitch(m_pDoc, formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1); + + ScDocFunc& rFunc = getDocShell().GetDocFunc(); + ScMarkData aMark; + aMark.SelectOneTable(0); + + // First, test a single cell case. A value in B1 and formula in C1. + m_pDoc->SetValue(ScAddress(1,0,0), 11.0); + m_pDoc->SetString(ScAddress(2,0,0), "=RC[-1]"); + CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(ScAddress(2,0,0))); + + // Delete column B. + rFunc.DeleteCells(ScRange(1,0,0,1,MAXROW,0), &aMark, DEL_CELLSLEFT, true, true); + CPPUNIT_ASSERT_EQUAL(OUString("#REF!"), m_pDoc->GetString(ScAddress(1,0,0))); + + // The reference should still point to row 1 but the column status should be set to 'deleted'. + const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1,0,0)); + CPPUNIT_ASSERT(pFC); + const ScTokenArray* pCode = pFC->GetCode(); + CPPUNIT_ASSERT(pCode && pCode->GetLen() == 1); + const FormulaToken* pToken = pCode->GetArray()[0]; + CPPUNIT_ASSERT(pToken->GetType() == svSingleRef); + const ScSingleRefData* pSRef = &static_cast<const ScToken*>(pToken)->GetSingleRef(); + CPPUNIT_ASSERT(pSRef->IsColDeleted()); + CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(0), pSRef->toAbs(ScAddress(1,0,0)).Row()); + + // The formula string should show #REF! in lieu of the column position (only for Calc A1 syntax). + sc::CompileFormulaContext aCFCxt(m_pDoc, FormulaGrammar::GRAM_ENGLISH); + CPPUNIT_ASSERT_EQUAL(OUString("=#REF!1"), pFC->GetFormula(aCFCxt)); + + SfxUndoManager* pUndoMgr = m_pDoc->GetUndoManager(); + CPPUNIT_ASSERT(pUndoMgr); + + // Undo and make sure the deleted flag is gone. + pUndoMgr->Undo(); + CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(ScAddress(2,0,0))); + pFC = m_pDoc->GetFormulaCell(ScAddress(2,0,0)); + CPPUNIT_ASSERT_EQUAL(OUString("=B1"), pFC->GetFormula(aCFCxt)); + + // Clear row 1 and move over to a formula group case. + clearRange(m_pDoc, ScRange(0,0,0,MAXCOL,0,0)); + + // Fill A1:B2 with numbers, and C1:C2 with formula that reference those numbers. + for (SCROW i = 0; i <= 1; ++i) + { + m_pDoc->SetValue(ScAddress(0,i,0), (i+1)); + m_pDoc->SetValue(ScAddress(1,i,0), (i+11)); + m_pDoc->SetString(ScAddress(2,i,0), "=RC[-2]+RC[-1]"); + double fCheck = m_pDoc->GetValue(ScAddress(0,i,0)); + fCheck += m_pDoc->GetValue(ScAddress(1,i,0)); + CPPUNIT_ASSERT_EQUAL(fCheck, m_pDoc->GetValue(ScAddress(2,i,0))); + } + + // Delete column B. + rFunc.DeleteCells(ScRange(1,0,0,1,MAXROW,0), &aMark, DEL_CELLSLEFT, true, true); + + for (SCROW i = 0; i <= 1; ++i) + { + ScAddress aPos(1,i,0); + CPPUNIT_ASSERT_EQUAL(OUString("#REF!"), m_pDoc->GetString(aPos)); + } + + pFC = m_pDoc->GetFormulaCell(ScAddress(1,0,0)); // B1 + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(OUString("=A1+#REF!1"), pFC->GetFormula(aCFCxt)); + pFC = m_pDoc->GetFormulaCell(ScAddress(1,1,0)); // B2 + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(OUString("=A2+#REF!2"), pFC->GetFormula(aCFCxt)); + + // Undo deletion of column B and check the results of C1:C2. + pUndoMgr->Undo(); + for (SCROW i = 0; i <= 1; ++i) + { + double fCheck = m_pDoc->GetValue(ScAddress(0,i,0)); + fCheck += m_pDoc->GetValue(ScAddress(1,i,0)); + CPPUNIT_ASSERT_EQUAL(fCheck, m_pDoc->GetValue(ScAddress(2,i,0))); + } + + m_pDoc->DeleteTab(0); +} + void Test::testSharedFormulasRefUpdateMoveSheets() { m_pDoc->InsertTab(0, "Sheet1"); |