[Libreoffice-commits] core.git: 2 commits - sc/qa sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Mon Mar 10 17:45:01 PDT 2014
sc/qa/unit/ucalc.hxx | 2
sc/qa/unit/ucalc_sharedformula.cxx | 87 +++++++++++++++++++++++++++++++++++++
sc/source/core/tool/token.cxx | 19 ++++++++
3 files changed, 108 insertions(+)
New commits:
commit dd7787ed75e33b65ebee2a6c0aa152efded6f1b8
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Mon Mar 10 20:39:01 2014 -0400
fdo#75815: Adjust external references here too.
Adjusting external references are much simpler than adjusting internal
ones since we don't need to worry about deleted references etc.
Change-Id: I82111e383e1fc6976ef08c1438c3dd916a249af6
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index eee7c9d2..8057224 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -2751,6 +2751,25 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon
rRef.SetRange(aAbs, aNewPos);
}
break;
+ case svExternalSingleRef:
+ {
+ // For external reference, just reset the reference with
+ // respect to the new cell position.
+ ScToken* pToken = static_cast<ScToken*>(*p);
+ ScSingleRefData& rRef = pToken->GetSingleRef();
+ ScAddress aAbs = rRef.toAbs(rOldPos);
+ rRef.SetAddress(aAbs, aNewPos);
+ }
+ break;
+ case svExternalDoubleRef:
+ {
+ // Same as above.
+ ScToken* pToken = static_cast<ScToken*>(*p);
+ ScComplexRefData& rRef = pToken->GetDoubleRef();
+ ScRange aAbs = rRef.toAbs(rOldPos);
+ rRef.SetRange(aAbs, aNewPos);
+ }
+ break;
case svIndex:
{
const formula::FormulaToken* pToken = *p;
commit 149b580900214c477f8eaf9dd51342796d27b296
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Mon Mar 10 19:27:21 2014 -0400
fdo#75815: Write test for this first.
Change-Id: I2a5a1964dc6496aa4db15c9e8644692b460d0527
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 7c40fb8..58dc083 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -262,6 +262,7 @@ public:
void testSharedFormulas();
void testSharedFormulasRefUpdate();
void testSharedFormulasRefUpdateRange();
+ void testSharedFormulasRefUpdateExternal();
void testSharedFormulasDeleteRows();
void testSharedFormulasDeleteColumns();
void testSharedFormulasRefUpdateMoveSheets();
@@ -435,6 +436,7 @@ public:
CPPUNIT_TEST(testSharedFormulas);
CPPUNIT_TEST(testSharedFormulasRefUpdate);
CPPUNIT_TEST(testSharedFormulasRefUpdateRange);
+ CPPUNIT_TEST(testSharedFormulasRefUpdateExternal);
CPPUNIT_TEST(testSharedFormulasDeleteRows);
CPPUNIT_TEST(testSharedFormulasDeleteColumns);
CPPUNIT_TEST(testSharedFormulasRefUpdateMoveSheets);
diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx
index ae1ad58..98d087d 100644
--- a/sc/qa/unit/ucalc_sharedformula.cxx
+++ b/sc/qa/unit/ucalc_sharedformula.cxx
@@ -449,6 +449,93 @@ void Test::testSharedFormulasRefUpdateRange()
m_pDoc->DeleteTab(0);
}
+void Test::testSharedFormulasRefUpdateExternal()
+{
+ sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
+ m_pDoc->InsertTab(0, "Formula");
+
+ // Launch an external document shell.
+ ScDocShellRef xExtDocSh = new ScDocShell;
+ OUString aExtDocName("file:///extdata.fake");
+
+ SfxMedium* pMed = new SfxMedium(aExtDocName, STREAM_STD_READWRITE);
+ xExtDocSh->DoInitNew(pMed);
+ ScDocument* pExtDoc = xExtDocSh->GetDocument();
+
+ // Populate A1:A3.
+ pExtDoc->InsertTab(0, "Data");
+ pExtDoc->SetString(ScAddress(0,0,0), "A");
+ pExtDoc->SetString(ScAddress(0,1,0), "B");
+ pExtDoc->SetString(ScAddress(0,2,0), "C");
+
+ // Insert formula cells in A7:A10 of the host document, referencing A1:A3
+ // of the external document.
+ m_pDoc->SetString(ScAddress(0,6,0), "='file:///extdata.fake'#$Data.A1");
+ m_pDoc->SetString(ScAddress(0,7,0), "='file:///extdata.fake'#$Data.A2");
+ m_pDoc->SetString(ScAddress(0,8,0), "='file:///extdata.fake'#$Data.A3");
+ m_pDoc->SetString(ScAddress(0,9,0), "=COUNTA('file:///extdata.fake'#$Data.A1:A3)");
+
+ // Check the formula results.
+ CPPUNIT_ASSERT_EQUAL(OUString("A"), m_pDoc->GetString(ScAddress(0,6,0)));
+ CPPUNIT_ASSERT_EQUAL(OUString("B"), m_pDoc->GetString(ScAddress(0,7,0)));
+ CPPUNIT_ASSERT_EQUAL(OUString("C"), m_pDoc->GetString(ScAddress(0,8,0)));
+ CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(ScAddress(0,9,0)));
+
+ // Check the formulas too.
+ if (!checkFormula(*m_pDoc, ScAddress(0,6,0), "'file:///extdata.fake'#$Data.A1"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,7,0), "'file:///extdata.fake'#$Data.A2"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,8,0), "'file:///extdata.fake'#$Data.A3"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,9,0), "COUNTA('file:///extdata.fake'#$Data.A1:A3)"))
+ CPPUNIT_FAIL("Wrong formula!");
+
+ // Delete rows 1 and 2. This should not change the references in the formula cells below.
+ ScDocFunc& rDocFunc = getDocShell().GetDocFunc();
+ ScMarkData aMark;
+ aMark.SelectOneTable(0);
+ rDocFunc.DeleteCells(ScRange(0,0,0,MAXCOL,1,0), &aMark, DEL_CELLSUP, true, true);
+
+ // Check the shifted formula cells now in A5:A8.
+ if (!checkFormula(*m_pDoc, ScAddress(0,4,0), "'file:///extdata.fake'#$Data.A1"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,5,0), "'file:///extdata.fake'#$Data.A2"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,6,0), "'file:///extdata.fake'#$Data.A3"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,7,0), "COUNTA('file:///extdata.fake'#$Data.A1:A3)"))
+ CPPUNIT_FAIL("Wrong formula!");
+
+ // Undo and check the formulas again.
+ SfxUndoManager* pUndoMgr = m_pDoc->GetUndoManager();
+ CPPUNIT_ASSERT(pUndoMgr);
+ pUndoMgr->Undo();
+ if (!checkFormula(*m_pDoc, ScAddress(0,6,0), "'file:///extdata.fake'#$Data.A1"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,7,0), "'file:///extdata.fake'#$Data.A2"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,8,0), "'file:///extdata.fake'#$Data.A3"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,9,0), "COUNTA('file:///extdata.fake'#$Data.A1:A3)"))
+ CPPUNIT_FAIL("Wrong formula!");
+
+ // Redo the row deletion and check the formulas again.
+ pUndoMgr->Redo();
+ if (!checkFormula(*m_pDoc, ScAddress(0,4,0), "'file:///extdata.fake'#$Data.A1"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,5,0), "'file:///extdata.fake'#$Data.A2"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,6,0), "'file:///extdata.fake'#$Data.A3"))
+ CPPUNIT_FAIL("Wrong formula!");
+ if (!checkFormula(*m_pDoc, ScAddress(0,7,0), "COUNTA('file:///extdata.fake'#$Data.A1:A3)"))
+ CPPUNIT_FAIL("Wrong formula!");
+
+ xExtDocSh->DoClose();
+
+ m_pDoc->DeleteTab(0);
+}
+
void Test::testSharedFormulasDeleteRows()
{
m_pDoc->InsertTab(0, "Test");
More information about the Libreoffice-commits
mailing list