sc/qa/unit/ucalc_formula.cxx | 114 +++++++++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 24 deletions(-)
New commits: commit 57452f7944257ef6b639144ff34fb34d6583ae62 Author: Eike Rathke <er...@redhat.com> AuthorDate: Tue Feb 25 18:40:34 2020 +0100 Commit: Eike Rathke <er...@redhat.com> CommitDate: Wed Feb 26 13:08:34 2020 +0100 Unit test tdf#130825 insert/delete sheet moving sheet-local names Change-Id: I1f0aed734ebb2c1035e06350d3508becb0d68b4d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89476 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Jenkins diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index 10ad7a3169da..17e8bde4fc53 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -4010,16 +4010,20 @@ void Test::testFormulaRefUpdateNameCopySheetCheckTab( SCTAB nTab, bool bCheckNam void Test::testFormulaRefUpdateSheetLocalMove() { - m_pDoc->InsertTab(0, "Sheet1"); - m_pDoc->InsertTab(1, "Sheet2"); + SCTAB nSheet1 = 0; + SCTAB nSheet2 = 1; + m_pDoc->InsertTab( nSheet1, "Sheet1"); + m_pDoc->InsertTab( nSheet2, "Sheet2"); - ScAddress aPos; + ScAddress aPos(0,0,nSheet1); bool bOk; bOk = m_pDoc->InsertNewRangeName( 0, "MyCell", aPos, "$Sheet1.$B$2"); CPPUNIT_ASSERT(bOk); + aPos.SetTab(nSheet2); bOk = m_pDoc->InsertNewRangeName( 1, "MyCell", aPos, "$Sheet2.$B$2"); CPPUNIT_ASSERT(bOk); + aPos.SetTab(nSheet1); aPos.IncCol(); m_pDoc->SetString( aPos, "x"); aPos.IncRow(); @@ -4028,7 +4032,7 @@ void Test::testFormulaRefUpdateSheetLocalMove() m_pDoc->SetString( aPos, "=MyCell"); CPPUNIT_ASSERT_EQUAL_MESSAGE("Sheet1.B3", 1.0, m_pDoc->GetValue(aPos)); - aPos.SetTab(1); + aPos.SetTab(nSheet2); aPos.SetRow(1); m_pDoc->SetString( aPos, "2.0"); aPos.IncRow(); @@ -4039,66 +4043,128 @@ void Test::testFormulaRefUpdateSheetLocalMove() OUString aFormula; // Move Sheet1.B1 ("x") to Sheet2.B1 - bOk = rFunc.MoveBlock( ScRange(1,0,0,1,0,0), ScAddress(1,0,1), true, false, false, false); + bOk = rFunc.MoveBlock( ScRange(1,0,nSheet1,1,0,nSheet1), ScAddress(1,0,nSheet2), true, false, false, false); CPPUNIT_ASSERT(bOk); // Results not changed. - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move x: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,0))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move x: Sheet2.B3", 2.0, m_pDoc->GetValue(ScAddress(1,2,1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move x: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move x: Sheet2.B3", 2.0, m_pDoc->GetValue(ScAddress(1,2,nSheet2))); // Formulas not changed. - m_pDoc->GetFormula( 1,2,0, aFormula); + m_pDoc->GetFormula( 1,2,nSheet1, aFormula); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move x: Sheet1.B3", OUString("=MyCell"), aFormula); - m_pDoc->GetFormula( 1,2,1, aFormula); + m_pDoc->GetFormula( 1,2,nSheet2, aFormula); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move x: Sheet2.B3", OUString("=MyCell"), aFormula); // Move Sheet2.B2 ("2.0") to Sheet1.C2 - bOk = rFunc.MoveBlock( ScRange(1,1,1,1,1,1), ScAddress(2,1,0), true, false, false, false); + bOk = rFunc.MoveBlock( ScRange(1,1,nSheet2,1,1,nSheet2), ScAddress(2,1,nSheet1), true, false, false, false); CPPUNIT_ASSERT(bOk); // Results not changed. - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,0))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet2.B3", 2.0, m_pDoc->GetValue(ScAddress(1,2,1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet2.B3", 2.0, m_pDoc->GetValue(ScAddress(1,2,nSheet2))); // Formulas not changed. - m_pDoc->GetFormula( 1,2,0, aFormula); + m_pDoc->GetFormula( 1,2,nSheet1, aFormula); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet1.B3", OUString("=MyCell"), aFormula); - m_pDoc->GetFormula( 1,2,1, aFormula); + m_pDoc->GetFormula( 1,2,nSheet2, aFormula); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet2.B3", OUString("=MyCell"), aFormula); ScRangeData* pName; // Check that the sheet-local named reference points to the moved cell, now // Sheet1.C2 - pName = m_pDoc->GetRangeName(1)->findByUpperName("MYCELL"); + pName = m_pDoc->GetRangeName(nSheet2)->findByUpperName("MYCELL"); CPPUNIT_ASSERT(pName); pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move 2.0: Sheet2 sheet-local name", OUString("$Sheet1.$C$2"), aFormula); // Move Sheet2.B3 ("=MyCell") to Sheet1.C3 - bOk = rFunc.MoveBlock( ScRange(1,2,1,1,2,1), ScAddress(2,2,0), true, false, false, false); + bOk = rFunc.MoveBlock( ScRange(1,2,nSheet2,1,2,nSheet2), ScAddress(2,2,nSheet1), true, false, false, false); CPPUNIT_ASSERT(bOk); // Results changed. - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,0))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet2.B3", 0.0, m_pDoc->GetValue(ScAddress(1,2,1))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1.C3", 2.0, m_pDoc->GetValue(ScAddress(2,2,0))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet2.B3", 0.0, m_pDoc->GetValue(ScAddress(1,2,nSheet2))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1.C3", 2.0, m_pDoc->GetValue(ScAddress(2,2,nSheet1))); // One formula identical, one adjusted. - m_pDoc->GetFormula( 1,2,0, aFormula); + m_pDoc->GetFormula( 1,2,nSheet1, aFormula); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1.B3", OUString("=MyCell"), aFormula); - m_pDoc->GetFormula( 2,2,0, aFormula); + m_pDoc->GetFormula( 2,2,nSheet1, aFormula); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1.C3", OUString("=Sheet2.MyCell"), aFormula); // Check that the sheet-local named reference in Sheet1 still points to the // original cell Sheet1.B2 - pName = m_pDoc->GetRangeName(0)->findByUpperName("MYCELL"); + pName = m_pDoc->GetRangeName(nSheet1)->findByUpperName("MYCELL"); CPPUNIT_ASSERT(pName); pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet1 sheet-local name", OUString("$Sheet1.$B$2"), aFormula); // Check that the sheet-local named reference in Sheet2 still points to the // moved cell, now Sheet1.C2 - pName = m_pDoc->GetRangeName(1)->findByUpperName("MYCELL"); + pName = m_pDoc->GetRangeName(nSheet2)->findByUpperName("MYCELL"); CPPUNIT_ASSERT(pName); pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); CPPUNIT_ASSERT_EQUAL_MESSAGE("Move =MyCell: Sheet2 sheet-local name", OUString("$Sheet1.$C$2"), aFormula); - m_pDoc->DeleteTab(1); + // Insert sheet before the others. + m_pDoc->InsertTab(0, "Sheet0"); + ++nSheet1; + ++nSheet2; + + // Nothing changed. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Insert Sheet0: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Insert Sheet0: Sheet1.C3", 2.0, m_pDoc->GetValue(ScAddress(2,2,nSheet1))); + m_pDoc->GetFormula( 1,2,nSheet1, aFormula); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Insert Sheet0: Sheet1.B3", OUString("=MyCell"), aFormula); + m_pDoc->GetFormula( 2,2,nSheet1, aFormula); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Insert Sheet0: Sheet1.C3", OUString("=Sheet2.MyCell"), aFormula); + pName = m_pDoc->GetRangeName(nSheet1)->findByUpperName("MYCELL"); + CPPUNIT_ASSERT(pName); + pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Insert Sheet0: Sheet1 sheet-local name", OUString("$Sheet1.$B$2"), aFormula); + pName = m_pDoc->GetRangeName(nSheet2)->findByUpperName("MYCELL"); + CPPUNIT_ASSERT(pName); + pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Insert Sheet0: Sheet2 sheet-local name", OUString("$Sheet1.$C$2"), aFormula); + + // Delete sheet before the others. + m_pDoc->DeleteTab(0); + --nSheet1; + --nSheet2; + + // Nothing changed. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet0: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet0: Sheet1.C3", 2.0, m_pDoc->GetValue(ScAddress(2,2,nSheet1))); + m_pDoc->GetFormula( 1,2,nSheet1, aFormula); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet0: Sheet1.B3", OUString("=MyCell"), aFormula); + m_pDoc->GetFormula( 2,2,nSheet1, aFormula); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet0: Sheet1.C3", OUString("=Sheet2.MyCell"), aFormula); + pName = m_pDoc->GetRangeName(nSheet1)->findByUpperName("MYCELL"); + CPPUNIT_ASSERT(pName); + pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet0: Sheet1 sheet-local name", OUString("$Sheet1.$B$2"), aFormula); + pName = m_pDoc->GetRangeName(nSheet2)->findByUpperName("MYCELL"); + CPPUNIT_ASSERT(pName); + pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet0: Sheet2 sheet-local name", OUString("$Sheet1.$C$2"), aFormula); + + // Delete last sheet with sheet-local name. + m_pDoc->DeleteTab(nSheet2); + + // XXX we *could* analyze whether the expression points to a different + // sheet and then move the name to a remaining sheet. If so, adapt this + // test. + // Nothing changed except the sheet-local name and its use. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet2: Sheet1.B3", 1.0, m_pDoc->GetValue(ScAddress(1,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet2: Sheet1.C3", 0.0, m_pDoc->GetValue(ScAddress(2,2,nSheet1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet2: Sheet1.C3", OUString("#NAME?"), m_pDoc->GetString(ScAddress(2,2,nSheet1))); + m_pDoc->GetFormula( 1,2,nSheet1, aFormula); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet2: Sheet1.B3", OUString("=MyCell"), aFormula); + m_pDoc->GetFormula( 2,2,nSheet1, aFormula); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet2: Sheet1.C3", OUString("=#NAME?"), aFormula); + pName = m_pDoc->GetRangeName(nSheet1)->findByUpperName("MYCELL"); + CPPUNIT_ASSERT(pName); + pName->GetSymbol( aFormula, ScAddress(), formula::FormulaGrammar::GRAM_ENGLISH); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Delete Sheet2: Sheet1 sheet-local name", OUString("$Sheet1.$B$2"), aFormula); + CPPUNIT_ASSERT(!m_pDoc->GetRangeName(nSheet2)); + nSheet2 = -1; + m_pDoc->DeleteTab(0); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits