summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-02-28 09:58:05 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-02-28 21:28:56 -0500
commitaa6c5b7faecdb57cbdeac051e304531c1a1cf63b (patch)
tree3c0cfe7f77e9456e3173e00632174e541f4dadc2
parentf821b00c6d2b362974c4a78d3bc8d57839289121 (diff)
fdo#75053: Write test for this.
Change-Id: I51c552c23af5d1669e35817e4f54f75be6b54180
-rw-r--r--sc/qa/unit/ucalc.hxx2
-rw-r--r--sc/qa/unit/ucalc_sharedformula.cxx90
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");