diff options
Diffstat (limited to 'sc')
-rw-r--r-- | sc/CppunitTest_sc_ucalc_copypaste.mk | 14 | ||||
-rw-r--r-- | sc/Module_sc.mk | 1 | ||||
-rw-r--r-- | sc/qa/unit/helper/qahelper.cxx | 16 | ||||
-rw-r--r-- | sc/qa/unit/helper/qahelper.hxx | 2 | ||||
-rw-r--r-- | sc/qa/unit/ucalc.cxx | 6661 | ||||
-rw-r--r-- | sc/qa/unit/ucalc.hxx | 157 | ||||
-rw-r--r-- | sc/qa/unit/ucalc_copypaste.cxx | 6928 |
7 files changed, 6960 insertions, 6819 deletions
diff --git a/sc/CppunitTest_sc_ucalc_copypaste.mk b/sc/CppunitTest_sc_ucalc_copypaste.mk new file mode 100644 index 000000000000..933b020081ad --- /dev/null +++ b/sc/CppunitTest_sc_ucalc_copypaste.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sc_ucalc_test,_copypaste)) + +# vim: set noet sw=4 ts=4: diff --git a/sc/Module_sc.mk b/sc/Module_sc.mk index 9cc25d6052ea..94880fb19a72 100644 --- a/sc/Module_sc.mk +++ b/sc/Module_sc.mk @@ -41,6 +41,7 @@ $(eval $(call gb_Module_add_check_targets,sc,\ $(if $(and $(filter $(COM),MSC),$(MERGELIBS)),, \ CppunitTest_sc_ucalc) \ CppunitTest_sc_ucalc_condformat \ + CppunitTest_sc_ucalc_copypaste \ CppunitTest_sc_ucalc_pivottable \ CppunitTest_sc_ucalc_sharedformula \ CppunitTest_sc_ucalc_sort \ diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx index ec8119d7a3f5..46196f9c28f4 100644 --- a/sc/qa/unit/helper/qahelper.cxx +++ b/sc/qa/unit/helper/qahelper.cxx @@ -979,6 +979,22 @@ void pasteOneCellFromClip(ScDocument* pDestDoc, const ScRange& rDestRange, ScDoc rDestRange.aEnd.Col(), rDestRange.aEnd.Row()); } +ScDocShell* findLoadedDocShellByName(std::u16string_view rName) +{ + ScDocShell* pShell = static_cast<ScDocShell*>(SfxObjectShell::GetFirst(checkSfxObjectShell<ScDocShell>, false)); + while (pShell) + { + SfxMedium* pMedium = pShell->GetMedium(); + if (pMedium) + { + OUString aName = pMedium->GetName(); + if (aName == rName) + return pShell; + } + pShell = static_cast<ScDocShell*>(SfxObjectShell::GetNext(*pShell, checkSfxObjectShell<ScDocShell>, false)); + } + return nullptr; +} bool insertRangeNames( ScDocument* pDoc, ScRangeName* pNames, const RangeNameDef* p, const RangeNameDef* pEnd) diff --git a/sc/qa/unit/helper/qahelper.hxx b/sc/qa/unit/helper/qahelper.hxx index c7e3c0790e16..4d9986dd7373 100644 --- a/sc/qa/unit/helper/qahelper.hxx +++ b/sc/qa/unit/helper/qahelper.hxx @@ -252,7 +252,7 @@ SCQAHELPER_DLLPUBLIC ScUndoPaste* createUndoPaste(ScDocShell& rDocSh, const ScRa SCQAHELPER_DLLPUBLIC void pasteOneCellFromClip(ScDocument* pDestDoc, const ScRange& rDestRange, ScDocument* pClipDoc, InsertDeleteFlags eFlags = InsertDeleteFlags::ALL); - +SCQAHELPER_DLLPUBLIC ScDocShell* findLoadedDocShellByName(std::u16string_view rName); SCQAHELPER_DLLPUBLIC ScRange insertRangeData(ScDocument* pDoc, const ScAddress& rPos, const std::vector<std::vector<const char*>>& rData); SCQAHELPER_DLLPUBLIC bool insertRangeNames(ScDocument* pDoc, ScRangeName* pNames, const RangeNameDef* p, diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index 340d2112e898..5b34c2a073fb 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -18,7 +18,6 @@ #include <svl/gridprinter.hxx> #include <scdll.hxx> -#include <formulacell.hxx> #include <simpleformulacalc.hxx> #include <formulaopt.hxx> #include <stringutil.hxx> @@ -137,20 +136,6 @@ void Test::tearDown() BootstrapFixture::tearDown(); } -static ScMF lcl_getMergeFlagOfCell(const ScDocument& rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab) -{ - const SfxPoolItem& rPoolItem = rDoc.GetPattern(nCol, nRow, nTab)->GetItem(ATTR_MERGE_FLAG); - const ScMergeFlagAttr& rMergeFlag = static_cast<const ScMergeFlagAttr&>(rPoolItem); - return rMergeFlag.GetValue(); -} - -static ScAddress lcl_getMergeSizeOfCell(const ScDocument& rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab) -{ - const SfxPoolItem& rPoolItem = rDoc.GetPattern(nCol, nRow, nTab)->GetItem(ATTR_MERGE); - const ScMergeAttr& rMerge = static_cast<const ScMergeAttr&>(rPoolItem); - return ScAddress(rMerge.GetColMerge(), rMerge.GetRowMerge(), nTab); -} - void Test::testCollator() { CollatorWrapper* p = ScGlobal::GetCollator(); @@ -3456,6502 +3441,6 @@ void Test::testTdf98642() m_pDoc->DeleteTab(0); } -void Test::testCopyPaste() -{ - m_pDoc->InsertTab(0, "Sheet1"); - m_pDoc->InsertTab(1, "Sheet2"); - - // We need a drawing layer in order to create caption objects. - m_pDoc->InitDrawLayer(m_xDocShell.get()); - - //test copy&paste + ScUndoPaste - //copy local and global range names in formulas - //string cells and value cells - m_pDoc->SetValue(0, 0, 0, 1); - m_pDoc->SetValue(3, 0, 0, 0); - m_pDoc->SetValue(3, 1, 0, 1); - m_pDoc->SetValue(3, 2, 0, 2); - m_pDoc->SetValue(3, 3, 0, 3); - m_pDoc->SetString(2, 0, 0, "test"); - ScAddress aAdr (0, 0, 0); - - //create some range names, local and global - ScRangeData* pLocal1 = new ScRangeData( *m_pDoc, "local1", aAdr); - ScRangeData* pLocal2 = new ScRangeData( *m_pDoc, "local2", aAdr); - ScRangeData* pLocal3 = new ScRangeData( *m_pDoc, "local3", "$Sheet1.$A$1"); - ScRangeData* pLocal4 = new ScRangeData( *m_pDoc, "local4", "Sheet1.$A$1"); - ScRangeData* pLocal5 = new ScRangeData( *m_pDoc, "local5", "$A$1"); // implicit relative sheet reference - ScRangeData* pGlobal = new ScRangeData( *m_pDoc, "global", aAdr); - const OUString aGlobal2Symbol("$Sheet1.$A$1:$A$23"); - ScRangeData* pGlobal2 = new ScRangeData( *m_pDoc, "global2", aGlobal2Symbol); - std::unique_ptr<ScRangeName> pGlobalRangeName(new ScRangeName()); - pGlobalRangeName->insert(pGlobal); - pGlobalRangeName->insert(pGlobal2); - std::unique_ptr<ScRangeName> pLocalRangeName1(new ScRangeName()); - pLocalRangeName1->insert(pLocal1); - pLocalRangeName1->insert(pLocal2); - pLocalRangeName1->insert(pLocal3); - pLocalRangeName1->insert(pLocal4); - pLocalRangeName1->insert(pLocal5); - m_pDoc->SetRangeName(std::move(pGlobalRangeName)); - m_pDoc->SetRangeName(0, std::move(pLocalRangeName1)); - - // Add formula to B1. - OUString aFormulaString("=local1+global+SUM($C$1:$D$4)+local3+local4+local5"); - m_pDoc->SetString(1, 0, 0, aFormulaString); - - double fValue = m_pDoc->GetValue(ScAddress(1,0,0)); - ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 11", fValue, 11); - - // add notes to A1:C1 - ScAddress aAdrA1 (0, 0, 0); // empty cell content - ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAdrA1); - pNoteA1->SetText(aAdrA1, "Hello world in A1"); - ScAddress aAdrB1 (1, 0, 0); // formula cell content - ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAdrB1); - pNoteB1->SetText(aAdrB1, "Hello world in B1"); - ScAddress aAdrC1 (2, 0, 0); // string cell content - ScPostIt* pNoteC1 = m_pDoc->GetOrCreateNote(aAdrC1); - pNoteC1->SetText(aAdrC1, "Hello world in C1"); - - //copy Sheet1.A1:C1 to Sheet2.A2:C2 - ScRange aRange(0,0,0,2,0,0); - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aRange, &aClipDoc); - - aRange = ScRange(0,1,1,2,1,1);//target: Sheet2.A2:C2 - ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); - pUndoDoc->InitUndo(*m_pDoc, 1, 1, true, true); - std::unique_ptr<ScUndoPaste> pUndo(createUndoPaste(*m_xDocShell, aRange, std::move(pUndoDoc))); - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aRange); - m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc); - - //check values after copying - OUString aString; - m_pDoc->GetFormula(1,1,1, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("formula string was not copied correctly", aString, aFormulaString); - // Only the global range points to Sheet1.A1, all copied sheet-local ranges - // to Sheet2.A1 that is empty, hence the result is 1, not 2. - fValue = m_pDoc->GetValue(ScAddress(1,1,1)); - ASSERT_DOUBLES_EQUAL_MESSAGE("copied formula should return 1", 1.0, fValue); - fValue = m_pDoc->GetValue(ScAddress(0,1,1)); - ASSERT_DOUBLES_EQUAL_MESSAGE("copied value should be 1", 1.0, fValue); - - ScRange aSheet2A1(0,0,1,0,0,1); - - //check local range name after copying - pLocal1 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL1")); - CPPUNIT_ASSERT_MESSAGE("local range name 1 should be copied", pLocal1); - ScRange aRangeLocal1; - bool bIsValidRef1 = pLocal1->IsValidReference(aRangeLocal1); - CPPUNIT_ASSERT_MESSAGE("local range name 1 should be valid", bIsValidRef1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 1 should now point to Sheet2.A1", aSheet2A1, aRangeLocal1); - - pLocal2 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL2")); - CPPUNIT_ASSERT_MESSAGE("local2 should not be copied", !pLocal2); - - pLocal3 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL3")); - CPPUNIT_ASSERT_MESSAGE("local range name 3 should be copied", pLocal3); - ScRange aRangeLocal3; - bool bIsValidRef3 = pLocal3->IsValidReference(aRangeLocal3); - CPPUNIT_ASSERT_MESSAGE("local range name 3 should be valid", bIsValidRef3); - CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 3 should now point to Sheet2.A1", aSheet2A1, aRangeLocal3); - - pLocal4 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL4")); - CPPUNIT_ASSERT_MESSAGE("local range name 4 should be copied", pLocal4); - ScRange aRangeLocal4; - bool bIsValidRef4 = pLocal4->IsValidReference(aRangeLocal4); - CPPUNIT_ASSERT_MESSAGE("local range name 4 should be valid", bIsValidRef4); - CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 4 should now point to Sheet2.A1", aSheet2A1, aRangeLocal4); - - pLocal5 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL5")); - CPPUNIT_ASSERT_MESSAGE("local range name 5 should be copied", pLocal5); - ScRange aRangeLocal5; - bool bIsValidRef5 = pLocal5->IsValidReference(aRangeLocal5); - CPPUNIT_ASSERT_MESSAGE("local range name 5 should be valid", bIsValidRef5); - CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 5 should now point to Sheet2.A1", aSheet2A1, aRangeLocal5); - - // check notes after copying - CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.A2", m_pDoc->HasNote(ScAddress(0, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.B2", m_pDoc->HasNote(ScAddress(1, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.C2", m_pDoc->HasNote(ScAddress(2, 1, 1))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Note content on Sheet1.A1 not copied to Sheet2.A2, empty cell content", - m_pDoc->GetNote(ScAddress(0, 0, 0))->GetText(), m_pDoc->GetNote(ScAddress(0, 1, 1))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Note content on Sheet1.B1 not copied to Sheet2.B2, formula cell content", - m_pDoc->GetNote(ScAddress(1, 0, 0))->GetText(), m_pDoc->GetNote(ScAddress(1, 1, 1))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Note content on Sheet1.C1 not copied to Sheet2.C2, string cell content", - m_pDoc->GetNote(ScAddress(2, 0, 0))->GetText(), m_pDoc->GetNote(ScAddress(2, 1, 1))->GetText()); - - //check undo and redo - pUndo->Undo(); - fValue = m_pDoc->GetValue(ScAddress(1,1,1)); - ASSERT_DOUBLES_EQUAL_MESSAGE("after undo formula should return nothing", fValue, 0); - aString = m_pDoc->GetString(2, 1, 1); - CPPUNIT_ASSERT_MESSAGE("after undo, string should be removed", aString.isEmpty()); - CPPUNIT_ASSERT_MESSAGE("after undo, note on A2 should be removed", !m_pDoc->HasNote(ScAddress(0, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("after undo, note on B2 should be removed", !m_pDoc->HasNote(ScAddress(1, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("after undo, note on C2 should be removed", !m_pDoc->HasNote(ScAddress(2, 1, 1))); - - pUndo->Redo(); - fValue = m_pDoc->GetValue(ScAddress(1,1,1)); - ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 1 after redo", 1.0, fValue); - aString = m_pDoc->GetString(2, 1, 1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell Sheet2.C2 should contain: test", OUString("test"), aString); - m_pDoc->GetFormula(1,1,1, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula should be correct again", aFormulaString, aString); - - CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.A2", m_pDoc->HasNote(ScAddress(0, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.B2", m_pDoc->HasNote(ScAddress(1, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.C2", m_pDoc->HasNote(ScAddress(2, 1, 1))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.A2, empty cell content", - m_pDoc->GetNote(ScAddress(0, 0, 0))->GetText(), m_pDoc->GetNote(ScAddress(0, 1, 1))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.B2, formula cell content", - m_pDoc->GetNote(ScAddress(1, 0, 0))->GetText(), m_pDoc->GetNote(ScAddress(1, 1, 1))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.C2, string cell content", - m_pDoc->GetNote(ScAddress(2, 0, 0))->GetText(), m_pDoc->GetNote(ScAddress(2, 1, 1))->GetText()); - - - // Copy Sheet1.A11:A13 to Sheet1.A7:A9, both within global2 range. - aRange = ScRange(0,10,0,0,12,0); - ScDocument aClipDoc2(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aRange, &aClipDoc2); - - aRange = ScRange(0,6,0,0,8,0); - aMark.SetMarkArea(aRange); - m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc2); - - // The global2 range must not have changed. - pGlobal2 = m_pDoc->GetRangeName()->findByUpperName("GLOBAL2"); - CPPUNIT_ASSERT_MESSAGE("GLOBAL2 name not found", pGlobal2); - OUString aSymbol; - pGlobal2->GetSymbol(aSymbol); - CPPUNIT_ASSERT_EQUAL_MESSAGE("GLOBAL2 named range changed", aGlobal2Symbol, aSymbol); - - - m_pDoc->DeleteTab(1); - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteAsLink() -{ - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(0, "Sheet1"); - m_pDoc->InsertTab(1, "Sheet2"); - - m_pDoc->SetValue(ScAddress(0,0,0), 1); // A1 - m_pDoc->SetValue(ScAddress(0,1,0), 2); // A2 - m_pDoc->SetValue(ScAddress(0,2,0), 3); // A3 - - ScRange aRange(0,0,0,0,2,0); // Copy A1:A3 to clip. - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aRange, &aClipDoc); - - aRange = ScRange(1,1,1,1,3,1); // Paste to B2:B4 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aRange); - // Paste range as link. - m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &aClipDoc, true, true); - - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1,1,1)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1,2,1)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1,3,1)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - CPPUNIT_ASSERT_EQUAL(3.0, pFC->GetValue()); - - m_pDoc->DeleteTab(1); - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteTranspose() -{ - m_pDoc->InsertTab(0, "Sheet1"); - - // We need a drawing layer in order to create caption objects. - m_pDoc->InitDrawLayer(m_xDocShell.get()); - - m_pDoc->SetValue(0, 0, 0, 1); - m_pDoc->SetString(1, 0, 0, "=A1+1"); - m_pDoc->SetString(2, 0, 0, "test"); - - // add notes to A1:C1 - ScAddress aAdrA1 (0, 0, 0); // numerical cell content - ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAdrA1); - pNoteA1->SetText(aAdrA1, "Hello world in A1"); - ScAddress aAdrB1 (1, 0, 0); // formula cell content - ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAdrB1); - pNoteB1->SetText(aAdrB1, "Hello world in B1"); - ScAddress aAdrC1 (2, 0, 0); // string cell content - ScPostIt* pNoteC1 = m_pDoc->GetOrCreateNote(aAdrC1); - pNoteC1->SetText(aAdrC1, "Hello world in C1"); - - // transpose clipboard, paste and check on Sheet2 - m_pDoc->InsertTab(1, "Sheet2"); - - ScRange aSrcRange(0,0,0,2,0,0); - ScDocument aNewClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aNewClipDoc); - - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aNewClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, false); - - ScRange aDestRange(3,1,1,3,3,1);//target: Sheet2.D2:D4 - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get()); - pTransClip.reset(); - - //check cell content after transposed copy/paste - OUString aString = m_pDoc->GetString(3, 3, 1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell Sheet2.D4 should contain: test", OUString("test"), aString); - double fValue = m_pDoc->GetValue(ScAddress(3,1,1)); - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell should return 1", 1, fValue); - fValue = m_pDoc->GetValue(ScAddress(3,2,1)); - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula should return 2", 2, fValue); - m_pDoc->GetFormula(3, 2, 1, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula should point on Sheet2.D2", OUString("=D2+1"), aString); - - // check notes after transposed copy/paste - CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D2", m_pDoc->HasNote(ScAddress(3, 1, 1))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D3", m_pDoc->HasNote(ScAddress(3, 2, 1))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D4", m_pDoc->HasNote(ScAddress(3, 3, 1))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D2", - m_pDoc->GetNote(ScAddress(0, 0, 0))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, 1))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D3", - m_pDoc->GetNote(ScAddress(1, 0, 0))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, 1))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D4", - m_pDoc->GetNote(ScAddress(2, 0, 0))->GetText(), - m_pDoc->GetNote(ScAddress(3, 3, 1))->GetText()); - - m_pDoc->DeleteTab(1); - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteSpecialMergedCellsTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 2, srcSheet, 3); // A3 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - m_pDoc->DoMerge(srcSheet, 0, 1, 1, 1, false); // Merge A2 and B2 - m_pDoc->DoMerge(srcSheet, 0, 2, 1, 2, false); // Merge A3 and B3 - - // Test precondition - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 0, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 0, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 1, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 1, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 2, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 1, 2, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 3, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 3, srcSheet)); - - ScRange aSrcRange(0, 0, srcSheet, 1, 3, srcSheet); // Copy A1:B4 to clip. - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aClipDoc); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); - - ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, - false); - pTransClip.reset(); - - // Check transpose of merged cells - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 2, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 3, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 4, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 4, 2, destSheet)); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::testCopyPasteSpecialMergedCellsFilteredTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 2, srcSheet, 3); // A3 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - m_pDoc->DoMerge(srcSheet, 0, 1, 1, 1, false); // Merge A2 and B2 - m_pDoc->DoMerge(srcSheet, 0, 2, 1, 2, false); // Merge A3 and B3 - - // Filter row 1 - ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); - m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); - - pDBData->SetAutoFilter(true); - ScRange aRange; - pDBData->GetArea(aRange); - m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), - aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); - - //create the query param - ScQueryParam aParam; - pDBData->GetQueryParam(aParam); - ScQueryEntry& rEntry = aParam.GetEntry(0); - rEntry.bDoQuery = true; - rEntry.nField = 0; - rEntry.eOp = SC_NOT_EQUAL; - rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 - // add queryParam to database range. - pDBData->SetQueryParam(aParam); - - // perform the query. - m_pDoc->Query(srcSheet, aParam, true); - - // Test precondition - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 0, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 0, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 1, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 1, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 2, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 1, 2, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 0, 3, srcSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 3, srcSheet)); - - ScRange aSrcRange(0, 0, srcSheet, 1, 3, srcSheet); // Copy A1:B4 to clip. - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aClipDoc); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); - - ScRange aDestRange(1, 1, destSheet, 3, 2, destSheet); // Paste to B2:D3 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, - false); - pTransClip.reset(); - - // Check transpose of merged cells - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 2, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(2, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), - lcl_getMergeSizeOfCell(*m_pDoc, 3, 1, destSheet)); - CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 3, 2, destSheet)); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// InsertDeleteFlags::CONTENTS -void Test::testCopyPasteSpecialAsLinkTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); // Copy A1:A4 to clip. - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aClipDoc); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); - - ScRange aDestRange(1, 1, destSheet, 4, 1, destSheet); // Paste to B2:E2 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, pTransClip.get(), - true, false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(2, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$2"), aString); - CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D2.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E2", OUString("=$Sheet1.$A$4"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// InsertDeleteFlags::CONTENTS -void Test::testCopyPasteSpecialAsLinkFilteredTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - // Filter row 1 - ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); - m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); - - pDBData->SetAutoFilter(true); - ScRange aRange; - pDBData->GetArea(aRange); - m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), - aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); - - //create the query param - ScQueryParam aParam; - pDBData->GetQueryParam(aParam); - ScQueryEntry& rEntry = aParam.GetEntry(0); - rEntry.bDoQuery = true; - rEntry.nField = 0; - rEntry.eOp = SC_NOT_EQUAL; - rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 - // add queryParam to database range. - pDBData->SetQueryParam(aParam); - - // perform the query. - m_pDoc->Query(srcSheet, aParam, true); - - // Check precondition for test: row 1 is hidden/filtered - SCROW nRow1, nRow2; - SCROW nFilteredRow1, nFilteredRow2; - bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2); - CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2); - bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2); - CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2); - - // Copy A1:A4 to clip. - ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aClipDoc); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); - - ScRange aDestRange(1, 1, destSheet, 3, 1, destSheet); // Paste to B2:D2 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, pTransClip.get(), - true, false, false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C2.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(3, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$4"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// tdf#141683 -// InsertDeleteFlags::CONTENTS -void Test::testCopyPasteSpecialMultiRangeRowAsLinkTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(1, 0, srcSheet, 2); // B1 - m_pDoc->SetValue(3, 0, srcSheet, 4); // D1 - - m_pDoc->SetValue(0, 2, srcSheet, 11); // A3 - m_pDoc->SetValue(1, 2, srcSheet, 12); // B3 - m_pDoc->SetValue(3, 2, srcSheet, 14); // D3 - - ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); - aSrcMark.SelectOneTable(0); - ScClipParam aClipParam; - aClipParam.meDirection = ScClipParam::Row; - aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 3, 0, srcSheet)); // A1:D1 - aClipParam.maRanges.push_back(ScRange(0, 2, srcSheet, 3, 2, srcSheet)); // A3:D3 - - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); - - ScRange aDestRange(1, 1, destSheet, 2, 4, destSheet); // Paste to B2:C5 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, - pTransClip.get(), true, false /* false fixes tdf#141683 */, - false, false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); - m_pDoc->GetFormula(1, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$B$1"), aString); - CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell B4.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(1, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B5", OUString("=$Sheet1.$D$1"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC); - m_pDoc->GetFormula(2, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$3"), aString); - CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC); - m_pDoc->GetFormula(2, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C3", OUString("=$Sheet1.$B$3"), aString); - CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 3, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C4.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(2, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C5", OUString("=$Sheet1.$D$3"), aString); - CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// tdf#141683 -// InsertDeleteFlags::CONTENTS -void Test::testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(1, 0, srcSheet, 2); // B1 - m_pDoc->SetValue(3, 0, srcSheet, 4); // D1 - - m_pDoc->SetValue(0, 1, srcSheet, -1); // A2, filtered and selected - m_pDoc->SetValue(1, 1, srcSheet, -2); // B2, filtered and selected - m_pDoc->SetValue(3, 1, srcSheet, -4); // D2, filtered and selected - - m_pDoc->SetValue(0, 2, srcSheet, 11); // A3 - m_pDoc->SetValue(1, 2, srcSheet, 12); // B3 - m_pDoc->SetValue(3, 2, srcSheet, 14); // D3 - - m_pDoc->SetValue(0, 3, srcSheet, -11); // A4, filtered and not selected - m_pDoc->SetValue(1, 3, srcSheet, -12); // B4, filtered and not selected - m_pDoc->SetValue(3, 3, srcSheet, -14); // D4, filtered and not selected - - m_pDoc->SetValue(0, 5, srcSheet, 111); // A6 - m_pDoc->SetValue(1, 5, srcSheet, 112); // B6 - m_pDoc->SetValue(3, 5, srcSheet, 114); // D6 - - // Filter row 1 - ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 3, 3); - m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); - - pDBData->SetAutoFilter(true); - ScRange aRange; - pDBData->GetArea(aRange); - m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), - aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); - - //create the query param - ScQueryParam aParam; - pDBData->GetQueryParam(aParam); - ScQueryEntry& rEntry = aParam.GetEntry(0); - rEntry.bDoQuery = true; - rEntry.nField = 0; - rEntry.eOp = SC_GREATER_EQUAL; - rEntry.GetQueryItem().mfVal = 0; // filtering negative values -> filtering row 1 and 2 - // add queryParam to database range. - pDBData->SetQueryParam(aParam); - - // perform the query. - m_pDoc->Query(srcSheet, aParam, true); - - ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); - aSrcMark.SelectOneTable(0); - ScClipParam aClipParam; - aClipParam.meDirection = ScClipParam::Row; - aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 3, 2, srcSheet)); // A1:C3 - aClipParam.maRanges.push_back(ScRange(0, 5, srcSheet, 3, 5, srcSheet)); // A6:C6 - - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); - - printRange(m_pDoc, aClipParam.getWholeRange(), "Src range"); - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); - - printRange(&aClipDoc, ScRange(0, 0, 0, 4, 5, 0), "Base doc (&aNewClipDoc)"); - printRange(pTransClip.get(), ScRange(0, 0, 0, 3, 3, 0), - "Transposed filtered clipdoc (pTransClip.get())"); - ScRange aDestRange(1, 1, destSheet, 3, 4, destSheet); // Paste to B2:D5 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, - pTransClip.get(), true, false /* false fixes tdf#141683 */, - false, false); - pTransClip.reset(); - printRange(m_pDoc, aDestRange, "Transposed dest sheet"); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); - m_pDoc->GetFormula(1, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$B$1"), aString); - CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell B4.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(1, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B5", OUString("=$Sheet1.$D$1"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC); - m_pDoc->GetFormula(2, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$3"), aString); - CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC); - m_pDoc->GetFormula(2, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C3", OUString("=$Sheet1.$B$3"), aString); - CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 3, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C4.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(2, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C5", OUString("=$Sheet1.$D$3"), aString); - CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell D2.", pFC); - m_pDoc->GetFormula(3, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$6"), aString); - CPPUNIT_ASSERT_EQUAL(111.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell D3.", pFC); - m_pDoc->GetFormula(3, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D3", OUString("=$Sheet1.$B$6"), aString); - CPPUNIT_ASSERT_EQUAL(112.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 3, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D4.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(3, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D5", OUString("=$Sheet1.$D$6"), aString); - CPPUNIT_ASSERT_EQUAL(114.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// tdf#141683 -// InsertDeleteFlags::CONTENTS -void Test::testCopyPasteSpecialMultiRangeColAsLinkTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - m_pDoc->SetValue(2, 0, srcSheet, 11); // C1 - m_pDoc->SetValue(2, 1, srcSheet, 12); // C2 - m_pDoc->SetValue(2, 3, srcSheet, 14); // C4 - - ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); - aSrcMark.SelectOneTable(0); - ScClipParam aClipParam; - aClipParam.meDirection = ScClipParam::Column; - aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 0, 3, srcSheet)); // A1:A4 - aClipParam.maRanges.push_back(ScRange(2, 0, srcSheet, 2, 3, srcSheet)); // C1:C4 - - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); - - ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, - pTransClip.get(), true, false /* false fixes tdf#141683 */, - false, false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC); - m_pDoc->GetFormula(2, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$2"), aString); - CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D2.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E2", OUString("=$Sheet1.$A$4"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); - m_pDoc->GetFormula(1, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$C$1"), aString); - CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC); - m_pDoc->GetFormula(2, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C3", OUString("=$Sheet1.$C$2"), aString); - CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D3.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(4, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E3", OUString("=$Sheet1.$C$4"), aString); - CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// tdf#141683 -// InsertDeleteFlags::CONTENTS -void Test::testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - m_pDoc->SetValue(2, 0, srcSheet, 11); // C1 - m_pDoc->SetValue(2, 1, srcSheet, 12); // C2 - m_pDoc->SetValue(2, 3, srcSheet, 14); // C4 - - // Filter row 1 - ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); - m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); - - pDBData->SetAutoFilter(true); - ScRange aRange; - pDBData->GetArea(aRange); - m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), - aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); - - //create the query param - ScQueryParam aParam; - pDBData->GetQueryParam(aParam); - ScQueryEntry& rEntry = aParam.GetEntry(0); - rEntry.bDoQuery = true; - rEntry.nField = 0; - rEntry.eOp = SC_NOT_EQUAL; - rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 - // add queryParam to database range. - pDBData->SetQueryParam(aParam); - - // perform the query. - m_pDoc->Query(srcSheet, aParam, true); - - ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); - aSrcMark.SelectOneTable(0); - ScClipParam aClipParam; - aClipParam.meDirection = ScClipParam::Column; - aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 0, 3, srcSheet)); // A1:A4 - aClipParam.maRanges.push_back(ScRange(2, 0, srcSheet, 2, 3, srcSheet)); // C1:C4 - - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); - - ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, - pTransClip.get(), true, false /* false fixes tdf#141683 */, - false, false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C2.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(3, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$4"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); - m_pDoc->GetFormula(1, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$C$1"), aString); - CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C3.", !pFC); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(3, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D3", OUString("=$Sheet1.$C$4"), aString); - CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// InsertDeleteFlags::ALL -void Test::testCopyPasteSpecialAllAsLinkTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); // Copy A1:A4 to clip. - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aClipDoc); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); - - ScRange aDestRange(1, 1, destSheet, 4, 1, destSheet); // Paste to B2:E2 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, - false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(2, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$2"), aString); - CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(3, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$3"), aString); - CPPUNIT_ASSERT_EQUAL(0.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E2", OUString("=$Sheet1.$A$4"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// InsertDeleteFlags::ALL -void Test::testCopyPasteSpecialAllAsLinkFilteredTranspose() -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. - - m_pDoc->InsertTab(srcSheet, "Sheet1"); - m_pDoc->InsertTab(destSheet, "Sheet2"); - - m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 - m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 - m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 - - // Filter row 1 - ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); - m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); - - pDBData->SetAutoFilter(true); - ScRange aRange; - pDBData->GetArea(aRange); - m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), - aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); - - //create the query param - ScQueryParam aParam; - pDBData->GetQueryParam(aParam); - ScQueryEntry& rEntry = aParam.GetEntry(0); - rEntry.bDoQuery = true; - rEntry.nField = 0; - rEntry.eOp = SC_NOT_EQUAL; - rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 - // add queryParam to database range. - pDBData->SetQueryParam(aParam); - - // perform the query. - m_pDoc->Query(srcSheet, aParam, true); - - // Check precondition for test: row 1 is hidden/filtered - SCROW nRow1, nRow2; - SCROW nFilteredRow1, nFilteredRow2; - bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2); - CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2); - bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2); - CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2); - - // Copy A1:A4 to clip. - ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aSrcRange, &aClipDoc); - - // transpose - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); - - ScRange aDestRange(1, 1, destSheet, 3, 1, destSheet); // Paste to B2:D2 on Sheet2. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, - false, false); - pTransClip.reset(); - - OUString aString; - // Check pasted content to make sure they reference the correct cells. - ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); - m_pDoc->GetFormula(1, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); - CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(2, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$3"), aString); - CPPUNIT_ASSERT_EQUAL(0.0, pFC->GetValue()); - - pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); - CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); - m_pDoc->GetFormula(3, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$4"), aString); - CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -// This method is used to create the different copy/paste special test cases. -// Principle: Creation of test cases is parameterized, whereas checking uses a minimum of logic -void Test::executeCopyPasteSpecial(bool bApplyFilter, bool bIncludedFiltered, bool bAsLink, - bool bTranspose, bool bMultiRangeSelection, bool bSkipEmpty, - ScClipParam::Direction eDirection = ScClipParam::Column, - bool bCalcAll = false, - InsertDeleteFlags aFlags - = InsertDeleteFlags::CONTENTS | InsertDeleteFlags::ATTRIB) -{ - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - const SCTAB srcSheet = 0; - m_pDoc->InsertTab(srcSheet, "SrcSheet"); - - // We need a drawing layer in order to create caption objects. - m_pDoc->InitDrawLayer(m_xDocShell.get()); - ScFieldEditEngine& rEditEngine = m_pDoc->GetEditEngine(); - - /* - | A | B | C | D | E | F | - - 1r | 1 B*| =A1+10 *| a | R1 *| =A1+A3+60 | =SUMIF(A1:A4;"<4") | - 2r | 2 B*| =A2+20 b | b *| R2 *| | *| <- filtered row - 3r | 3 B*| =D3+30 b*| c *| 5 *| B*| | - 4 | 4 | =A2+40 b*| d *| R4 *| =A1+A3+70 *| =B$1+$A$3+80 *| - (5r | 6 | q | r bB*| s bB| t | u |) optional, for row range - (6 | -1 | -2 | -3 | -4 | -5 | -6 |) optional, for row range - (7r | -11 | -12 | -13 | -14 | -15 | -16 |) optional, for row range - (8 | -21 | -22 | -23 | -24 | -25 | -26 |) optional, for row range - - \______________/ \________________________________________/ - col range 1 col range 2 - - * means note attached - B means background - b means border - r means row selected for row range in multi range selection - - The following test scenarios can be created: - - * Filtered row - * Transpose - * All cell types: numbers, strings, formulas, rich text, empty cell - * Notes at different position - * Formula references to rows before and after filtered row - * Double reference (e.g. A1:A3) - * Relative and absolute references - * absolute references are not changed by transposing - * Formatting patterns (e.g. cell backgrounds and borders) - * Multi range selection with direction column and row - - */ - SCCOL nSrcCols = 6; - SCROW nSrcRows = 4; - // Add additional row for MultiRange test cases - if (bMultiRangeSelection) - { - nSrcRows = eDirection == ScClipParam::Row ? nSrcRows + 2 : nSrcRows; - nSrcCols = eDirection == ScClipParam::Column ? nSrcCols + 1 : nSrcCols; - } - - // col A - m_pDoc->SetValue(0, 0, srcSheet, 1); - m_pDoc->SetValue(0, 1, srcSheet, 2); - m_pDoc->SetValue(0, 2, srcSheet, 3); - m_pDoc->SetValue(0, 3, srcSheet, 4); - // col B - m_pDoc->SetString(1, 0, srcSheet, "=A1+10"); - m_pDoc->SetString(1, 1, srcSheet, "=A2+20"); - m_pDoc->SetString(1, 2, srcSheet, "=D3+30"); - m_pDoc->SetString(1, 3, srcSheet, "=A2+40"); - // col C - m_pDoc->SetString(2, 0, srcSheet, "a"); - m_pDoc->SetString(2, 1, srcSheet, "b"); - m_pDoc->SetString(2, 2, srcSheet, "c"); - m_pDoc->SetString(2, 3, srcSheet, "d"); - // col D - rEditEngine.SetTextCurrentDefaults("R1"); - m_pDoc->SetEditText(ScAddress(3, 0, srcSheet), rEditEngine.CreateTextObject()); - rEditEngine.SetTextCurrentDefaults("R2"); - m_pDoc->SetEditText(ScAddress(3, 1, srcSheet), rEditEngine.CreateTextObject()); - m_pDoc->SetValue(3, 2, srcSheet, 5); - rEditEngine.SetTextCurrentDefaults("R4"); - m_pDoc->SetEditText(ScAddress(3, 3, srcSheet), rEditEngine.CreateTextObject()); - // col E - m_pDoc->SetValue(4, 0, srcSheet, 9); - m_pDoc->SetString(4, 0, srcSheet, "=A1+A3+60"); - m_pDoc->SetEmptyCell(ScAddress(4, 1, srcSheet)); - m_pDoc->SetEmptyCell(ScAddress(4, 2, srcSheet)); - m_pDoc->SetString(4, 3, srcSheet, "=A1+A3+70"); - // col F - m_pDoc->SetValue(5, 0, srcSheet, 9); - m_pDoc->SetString(5, 0, srcSheet, "=SUMIF(A1:A4;\"<4\")"); - m_pDoc->SetEmptyCell(ScAddress(5, 1, srcSheet)); - m_pDoc->SetEmptyCell(ScAddress(5, 2, srcSheet)); - m_pDoc->SetString(5, 3, srcSheet, "=B$1+$A$3+80"); - - const SfxPoolItem* pItem = nullptr; - - // row 4, additional row for MultiRange test case, otherwise not selected - m_pDoc->SetValue(0, 4, srcSheet, 6); - m_pDoc->SetString(1, 4, srcSheet, "q"); - m_pDoc->SetString(2, 4, srcSheet, "r"); - m_pDoc->SetString(3, 4, srcSheet, "s"); - m_pDoc->SetString(4, 4, srcSheet, "t"); - m_pDoc->SetString(5, 4, srcSheet, "u"); - - // row 5, not selected - m_pDoc->SetValue(0, 5, srcSheet, -1); - m_pDoc->SetValue(1, 5, srcSheet, -2); - m_pDoc->SetValue(2, 5, srcSheet, -3); - m_pDoc->SetValue(3, 5, srcSheet, -4); - m_pDoc->SetValue(4, 5, srcSheet, -5); - m_pDoc->SetValue(5, 5, srcSheet, -6); - - // row 6, additional row for MultiRange test case, otherwise not selected - m_pDoc->SetValue(0, 6, srcSheet, -11); - m_pDoc->SetValue(1, 6, srcSheet, -12); - m_pDoc->SetValue(2, 6, srcSheet, -13); - m_pDoc->SetValue(3, 6, srcSheet, -14); - m_pDoc->SetValue(4, 6, srcSheet, -15); - m_pDoc->SetValue(5, 6, srcSheet, -16); - - // row 7, additional row for MultiRange test case, otherwise not selected - m_pDoc->SetValue(0, 7, srcSheet, -21); - m_pDoc->SetValue(1, 7, srcSheet, -22); - m_pDoc->SetValue(2, 7, srcSheet, -23); - m_pDoc->SetValue(3, 7, srcSheet, -24); - m_pDoc->SetValue(4, 7, srcSheet, -25); - m_pDoc->SetValue(5, 7, srcSheet, -26); - - // Col G, not selected - m_pDoc->SetValue(6, 0, srcSheet, 111); - m_pDoc->SetValue(6, 1, srcSheet, 112); - m_pDoc->SetValue(6, 2, srcSheet, 113); - m_pDoc->SetValue(6, 3, srcSheet, 114); - m_pDoc->SetValue(6, 4, srcSheet, 115); - m_pDoc->SetValue(6, 5, srcSheet, 116); - - // Col H, additional col for MultiRange test case, otherwise not selected - m_pDoc->SetValue(7, 0, srcSheet, 121); - m_pDoc->SetValue(7, 1, srcSheet, 122); - m_pDoc->SetValue(7, 2, srcSheet, 123); - m_pDoc->SetValue(7, 3, srcSheet, 124); - m_pDoc->SetValue(7, 4, srcSheet, 125); - m_pDoc->SetValue(7, 5, srcSheet, 126); - - // Col J, not selected - m_pDoc->SetValue(8, 0, srcSheet, 131); - m_pDoc->SetValue(8, 1, srcSheet, 132); - m_pDoc->SetValue(8, 2, srcSheet, 133); - m_pDoc->SetValue(8, 3, srcSheet, 134); - m_pDoc->SetValue(8, 4, srcSheet, 135); - m_pDoc->SetValue(8, 5, srcSheet, 136); - - // add patterns - ScPatternAttr aCellBlueColor(m_pDoc->GetPool()); - aCellBlueColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND)); - m_pDoc->ApplyPatternAreaTab(0, 0, 0, 2, srcSheet, aCellBlueColor); - - // Check pattern precondition - m_pDoc->GetPattern(ScAddress(0, 0, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("SrcSheet.A1 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(0, 1, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("SrcSheet.A2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(0, 3, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("SrcSheet.A4 has no pattern", !pItem); - - // row 2 on empty cell - ScPatternAttr aCellGreenColor(m_pDoc->GetPool()); - aCellGreenColor.GetItemSet().Put(SvxBrushItem(COL_GREEN, ATTR_BACKGROUND)); - m_pDoc->ApplyPatternAreaTab(4, 2, 4, 2, srcSheet, aCellGreenColor); - - // row 4 for multi range row selection - ScPatternAttr aCellRedColor(m_pDoc->GetPool()); - aCellRedColor.GetItemSet().Put(SvxBrushItem(COL_RED, ATTR_BACKGROUND)); - m_pDoc->ApplyPatternAreaTab(2, 4, 3, 4, srcSheet, aCellRedColor); - - // add borders - ::editeng::SvxBorderLine aLine(nullptr, 50, SvxBorderLineStyle::SOLID); - SvxBoxItem aBorderItem(ATTR_BORDER); - aBorderItem.SetLine(&aLine, SvxBoxItemLine::LEFT); - aBorderItem.SetLine(&aLine, SvxBoxItemLine::RIGHT); - m_pDoc->ApplyAttr(1, 1, srcSheet, aBorderItem); - m_pDoc->ApplyAttr(1, 2, srcSheet, aBorderItem); - m_pDoc->ApplyAttr(1, 3, srcSheet, aBorderItem); - // Check border precondition - pItem = m_pDoc->GetAttr(ScAddress(1, 0, srcSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("SrcSheet.B1 has a border", pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - pItem = m_pDoc->GetAttr(ScAddress(1, 1, srcSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("SrcSheet.B2 has a border", pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - // Check border precondition 2 - m_pDoc->GetPattern(ScAddress(1, 1, srcSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); - CPPUNIT_ASSERT_MESSAGE("SrcSheet.B2 has a border", pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - // row 4 for multi range row selection - ::editeng::SvxBorderLine aDoubleLine(nullptr, 50, SvxBorderLineStyle::DOUBLE); - SvxBoxItem aDoubleBorderItem(ATTR_BORDER); - aDoubleBorderItem.SetLine(&aDoubleLine, SvxBoxItemLine::TOP); - aDoubleBorderItem.SetLine(&aDoubleLine, SvxBoxItemLine::BOTTOM); - m_pDoc->ApplyAttr(2, 4, srcSheet, aDoubleBorderItem); - m_pDoc->ApplyAttr(3, 4, srcSheet, aDoubleBorderItem); - - // add notes to A1:F4 - - // add notes row 0 - ScAddress aAdrA1(0, 0, srcSheet); - ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAdrA1); - pNoteA1->SetText(aAdrA1, "Hello world in A1"); - ScAddress aAdrB1(1, 0, srcSheet); - ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAdrB1); - pNoteB1->SetText(aAdrB1, "Hello world in B1"); - // No note on C1 - ScAddress aAdrD1(3, 0, srcSheet); - ScPostIt* pNoteD1 = m_pDoc->GetOrCreateNote(aAdrD1); - pNoteD1->SetText(aAdrD1, "Hello world in D1"); - // No note on E1 - // No note on F1 - - // add notes row 1 - ScAddress aAdrA2(0, 1, srcSheet); - ScPostIt* pNoteA2 = m_pDoc->GetOrCreateNote(aAdrA2); - pNoteA2->SetText(aAdrA2, "Hello world in A2"); - // No note on B2 - ScAddress aAdrC2(2, 1, srcSheet); - ScPostIt* pNoteC2 = m_pDoc->GetOrCreateNote(aAdrC2); - pNoteC2->SetText(aAdrC2, "Hello world in C2"); - ScAddress aAdrD2(3, 1, srcSheet); - ScPostIt* pNoteD2 = m_pDoc->GetOrCreateNote(aAdrD2); - pNoteD2->SetText(aAdrD2, "Hello world in D2"); - ScAddress aAdrE2(4, 2, srcSheet); - ScPostIt* pNoteE2 = m_pDoc->GetOrCreateNote(aAdrE2); - pNoteE2->SetText(aAdrE2, "Hello world in E2"); - ScAddress aAdrF2(5, 1, srcSheet); - ScPostIt* pNoteF2 = m_pDoc->GetOrCreateNote(aAdrF2); - pNoteF2->SetText(aAdrF2, "Hello world in F2"); - - // add notes row 2 - ScAddress aAdrA3(0, 2, srcSheet); - ScPostIt* pNoteA3 = m_pDoc->GetOrCreateNote(aAdrA3); - pNoteA3->SetText(aAdrA3, "Hello world in A3"); - ScAddress aAdrB3(1, 2, srcSheet); - ScPostIt* pNoteB3 = m_pDoc->GetOrCreateNote(aAdrB3); - pNoteB3->SetText(aAdrB3, "Hello world in B3"); - ScAddress aAdrC3(2, 2, srcSheet); - ScPostIt* pNoteC3 = m_pDoc->GetOrCreateNote(aAdrC3); - pNoteC3->SetText(aAdrC3, "Hello world in C3"); - ScAddress aAdrD3(3, 2, srcSheet); - ScPostIt* pNoteD3 = m_pDoc->GetOrCreateNote(aAdrD3); - pNoteD3->SetText(aAdrD3, "Hello world in D3"); - // No note on E3 - // No note on F3 - - // add notes row 3 - // No note on A4 - ScAddress aAdrB4(1, 3, srcSheet); - ScPostIt* pNoteB4 = m_pDoc->GetOrCreateNote(aAdrB4); - pNoteB4->SetText(aAdrB4, "Hello world in B4"); - ScAddress aAdrC4(2, 3, srcSheet); - ScPostIt* pNoteC4 = m_pDoc->GetOrCreateNote(aAdrC4); - pNoteC4->SetText(aAdrC4, "Hello world in C4"); - ScAddress aAdrD4(3, 3, srcSheet); - ScPostIt* pNoteD4 = m_pDoc->GetOrCreateNote(aAdrD4); - pNoteD4->SetText(aAdrD4, "Hello world in D4"); - ScAddress aAdrE4(4, 3, srcSheet); - ScPostIt* pNoteE4 = m_pDoc->GetOrCreateNote(aAdrE4); - pNoteE4->SetText(aAdrE4, "Hello world in E4"); - ScAddress aAdrF4(5, 3, srcSheet); - ScPostIt* pNoteF4 = m_pDoc->GetOrCreateNote(aAdrF4); - pNoteF4->SetText(aAdrF4, "Hello world in F4"); - - // row 4 for multi range row selection - ScAddress aAdrC5(2, 4, srcSheet); - ScPostIt* pNoteC5 = m_pDoc->GetOrCreateNote(aAdrC5); - pNoteC5->SetText(aAdrC5, "Hello world in C5"); - - // Filter out row 1 - if (bApplyFilter) - { - ScDBData* pDBData - = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, nSrcCols - 1, nSrcRows - 1); - m_pDoc->SetAnonymousDBData(srcSheet, std::unique_ptr<ScDBData>(pDBData)); - - pDBData->SetAutoFilter(true); - ScRange aRange; - pDBData->GetArea(aRange); - m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), - aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); - - //create the query param - ScQueryParam aParam; - pDBData->GetQueryParam(aParam); - ScQueryEntry& rEntry = aParam.GetEntry(0); - rEntry.bDoQuery = true; - rEntry.nField = 0; - rEntry.eOp = SC_NOT_EQUAL; - rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 - // add queryParam to database range. - pDBData->SetQueryParam(aParam); - - // perform the query. - m_pDoc->Query(srcSheet, aParam, true); - - // Check precondition for test: row 1 is hidden/filtered - SCROW nRow1, nRow2; - SCROW nFilteredRow1, nFilteredRow2; - bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2); - CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2); - bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2); - CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1); - CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2); - } - - // create destination sheet - const SCTAB destSheet = 1; - m_pDoc->InsertTab(destSheet, "DestSheet"); - // set cells to 1000 to check empty cell behaviour and to detect destination range problems - for (int i = 0; i < 10; ++i) - for (int j = 0; j < 10; ++j) - m_pDoc->SetValue(i, j, destSheet, 1000); - - // transpose clipboard, paste on DestSheet - ScDocument aNewClipDoc(SCDOCMODE_CLIP); - ScMarkData aDestMark(m_pDoc->GetSheetLimits()); - if (!bMultiRangeSelection) - { - ScRange aSrcRange(0, 0, srcSheet, nSrcCols - 1, nSrcRows - 1, srcSheet); - copyToClip(m_pDoc, aSrcRange, &aNewClipDoc); - - // ScDocument::TransposeClip() and ScDocument::CopyFromClip() calls - // analog to ScViewFunc::PasteFromClip() - if (bTranspose) - { - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aNewClipDoc.TransposeClip(pTransClip.get(), aFlags, bAsLink, bIncludedFiltered); - ScRange aDestRange(3, 1, destSheet, 3 + nSrcRows - 1, 1 + nSrcCols - 1, - destSheet); //target: D2:F6 - aDestMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, nullptr, pTransClip.get(), true, - bAsLink, bIncludedFiltered, bSkipEmpty); - pTransClip.reset(); - } - else - { - ScRange aDestRange(3, 1, destSheet, 3 + nSrcCols - 1, 1 + nSrcRows - 1, - destSheet); //target: D2:I5 - aDestMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, nullptr, &aNewClipDoc, true, - bAsLink, bIncludedFiltered, bSkipEmpty); - } - } - else - { - ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); - aSrcMark.SelectOneTable(0); - ScClipParam aClipParam; - aClipParam.meDirection = eDirection; - if (eDirection == ScClipParam::Column) - { - aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 1, 3, srcSheet)); // A1:B4 - aClipParam.maRanges.push_back(ScRange(3, 0, srcSheet, 5, 3, srcSheet)); // D1:F4 - aClipParam.maRanges.push_back(ScRange(7, 0, srcSheet, 7, 3, srcSheet)); // H1:H4 - } - else if (eDirection == ScClipParam::Row) - { - aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 5, 2, srcSheet)); // A1:F3 - aClipParam.maRanges.push_back(ScRange(0, 4, srcSheet, 5, 4, srcSheet)); // A5:F5 - aClipParam.maRanges.push_back(ScRange(0, 6, srcSheet, 5, 6, srcSheet)); // A7:F7 - } - CPPUNIT_ASSERT(aClipParam.isMultiRange()); - m_pDoc->CopyToClip(aClipParam, &aNewClipDoc, &aSrcMark, false, false); - - // ScDocument::TransposeClip() and ScDocument::CopyMultiRangeFromClip() calls - // analog to ScViewFunc::PasteFromClipToMultiRanges() - if (bTranspose) - { - printRange(m_pDoc, aClipParam.getWholeRange(), "Src range"); - ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); - aNewClipDoc.TransposeClip(pTransClip.get(), aFlags, bAsLink, bIncludedFiltered); - ScRange aDestRange(3, 1, destSheet, 3 + nSrcRows - 1, 1 + nSrcCols - 1 - 1, - destSheet); //target col: D2:G6, target row: D2:H6 - aDestMark.SetMarkArea(aDestRange); - printRange(&aNewClipDoc, ScRange(0, 0, 0, nSrcCols, nSrcRows, 0), - "Base doc (&aNewClipDoc)"); - printRange(pTransClip.get(), ScRange(0, 0, 0, nSrcCols, nSrcRows, 0), - "Transposed filtered clipdoc (pTransClip.get())"); - m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 1, destSheet), aDestMark, aFlags, - pTransClip.get(), true, bAsLink && !bTranspose, - bIncludedFiltered, bSkipEmpty); - pTransClip.reset(); - printRange(m_pDoc, aDestRange, "Transposed dest sheet"); - } - else - { - ScRange aDestRange(3, 1, destSheet, 3 + nSrcCols - 1 - 1, 1 + nSrcRows - 1, - destSheet); //target col: D2:I5, target row: D2:I6 - aDestMark.SetMarkArea(aDestRange); - m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 1, destSheet), aDestMark, aFlags, - &aNewClipDoc, true, bAsLink && !bTranspose, - bIncludedFiltered, bSkipEmpty); - } - } - if (bCalcAll) - m_pDoc->CalcAll(); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); -} - -void Test::testCopyPasteSpecial() -{ - executeCopyPasteSpecial(false, false, false, false, false, false); - checkCopyPasteSpecial(false); -} - -void Test::testCopyPasteSpecialFiltered() -{ - executeCopyPasteSpecial(true, false, false, false, false, false); - checkCopyPasteSpecialFiltered(false); -} - -void Test::testCopyPasteSpecialIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(false, true, false, false, false, false); - checkCopyPasteSpecial(false); -} - -void Test::testCopyPasteSpecialFilteredIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, false, false, false); - checkCopyPasteSpecial(false); -} - -// similar to Test::testCopyPasteTranspose(), but this test is more complex -void Test::testCopyPasteSpecialTranspose() -{ - executeCopyPasteSpecial(false, false, false, true, false, false); - checkCopyPasteSpecialTranspose(false); -} - -// tdf#107348 -void Test::testCopyPasteSpecialFilteredTranspose() -{ - executeCopyPasteSpecial(true, false, false, true, false, false); - checkCopyPasteSpecialFilteredTranspose(false); -} - -// tdf#107348 -void Test::testCopyPasteSpecialTransposeIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, true, false, false); - checkCopyPasteSpecialTranspose(false); -} - -void Test::testCopyPasteSpecialMultiRangeCol() -{ - executeCopyPasteSpecial(false, false, false, false, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeCol(false); -} - -void Test::testCopyPasteSpecialMultiRangeColIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(false, true, false, false, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeCol(false); -} - -// tdf#45958 -void Test::testCopyPasteSpecialMultiRangeColFiltered() -{ - executeCopyPasteSpecial(true, false, false, false, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColFiltered(false); -} - -// tdf#45958 -void Test::testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, false, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeCol(false); -} - -void Test::testCopyPasteSpecialMultiRangeColTranspose() -{ - executeCopyPasteSpecial(false, false, false, true, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColTranspose(false); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialMultiRangeColFilteredTranspose() -{ - executeCopyPasteSpecial(true, false, false, true, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColFilteredTranspose(false); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, true, true, false, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColTranspose(false); -} - -void Test::testCopyPasteSpecialMultiRangeRow() -{ - executeCopyPasteSpecial(false, false, false, false, true, false, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRow(false); -} - -void Test::testCopyPasteSpecialMultiRangeRowIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(false, true, false, false, true, false, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRow(false); -} - -// tdf#45958 -void Test::testCopyPasteSpecialMultiRangeRowFiltered() -{ - executeCopyPasteSpecial(true, false, false, false, true, false, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRowFiltered(false); -} - -// tdf#45958 -void Test::testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, false, true, false, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRow(false); -} - -void Test::testCopyPasteSpecialMultiRangeRowTranspose() -{ - executeCopyPasteSpecial(false, false, false, true, true, false, ScClipParam::Row, true); - checkCopyPasteSpecialMultiRangeRowTranspose(false); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialMultiRangeRowFilteredTranspose() -{ - executeCopyPasteSpecial(true, false, false, true, true, false, ScClipParam::Row, true); - checkCopyPasteSpecialMultiRangeRowFilteredTranspose(false); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, true, true, false, ScClipParam::Row, true); - checkCopyPasteSpecialMultiRangeRowTranspose(false); -} - -void Test::testCopyPasteSpecialSkipEmpty() -{ - executeCopyPasteSpecial(false, false, false, false, false, true); - checkCopyPasteSpecial(true); -} - -void Test::testCopyPasteSpecialSkipEmptyFiltered() -{ - executeCopyPasteSpecial(true, false, false, false, false, true); - checkCopyPasteSpecialFiltered(true); -} - -void Test::testCopyPasteSpecialSkipEmptyIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(false, true, false, false, false, true); - checkCopyPasteSpecial(true); -} - -void Test::testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, false, false, true); - checkCopyPasteSpecial(true); -} - -// similar to Test::testCopyPasteTranspose(), but this test is more complex -void Test::testCopyPasteSpecialSkipEmptyTranspose() -{ - executeCopyPasteSpecial(false, false, false, true, false, true); - checkCopyPasteSpecialTranspose(true); -} - -// tdf#107348 -void Test::testCopyPasteSpecialSkipEmptyFilteredTranspose() -{ - executeCopyPasteSpecial(true, false, false, true, false, true); - checkCopyPasteSpecialFilteredTranspose(true); -} - -// tdf#107348 -void Test::testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, true, false, true); - checkCopyPasteSpecialTranspose(true); -} - -void Test::testCopyPasteSpecialSkipEmptyMultiRangeCol() -{ - executeCopyPasteSpecial(false, false, false, false, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeCol(true); -} - -void Test::testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(false, true, false, false, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeCol(true); -} - -// tdf#45958 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeColFiltered() -{ - executeCopyPasteSpecial(true, false, false, false, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColFiltered(true); -} - -// tdf#45958 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, false, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeCol(true); -} - -void Test::testCopyPasteSpecialSkipEmptyMultiRangeColTranspose() -{ - executeCopyPasteSpecial(false, false, false, true, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColTranspose(true); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, false, false, true, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColFilteredTranspose(true); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, true, true, true, ScClipParam::Column); - checkCopyPasteSpecialMultiRangeColTranspose(true); -} - -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRow() -{ - executeCopyPasteSpecial(false, false, false, false, true, true, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRow(true); -} - -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(false, true, false, false, true, true, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRow(true); -} - -// tdf#45958 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered() -{ - executeCopyPasteSpecial(true, false, false, false, true, true, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRowFiltered(true); -} - -// tdf#45958 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, false, true, true, ScClipParam::Row); - checkCopyPasteSpecialMultiRangeRow(true); -} - -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose() -{ - executeCopyPasteSpecial(false, false, false, true, true, true, ScClipParam::Row, true); - checkCopyPasteSpecialMultiRangeRowTranspose(true); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose() -{ - executeCopyPasteSpecial(true, false, false, true, true, true, ScClipParam::Row, true); - checkCopyPasteSpecialMultiRangeRowFilteredTranspose(true); -} - -// tdf#45958, tdf#107348 -void Test::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose() -{ - // For bIncludeFiltered=true, the non-filtered outcome is expected - executeCopyPasteSpecial(true, true, false, true, true, true, ScClipParam::Row, true); - checkCopyPasteSpecialMultiRangeRowTranspose(true); -} - -// Base check, nothing filtered, nothing transposed -void Test::checkCopyPasteSpecial(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | H | I | - - 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | - 3 | 2 B*| =D3+20 b | b *| R2 *| | *| - 4 | 3 B*| =G4+30 b*| c *| 5 *| B*| | - 5 | 4 | =D3+40 b*| d *| R4 *| =D2+D4+70 *| =E$1+$A$3+80 *| - - * means note attached - B means background - b means border - */ - - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // col 2 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - // col 3, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(3, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); - // col 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), aString); - ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(35, m_pDoc->GetValue(4, 3, destSheet)); - m_pDoc->GetFormula(4, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), aString); - ASSERT_DOUBLES_EQUAL(42, m_pDoc->GetValue(4, 4, destSheet)); - m_pDoc->GetFormula(4, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D3+40"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - // col 5, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - aString = m_pDoc->GetString(5, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(5, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); - aString = m_pDoc->GetString(5, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("b"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); - aString = m_pDoc->GetString(5, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("d"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - aString = m_pDoc->GetString(5, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 6, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 2, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // col 7, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - aString = m_pDoc->GetString(7, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(7, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); - ASSERT_DOUBLES_EQUAL(64, m_pDoc->GetValue(7, 1, destSheet)); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - } - fValue = m_pDoc->GetValue(7, 4, destSheet); - m_pDoc->GetFormula(7, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+70"), aString); - ASSERT_DOUBLES_EQUAL(74, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 8, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); - aString = m_pDoc->GetString(8, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(8, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(8, 1, destSheet)); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(8, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(8, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 3, destSheet)); - } - fValue = m_pDoc->GetValue(8, 4, destSheet); - m_pDoc->GetFormula(8, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=E$1+$A$3+80"), aString); - ASSERT_DOUBLES_EQUAL(2080, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); - aString = m_pDoc->GetString(8, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 9, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(8, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(8, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 5, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(8, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(8, 4, destSheet))->GetText()); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); -} - -void Test::checkCopyPasteSpecialFiltered(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | H | I | - - 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | - 3 | 3 B*| =G3+30 b*| c *| 5 *| B*| | - 4 | 4 | =D2+40 b*| d *| R4 *| =D1+D3+70 *| =E$1+$A$3+80 *| - 5 | 1 B*| =D5+10 *| a | R1 *| =D5+D7+60 | =SUMIF(D5:D8;"<4") | <- repeated row - - * means note attached - B means background - b means border - */ - - OUString aString; - double fValue; - const EditTextObject* pEditObj; - - // col 2 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - // col 3, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 3, destSheet)); - fValue = m_pDoc->GetValue(3, 4, destSheet); // repeated row 1 - ASSERT_DOUBLES_EQUAL(1, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); - // col 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - m_pDoc->GetFormula(4, 0, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), aString); - ASSERT_DOUBLES_EQUAL(35, fValue); - fValue = m_pDoc->GetValue(4, 3, destSheet); - m_pDoc->GetFormula(4, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), aString); - ASSERT_DOUBLES_EQUAL(41, fValue); - fValue = m_pDoc->GetValue(4, 4, destSheet); // repeated row 1 - ASSERT_DOUBLES_EQUAL(11, fValue); - m_pDoc->GetFormula(4, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D5+10"), aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - // col 5, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - aString = m_pDoc->GetString(5, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); - aString = m_pDoc->GetString(5, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("d"), aString); - aString = m_pDoc->GetString(5, 4, destSheet); // repeated row 1 - CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - m_pDoc->GetFormula(4, 5, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - // col 6, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 2, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); // repeated row 1 - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // col 7, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - aString = m_pDoc->GetString(7, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(7, 1, destSheet, aString); - fValue = m_pDoc->GetValue(7, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); - ASSERT_DOUBLES_EQUAL(65, fValue); // formula is not adjusted due to filter row - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - fValue = m_pDoc->GetValue(7, 3, destSheet); - m_pDoc->GetFormula(7, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D1+D3+70"), aString); - ASSERT_DOUBLES_EQUAL(1073, fValue); - m_pDoc->GetFormula(7, 4, destSheet, aString); // repeated row 1 - fValue = m_pDoc->GetValue(7, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("=D5+D7+60"), aString); - ASSERT_DOUBLES_EQUAL(1061, fValue); // formula is not adjusted due to filter row - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 8, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); - aString = m_pDoc->GetString(8, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(8, 1, destSheet, aString); - fValue = m_pDoc->GetValue(8, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(5, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(8, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); - fValue = m_pDoc->GetValue(8, 3, destSheet); - m_pDoc->GetFormula(8, 3, destSheet, aString); - ASSERT_DOUBLES_EQUAL(2080, fValue); - CPPUNIT_ASSERT_EQUAL(OUString("=E$1+$A$3+80"), aString); - m_pDoc->GetFormula(8, 4, destSheet, aString); // repeated row 1 - fValue = m_pDoc->GetValue(8, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D5:D8;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(1, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); - aString = m_pDoc->GetString(8, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 9, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(7, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(8, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 5, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(8, 3, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialTranspose(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | - - 2 | 1 B*| 2 B*| 3 B*| 4 | - 3 | =D2+10 *| =E2+20 b | =F5+30 b*| =E2+40 b*| - 4 | a | b *| c *| d *| - 5 | R1 *| R2 *| 5 *| R4 *| - 6 | =D2+F2+60 | | B*| =D2+F2+70 *| - 7 | =SUMIF(D2:G2;"<4") | *| | =C$1+$A$1+80 *| - - * means note attached - B means background - b means border - */ - - //check cell content after transposed copy/paste of filtered data - // Note: column F is a repetition of srcSheet.Column A - // Col C and G are checked to be empty - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // row 0 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - // row 1, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); - fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 2, fValue); - fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 3, fValue); - fValue = m_pDoc->GetValue(6, 1, destSheet); // G2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell G2", 4, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 1, destSheet)); - // row 2, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - aString = m_pDoc->GetString(2, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), - aString); - fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on E2", OUString("=E2+20"), - aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 22, fValue); - m_pDoc->GetFormula(5, 2, destSheet, aString); // F3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F3 should point on F2", OUString("=F5+30"), - aString); - fValue = m_pDoc->GetValue(5, 2, destSheet); // F3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 35, fValue); - m_pDoc->GetFormula(6, 2, destSheet, aString); // G3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G3 should point on E2", OUString("=E2+40"), - aString); - fValue = m_pDoc->GetValue(6, 2, destSheet); // G3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G3", 42, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 3, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - aString = m_pDoc->GetString(2, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(3, 3, destSheet); // D4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); - aString = m_pDoc->GetString(4, 3, destSheet); // E4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: b", OUString("b"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); // F4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: c", OUString("c"), aString); - aString = m_pDoc->GetString(6, 3, destSheet); // G4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: d", OUString("d"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 4, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), - pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(4, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in E5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong E5.", OUString("R2"), pEditObj->GetText(0)); - fValue = m_pDoc->GetValue(5, 4, destSheet); // F5 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F5", 5, fValue); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in G5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong G5.", OUString("R4"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr); - // row 5, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); - fValue = m_pDoc->GetValue(3, 5, destSheet); // D6 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 64, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 5, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(5, 5, destSheet); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - } - fValue = m_pDoc->GetValue(6, 5, destSheet); // G6 - m_pDoc->GetFormula(6, 5, destSheet, aString); // G6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G6", OUString("=D2+F2+70"), aString); - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G6", 74, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 6, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); - aString = m_pDoc->GetString(2, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), - aString); - fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", 6, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 6, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(5, 6, destSheet); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 6, destSheet)); - } - fValue = m_pDoc->GetValue(6, 6, destSheet); // G7 - m_pDoc->GetFormula(6, 6, destSheet, aString); // G7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G7", OUString("=C$1+$A$3+80"), aString); - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G7", 2080, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); - aString = m_pDoc->GetString(7, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 7 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has blue background", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("F2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("F2 has a pattern", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("D3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("D3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("D3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - - CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("E3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("E3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("F3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("F3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("G3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("G3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("G3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("G3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("H3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("H3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("H3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", - !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", - !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", - !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", - !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", - !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H1", - !m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", - !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", - m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", - m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F2", - m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G2", - !m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H2", - !m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", - !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", - m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E3", - !m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", - m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G3", - m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H3", - !m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", - !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", - !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", - m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", - m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G4", - m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H4", - !m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", - !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", - m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", - m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", - m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G5", - m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H5", - !m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", - !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", - !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E6", - !m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G6", - m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H6", - !m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", - !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", - !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F7", - !m_pDoc->HasNote(ScAddress(5, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note a G7", - m_pDoc->HasNote(ScAddress(6, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H7", - !m_pDoc->HasNote(ScAddress(7, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", - !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", - !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", - !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", - !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", - !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H8", - !m_pDoc->HasNote(ScAddress(7, 7, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", - m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", - m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F2", - m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); - // G2 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", - m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - // E3 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F3", - m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - // D4 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", - m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F4", - m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", - m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", - m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F5", - m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on G6", - m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 5, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E7", - m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 6, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on G7", - m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 6, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - ┌--- filtered src row 2 ┌--- repeated row - v v - - | D | E | F | G | - - 2 | 1 B*| 3 B*| 4 | 1 B*| - 3 | =D2+10 *| =E5+30 b*| =D2+40 b*| =G2+10 *| - 4 | a | c *| d *| a | - 5 | R1 *| 5 *| R4 *| R1 *| - 6 | =D2+F2+60 | B*| =C2+E2+70 *| =G2+I2+60 | - 7 | =SUMIF(D2:G2;"<4") | | =B$1+$A$1+80 *| =SUMIF(G2:J2;"<4") | - - * means note attached - */ - - //check cell content after transposed copy/paste of filtered data - // Note: column F is a repetition of srcSheet.Column A - // Col C and G are checked to be empty - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // row 0 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - // row 1, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - aString = m_pDoc->GetString(2, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); - fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 3, fValue); - fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 4, fValue); - fValue = m_pDoc->GetValue(6, 1, destSheet); // G2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell G2 (repetition of D2)", 1, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 1, destSheet)); - aString = m_pDoc->GetString(7, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 2, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - aString = m_pDoc->GetString(2, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); - m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), - aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on E2", OUString("=E5+30"), - aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 35, fValue); - m_pDoc->GetFormula(5, 2, destSheet, aString); // F3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F3 should point on F2", OUString("=D2+40"), - aString); - fValue = m_pDoc->GetValue(5, 2, destSheet); // F3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 41, fValue); - fValue = m_pDoc->GetValue(6, 2, destSheet); // G3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 11, fValue); - m_pDoc->GetFormula(6, 2, destSheet, aString); // G3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G3 should point on G2 (repetition of D3)", - OUString("=G2+10"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 3, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - aString = m_pDoc->GetString(2, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(3, 3, destSheet); // D4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); - aString = m_pDoc->GetString(4, 3, destSheet); // E4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: c", OUString("c"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); // F4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: d", OUString("d"), aString); - aString = m_pDoc->GetString(6, 3, destSheet); // G4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: a (repetition of D4)", OUString("a"), - aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 4, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), - pEditObj->GetText(0)); - fValue = m_pDoc->GetValue(4, 4, destSheet); // E5 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E5", 5, fValue); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in F5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong F5.", OUString("R4"), pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in G5. (repetition of D5)", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong G5. (repetition of D5)", OUString("R1"), - pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr); - // row 5, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); - fValue = m_pDoc->GetValue( - ScAddress(3, 5, destSheet)); // D6, formulas over filtered rows are not adjusted - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 65, - fValue); // formulas over filtered rows are not adjusted - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 5, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - m_pDoc->GetFormula(5, 5, destSheet, aString); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F6", OUString("=C2+E2+70"), aString); - fValue = m_pDoc->GetValue( - ScAddress(5, 5, destSheet)); // F6, formulas over filtered rows are not adjusted - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F6", 1073, fValue); - m_pDoc->GetFormula(6, 5, destSheet, aString); // G6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G6 (repetition of D6)", OUString("=G2+I2+60"), - aString); - fValue = m_pDoc->GetValue(6, 5, destSheet); // G6 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G6 (repetition of D6)", 1061, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 6, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); - aString = m_pDoc->GetString(2, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), - aString); - fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", 5, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 6, destSheet); // E7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); - m_pDoc->GetFormula(5, 6, destSheet, aString); // F7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F7", OUString("=B$1+$A$3+80"), aString); - fValue = m_pDoc->GetValue(5, 6, destSheet); // F7 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F6", 2080, fValue); - m_pDoc->GetFormula(6, 6, destSheet, aString); // G7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G7 (repetition of D7)", - OUString("=SUMIF(G2:J2;\"<4\")"), aString); - fValue = m_pDoc->GetValue(6, 5, destSheet); // G7 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G7 (repetition of D7)", 1061, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); - aString = m_pDoc->GetString(7, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - - // row - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - - // check patterns - - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("F2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("G2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("G2 has a pattern", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(4, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("D3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("D3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("D3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("E3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("E3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("F3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("F3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("G3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("G3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("G3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("G3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("G3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("H3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("H3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("H3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", - !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", - !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", - !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", - !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", - !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H1", - !m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", - !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", - m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", - m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F2", - !m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G2", - m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H2", - !m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", - !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", - m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E3", - m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", - m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G3", - m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H3", - !m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", - !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", - !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", - m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", - m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G4", - !m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H4", - !m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", - !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", - m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", - m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", - m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G5", - m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H5", - !m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", - !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", - !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F6", - m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G6", - !m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H6", - !m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", - !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", - !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E7", - !m_pDoc->HasNote(ScAddress(4, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note a F7", - m_pDoc->HasNote(ScAddress(5, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G7", - !m_pDoc->HasNote(ScAddress(6, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H7", - !m_pDoc->HasNote(ScAddress(7, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", - !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", - !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", - !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", - !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", - !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H8", - !m_pDoc->HasNote(ScAddress(7, 7, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", - m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", - m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - // F2 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on G2", - m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", - m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E3", - m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F3", - m_pDoc->GetNote(ScAddress(1, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on G3", - m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); - // D4 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", - m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F4", - m_pDoc->GetNote(ScAddress(2, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - // G4 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", - m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", - m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F5", - m_pDoc->GetNote(ScAddress(3, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on G5", - m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 5, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F6", - m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F7", - m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 6, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - ┌--- not selected src col C - v - - | D | E | F | G | H | I | - - 2 | 1 B*| =D2+10 *| R1 *| =C2+C4+60 | =SUMIF(C2:C5;"<4") | 121 | - 3 | 2 B*| =D3+20 b | R2 *| | *| 122 | <- filtered row - 4 | 3 B*| =G4+30 b*| 5 *| B*| | 123 | - 5 | 4 | =D3+40 b*| R4 *| =C2+C4+70 *| =D$1+$A$1+80 *| 124 | - - * means note attached - B means background - b means border - */ - - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // col 2 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - // col 3, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(3, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); - // col 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - aString = m_pDoc->GetString(4, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), aString); - ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); - fValue = m_pDoc->GetValue(4, 3, destSheet); - m_pDoc->GetFormula(4, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), - aString); // references over selection gaps are not adjusted - ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 - fValue = m_pDoc->GetValue(4, 4, destSheet); - m_pDoc->GetFormula(4, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D3+40"), aString); - ASSERT_DOUBLES_EQUAL(42, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - aString = m_pDoc->GetString(4, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 5, strings are not selected - // col 5, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - aString = m_pDoc->GetString(4, 5, destSheet); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 0, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 1, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 2, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(5, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 5, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // col 6, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - aString = m_pDoc->GetString(6, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(6, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+60"), aString); - ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(6, 1, destSheet)); // It was 64 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(6, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(6, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 3, destSheet)); - } - fValue = m_pDoc->GetValue(6, 4, destSheet); - m_pDoc->GetFormula(6, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+70"), aString); - ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); - aString = m_pDoc->GetString(6, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 7, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - aString = m_pDoc->GetString(7, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(7, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL( - OUString("=SUMIF(C2:C5;\"<4\")"), - aString); // CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(7, 1, destSheet)); // It was 6 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - } - fValue = m_pDoc->GetValue(7, 4, destSheet); - m_pDoc->GetFormula(7, 4, destSheet, aString); - ASSERT_DOUBLES_EQUAL(2080, fValue); - CPPUNIT_ASSERT_EQUAL(OUString("=D$1+$A$3+80"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 8, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(8, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(122, m_pDoc->GetValue(8, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(8, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(8, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); - // col 9, col repetition is not supported for multi range copy/paste - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(6, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 4, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - ┌--- not selected src col C - v - - | D | E | F | G | H | I | - - 2 | 1 B*| =D2+10 *| R1 *| =C2+C4+60 | =SUMIF(C2:C5;"<4") | 121 | - 3 | 3 B*| =G4+30 b*| 5 *| B*| | 123 | - 4 | 4 | =D2+40 b*| R4 *| =C1+C3+70 *| =D$1+$A$1+80 *| 124 | - - * means note attached - B means background - b means border - */ - - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // col 2 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - // col 3, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 4, destSheet)); - // col 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - m_pDoc->GetFormula(4, 0, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), - aString); // references over selection gaps are not adjusted - ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 - fValue = m_pDoc->GetValue(4, 3, destSheet); - m_pDoc->GetFormula(4, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), aString); - ASSERT_DOUBLES_EQUAL(41, fValue); // was originally 42, not adjusted by filtering - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 4, destSheet)); - m_pDoc->GetFormula(4, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - // col 5, strings are not selected - // col 5, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 0, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 1, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(5, 2, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // col 6, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - m_pDoc->GetFormula(6, 0, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - m_pDoc->GetFormula(6, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+60"), aString); - ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(6, 1, destSheet)); // It was 64 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(6, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 2, destSheet)); - fValue = m_pDoc->GetValue(6, 3, destSheet); - m_pDoc->GetFormula(6, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=C1+C3+70"), aString); - ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 4, destSheet)); - m_pDoc->GetFormula(6, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - // col 7, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - m_pDoc->GetFormula(7, 0, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - m_pDoc->GetFormula(7, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(C2:C5;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(7, 1, destSheet)); // It was 6 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - fValue = m_pDoc->GetValue(7, 3, destSheet); - m_pDoc->GetFormula(7, 3, destSheet, aString); - ASSERT_DOUBLES_EQUAL(2080, fValue); - CPPUNIT_ASSERT_EQUAL(OUString("=D$1+$A$3+80"), aString); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); - m_pDoc->GetFormula(7, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - // col 8, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(8, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(8, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(8, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 4, destSheet)); - // col 9, col repetition is not supported for multi range copy/paste - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(6, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | - - 2 | 1 B*| 2 B*| 3 B*| 4 | - 3 | =D2+10 *| =E2+20 b | =F5+30 b*| =E2+40 b*| - 4 | R1 *| R2 *| 5 *| R4 *| - 5 | =D1+F1+60 | | B*| =D1+F1+70 *| - 6 | =SUMIF(D1:G1;"<4") | *| | =C$1+$A$1+80 *| - 7 | 121 | 122 | 123 | 124 | - - * means note attached - B means background - b means border - */ - - // check cell content after transposed copy/paste of filtered data - // Col C and G are checked to be empty - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // row 0 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - // row 1, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(4, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(5, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(6, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 1, destSheet)); - // row 2, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - aString = m_pDoc->GetString(2, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(3, 2, destSheet)); - m_pDoc->GetFormula(3, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=E2+20"), aString); - ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); - fValue = m_pDoc->GetValue(5, 2, destSheet); - m_pDoc->GetFormula(5, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=F5+30"), aString); - ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 - fValue = m_pDoc->GetValue(6, 2, destSheet); - m_pDoc->GetFormula(6, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=E2+40"), aString); - ASSERT_DOUBLES_EQUAL(42, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 3, strings was not selected in multi range selection - // row 3, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(2, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(3, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(4, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(5, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(7, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // row 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - aString = m_pDoc->GetString(2, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+60"), aString); - ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(3, 4, destSheet)); // It was 64 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 4, destSheet); // E5 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(5, 4, destSheet); // F5 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 4, destSheet)); - } - fValue = m_pDoc->GetValue(6, 4, destSheet); - m_pDoc->GetFormula(6, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+70"), aString); - ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); - aString = m_pDoc->GetString(7, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 5, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 5, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D1:G1;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(3, 5, destSheet)); // It was 6 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 5, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(5, 5, destSheet); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - } - - fValue = m_pDoc->GetValue(6, 5, destSheet); - m_pDoc->GetFormula(6, 5, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=C$1+$A$3+80"), aString); - ASSERT_DOUBLES_EQUAL(2080, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 6, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(3, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(122, m_pDoc->GetValue(4, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(5, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(6, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); - // row 7, not selected - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - // std::cout << "bSkipEmpty: " << bSkipEmpty << ", pItem == nullptr: " << (pItem == nullptr) << std::endl; - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 6, destSheet))); - - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 5, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 5, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - ┌--- filtered src row 2 - v - - | D | E | F | - - 2 | 1 B*| 3 B*| 4 | - 3 | =D2+10 *| =E5+30 b*| =D2+40 b*| - <- not copied col C - 4 | R1 *| 5 *| R4 *| - 5 | =D1+F1+60 | B*| =C1+E1+70 *| - 6 | =SUMIF(D1:G1;"<4") | | =B$1+$A$1+80 *| - 7 | 121 | 123 | 124 | - - * means note attached - B means background - b means border - */ - - // check cell content after transposed copy/paste of filtered data - // Col C and G are checked to be empty - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // row 0 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - // row 1, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(4, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(5, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 1, destSheet)); - // row 2, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(3, 2, destSheet)); - m_pDoc->GetFormula(3, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=E5+30"), aString); - ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 - fValue = m_pDoc->GetValue(5, 2, destSheet); - m_pDoc->GetFormula(5, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), aString); - ASSERT_DOUBLES_EQUAL(41, fValue); // was originally 42, not adjusted by filtering - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 2, destSheet)); - aString = m_pDoc->GetString(6, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 3, strings was not selected in multi range selection - // row 3, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(2, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(3, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(4, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(5, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 3, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // row 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - aString = m_pDoc->GetString(2, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+60"), - aString); // formulas over filtered rows are not adjusted - ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(3, 4, destSheet)); // It was 64 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 4, destSheet)); - fValue = m_pDoc->GetValue(5, 4, destSheet); - m_pDoc->GetFormula(5, 4, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=C1+E1+70"), - aString); // formulas over filtered rows are not adjusted - ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 4, destSheet)); - aString = m_pDoc->GetString(6, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 5, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 5, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D1:G1;\"<4\")"), - aString); // formulas over filtered rows are not adjusted - ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(3, 5, destSheet)); // It was 6 - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 5, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - fValue = m_pDoc->GetValue(5, 5, destSheet); - m_pDoc->GetFormula(5, 5, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=B$1+$A$3+80"), aString); - ASSERT_DOUBLES_EQUAL(2080, fValue); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); - aString = m_pDoc->GetString(6, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 6, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(3, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(4, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(5, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 6, destSheet)); - // row 7, not copied - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - // row 8, not copied - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(4, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 6, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 6, destSheet))); - - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | H | I | - - 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | - 3 | 2 B*| =D3+20 b | b *| R2 *| | *| <- filtered row - 4 | 3 B*| =G4+30 b*| c *| 5 *| B*| | - <- not selected row - 5 | 6 | q | r bB*| s bB| t | u | - 6 | -11 | -12 | -13 | -14 | -15 | -16 | - - * means note attached - B means background - b means border - */ - - OUString aString; - const EditTextObject* pEditObj; - // col 2 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - // col 3, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(3, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(3, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(3, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 6, destSheet)); - // col 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - aString = m_pDoc->GetString(4, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), aString); - ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); - m_pDoc->GetFormula(4, 3, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), aString); - ASSERT_DOUBLES_EQUAL(35, m_pDoc->GetValue(4, 3, destSheet)); - aString = m_pDoc->GetString(4, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("q"), aString); - ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(4, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); - aString = m_pDoc->GetString(4, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 5, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - aString = m_pDoc->GetString(5, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(5, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); - aString = m_pDoc->GetString(5, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("b"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); - aString = m_pDoc->GetString(5, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("r"), aString); - ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(5, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 6, destSheet)); - aString = m_pDoc->GetString(5, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 6, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 2, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 3, destSheet)); - aString = m_pDoc->GetString(6, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("s"), aString); - ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(6, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 6, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 6, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // col 7, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - aString = m_pDoc->GetString(7, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(7, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); - ASSERT_DOUBLES_EQUAL(64, m_pDoc->GetValue(7, 1, destSheet)); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - } - aString = m_pDoc->GetString(7, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("t"), aString); - ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(7, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); - aString = m_pDoc->GetString(7, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 8, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); - aString = m_pDoc->GetString(7, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(8, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(8, 1, destSheet)); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(8, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(8, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 3, destSheet)); - } - aString = m_pDoc->GetString(8, 4, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("u"), aString); - ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(8, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 6, destSheet)); - aString = m_pDoc->GetString(8, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 9 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - m_pDoc->GetPattern(ScAddress(4, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(6, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(7, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - pItem = m_pDoc->GetAttr(ScAddress(3, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(7, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(8, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 5, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(8, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | H | I | - - 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | - 3 | 3 B*| =G3+30 b*| c *| 5 *| B*| | - <- not selected - 4 | 6 | q | r | s | t | u | - 5 | -11 | -12 |-13 | -14 | -15 | -16 | - - * means note attached - B means background - b means border - */ - - OUString aString; - const EditTextObject* pEditObj; - // col 2 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - // col 3, numbers - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(3, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(3, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); - // col 4, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - aString = m_pDoc->GetString(4, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); - m_pDoc->GetFormula(4, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), aString); - ASSERT_DOUBLES_EQUAL(35, m_pDoc->GetValue(4, 2, destSheet)); - aString = m_pDoc->GetString(4, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("q"), aString); - ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(4, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - aString = m_pDoc->GetString(4, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 5, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - aString = m_pDoc->GetString(5, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(5, 1, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); - aString = m_pDoc->GetString(5, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("r"), aString); - ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(5, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - aString = m_pDoc->GetString(5, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 6, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); - CPPUNIT_ASSERT(pEditObj); - CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); - ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 2, destSheet)); - aString = m_pDoc->GetString(6, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("s"), aString); - ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(6, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet)); - CPPUNIT_ASSERT(pEditObj == nullptr); - // col 7, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - aString = m_pDoc->GetString(7, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(7, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); - ASSERT_DOUBLES_EQUAL(67, m_pDoc->GetValue(7, 1, destSheet)); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("t"), aString); - ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(7, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 8, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); - aString = m_pDoc->GetString(8, 0, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(8, 1, destSheet, aString); - CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); - ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(8, 1, destSheet)); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(8, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); - aString = m_pDoc->GetString(8, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("u"), aString); - ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(8, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); - aString = m_pDoc->GetString(8, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // col 9 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(7, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - m_pDoc->GetPattern(ScAddress(4, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(5, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(6, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - pItem = m_pDoc->GetAttr(ScAddress(3, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(7, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); - CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(7, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | H | - - 2 | 1 B*| 2 B*| 3 B*| 6 | -11 | - 3 | =D2+10 *| =E2+20 b | =F5+30 b*| q | -12 | - 4 | a | b *| c *| r | -13 | - 5 | R1 *| R2 *| 5 *| s | -14 | - 6 | =D2+F2+60 | | B*| t | -15 | - 7 | =SUMIF(D2:G2;"<4") | *| | u | -16 | - - * means note attached - B means background - b means border - */ - - //check cell content after transposed copy/paste of filtered data - // Note: column F is a repetition of srcSheet.Column A - // Col C and G are checked to be empty - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // row 0 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - // row 1, numbers - fValue = m_pDoc->GetValue(2, 1, destSheet); // C2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell C2", 1000, fValue); - fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); - fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 2, fValue); - fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 3, fValue); - fValue = m_pDoc->GetValue(6, 1, destSheet); // G2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell G2", 6, fValue); - ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(7, 1, destSheet)); - fValue = m_pDoc->GetValue(8, 1, destSheet); // I2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell I2", 1000, fValue); - // row 2, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - aString = m_pDoc->GetString(2, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); - m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), - aString); - m_pDoc->GetFormula(4, 2, destSheet, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on E2", OUString("=E2+20"), - aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 22, fValue); - fValue = m_pDoc->GetValue(5, 2, destSheet); // F3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 35, fValue); - m_pDoc->GetFormula(5, 2, destSheet, aString); // F3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F3 should point on F2", OUString("=F5+30"), - aString); - aString = m_pDoc->GetString(6, 2, destSheet); // G3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: q", OUString("q"), aString); - ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(7, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); - aString = m_pDoc->GetString(8, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 3, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - aString = m_pDoc->GetString(2, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(3, 3, destSheet); // D4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); - aString = m_pDoc->GetString(4, 3, destSheet); // E4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: b", OUString("b"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); // F4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: c", OUString("c"), aString); - aString = m_pDoc->GetString(6, 3, destSheet); // G4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: r", OUString("r"), aString); - ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(7, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 3, destSheet)); - aString = m_pDoc->GetString(8, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 4, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), - pEditObj->GetText(0)); - pEditObj = m_pDoc->GetEditText(ScAddress(4, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in E5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong E5.", OUString("R2"), pEditObj->GetText(0)); - fValue = m_pDoc->GetValue(5, 4, destSheet); // F5 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F5", 5, fValue); - aString = m_pDoc->GetString(6, 4, destSheet); // G5 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G5 should contain: s", OUString("s"), aString); - ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(7, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(8, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in I5.", pEditObj == nullptr); - // row 5, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); - fValue = m_pDoc->GetValue(3, 5, destSheet); // D6 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 64, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 5, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(5, 5, destSheet); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); - } - aString = m_pDoc->GetString(6, 5, destSheet); // G6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G6 should contain: t", OUString("t"), aString); - ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(7, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); - aString = m_pDoc->GetString(8, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 6, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); - aString = m_pDoc->GetString(2, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), - aString); - fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", 6, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 6, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - aString = m_pDoc->GetString(5, 6, destSheet); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - { - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 6, destSheet)); - } - aString = m_pDoc->GetString(6, 6, destSheet); // G4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G7 should contain: u", OUString("u"), aString); - ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(7, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 6, destSheet)); - aString = m_pDoc->GetString(8, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 7 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has blue background", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("F2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("F2 has a pattern", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("D3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("D3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("D3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("E3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("E3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("F3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("F3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("G3 has top border", !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("G3 has bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("G3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("G3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("H3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("H3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("H3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", - !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", - !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", - !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", - !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", - !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H1", - !m_pDoc->HasNote(ScAddress(7, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", - !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", - m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", - m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F2", - m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G2", - !m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H2", - !m_pDoc->HasNote(ScAddress(7, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", - !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", - m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E3", - !m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", - m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G3", - !m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H3", - !m_pDoc->HasNote(ScAddress(7, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", - !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", - !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", - m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", - m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G4", - m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H4", - !m_pDoc->HasNote(ScAddress(7, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", - !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", - m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", - m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", - m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G5", - !m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H5", - !m_pDoc->HasNote(ScAddress(7, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", - !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", - !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E6", - !m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on G6", - !m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H6", - !m_pDoc->HasNote(ScAddress(7, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", - !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", - !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F7", - !m_pDoc->HasNote(ScAddress(5, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note a G7", - !m_pDoc->HasNote(ScAddress(6, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H7", - !m_pDoc->HasNote(ScAddress(7, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", - !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", - !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", - !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", - !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", - !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on H8", - !m_pDoc->HasNote(ScAddress(7, 7, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", - m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", - m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F2", - m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); - // G2 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", - m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - // E3 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F3", - m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); - // D4 has no note - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", - m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F4", - m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", - m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", - m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F5", - m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E7", - m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 6, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty) -{ - const SCTAB srcSheet = 0; - const SCTAB destSheet = 1; - - ScFormulaOptions aOldOptions, aNewOptions; - aOldOptions = SC_MOD()->GetFormulaOptions(); - aNewOptions.SetFormulaSepArg(";"); - m_xDocShell->SetFormulaOptions(aNewOptions); - - /* - | D | E | F | G | - - 2 | 1 B*| 3 B*| 6 | -11 | - 3 | =D2+10 *| =F5+30 b*| q | -12 | - 4 | a | c *| r | -13 | - 5 | R1 *| 5 *| s | -14 | - 6 | =D2+F2+60 | B*| t | -15 | - 7 | =SUMIF(D2:G2;"<4") | | u | -16 | - - * means note attached - B means background - b means border - */ - - //check cell content after transposed copy/paste of filtered data - // Note: column F is a repetition of srcSheet.Column A - // Col C and G are checked to be empty - OUString aString; - double fValue; - const EditTextObject* pEditObj; - // row 0 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); - // row 1, numbers - fValue = m_pDoc->GetValue(2, 1, destSheet); // C2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell C2", 1000, fValue); - fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); - fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 3, fValue); - fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 6, fValue); - ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(6, 1, destSheet)); - fValue = m_pDoc->GetValue(7, 1, destSheet); // H2 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell H2", 1000, fValue); - // row 2, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); - aString = m_pDoc->GetString(2, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); - m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), - aString); - fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 35, fValue); - m_pDoc->GetFormula(4, 2, destSheet, aString); // E3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on F2", OUString("=E5+30"), - aString); - aString = m_pDoc->GetString(5, 2, destSheet); // F3 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: q", OUString("q"), aString); - ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(6, 2, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); - aString = m_pDoc->GetString(7, 2, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 3, strings - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); - aString = m_pDoc->GetString(2, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - aString = m_pDoc->GetString(3, 3, destSheet); // D4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); - aString = m_pDoc->GetString(4, 3, destSheet); // E4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: c", OUString("c"), aString); - aString = m_pDoc->GetString(5, 3, destSheet); // F4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: r", OUString("r"), aString); - ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(6, 3, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); - aString = m_pDoc->GetString(7, 3, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 4, rich text - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); - pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), - pEditObj->GetText(0)); - fValue = m_pDoc->GetValue(4, 4, destSheet); // E5 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E5", 5, fValue); - aString = m_pDoc->GetString(5, 4, destSheet); // F5 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F5 should contain: s", OUString("s"), aString); - ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(6, 4, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); - pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet)); - CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr); - // row 5, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); - aString = m_pDoc->GetString(2, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); - fValue = m_pDoc->GetValue(3, 5, destSheet); // D6 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 67, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 5, destSheet); // E6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); - aString = m_pDoc->GetString(5, 5, destSheet); // F6 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F6 should contain: t", OUString("t"), aString); - ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(6, 5, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); - aString = m_pDoc->GetString(7, 5, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 6, formulas - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); - aString = m_pDoc->GetString(2, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), - aString); - fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 - ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", -7, fValue); - if (!bSkipEmpty) - { - aString = m_pDoc->GetString(4, 6, destSheet); // E7 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); - } - else - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); - aString = m_pDoc->GetString(5, 6, destSheet); // F4 - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F7 should contain: u", OUString("u"), aString); - ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(6, 6, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); - aString = m_pDoc->GetString(7, 6, destSheet); - CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); - // row 7 - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); - ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); - - // check patterns - const SfxPoolItem* pItem = nullptr; - m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); - CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has a pattern", COL_BLUE, - static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("F2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem); - m_pDoc->GetPattern(ScAddress(4, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - - m_pDoc->GetPattern(ScAddress(5, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(5, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); - m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - m_pDoc->GetPattern(ScAddress(5, 6, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); - CPPUNIT_ASSERT(!pItem); - - // check border, left and right borders were transformed to top and bottom borders - pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("D3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("D3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("D3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", - static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("E3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("E3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("F3 has top border", !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("F3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("F3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT_MESSAGE("G3 has a border", pItem); - CPPUNIT_ASSERT_MESSAGE("G3 has no top border", - !static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT_MESSAGE("G3 has no bottom border", - !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT_MESSAGE("G3 has no left border", - !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT_MESSAGE("G3 has no right border", - !static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 3, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - pItem = m_pDoc->GetAttr(ScAddress(5, 4, destSheet), ATTR_BORDER); - CPPUNIT_ASSERT(pItem); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); - CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); - CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); - - // check notes after transposed copy/paste - // check presence of notes - CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", - !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", - !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", - !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", - !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", - !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", - !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", - m_pDoc->HasNote(ScAddress(3, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", - m_pDoc->HasNote(ScAddress(4, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F2", - !m_pDoc->HasNote(ScAddress(5, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G2", - !m_pDoc->HasNote(ScAddress(6, 1, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", - !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", - m_pDoc->HasNote(ScAddress(3, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E3", - m_pDoc->HasNote(ScAddress(4, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", - !m_pDoc->HasNote(ScAddress(5, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G3", - !m_pDoc->HasNote(ScAddress(6, 2, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", - !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", - !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", - m_pDoc->HasNote(ScAddress(4, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", - m_pDoc->HasNote(ScAddress(5, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G4", - !m_pDoc->HasNote(ScAddress(6, 3, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", - !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", - m_pDoc->HasNote(ScAddress(3, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", - m_pDoc->HasNote(ScAddress(4, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", - !m_pDoc->HasNote(ScAddress(5, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G5", - !m_pDoc->HasNote(ScAddress(6, 4, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", - !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", - !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); - CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be a note on F6", - !m_pDoc->HasNote(ScAddress(5, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G6", - !m_pDoc->HasNote(ScAddress(6, 5, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", - !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", - !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E7", - !m_pDoc->HasNote(ScAddress(4, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note a F7", - !m_pDoc->HasNote(ScAddress(5, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G7", - !m_pDoc->HasNote(ScAddress(6, 6, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", - !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", - !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", - !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", - !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); - CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", - !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); - - // check values of notes - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", - m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", - m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", - m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E3", - m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", - m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", - m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", - m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); - if (!bSkipEmpty) - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(4, 5, destSheet))->GetText()); - CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), - m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); - - // restore formula options back to default - m_xDocShell->SetFormulaOptions(aOldOptions); - - m_pDoc->DeleteTab(destSheet); - m_pDoc->DeleteTab(srcSheet); -} - -void Test::testCopyPasteMultiRange() -{ - m_pDoc->InsertTab(0, "Test"); - - // Fill A2:B6 with numbers. - for (SCROW nRow = 1; nRow <= 5; ++nRow) - { - for (SCCOL nCol = 0; nCol <= 1; ++nCol) - { - ScAddress aPos(nCol,nRow,0); - m_pDoc->SetValue(aPos, nRow+nCol); - } - } - - // Fill D9:E11 with numbers. - for (SCROW nRow = 8; nRow <= 10; ++nRow) - { - for (SCCOL nCol = 3; nCol <= 4; ++nCol) - { - ScAddress aPos(nCol,nRow,0); - m_pDoc->SetValue(aPos, 10.0); - } - } - - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SelectOneTable(0); - - // Copy A2:B2, A4:B4, and A6:B6 to clipboard. - ScDocument aClipDoc(SCDOCMODE_CLIP); - ScClipParam aClipParam; - aClipParam.maRanges.push_back(ScRange(0,1,0,1,1,0)); // A2:B2 - aClipParam.maRanges.push_back(ScRange(0,3,0,1,3,0)); // A4:B4 - aClipParam.maRanges.push_back(ScRange(0,5,0,1,5,0)); // A6:B6 - aClipParam.meDirection = ScClipParam::Row; - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); - - // Paste to D9:E11, and make sure it won't crash (rhbz#1080196). - m_pDoc->CopyMultiRangeFromClip(ScAddress(3,8,0), aMark, InsertDeleteFlags::CONTENTS, &aClipDoc); - CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(3,8,0))); - CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(4,8,0))); - CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(ScAddress(3,9,0))); - CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(ScAddress(4,9,0))); - CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(3,10,0))); - CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(4,10,0))); - - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteSkipEmpty() -{ - struct Check - { - const char* mpStr; - Color maColor; - bool mbHasNote; - }; - - struct TestRange - { - ScDocument* mpDoc; - - explicit TestRange( ScDocument* pDoc ) : mpDoc(pDoc) {} - - bool checkRange( const ScAddress& rPos, const Check* p, const Check* pEnd ) - { - ScAddress aPos(rPos); - OUString aPosStr = aPos.Format(ScRefFlags::VALID); - for (; p != pEnd; ++p, aPos.IncRow()) - { - if (!mpDoc->GetString(aPos).equalsAscii(p->mpStr)) - { - cerr << aPosStr << ": incorrect string value: expected='" << p->mpStr << "' actual='" << mpDoc->GetString(aPos) << endl; - return false; - } - - const SvxBrushItem* pBrush = mpDoc->GetAttr(aPos, ATTR_BACKGROUND); - if (!pBrush) - { - cerr << aPosStr << ": failed to get brush item from the cell." << endl; - return false; - } - - if (pBrush->GetColor() != p->maColor) - { - Color aExpected = p->maColor; - Color aActual = pBrush->GetColor(); - cerr << aPosStr << ": incorrect cell background color: expected=(" - << static_cast<int>(aExpected.GetRed()) << "," - << static_cast<int>(aExpected.GetGreen()) << "," - << static_cast<int>(aExpected.GetBlue()) << "), actual=(" - << static_cast<int>(aActual.GetRed()) << "," - << static_cast<int>(aActual.GetGreen()) << "," - << static_cast<int>(aActual.GetBlue()) << ")" << endl; - - return false; - } - - bool bHasNote = mpDoc->HasNote(aPos); - if (bHasNote != p->mbHasNote) - { - cerr << aPosStr << ": "; - if (p->mbHasNote) - cerr << "this cell should have a cell note, but doesn't." << endl; - else - cerr << "this cell should NOT have a cell note, but one is found." << endl; - - return false; - } - } - - return true; - } - - } aTest(m_pDoc); - - m_pDoc->InsertTab(0, "Test"); - m_pDoc->InitDrawLayer(m_xDocShell.get()); // for cell note objects. - - ScRange aSrcRange(0,0,0,0,4,0); - ScRange aDestRange(1,0,0,1,4,0); - - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - - // Put some texts in B1:B5. - m_pDoc->SetString(ScAddress(1,0,0), "A"); - m_pDoc->SetString(ScAddress(1,1,0), "B"); - m_pDoc->SetString(ScAddress(1,2,0), "C"); - m_pDoc->SetString(ScAddress(1,3,0), "D"); - m_pDoc->SetString(ScAddress(1,4,0), "E"); - - // Set the background color of B1:B5 to blue. - ScPatternAttr aCellBackColor(m_pDoc->GetPool()); - aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND)); - m_pDoc->ApplyPatternAreaTab(1, 0, 1, 4, 0, aCellBackColor); - - // Insert notes to B1:B5. - m_pDoc->GetOrCreateNote(ScAddress(1,0,0)); - m_pDoc->GetOrCreateNote(ScAddress(1,1,0)); - m_pDoc->GetOrCreateNote(ScAddress(1,2,0)); - m_pDoc->GetOrCreateNote(ScAddress(1,3,0)); - m_pDoc->GetOrCreateNote(ScAddress(1,4,0)); - - // Prepare a clipboard content interleaved with empty cells. - ScDocument aClipDoc(SCDOCMODE_CLIP); - aClipDoc.ResetClip(m_pDoc, &aMark); - ScClipParam aParam(aSrcRange, false); - aClipDoc.SetClipParam(aParam); - aClipDoc.SetString(ScAddress(0,0,0), "Clip1"); - aClipDoc.SetString(ScAddress(0,2,0), "Clip2"); - aClipDoc.SetString(ScAddress(0,4,0), "Clip3"); - - // Set the background color of A1:A5 to yellow. - aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_YELLOW, ATTR_BACKGROUND)); - aClipDoc.ApplyPatternAreaTab(0, 0, 0, 4, 0, aCellBackColor); - - CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0,0,0))); - CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, aClipDoc.GetCellType(ScAddress(0,1,0))); - CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0,2,0))); - CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, aClipDoc.GetCellType(ScAddress(0,3,0))); - CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0,4,0))); - - // Check the initial condition. - { - static const Check aChecks[] = { - { "A", COL_BLUE, true }, - { "B", COL_BLUE, true }, - { "C", COL_BLUE, true }, - { "D", COL_BLUE, true }, - { "E", COL_BLUE, true }, - }; - - bool bRes = aTest.checkRange(ScAddress(1,0,0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); - CPPUNIT_ASSERT_MESSAGE("Initial check failed.", bRes); - } - - // Create undo document. - ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); - pUndoDoc->InitUndo(*m_pDoc, 0, 0); - m_pDoc->CopyToDocument(aDestRange, InsertDeleteFlags::ALL, false, *pUndoDoc, &aMark); - - // Paste clipboard content onto A1:A5 but skip empty cells. - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, pUndoDoc.get(), &aClipDoc, true, false, false, true/*bSkipEmpty*/); - - // Create redo document. - ScDocumentUniquePtr pRedoDoc(new ScDocument(SCDOCMODE_UNDO)); - pRedoDoc->InitUndo(*m_pDoc, 0, 0); - m_pDoc->CopyToDocument(aDestRange, InsertDeleteFlags::ALL, false, *pRedoDoc, &aMark); - - // Create an undo object for this. - std::unique_ptr<ScRefUndoData> pRefUndoData(new ScRefUndoData(m_pDoc)); - ScUndoPaste aUndo(m_xDocShell.get(), aDestRange, aMark, std::move(pUndoDoc), std::move(pRedoDoc), InsertDeleteFlags::ALL, std::move(pRefUndoData)); - - // Check the content after the paste. - { - static const Check aChecks[] = { - { "Clip1", COL_YELLOW, false }, - { "B", COL_BLUE, true }, - { "Clip2", COL_YELLOW, false }, - { "D", COL_BLUE, true }, - { "Clip3", COL_YELLOW, false }, - }; - - bool bRes = aTest.checkRange(ScAddress(1,0,0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); - CPPUNIT_ASSERT_MESSAGE("Check after paste failed.", bRes); - } - - // Undo, and check the content. - aUndo.Undo(); - { - static const Check aChecks[] = { - { "A", COL_BLUE, true }, - { "B", COL_BLUE, true }, - { "C", COL_BLUE, true }, - { "D", COL_BLUE, true }, - { "E", COL_BLUE, true }, - }; - - bool bRes = aTest.checkRange(ScAddress(1,0,0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); - CPPUNIT_ASSERT_MESSAGE("Check after undo failed.", bRes); - } - - // Redo, and check the content again. - aUndo.Redo(); - { - static const Check aChecks[] = { - { "Clip1", COL_YELLOW, false }, - { "B", COL_BLUE, true }, - { "Clip2", COL_YELLOW, false }, - { "D", COL_BLUE, true }, - { "Clip3", COL_YELLOW, false }, - }; - - bool bRes = aTest.checkRange(ScAddress(1,0,0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); - CPPUNIT_ASSERT_MESSAGE("Check after redo failed.", bRes); - } - - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteSkipEmpty2() -{ - m_pDoc->InsertTab(0, "Test"); - - m_pDoc->SetString(ScAddress(0,0,0), "A"); - m_pDoc->SetString(ScAddress(2,0,0), "C"); - - // Copy A1:C1 to clipboard. - ScDocument aClipDoc(SCDOCMODE_CLIP); - aClipDoc.ResetClip(m_pDoc, static_cast<SCTAB>(0)); - copyToClip(m_pDoc, ScRange(0,0,0,2,0,0), &aClipDoc); - - // Paste to A3 with the skip empty option set. This used to freeze. (fdo#77735) - ScRange aDestRange(0,2,0,2,2,0); - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false, false, true, true); - - CPPUNIT_ASSERT_EQUAL(OUString("A"), m_pDoc->GetString(ScAddress(0,2,0))); - CPPUNIT_ASSERT_EQUAL_MESSAGE("B3 should be empty.", CELLTYPE_NONE, m_pDoc->GetCellType(ScAddress(1,2,0))); - CPPUNIT_ASSERT_EQUAL(OUString("C"), m_pDoc->GetString(ScAddress(2,2,0))); - - m_pDoc->DeleteTab(0); -} - -void Test::testCutPasteRefUndo() -{ - // Testing scenario: A2 references B2, and B2 gets cut and pasted onto C2, - // which updates A2's formula to reference C2. Then the paste action gets - // undone, which should also undo A2's formula to reference back to B2. - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. - - m_pDoc->InsertTab(0, "Test"); - - // A2 references B2. - m_pDoc->SetString(ScAddress(0,1,0), "=B2"); - - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SelectOneTable(0); - - // Set up clip document for cutting of B2. - ScDocument aClipDoc(SCDOCMODE_CLIP); - aClipDoc.ResetClip(m_pDoc, &aMark); - ScClipParam aParam(ScAddress(1,1,0), true); - aClipDoc.SetClipParam(aParam); - aClipDoc.SetValue(ScAddress(1,1,0), 12.0); - - // Set up undo document for reference update. - ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); - pUndoDoc->InitUndo(*m_pDoc, 0, 0); - - // Do the pasting of 12 into C2. This should update A2 to reference C2. - m_pDoc->CopyFromClip(ScAddress(2,1,0), aMark, InsertDeleteFlags::CONTENTS, pUndoDoc.get(), &aClipDoc); - CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(0,1,0)); - - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,1,0), "C2", "A2 should be referencing C2."); - - // At this point, the ref undo document should contain a formula cell at A2 that references B2. - ASSERT_FORMULA_EQUAL(*pUndoDoc, ScAddress(0,1,0), "B2", "A2 in the undo document should be referencing B2."); - - ScUndoPaste aUndo(m_xDocShell.get(), ScRange(2,1,0), aMark, std::move(pUndoDoc), nullptr, InsertDeleteFlags::CONTENTS, nullptr, false, nullptr); - aUndo.Undo(); - - // Now A2 should be referencing B2 once again. - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,1,0), "B2", "A2 should be referencing B2 after undo."); - - m_pDoc->DeleteTab(0); -} - -void Test::testCutPasteGroupRefUndo() -{ - // Test that Cut&Paste part of a grouped formula adjusts references - // correctly and Undo works. - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. - - m_pDoc->InsertTab(0, "Test"); - - // Formula data in A1:A9 - std::vector<std::vector<const char*>> aData = { - { "1" }, - { "=A1+A1" }, - { "=A2+A1" }, - { "=A3+A2" }, - { "=A4+A3" }, - { "=A5+A4" }, - { "=A6+A5" }, - { "=A7+A6" }, - { "=A8+A7" } - }; - ScAddress aPos(0,0,0); - ScRange aDataRange = insertRangeData( m_pDoc, aPos, aData); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to insert data", aPos, aDataRange.aStart); - - // Check initial data. - const char* aDataCheck[][2] = { - { "1", "" }, - { "2", "=A1+A1" }, - { "3", "=A2+A1" }, - { "5", "=A3+A2" }, - { "8", "=A4+A3" }, - { "13", "=A5+A4" }, - { "21", "=A6+A5" }, - { "34", "=A7+A6" }, - { "55", "=A8+A7" } - }; - for (size_t i=0; i<SAL_N_ELEMENTS(aDataCheck); ++i) - { - OUString aString = m_pDoc->GetString(0,i,0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial data failure", OUString::createFromAscii(aDataCheck[i][0]), aString); - m_pDoc->GetFormula(0,i,0, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial formula failure", OUString::createFromAscii(aDataCheck[i][1]), aString); - } - - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SelectOneTable(0); - - // Set up clip document. - ScDocument aClipDoc(SCDOCMODE_CLIP); - aClipDoc.ResetClip(m_pDoc, &aMark); - // Cut A4:A6 to clipboard with Undo. - std::unique_ptr<ScUndoCut> pUndoCut( cutToClip( *m_xDocShell, ScRange(0,3,0, 0,5,0), &aClipDoc, true)); - - // Check data after Cut. - const char* aCutCheck[] = {"1","2","3","","","","0","0","0"}; - for (size_t i=0; i<SAL_N_ELEMENTS(aCutCheck); ++i) - { - OUString aString = m_pDoc->GetString(0,i,0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cut data failure", OUString::createFromAscii(aCutCheck[i]), aString); - } - - // Paste to B5:B7 with Undo. - ScRange aPasteRange(1,4,0, 1,6,0); - aMark.SetMarkArea(aPasteRange); - ScDocument* pPasteUndoDoc = new ScDocument(SCDOCMODE_UNDO); - pPasteUndoDoc->InitUndoSelected( *m_pDoc, aMark); - std::unique_ptr<ScUndoPaste> pUndoPaste( createUndoPaste( *m_xDocShell, aPasteRange, ScDocumentUniquePtr(pPasteUndoDoc))); - m_pDoc->CopyFromClip( aPasteRange, aMark, InsertDeleteFlags::ALL, pPasteUndoDoc, &aClipDoc); - - // Check data after Paste. - const char* aPasteCheck[][4] = { - { "1", "", "", "" }, - { "2", "", "=A1+A1", "" }, - { "3", "", "=A2+A1", "" }, - { "", "", "", "" }, - { "", "5", "", "=A3+A2" }, - { "", "8", "", "=B5+A3" }, - { "21", "13", "=B7+B6", "=B6+B5" }, - { "34", "", "=A7+B7", "" }, - { "55", "", "=A8+A7", "" } - }; - for (size_t i=0; i<SAL_N_ELEMENTS(aPasteCheck); ++i) - { - for (size_t j=0; j<2; ++j) - { - OUString aString = m_pDoc->GetString(j,i,0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Paste data failure", OUString::createFromAscii(aPasteCheck[i][j]), aString); - m_pDoc->GetFormula(j,i,0, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Paste formula failure", OUString::createFromAscii(aPasteCheck[i][2+j]), aString); - } - } - - // Undo Paste and check, must be same as after Cut. - pUndoPaste->Undo(); - for (size_t i=0; i<SAL_N_ELEMENTS(aCutCheck); ++i) - { - OUString aString = m_pDoc->GetString(0,i,0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Paste data failure", OUString::createFromAscii(aCutCheck[i]), aString); - } - - // Undo Cut and check, must be initial data. - pUndoCut->Undo(); - for (size_t i=0; i<SAL_N_ELEMENTS(aDataCheck); ++i) - { - OUString aString = m_pDoc->GetString(0,i,0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Cut data failure", OUString::createFromAscii(aDataCheck[i][0]), aString); - m_pDoc->GetFormula(0,i,0, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Cut formula failure", OUString::createFromAscii(aDataCheck[i][1]), aString); - } - - m_pDoc->DeleteTab(0); -} - -void Test::testMoveRefBetweenSheets() -{ - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. - - m_pDoc->InsertTab(0, "Test1"); - m_pDoc->InsertTab(1, "Test2"); - - m_pDoc->SetValue(ScAddress(0,0,0), 12.0); - m_pDoc->SetValue(ScAddress(1,0,0), 10.0); - m_pDoc->SetValue(ScAddress(2,0,0), 8.0); - m_pDoc->SetString(ScAddress(0,1,0), "=A1"); - m_pDoc->SetString(ScAddress(0,2,0), "=SUM(A1:C1)"); - - CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0,0,0))); - CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0,1,0))); - CPPUNIT_ASSERT_EQUAL(30.0, m_pDoc->GetValue(ScAddress(0,2,0))); - - // These formulas should not display the sheet name. - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,1,0), "A1", "Wrong formula!"); - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,2,0), "SUM(A1:C1)", "Wrong formula!"); - - // Move Test1.A2:A3 to Test2.A2:A3. - ScDocFunc& rFunc = m_xDocShell->GetDocFunc(); - bool bMoved = rFunc.MoveBlock(ScRange(0,1,0,0,2,0), ScAddress(0,1,1), true, true, false, true); - CPPUNIT_ASSERT(bMoved); - - CPPUNIT_ASSERT_EQUAL_MESSAGE("This cell should be empty after the move.", CELLTYPE_NONE, m_pDoc->GetCellType(ScAddress(0,1,0))); - ASSERT_DOUBLES_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0,1,1))); - ASSERT_DOUBLES_EQUAL(30.0, m_pDoc->GetValue(ScAddress(0,2,1))); - - // The reference in the pasted formula should display sheet name after the move. - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,1,1), "Test1.A1", "Wrong formula!"); - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,2,1), "SUM(Test1.A1:C1)", "Wrong formula!"); - - m_pDoc->DeleteTab(1); - m_pDoc->DeleteTab(0); -} - -void Test::testUndoCut() -{ - m_pDoc->InsertTab(0, "Test"); - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. - - // Insert values into A1:A3. - m_pDoc->SetValue(ScAddress(0,0,0), 1.0); - m_pDoc->SetValue(ScAddress(0,1,0), 10.0); - m_pDoc->SetValue(ScAddress(0,2,0), 100.0); - - // SUM in A4. - m_pDoc->SetString(ScAddress(0,3,0), "=SUM(A1:A3)"); - CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0,3,0)); - - // Select A1:A3. - ScMarkData aMark(m_pDoc->GetSheetLimits()); - ScRange aRange(0,0,0,0,2,0); - aMark.SetMarkArea(aRange); - aMark.MarkToMulti(); - - // Set up an undo object for cutting A1:A3. - ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); - pUndoDoc->InitUndo(*m_pDoc, 0 ,0); - m_pDoc->CopyToDocument(aRange, InsertDeleteFlags::ALL, false, *pUndoDoc); - ASSERT_DOUBLES_EQUAL( 1.0, pUndoDoc->GetValue(ScAddress(0,0,0))); - ASSERT_DOUBLES_EQUAL( 10.0, pUndoDoc->GetValue(ScAddress(0,1,0))); - ASSERT_DOUBLES_EQUAL(100.0, pUndoDoc->GetValue(ScAddress(0,2,0))); - ScUndoCut aUndo(m_xDocShell.get(), aRange, aRange.aEnd, aMark, std::move(pUndoDoc)); - - // "Cut" the selection. - m_pDoc->DeleteSelection(InsertDeleteFlags::ALL, aMark); - CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(0,3,0)); // The SUM should be zero after the "cut". - - // Undo it, and check the result. - aUndo.Undo(); - ASSERT_DOUBLES_EQUAL( 1.0, m_pDoc->GetValue(ScAddress(0,0,0))); - ASSERT_DOUBLES_EQUAL( 10.0, m_pDoc->GetValue(ScAddress(0,1,0))); - ASSERT_DOUBLES_EQUAL(100.0, m_pDoc->GetValue(ScAddress(0,2,0))); - ASSERT_DOUBLES_EQUAL(111.0, m_pDoc->GetValue(0,3,0)); // The SUM value should be back to the original. - - // Redo it and check. - aUndo.Redo(); - ASSERT_DOUBLES_EQUAL(0.0, m_pDoc->GetValue(0,3,0)); - - // Undo again. - aUndo.Undo(); - ASSERT_DOUBLES_EQUAL(111.0, m_pDoc->GetValue(0,3,0)); - - m_pDoc->DeleteTab(0); -} - -void Test::testMoveBlock() -{ - m_pDoc->InsertTab(0, "SheetNotes"); - - // We need a drawing layer in order to create caption objects. - m_pDoc->InitDrawLayer(m_xDocShell.get()); - - m_pDoc->SetValue(0, 0, 0, 1); - m_pDoc->SetString(1, 0, 0, "=A1+1"); - m_pDoc->SetString(2, 0, 0, "test"); - - // add notes to A1:C1 - ScAddress aAddrA1 (0, 0, 0); - ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAddrA1); - pNoteA1->SetText(aAddrA1, "Hello world in A1"); - ScAddress aAddrB1 (1, 0, 0); - ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAddrB1); - pNoteB1->SetText(aAddrB1, "Hello world in B1"); - ScAddress aAddrC1 (2, 0, 0); - ScPostIt* pNoteC1 = m_pDoc->GetOrCreateNote(aAddrC1); - pNoteC1->SetText(aAddrC1, "Hello world in C1"); - ScAddress aAddrD1 (3, 0, 0); - - // previous tests on cell note content are ok. this one fails !!! :( - //CPPUNIT_ASSERT_MESSAGE("Note content in B1 before move block", m_pDoc->GetNote(aAddrB1)->GetText() == aHelloB1); - - // move notes to B1:D1 - ScDocFunc& rDocFunc = m_xDocShell->GetDocFunc(); - bool bMoveDone = rDocFunc.MoveBlock(ScRange(0, 0 ,0 ,2 ,0 ,0), ScAddress(1, 0, 0), true/*bCut*/, false, false, false); - - CPPUNIT_ASSERT_MESSAGE("Cells not moved", bMoveDone); - - //check cell content - OUString aString = m_pDoc->GetString(3, 0, 0); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D1 should contain: test", OUString("test"), aString); - m_pDoc->GetFormula(2, 0, 0, aString); - CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C1 should contain an updated formula", OUString("=B1+1"), aString); - double fValue = m_pDoc->GetValue(aAddrB1); - ASSERT_DOUBLES_EQUAL_MESSAGE("Cell B1 should contain 1", fValue, 1); - - // cell notes has been moved 1 cell right (event when overlapping) - CPPUNIT_ASSERT_MESSAGE("There should be NO note on A1", !m_pDoc->HasNote(aAddrA1)); - CPPUNIT_ASSERT_MESSAGE("There should be a note on B1", m_pDoc->HasNote(aAddrB1)); - CPPUNIT_ASSERT_MESSAGE("There should be a note on C1", m_pDoc->HasNote(aAddrC1)); - CPPUNIT_ASSERT_MESSAGE("There should be a note on D1", m_pDoc->HasNote(aAddrD1)); -/* still failing, wrong content ??? - OUString sNoteText; - sNoteText = m_pDoc->GetNote(aAddrB1)->GetText(); - CPPUNIT_ASSERT_MESSAGE("Note content in B1", sNoteText == aHelloA1); - sNoteText = m_pDoc->GetNote(aAddrC1)->GetText(); - CPPUNIT_ASSERT_MESSAGE("Note content in C1", sNoteText == aHelloB1); - sNoteText = m_pDoc->GetNote(aAddrD1)->GetText(); - CPPUNIT_ASSERT_MESSAGE("Note content in D1", sNoteText == aHelloC1); -*/ - - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteRelativeFormula() -{ - m_pDoc->InsertTab(0, "Formula"); - - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); - - // Insert values to A2 and A4. - m_pDoc->SetValue(ScAddress(0,1,0), 1); - m_pDoc->SetValue(ScAddress(0,3,0), 2); - - // Insert formula to B4. - m_pDoc->SetString(ScAddress(1,3,0), "=A4"); - CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(1,3,0))); - - // Select and copy B3:B4 to the clipboard. - ScRange aRange(1,2,0,1,3,0); - ScClipParam aClipParam(aRange, false); - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aRange); - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); - - // Paste it to B1:B2. - InsertDeleteFlags nFlags = InsertDeleteFlags::ALL; - ScRange aDestRange(1,0,0,1,1,0); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, nullptr, &aClipDoc); - - // B2 references A2, so the value should be 1. - CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(1,1,0))); - - // Clear content and start over. - clearSheet(m_pDoc, 0); - clearSheet(&aClipDoc, 0); - - // Insert a single formula cell in A1. - m_pDoc->SetString(ScAddress(0,0,0), "=ROW()"); - const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(0,0,0)); - CPPUNIT_ASSERT(pFC); - CPPUNIT_ASSERT(!pFC->IsShared()); // single formula cell is never shared. - - // Copy A1 to clipboard. - aClipParam = ScClipParam(ScAddress(0,0,0), false); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); - - pFC = aClipDoc.GetFormulaCell(ScAddress(0,0,0)); - CPPUNIT_ASSERT(pFC); - CPPUNIT_ASSERT(!pFC->IsShared()); - - // Paste to A3. - aDestRange = ScRange(0,2,0,0,2,0); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, nullptr, &aClipDoc); - - pFC = m_pDoc->GetFormulaCell(ScAddress(0,2,0)); - CPPUNIT_ASSERT(pFC); - CPPUNIT_ASSERT(!pFC->IsShared()); - - // Delete A3 and make sure it doesn't crash (see fdo#76132). - clearRange(m_pDoc, ScAddress(0,2,0)); - CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(ScAddress(0,2,0))); - - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteRepeatOneFormula() -{ - sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); - - m_pDoc->InsertTab(0, "Test"); - - ScDocument aClipDoc(SCDOCMODE_CLIP); - ScMarkData aMark(m_pDoc->GetSheetLimits()); - - // Insert values in A1:B10. - for (SCROW i = 0; i < 10; ++i) - { - m_pDoc->SetValue(ScAddress(0,i,0), i+1.0); // column A - m_pDoc->SetValue(ScAddress(1,i,0), (i+1.0)*10.0); // column B - } - - // Insert a formula in C1. - ScAddress aPos(2,0,0); // C1 - m_pDoc->SetString(aPos, "=SUM(A1:B1)"); - CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(aPos)); - - // This check makes only sense if group listeners are activated. -#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER - // At this point, there should be only one normal area listener listening - // on A1:B1. - ScRange aWholeSheet(0,0,0,MAXCOL,MAXROW,0); - ScBroadcastAreaSlotMachine* pBASM = m_pDoc->GetBASM(); - CPPUNIT_ASSERT(pBASM); - std::vector<sc::AreaListener> aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); - CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); - const sc::AreaListener* pListener = aListeners.data(); - CPPUNIT_ASSERT_EQUAL(ScRange(0,0,0,1,0,0), pListener->maArea); - CPPUNIT_ASSERT_MESSAGE("This listener shouldn't be a group listener.", !pListener->mbGroupListening); -#endif - - // Copy C1 to clipboard. - ScClipParam aClipParam(aPos, false); - aMark.SetMarkArea(aPos); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); - - // Paste it to C2:C10. - ScRange aDestRange(2,1,0,2,9,0); - aMark.SetMarkArea(aDestRange); - m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &aClipDoc); - - // Make sure C1:C10 are grouped. - const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(aPos); - CPPUNIT_ASSERT(pFC); - CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(10), pFC->GetSharedLength()); - - // Check the formula results. - for (SCROW i = 0; i < 10; ++i) - { - double fExpected = (i+1.0)*11.0; - CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2,i,0))); - } - - // This check makes only sense if group listeners are activated. -#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER - // At this point, there should only be one area listener and it should be - // a group listener listening on A1:B10. - aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); - CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); - pListener = aListeners.data(); - CPPUNIT_ASSERT_EQUAL(ScRange(0,0,0,1,9,0), pListener->maArea); - CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.", pListener->mbGroupListening); -#endif - - // Insert a new row at row 1. - ScRange aRowOne(0,0,0,MAXCOL,0,0); - aMark.SetMarkArea(aRowOne); - ScDocFunc& rFunc = m_xDocShell->GetDocFunc(); - rFunc.InsertCells(aRowOne, &aMark, INS_INSROWS_BEFORE, true, true); - - CPPUNIT_ASSERT_EQUAL_MESSAGE("C1 should be empty.", CELLTYPE_NONE, m_pDoc->GetCellType(ScAddress(2,0,0))); - - // This check makes only sense if group listeners are activated. -#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER - // Make there we only have one group area listener listening on A2:B11. - aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); - CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); - pListener = aListeners.data(); - CPPUNIT_ASSERT_EQUAL(ScRange(0,1,0,1,10,0), pListener->maArea); - CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.", pListener->mbGroupListening); -#endif - - // Check the formula results. - for (SCROW i = 0; i < 10; ++i) - { - double fExpected = (i+1.0)*11.0; - CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2,i+1,0))); - } - - // Delete row at row 1 to shift the cells up. - rFunc.DeleteCells(aRowOne, &aMark, DelCellCmd::Rows, true); - - // Check the formula results again. - for (SCROW i = 0; i < 10; ++i) - { - double fExpected = (i+1.0)*11.0; - CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2,i,0))); - } - - // This check makes only sense if group listeners are activated. -#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER - // Check the group area listener again to make sure it's listening on A1:B10 once again. - aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); - CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); - pListener = aListeners.data(); - CPPUNIT_ASSERT_EQUAL(ScRange(0,0,0,1,9,0), pListener->maArea); - CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.", pListener->mbGroupListening); -#endif - - m_pDoc->DeleteTab(0); -} - -void Test::testCopyPasteMixedReferenceFormula() -{ - sc::AutoCalcSwitch aAC(*m_pDoc, true); // turn on auto calc. - m_pDoc->InsertTab(0, "Test"); - - // Insert value to C3 - m_pDoc->SetValue(2,2,0, 1.0); - - // Insert formula to A1 with mixed relative/absolute addressing. - m_pDoc->SetString(0,0,0, "=SUM(B:$C)"); - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,0,0), "SUM(B:$C)", "Wrong formula."); - CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0,0,0)); - - // Copy formula in A1 to clipboard. - ScRange aRange(ScAddress(0,0,0)); - ScDocument aClipDoc(SCDOCMODE_CLIP); - copyToClip(m_pDoc, aRange, &aClipDoc); - - // Paste formula to B1. - aRange = ScAddress(1,0,0); - pasteFromClip(m_pDoc, aRange, &aClipDoc); - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(1,0,0), "SUM(C:$C)", "Wrong formula."); - CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0,0,0)); - CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(1,0,0)); - - // Paste formula to C1. All three results now must be circular reference. - aRange = ScAddress(2,0,0); - pasteFromClip(m_pDoc, aRange, &aClipDoc); - ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(2,0,0), "SUM($C:D)", "Wrong formula."); // reference put in order - CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(0,0,0)); - CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(1,0,0)); - CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(2,0,0)); - - m_pDoc->DeleteTab(0); -} - void Test::testMergedCells() { //test merge and unmerge @@ -10563,139 +4052,6 @@ void Test::testAutoFillSimple() m_pDoc->DeleteTab(0); } -void Test::testCopyPasteFormulas() -{ - m_pDoc->InsertTab(0, "Sheet1"); - m_pDoc->InsertTab(1, "Sheet2"); - - m_pDoc->SetString(0,0,0, "=COLUMN($A$1)"); - m_pDoc->SetString(0,1,0, "=$A$1+B2" ); - m_pDoc->SetString(0,2,0, "=$Sheet2.A1"); - m_pDoc->SetString(0,3,0, "=$Sheet2.$A$1"); - m_pDoc->SetString(0,4,0, "=$Sheet2.A$1"); - - // to prevent ScEditableTester in ScDocFunc::MoveBlock - ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(0,0,0), 1.0); - ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(0,1,0), 1.0); - ScDocFunc& rDocFunc = m_xDocShell->GetDocFunc(); - bool bMoveDone = rDocFunc.MoveBlock(ScRange(0,0,0,0,4,0), ScAddress( 10, 10, 0), false, false, false, true); - - // check that moving was successful, mainly for editable tester - CPPUNIT_ASSERT(bMoveDone); - ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(10,10,0), 1.0); - ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(10,11,0), 1.0); - OUString aFormula; - m_pDoc->GetFormula(10,10,0, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("=COLUMN($A$1)"), aFormula); - m_pDoc->GetFormula(10,11,0, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("=$A$1+L12"), aFormula); - m_pDoc->GetFormula(10,12,0, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.K11"), aFormula); - m_pDoc->GetFormula(10,13,0, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.$A$1"), aFormula); - m_pDoc->GetFormula(10,14,0, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.K$1"), aFormula); -} - -void Test::testCopyPasteFormulasExternalDoc() -{ - SfxMedium* pMedium = new SfxMedium("file:///source.fake", StreamMode::STD_READWRITE); - m_xDocShell->DoInitNew(pMedium); - - ScDocShellRef xExtDocSh = new ScDocShell; - xExtDocSh->SetIsInUcalc(); - OUString const aExtDocName("file:///extdata.fake"); - SfxMedium* pMed = new SfxMedium(aExtDocName, StreamMode::STD_READWRITE); - xExtDocSh->DoInitNew(pMed); - CPPUNIT_ASSERT_MESSAGE("external document instance not loaded.", - findLoadedDocShellByName(aExtDocName) != nullptr); - - ScDocument& rExtDoc = xExtDocSh->GetDocument(); - rExtDoc.InsertTab(0, "ExtSheet1"); - rExtDoc.InsertTab(1, "ExtSheet2"); - - m_pDoc->InsertTab(0, "Sheet1"); - m_pDoc->InsertTab(1, "Sheet2"); - - m_pDoc->SetString(0,0,0, "=COLUMN($A$1)"); - m_pDoc->SetString(0,1,0, "=$A$1+B2" ); - m_pDoc->SetString(0,2,0, "=$Sheet2.A1"); - m_pDoc->SetString(0,3,0, "=$Sheet2.$A$1"); - m_pDoc->SetString(0,4,0, "=$Sheet2.A$1"); - m_pDoc->SetString(0,5,0, "=$Sheet1.$A$1"); - - ScRange aRange(0,0,0,0,5,0); - ScClipParam aClipParam(aRange, false); - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aRange); - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); - - aRange = ScRange(1,1,1,1,6,1); - ScMarkData aMarkData2(m_pDoc->GetSheetLimits()); - aMarkData2.SetMarkArea(aRange); - rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, &aClipDoc); - - OUString aFormula; - rExtDoc.GetFormula(1,1,1, aFormula); - //adjust absolute refs pointing to the copy area - CPPUNIT_ASSERT_EQUAL(OUString("=COLUMN($B$2)"), aFormula); - rExtDoc.GetFormula(1,2,1, aFormula); - //adjust absolute refs and keep relative refs - CPPUNIT_ASSERT_EQUAL(OUString("=$B$2+C3"), aFormula); - rExtDoc.GetFormula(1,3,1, aFormula); - // make absolute sheet refs external refs - CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.B2"), aFormula); - rExtDoc.GetFormula(1,4,1, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.$A$1"), aFormula); - rExtDoc.GetFormula(1,5,1, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.B$1"), aFormula); - rExtDoc.GetFormula(1,6,1, aFormula); - CPPUNIT_ASSERT_EQUAL(OUString("=$ExtSheet2.$B$2"), aFormula); - - xExtDocSh->DoClose(); -} - -void Test::testCopyPasteReferencesExternalDoc() -{ - SfxMedium* pMedium = new SfxMedium("file:///source.fake", StreamMode::STD_READWRITE); - m_xDocShell->DoInitNew(pMedium); - - ScDocShellRef xExtDocSh = new ScDocShell; - xExtDocSh->SetIsInUcalc(); - OUString aExtDocName("file:///extdata.fake"); - SfxMedium* pMed = new SfxMedium(aExtDocName, StreamMode::STD_READWRITE); - xExtDocSh->DoInitNew(pMed); - CPPUNIT_ASSERT_MESSAGE("external document instance not loaded.", - findLoadedDocShellByName(aExtDocName) != nullptr); - - ScDocument& rExtDoc = xExtDocSh->GetDocument(); - rExtDoc.InsertTab(0, "ExtSheet1"); - - m_pDoc->InsertTab(0, "Sheet1"); - - m_pDoc->SetString(0,5,0, "=SUM($Sheet1.A1:A5)"); - - ScRange aRange(0,2,0,0,5,0); - ScClipParam aClipParam(aRange, false); - ScMarkData aMark(m_pDoc->GetSheetLimits()); - aMark.SetMarkArea(aRange); - ScDocument aClipDoc(SCDOCMODE_CLIP); - m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); - - aRange = ScRange(0,0,0,0,3,0); - ScMarkData aMarkData2(m_pDoc->GetSheetLimits()); - aMarkData2.SetMarkArea(aRange); - rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, &aClipDoc); - - OUString aFormula; - rExtDoc.GetFormula(0,3,0, aFormula); - //adjust absolute refs pointing to the copy area - CPPUNIT_ASSERT_EQUAL(OUString("=SUM('file:///source.fake'#$Sheet1.A#REF!:A3)"), aFormula); - - xExtDocSh->DoClose(); -} - void Test::testFindAreaPosVertical() { std::vector<std::vector<const char*>> aData = { @@ -12513,23 +5869,6 @@ void Test::testEmptyCalcDocDefaults() CPPUNIT_ASSERT_EQUAL( false, m_pDoc->HasManualBreaks(tab) ); } -ScDocShell* Test::findLoadedDocShellByName(std::u16string_view rName) -{ - ScDocShell* pShell = static_cast<ScDocShell*>(SfxObjectShell::GetFirst(checkSfxObjectShell<ScDocShell>, false)); - while (pShell) - { - SfxMedium* pMedium = pShell->GetMedium(); - if (pMedium) - { - OUString aName = pMedium->GetName(); - if (aName == rName) - return pShell; - } - pShell = static_cast<ScDocShell*>(SfxObjectShell::GetNext(*pShell, checkSfxObjectShell<ScDocShell>, false)); - } - return nullptr; -} - void Test::setExpandRefs(bool bExpand) { ScModule* pMod = SC_MOD(); diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index 108483c5bbcc..1cb34cec4b25 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -22,8 +22,6 @@ class ScUndoCut; class Test : public test::BootstrapFixture { public: - static ScDocShell* findLoadedDocShellByName(std::u16string_view rName); - /** * Enable or disable expand reference options which controls how * references in formula are expanded when inserting rows or columns. @@ -226,72 +224,6 @@ public: void testAutoFilterTimeValue(); void testAdvancedFilter(); void testTdf98642(); - void testCopyPaste(); - void testCopyPasteAsLink(); - void testCopyPasteTranspose(); - void testCopyPasteSpecialAsLinkTranspose(); - void testCopyPasteSpecialAsLinkFilteredTranspose(); - void testCopyPasteSpecialMultiRangeColAsLinkTranspose(); - void testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose(); - void testCopyPasteSpecialMultiRangeRowAsLinkTranspose(); - void testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose(); - void testCopyPasteSpecialAllAsLinkTranspose(); - void testCopyPasteSpecialAllAsLinkFilteredTranspose(); - void testCopyPasteSpecial(); - void testCopyPasteSpecialFiltered(); - void testCopyPasteSpecialIncludeFiltered(); - void testCopyPasteSpecialFilteredIncludeFiltered(); - void testCopyPasteSpecialTranspose(); - void testCopyPasteSpecialTransposeIncludeFiltered(); - void testCopyPasteSpecialFilteredTranspose(); - void testCopyPasteSpecialMergedCellsTranspose(); - void testCopyPasteSpecialMergedCellsFilteredTranspose(); - void testCopyPasteSpecialMultiRangeCol(); - void testCopyPasteSpecialMultiRangeColFiltered(); - void testCopyPasteSpecialMultiRangeColIncludeFiltered(); - void testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered(); - void testCopyPasteSpecialMultiRangeColTranspose(); - void testCopyPasteSpecialMultiRangeColFilteredTranspose(); - void testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose(); - void testCopyPasteSpecialMultiRangeRow(); - void testCopyPasteSpecialMultiRangeRowFiltered(); - void testCopyPasteSpecialMultiRangeRowIncludeFiltered(); - void testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered(); - void testCopyPasteSpecialMultiRangeRowTranspose(); - void testCopyPasteSpecialMultiRangeRowFilteredTranspose(); - void testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose(); - void testCopyPasteSpecialSkipEmpty(); - void testCopyPasteSpecialSkipEmptyFiltered(); - void testCopyPasteSpecialSkipEmptyIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyTranspose(); - void testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyFilteredTranspose(); - void testCopyPasteSpecialSkipEmptyMultiRangeCol(); - void testCopyPasteSpecialSkipEmptyMultiRangeColFiltered(); - void testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyMultiRangeColTranspose(); - void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose(); - void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose(); - void testCopyPasteSpecialSkipEmptyMultiRangeRow(); - void testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered(); - void testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered(); - void testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose(); - void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose(); - void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose(); - void testCopyPasteMultiRange(); - void testCopyPasteSkipEmpty(); - void testCopyPasteSkipEmpty2(); - void testCutPasteRefUndo(); - void testCutPasteGroupRefUndo(); - void testMoveRefBetweenSheets(); - void testUndoCut(); - void testMoveBlock(); - void testCopyPasteRelativeFormula(); - void testCopyPasteRepeatOneFormula(); - void testCopyPasteMixedReferenceFormula(); void testMergedCells(); void testUpdateReference(); void testSearchCells(); @@ -333,9 +265,6 @@ public: void testTdf64001(); void testAutoFill(); void testAutoFillSimple(); - void testCopyPasteFormulas(); - void testCopyPasteFormulasExternalDoc(); - void testCopyPasteReferencesExternalDoc(); // tdf#106456 void testFindAreaPosVertical(); void testFindAreaPosColRight(); @@ -533,72 +462,6 @@ public: CPPUNIT_TEST(testAutoFilterTimeValue); CPPUNIT_TEST(testAdvancedFilter); CPPUNIT_TEST(testTdf98642); - CPPUNIT_TEST(testCopyPaste); - CPPUNIT_TEST(testCopyPasteAsLink); - CPPUNIT_TEST(testCopyPasteTranspose); - CPPUNIT_TEST(testCopyPasteSpecialAsLinkTranspose); - CPPUNIT_TEST(testCopyPasteSpecialAllAsLinkTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColAsLinkTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowAsLinkTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialAsLinkFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialAllAsLinkFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMergedCellsTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMergedCellsFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecial); - CPPUNIT_TEST(testCopyPasteSpecialFiltered); - CPPUNIT_TEST(testCopyPasteSpecialIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialFilteredIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialTranspose); - CPPUNIT_TEST(testCopyPasteSpecialTransposeIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeCol); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFiltered); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRow); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFiltered); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmpty); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeCol); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRow); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose); - CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose); - CPPUNIT_TEST(testCopyPasteMultiRange); - CPPUNIT_TEST(testCopyPasteSkipEmpty); - CPPUNIT_TEST(testCopyPasteSkipEmpty2); - CPPUNIT_TEST(testCutPasteRefUndo); - CPPUNIT_TEST(testCutPasteGroupRefUndo); - CPPUNIT_TEST(testMoveRefBetweenSheets); - CPPUNIT_TEST(testUndoCut); - CPPUNIT_TEST(testMoveBlock); - CPPUNIT_TEST(testCopyPasteRelativeFormula); - CPPUNIT_TEST(testCopyPasteRepeatOneFormula); - CPPUNIT_TEST(testCopyPasteMixedReferenceFormula); CPPUNIT_TEST(testMergedCells); CPPUNIT_TEST(testUpdateReference); CPPUNIT_TEST(testSearchCells); @@ -611,9 +474,6 @@ public: CPPUNIT_TEST(testTdf64001); CPPUNIT_TEST(testAutoFill); CPPUNIT_TEST(testAutoFillSimple); - CPPUNIT_TEST(testCopyPasteFormulas); - CPPUNIT_TEST(testCopyPasteFormulasExternalDoc); - CPPUNIT_TEST(testCopyPasteReferencesExternalDoc); CPPUNIT_TEST(testFindAreaPosVertical); CPPUNIT_TEST(testFindAreaPosColRight); CPPUNIT_TEST(testShiftCells); @@ -655,23 +515,6 @@ public: private: ScDocShellRef m_xDocShell; ScDocument* m_pDoc; - - void executeCopyPasteSpecial(bool bApplyFilter, bool bIncludedFiltered, bool bAsLink, - bool bTranspose, bool bMultiRangeSelection, bool bSkipEmpty, - ScClipParam::Direction eDirection, bool bCalcAll, - InsertDeleteFlags aFlags); - void checkCopyPasteSpecial(bool bSkipEmpty); - void checkCopyPasteSpecialFiltered(bool bSkipEmpty); - void checkCopyPasteSpecialTranspose(bool bSkipEmpty); - void checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty); - void checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/qa/unit/ucalc_copypaste.cxx b/sc/qa/unit/ucalc_copypaste.cxx new file mode 100644 index 000000000000..974dabe51802 --- /dev/null +++ b/sc/qa/unit/ucalc_copypaste.cxx @@ -0,0 +1,6928 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <memory> +#include <test/bootstrapfixture.hxx> +#include "helper/debughelper.hxx" +#include "helper/qahelper.hxx" + +#include <attrib.hxx> +#include <bcaslot.hxx> +#include <clipparam.hxx> +#include <dbdata.hxx> +#include <docfunc.hxx> +#include <docpool.hxx> +#include <editeng/borderline.hxx> +#include <editeng/brushitem.hxx> +#include <editeng/editobj.hxx> +#include <editutil.hxx> +#include <formulacell.hxx> +#include <formulaopt.hxx> +#include <iostream> +#include <patattr.hxx> +#include <postit.hxx> +#include <queryentry.hxx> +#include <queryparam.hxx> +#include <refundo.hxx> +#include <scdll.hxx> +#include <scitems.hxx> +#include <scmod.hxx> +#include <scopetools.hxx> + +#include <sfx2/docfile.hxx> + +class TestCopyPaste : public test::BootstrapFixture +{ +public: + TestCopyPaste(); + + virtual void setUp() override; + virtual void tearDown() override; + + void testCopyPaste(); + void testCopyPasteAsLink(); + void testCopyPasteTranspose(); + void testCopyPasteSpecialAsLinkTranspose(); + void testCopyPasteSpecialAsLinkFilteredTranspose(); + void testCopyPasteSpecialMultiRangeColAsLinkTranspose(); + void testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose(); + void testCopyPasteSpecialMultiRangeRowAsLinkTranspose(); + void testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose(); + void testCopyPasteSpecialAllAsLinkTranspose(); + void testCopyPasteSpecialAllAsLinkFilteredTranspose(); + void testCopyPasteSpecial(); + void testCopyPasteSpecialFiltered(); + void testCopyPasteSpecialIncludeFiltered(); + void testCopyPasteSpecialFilteredIncludeFiltered(); + void testCopyPasteSpecialTranspose(); + void testCopyPasteSpecialTransposeIncludeFiltered(); + void testCopyPasteSpecialFilteredTranspose(); + void testCopyPasteSpecialMergedCellsTranspose(); + void testCopyPasteSpecialMergedCellsFilteredTranspose(); + void testCopyPasteSpecialMultiRangeCol(); + void testCopyPasteSpecialMultiRangeColFiltered(); + void testCopyPasteSpecialMultiRangeColIncludeFiltered(); + void testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered(); + void testCopyPasteSpecialMultiRangeColTranspose(); + void testCopyPasteSpecialMultiRangeColFilteredTranspose(); + void testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose(); + void testCopyPasteSpecialMultiRangeRow(); + void testCopyPasteSpecialMultiRangeRowFiltered(); + void testCopyPasteSpecialMultiRangeRowIncludeFiltered(); + void testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered(); + void testCopyPasteSpecialMultiRangeRowTranspose(); + void testCopyPasteSpecialMultiRangeRowFilteredTranspose(); + void testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose(); + void testCopyPasteSpecialSkipEmpty(); + void testCopyPasteSpecialSkipEmptyFiltered(); + void testCopyPasteSpecialSkipEmptyIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyTranspose(); + void testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyFilteredTranspose(); + void testCopyPasteSpecialSkipEmptyMultiRangeCol(); + void testCopyPasteSpecialSkipEmptyMultiRangeColFiltered(); + void testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyMultiRangeColTranspose(); + void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose(); + void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose(); + void testCopyPasteSpecialSkipEmptyMultiRangeRow(); + void testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered(); + void testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered(); + void testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose(); + void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose(); + void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose(); + void testCopyPasteMultiRange(); + void testCopyPasteSkipEmpty(); + void testCopyPasteSkipEmpty2(); + void testCutPasteRefUndo(); + void testCutPasteGroupRefUndo(); + void testMoveRefBetweenSheets(); + void testUndoCut(); + void testMoveBlock(); + void testCopyPasteRelativeFormula(); + void testCopyPasteRepeatOneFormula(); + void testCopyPasteMixedReferenceFormula(); + void testCopyPasteFormulas(); + void testCopyPasteFormulasExternalDoc(); + void testCopyPasteReferencesExternalDoc(); // tdf#106456 + + CPPUNIT_TEST_SUITE(TestCopyPaste); + + CPPUNIT_TEST(testCopyPaste); + CPPUNIT_TEST(testCopyPasteAsLink); + CPPUNIT_TEST(testCopyPasteTranspose); + CPPUNIT_TEST(testCopyPasteSpecialAsLinkTranspose); + CPPUNIT_TEST(testCopyPasteSpecialAllAsLinkTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColAsLinkTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowAsLinkTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialAsLinkFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialAllAsLinkFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMergedCellsTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMergedCellsFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecial); + CPPUNIT_TEST(testCopyPasteSpecialFiltered); + CPPUNIT_TEST(testCopyPasteSpecialIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialFilteredIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialTranspose); + CPPUNIT_TEST(testCopyPasteSpecialTransposeIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeCol); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFiltered); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRow); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFiltered); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmpty); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeCol); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRow); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose); + CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose); + CPPUNIT_TEST(testCopyPasteMultiRange); + CPPUNIT_TEST(testCopyPasteSkipEmpty); + CPPUNIT_TEST(testCopyPasteSkipEmpty2); + CPPUNIT_TEST(testCutPasteRefUndo); + CPPUNIT_TEST(testCutPasteGroupRefUndo); + CPPUNIT_TEST(testMoveRefBetweenSheets); + CPPUNIT_TEST(testUndoCut); + CPPUNIT_TEST(testMoveBlock); + CPPUNIT_TEST(testCopyPasteRelativeFormula); + CPPUNIT_TEST(testCopyPasteRepeatOneFormula); + CPPUNIT_TEST(testCopyPasteMixedReferenceFormula); + + CPPUNIT_TEST(testCopyPasteFormulas); + CPPUNIT_TEST(testCopyPasteFormulasExternalDoc); + CPPUNIT_TEST(testCopyPasteReferencesExternalDoc); + + CPPUNIT_TEST_SUITE_END(); + +private: + ScDocShellRef m_xDocShell; + ScDocument* m_pDoc; + + void executeCopyPasteSpecial(bool bApplyFilter, bool bIncludedFiltered, bool bAsLink, + bool bTranspose, bool bMultiRangeSelection, bool bSkipEmpty, + ScClipParam::Direction eDirection, bool bCalcAll, + InsertDeleteFlags aFlags); + void checkCopyPasteSpecial(bool bSkipEmpty); + void checkCopyPasteSpecialFiltered(bool bSkipEmpty); + void checkCopyPasteSpecialTranspose(bool bSkipEmpty); + void checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty); + void checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty); +}; + +TestCopyPaste::TestCopyPaste() {} + +void TestCopyPaste::setUp() +{ + BootstrapFixture::setUp(); + + ScDLL::Init(); + + m_xDocShell + = new ScDocShell(SfxModelFlags::EMBEDDED_OBJECT | SfxModelFlags::DISABLE_EMBEDDED_SCRIPTS + | SfxModelFlags::DISABLE_DOCUMENT_RECOVERY); + m_xDocShell->SetIsInUcalc(); + m_xDocShell->DoInitUnitTest(); + + m_pDoc = &m_xDocShell->GetDocument(); +} + +void TestCopyPaste::tearDown() +{ + m_xDocShell->DoClose(); + m_xDocShell.clear(); + + test::BootstrapFixture::tearDown(); +} + +static ScMF lcl_getMergeFlagOfCell(const ScDocument& rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab) +{ + const SfxPoolItem& rPoolItem = rDoc.GetPattern(nCol, nRow, nTab)->GetItem(ATTR_MERGE_FLAG); + const ScMergeFlagAttr& rMergeFlag = static_cast<const ScMergeFlagAttr&>(rPoolItem); + return rMergeFlag.GetValue(); +} + +static ScAddress lcl_getMergeSizeOfCell(const ScDocument& rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab) +{ + const SfxPoolItem& rPoolItem = rDoc.GetPattern(nCol, nRow, nTab)->GetItem(ATTR_MERGE); + const ScMergeAttr& rMerge = static_cast<const ScMergeAttr&>(rPoolItem); + return ScAddress(rMerge.GetColMerge(), rMerge.GetRowMerge(), nTab); +} + +void TestCopyPaste::testCopyPaste() +{ + m_pDoc->InsertTab(0, "Sheet1"); + m_pDoc->InsertTab(1, "Sheet2"); + + // We need a drawing layer in order to create caption objects. + m_pDoc->InitDrawLayer(m_xDocShell.get()); + + //test copy&paste + ScUndoPaste + //copy local and global range names in formulas + //string cells and value cells + m_pDoc->SetValue(0, 0, 0, 1); + m_pDoc->SetValue(3, 0, 0, 0); + m_pDoc->SetValue(3, 1, 0, 1); + m_pDoc->SetValue(3, 2, 0, 2); + m_pDoc->SetValue(3, 3, 0, 3); + m_pDoc->SetString(2, 0, 0, "test"); + ScAddress aAdr(0, 0, 0); + + //create some range names, local and global + ScRangeData* pLocal1 = new ScRangeData(*m_pDoc, "local1", aAdr); + ScRangeData* pLocal2 = new ScRangeData(*m_pDoc, "local2", aAdr); + ScRangeData* pLocal3 = new ScRangeData(*m_pDoc, "local3", "$Sheet1.$A$1"); + ScRangeData* pLocal4 = new ScRangeData(*m_pDoc, "local4", "Sheet1.$A$1"); + ScRangeData* pLocal5 + = new ScRangeData(*m_pDoc, "local5", "$A$1"); // implicit relative sheet reference + ScRangeData* pGlobal = new ScRangeData(*m_pDoc, "global", aAdr); + const OUString aGlobal2Symbol("$Sheet1.$A$1:$A$23"); + ScRangeData* pGlobal2 = new ScRangeData(*m_pDoc, "global2", aGlobal2Symbol); + std::unique_ptr<ScRangeName> pGlobalRangeName(new ScRangeName()); + pGlobalRangeName->insert(pGlobal); + pGlobalRangeName->insert(pGlobal2); + std::unique_ptr<ScRangeName> pLocalRangeName1(new ScRangeName()); + pLocalRangeName1->insert(pLocal1); + pLocalRangeName1->insert(pLocal2); + pLocalRangeName1->insert(pLocal3); + pLocalRangeName1->insert(pLocal4); + pLocalRangeName1->insert(pLocal5); + m_pDoc->SetRangeName(std::move(pGlobalRangeName)); + m_pDoc->SetRangeName(0, std::move(pLocalRangeName1)); + + // Add formula to B1. + OUString aFormulaString("=local1+global+SUM($C$1:$D$4)+local3+local4+local5"); + m_pDoc->SetString(1, 0, 0, aFormulaString); + + double fValue = m_pDoc->GetValue(ScAddress(1, 0, 0)); + ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 11", fValue, 11); + + // add notes to A1:C1 + ScAddress aAdrA1(0, 0, 0); // empty cell content + ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAdrA1); + pNoteA1->SetText(aAdrA1, "Hello world in A1"); + ScAddress aAdrB1(1, 0, 0); // formula cell content + ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAdrB1); + pNoteB1->SetText(aAdrB1, "Hello world in B1"); + ScAddress aAdrC1(2, 0, 0); // string cell content + ScPostIt* pNoteC1 = m_pDoc->GetOrCreateNote(aAdrC1); + pNoteC1->SetText(aAdrC1, "Hello world in C1"); + + //copy Sheet1.A1:C1 to Sheet2.A2:C2 + ScRange aRange(0, 0, 0, 2, 0, 0); + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aRange, &aClipDoc); + + aRange = ScRange(0, 1, 1, 2, 1, 1); //target: Sheet2.A2:C2 + ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); + pUndoDoc->InitUndo(*m_pDoc, 1, 1, true, true); + std::unique_ptr<ScUndoPaste> pUndo(createUndoPaste(*m_xDocShell, aRange, std::move(pUndoDoc))); + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aRange); + m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc); + + //check values after copying + OUString aString; + m_pDoc->GetFormula(1, 1, 1, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("formula string was not copied correctly", aString, + aFormulaString); + // Only the global range points to Sheet1.A1, all copied sheet-local ranges + // to Sheet2.A1 that is empty, hence the result is 1, not 2. + fValue = m_pDoc->GetValue(ScAddress(1, 1, 1)); + ASSERT_DOUBLES_EQUAL_MESSAGE("copied formula should return 1", 1.0, fValue); + fValue = m_pDoc->GetValue(ScAddress(0, 1, 1)); + ASSERT_DOUBLES_EQUAL_MESSAGE("copied value should be 1", 1.0, fValue); + + ScRange aSheet2A1(0, 0, 1, 0, 0, 1); + + //check local range name after copying + pLocal1 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL1")); + CPPUNIT_ASSERT_MESSAGE("local range name 1 should be copied", pLocal1); + ScRange aRangeLocal1; + bool bIsValidRef1 = pLocal1->IsValidReference(aRangeLocal1); + CPPUNIT_ASSERT_MESSAGE("local range name 1 should be valid", bIsValidRef1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 1 should now point to Sheet2.A1", aSheet2A1, + aRangeLocal1); + + pLocal2 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL2")); + CPPUNIT_ASSERT_MESSAGE("local2 should not be copied", !pLocal2); + + pLocal3 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL3")); + CPPUNIT_ASSERT_MESSAGE("local range name 3 should be copied", pLocal3); + ScRange aRangeLocal3; + bool bIsValidRef3 = pLocal3->IsValidReference(aRangeLocal3); + CPPUNIT_ASSERT_MESSAGE("local range name 3 should be valid", bIsValidRef3); + CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 3 should now point to Sheet2.A1", aSheet2A1, + aRangeLocal3); + + pLocal4 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL4")); + CPPUNIT_ASSERT_MESSAGE("local range name 4 should be copied", pLocal4); + ScRange aRangeLocal4; + bool bIsValidRef4 = pLocal4->IsValidReference(aRangeLocal4); + CPPUNIT_ASSERT_MESSAGE("local range name 4 should be valid", bIsValidRef4); + CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 4 should now point to Sheet2.A1", aSheet2A1, + aRangeLocal4); + + pLocal5 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL5")); + CPPUNIT_ASSERT_MESSAGE("local range name 5 should be copied", pLocal5); + ScRange aRangeLocal5; + bool bIsValidRef5 = pLocal5->IsValidReference(aRangeLocal5); + CPPUNIT_ASSERT_MESSAGE("local range name 5 should be valid", bIsValidRef5); + CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 5 should now point to Sheet2.A1", aSheet2A1, + aRangeLocal5); + + // check notes after copying + CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.A2", + m_pDoc->HasNote(ScAddress(0, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.B2", + m_pDoc->HasNote(ScAddress(1, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.C2", + m_pDoc->HasNote(ScAddress(2, 1, 1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Note content on Sheet1.A1 not copied to Sheet2.A2, empty cell content", + m_pDoc->GetNote(ScAddress(0, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(0, 1, 1))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Note content on Sheet1.B1 not copied to Sheet2.B2, formula cell content", + m_pDoc->GetNote(ScAddress(1, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(1, 1, 1))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Note content on Sheet1.C1 not copied to Sheet2.C2, string cell content", + m_pDoc->GetNote(ScAddress(2, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(2, 1, 1))->GetText()); + + //check undo and redo + pUndo->Undo(); + fValue = m_pDoc->GetValue(ScAddress(1, 1, 1)); + ASSERT_DOUBLES_EQUAL_MESSAGE("after undo formula should return nothing", fValue, 0); + aString = m_pDoc->GetString(2, 1, 1); + CPPUNIT_ASSERT_MESSAGE("after undo, string should be removed", aString.isEmpty()); + CPPUNIT_ASSERT_MESSAGE("after undo, note on A2 should be removed", + !m_pDoc->HasNote(ScAddress(0, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("after undo, note on B2 should be removed", + !m_pDoc->HasNote(ScAddress(1, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("after undo, note on C2 should be removed", + !m_pDoc->HasNote(ScAddress(2, 1, 1))); + + pUndo->Redo(); + fValue = m_pDoc->GetValue(ScAddress(1, 1, 1)); + ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 1 after redo", 1.0, fValue); + aString = m_pDoc->GetString(2, 1, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell Sheet2.C2 should contain: test", OUString("test"), aString); + m_pDoc->GetFormula(1, 1, 1, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula should be correct again", aFormulaString, aString); + + CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.A2", + m_pDoc->HasNote(ScAddress(0, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.B2", + m_pDoc->HasNote(ScAddress(1, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.C2", + m_pDoc->HasNote(ScAddress(2, 1, 1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.A2, empty cell content", + m_pDoc->GetNote(ScAddress(0, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(0, 1, 1))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.B2, formula cell content", + m_pDoc->GetNote(ScAddress(1, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(1, 1, 1))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.C2, string cell content", + m_pDoc->GetNote(ScAddress(2, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(2, 1, 1))->GetText()); + + // Copy Sheet1.A11:A13 to Sheet1.A7:A9, both within global2 range. + aRange = ScRange(0, 10, 0, 0, 12, 0); + ScDocument aClipDoc2(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aRange, &aClipDoc2); + + aRange = ScRange(0, 6, 0, 0, 8, 0); + aMark.SetMarkArea(aRange); + m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc2); + + // The global2 range must not have changed. + pGlobal2 = m_pDoc->GetRangeName()->findByUpperName("GLOBAL2"); + CPPUNIT_ASSERT_MESSAGE("GLOBAL2 name not found", pGlobal2); + OUString aSymbol; + pGlobal2->GetSymbol(aSymbol); + CPPUNIT_ASSERT_EQUAL_MESSAGE("GLOBAL2 named range changed", aGlobal2Symbol, aSymbol); + + m_pDoc->DeleteTab(1); + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteAsLink() +{ + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(0, "Sheet1"); + m_pDoc->InsertTab(1, "Sheet2"); + + m_pDoc->SetValue(ScAddress(0, 0, 0), 1); // A1 + m_pDoc->SetValue(ScAddress(0, 1, 0), 2); // A2 + m_pDoc->SetValue(ScAddress(0, 2, 0), 3); // A3 + + ScRange aRange(0, 0, 0, 0, 2, 0); // Copy A1:A3 to clip. + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aRange, &aClipDoc); + + aRange = ScRange(1, 1, 1, 1, 3, 1); // Paste to B2:B4 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aRange); + // Paste range as link. + m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &aClipDoc, true, + true); + + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, 1)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, 1)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, 1)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + CPPUNIT_ASSERT_EQUAL(3.0, pFC->GetValue()); + + m_pDoc->DeleteTab(1); + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteTranspose() +{ + m_pDoc->InsertTab(0, "Sheet1"); + + // We need a drawing layer in order to create caption objects. + m_pDoc->InitDrawLayer(m_xDocShell.get()); + + m_pDoc->SetValue(0, 0, 0, 1); + m_pDoc->SetString(1, 0, 0, "=A1+1"); + m_pDoc->SetString(2, 0, 0, "test"); + + // add notes to A1:C1 + ScAddress aAdrA1(0, 0, 0); // numerical cell content + ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAdrA1); + pNoteA1->SetText(aAdrA1, "Hello world in A1"); + ScAddress aAdrB1(1, 0, 0); // formula cell content + ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAdrB1); + pNoteB1->SetText(aAdrB1, "Hello world in B1"); + ScAddress aAdrC1(2, 0, 0); // string cell content + ScPostIt* pNoteC1 = m_pDoc->GetOrCreateNote(aAdrC1); + pNoteC1->SetText(aAdrC1, "Hello world in C1"); + + // transpose clipboard, paste and check on Sheet2 + m_pDoc->InsertTab(1, "Sheet2"); + + ScRange aSrcRange(0, 0, 0, 2, 0, 0); + ScDocument aNewClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aNewClipDoc); + + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aNewClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, false); + + ScRange aDestRange(3, 1, 1, 3, 3, 1); //target: Sheet2.D2:D4 + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get()); + pTransClip.reset(); + + //check cell content after transposed copy/paste + OUString aString = m_pDoc->GetString(3, 3, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell Sheet2.D4 should contain: test", OUString("test"), aString); + double fValue = m_pDoc->GetValue(ScAddress(3, 1, 1)); + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell should return 1", 1, fValue); + fValue = m_pDoc->GetValue(ScAddress(3, 2, 1)); + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula should return 2", 2, fValue); + m_pDoc->GetFormula(3, 2, 1, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula should point on Sheet2.D2", OUString("=D2+1"), + aString); + + // check notes after transposed copy/paste + CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D2", + m_pDoc->HasNote(ScAddress(3, 1, 1))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D3", + m_pDoc->HasNote(ScAddress(3, 2, 1))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D4", + m_pDoc->HasNote(ScAddress(3, 3, 1))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D2", + m_pDoc->GetNote(ScAddress(0, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, 1))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D3", + m_pDoc->GetNote(ScAddress(1, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, 1))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D4", + m_pDoc->GetNote(ScAddress(2, 0, 0))->GetText(), + m_pDoc->GetNote(ScAddress(3, 3, 1))->GetText()); + + m_pDoc->DeleteTab(1); + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteSpecialMergedCellsTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 2, srcSheet, 3); // A3 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + m_pDoc->DoMerge(srcSheet, 0, 1, 1, 1, false); // Merge A2 and B2 + m_pDoc->DoMerge(srcSheet, 0, 2, 1, 2, false); // Merge A3 and B3 + + // Test precondition + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 0, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 0, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 1, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 1, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 2, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 1, 2, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 3, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 3, srcSheet)); + + ScRange aSrcRange(0, 0, srcSheet, 1, 3, srcSheet); // Copy A1:B4 to clip. + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aClipDoc); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); + + ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, + false); + pTransClip.reset(); + + // Check transpose of merged cells + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 2, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 3, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 4, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 4, 2, destSheet)); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::testCopyPasteSpecialMergedCellsFilteredTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 2, srcSheet, 3); // A3 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + m_pDoc->DoMerge(srcSheet, 0, 1, 1, 1, false); // Merge A2 and B2 + m_pDoc->DoMerge(srcSheet, 0, 2, 1, 2, false); // Merge A3 and B3 + + // Filter row 1 + ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); + m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); + + pDBData->SetAutoFilter(true); + ScRange aRange; + pDBData->GetArea(aRange); + m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), + aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); + + //create the query param + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + ScQueryEntry& rEntry = aParam.GetEntry(0); + rEntry.bDoQuery = true; + rEntry.nField = 0; + rEntry.eOp = SC_NOT_EQUAL; + rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 + // add queryParam to database range. + pDBData->SetQueryParam(aParam); + + // perform the query. + m_pDoc->Query(srcSheet, aParam, true); + + // Test precondition + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 0, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 0, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 1, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 1, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 2, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 1, 2, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 0, 3, srcSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 3, srcSheet)); + + ScRange aSrcRange(0, 0, srcSheet, 1, 3, srcSheet); // Copy A1:B4 to clip. + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aClipDoc); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); + + ScRange aDestRange(1, 1, destSheet, 3, 2, destSheet); // Paste to B2:D3 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, + false); + pTransClip.reset(); + + // Check transpose of merged cells + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 2, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(2, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet), + lcl_getMergeSizeOfCell(*m_pDoc, 3, 1, destSheet)); + CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 3, 2, destSheet)); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// InsertDeleteFlags::CONTENTS +void TestCopyPaste::testCopyPasteSpecialAsLinkTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); // Copy A1:A4 to clip. + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aClipDoc); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); + + ScRange aDestRange(1, 1, destSheet, 4, 1, destSheet); // Paste to B2:E2 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, pTransClip.get(), + true, false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(2, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$2"), aString); + CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D2.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E2", OUString("=$Sheet1.$A$4"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// InsertDeleteFlags::CONTENTS +void TestCopyPaste::testCopyPasteSpecialAsLinkFilteredTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + // Filter row 1 + ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); + m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); + + pDBData->SetAutoFilter(true); + ScRange aRange; + pDBData->GetArea(aRange); + m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), + aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); + + //create the query param + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + ScQueryEntry& rEntry = aParam.GetEntry(0); + rEntry.bDoQuery = true; + rEntry.nField = 0; + rEntry.eOp = SC_NOT_EQUAL; + rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 + // add queryParam to database range. + pDBData->SetQueryParam(aParam); + + // perform the query. + m_pDoc->Query(srcSheet, aParam, true); + + // Check precondition for test: row 1 is hidden/filtered + SCROW nRow1, nRow2; + SCROW nFilteredRow1, nFilteredRow2; + bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2); + CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2); + bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2); + CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2); + + // Copy A1:A4 to clip. + ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aClipDoc); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); + + ScRange aDestRange(1, 1, destSheet, 3, 1, destSheet); // Paste to B2:D2 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, pTransClip.get(), + true, false, false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C2.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(3, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$4"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// tdf#141683 +// InsertDeleteFlags::CONTENTS +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowAsLinkTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(1, 0, srcSheet, 2); // B1 + m_pDoc->SetValue(3, 0, srcSheet, 4); // D1 + + m_pDoc->SetValue(0, 2, srcSheet, 11); // A3 + m_pDoc->SetValue(1, 2, srcSheet, 12); // B3 + m_pDoc->SetValue(3, 2, srcSheet, 14); // D3 + + ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); + aSrcMark.SelectOneTable(0); + ScClipParam aClipParam; + aClipParam.meDirection = ScClipParam::Row; + aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 3, 0, srcSheet)); // A1:D1 + aClipParam.maRanges.push_back(ScRange(0, 2, srcSheet, 3, 2, srcSheet)); // A3:D3 + + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); + + ScRange aDestRange(1, 1, destSheet, 2, 4, destSheet); // Paste to B2:C5 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, + pTransClip.get(), true, false /* false fixes tdf#141683 */, + false, false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); + m_pDoc->GetFormula(1, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$B$1"), aString); + CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell B4.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(1, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B5", OUString("=$Sheet1.$D$1"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC); + m_pDoc->GetFormula(2, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$3"), aString); + CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC); + m_pDoc->GetFormula(2, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C3", OUString("=$Sheet1.$B$3"), aString); + CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 3, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C4.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(2, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C5", OUString("=$Sheet1.$D$3"), aString); + CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// tdf#141683 +// InsertDeleteFlags::CONTENTS +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(1, 0, srcSheet, 2); // B1 + m_pDoc->SetValue(3, 0, srcSheet, 4); // D1 + + m_pDoc->SetValue(0, 1, srcSheet, -1); // A2, filtered and selected + m_pDoc->SetValue(1, 1, srcSheet, -2); // B2, filtered and selected + m_pDoc->SetValue(3, 1, srcSheet, -4); // D2, filtered and selected + + m_pDoc->SetValue(0, 2, srcSheet, 11); // A3 + m_pDoc->SetValue(1, 2, srcSheet, 12); // B3 + m_pDoc->SetValue(3, 2, srcSheet, 14); // D3 + + m_pDoc->SetValue(0, 3, srcSheet, -11); // A4, filtered and not selected + m_pDoc->SetValue(1, 3, srcSheet, -12); // B4, filtered and not selected + m_pDoc->SetValue(3, 3, srcSheet, -14); // D4, filtered and not selected + + m_pDoc->SetValue(0, 5, srcSheet, 111); // A6 + m_pDoc->SetValue(1, 5, srcSheet, 112); // B6 + m_pDoc->SetValue(3, 5, srcSheet, 114); // D6 + + // Filter row 1 + ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 3, 3); + m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); + + pDBData->SetAutoFilter(true); + ScRange aRange; + pDBData->GetArea(aRange); + m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), + aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); + + //create the query param + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + ScQueryEntry& rEntry = aParam.GetEntry(0); + rEntry.bDoQuery = true; + rEntry.nField = 0; + rEntry.eOp = SC_GREATER_EQUAL; + rEntry.GetQueryItem().mfVal = 0; // filtering negative values -> filtering row 1 and 2 + // add queryParam to database range. + pDBData->SetQueryParam(aParam); + + // perform the query. + m_pDoc->Query(srcSheet, aParam, true); + + ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); + aSrcMark.SelectOneTable(0); + ScClipParam aClipParam; + aClipParam.meDirection = ScClipParam::Row; + aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 3, 2, srcSheet)); // A1:C3 + aClipParam.maRanges.push_back(ScRange(0, 5, srcSheet, 3, 5, srcSheet)); // A6:C6 + + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); + + printRange(m_pDoc, aClipParam.getWholeRange(), "Src range"); + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); + + printRange(&aClipDoc, ScRange(0, 0, 0, 4, 5, 0), "Base doc (&aNewClipDoc)"); + printRange(pTransClip.get(), ScRange(0, 0, 0, 3, 3, 0), + "Transposed filtered clipdoc (pTransClip.get())"); + ScRange aDestRange(1, 1, destSheet, 3, 4, destSheet); // Paste to B2:D5 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, + pTransClip.get(), true, false /* false fixes tdf#141683 */, + false, false); + pTransClip.reset(); + printRange(m_pDoc, aDestRange, "Transposed dest sheet"); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); + m_pDoc->GetFormula(1, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$B$1"), aString); + CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell B4.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(1, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B5", OUString("=$Sheet1.$D$1"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC); + m_pDoc->GetFormula(2, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$3"), aString); + CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC); + m_pDoc->GetFormula(2, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C3", OUString("=$Sheet1.$B$3"), aString); + CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 3, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C4.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(2, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C5", OUString("=$Sheet1.$D$3"), aString); + CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell D2.", pFC); + m_pDoc->GetFormula(3, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$6"), aString); + CPPUNIT_ASSERT_EQUAL(111.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell D3.", pFC); + m_pDoc->GetFormula(3, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D3", OUString("=$Sheet1.$B$6"), aString); + CPPUNIT_ASSERT_EQUAL(112.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 3, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D4.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(3, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D5", OUString("=$Sheet1.$D$6"), aString); + CPPUNIT_ASSERT_EQUAL(114.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// tdf#141683 +// InsertDeleteFlags::CONTENTS +void TestCopyPaste::testCopyPasteSpecialMultiRangeColAsLinkTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + m_pDoc->SetValue(2, 0, srcSheet, 11); // C1 + m_pDoc->SetValue(2, 1, srcSheet, 12); // C2 + m_pDoc->SetValue(2, 3, srcSheet, 14); // C4 + + ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); + aSrcMark.SelectOneTable(0); + ScClipParam aClipParam; + aClipParam.meDirection = ScClipParam::Column; + aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 0, 3, srcSheet)); // A1:A4 + aClipParam.maRanges.push_back(ScRange(2, 0, srcSheet, 2, 3, srcSheet)); // C1:C4 + + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); + + ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, + pTransClip.get(), true, false /* false fixes tdf#141683 */, + false, false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC); + m_pDoc->GetFormula(2, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$2"), aString); + CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D2.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E2", OUString("=$Sheet1.$A$4"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); + m_pDoc->GetFormula(1, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$C$1"), aString); + CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC); + m_pDoc->GetFormula(2, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C3", OUString("=$Sheet1.$C$2"), aString); + CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D3.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(4, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E3", OUString("=$Sheet1.$C$4"), aString); + CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// tdf#141683 +// InsertDeleteFlags::CONTENTS +void TestCopyPaste::testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + m_pDoc->SetValue(2, 0, srcSheet, 11); // C1 + m_pDoc->SetValue(2, 1, srcSheet, 12); // C2 + m_pDoc->SetValue(2, 3, srcSheet, 14); // C4 + + // Filter row 1 + ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); + m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); + + pDBData->SetAutoFilter(true); + ScRange aRange; + pDBData->GetArea(aRange); + m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), + aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); + + //create the query param + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + ScQueryEntry& rEntry = aParam.GetEntry(0); + rEntry.bDoQuery = true; + rEntry.nField = 0; + rEntry.eOp = SC_NOT_EQUAL; + rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 + // add queryParam to database range. + pDBData->SetQueryParam(aParam); + + // perform the query. + m_pDoc->Query(srcSheet, aParam, true); + + ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); + aSrcMark.SelectOneTable(0); + ScClipParam aClipParam; + aClipParam.meDirection = ScClipParam::Column; + aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 0, 3, srcSheet)); // A1:A4 + aClipParam.maRanges.push_back(ScRange(2, 0, srcSheet, 2, 3, srcSheet)); // C1:C4 + + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false); + + ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyMultiRangeFromClip(ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::CONTENTS, + pTransClip.get(), true, false /* false fixes tdf#141683 */, + false, false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C2.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(3, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$4"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC); + m_pDoc->GetFormula(1, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B3", OUString("=$Sheet1.$C$1"), aString); + CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C3.", !pFC); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(3, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D3", OUString("=$Sheet1.$C$4"), aString); + CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// InsertDeleteFlags::ALL +void TestCopyPaste::testCopyPasteSpecialAllAsLinkTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); // Copy A1:A4 to clip. + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aClipDoc); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); + + ScRange aDestRange(1, 1, destSheet, 4, 1, destSheet); // Paste to B2:E2 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, + false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(2, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$2"), aString); + CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(3, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$3"), aString); + CPPUNIT_ASSERT_EQUAL(0.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell E2", OUString("=$Sheet1.$A$4"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// InsertDeleteFlags::ALL +void TestCopyPaste::testCopyPasteSpecialAllAsLinkFilteredTranspose() +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc. + + m_pDoc->InsertTab(srcSheet, "Sheet1"); + m_pDoc->InsertTab(destSheet, "Sheet2"); + + m_pDoc->SetValue(0, 0, srcSheet, 1); // A1 + m_pDoc->SetValue(0, 1, srcSheet, 2); // A2 + m_pDoc->SetValue(0, 3, srcSheet, 4); // A4 + + // Filter row 1 + ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3); + m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData)); + + pDBData->SetAutoFilter(true); + ScRange aRange; + pDBData->GetArea(aRange); + m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), + aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); + + //create the query param + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + ScQueryEntry& rEntry = aParam.GetEntry(0); + rEntry.bDoQuery = true; + rEntry.nField = 0; + rEntry.eOp = SC_NOT_EQUAL; + rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 + // add queryParam to database range. + pDBData->SetQueryParam(aParam); + + // perform the query. + m_pDoc->Query(srcSheet, aParam, true); + + // Check precondition for test: row 1 is hidden/filtered + SCROW nRow1, nRow2; + SCROW nFilteredRow1, nFilteredRow2; + bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2); + CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2); + bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2); + CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2); + + // Copy A1:A4 to clip. + ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aSrcRange, &aClipDoc); + + // transpose + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false); + + ScRange aDestRange(1, 1, destSheet, 3, 1, destSheet); // Paste to B2:D2 on Sheet2. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true, + false, false); + pTransClip.reset(); + + OUString aString; + // Check pasted content to make sure they reference the correct cells. + ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC); + m_pDoc->GetFormula(1, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell B2", OUString("=$Sheet1.$A$1"), aString); + CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(2, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell C2", OUString("=$Sheet1.$A$3"), aString); + CPPUNIT_ASSERT_EQUAL(0.0, pFC->GetValue()); + + pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet)); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + m_pDoc->GetFormula(3, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula cell D2", OUString("=$Sheet1.$A$4"), aString); + CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +// This method is used to create the different copy/paste special test cases. +// Principle: Creation of test cases is parameterized, whereas checking uses a minimum of logic +void TestCopyPaste::executeCopyPasteSpecial(bool bApplyFilter, bool bIncludedFiltered, bool bAsLink, + bool bTranspose, bool bMultiRangeSelection, + bool bSkipEmpty, + ScClipParam::Direction eDirection = ScClipParam::Column, + bool bCalcAll = false, + InsertDeleteFlags aFlags = InsertDeleteFlags::CONTENTS + | InsertDeleteFlags::ATTRIB) +{ + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + const SCTAB srcSheet = 0; + m_pDoc->InsertTab(srcSheet, "SrcSheet"); + + // We need a drawing layer in order to create caption objects. + m_pDoc->InitDrawLayer(m_xDocShell.get()); + ScFieldEditEngine& rEditEngine = m_pDoc->GetEditEngine(); + + /* + | A | B | C | D | E | F | + + 1r | 1 B*| =A1+10 *| a | R1 *| =A1+A3+60 | =SUMIF(A1:A4;"<4") | + 2r | 2 B*| =A2+20 b | b *| R2 *| | *| <- filtered row + 3r | 3 B*| =D3+30 b*| c *| 5 *| B*| | + 4 | 4 | =A2+40 b*| d *| R4 *| =A1+A3+70 *| =B$1+$A$3+80 *| + (5r | 6 | q | r bB*| s bB| t | u |) optional, for row range + (6 | -1 | -2 | -3 | -4 | -5 | -6 |) optional, for row range + (7r | -11 | -12 | -13 | -14 | -15 | -16 |) optional, for row range + (8 | -21 | -22 | -23 | -24 | -25 | -26 |) optional, for row range + + \______________/ \________________________________________/ + col range 1 col range 2 + + * means note attached + B means background + b means border + r means row selected for row range in multi range selection + + The following test scenarios can be created: + + * Filtered row + * Transpose + * All cell types: numbers, strings, formulas, rich text, empty cell + * Notes at different position + * Formula references to rows before and after filtered row + * Double reference (e.g. A1:A3) + * Relative and absolute references + * absolute references are not changed by transposing + * Formatting patterns (e.g. cell backgrounds and borders) + * Multi range selection with direction column and row + + */ + SCCOL nSrcCols = 6; + SCROW nSrcRows = 4; + // Add additional row for MultiRange test cases + if (bMultiRangeSelection) + { + nSrcRows = eDirection == ScClipParam::Row ? nSrcRows + 2 : nSrcRows; + nSrcCols = eDirection == ScClipParam::Column ? nSrcCols + 1 : nSrcCols; + } + + // col A + m_pDoc->SetValue(0, 0, srcSheet, 1); + m_pDoc->SetValue(0, 1, srcSheet, 2); + m_pDoc->SetValue(0, 2, srcSheet, 3); + m_pDoc->SetValue(0, 3, srcSheet, 4); + // col B + m_pDoc->SetString(1, 0, srcSheet, "=A1+10"); + m_pDoc->SetString(1, 1, srcSheet, "=A2+20"); + m_pDoc->SetString(1, 2, srcSheet, "=D3+30"); + m_pDoc->SetString(1, 3, srcSheet, "=A2+40"); + // col C + m_pDoc->SetString(2, 0, srcSheet, "a"); + m_pDoc->SetString(2, 1, srcSheet, "b"); + m_pDoc->SetString(2, 2, srcSheet, "c"); + m_pDoc->SetString(2, 3, srcSheet, "d"); + // col D + rEditEngine.SetTextCurrentDefaults("R1"); + m_pDoc->SetEditText(ScAddress(3, 0, srcSheet), rEditEngine.CreateTextObject()); + rEditEngine.SetTextCurrentDefaults("R2"); + m_pDoc->SetEditText(ScAddress(3, 1, srcSheet), rEditEngine.CreateTextObject()); + m_pDoc->SetValue(3, 2, srcSheet, 5); + rEditEngine.SetTextCurrentDefaults("R4"); + m_pDoc->SetEditText(ScAddress(3, 3, srcSheet), rEditEngine.CreateTextObject()); + // col E + m_pDoc->SetValue(4, 0, srcSheet, 9); + m_pDoc->SetString(4, 0, srcSheet, "=A1+A3+60"); + m_pDoc->SetEmptyCell(ScAddress(4, 1, srcSheet)); + m_pDoc->SetEmptyCell(ScAddress(4, 2, srcSheet)); + m_pDoc->SetString(4, 3, srcSheet, "=A1+A3+70"); + // col F + m_pDoc->SetValue(5, 0, srcSheet, 9); + m_pDoc->SetString(5, 0, srcSheet, "=SUMIF(A1:A4;\"<4\")"); + m_pDoc->SetEmptyCell(ScAddress(5, 1, srcSheet)); + m_pDoc->SetEmptyCell(ScAddress(5, 2, srcSheet)); + m_pDoc->SetString(5, 3, srcSheet, "=B$1+$A$3+80"); + + const SfxPoolItem* pItem = nullptr; + + // row 4, additional row for MultiRange test case, otherwise not selected + m_pDoc->SetValue(0, 4, srcSheet, 6); + m_pDoc->SetString(1, 4, srcSheet, "q"); + m_pDoc->SetString(2, 4, srcSheet, "r"); + m_pDoc->SetString(3, 4, srcSheet, "s"); + m_pDoc->SetString(4, 4, srcSheet, "t"); + m_pDoc->SetString(5, 4, srcSheet, "u"); + + // row 5, not selected + m_pDoc->SetValue(0, 5, srcSheet, -1); + m_pDoc->SetValue(1, 5, srcSheet, -2); + m_pDoc->SetValue(2, 5, srcSheet, -3); + m_pDoc->SetValue(3, 5, srcSheet, -4); + m_pDoc->SetValue(4, 5, srcSheet, -5); + m_pDoc->SetValue(5, 5, srcSheet, -6); + + // row 6, additional row for MultiRange test case, otherwise not selected + m_pDoc->SetValue(0, 6, srcSheet, -11); + m_pDoc->SetValue(1, 6, srcSheet, -12); + m_pDoc->SetValue(2, 6, srcSheet, -13); + m_pDoc->SetValue(3, 6, srcSheet, -14); + m_pDoc->SetValue(4, 6, srcSheet, -15); + m_pDoc->SetValue(5, 6, srcSheet, -16); + + // row 7, additional row for MultiRange test case, otherwise not selected + m_pDoc->SetValue(0, 7, srcSheet, -21); + m_pDoc->SetValue(1, 7, srcSheet, -22); + m_pDoc->SetValue(2, 7, srcSheet, -23); + m_pDoc->SetValue(3, 7, srcSheet, -24); + m_pDoc->SetValue(4, 7, srcSheet, -25); + m_pDoc->SetValue(5, 7, srcSheet, -26); + + // Col G, not selected + m_pDoc->SetValue(6, 0, srcSheet, 111); + m_pDoc->SetValue(6, 1, srcSheet, 112); + m_pDoc->SetValue(6, 2, srcSheet, 113); + m_pDoc->SetValue(6, 3, srcSheet, 114); + m_pDoc->SetValue(6, 4, srcSheet, 115); + m_pDoc->SetValue(6, 5, srcSheet, 116); + + // Col H, additional col for MultiRange test case, otherwise not selected + m_pDoc->SetValue(7, 0, srcSheet, 121); + m_pDoc->SetValue(7, 1, srcSheet, 122); + m_pDoc->SetValue(7, 2, srcSheet, 123); + m_pDoc->SetValue(7, 3, srcSheet, 124); + m_pDoc->SetValue(7, 4, srcSheet, 125); + m_pDoc->SetValue(7, 5, srcSheet, 126); + + // Col J, not selected + m_pDoc->SetValue(8, 0, srcSheet, 131); + m_pDoc->SetValue(8, 1, srcSheet, 132); + m_pDoc->SetValue(8, 2, srcSheet, 133); + m_pDoc->SetValue(8, 3, srcSheet, 134); + m_pDoc->SetValue(8, 4, srcSheet, 135); + m_pDoc->SetValue(8, 5, srcSheet, 136); + + // add patterns + ScPatternAttr aCellBlueColor(m_pDoc->GetPool()); + aCellBlueColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND)); + m_pDoc->ApplyPatternAreaTab(0, 0, 0, 2, srcSheet, aCellBlueColor); + + // Check pattern precondition + m_pDoc->GetPattern(ScAddress(0, 0, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("SrcSheet.A1 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(0, 1, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("SrcSheet.A2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(0, 3, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("SrcSheet.A4 has no pattern", !pItem); + + // row 2 on empty cell + ScPatternAttr aCellGreenColor(m_pDoc->GetPool()); + aCellGreenColor.GetItemSet().Put(SvxBrushItem(COL_GREEN, ATTR_BACKGROUND)); + m_pDoc->ApplyPatternAreaTab(4, 2, 4, 2, srcSheet, aCellGreenColor); + + // row 4 for multi range row selection + ScPatternAttr aCellRedColor(m_pDoc->GetPool()); + aCellRedColor.GetItemSet().Put(SvxBrushItem(COL_RED, ATTR_BACKGROUND)); + m_pDoc->ApplyPatternAreaTab(2, 4, 3, 4, srcSheet, aCellRedColor); + + // add borders + ::editeng::SvxBorderLine aLine(nullptr, 50, SvxBorderLineStyle::SOLID); + SvxBoxItem aBorderItem(ATTR_BORDER); + aBorderItem.SetLine(&aLine, SvxBoxItemLine::LEFT); + aBorderItem.SetLine(&aLine, SvxBoxItemLine::RIGHT); + m_pDoc->ApplyAttr(1, 1, srcSheet, aBorderItem); + m_pDoc->ApplyAttr(1, 2, srcSheet, aBorderItem); + m_pDoc->ApplyAttr(1, 3, srcSheet, aBorderItem); + // Check border precondition + pItem = m_pDoc->GetAttr(ScAddress(1, 0, srcSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("SrcSheet.B1 has a border", pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + pItem = m_pDoc->GetAttr(ScAddress(1, 1, srcSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("SrcSheet.B2 has a border", pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + // Check border precondition 2 + m_pDoc->GetPattern(ScAddress(1, 1, srcSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); + CPPUNIT_ASSERT_MESSAGE("SrcSheet.B2 has a border", pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + // row 4 for multi range row selection + ::editeng::SvxBorderLine aDoubleLine(nullptr, 50, SvxBorderLineStyle::DOUBLE); + SvxBoxItem aDoubleBorderItem(ATTR_BORDER); + aDoubleBorderItem.SetLine(&aDoubleLine, SvxBoxItemLine::TOP); + aDoubleBorderItem.SetLine(&aDoubleLine, SvxBoxItemLine::BOTTOM); + m_pDoc->ApplyAttr(2, 4, srcSheet, aDoubleBorderItem); + m_pDoc->ApplyAttr(3, 4, srcSheet, aDoubleBorderItem); + + // add notes to A1:F4 + + // add notes row 0 + ScAddress aAdrA1(0, 0, srcSheet); + ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAdrA1); + pNoteA1->SetText(aAdrA1, "Hello world in A1"); + ScAddress aAdrB1(1, 0, srcSheet); + ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAdrB1); + pNoteB1->SetText(aAdrB1, "Hello world in B1"); + // No note on C1 + ScAddress aAdrD1(3, 0, srcSheet); + ScPostIt* pNoteD1 = m_pDoc->GetOrCreateNote(aAdrD1); + pNoteD1->SetText(aAdrD1, "Hello world in D1"); + // No note on E1 + // No note on F1 + + // add notes row 1 + ScAddress aAdrA2(0, 1, srcSheet); + ScPostIt* pNoteA2 = m_pDoc->GetOrCreateNote(aAdrA2); + pNoteA2->SetText(aAdrA2, "Hello world in A2"); + // No note on B2 + ScAddress aAdrC2(2, 1, srcSheet); + ScPostIt* pNoteC2 = m_pDoc->GetOrCreateNote(aAdrC2); + pNoteC2->SetText(aAdrC2, "Hello world in C2"); + ScAddress aAdrD2(3, 1, srcSheet); + ScPostIt* pNoteD2 = m_pDoc->GetOrCreateNote(aAdrD2); + pNoteD2->SetText(aAdrD2, "Hello world in D2"); + ScAddress aAdrE2(4, 2, srcSheet); + ScPostIt* pNoteE2 = m_pDoc->GetOrCreateNote(aAdrE2); + pNoteE2->SetText(aAdrE2, "Hello world in E2"); + ScAddress aAdrF2(5, 1, srcSheet); + ScPostIt* pNoteF2 = m_pDoc->GetOrCreateNote(aAdrF2); + pNoteF2->SetText(aAdrF2, "Hello world in F2"); + + // add notes row 2 + ScAddress aAdrA3(0, 2, srcSheet); + ScPostIt* pNoteA3 = m_pDoc->GetOrCreateNote(aAdrA3); + pNoteA3->SetText(aAdrA3, "Hello world in A3"); + ScAddress aAdrB3(1, 2, srcSheet); + ScPostIt* pNoteB3 = m_pDoc->GetOrCreateNote(aAdrB3); + pNoteB3->SetText(aAdrB3, "Hello world in B3"); + ScAddress aAdrC3(2, 2, srcSheet); + ScPostIt* pNoteC3 = m_pDoc->GetOrCreateNote(aAdrC3); + pNoteC3->SetText(aAdrC3, "Hello world in C3"); + ScAddress aAdrD3(3, 2, srcSheet); + ScPostIt* pNoteD3 = m_pDoc->GetOrCreateNote(aAdrD3); + pNoteD3->SetText(aAdrD3, "Hello world in D3"); + // No note on E3 + // No note on F3 + + // add notes row 3 + // No note on A4 + ScAddress aAdrB4(1, 3, srcSheet); + ScPostIt* pNoteB4 = m_pDoc->GetOrCreateNote(aAdrB4); + pNoteB4->SetText(aAdrB4, "Hello world in B4"); + ScAddress aAdrC4(2, 3, srcSheet); + ScPostIt* pNoteC4 = m_pDoc->GetOrCreateNote(aAdrC4); + pNoteC4->SetText(aAdrC4, "Hello world in C4"); + ScAddress aAdrD4(3, 3, srcSheet); + ScPostIt* pNoteD4 = m_pDoc->GetOrCreateNote(aAdrD4); + pNoteD4->SetText(aAdrD4, "Hello world in D4"); + ScAddress aAdrE4(4, 3, srcSheet); + ScPostIt* pNoteE4 = m_pDoc->GetOrCreateNote(aAdrE4); + pNoteE4->SetText(aAdrE4, "Hello world in E4"); + ScAddress aAdrF4(5, 3, srcSheet); + ScPostIt* pNoteF4 = m_pDoc->GetOrCreateNote(aAdrF4); + pNoteF4->SetText(aAdrF4, "Hello world in F4"); + + // row 4 for multi range row selection + ScAddress aAdrC5(2, 4, srcSheet); + ScPostIt* pNoteC5 = m_pDoc->GetOrCreateNote(aAdrC5); + pNoteC5->SetText(aAdrC5, "Hello world in C5"); + + // Filter out row 1 + if (bApplyFilter) + { + ScDBData* pDBData + = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, nSrcCols - 1, nSrcRows - 1); + m_pDoc->SetAnonymousDBData(srcSheet, std::unique_ptr<ScDBData>(pDBData)); + + pDBData->SetAutoFilter(true); + ScRange aRange; + pDBData->GetArea(aRange); + m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), + aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto); + + //create the query param + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + ScQueryEntry& rEntry = aParam.GetEntry(0); + rEntry.bDoQuery = true; + rEntry.nField = 0; + rEntry.eOp = SC_NOT_EQUAL; + rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1 + // add queryParam to database range. + pDBData->SetQueryParam(aParam); + + // perform the query. + m_pDoc->Query(srcSheet, aParam, true); + + // Check precondition for test: row 1 is hidden/filtered + SCROW nRow1, nRow2; + SCROW nFilteredRow1, nFilteredRow2; + bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2); + CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2); + bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2); + CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2); + } + + // create destination sheet + const SCTAB destSheet = 1; + m_pDoc->InsertTab(destSheet, "DestSheet"); + // set cells to 1000 to check empty cell behaviour and to detect destination range problems + for (int i = 0; i < 10; ++i) + for (int j = 0; j < 10; ++j) + m_pDoc->SetValue(i, j, destSheet, 1000); + + // transpose clipboard, paste on DestSheet + ScDocument aNewClipDoc(SCDOCMODE_CLIP); + ScMarkData aDestMark(m_pDoc->GetSheetLimits()); + if (!bMultiRangeSelection) + { + ScRange aSrcRange(0, 0, srcSheet, nSrcCols - 1, nSrcRows - 1, srcSheet); + copyToClip(m_pDoc, aSrcRange, &aNewClipDoc); + + // ScDocument::TransposeClip() and ScDocument::CopyFromClip() calls + // analog to ScViewFunc::PasteFromClip() + if (bTranspose) + { + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aNewClipDoc.TransposeClip(pTransClip.get(), aFlags, bAsLink, bIncludedFiltered); + ScRange aDestRange(3, 1, destSheet, 3 + nSrcRows - 1, 1 + nSrcCols - 1, + destSheet); //target: D2:F6 + aDestMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, nullptr, pTransClip.get(), true, + bAsLink, bIncludedFiltered, bSkipEmpty); + pTransClip.reset(); + } + else + { + ScRange aDestRange(3, 1, destSheet, 3 + nSrcCols - 1, 1 + nSrcRows - 1, + destSheet); //target: D2:I5 + aDestMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, nullptr, &aNewClipDoc, true, + bAsLink, bIncludedFiltered, bSkipEmpty); + } + } + else + { + ScMarkData aSrcMark(m_pDoc->GetSheetLimits()); + aSrcMark.SelectOneTable(0); + ScClipParam aClipParam; + aClipParam.meDirection = eDirection; + if (eDirection == ScClipParam::Column) + { + aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 1, 3, srcSheet)); // A1:B4 + aClipParam.maRanges.push_back(ScRange(3, 0, srcSheet, 5, 3, srcSheet)); // D1:F4 + aClipParam.maRanges.push_back(ScRange(7, 0, srcSheet, 7, 3, srcSheet)); // H1:H4 + } + else if (eDirection == ScClipParam::Row) + { + aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 5, 2, srcSheet)); // A1:F3 + aClipParam.maRanges.push_back(ScRange(0, 4, srcSheet, 5, 4, srcSheet)); // A5:F5 + aClipParam.maRanges.push_back(ScRange(0, 6, srcSheet, 5, 6, srcSheet)); // A7:F7 + } + CPPUNIT_ASSERT(aClipParam.isMultiRange()); + m_pDoc->CopyToClip(aClipParam, &aNewClipDoc, &aSrcMark, false, false); + + // ScDocument::TransposeClip() and ScDocument::CopyMultiRangeFromClip() calls + // analog to ScViewFunc::PasteFromClipToMultiRanges() + if (bTranspose) + { + printRange(m_pDoc, aClipParam.getWholeRange(), "Src range"); + ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP)); + aNewClipDoc.TransposeClip(pTransClip.get(), aFlags, bAsLink, bIncludedFiltered); + ScRange aDestRange(3, 1, destSheet, 3 + nSrcRows - 1, 1 + nSrcCols - 1 - 1, + destSheet); //target col: D2:G6, target row: D2:H6 + aDestMark.SetMarkArea(aDestRange); + printRange(&aNewClipDoc, ScRange(0, 0, 0, nSrcCols, nSrcRows, 0), + "Base doc (&aNewClipDoc)"); + printRange(pTransClip.get(), ScRange(0, 0, 0, nSrcCols, nSrcRows, 0), + "Transposed filtered clipdoc (pTransClip.get())"); + m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 1, destSheet), aDestMark, aFlags, + pTransClip.get(), true, bAsLink && !bTranspose, + bIncludedFiltered, bSkipEmpty); + pTransClip.reset(); + printRange(m_pDoc, aDestRange, "Transposed dest sheet"); + } + else + { + ScRange aDestRange(3, 1, destSheet, 3 + nSrcCols - 1 - 1, 1 + nSrcRows - 1, + destSheet); //target col: D2:I5, target row: D2:I6 + aDestMark.SetMarkArea(aDestRange); + m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 1, destSheet), aDestMark, aFlags, + &aNewClipDoc, true, bAsLink && !bTranspose, + bIncludedFiltered, bSkipEmpty); + } + } + if (bCalcAll) + m_pDoc->CalcAll(); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); +} + +void TestCopyPaste::testCopyPasteSpecial() +{ + executeCopyPasteSpecial(false, false, false, false, false, false); + checkCopyPasteSpecial(false); +} + +void TestCopyPaste::testCopyPasteSpecialFiltered() +{ + executeCopyPasteSpecial(true, false, false, false, false, false); + checkCopyPasteSpecialFiltered(false); +} + +void TestCopyPaste::testCopyPasteSpecialIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(false, true, false, false, false, false); + checkCopyPasteSpecial(false); +} + +void TestCopyPaste::testCopyPasteSpecialFilteredIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, false, false, false); + checkCopyPasteSpecial(false); +} + +// similar to TestCopyPaste::testCopyPasteTranspose(), but this test is more complex +void TestCopyPaste::testCopyPasteSpecialTranspose() +{ + executeCopyPasteSpecial(false, false, false, true, false, false); + checkCopyPasteSpecialTranspose(false); +} + +// tdf#107348 +void TestCopyPaste::testCopyPasteSpecialFilteredTranspose() +{ + executeCopyPasteSpecial(true, false, false, true, false, false); + checkCopyPasteSpecialFilteredTranspose(false); +} + +// tdf#107348 +void TestCopyPaste::testCopyPasteSpecialTransposeIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, true, false, false); + checkCopyPasteSpecialTranspose(false); +} + +void TestCopyPaste::testCopyPasteSpecialMultiRangeCol() +{ + executeCopyPasteSpecial(false, false, false, false, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeCol(false); +} + +void TestCopyPaste::testCopyPasteSpecialMultiRangeColIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(false, true, false, false, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeCol(false); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialMultiRangeColFiltered() +{ + executeCopyPasteSpecial(true, false, false, false, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColFiltered(false); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, false, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeCol(false); +} + +void TestCopyPaste::testCopyPasteSpecialMultiRangeColTranspose() +{ + executeCopyPasteSpecial(false, false, false, true, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColTranspose(false); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialMultiRangeColFilteredTranspose() +{ + executeCopyPasteSpecial(true, false, false, true, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColFilteredTranspose(false); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, true, true, false, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColTranspose(false); +} + +void TestCopyPaste::testCopyPasteSpecialMultiRangeRow() +{ + executeCopyPasteSpecial(false, false, false, false, true, false, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRow(false); +} + +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(false, true, false, false, true, false, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRow(false); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFiltered() +{ + executeCopyPasteSpecial(true, false, false, false, true, false, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRowFiltered(false); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, false, true, false, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRow(false); +} + +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowTranspose() +{ + executeCopyPasteSpecial(false, false, false, true, true, false, ScClipParam::Row, true); + checkCopyPasteSpecialMultiRangeRowTranspose(false); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFilteredTranspose() +{ + executeCopyPasteSpecial(true, false, false, true, true, false, ScClipParam::Row, true); + checkCopyPasteSpecialMultiRangeRowFilteredTranspose(false); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, true, true, false, ScClipParam::Row, true); + checkCopyPasteSpecialMultiRangeRowTranspose(false); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmpty() +{ + executeCopyPasteSpecial(false, false, false, false, false, true); + checkCopyPasteSpecial(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyFiltered() +{ + executeCopyPasteSpecial(true, false, false, false, false, true); + checkCopyPasteSpecialFiltered(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(false, true, false, false, false, true); + checkCopyPasteSpecial(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, false, false, true); + checkCopyPasteSpecial(true); +} + +// similar to TestCopyPaste::testCopyPasteTranspose(), but this test is more complex +void TestCopyPaste::testCopyPasteSpecialSkipEmptyTranspose() +{ + executeCopyPasteSpecial(false, false, false, true, false, true); + checkCopyPasteSpecialTranspose(true); +} + +// tdf#107348 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyFilteredTranspose() +{ + executeCopyPasteSpecial(true, false, false, true, false, true); + checkCopyPasteSpecialFilteredTranspose(true); +} + +// tdf#107348 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, true, false, true); + checkCopyPasteSpecialTranspose(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeCol() +{ + executeCopyPasteSpecial(false, false, false, false, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeCol(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(false, true, false, false, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeCol(true); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFiltered() +{ + executeCopyPasteSpecial(true, false, false, false, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColFiltered(true); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, false, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeCol(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColTranspose() +{ + executeCopyPasteSpecial(false, false, false, true, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColTranspose(true); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, false, false, true, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColFilteredTranspose(true); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, true, true, true, ScClipParam::Column); + checkCopyPasteSpecialMultiRangeColTranspose(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRow() +{ + executeCopyPasteSpecial(false, false, false, false, true, true, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRow(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(false, true, false, false, true, true, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRow(true); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered() +{ + executeCopyPasteSpecial(true, false, false, false, true, true, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRowFiltered(true); +} + +// tdf#45958 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, false, true, true, ScClipParam::Row); + checkCopyPasteSpecialMultiRangeRow(true); +} + +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose() +{ + executeCopyPasteSpecial(false, false, false, true, true, true, ScClipParam::Row, true); + checkCopyPasteSpecialMultiRangeRowTranspose(true); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose() +{ + executeCopyPasteSpecial(true, false, false, true, true, true, ScClipParam::Row, true); + checkCopyPasteSpecialMultiRangeRowFilteredTranspose(true); +} + +// tdf#45958, tdf#107348 +void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose() +{ + // For bIncludeFiltered=true, the non-filtered outcome is expected + executeCopyPasteSpecial(true, true, false, true, true, true, ScClipParam::Row, true); + checkCopyPasteSpecialMultiRangeRowTranspose(true); +} + +// Base check, nothing filtered, nothing transposed +void TestCopyPaste::checkCopyPasteSpecial(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | H | I | + + 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | + 3 | 2 B*| =D3+20 b | b *| R2 *| | *| + 4 | 3 B*| =G4+30 b*| c *| 5 *| B*| | + 5 | 4 | =D3+40 b*| d *| R4 *| =D2+D4+70 *| =E$1+$A$3+80 *| + + * means note attached + B means background + b means border + */ + + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // col 2 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + // col 3, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(3, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); + // col 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), aString); + ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(35, m_pDoc->GetValue(4, 3, destSheet)); + m_pDoc->GetFormula(4, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), aString); + ASSERT_DOUBLES_EQUAL(42, m_pDoc->GetValue(4, 4, destSheet)); + m_pDoc->GetFormula(4, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D3+40"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + // col 5, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + aString = m_pDoc->GetString(5, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(5, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); + aString = m_pDoc->GetString(5, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("b"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); + aString = m_pDoc->GetString(5, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("d"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + aString = m_pDoc->GetString(5, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 6, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 2, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // col 7, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + aString = m_pDoc->GetString(7, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(7, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); + ASSERT_DOUBLES_EQUAL(64, m_pDoc->GetValue(7, 1, destSheet)); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + } + fValue = m_pDoc->GetValue(7, 4, destSheet); + m_pDoc->GetFormula(7, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+70"), aString); + ASSERT_DOUBLES_EQUAL(74, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 8, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); + aString = m_pDoc->GetString(8, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(8, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(8, 1, destSheet)); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(8, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(8, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 3, destSheet)); + } + fValue = m_pDoc->GetValue(8, 4, destSheet); + m_pDoc->GetFormula(8, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=E$1+$A$3+80"), aString); + ASSERT_DOUBLES_EQUAL(2080, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); + aString = m_pDoc->GetString(8, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 9, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(8, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(8, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 5, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(8, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(8, 4, destSheet))->GetText()); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); +} + +void TestCopyPaste::checkCopyPasteSpecialFiltered(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | H | I | + + 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | + 3 | 3 B*| =G3+30 b*| c *| 5 *| B*| | + 4 | 4 | =D2+40 b*| d *| R4 *| =D1+D3+70 *| =E$1+$A$3+80 *| + 5 | 1 B*| =D5+10 *| a | R1 *| =D5+D7+60 | =SUMIF(D5:D8;"<4") | <- repeated row + + * means note attached + B means background + b means border + */ + + OUString aString; + double fValue; + const EditTextObject* pEditObj; + + // col 2 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + // col 3, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 3, destSheet)); + fValue = m_pDoc->GetValue(3, 4, destSheet); // repeated row 1 + ASSERT_DOUBLES_EQUAL(1, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); + // col 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + m_pDoc->GetFormula(4, 0, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), aString); + ASSERT_DOUBLES_EQUAL(35, fValue); + fValue = m_pDoc->GetValue(4, 3, destSheet); + m_pDoc->GetFormula(4, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), aString); + ASSERT_DOUBLES_EQUAL(41, fValue); + fValue = m_pDoc->GetValue(4, 4, destSheet); // repeated row 1 + ASSERT_DOUBLES_EQUAL(11, fValue); + m_pDoc->GetFormula(4, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D5+10"), aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + // col 5, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + aString = m_pDoc->GetString(5, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); + aString = m_pDoc->GetString(5, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("d"), aString); + aString = m_pDoc->GetString(5, 4, destSheet); // repeated row 1 + CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + m_pDoc->GetFormula(4, 5, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + // col 6, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 2, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); // repeated row 1 + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // col 7, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + aString = m_pDoc->GetString(7, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(7, 1, destSheet, aString); + fValue = m_pDoc->GetValue(7, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); + ASSERT_DOUBLES_EQUAL(65, fValue); // formula is not adjusted due to filter row + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + fValue = m_pDoc->GetValue(7, 3, destSheet); + m_pDoc->GetFormula(7, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D1+D3+70"), aString); + ASSERT_DOUBLES_EQUAL(1073, fValue); + m_pDoc->GetFormula(7, 4, destSheet, aString); // repeated row 1 + fValue = m_pDoc->GetValue(7, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("=D5+D7+60"), aString); + ASSERT_DOUBLES_EQUAL(1061, fValue); // formula is not adjusted due to filter row + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 8, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); + aString = m_pDoc->GetString(8, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(8, 1, destSheet, aString); + fValue = m_pDoc->GetValue(8, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(5, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(8, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); + fValue = m_pDoc->GetValue(8, 3, destSheet); + m_pDoc->GetFormula(8, 3, destSheet, aString); + ASSERT_DOUBLES_EQUAL(2080, fValue); + CPPUNIT_ASSERT_EQUAL(OUString("=E$1+$A$3+80"), aString); + m_pDoc->GetFormula(8, 4, destSheet, aString); // repeated row 1 + fValue = m_pDoc->GetValue(8, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D5:D8;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(1, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); + aString = m_pDoc->GetString(8, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 9, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(7, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(8, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 5, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(8, 3, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialTranspose(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | + + 2 | 1 B*| 2 B*| 3 B*| 4 | + 3 | =D2+10 *| =E2+20 b | =F5+30 b*| =E2+40 b*| + 4 | a | b *| c *| d *| + 5 | R1 *| R2 *| 5 *| R4 *| + 6 | =D2+F2+60 | | B*| =D2+F2+70 *| + 7 | =SUMIF(D2:G2;"<4") | *| | =C$1+$A$1+80 *| + + * means note attached + B means background + b means border + */ + + //check cell content after transposed copy/paste of filtered data + // Note: column F is a repetition of srcSheet.Column A + // Col C and G are checked to be empty + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // row 0 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + // row 1, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); + fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 2, fValue); + fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 3, fValue); + fValue = m_pDoc->GetValue(6, 1, destSheet); // G2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell G2", 4, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 1, destSheet)); + // row 2, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + aString = m_pDoc->GetString(2, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), + aString); + fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on E2", OUString("=E2+20"), + aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 22, fValue); + m_pDoc->GetFormula(5, 2, destSheet, aString); // F3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F3 should point on F2", OUString("=F5+30"), + aString); + fValue = m_pDoc->GetValue(5, 2, destSheet); // F3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 35, fValue); + m_pDoc->GetFormula(6, 2, destSheet, aString); // G3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G3 should point on E2", OUString("=E2+40"), + aString); + fValue = m_pDoc->GetValue(6, 2, destSheet); // G3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G3", 42, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 3, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + aString = m_pDoc->GetString(2, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(3, 3, destSheet); // D4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); + aString = m_pDoc->GetString(4, 3, destSheet); // E4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: b", OUString("b"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); // F4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: c", OUString("c"), aString); + aString = m_pDoc->GetString(6, 3, destSheet); // G4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: d", OUString("d"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 4, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), + pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(4, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in E5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong E5.", OUString("R2"), pEditObj->GetText(0)); + fValue = m_pDoc->GetValue(5, 4, destSheet); // F5 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F5", 5, fValue); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in G5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong G5.", OUString("R4"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr); + // row 5, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); + fValue = m_pDoc->GetValue(3, 5, destSheet); // D6 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 64, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 5, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(5, 5, destSheet); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + } + fValue = m_pDoc->GetValue(6, 5, destSheet); // G6 + m_pDoc->GetFormula(6, 5, destSheet, aString); // G6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G6", OUString("=D2+F2+70"), aString); + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G6", 74, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 6, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); + aString = m_pDoc->GetString(2, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), + aString); + fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", 6, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 6, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(5, 6, destSheet); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 6, destSheet)); + } + fValue = m_pDoc->GetValue(6, 6, destSheet); // G7 + m_pDoc->GetFormula(6, 6, destSheet, aString); // G7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G7", OUString("=C$1+$A$3+80"), aString); + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G7", 2080, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); + aString = m_pDoc->GetString(7, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 7 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has blue background", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("F2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("F2 has a pattern", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("D3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("D3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("D3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + + CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("E3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("E3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("F3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("F3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("G3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("G3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("G3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("G3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("H3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("H3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("H3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", + !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", + !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", + !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", + !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", + !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H1", + !m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", + !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", + m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", + m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F2", + m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G2", + !m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H2", + !m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", + !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", + m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E3", + !m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", + m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G3", + m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H3", + !m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", + !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", + !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", + m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", + m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G4", + m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H4", + !m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", + !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", + m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", + m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", + m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G5", + m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H5", + !m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", + !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", + !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E6", + !m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G6", + m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H6", + !m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", + !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", + !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F7", + !m_pDoc->HasNote(ScAddress(5, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note a G7", + m_pDoc->HasNote(ScAddress(6, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H7", + !m_pDoc->HasNote(ScAddress(7, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", + !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", + !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", + !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", + !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", + !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H8", + !m_pDoc->HasNote(ScAddress(7, 7, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", + m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", + m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F2", + m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); + // G2 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", + m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + // E3 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F3", + m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + // D4 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", + m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F4", + m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", + m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", + m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F5", + m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on G6", + m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 5, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E7", + m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 6, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on G7", + m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 6, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + ┌--- filtered src row 2 ┌--- repeated row + v v + + | D | E | F | G | + + 2 | 1 B*| 3 B*| 4 | 1 B*| + 3 | =D2+10 *| =E5+30 b*| =D2+40 b*| =G2+10 *| + 4 | a | c *| d *| a | + 5 | R1 *| 5 *| R4 *| R1 *| + 6 | =D2+F2+60 | B*| =C2+E2+70 *| =G2+I2+60 | + 7 | =SUMIF(D2:G2;"<4") | | =B$1+$A$1+80 *| =SUMIF(G2:J2;"<4") | + + * means note attached + */ + + //check cell content after transposed copy/paste of filtered data + // Note: column F is a repetition of srcSheet.Column A + // Col C and G are checked to be empty + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // row 0 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + // row 1, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + aString = m_pDoc->GetString(2, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); + fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 3, fValue); + fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 4, fValue); + fValue = m_pDoc->GetValue(6, 1, destSheet); // G2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell G2 (repetition of D2)", 1, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 1, destSheet)); + aString = m_pDoc->GetString(7, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 2, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + aString = m_pDoc->GetString(2, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); + m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), + aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on E2", OUString("=E5+30"), + aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 35, fValue); + m_pDoc->GetFormula(5, 2, destSheet, aString); // F3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F3 should point on F2", OUString("=D2+40"), + aString); + fValue = m_pDoc->GetValue(5, 2, destSheet); // F3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 41, fValue); + fValue = m_pDoc->GetValue(6, 2, destSheet); // G3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 11, fValue); + m_pDoc->GetFormula(6, 2, destSheet, aString); // G3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G3 should point on G2 (repetition of D3)", + OUString("=G2+10"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 3, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + aString = m_pDoc->GetString(2, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(3, 3, destSheet); // D4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); + aString = m_pDoc->GetString(4, 3, destSheet); // E4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: c", OUString("c"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); // F4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: d", OUString("d"), aString); + aString = m_pDoc->GetString(6, 3, destSheet); // G4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: a (repetition of D4)", OUString("a"), + aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 4, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), + pEditObj->GetText(0)); + fValue = m_pDoc->GetValue(4, 4, destSheet); // E5 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E5", 5, fValue); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in F5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong F5.", OUString("R4"), pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in G5. (repetition of D5)", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong G5. (repetition of D5)", OUString("R1"), + pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr); + // row 5, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); + fValue = m_pDoc->GetValue( + ScAddress(3, 5, destSheet)); // D6, formulas over filtered rows are not adjusted + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 65, + fValue); // formulas over filtered rows are not adjusted + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 5, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + m_pDoc->GetFormula(5, 5, destSheet, aString); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F6", OUString("=C2+E2+70"), aString); + fValue = m_pDoc->GetValue( + ScAddress(5, 5, destSheet)); // F6, formulas over filtered rows are not adjusted + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F6", 1073, fValue); + m_pDoc->GetFormula(6, 5, destSheet, aString); // G6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G6 (repetition of D6)", OUString("=G2+I2+60"), + aString); + fValue = m_pDoc->GetValue(6, 5, destSheet); // G6 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G6 (repetition of D6)", 1061, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 6, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); + aString = m_pDoc->GetString(2, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), + aString); + fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", 5, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 6, destSheet); // E7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); + m_pDoc->GetFormula(5, 6, destSheet, aString); // F7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F7", OUString("=B$1+$A$3+80"), aString); + fValue = m_pDoc->GetValue(5, 6, destSheet); // F7 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F6", 2080, fValue); + m_pDoc->GetFormula(6, 6, destSheet, aString); // G7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula G7 (repetition of D7)", + OUString("=SUMIF(G2:J2;\"<4\")"), aString); + fValue = m_pDoc->GetValue(6, 5, destSheet); // G7 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula G7 (repetition of D7)", 1061, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); + aString = m_pDoc->GetString(7, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + + // row + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + + // check patterns + + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("F2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("G2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("G2 has a pattern", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(4, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("D3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("D3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("D3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("E3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("E3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("F3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("F3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("G3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("G3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("G3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("G3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("G3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("H3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("H3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("H3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", + !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", + !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", + !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", + !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", + !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H1", + !m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", + !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", + m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", + m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F2", + !m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G2", + m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H2", + !m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", + !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", + m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E3", + m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", + m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G3", + m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H3", + !m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", + !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", + !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", + m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", + m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G4", + !m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H4", + !m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", + !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", + m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", + m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", + m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G5", + m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H5", + !m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", + !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", + !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F6", + m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G6", + !m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H6", + !m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", + !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", + !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E7", + !m_pDoc->HasNote(ScAddress(4, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note a F7", + m_pDoc->HasNote(ScAddress(5, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G7", + !m_pDoc->HasNote(ScAddress(6, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H7", + !m_pDoc->HasNote(ScAddress(7, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", + !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", + !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", + !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", + !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", + !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H8", + !m_pDoc->HasNote(ScAddress(7, 7, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", + m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", + m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + // F2 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on G2", + m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", + m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E3", + m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F3", + m_pDoc->GetNote(ScAddress(1, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on G3", + m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); + // D4 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", + m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F4", + m_pDoc->GetNote(ScAddress(2, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + // G4 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", + m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", + m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F5", + m_pDoc->GetNote(ScAddress(3, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on G5", + m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 5, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F6", + m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F7", + m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 6, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + ┌--- not selected src col C + v + + | D | E | F | G | H | I | + + 2 | 1 B*| =D2+10 *| R1 *| =C2+C4+60 | =SUMIF(C2:C5;"<4") | 121 | + 3 | 2 B*| =D3+20 b | R2 *| | *| 122 | <- filtered row + 4 | 3 B*| =G4+30 b*| 5 *| B*| | 123 | + 5 | 4 | =D3+40 b*| R4 *| =C2+C4+70 *| =D$1+$A$1+80 *| 124 | + + * means note attached + B means background + b means border + */ + + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // col 2 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + // col 3, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(3, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); + // col 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + aString = m_pDoc->GetString(4, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), aString); + ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); + fValue = m_pDoc->GetValue(4, 3, destSheet); + m_pDoc->GetFormula(4, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), + aString); // references over selection gaps are not adjusted + ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 + fValue = m_pDoc->GetValue(4, 4, destSheet); + m_pDoc->GetFormula(4, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D3+40"), aString); + ASSERT_DOUBLES_EQUAL(42, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + aString = m_pDoc->GetString(4, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 5, strings are not selected + // col 5, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + aString = m_pDoc->GetString(4, 5, destSheet); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 0, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 1, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 2, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(5, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 5, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // col 6, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + aString = m_pDoc->GetString(6, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(6, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+60"), aString); + ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(6, 1, destSheet)); // It was 64 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(6, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(6, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 3, destSheet)); + } + fValue = m_pDoc->GetValue(6, 4, destSheet); + m_pDoc->GetFormula(6, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+70"), aString); + ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); + aString = m_pDoc->GetString(6, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 7, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + aString = m_pDoc->GetString(7, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(7, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL( + OUString("=SUMIF(C2:C5;\"<4\")"), + aString); // CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(7, 1, destSheet)); // It was 6 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + } + fValue = m_pDoc->GetValue(7, 4, destSheet); + m_pDoc->GetFormula(7, 4, destSheet, aString); + ASSERT_DOUBLES_EQUAL(2080, fValue); + CPPUNIT_ASSERT_EQUAL(OUString("=D$1+$A$3+80"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 8, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(8, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(122, m_pDoc->GetValue(8, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(8, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(8, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); + // col 9, col repetition is not supported for multi range copy/paste + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(6, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 4, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + ┌--- not selected src col C + v + + | D | E | F | G | H | I | + + 2 | 1 B*| =D2+10 *| R1 *| =C2+C4+60 | =SUMIF(C2:C5;"<4") | 121 | + 3 | 3 B*| =G4+30 b*| 5 *| B*| | 123 | + 4 | 4 | =D2+40 b*| R4 *| =C1+C3+70 *| =D$1+$A$1+80 *| 124 | + + * means note attached + B means background + b means border + */ + + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // col 2 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + // col 3, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(3, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 4, destSheet)); + // col 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + m_pDoc->GetFormula(4, 0, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), + aString); // references over selection gaps are not adjusted + ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 + fValue = m_pDoc->GetValue(4, 3, destSheet); + m_pDoc->GetFormula(4, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), aString); + ASSERT_DOUBLES_EQUAL(41, fValue); // was originally 42, not adjusted by filtering + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 4, destSheet)); + m_pDoc->GetFormula(4, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + // col 5, strings are not selected + // col 5, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 0, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 1, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(5, 2, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // col 6, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + m_pDoc->GetFormula(6, 0, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + m_pDoc->GetFormula(6, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+60"), aString); + ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(6, 1, destSheet)); // It was 64 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(6, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 2, destSheet)); + fValue = m_pDoc->GetValue(6, 3, destSheet); + m_pDoc->GetFormula(6, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=C1+C3+70"), aString); + ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 4, destSheet)); + m_pDoc->GetFormula(6, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + // col 7, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + m_pDoc->GetFormula(7, 0, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + m_pDoc->GetFormula(7, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(C2:C5;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(7, 1, destSheet)); // It was 6 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + fValue = m_pDoc->GetValue(7, 3, destSheet); + m_pDoc->GetFormula(7, 3, destSheet, aString); + ASSERT_DOUBLES_EQUAL(2080, fValue); + CPPUNIT_ASSERT_EQUAL(OUString("=D$1+$A$3+80"), aString); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); + m_pDoc->GetFormula(7, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + // col 8, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(8, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(8, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(8, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 4, destSheet)); + // col 9, col repetition is not supported for multi range copy/paste + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(6, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | + + 2 | 1 B*| 2 B*| 3 B*| 4 | + 3 | =D2+10 *| =E2+20 b | =F5+30 b*| =E2+40 b*| + 4 | R1 *| R2 *| 5 *| R4 *| + 5 | =D1+F1+60 | | B*| =D1+F1+70 *| + 6 | =SUMIF(D1:G1;"<4") | *| | =C$1+$A$1+80 *| + 7 | 121 | 122 | 123 | 124 | + + * means note attached + B means background + b means border + */ + + // check cell content after transposed copy/paste of filtered data + // Col C and G are checked to be empty + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // row 0 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + // row 1, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(4, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(5, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(6, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 1, destSheet)); + // row 2, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + aString = m_pDoc->GetString(2, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(3, 2, destSheet)); + m_pDoc->GetFormula(3, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=E2+20"), aString); + ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); + fValue = m_pDoc->GetValue(5, 2, destSheet); + m_pDoc->GetFormula(5, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=F5+30"), aString); + ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 + fValue = m_pDoc->GetValue(6, 2, destSheet); + m_pDoc->GetFormula(6, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=E2+40"), aString); + ASSERT_DOUBLES_EQUAL(42, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 3, strings was not selected in multi range selection + // row 3, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(2, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(3, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(4, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(5, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(7, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // row 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + aString = m_pDoc->GetString(2, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+60"), aString); + ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(3, 4, destSheet)); // It was 64 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 4, destSheet); // E5 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(5, 4, destSheet); // F5 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 4, destSheet)); + } + fValue = m_pDoc->GetValue(6, 4, destSheet); + m_pDoc->GetFormula(6, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+70"), aString); + ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); + aString = m_pDoc->GetString(7, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 5, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 5, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D1:G1;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(3, 5, destSheet)); // It was 6 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 5, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(5, 5, destSheet); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + } + + fValue = m_pDoc->GetValue(6, 5, destSheet); + m_pDoc->GetFormula(6, 5, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=C$1+$A$3+80"), aString); + ASSERT_DOUBLES_EQUAL(2080, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 6, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(3, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(122, m_pDoc->GetValue(4, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(5, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(6, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); + // row 7, not selected + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + // std::cout << "bSkipEmpty: " << bSkipEmpty << ", pItem == nullptr: " << (pItem == nullptr) << std::endl; + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 6, destSheet))); + + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 5, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 5, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + ┌--- filtered src row 2 + v + + | D | E | F | + + 2 | 1 B*| 3 B*| 4 | + 3 | =D2+10 *| =E5+30 b*| =D2+40 b*| + <- not copied col C + 4 | R1 *| 5 *| R4 *| + 5 | =D1+F1+60 | B*| =C1+E1+70 *| + 6 | =SUMIF(D1:G1;"<4") | | =B$1+$A$1+80 *| + 7 | 121 | 123 | 124 | + + * means note attached + B means background + b means border + */ + + // check cell content after transposed copy/paste of filtered data + // Col C and G are checked to be empty + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // row 0 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + // row 1, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(4, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(4, m_pDoc->GetValue(5, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 1, destSheet)); + // row 2, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(3, 2, destSheet)); + m_pDoc->GetFormula(3, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=E5+30"), aString); + ASSERT_DOUBLES_EQUAL(bSkipEmpty ? 1030 : 30, fValue); // It was 35 + fValue = m_pDoc->GetValue(5, 2, destSheet); + m_pDoc->GetFormula(5, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), aString); + ASSERT_DOUBLES_EQUAL(41, fValue); // was originally 42, not adjusted by filtering + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 2, destSheet)); + aString = m_pDoc->GetString(6, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 3, strings was not selected in multi range selection + // row 3, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(2, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(3, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(4, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(5, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 3, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // row 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + aString = m_pDoc->GetString(2, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+60"), + aString); // formulas over filtered rows are not adjusted + ASSERT_DOUBLES_EQUAL(2060, m_pDoc->GetValue(3, 4, destSheet)); // It was 64 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 4, destSheet)); + fValue = m_pDoc->GetValue(5, 4, destSheet); + m_pDoc->GetFormula(5, 4, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=C1+E1+70"), + aString); // formulas over filtered rows are not adjusted + ASSERT_DOUBLES_EQUAL(2070, fValue); // It was 74 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 4, destSheet)); + aString = m_pDoc->GetString(6, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 5, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 5, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D1:G1;\"<4\")"), + aString); // formulas over filtered rows are not adjusted + ASSERT_DOUBLES_EQUAL(0, m_pDoc->GetValue(3, 5, destSheet)); // It was 6 + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 5, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + fValue = m_pDoc->GetValue(5, 5, destSheet); + m_pDoc->GetFormula(5, 5, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=B$1+$A$3+80"), aString); + ASSERT_DOUBLES_EQUAL(2080, fValue); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); + aString = m_pDoc->GetString(6, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 6, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(121, m_pDoc->GetValue(3, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(123, m_pDoc->GetValue(4, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(124, m_pDoc->GetValue(5, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 6, destSheet)); + // row 7, not copied + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + // row 8, not copied + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(4, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 6, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 6, destSheet))); + + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 3, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | H | I | + + 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | + 3 | 2 B*| =D3+20 b | b *| R2 *| | *| <- filtered row + 4 | 3 B*| =G4+30 b*| c *| 5 *| B*| | + <- not selected row + 5 | 6 | q | r bB*| s bB| t | u | + 6 | -11 | -12 | -13 | -14 | -15 | -16 | + + * means note attached + B means background + b means border + */ + + OUString aString; + const EditTextObject* pEditObj; + // col 2 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + // col 3, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(3, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(3, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(3, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 6, destSheet)); + // col 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + aString = m_pDoc->GetString(4, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), aString); + ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(4, 2, destSheet)); + m_pDoc->GetFormula(4, 3, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), aString); + ASSERT_DOUBLES_EQUAL(35, m_pDoc->GetValue(4, 3, destSheet)); + aString = m_pDoc->GetString(4, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("q"), aString); + ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(4, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); + aString = m_pDoc->GetString(4, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 5, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + aString = m_pDoc->GetString(5, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(5, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); + aString = m_pDoc->GetString(5, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("b"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); + aString = m_pDoc->GetString(5, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("r"), aString); + ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(5, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 6, destSheet)); + aString = m_pDoc->GetString(5, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 6, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 2, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 3, destSheet)); + aString = m_pDoc->GetString(6, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("s"), aString); + ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(6, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 6, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 6, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // col 7, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + aString = m_pDoc->GetString(7, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(7, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); + ASSERT_DOUBLES_EQUAL(64, m_pDoc->GetValue(7, 1, destSheet)); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + } + aString = m_pDoc->GetString(7, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("t"), aString); + ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(7, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); + aString = m_pDoc->GetString(7, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 8, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); + aString = m_pDoc->GetString(7, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(8, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(8, 1, destSheet)); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(8, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(8, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 3, destSheet)); + } + aString = m_pDoc->GetString(8, 4, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("u"), aString); + ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(8, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 6, destSheet)); + aString = m_pDoc->GetString(8, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 9 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + m_pDoc->GetPattern(ScAddress(4, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(6, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(7, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + pItem = m_pDoc->GetAttr(ScAddress(3, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(7, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(8, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 5, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 5, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 3, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(8, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | H | I | + + 2 | 1 B*| =D2+10 *| a | R1 *| =D2+D4+60 | =SUMIF(D2:D5;"<4") | + 3 | 3 B*| =G3+30 b*| c *| 5 *| B*| | + <- not selected + 4 | 6 | q | r | s | t | u | + 5 | -11 | -12 |-13 | -14 | -15 | -16 | + + * means note attached + B means background + b means border + */ + + OUString aString; + const EditTextObject* pEditObj; + // col 2 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + // col 3, numbers + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(3, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(3, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(3, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(3, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 5, destSheet)); + // col 4, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + aString = m_pDoc->GetString(4, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + ASSERT_DOUBLES_EQUAL(11, m_pDoc->GetValue(4, 1, destSheet)); + m_pDoc->GetFormula(4, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), aString); + ASSERT_DOUBLES_EQUAL(35, m_pDoc->GetValue(4, 2, destSheet)); + aString = m_pDoc->GetString(4, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("q"), aString); + ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(4, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + aString = m_pDoc->GetString(4, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 5, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + aString = m_pDoc->GetString(5, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(5, 1, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("a"), aString); + aString = m_pDoc->GetString(5, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("c"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("r"), aString); + ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(5, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + aString = m_pDoc->GetString(5, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 6, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet)); + CPPUNIT_ASSERT(pEditObj); + CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0)); + ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(6, 2, destSheet)); + aString = m_pDoc->GetString(6, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("s"), aString); + ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(6, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 5, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet)); + CPPUNIT_ASSERT(pEditObj == nullptr); + // col 7, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + aString = m_pDoc->GetString(7, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(7, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), aString); + ASSERT_DOUBLES_EQUAL(67, m_pDoc->GetValue(7, 1, destSheet)); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("t"), aString); + ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(7, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 8, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 0, destSheet)); + aString = m_pDoc->GetString(8, 0, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(8, 1, destSheet, aString); + CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), aString); + ASSERT_DOUBLES_EQUAL(6, m_pDoc->GetValue(8, 1, destSheet)); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(8, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); + aString = m_pDoc->GetString(8, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("u"), aString); + ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(8, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); + aString = m_pDoc->GetString(8, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // col 9 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 1, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(9, 5, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(7, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + m_pDoc->GetPattern(ScAddress(4, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(5, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(6, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + pItem = m_pDoc->GetAttr(ScAddress(3, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(7, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 0, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 1, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 2, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT(m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 3, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(8, 4, destSheet))); + CPPUNIT_ASSERT(!m_pDoc->HasNote(ScAddress(9, 4, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 2, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(7, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | H | + + 2 | 1 B*| 2 B*| 3 B*| 6 | -11 | + 3 | =D2+10 *| =E2+20 b | =F5+30 b*| q | -12 | + 4 | a | b *| c *| r | -13 | + 5 | R1 *| R2 *| 5 *| s | -14 | + 6 | =D2+F2+60 | | B*| t | -15 | + 7 | =SUMIF(D2:G2;"<4") | *| | u | -16 | + + * means note attached + B means background + b means border + */ + + //check cell content after transposed copy/paste of filtered data + // Note: column F is a repetition of srcSheet.Column A + // Col C and G are checked to be empty + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // row 0 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + // row 1, numbers + fValue = m_pDoc->GetValue(2, 1, destSheet); // C2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell C2", 1000, fValue); + fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); + fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 2, fValue); + fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 3, fValue); + fValue = m_pDoc->GetValue(6, 1, destSheet); // G2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell G2", 6, fValue); + ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(7, 1, destSheet)); + fValue = m_pDoc->GetValue(8, 1, destSheet); // I2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell I2", 1000, fValue); + // row 2, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + aString = m_pDoc->GetString(2, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); + m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), + aString); + m_pDoc->GetFormula(4, 2, destSheet, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on E2", OUString("=E2+20"), + aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 22, fValue); + fValue = m_pDoc->GetValue(5, 2, destSheet); // F3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula F3", 35, fValue); + m_pDoc->GetFormula(5, 2, destSheet, aString); // F3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula F3 should point on F2", OUString("=F5+30"), + aString); + aString = m_pDoc->GetString(6, 2, destSheet); // G3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: q", OUString("q"), aString); + ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(7, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 2, destSheet)); + aString = m_pDoc->GetString(8, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 3, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + aString = m_pDoc->GetString(2, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(3, 3, destSheet); // D4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); + aString = m_pDoc->GetString(4, 3, destSheet); // E4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: b", OUString("b"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); // F4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: c", OUString("c"), aString); + aString = m_pDoc->GetString(6, 3, destSheet); // G4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 should contain: r", OUString("r"), aString); + ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(7, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 3, destSheet)); + aString = m_pDoc->GetString(8, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 4, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), + pEditObj->GetText(0)); + pEditObj = m_pDoc->GetEditText(ScAddress(4, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in E5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong E5.", OUString("R2"), pEditObj->GetText(0)); + fValue = m_pDoc->GetValue(5, 4, destSheet); // F5 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F5", 5, fValue); + aString = m_pDoc->GetString(6, 4, destSheet); // G5 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G5 should contain: s", OUString("s"), aString); + ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(7, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(8, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in I5.", pEditObj == nullptr); + // row 5, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); + fValue = m_pDoc->GetValue(3, 5, destSheet); // D6 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 64, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 5, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(5, 5, destSheet); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 5, destSheet)); + } + aString = m_pDoc->GetString(6, 5, destSheet); // G6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G6 should contain: t", OUString("t"), aString); + ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(7, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 5, destSheet)); + aString = m_pDoc->GetString(8, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 6, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); + aString = m_pDoc->GetString(2, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), + aString); + fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", 6, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 6, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + aString = m_pDoc->GetString(5, 6, destSheet); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + { + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 6, destSheet)); + } + aString = m_pDoc->GetString(6, 6, destSheet); // G4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G7 should contain: u", OUString("u"), aString); + ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(7, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(8, 6, destSheet)); + aString = m_pDoc->GetString(8, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 7 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has blue background", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("F2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("F2 has a pattern", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("D3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("D3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("D3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("E3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("E3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("F3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("F3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("G3 has top border", !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("G3 has bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("G3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("G3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("H3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("H3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("H3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", + !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", + !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", + !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", + !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", + !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H1", + !m_pDoc->HasNote(ScAddress(7, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", + !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", + m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", + m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F2", + m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G2", + !m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H2", + !m_pDoc->HasNote(ScAddress(7, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", + !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", + m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E3", + !m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", + m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G3", + !m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H3", + !m_pDoc->HasNote(ScAddress(7, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", + !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", + !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", + m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", + m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G4", + m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H4", + !m_pDoc->HasNote(ScAddress(7, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", + !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", + m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", + m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", + m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G5", + !m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H5", + !m_pDoc->HasNote(ScAddress(7, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", + !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", + !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E6", + !m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on G6", + !m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H6", + !m_pDoc->HasNote(ScAddress(7, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", + !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", + !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F7", + !m_pDoc->HasNote(ScAddress(5, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note a G7", + !m_pDoc->HasNote(ScAddress(6, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H7", + !m_pDoc->HasNote(ScAddress(7, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", + !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", + !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", + !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", + !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", + !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on H8", + !m_pDoc->HasNote(ScAddress(7, 7, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", + m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", + m_pDoc->GetNote(ScAddress(0, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F2", + m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 1, destSheet))->GetText()); + // G2 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", + m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + // E3 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F3", + m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 2, destSheet))->GetText()); + // D4 has no note + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", + m_pDoc->GetNote(ScAddress(2, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on F4", + m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", + m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", + m_pDoc->GetNote(ScAddress(3, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on F5", + m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 5, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E7", + m_pDoc->GetNote(ScAddress(5, 1, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 6, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(6, 3, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty) +{ + const SCTAB srcSheet = 0; + const SCTAB destSheet = 1; + + ScFormulaOptions aOldOptions, aNewOptions; + aOldOptions = SC_MOD()->GetFormulaOptions(); + aNewOptions.SetFormulaSepArg(";"); + m_xDocShell->SetFormulaOptions(aNewOptions); + + /* + | D | E | F | G | + + 2 | 1 B*| 3 B*| 6 | -11 | + 3 | =D2+10 *| =F5+30 b*| q | -12 | + 4 | a | c *| r | -13 | + 5 | R1 *| 5 *| s | -14 | + 6 | =D2+F2+60 | B*| t | -15 | + 7 | =SUMIF(D2:G2;"<4") | | u | -16 | + + * means note attached + B means background + b means border + */ + + //check cell content after transposed copy/paste of filtered data + // Note: column F is a repetition of srcSheet.Column A + // Col C and G are checked to be empty + OUString aString; + double fValue; + const EditTextObject* pEditObj; + // row 0 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 0, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 0, destSheet)); + // row 1, numbers + fValue = m_pDoc->GetValue(2, 1, destSheet); // C2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell C2", 1000, fValue); + fValue = m_pDoc->GetValue(3, 1, destSheet); // D2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell D2", 1, fValue); + fValue = m_pDoc->GetValue(4, 1, destSheet); // E2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E2", 3, fValue); + fValue = m_pDoc->GetValue(5, 1, destSheet); // F2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell F2", 6, fValue); + ASSERT_DOUBLES_EQUAL(-11, m_pDoc->GetValue(6, 1, destSheet)); + fValue = m_pDoc->GetValue(7, 1, destSheet); // H2 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell H2", 1000, fValue); + // row 2, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 2, destSheet)); + aString = m_pDoc->GetString(2, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + fValue = m_pDoc->GetValue(3, 2, destSheet); // D3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D3", 11, fValue); + m_pDoc->GetFormula(3, 2, destSheet, aString); // D3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D3 should point on D2", OUString("=D2+10"), + aString); + fValue = m_pDoc->GetValue(4, 2, destSheet); // E3 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula E3", 35, fValue); + m_pDoc->GetFormula(4, 2, destSheet, aString); // E3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula E3 should point on F2", OUString("=E5+30"), + aString); + aString = m_pDoc->GetString(5, 2, destSheet); // F3 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: q", OUString("q"), aString); + ASSERT_DOUBLES_EQUAL(-12, m_pDoc->GetValue(6, 2, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 2, destSheet)); + aString = m_pDoc->GetString(7, 2, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 3, strings + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 3, destSheet)); + aString = m_pDoc->GetString(2, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + aString = m_pDoc->GetString(3, 3, destSheet); // D4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4 should contain: a", OUString("a"), aString); + aString = m_pDoc->GetString(4, 3, destSheet); // E4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4 should contain: c", OUString("c"), aString); + aString = m_pDoc->GetString(5, 3, destSheet); // F4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4 should contain: r", OUString("r"), aString); + ASSERT_DOUBLES_EQUAL(-13, m_pDoc->GetValue(6, 3, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 3, destSheet)); + aString = m_pDoc->GetString(7, 3, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 4, rich text + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr); + pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"), + pEditObj->GetText(0)); + fValue = m_pDoc->GetValue(4, 4, destSheet); // E5 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell E5", 5, fValue); + aString = m_pDoc->GetString(5, 4, destSheet); // F5 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F5 should contain: s", OUString("s"), aString); + ASSERT_DOUBLES_EQUAL(-14, m_pDoc->GetValue(6, 4, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 4, destSheet)); + pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet)); + CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr); + // row 5, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 5, destSheet)); + aString = m_pDoc->GetString(2, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 5, destSheet, aString); // D6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D6", OUString("=D2+F2+60"), aString); + fValue = m_pDoc->GetValue(3, 5, destSheet); // D6 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D6", 67, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 5, destSheet); // E6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 5, destSheet)); + aString = m_pDoc->GetString(5, 5, destSheet); // F6 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F6 should contain: t", OUString("t"), aString); + ASSERT_DOUBLES_EQUAL(-15, m_pDoc->GetValue(6, 5, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 5, destSheet)); + aString = m_pDoc->GetString(7, 5, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 6, formulas + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 6, destSheet)); + aString = m_pDoc->GetString(2, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + m_pDoc->GetFormula(3, 6, destSheet, aString); // D7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula D7", OUString("=SUMIF(D2:G2;\"<4\")"), + aString); + fValue = m_pDoc->GetValue(3, 6, destSheet); // D7 + ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula D7", -7, fValue); + if (!bSkipEmpty) + { + aString = m_pDoc->GetString(4, 6, destSheet); // E7 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, aString); + } + else + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 6, destSheet)); + aString = m_pDoc->GetString(5, 6, destSheet); // F4 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F7 should contain: u", OUString("u"), aString); + ASSERT_DOUBLES_EQUAL(-16, m_pDoc->GetValue(6, 6, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 6, destSheet)); + aString = m_pDoc->GetString(7, 6, destSheet); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aString); + // row 7 + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(2, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(3, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(4, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(5, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(6, 7, destSheet)); + ASSERT_DOUBLES_EQUAL(1000, m_pDoc->GetValue(7, 7, destSheet)); + + // check patterns + const SfxPoolItem* pItem = nullptr; + m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem); + CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has a pattern", COL_BLUE, + static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("F2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem); + m_pDoc->GetPattern(ScAddress(4, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + + m_pDoc->GetPattern(ScAddress(5, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(5, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor()); + m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + m_pDoc->GetPattern(ScAddress(5, 6, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem); + CPPUNIT_ASSERT(!pItem); + + // check border, left and right borders were transformed to top and bottom borders + pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("D3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("D3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("D3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("E3 has bottom border", + static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("E3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("E3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("F3 has top border", !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("F3 has bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("F3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("F3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT_MESSAGE("G3 has a border", pItem); + CPPUNIT_ASSERT_MESSAGE("G3 has no top border", + !static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT_MESSAGE("G3 has no bottom border", + !static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT_MESSAGE("G3 has no left border", + !static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT_MESSAGE("G3 has no right border", + !static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 3, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + pItem = m_pDoc->GetAttr(ScAddress(5, 4, destSheet), ATTR_BORDER); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop()); + CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft()); + CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight()); + + // check notes after transposed copy/paste + // check presence of notes + CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", + !m_pDoc->HasNote(ScAddress(2, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D1", + !m_pDoc->HasNote(ScAddress(3, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E1", + !m_pDoc->HasNote(ScAddress(4, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F1", + !m_pDoc->HasNote(ScAddress(5, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G1", + !m_pDoc->HasNote(ScAddress(6, 0, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C2", + !m_pDoc->HasNote(ScAddress(2, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D2", + m_pDoc->HasNote(ScAddress(3, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E2", + m_pDoc->HasNote(ScAddress(4, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F2", + !m_pDoc->HasNote(ScAddress(5, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G2", + !m_pDoc->HasNote(ScAddress(6, 1, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C3", + !m_pDoc->HasNote(ScAddress(2, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D3", + m_pDoc->HasNote(ScAddress(3, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E3", + m_pDoc->HasNote(ScAddress(4, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F3", + !m_pDoc->HasNote(ScAddress(5, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G3", + !m_pDoc->HasNote(ScAddress(6, 2, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C4", + !m_pDoc->HasNote(ScAddress(2, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D4", + !m_pDoc->HasNote(ScAddress(3, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E4", + m_pDoc->HasNote(ScAddress(4, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F4", + m_pDoc->HasNote(ScAddress(5, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G4", + !m_pDoc->HasNote(ScAddress(6, 3, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C5", + !m_pDoc->HasNote(ScAddress(2, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D5", + m_pDoc->HasNote(ScAddress(3, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on E5", + m_pDoc->HasNote(ScAddress(4, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F5", + !m_pDoc->HasNote(ScAddress(5, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G5", + !m_pDoc->HasNote(ScAddress(6, 4, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C6", + !m_pDoc->HasNote(ScAddress(2, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D6", + !m_pDoc->HasNote(ScAddress(3, 5, destSheet))); + CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(ScAddress(4, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be a note on F6", + !m_pDoc->HasNote(ScAddress(5, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G6", + !m_pDoc->HasNote(ScAddress(6, 5, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C7", + !m_pDoc->HasNote(ScAddress(2, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D7", + !m_pDoc->HasNote(ScAddress(3, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E7", + !m_pDoc->HasNote(ScAddress(4, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note a F7", + !m_pDoc->HasNote(ScAddress(5, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G7", + !m_pDoc->HasNote(ScAddress(6, 6, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on C8", + !m_pDoc->HasNote(ScAddress(2, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on D8", + !m_pDoc->HasNote(ScAddress(3, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on E8", + !m_pDoc->HasNote(ScAddress(4, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on F8", + !m_pDoc->HasNote(ScAddress(5, 7, destSheet))); + CPPUNIT_ASSERT_MESSAGE("There should be no note on G8", + !m_pDoc->HasNote(ScAddress(6, 7, destSheet))); + + // check values of notes + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D2", + m_pDoc->GetNote(ScAddress(0, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E2", + m_pDoc->GetNote(ScAddress(0, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 1, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on D3", + m_pDoc->GetNote(ScAddress(1, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E3", + m_pDoc->GetNote(ScAddress(1, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 2, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong content of cell note on E4", + m_pDoc->GetNote(ScAddress(2, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 3, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on D5", + m_pDoc->GetNote(ScAddress(3, 0, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(3, 4, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on E5", + m_pDoc->GetNote(ScAddress(3, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 4, destSheet))->GetText()); + if (!bSkipEmpty) + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(4, 2, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(4, 5, destSheet))->GetText()); + CPPUNIT_ASSERT_EQUAL(m_pDoc->GetNote(ScAddress(2, 4, srcSheet))->GetText(), + m_pDoc->GetNote(ScAddress(5, 3, destSheet))->GetText()); + + // restore formula options back to default + m_xDocShell->SetFormulaOptions(aOldOptions); + + m_pDoc->DeleteTab(destSheet); + m_pDoc->DeleteTab(srcSheet); +} + +void TestCopyPaste::testCopyPasteMultiRange() +{ + m_pDoc->InsertTab(0, "Test"); + + // Fill A2:B6 with numbers. + for (SCROW nRow = 1; nRow <= 5; ++nRow) + { + for (SCCOL nCol = 0; nCol <= 1; ++nCol) + { + ScAddress aPos(nCol, nRow, 0); + m_pDoc->SetValue(aPos, nRow + nCol); + } + } + + // Fill D9:E11 with numbers. + for (SCROW nRow = 8; nRow <= 10; ++nRow) + { + for (SCCOL nCol = 3; nCol <= 4; ++nCol) + { + ScAddress aPos(nCol, nRow, 0); + m_pDoc->SetValue(aPos, 10.0); + } + } + + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SelectOneTable(0); + + // Copy A2:B2, A4:B4, and A6:B6 to clipboard. + ScDocument aClipDoc(SCDOCMODE_CLIP); + ScClipParam aClipParam; + aClipParam.maRanges.push_back(ScRange(0, 1, 0, 1, 1, 0)); // A2:B2 + aClipParam.maRanges.push_back(ScRange(0, 3, 0, 1, 3, 0)); // A4:B4 + aClipParam.maRanges.push_back(ScRange(0, 5, 0, 1, 5, 0)); // A6:B6 + aClipParam.meDirection = ScClipParam::Row; + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); + + // Paste to D9:E11, and make sure it won't crash (rhbz#1080196). + m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 8, 0), aMark, InsertDeleteFlags::CONTENTS, + &aClipDoc); + CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(3, 8, 0))); + CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(4, 8, 0))); + CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(ScAddress(3, 9, 0))); + CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(ScAddress(4, 9, 0))); + CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(3, 10, 0))); + CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(4, 10, 0))); + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteSkipEmpty() +{ + struct Check + { + const char* mpStr; + Color maColor; + bool mbHasNote; + }; + + struct TestRange + { + ScDocument* mpDoc; + + explicit TestRange(ScDocument* pDoc) + : mpDoc(pDoc) + { + } + + bool checkRange(const ScAddress& rPos, const Check* p, const Check* pEnd) + { + ScAddress aPos(rPos); + OUString aPosStr = aPos.Format(ScRefFlags::VALID); + for (; p != pEnd; ++p, aPos.IncRow()) + { + if (!mpDoc->GetString(aPos).equalsAscii(p->mpStr)) + { + cerr << aPosStr << ": incorrect string value: expected='" << p->mpStr + << "' actual='" << mpDoc->GetString(aPos) << endl; + return false; + } + + const SvxBrushItem* pBrush = mpDoc->GetAttr(aPos, ATTR_BACKGROUND); + if (!pBrush) + { + cerr << aPosStr << ": failed to get brush item from the cell." << endl; + return false; + } + + if (pBrush->GetColor() != p->maColor) + { + Color aExpected = p->maColor; + Color aActual = pBrush->GetColor(); + cerr << aPosStr << ": incorrect cell background color: expected=(" + << static_cast<int>(aExpected.GetRed()) << "," + << static_cast<int>(aExpected.GetGreen()) << "," + << static_cast<int>(aExpected.GetBlue()) << "), actual=(" + << static_cast<int>(aActual.GetRed()) << "," + << static_cast<int>(aActual.GetGreen()) << "," + << static_cast<int>(aActual.GetBlue()) << ")" << endl; + + return false; + } + + bool bHasNote = mpDoc->HasNote(aPos); + if (bHasNote != p->mbHasNote) + { + cerr << aPosStr << ": "; + if (p->mbHasNote) + cerr << "this cell should have a cell note, but doesn't." << endl; + else + cerr << "this cell should NOT have a cell note, but one is found." << endl; + + return false; + } + } + + return true; + } + + } aTest(m_pDoc); + + m_pDoc->InsertTab(0, "Test"); + m_pDoc->InitDrawLayer(m_xDocShell.get()); // for cell note objects. + + ScRange aSrcRange(0, 0, 0, 0, 4, 0); + ScRange aDestRange(1, 0, 0, 1, 4, 0); + + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + + // Put some texts in B1:B5. + m_pDoc->SetString(ScAddress(1, 0, 0), "A"); + m_pDoc->SetString(ScAddress(1, 1, 0), "B"); + m_pDoc->SetString(ScAddress(1, 2, 0), "C"); + m_pDoc->SetString(ScAddress(1, 3, 0), "D"); + m_pDoc->SetString(ScAddress(1, 4, 0), "E"); + + // Set the background color of B1:B5 to blue. + ScPatternAttr aCellBackColor(m_pDoc->GetPool()); + aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND)); + m_pDoc->ApplyPatternAreaTab(1, 0, 1, 4, 0, aCellBackColor); + + // Insert notes to B1:B5. + m_pDoc->GetOrCreateNote(ScAddress(1, 0, 0)); + m_pDoc->GetOrCreateNote(ScAddress(1, 1, 0)); + m_pDoc->GetOrCreateNote(ScAddress(1, 2, 0)); + m_pDoc->GetOrCreateNote(ScAddress(1, 3, 0)); + m_pDoc->GetOrCreateNote(ScAddress(1, 4, 0)); + + // Prepare a clipboard content interleaved with empty cells. + ScDocument aClipDoc(SCDOCMODE_CLIP); + aClipDoc.ResetClip(m_pDoc, &aMark); + ScClipParam aParam(aSrcRange, false); + aClipDoc.SetClipParam(aParam); + aClipDoc.SetString(ScAddress(0, 0, 0), "Clip1"); + aClipDoc.SetString(ScAddress(0, 2, 0), "Clip2"); + aClipDoc.SetString(ScAddress(0, 4, 0), "Clip3"); + + // Set the background color of A1:A5 to yellow. + aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_YELLOW, ATTR_BACKGROUND)); + aClipDoc.ApplyPatternAreaTab(0, 0, 0, 4, 0, aCellBackColor); + + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0, 0, 0))); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, aClipDoc.GetCellType(ScAddress(0, 1, 0))); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0, 2, 0))); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, aClipDoc.GetCellType(ScAddress(0, 3, 0))); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0, 4, 0))); + + // Check the initial condition. + { + static const Check aChecks[] = { + { "A", COL_BLUE, true }, { "B", COL_BLUE, true }, { "C", COL_BLUE, true }, + { "D", COL_BLUE, true }, { "E", COL_BLUE, true }, + }; + + bool bRes + = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); + CPPUNIT_ASSERT_MESSAGE("Initial check failed.", bRes); + } + + // Create undo document. + ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); + pUndoDoc->InitUndo(*m_pDoc, 0, 0); + m_pDoc->CopyToDocument(aDestRange, InsertDeleteFlags::ALL, false, *pUndoDoc, &aMark); + + // Paste clipboard content onto A1:A5 but skip empty cells. + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, pUndoDoc.get(), &aClipDoc, true, + false, false, true /*bSkipEmpty*/); + + // Create redo document. + ScDocumentUniquePtr pRedoDoc(new ScDocument(SCDOCMODE_UNDO)); + pRedoDoc->InitUndo(*m_pDoc, 0, 0); + m_pDoc->CopyToDocument(aDestRange, InsertDeleteFlags::ALL, false, *pRedoDoc, &aMark); + + // Create an undo object for this. + std::unique_ptr<ScRefUndoData> pRefUndoData(new ScRefUndoData(m_pDoc)); + ScUndoPaste aUndo(m_xDocShell.get(), aDestRange, aMark, std::move(pUndoDoc), + std::move(pRedoDoc), InsertDeleteFlags::ALL, std::move(pRefUndoData)); + + // Check the content after the paste. + { + static const Check aChecks[] = { + { "Clip1", COL_YELLOW, false }, { "B", COL_BLUE, true }, + { "Clip2", COL_YELLOW, false }, { "D", COL_BLUE, true }, + { "Clip3", COL_YELLOW, false }, + }; + + bool bRes + = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); + CPPUNIT_ASSERT_MESSAGE("Check after paste failed.", bRes); + } + + // Undo, and check the content. + aUndo.Undo(); + { + static const Check aChecks[] = { + { "A", COL_BLUE, true }, { "B", COL_BLUE, true }, { "C", COL_BLUE, true }, + { "D", COL_BLUE, true }, { "E", COL_BLUE, true }, + }; + + bool bRes + = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); + CPPUNIT_ASSERT_MESSAGE("Check after undo failed.", bRes); + } + + // Redo, and check the content again. + aUndo.Redo(); + { + static const Check aChecks[] = { + { "Clip1", COL_YELLOW, false }, { "B", COL_BLUE, true }, + { "Clip2", COL_YELLOW, false }, { "D", COL_BLUE, true }, + { "Clip3", COL_YELLOW, false }, + }; + + bool bRes + = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks)); + CPPUNIT_ASSERT_MESSAGE("Check after redo failed.", bRes); + } + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteSkipEmpty2() +{ + m_pDoc->InsertTab(0, "Test"); + + m_pDoc->SetString(ScAddress(0, 0, 0), "A"); + m_pDoc->SetString(ScAddress(2, 0, 0), "C"); + + // Copy A1:C1 to clipboard. + ScDocument aClipDoc(SCDOCMODE_CLIP); + aClipDoc.ResetClip(m_pDoc, static_cast<SCTAB>(0)); + copyToClip(m_pDoc, ScRange(0, 0, 0, 2, 0, 0), &aClipDoc); + + // Paste to A3 with the skip empty option set. This used to freeze. (fdo#77735) + ScRange aDestRange(0, 2, 0, 2, 2, 0); + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false, + false, true, true); + + CPPUNIT_ASSERT_EQUAL(OUString("A"), m_pDoc->GetString(ScAddress(0, 2, 0))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("B3 should be empty.", CELLTYPE_NONE, + m_pDoc->GetCellType(ScAddress(1, 2, 0))); + CPPUNIT_ASSERT_EQUAL(OUString("C"), m_pDoc->GetString(ScAddress(2, 2, 0))); + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCutPasteRefUndo() +{ + // Testing scenario: A2 references B2, and B2 gets cut and pasted onto C2, + // which updates A2's formula to reference C2. Then the paste action gets + // undone, which should also undo A2's formula to reference back to B2. + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. + + m_pDoc->InsertTab(0, "Test"); + + // A2 references B2. + m_pDoc->SetString(ScAddress(0, 1, 0), "=B2"); + + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SelectOneTable(0); + + // Set up clip document for cutting of B2. + ScDocument aClipDoc(SCDOCMODE_CLIP); + aClipDoc.ResetClip(m_pDoc, &aMark); + ScClipParam aParam(ScAddress(1, 1, 0), true); + aClipDoc.SetClipParam(aParam); + aClipDoc.SetValue(ScAddress(1, 1, 0), 12.0); + + // Set up undo document for reference update. + ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); + pUndoDoc->InitUndo(*m_pDoc, 0, 0); + + // Do the pasting of 12 into C2. This should update A2 to reference C2. + m_pDoc->CopyFromClip(ScAddress(2, 1, 0), aMark, InsertDeleteFlags::CONTENTS, pUndoDoc.get(), + &aClipDoc); + CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(0, 1, 0)); + + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 0), "C2", "A2 should be referencing C2."); + + // At this point, the ref undo document should contain a formula cell at A2 that references B2. + ASSERT_FORMULA_EQUAL(*pUndoDoc, ScAddress(0, 1, 0), "B2", + "A2 in the undo document should be referencing B2."); + + ScUndoPaste aUndo(m_xDocShell.get(), ScRange(2, 1, 0), aMark, std::move(pUndoDoc), nullptr, + InsertDeleteFlags::CONTENTS, nullptr, false, nullptr); + aUndo.Undo(); + + // Now A2 should be referencing B2 once again. + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 0), "B2", + "A2 should be referencing B2 after undo."); + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCutPasteGroupRefUndo() +{ + // Test that Cut&Paste part of a grouped formula adjusts references + // correctly and Undo works. + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. + + m_pDoc->InsertTab(0, "Test"); + + // Formula data in A1:A9 + std::vector<std::vector<const char*>> aData + = { { "1" }, { "=A1+A1" }, { "=A2+A1" }, { "=A3+A2" }, { "=A4+A3" }, + { "=A5+A4" }, { "=A6+A5" }, { "=A7+A6" }, { "=A8+A7" } }; + + ScAddress aPos(0, 0, 0); + ScRange aDataRange = insertRangeData(m_pDoc, aPos, aData); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to insert data", aPos, aDataRange.aStart); + + // Check initial data. + const char* aDataCheck[][2] = { { "1", "" }, { "2", "=A1+A1" }, { "3", "=A2+A1" }, + { "5", "=A3+A2" }, { "8", "=A4+A3" }, { "13", "=A5+A4" }, + { "21", "=A6+A5" }, { "34", "=A7+A6" }, { "55", "=A8+A7" } }; + for (size_t i = 0; i < SAL_N_ELEMENTS(aDataCheck); ++i) + { + OUString aString = m_pDoc->GetString(0, i, 0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial data failure", + OUString::createFromAscii(aDataCheck[i][0]), aString); + m_pDoc->GetFormula(0, i, 0, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial formula failure", + OUString::createFromAscii(aDataCheck[i][1]), aString); + } + + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SelectOneTable(0); + + // Set up clip document. + ScDocument aClipDoc(SCDOCMODE_CLIP); + aClipDoc.ResetClip(m_pDoc, &aMark); + // Cut A4:A6 to clipboard with Undo. + std::unique_ptr<ScUndoCut> pUndoCut( + cutToClip(*m_xDocShell, ScRange(0, 3, 0, 0, 5, 0), &aClipDoc, true)); + + // Check data after Cut. + const char* aCutCheck[] = { "1", "2", "3", "", "", "", "0", "0", "0" }; + for (size_t i = 0; i < SAL_N_ELEMENTS(aCutCheck); ++i) + { + OUString aString = m_pDoc->GetString(0, i, 0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cut data failure", OUString::createFromAscii(aCutCheck[i]), + aString); + } + + // Paste to B5:B7 with Undo. + ScRange aPasteRange(1, 4, 0, 1, 6, 0); + aMark.SetMarkArea(aPasteRange); + ScDocument* pPasteUndoDoc = new ScDocument(SCDOCMODE_UNDO); + pPasteUndoDoc->InitUndoSelected(*m_pDoc, aMark); + std::unique_ptr<ScUndoPaste> pUndoPaste( + createUndoPaste(*m_xDocShell, aPasteRange, ScDocumentUniquePtr(pPasteUndoDoc))); + m_pDoc->CopyFromClip(aPasteRange, aMark, InsertDeleteFlags::ALL, pPasteUndoDoc, &aClipDoc); + + // Check data after Paste. + const char* aPasteCheck[][4] = { { "1", "", "", "" }, + { "2", "", "=A1+A1", "" }, + { "3", "", "=A2+A1", "" }, + { "", "", "", "" }, + { "", "5", "", "=A3+A2" }, + { "", "8", "", "=B5+A3" }, + { "21", "13", "=B7+B6", "=B6+B5" }, + { "34", "", "=A7+B7", "" }, + { "55", "", "=A8+A7", "" } }; + for (size_t i = 0; i < SAL_N_ELEMENTS(aPasteCheck); ++i) + { + for (size_t j = 0; j < 2; ++j) + { + OUString aString = m_pDoc->GetString(j, i, 0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Paste data failure", + OUString::createFromAscii(aPasteCheck[i][j]), aString); + m_pDoc->GetFormula(j, i, 0, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Paste formula failure", + OUString::createFromAscii(aPasteCheck[i][2 + j]), aString); + } + } + + // Undo Paste and check, must be same as after Cut. + pUndoPaste->Undo(); + for (size_t i = 0; i < SAL_N_ELEMENTS(aCutCheck); ++i) + { + OUString aString = m_pDoc->GetString(0, i, 0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Paste data failure", + OUString::createFromAscii(aCutCheck[i]), aString); + } + + // Undo Cut and check, must be initial data. + pUndoCut->Undo(); + for (size_t i = 0; i < SAL_N_ELEMENTS(aDataCheck); ++i) + { + OUString aString = m_pDoc->GetString(0, i, 0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Cut data failure", + OUString::createFromAscii(aDataCheck[i][0]), aString); + m_pDoc->GetFormula(0, i, 0, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Cut formula failure", + OUString::createFromAscii(aDataCheck[i][1]), aString); + } + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testMoveRefBetweenSheets() +{ + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. + + m_pDoc->InsertTab(0, "Test1"); + m_pDoc->InsertTab(1, "Test2"); + + m_pDoc->SetValue(ScAddress(0, 0, 0), 12.0); + m_pDoc->SetValue(ScAddress(1, 0, 0), 10.0); + m_pDoc->SetValue(ScAddress(2, 0, 0), 8.0); + m_pDoc->SetString(ScAddress(0, 1, 0), "=A1"); + m_pDoc->SetString(ScAddress(0, 2, 0), "=SUM(A1:C1)"); + + CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0, 0, 0))); + CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0, 1, 0))); + CPPUNIT_ASSERT_EQUAL(30.0, m_pDoc->GetValue(ScAddress(0, 2, 0))); + + // These formulas should not display the sheet name. + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 0), "A1", "Wrong formula!"); + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 2, 0), "SUM(A1:C1)", "Wrong formula!"); + + // Move Test1.A2:A3 to Test2.A2:A3. + ScDocFunc& rFunc = m_xDocShell->GetDocFunc(); + bool bMoved + = rFunc.MoveBlock(ScRange(0, 1, 0, 0, 2, 0), ScAddress(0, 1, 1), true, true, false, true); + CPPUNIT_ASSERT(bMoved); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("This cell should be empty after the move.", CELLTYPE_NONE, + m_pDoc->GetCellType(ScAddress(0, 1, 0))); + ASSERT_DOUBLES_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0, 1, 1))); + ASSERT_DOUBLES_EQUAL(30.0, m_pDoc->GetValue(ScAddress(0, 2, 1))); + + // The reference in the pasted formula should display sheet name after the move. + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 1), "Test1.A1", "Wrong formula!"); + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 2, 1), "SUM(Test1.A1:C1)", "Wrong formula!"); + + m_pDoc->DeleteTab(1); + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testUndoCut() +{ + m_pDoc->InsertTab(0, "Test"); + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc. + + // Insert values into A1:A3. + m_pDoc->SetValue(ScAddress(0, 0, 0), 1.0); + m_pDoc->SetValue(ScAddress(0, 1, 0), 10.0); + m_pDoc->SetValue(ScAddress(0, 2, 0), 100.0); + + // SUM in A4. + m_pDoc->SetString(ScAddress(0, 3, 0), "=SUM(A1:A3)"); + CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0, 3, 0)); + + // Select A1:A3. + ScMarkData aMark(m_pDoc->GetSheetLimits()); + ScRange aRange(0, 0, 0, 0, 2, 0); + aMark.SetMarkArea(aRange); + aMark.MarkToMulti(); + + // Set up an undo object for cutting A1:A3. + ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO)); + pUndoDoc->InitUndo(*m_pDoc, 0, 0); + m_pDoc->CopyToDocument(aRange, InsertDeleteFlags::ALL, false, *pUndoDoc); + ASSERT_DOUBLES_EQUAL(1.0, pUndoDoc->GetValue(ScAddress(0, 0, 0))); + ASSERT_DOUBLES_EQUAL(10.0, pUndoDoc->GetValue(ScAddress(0, 1, 0))); + ASSERT_DOUBLES_EQUAL(100.0, pUndoDoc->GetValue(ScAddress(0, 2, 0))); + ScUndoCut aUndo(m_xDocShell.get(), aRange, aRange.aEnd, aMark, std::move(pUndoDoc)); + + // "Cut" the selection. + m_pDoc->DeleteSelection(InsertDeleteFlags::ALL, aMark); + CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(0, 3, 0)); // The SUM should be zero after the "cut". + + // Undo it, and check the result. + aUndo.Undo(); + ASSERT_DOUBLES_EQUAL(1.0, m_pDoc->GetValue(ScAddress(0, 0, 0))); + ASSERT_DOUBLES_EQUAL(10.0, m_pDoc->GetValue(ScAddress(0, 1, 0))); + ASSERT_DOUBLES_EQUAL(100.0, m_pDoc->GetValue(ScAddress(0, 2, 0))); + ASSERT_DOUBLES_EQUAL( + 111.0, m_pDoc->GetValue(0, 3, 0)); // The SUM value should be back to the original. + + // Redo it and check. + aUndo.Redo(); + ASSERT_DOUBLES_EQUAL(0.0, m_pDoc->GetValue(0, 3, 0)); + + // Undo again. + aUndo.Undo(); + ASSERT_DOUBLES_EQUAL(111.0, m_pDoc->GetValue(0, 3, 0)); + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testMoveBlock() +{ + m_pDoc->InsertTab(0, "SheetNotes"); + + // We need a drawing layer in order to create caption objects. + m_pDoc->InitDrawLayer(m_xDocShell.get()); + + m_pDoc->SetValue(0, 0, 0, 1); + m_pDoc->SetString(1, 0, 0, "=A1+1"); + m_pDoc->SetString(2, 0, 0, "test"); + + // add notes to A1:C1 + ScAddress aAddrA1(0, 0, 0); + ScPostIt* pNoteA1 = m_pDoc->GetOrCreateNote(aAddrA1); + pNoteA1->SetText(aAddrA1, "Hello world in A1"); + ScAddress aAddrB1(1, 0, 0); + ScPostIt* pNoteB1 = m_pDoc->GetOrCreateNote(aAddrB1); + pNoteB1->SetText(aAddrB1, "Hello world in B1"); + ScAddress aAddrC1(2, 0, 0); + ScPostIt* pNoteC1 = m_pDoc->GetOrCreateNote(aAddrC1); + pNoteC1->SetText(aAddrC1, "Hello world in C1"); + ScAddress aAddrD1(3, 0, 0); + + // previous tests on cell note content are ok. this one fails !!! :( + //CPPUNIT_ASSERT_MESSAGE("Note content in B1 before move block", m_pDoc->GetNote(aAddrB1)->GetText() == aHelloB1); + + // move notes to B1:D1 + ScDocFunc& rDocFunc = m_xDocShell->GetDocFunc(); + bool bMoveDone = rDocFunc.MoveBlock(ScRange(0, 0, 0, 2, 0, 0), ScAddress(1, 0, 0), + true /*bCut*/, false, false, false); + + CPPUNIT_ASSERT_MESSAGE("Cells not moved", bMoveDone); + + //check cell content + OUString aString = m_pDoc->GetString(3, 0, 0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D1 should contain: test", OUString("test"), aString); + m_pDoc->GetFormula(2, 0, 0, aString); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C1 should contain an updated formula", OUString("=B1+1"), + aString); + double fValue = m_pDoc->GetValue(aAddrB1); + ASSERT_DOUBLES_EQUAL_MESSAGE("Cell B1 should contain 1", fValue, 1); + + // cell notes has been moved 1 cell right (event when overlapping) + CPPUNIT_ASSERT_MESSAGE("There should be NO note on A1", !m_pDoc->HasNote(aAddrA1)); + CPPUNIT_ASSERT_MESSAGE("There should be a note on B1", m_pDoc->HasNote(aAddrB1)); + CPPUNIT_ASSERT_MESSAGE("There should be a note on C1", m_pDoc->HasNote(aAddrC1)); + CPPUNIT_ASSERT_MESSAGE("There should be a note on D1", m_pDoc->HasNote(aAddrD1)); + /* still failing, wrong content ??? + OUString sNoteText; + sNoteText = m_pDoc->GetNote(aAddrB1)->GetText(); + CPPUNIT_ASSERT_MESSAGE("Note content in B1", sNoteText == aHelloA1); + sNoteText = m_pDoc->GetNote(aAddrC1)->GetText(); + CPPUNIT_ASSERT_MESSAGE("Note content in C1", sNoteText == aHelloB1); + sNoteText = m_pDoc->GetNote(aAddrD1)->GetText(); + CPPUNIT_ASSERT_MESSAGE("Note content in D1", sNoteText == aHelloC1); + */ + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteRelativeFormula() +{ + m_pDoc->InsertTab(0, "Formula"); + + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); + + // Insert values to A2 and A4. + m_pDoc->SetValue(ScAddress(0, 1, 0), 1); + m_pDoc->SetValue(ScAddress(0, 3, 0), 2); + + // Insert formula to B4. + m_pDoc->SetString(ScAddress(1, 3, 0), "=A4"); + CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(1, 3, 0))); + + // Select and copy B3:B4 to the clipboard. + ScRange aRange(1, 2, 0, 1, 3, 0); + ScClipParam aClipParam(aRange, false); + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aRange); + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); + + // Paste it to B1:B2. + InsertDeleteFlags nFlags = InsertDeleteFlags::ALL; + ScRange aDestRange(1, 0, 0, 1, 1, 0); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, nullptr, &aClipDoc); + + // B2 references A2, so the value should be 1. + CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(1, 1, 0))); + + // Clear content and start over. + clearSheet(m_pDoc, 0); + clearSheet(&aClipDoc, 0); + + // Insert a single formula cell in A1. + m_pDoc->SetString(ScAddress(0, 0, 0), "=ROW()"); + const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT(!pFC->IsShared()); // single formula cell is never shared. + + // Copy A1 to clipboard. + aClipParam = ScClipParam(ScAddress(0, 0, 0), false); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); + + pFC = aClipDoc.GetFormulaCell(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT(!pFC->IsShared()); + + // Paste to A3. + aDestRange = ScRange(0, 2, 0, 0, 2, 0); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, nullptr, &aClipDoc); + + pFC = m_pDoc->GetFormulaCell(ScAddress(0, 2, 0)); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT(!pFC->IsShared()); + + // Delete A3 and make sure it doesn't crash (see fdo#76132). + clearRange(m_pDoc, ScAddress(0, 2, 0)); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(ScAddress(0, 2, 0))); + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteRepeatOneFormula() +{ + sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); + + m_pDoc->InsertTab(0, "Test"); + + ScDocument aClipDoc(SCDOCMODE_CLIP); + ScMarkData aMark(m_pDoc->GetSheetLimits()); + + // Insert values in A1:B10. + for (SCROW i = 0; i < 10; ++i) + { + m_pDoc->SetValue(ScAddress(0, i, 0), i + 1.0); // column A + m_pDoc->SetValue(ScAddress(1, i, 0), (i + 1.0) * 10.0); // column B + } + + // Insert a formula in C1. + ScAddress aPos(2, 0, 0); // C1 + m_pDoc->SetString(aPos, "=SUM(A1:B1)"); + CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(aPos)); + + // This check makes only sense if group listeners are activated. +#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER + // At this point, there should be only one normal area listener listening + // on A1:B1. + ScRange aWholeSheet(0, 0, 0, MAXCOL, MAXROW, 0); + ScBroadcastAreaSlotMachine* pBASM = m_pDoc->GetBASM(); + CPPUNIT_ASSERT(pBASM); + std::vector<sc::AreaListener> aListeners + = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); + const sc::AreaListener* pListener = aListeners.data(); + CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 0, 0), pListener->maArea); + CPPUNIT_ASSERT_MESSAGE("This listener shouldn't be a group listener.", + !pListener->mbGroupListening); +#endif + + // Copy C1 to clipboard. + ScClipParam aClipParam(aPos, false); + aMark.SetMarkArea(aPos); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); + + // Paste it to C2:C10. + ScRange aDestRange(2, 1, 0, 2, 9, 0); + aMark.SetMarkArea(aDestRange); + m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &aClipDoc); + + // Make sure C1:C10 are grouped. + const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(aPos); + CPPUNIT_ASSERT(pFC); + CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(10), pFC->GetSharedLength()); + + // Check the formula results. + for (SCROW i = 0; i < 10; ++i) + { + double fExpected = (i + 1.0) * 11.0; + CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2, i, 0))); + } + + // This check makes only sense if group listeners are activated. +#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER + // At this point, there should only be one area listener and it should be + // a group listener listening on A1:B10. + aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); + pListener = aListeners.data(); + CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 9, 0), pListener->maArea); + CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.", + pListener->mbGroupListening); +#endif + + // Insert a new row at row 1. + ScRange aRowOne(0, 0, 0, MAXCOL, 0, 0); + aMark.SetMarkArea(aRowOne); + ScDocFunc& rFunc = m_xDocShell->GetDocFunc(); + rFunc.InsertCells(aRowOne, &aMark, INS_INSROWS_BEFORE, true, true); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("C1 should be empty.", CELLTYPE_NONE, + m_pDoc->GetCellType(ScAddress(2, 0, 0))); + + // This check makes only sense if group listeners are activated. +#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER + // Make there we only have one group area listener listening on A2:B11. + aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); + pListener = aListeners.data(); + CPPUNIT_ASSERT_EQUAL(ScRange(0, 1, 0, 1, 10, 0), pListener->maArea); + CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.", + pListener->mbGroupListening); +#endif + + // Check the formula results. + for (SCROW i = 0; i < 10; ++i) + { + double fExpected = (i + 1.0) * 11.0; + CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2, i + 1, 0))); + } + + // Delete row at row 1 to shift the cells up. + rFunc.DeleteCells(aRowOne, &aMark, DelCellCmd::Rows, true); + + // Check the formula results again. + for (SCROW i = 0; i < 10; ++i) + { + double fExpected = (i + 1.0) * 11.0; + CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2, i, 0))); + } + + // This check makes only sense if group listeners are activated. +#if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER + // Check the group area listener again to make sure it's listening on A1:B10 once again. + aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size()); + pListener = aListeners.data(); + CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 9, 0), pListener->maArea); + CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.", + pListener->mbGroupListening); +#endif + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteMixedReferenceFormula() +{ + sc::AutoCalcSwitch aAC(*m_pDoc, true); // turn on auto calc. + m_pDoc->InsertTab(0, "Test"); + + // Insert value to C3 + m_pDoc->SetValue(2, 2, 0, 1.0); + + // Insert formula to A1 with mixed relative/absolute addressing. + m_pDoc->SetString(0, 0, 0, "=SUM(B:$C)"); + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 0, 0), "SUM(B:$C)", "Wrong formula."); + CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 0, 0)); + + // Copy formula in A1 to clipboard. + ScRange aRange(ScAddress(0, 0, 0)); + ScDocument aClipDoc(SCDOCMODE_CLIP); + copyToClip(m_pDoc, aRange, &aClipDoc); + + // Paste formula to B1. + aRange = ScAddress(1, 0, 0); + pasteFromClip(m_pDoc, aRange, &aClipDoc); + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(1, 0, 0), "SUM(C:$C)", "Wrong formula."); + CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 0, 0)); + CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(1, 0, 0)); + + // Paste formula to C1. All three results now must be circular reference. + aRange = ScAddress(2, 0, 0); + pasteFromClip(m_pDoc, aRange, &aClipDoc); + ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(2, 0, 0), "SUM($C:D)", + "Wrong formula."); // reference put in order + CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(0, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(1, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(2, 0, 0)); + + m_pDoc->DeleteTab(0); +} + +void TestCopyPaste::testCopyPasteFormulas() +{ + m_pDoc->InsertTab(0, "Sheet1"); + m_pDoc->InsertTab(1, "Sheet2"); + + m_pDoc->SetString(0, 0, 0, "=COLUMN($A$1)"); + m_pDoc->SetString(0, 1, 0, "=$A$1+B2"); + m_pDoc->SetString(0, 2, 0, "=$Sheet2.A1"); + m_pDoc->SetString(0, 3, 0, "=$Sheet2.$A$1"); + m_pDoc->SetString(0, 4, 0, "=$Sheet2.A$1"); + + // to prevent ScEditableTester in ScDocFunc::MoveBlock + ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(0, 0, 0), 1.0); + ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(0, 1, 0), 1.0); + ScDocFunc& rDocFunc = m_xDocShell->GetDocFunc(); + bool bMoveDone = rDocFunc.MoveBlock(ScRange(0, 0, 0, 0, 4, 0), ScAddress(10, 10, 0), false, + false, false, true); + + // check that moving was successful, mainly for editable tester + CPPUNIT_ASSERT(bMoveDone); + ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(10, 10, 0), 1.0); + ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(10, 11, 0), 1.0); + OUString aFormula; + m_pDoc->GetFormula(10, 10, 0, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=COLUMN($A$1)"), aFormula); + m_pDoc->GetFormula(10, 11, 0, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=$A$1+L12"), aFormula); + m_pDoc->GetFormula(10, 12, 0, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.K11"), aFormula); + m_pDoc->GetFormula(10, 13, 0, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.$A$1"), aFormula); + m_pDoc->GetFormula(10, 14, 0, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.K$1"), aFormula); +} + +void TestCopyPaste::testCopyPasteFormulasExternalDoc() +{ + SfxMedium* pMedium = new SfxMedium("file:///source.fake", StreamMode::STD_READWRITE); + m_xDocShell->DoInitNew(pMedium); + + ScDocShellRef xExtDocSh = new ScDocShell; + xExtDocSh->SetIsInUcalc(); + OUString const aExtDocName("file:///extdata.fake"); + SfxMedium* pMed = new SfxMedium(aExtDocName, StreamMode::STD_READWRITE); + xExtDocSh->DoInitNew(pMed); + CPPUNIT_ASSERT_MESSAGE("external document instance not loaded.", + findLoadedDocShellByName(aExtDocName) != nullptr); + + ScDocument& rExtDoc = xExtDocSh->GetDocument(); + rExtDoc.InsertTab(0, "ExtSheet1"); + rExtDoc.InsertTab(1, "ExtSheet2"); + + m_pDoc->InsertTab(0, "Sheet1"); + m_pDoc->InsertTab(1, "Sheet2"); + + m_pDoc->SetString(0, 0, 0, "=COLUMN($A$1)"); + m_pDoc->SetString(0, 1, 0, "=$A$1+B2"); + m_pDoc->SetString(0, 2, 0, "=$Sheet2.A1"); + m_pDoc->SetString(0, 3, 0, "=$Sheet2.$A$1"); + m_pDoc->SetString(0, 4, 0, "=$Sheet2.A$1"); + m_pDoc->SetString(0, 5, 0, "=$Sheet1.$A$1"); + + ScRange aRange(0, 0, 0, 0, 5, 0); + ScClipParam aClipParam(aRange, false); + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aRange); + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); + + aRange = ScRange(1, 1, 1, 1, 6, 1); + ScMarkData aMarkData2(m_pDoc->GetSheetLimits()); + aMarkData2.SetMarkArea(aRange); + rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, &aClipDoc); + + OUString aFormula; + rExtDoc.GetFormula(1, 1, 1, aFormula); + //adjust absolute refs pointing to the copy area + CPPUNIT_ASSERT_EQUAL(OUString("=COLUMN($B$2)"), aFormula); + rExtDoc.GetFormula(1, 2, 1, aFormula); + //adjust absolute refs and keep relative refs + CPPUNIT_ASSERT_EQUAL(OUString("=$B$2+C3"), aFormula); + rExtDoc.GetFormula(1, 3, 1, aFormula); + // make absolute sheet refs external refs + CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.B2"), aFormula); + rExtDoc.GetFormula(1, 4, 1, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.$A$1"), aFormula); + rExtDoc.GetFormula(1, 5, 1, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.B$1"), aFormula); + rExtDoc.GetFormula(1, 6, 1, aFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=$ExtSheet2.$B$2"), aFormula); + + xExtDocSh->DoClose(); +} + +void TestCopyPaste::testCopyPasteReferencesExternalDoc() +{ + SfxMedium* pMedium = new SfxMedium("file:///source.fake", StreamMode::STD_READWRITE); + m_xDocShell->DoInitNew(pMedium); + + ScDocShellRef xExtDocSh = new ScDocShell; + xExtDocSh->SetIsInUcalc(); + OUString aExtDocName("file:///extdata.fake"); + SfxMedium* pMed = new SfxMedium(aExtDocName, StreamMode::STD_READWRITE); + xExtDocSh->DoInitNew(pMed); + CPPUNIT_ASSERT_MESSAGE("external document instance not loaded.", + findLoadedDocShellByName(aExtDocName) != nullptr); + + ScDocument& rExtDoc = xExtDocSh->GetDocument(); + rExtDoc.InsertTab(0, "ExtSheet1"); + + m_pDoc->InsertTab(0, "Sheet1"); + + m_pDoc->SetString(0, 5, 0, "=SUM($Sheet1.A1:A5)"); + + ScRange aRange(0, 2, 0, 0, 5, 0); + ScClipParam aClipParam(aRange, false); + ScMarkData aMark(m_pDoc->GetSheetLimits()); + aMark.SetMarkArea(aRange); + ScDocument aClipDoc(SCDOCMODE_CLIP); + m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false); + + aRange = ScRange(0, 0, 0, 0, 3, 0); + ScMarkData aMarkData2(m_pDoc->GetSheetLimits()); + aMarkData2.SetMarkArea(aRange); + rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, &aClipDoc); + + OUString aFormula; + rExtDoc.GetFormula(0, 3, 0, aFormula); + //adjust absolute refs pointing to the copy area + CPPUNIT_ASSERT_EQUAL(OUString("=SUM('file:///source.fake'#$Sheet1.A#REF!:A3)"), aFormula); + + xExtDocSh->DoClose(); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(TestCopyPaste); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |