diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-05-08 16:36:45 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-05-09 13:34:37 -0400 |
commit | c6d4a39832357b9e836c0c9903d2286bcf1a69d2 (patch) | |
tree | c3b3d83c4a73b108e6326f35220c5daea29e60dc | |
parent | 6cac65cc6e89f4f36dbcca3682f08b7b5ed5b750 (diff) |
Test more broadcaster relocation scenarios.
Change-Id: Ib34b86cfe6b96134dadf5f8da6dcd14ec0adb9d6
-rw-r--r-- | sc/qa/unit/ucalc.cxx | 79 |
1 files changed, 75 insertions, 4 deletions
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index d123a6ca9a17..940b41edb0aa 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -1547,29 +1547,38 @@ bool broadcasterShifted(const ScDocument& rDoc, const ScAddress& rFrom, const Sc return true; } -bool checkRelativeRefToken(ScDocument& rDoc, const ScAddress& rPos, SCsCOL nRelCol, SCsROW nRelRow) +ScToken* getSingleRefToken(ScDocument& rDoc, const ScAddress& rPos) { ScFormulaCell* pFC = rDoc.GetFormulaCell(rPos); if (!pFC) { cerr << "Formula cell expected, but not found." << endl; - return false; + return NULL; } ScTokenArray* pTokens = pFC->GetCode(); if (!pTokens) { cerr << "Token array is not present." << endl; - return false; + return NULL; } ScToken* pToken = static_cast<ScToken*>(pTokens->First()); if (!pToken || pToken->GetType() != formula::svSingleRef) { cerr << "Not a single reference token." << endl; - return false; + return NULL; } + return pToken; +} + +bool checkRelativeRefToken(ScDocument& rDoc, const ScAddress& rPos, SCsCOL nRelCol, SCsROW nRelRow) +{ + ScToken* pToken = getSingleRefToken(rDoc, rPos); + if (!pToken) + return false; + ScSingleRefData& rRef = pToken->GetSingleRef(); if (!rRef.IsColRel() || rRef.nRelCol != nRelCol) { @@ -1586,6 +1595,22 @@ bool checkRelativeRefToken(ScDocument& rDoc, const ScAddress& rPos, SCsCOL nRelC return true; } +bool checkDeletedRefToken(ScDocument& rDoc, const ScAddress& rPos) +{ + ScToken* pToken = getSingleRefToken(rDoc, rPos); + if (!pToken) + return false; + + ScSingleRefData& rRef = pToken->GetSingleRef(); + if (!rRef.IsDeleted()) + { + cerr << "Deleted reference is expected, but it's still a valid reference." << endl; + return false; + } + + return true; +} + } void Test::testCellBroadcaster() @@ -1661,6 +1686,52 @@ void Test::testCellBroadcaster() CPPUNIT_ASSERT_MESSAGE("Broadcaster relocation failed.", broadcasterShifted(*m_pDoc, ScAddress(0,2,0), ScAddress(0,0,0))); + // Clear everything again + clearRange(m_pDoc, ScRange(0,0,0,10,100,0)); + + // B1:B3 depends on A1:A3 + m_pDoc->SetString(ScAddress(1,0,0), "=A1"); + m_pDoc->SetString(ScAddress(1,1,0), "=A2"); + m_pDoc->SetString(ScAddress(1,2,0), "=A3"); + CPPUNIT_ASSERT_MESSAGE("Relative reference check in B1 failed.", + checkRelativeRefToken(*m_pDoc, ScAddress(1,0,0), -1, 0)); + CPPUNIT_ASSERT_MESSAGE("Relative reference check in B2 failed.", + checkRelativeRefToken(*m_pDoc, ScAddress(1,1,0), -1, 0)); + CPPUNIT_ASSERT_MESSAGE("Relative reference check in B3 failed.", + checkRelativeRefToken(*m_pDoc, ScAddress(1,2,0), -1, 0)); + CPPUNIT_ASSERT_MESSAGE("Broadcaster should exist in A1.", m_pDoc->GetBroadcaster(ScAddress(0,0,0))); + CPPUNIT_ASSERT_MESSAGE("Broadcaster should exist in A2.", m_pDoc->GetBroadcaster(ScAddress(0,1,0))); + CPPUNIT_ASSERT_MESSAGE("Broadcaster should exist in A3.", m_pDoc->GetBroadcaster(ScAddress(0,2,0))); + + // Insert Rows at row 2, down 5 rows. + m_pDoc->InsertRow(0, 0, 0, 0, 1, 5); + CPPUNIT_ASSERT_MESSAGE("Broadcaster should exist in A1.", m_pDoc->GetBroadcaster(ScAddress(0,0,0))); + CPPUNIT_ASSERT_MESSAGE("Relative reference check in B1 failed.", + checkRelativeRefToken(*m_pDoc, ScAddress(1,0,0), -1, 0)); + + // Broadcasters in A2 and A3 should shift down by 5 rows. + CPPUNIT_ASSERT_MESSAGE("Broadcaster relocation failed.", + broadcasterShifted(*m_pDoc, ScAddress(0,1,0), ScAddress(0,6,0))); + CPPUNIT_ASSERT_MESSAGE("Broadcaster relocation failed.", + broadcasterShifted(*m_pDoc, ScAddress(0,2,0), ScAddress(0,7,0))); + + // B2 and B3 should reference shifted cells. + CPPUNIT_ASSERT_MESSAGE("Relative reference check in B2 failed.", + checkRelativeRefToken(*m_pDoc, ScAddress(1,1,0), -1, 5)); + CPPUNIT_ASSERT_MESSAGE("Relative reference check in B2 failed.", + checkRelativeRefToken(*m_pDoc, ScAddress(1,2,0), -1, 5)); + + // Delete cells with broadcasters. + m_pDoc->DeleteRow(0, 0, 0, 0, 4, 6); + CPPUNIT_ASSERT_MESSAGE("Broadcaster should NOT exist in A7.", !m_pDoc->GetBroadcaster(ScAddress(0,6,0))); + CPPUNIT_ASSERT_MESSAGE("Broadcaster should NOT exist in A8.", !m_pDoc->GetBroadcaster(ScAddress(0,7,0))); + + // References in B2 and B3 should be invalid. + CPPUNIT_ASSERT_MESSAGE("Deleted reference check in B2 failed.", + checkDeletedRefToken(*m_pDoc, ScAddress(1,1,0))); + CPPUNIT_ASSERT_MESSAGE("Deleted reference check in B3 failed.", + checkDeletedRefToken(*m_pDoc, ScAddress(1,2,0))); + m_pDoc->DeleteTab(0); } |