1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include <memory>
11 #include <test/bootstrapfixture.hxx>
12 #include "helper/debughelper.hxx"
13 #include "helper/qahelper.hxx"
14 
15 #include <attrib.hxx>
16 #include <bcaslot.hxx>
17 #include <clipparam.hxx>
18 #include <dbdata.hxx>
19 #include <docfunc.hxx>
20 #include <docpool.hxx>
21 #include <editeng/borderline.hxx>
22 #include <editeng/brushitem.hxx>
23 #include <editeng/editobj.hxx>
24 #include <editutil.hxx>
25 #include <formulacell.hxx>
26 #include <formulaopt.hxx>
27 #include <iostream>
28 #include <patattr.hxx>
29 #include <postit.hxx>
30 #include <queryentry.hxx>
31 #include <queryparam.hxx>
32 #include <refundo.hxx>
33 #include <scdll.hxx>
34 #include <scitems.hxx>
35 #include <scmod.hxx>
36 #include <scopetools.hxx>
37 
38 #include <sfx2/docfile.hxx>
39 
40 class TestCopyPaste : public test::BootstrapFixture
41 {
42 public:
43     TestCopyPaste();
44 
45     virtual void setUp() override;
46     virtual void tearDown() override;
47 
48     void testCopyPaste();
49     void testCopyPasteAsLink();
50     void testCopyPasteTranspose();
51     void testCopyPasteSpecialAsLinkTranspose();
52     void testCopyPasteSpecialAsLinkFilteredTranspose();
53     void testCopyPasteSpecialMultiRangeColAsLinkTranspose();
54     void testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose();
55     void testCopyPasteSpecialMultiRangeRowAsLinkTranspose();
56     void testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose();
57     void testCopyPasteSpecialAllAsLinkTranspose();
58     void testCopyPasteSpecialAllAsLinkFilteredTranspose();
59     void testCopyPasteSpecial();
60     void testCopyPasteSpecialFiltered();
61     void testCopyPasteSpecialIncludeFiltered();
62     void testCopyPasteSpecialFilteredIncludeFiltered();
63     void testCopyPasteSpecialTranspose();
64     void testCopyPasteSpecialTransposeIncludeFiltered();
65     void testCopyPasteSpecialFilteredTranspose();
66     void testCopyPasteSpecialMergedCellsTranspose();
67     void testCopyPasteSpecialMergedCellsFilteredTranspose();
68     void testCopyPasteSpecialMultiRangeCol();
69     void testCopyPasteSpecialMultiRangeColFiltered();
70     void testCopyPasteSpecialMultiRangeColIncludeFiltered();
71     void testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered();
72     void testCopyPasteSpecialMultiRangeColTranspose();
73     void testCopyPasteSpecialMultiRangeColFilteredTranspose();
74     void testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose();
75     void testCopyPasteSpecialMultiRangeRow();
76     void testCopyPasteSpecialMultiRangeRowFiltered();
77     void testCopyPasteSpecialMultiRangeRowIncludeFiltered();
78     void testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered();
79     void testCopyPasteSpecialMultiRangeRowTranspose();
80     void testCopyPasteSpecialMultiRangeRowFilteredTranspose();
81     void testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose();
82     void testCopyPasteSpecialSkipEmpty();
83     void testCopyPasteSpecialSkipEmptyFiltered();
84     void testCopyPasteSpecialSkipEmptyIncludeFiltered();
85     void testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered();
86     void testCopyPasteSpecialSkipEmptyTranspose();
87     void testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered();
88     void testCopyPasteSpecialSkipEmptyFilteredTranspose();
89     void testCopyPasteSpecialSkipEmptyMultiRangeCol();
90     void testCopyPasteSpecialSkipEmptyMultiRangeColFiltered();
91     void testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered();
92     void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered();
93     void testCopyPasteSpecialSkipEmptyMultiRangeColTranspose();
94     void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose();
95     void testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose();
96     void testCopyPasteSpecialSkipEmptyMultiRangeRow();
97     void testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered();
98     void testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered();
99     void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered();
100     void testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose();
101     void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose();
102     void testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose();
103     void testCopyPasteMultiRange();
104     void testCopyPasteSkipEmpty();
105     void testCopyPasteSkipEmpty2();
106     void testCutPasteRefUndo();
107     void testCutPasteGroupRefUndo();
108     void testMoveRefBetweenSheets();
109     void testUndoCut();
110     void testMoveBlock();
111     void testCopyPasteRelativeFormula();
112     void testCopyPasteRepeatOneFormula();
113     void testCopyPasteMixedReferenceFormula();
114     void testCopyPasteFormulas();
115     void testCopyPasteFormulasExternalDoc();
116     void testCopyPasteReferencesExternalDoc(); // tdf#106456
117     void testTdf68976();
118     void testTdf71058();
119 
120     void testCutPasteSpecial();
121     void testCutPasteSpecialTranspose();
122     void testCutPasteSpecialSkipEmpty();
123     void testCutPasteSpecialSkipEmptyTranspose();
124     void testTdf142201Row();
125     void testTdf142201ColRel();
126     void testTdf142201ColAbs();
127     void testTdf142065();
128     void testCutTransposedFormulas();
129     void testCutTransposedFormulasSquare();
130     void testReferencedCutRangesRow();
131     void testReferencedCutTransposedRangesRowTab0To0();
132     void testReferencedCutTransposedRangesRowTab0To1();
133     void testReferencedCutTransposedRangesRowTab1To3();
134     void testReferencedCutTransposedRangesRowTab3To1();
135     void testReferencedCutRangesCol();
136     void testReferencedCutTransposedRangesColTab0To0();
137     void testReferencedCutTransposedRangesColTab0To1();
138     void testReferencedCutTransposedRangesColTab1To3();
139     void testReferencedCutTransposedRangesColTab3To1();
140 
141     void testMixData();
142     void testMixDataAsLinkTdf116413();
143     void testMixDataWithFormulaTdf116413();
144 
145     // tdf#80137
146     void testCopyPasteMatrixFormula();
147 
148     CPPUNIT_TEST_SUITE(TestCopyPaste);
149 
150     CPPUNIT_TEST(testCopyPaste);
151     CPPUNIT_TEST(testCopyPasteAsLink);
152     CPPUNIT_TEST(testCopyPasteTranspose);
153     CPPUNIT_TEST(testCopyPasteSpecialAsLinkTranspose);
154     CPPUNIT_TEST(testCopyPasteSpecialAllAsLinkTranspose);
155     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColAsLinkTranspose);
156     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose);
157     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowAsLinkTranspose);
158     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose);
159     CPPUNIT_TEST(testCopyPasteSpecialAsLinkFilteredTranspose);
160     CPPUNIT_TEST(testCopyPasteSpecialAllAsLinkFilteredTranspose);
161     CPPUNIT_TEST(testCopyPasteSpecialMergedCellsTranspose);
162     CPPUNIT_TEST(testCopyPasteSpecialMergedCellsFilteredTranspose);
163     CPPUNIT_TEST(testCopyPasteSpecial);
164     CPPUNIT_TEST(testCopyPasteSpecialFiltered);
165     CPPUNIT_TEST(testCopyPasteSpecialIncludeFiltered);
166     CPPUNIT_TEST(testCopyPasteSpecialFilteredIncludeFiltered);
167     CPPUNIT_TEST(testCopyPasteSpecialTranspose);
168     CPPUNIT_TEST(testCopyPasteSpecialTransposeIncludeFiltered);
169     CPPUNIT_TEST(testCopyPasteSpecialFilteredTranspose);
170     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeCol);
171     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFiltered);
172     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColIncludeFiltered);
173     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered);
174     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColTranspose);
175     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredTranspose);
176     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose);
177     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRow);
178     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFiltered);
179     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowIncludeFiltered);
180     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered);
181     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowTranspose);
182     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredTranspose);
183     CPPUNIT_TEST(testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose);
184     CPPUNIT_TEST(testCopyPasteSpecialSkipEmpty);
185     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFiltered);
186     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyIncludeFiltered);
187     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered);
188     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyTranspose);
189     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered);
190     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyFilteredTranspose);
191     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeCol);
192     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFiltered);
193     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered);
194     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered);
195     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColTranspose);
196     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose);
197     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose);
198     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRow);
199     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered);
200     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered);
201     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered);
202     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose);
203     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose);
204     CPPUNIT_TEST(testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose);
205     CPPUNIT_TEST(testCopyPasteMultiRange);
206     CPPUNIT_TEST(testCopyPasteSkipEmpty);
207     CPPUNIT_TEST(testCopyPasteSkipEmpty2);
208     CPPUNIT_TEST(testCutPasteRefUndo);
209     CPPUNIT_TEST(testCutPasteGroupRefUndo);
210     CPPUNIT_TEST(testMoveRefBetweenSheets);
211     CPPUNIT_TEST(testUndoCut);
212     CPPUNIT_TEST(testMoveBlock);
213     CPPUNIT_TEST(testCopyPasteRelativeFormula);
214     CPPUNIT_TEST(testCopyPasteRepeatOneFormula);
215     CPPUNIT_TEST(testCopyPasteMixedReferenceFormula);
216 
217     CPPUNIT_TEST(testCopyPasteFormulas);
218     CPPUNIT_TEST(testCopyPasteFormulasExternalDoc);
219     CPPUNIT_TEST(testCopyPasteReferencesExternalDoc);
220 
221     CPPUNIT_TEST(testTdf68976);
222     CPPUNIT_TEST(testTdf71058);
223 
224     CPPUNIT_TEST(testCutPasteSpecial);
225     CPPUNIT_TEST(testCutPasteSpecialTranspose);
226     CPPUNIT_TEST(testCutPasteSpecialSkipEmpty);
227     CPPUNIT_TEST(testCutPasteSpecialSkipEmptyTranspose);
228     CPPUNIT_TEST(testTdf142201Row);
229     CPPUNIT_TEST(testTdf142201ColRel);
230     CPPUNIT_TEST(testTdf142201ColAbs);
231     CPPUNIT_TEST(testTdf142065);
232     CPPUNIT_TEST(testCutTransposedFormulas);
233     CPPUNIT_TEST(testCutTransposedFormulasSquare);
234     CPPUNIT_TEST(testReferencedCutRangesRow);
235     CPPUNIT_TEST(testReferencedCutTransposedRangesRowTab0To0);
236     CPPUNIT_TEST(testReferencedCutTransposedRangesRowTab0To1);
237     CPPUNIT_TEST(testReferencedCutTransposedRangesRowTab1To3);
238     CPPUNIT_TEST(testReferencedCutTransposedRangesRowTab3To1);
239     CPPUNIT_TEST(testReferencedCutRangesCol);
240     CPPUNIT_TEST(testReferencedCutTransposedRangesColTab0To0);
241     CPPUNIT_TEST(testReferencedCutTransposedRangesColTab0To1);
242     CPPUNIT_TEST(testReferencedCutTransposedRangesColTab1To3);
243     CPPUNIT_TEST(testReferencedCutTransposedRangesColTab3To1);
244 
245     CPPUNIT_TEST(testMixData);
246     CPPUNIT_TEST(testMixDataAsLinkTdf116413);
247     CPPUNIT_TEST(testMixDataWithFormulaTdf116413);
248 
249     CPPUNIT_TEST(testCopyPasteMatrixFormula);
250 
251     CPPUNIT_TEST_SUITE_END();
252 
253 private:
254     ScDocShellRef m_xDocShell;
255     ScDocument* m_pDoc;
256 
257     enum CalcMode
258     {
259         NoCalc,
260         AutoCalc,
261         RecalcAtEnd,
262         HardRecalcAtEnd
263     };
264 
265     void executeCopyPasteSpecial(bool bApplyFilter, bool bIncludedFiltered, bool bAsLink,
266                                  bool bTranspose, bool bMultiRangeSelection, bool bSkipEmpty,
267                                  bool bCut = false,
268                                  ScClipParam::Direction eDirection = ScClipParam::Column,
269                                  CalcMode eCalcMode = CalcMode::AutoCalc,
270                                  InsertDeleteFlags aFlags
271                                  = InsertDeleteFlags::CONTENTS | InsertDeleteFlags::ATTRIB);
272     void executeCopyPasteSpecial(const SCTAB srcSheet, const SCTAB destSheet, bool bApplyFilter,
273                                  bool bIncludedFiltered, bool bAsLink, bool bTranspose,
274                                  bool bMultiRangeSelection, bool bSkipEmpty,
275                                  std::unique_ptr<ScUndoCut>& pUndoCut,
276                                  std::unique_ptr<ScUndoPaste>& pUndoPaste, bool bCut = false,
277                                  ScClipParam::Direction eDirection = ScClipParam::Column,
278                                  CalcMode eCalcMode = CalcMode::AutoCalc,
279                                  InsertDeleteFlags aFlags
280                                  = InsertDeleteFlags::CONTENTS | InsertDeleteFlags::ATTRIB);
281     void checkCopyPasteSpecialInitial(const SCTAB srcSheet);
282     void checkCopyPasteSpecial(bool bSkipEmpty, bool bCut = false);
283     void checkCopyPasteSpecialFiltered(bool bSkipEmpty);
284     void checkCopyPasteSpecialTranspose(bool bSkipEmpty, bool bCut = false);
285     void checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty);
286     void checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty);
287     void checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty);
288     void checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty);
289     void checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty);
290     void checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty);
291     void checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty);
292     void checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty);
293     void checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty);
294     void checkReferencedCutTransposedRangesRowUndo(const SCTAB nSrcTab, const SCTAB nDestTab);
295     void executeReferencedCutRangesRow(const bool bTransposed, const SCTAB nSrcTab,
296                                        const SCTAB nDestTab, const bool bUndo,
297                                        std::unique_ptr<ScUndoCut>& pUndoCut,
298                                        std::unique_ptr<ScUndoPaste>& pUndoPaste);
299     void checkReferencedCutRangesRowIntitial(const SCTAB nSrcTab, const OUString& rDesc);
300     void checkReferencedCutRangesRow(const SCTAB nSrcTab, const SCTAB nDestTab);
301     void checkReferencedCutTransposedRangesRow(const SCTAB nSrcTab, const SCTAB nDestTab);
302     void executeReferencedCutRangesCol(const bool bTransposed, const SCTAB nSrcTab,
303                                        const SCTAB nDestTab, const bool bUndo,
304                                        std::unique_ptr<ScUndoCut>& pUndoCut,
305                                        std::unique_ptr<ScUndoPaste>& pUndoPaste);
306     void checkReferencedCutRangesColIntitial(const SCTAB nSrcTab, const SCTAB nDestTab,
307                                              const OUString& rDesc);
308     void checkReferencedCutRangesCol(const SCTAB nSrcTab, const SCTAB nDestTab);
309     void checkReferencedCutTransposedRangesColUndo(const SCTAB nSrcTab, const SCTAB nDestTab);
310     void checkReferencedCutTransposedRangesCol(const SCTAB nSrcTab, const SCTAB nDestTab);
311     void prepareUndoBeforePaste(bool bCut, ScDocumentUniquePtr& pPasteUndoDoc,
312                                 std::unique_ptr<ScDocument>& pPasteRefUndoDoc,
313                                 const ScMarkData& rDestMark, const ScRange& rDestRange,
314                                 std::unique_ptr<ScRefUndoData>& pUndoData);
315     void prepareUndoAfterPaste(ScDocumentUniquePtr& pPasteUndoDoc,
316                                std::unique_ptr<ScDocument>& pPasteRefUndoDoc,
317                                const ScMarkData& rDestMark, const ScRange& rDestRange,
318                                std::unique_ptr<ScRefUndoData>& pUndoData,
319                                std::unique_ptr<ScUndoPaste>& pUndoPaste, bool bTranspose = false,
320                                bool bAsLink = false, bool bSkipEmpty = false,
321                                ScPasteFunc nFunction = ScPasteFunc::NONE,
322                                InsCellCmd eMoveMode = InsCellCmd::INS_NONE);
323 
324     OUString getFormula(SCCOL nCol, SCROW nRow, SCTAB nTab);
325     OUString getRangeByName(const OUString& aRangeName);
326     ScAddress setNote(SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString noteText);
327     OUString getNote(SCCOL nCol, SCROW nRow, SCTAB nTab);
328 };
329 
TestCopyPaste()330 TestCopyPaste::TestCopyPaste() {}
331 
setUp()332 void TestCopyPaste::setUp()
333 {
334     BootstrapFixture::setUp();
335 
336     ScDLL::Init();
337 
338     m_xDocShell
339         = new ScDocShell(SfxModelFlags::EMBEDDED_OBJECT | SfxModelFlags::DISABLE_EMBEDDED_SCRIPTS
340                          | SfxModelFlags::DISABLE_DOCUMENT_RECOVERY);
341     m_xDocShell->SetIsInUcalc();
342     m_xDocShell->DoInitUnitTest();
343 
344     m_pDoc = &m_xDocShell->GetDocument();
345 }
346 
tearDown()347 void TestCopyPaste::tearDown()
348 {
349     m_xDocShell->DoClose();
350     m_xDocShell.clear();
351 
352     test::BootstrapFixture::tearDown();
353 }
354 
lcl_getMergeFlagOfCell(const ScDocument & rDoc,SCCOL nCol,SCROW nRow,SCTAB nTab)355 static ScMF lcl_getMergeFlagOfCell(const ScDocument& rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab)
356 {
357     const SfxPoolItem& rPoolItem = rDoc.GetPattern(nCol, nRow, nTab)->GetItem(ATTR_MERGE_FLAG);
358     const ScMergeFlagAttr& rMergeFlag = static_cast<const ScMergeFlagAttr&>(rPoolItem);
359     return rMergeFlag.GetValue();
360 }
361 
lcl_getMergeSizeOfCell(const ScDocument & rDoc,SCCOL nCol,SCROW nRow,SCTAB nTab)362 static ScAddress lcl_getMergeSizeOfCell(const ScDocument& rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab)
363 {
364     const SfxPoolItem& rPoolItem = rDoc.GetPattern(nCol, nRow, nTab)->GetItem(ATTR_MERGE);
365     const ScMergeAttr& rMerge = static_cast<const ScMergeAttr&>(rPoolItem);
366     return ScAddress(rMerge.GetColMerge(), rMerge.GetRowMerge(), nTab);
367 }
368 
lcl_printValuesAndFormulasInRange(ScDocument * pDoc,const ScRange & rRange,const OString & rCaption)369 static void lcl_printValuesAndFormulasInRange(ScDocument* pDoc, const ScRange& rRange,
370                                               const OString& rCaption)
371 {
372     printRange(pDoc, rRange, rCaption, false);
373     printRange(pDoc, rRange, rCaption, true);
374 }
375 
getFormula(SCCOL nCol,SCROW nRow,SCTAB nTab)376 OUString TestCopyPaste::getFormula(SCCOL nCol, SCROW nRow, SCTAB nTab)
377 {
378     return ::getFormula(m_pDoc, nCol, nRow, nTab);
379 }
380 
getRangeByName(const OUString & aRangeName)381 OUString TestCopyPaste::getRangeByName(const OUString& aRangeName)
382 {
383     return ::getRangeByName(m_pDoc, aRangeName);
384 }
385 
setNote(SCCOL nCol,SCROW nRow,SCTAB nTab,OUString noteText)386 ScAddress TestCopyPaste::setNote(SCCOL nCol, SCROW nRow, SCTAB nTab, OUString noteText)
387 {
388     ScAddress aAdr(nCol, nRow, nTab);
389     ScPostIt* pNote = m_pDoc->GetOrCreateNote(aAdr);
390     pNote->SetText(aAdr, noteText);
391     return aAdr;
392 }
393 
getNote(SCCOL nCol,SCROW nRow,SCTAB nTab)394 OUString TestCopyPaste::getNote(SCCOL nCol, SCROW nRow, SCTAB nTab)
395 {
396     ScPostIt* pNote = m_pDoc->GetNote(nCol, nRow, nTab);
397     CPPUNIT_ASSERT_MESSAGE("Note expected", pNote);
398     return pNote->GetText();
399 }
400 
401 // Cannot be moved to qahelper since ScDocument::CopyToDocument() is not SC_DLLPUBLIC
402 /** Executes the same steps for undo as ScViewFunc::PasteFromClip(). */
prepareUndoBeforePaste(bool bCut,ScDocumentUniquePtr & pPasteUndoDoc,std::unique_ptr<ScDocument> & pPasteRefUndoDoc,const ScMarkData & rDestMark,const ScRange & rDestRange,std::unique_ptr<ScRefUndoData> & pUndoData)403 void TestCopyPaste::prepareUndoBeforePaste(bool bCut, ScDocumentUniquePtr& pPasteUndoDoc,
404                                            std::unique_ptr<ScDocument>& pPasteRefUndoDoc,
405                                            const ScMarkData& rDestMark, const ScRange& rDestRange,
406                                            std::unique_ptr<ScRefUndoData>& pUndoData)
407 {
408     InsertDeleteFlags nUndoFlags = InsertDeleteFlags::CONTENTS;
409     SCTAB nTabCount = m_pDoc->GetTableCount();
410 
411     pPasteUndoDoc.reset(new ScDocument(SCDOCMODE_UNDO));
412     pPasteUndoDoc->InitUndoSelected(*m_pDoc, rDestMark, false, false);
413     // all sheets - CopyToDocument skips those that don't exist in pUndoDoc
414     m_pDoc->CopyToDocument(rDestRange.aStart.Col(), rDestRange.aStart.Row(), 0,
415                            rDestRange.aEnd.Col(), rDestRange.aEnd.Row(), nTabCount - 1, nUndoFlags,
416                            false, *pPasteUndoDoc);
417 
418     if (bCut)
419     {
420         // save changed references
421         pPasteRefUndoDoc.reset(new ScDocument(SCDOCMODE_UNDO));
422         pPasteRefUndoDoc->InitUndo(*m_pDoc, 0, nTabCount - 1);
423 
424         pUndoData.reset(new ScRefUndoData(m_pDoc));
425     }
426 }
427 
428 // Cannot be moved to qahelper since ScDocument::CopyToDocument() is not SC_DLLPUBLIC
429 /** Executes the same steps for undo as ScViewFunc::PasteFromClip(). */
prepareUndoAfterPaste(ScDocumentUniquePtr & pPasteUndoDoc,std::unique_ptr<ScDocument> & pPasteRefUndoDoc,const ScMarkData & rDestMark,const ScRange & rDestRange,std::unique_ptr<ScRefUndoData> & pUndoData,std::unique_ptr<ScUndoPaste> & pUndoPaste,bool bTranspose,bool bAsLink,bool bSkipEmpty,ScPasteFunc nFunction,InsCellCmd eMoveMode)430 void TestCopyPaste::prepareUndoAfterPaste(ScDocumentUniquePtr& pPasteUndoDoc,
431                                           std::unique_ptr<ScDocument>& pPasteRefUndoDoc,
432                                           const ScMarkData& rDestMark, const ScRange& rDestRange,
433                                           std::unique_ptr<ScRefUndoData>& pUndoData,
434                                           std::unique_ptr<ScUndoPaste>& pUndoPaste, bool bTranspose,
435                                           bool bAsLink, bool bSkipEmpty, ScPasteFunc nFunction,
436                                           InsCellCmd eMoveMode)
437 {
438     InsertDeleteFlags nUndoFlags = InsertDeleteFlags::CONTENTS;
439     SCTAB nTabCount = m_pDoc->GetTableCount();
440 
441     ScDocumentUniquePtr pPasteRedoDoc;
442     // copy redo data after appearance of the first undo
443     // don't create Redo-Doc without RefUndoDoc
444 
445     if (pPasteRefUndoDoc)
446     {
447         pPasteRedoDoc.reset(new ScDocument(SCDOCMODE_UNDO));
448         pPasteRedoDoc->InitUndo(*m_pDoc, rDestRange.aStart.Tab(), rDestRange.aEnd.Tab(), false,
449                                 false);
450 
451         // move adapted refs to Redo-Doc
452 
453         pPasteRedoDoc->AddUndoTab(0, nTabCount - 1);
454         m_pDoc->CopyUpdated(pPasteRefUndoDoc.get(), pPasteRedoDoc.get());
455 
456         pPasteUndoDoc->AddUndoTab(0, nTabCount - 1);
457         pPasteRefUndoDoc->DeleteArea(rDestRange.aStart.Col(), rDestRange.aStart.Row(),
458                                      rDestRange.aEnd.Col(), rDestRange.aEnd.Row(), rDestMark,
459                                      InsertDeleteFlags::ALL);
460         pPasteRefUndoDoc->CopyToDocument(0, 0, 0, pPasteUndoDoc->MaxCol(), pPasteUndoDoc->MaxRow(),
461                                          nTabCount - 1, InsertDeleteFlags::FORMULA, false,
462                                          *pPasteUndoDoc);
463         pPasteRefUndoDoc.reset();
464     }
465 
466     ScUndoPasteOptions aOptions; // store options for repeat
467     aOptions.nFunction = nFunction;
468     aOptions.bSkipEmpty = bSkipEmpty;
469     aOptions.bTranspose = bTranspose;
470     aOptions.bAsLink = bAsLink;
471     aOptions.eMoveMode = eMoveMode;
472 
473     pUndoPaste.reset(new ScUndoPaste(&*m_xDocShell, rDestRange, rDestMark, std::move(pPasteUndoDoc),
474                                      std::move(pPasteRedoDoc), nUndoFlags, std::move(pUndoData),
475                                      false,
476                                      &aOptions)); // false = Redo data not yet copied
477 }
478 
testCopyPaste()479 void TestCopyPaste::testCopyPaste()
480 {
481     m_pDoc->InsertTab(0, "Sheet1");
482     m_pDoc->InsertTab(1, "Sheet2");
483 
484     // We need a drawing layer in order to create caption objects.
485     m_pDoc->InitDrawLayer(m_xDocShell.get());
486 
487     //test copy&paste + ScUndoPaste
488     //copy local and global range names in formulas
489     //string cells and value cells
490     m_pDoc->SetValue(0, 0, 0, 1);
491     m_pDoc->SetValue(3, 0, 0, 0);
492     m_pDoc->SetValue(3, 1, 0, 1);
493     m_pDoc->SetValue(3, 2, 0, 2);
494     m_pDoc->SetValue(3, 3, 0, 3);
495     m_pDoc->SetString(2, 0, 0, "test");
496     ScAddress aAdr(0, 0, 0);
497 
498     //create some range names, local and global
499     ScRangeData* pLocal1 = new ScRangeData(*m_pDoc, "local1", aAdr);
500     ScRangeData* pLocal2 = new ScRangeData(*m_pDoc, "local2", aAdr);
501     ScRangeData* pLocal3 = new ScRangeData(*m_pDoc, "local3", "$Sheet1.$A$1");
502     ScRangeData* pLocal4 = new ScRangeData(*m_pDoc, "local4", "Sheet1.$A$1");
503     ScRangeData* pLocal5
504         = new ScRangeData(*m_pDoc, "local5", "$A$1"); // implicit relative sheet reference
505     ScRangeData* pGlobal = new ScRangeData(*m_pDoc, "global", aAdr);
506     const OUString aGlobal2Symbol("$Sheet1.$A$1:$A$23");
507     ScRangeData* pGlobal2 = new ScRangeData(*m_pDoc, "global2", aGlobal2Symbol);
508     std::unique_ptr<ScRangeName> pGlobalRangeName(new ScRangeName());
509     pGlobalRangeName->insert(pGlobal);
510     pGlobalRangeName->insert(pGlobal2);
511     std::unique_ptr<ScRangeName> pLocalRangeName1(new ScRangeName());
512     pLocalRangeName1->insert(pLocal1);
513     pLocalRangeName1->insert(pLocal2);
514     pLocalRangeName1->insert(pLocal3);
515     pLocalRangeName1->insert(pLocal4);
516     pLocalRangeName1->insert(pLocal5);
517     m_pDoc->SetRangeName(std::move(pGlobalRangeName));
518     m_pDoc->SetRangeName(0, std::move(pLocalRangeName1));
519 
520     // Add formula to B1.
521     OUString aFormulaString("=local1+global+SUM($C$1:$D$4)+local3+local4+local5");
522     m_pDoc->SetString(1, 0, 0, aFormulaString);
523 
524     double fValue = m_pDoc->GetValue(ScAddress(1, 0, 0));
525     ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 11", fValue, 11);
526 
527     // add notes to A1:C1
528     setNote(0, 0, 0, "Hello world in A1"); // empty cell content
529     setNote(1, 0, 0, "Hello world in B1"); // formula cell content
530     setNote(2, 0, 0, "Hello world in C1"); // string cell content
531 
532     //copy Sheet1.A1:C1 to Sheet2.A2:C2
533     ScRange aRange(0, 0, 0, 2, 0, 0);
534     ScDocument aClipDoc(SCDOCMODE_CLIP);
535     copyToClip(m_pDoc, aRange, &aClipDoc);
536 
537     aRange = ScRange(0, 1, 1, 2, 1, 1); //target: Sheet2.A2:C2
538     ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO));
539     pUndoDoc->InitUndo(*m_pDoc, 1, 1, true, true);
540     std::unique_ptr<ScUndoPaste> pUndo(createUndoPaste(*m_xDocShell, aRange, std::move(pUndoDoc)));
541     ScMarkData aMark(m_pDoc->GetSheetLimits());
542     aMark.SetMarkArea(aRange);
543     m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc);
544 
545     //check values after copying
546     OUString aString;
547     m_pDoc->GetFormula(1, 1, 1, aString);
548     CPPUNIT_ASSERT_EQUAL_MESSAGE("formula string was not copied correctly", aString,
549                                  aFormulaString);
550     // Only the global range points to Sheet1.A1, all copied sheet-local ranges
551     // to Sheet2.A1 that is empty, hence the result is 1, not 2.
552     fValue = m_pDoc->GetValue(ScAddress(1, 1, 1));
553     ASSERT_DOUBLES_EQUAL_MESSAGE("copied formula should return 1", 1.0, fValue);
554     fValue = m_pDoc->GetValue(ScAddress(0, 1, 1));
555     ASSERT_DOUBLES_EQUAL_MESSAGE("copied value should be 1", 1.0, fValue);
556 
557     ScRange aSheet2A1(0, 0, 1, 0, 0, 1);
558 
559     //check local range name after copying
560     pLocal1 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL1"));
561     CPPUNIT_ASSERT_MESSAGE("local range name 1 should be copied", pLocal1);
562     ScRange aRangeLocal1;
563     bool bIsValidRef1 = pLocal1->IsValidReference(aRangeLocal1);
564     CPPUNIT_ASSERT_MESSAGE("local range name 1 should be valid", bIsValidRef1);
565     CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 1 should now point to Sheet2.A1", aSheet2A1,
566                                  aRangeLocal1);
567 
568     pLocal2 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL2"));
569     CPPUNIT_ASSERT_MESSAGE("local2 should not be copied", !pLocal2);
570 
571     pLocal3 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL3"));
572     CPPUNIT_ASSERT_MESSAGE("local range name 3 should be copied", pLocal3);
573     ScRange aRangeLocal3;
574     bool bIsValidRef3 = pLocal3->IsValidReference(aRangeLocal3);
575     CPPUNIT_ASSERT_MESSAGE("local range name 3 should be valid", bIsValidRef3);
576     CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 3 should now point to Sheet2.A1", aSheet2A1,
577                                  aRangeLocal3);
578 
579     pLocal4 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL4"));
580     CPPUNIT_ASSERT_MESSAGE("local range name 4 should be copied", pLocal4);
581     ScRange aRangeLocal4;
582     bool bIsValidRef4 = pLocal4->IsValidReference(aRangeLocal4);
583     CPPUNIT_ASSERT_MESSAGE("local range name 4 should be valid", bIsValidRef4);
584     CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 4 should now point to Sheet2.A1", aSheet2A1,
585                                  aRangeLocal4);
586 
587     pLocal5 = m_pDoc->GetRangeName(1)->findByUpperName(OUString("LOCAL5"));
588     CPPUNIT_ASSERT_MESSAGE("local range name 5 should be copied", pLocal5);
589     ScRange aRangeLocal5;
590     bool bIsValidRef5 = pLocal5->IsValidReference(aRangeLocal5);
591     CPPUNIT_ASSERT_MESSAGE("local range name 5 should be valid", bIsValidRef5);
592     CPPUNIT_ASSERT_EQUAL_MESSAGE("local range 5 should now point to Sheet2.A1", aSheet2A1,
593                                  aRangeLocal5);
594 
595     // check notes after copying
596     CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.A2", m_pDoc->HasNote(0, 1, 1));
597     CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.B2", m_pDoc->HasNote(1, 1, 1));
598     CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.C2", m_pDoc->HasNote(2, 1, 1));
599     CPPUNIT_ASSERT_EQUAL_MESSAGE(
600         "Note content on Sheet1.A1 not copied to Sheet2.A2, empty cell content",
601         m_pDoc->GetNote(0, 0, 0)->GetText(), m_pDoc->GetNote(0, 1, 1)->GetText());
602     CPPUNIT_ASSERT_EQUAL_MESSAGE(
603         "Note content on Sheet1.B1 not copied to Sheet2.B2, formula cell content",
604         m_pDoc->GetNote(1, 0, 0)->GetText(), m_pDoc->GetNote(1, 1, 1)->GetText());
605     CPPUNIT_ASSERT_EQUAL_MESSAGE(
606         "Note content on Sheet1.C1 not copied to Sheet2.C2, string cell content",
607         m_pDoc->GetNote(2, 0, 0)->GetText(), m_pDoc->GetNote(2, 1, 1)->GetText());
608 
609     //check undo and redo
610     pUndo->Undo();
611     fValue = m_pDoc->GetValue(ScAddress(1, 1, 1));
612     ASSERT_DOUBLES_EQUAL_MESSAGE("after undo formula should return nothing", fValue, 0);
613     aString = m_pDoc->GetString(2, 1, 1);
614     CPPUNIT_ASSERT_MESSAGE("after undo, string should be removed", aString.isEmpty());
615     CPPUNIT_ASSERT_MESSAGE("after undo, note on A2 should be removed", !m_pDoc->HasNote(0, 1, 1));
616     CPPUNIT_ASSERT_MESSAGE("after undo, note on B2 should be removed", !m_pDoc->HasNote(1, 1, 1));
617     CPPUNIT_ASSERT_MESSAGE("after undo, note on C2 should be removed", !m_pDoc->HasNote(2, 1, 1));
618 
619     pUndo->Redo();
620     fValue = m_pDoc->GetValue(ScAddress(1, 1, 1));
621     ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 1 after redo", 1.0, fValue);
622     aString = m_pDoc->GetString(2, 1, 1);
623     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell Sheet2.C2 should contain: test", OUString("test"), aString);
624     m_pDoc->GetFormula(1, 1, 1, aString);
625     CPPUNIT_ASSERT_EQUAL_MESSAGE("Formula should be correct again", aFormulaString, aString);
626 
627     CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.A2",
628                            m_pDoc->HasNote(0, 1, 1));
629     CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.B2",
630                            m_pDoc->HasNote(1, 1, 1));
631     CPPUNIT_ASSERT_MESSAGE("After Redo, there should be a note on Sheet2.C2",
632                            m_pDoc->HasNote(2, 1, 1));
633     CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.A2, empty cell content",
634                                  getNote(0, 0, 0), getNote(0, 1, 1));
635     CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.B2, formula cell content",
636                                  getNote(1, 0, 0), getNote(1, 1, 1));
637     CPPUNIT_ASSERT_EQUAL_MESSAGE("After Redo, note again on Sheet2.C2, string cell content",
638                                  getNote(2, 0, 0), getNote(2, 1, 1));
639 
640     // Copy Sheet1.A11:A13 to Sheet1.A7:A9, both within global2 range.
641     aRange = ScRange(0, 10, 0, 0, 12, 0);
642     ScDocument aClipDoc2(SCDOCMODE_CLIP);
643     copyToClip(m_pDoc, aRange, &aClipDoc2);
644 
645     aRange = ScRange(0, 6, 0, 0, 8, 0);
646     aMark.SetMarkArea(aRange);
647     m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc2);
648 
649     // The global2 range must not have changed.
650     pGlobal2 = m_pDoc->GetRangeName()->findByUpperName("GLOBAL2");
651     CPPUNIT_ASSERT_MESSAGE("GLOBAL2 name not found", pGlobal2);
652     OUString aSymbol;
653     pGlobal2->GetSymbol(aSymbol);
654     CPPUNIT_ASSERT_EQUAL_MESSAGE("GLOBAL2 named range changed", aGlobal2Symbol, aSymbol);
655 
656     m_pDoc->DeleteTab(1);
657     m_pDoc->DeleteTab(0);
658 }
659 
testCopyPasteAsLink()660 void TestCopyPaste::testCopyPasteAsLink()
661 {
662     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
663 
664     m_pDoc->InsertTab(0, "Sheet1");
665     m_pDoc->InsertTab(1, "Sheet2");
666 
667     m_pDoc->SetValue(ScAddress(0, 0, 0), 1); // A1
668     m_pDoc->SetValue(ScAddress(0, 1, 0), 2); // A2
669     m_pDoc->SetValue(ScAddress(0, 2, 0), 3); // A3
670 
671     ScRange aRange(0, 0, 0, 0, 2, 0); // Copy A1:A3 to clip.
672     ScDocument aClipDoc(SCDOCMODE_CLIP);
673     copyToClip(m_pDoc, aRange, &aClipDoc);
674 
675     aRange = ScRange(1, 1, 1, 1, 3, 1); // Paste to B2:B4 on Sheet2.
676     ScMarkData aMark(m_pDoc->GetSheetLimits());
677     aMark.SetMarkArea(aRange);
678     // Paste range as link.
679     m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &aClipDoc, true,
680                          true);
681 
682     // Check pasted content to make sure they reference the correct cells.
683     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, 1));
684     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
685     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
686 
687     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, 1));
688     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
689     CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue());
690 
691     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, 1));
692     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
693     CPPUNIT_ASSERT_EQUAL(3.0, pFC->GetValue());
694 
695     m_pDoc->DeleteTab(1);
696     m_pDoc->DeleteTab(0);
697 }
698 
testCopyPasteTranspose()699 void TestCopyPaste::testCopyPasteTranspose()
700 {
701     m_pDoc->InsertTab(0, "Sheet1");
702 
703     // We need a drawing layer in order to create caption objects.
704     m_pDoc->InitDrawLayer(m_xDocShell.get());
705 
706     m_pDoc->SetValue(0, 0, 0, 1);
707     m_pDoc->SetString(1, 0, 0, "=A1+1");
708     m_pDoc->SetString(2, 0, 0, "test");
709 
710     // add notes to A1:C1
711     setNote(0, 0, 0, "Hello world in A1"); // numerical cell content
712     setNote(1, 0, 0, "Hello world in B1"); // formula cell content
713     setNote(2, 0, 0, "Hello world in C1"); // string cell content
714 
715     // transpose clipboard, paste and check on Sheet2
716     m_pDoc->InsertTab(1, "Sheet2");
717 
718     ScRange aSrcRange(0, 0, 0, 2, 0, 0);
719     ScDocument aNewClipDoc(SCDOCMODE_CLIP);
720     copyToClip(m_pDoc, aSrcRange, &aNewClipDoc);
721 
722     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
723     aNewClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, false);
724 
725     ScRange aDestRange(3, 1, 1, 3, 3, 1); //target: Sheet2.D2:D4
726     ScMarkData aMark(m_pDoc->GetSheetLimits());
727     aMark.SetMarkArea(aDestRange);
728     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get());
729     pTransClip.reset();
730 
731     //check cell content after transposed copy/paste
732     OUString aString = m_pDoc->GetString(3, 3, 1);
733     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell Sheet2.D4 should contain: test", OUString("test"), aString);
734     double fValue = m_pDoc->GetValue(ScAddress(3, 1, 1));
735     ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied cell should return 1", 1, fValue);
736     fValue = m_pDoc->GetValue(ScAddress(3, 2, 1));
737     ASSERT_DOUBLES_EQUAL_MESSAGE("transposed copied formula should return 2", 2, fValue);
738     m_pDoc->GetFormula(3, 2, 1, aString);
739     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed formula should point on Sheet2.D2", OUString("=D2+1"),
740                                  aString);
741 
742     // check notes after transposed copy/paste
743     CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D2", m_pDoc->HasNote(3, 1, 1));
744     CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D3", m_pDoc->HasNote(3, 2, 1));
745     CPPUNIT_ASSERT_MESSAGE("There should be a note on Sheet2.D4", m_pDoc->HasNote(3, 3, 1));
746     CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D2", getNote(0, 0, 0),
747                                  getNote(3, 1, 1));
748     CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D3", getNote(1, 0, 0),
749                                  getNote(3, 2, 1));
750     CPPUNIT_ASSERT_EQUAL_MESSAGE("Content of cell note on Sheet2.D4", getNote(2, 0, 0),
751                                  getNote(3, 3, 1));
752 
753     m_pDoc->DeleteTab(1);
754     m_pDoc->DeleteTab(0);
755 }
756 
testCopyPasteSpecialMergedCellsTranspose()757 void TestCopyPaste::testCopyPasteSpecialMergedCellsTranspose()
758 {
759     const SCTAB srcSheet = 0;
760     const SCTAB destSheet = 1;
761 
762     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
763 
764     m_pDoc->InsertTab(srcSheet, "Sheet1");
765     m_pDoc->InsertTab(destSheet, "Sheet2");
766 
767     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
768     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
769     m_pDoc->SetValue(0, 2, srcSheet, 3); // A3
770     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
771 
772     m_pDoc->DoMerge(srcSheet, 0, 1, 1, 1, false); // Merge A2 and B2
773     m_pDoc->DoMerge(srcSheet, 0, 2, 1, 2, false); // Merge A3 and B3
774 
775     // Test precondition
776     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
777                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 0, srcSheet));
778     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 0, srcSheet));
779     CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet),
780                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 1, srcSheet));
781     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
782                          lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, srcSheet));
783     CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 1, srcSheet));
784     CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet),
785                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 2, srcSheet));
786     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
787                          lcl_getMergeSizeOfCell(*m_pDoc, 1, 2, srcSheet));
788     CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, srcSheet));
789     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
790                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 3, srcSheet));
791     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 3, srcSheet));
792 
793     ScRange aSrcRange(0, 0, srcSheet, 1, 3, srcSheet); // Copy A1:B4 to clip.
794     ScDocument aClipDoc(SCDOCMODE_CLIP);
795     copyToClip(m_pDoc, aSrcRange, &aClipDoc);
796 
797     // transpose
798     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
799     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false);
800 
801     ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2.
802     ScMarkData aMark(m_pDoc->GetSheetLimits());
803     aMark.SetMarkArea(aDestRange);
804     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true,
805                          false);
806     pTransClip.reset();
807 
808     // Check transpose of merged cells
809     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet),
810                          lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, destSheet));
811     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, destSheet));
812     CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet),
813                          lcl_getMergeSizeOfCell(*m_pDoc, 2, 1, destSheet));
814     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 1, destSheet));
815     CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet),
816                          lcl_getMergeSizeOfCell(*m_pDoc, 3, 1, destSheet));
817     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 1, destSheet));
818     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet),
819                          lcl_getMergeSizeOfCell(*m_pDoc, 4, 1, destSheet));
820     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 4, 2, destSheet));
821 
822     m_pDoc->DeleteTab(destSheet);
823     m_pDoc->DeleteTab(srcSheet);
824 }
825 
testCopyPasteSpecialMergedCellsFilteredTranspose()826 void TestCopyPaste::testCopyPasteSpecialMergedCellsFilteredTranspose()
827 {
828     const SCTAB srcSheet = 0;
829     const SCTAB destSheet = 1;
830 
831     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
832 
833     m_pDoc->InsertTab(srcSheet, "Sheet1");
834     m_pDoc->InsertTab(destSheet, "Sheet2");
835 
836     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
837     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
838     m_pDoc->SetValue(0, 2, srcSheet, 3); // A3
839     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
840 
841     m_pDoc->DoMerge(srcSheet, 0, 1, 1, 1, false); // Merge A2 and B2
842     m_pDoc->DoMerge(srcSheet, 0, 2, 1, 2, false); // Merge A3 and B3
843 
844     // Filter row 1
845     ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3);
846     m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData));
847 
848     pDBData->SetAutoFilter(true);
849     ScRange aRange;
850     pDBData->GetArea(aRange);
851     m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(),
852                           aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto);
853 
854     //create the query param
855     ScQueryParam aParam;
856     pDBData->GetQueryParam(aParam);
857     ScQueryEntry& rEntry = aParam.GetEntry(0);
858     rEntry.bDoQuery = true;
859     rEntry.nField = 0;
860     rEntry.eOp = SC_NOT_EQUAL;
861     rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1
862     // add queryParam to database range.
863     pDBData->SetQueryParam(aParam);
864 
865     // perform the query.
866     m_pDoc->Query(srcSheet, aParam, true);
867 
868     // Test precondition
869     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
870                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 0, srcSheet));
871     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 0, srcSheet));
872     CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet),
873                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 1, srcSheet));
874     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
875                          lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, srcSheet));
876     CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 1, srcSheet));
877     CPPUNIT_ASSERT_EQUAL(ScAddress(2, 1, srcSheet),
878                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 2, srcSheet));
879     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
880                          lcl_getMergeSizeOfCell(*m_pDoc, 1, 2, srcSheet));
881     CPPUNIT_ASSERT_EQUAL(ScMF::Hor, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, srcSheet));
882     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, srcSheet),
883                          lcl_getMergeSizeOfCell(*m_pDoc, 0, 3, srcSheet));
884     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 3, srcSheet));
885 
886     ScRange aSrcRange(0, 0, srcSheet, 1, 3, srcSheet); // Copy A1:B4 to clip.
887     ScDocument aClipDoc(SCDOCMODE_CLIP);
888     copyToClip(m_pDoc, aSrcRange, &aClipDoc);
889 
890     // transpose
891     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
892     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false);
893 
894     ScRange aDestRange(1, 1, destSheet, 3, 2, destSheet); // Paste to B2:D3 on Sheet2.
895     ScMarkData aMark(m_pDoc->GetSheetLimits());
896     aMark.SetMarkArea(aDestRange);
897     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true,
898                          false);
899     pTransClip.reset();
900 
901     // Check transpose of merged cells
902     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet),
903                          lcl_getMergeSizeOfCell(*m_pDoc, 1, 1, destSheet));
904     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 1, 2, destSheet));
905     CPPUNIT_ASSERT_EQUAL(ScAddress(1, 2, destSheet),
906                          lcl_getMergeSizeOfCell(*m_pDoc, 2, 1, destSheet));
907     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(2, 1, destSheet));
908     CPPUNIT_ASSERT_EQUAL(ScAddress(0, 0, destSheet),
909                          lcl_getMergeSizeOfCell(*m_pDoc, 3, 1, destSheet));
910     CPPUNIT_ASSERT_EQUAL(ScMF::NONE, lcl_getMergeFlagOfCell(*m_pDoc, 3, 2, destSheet));
911 
912     m_pDoc->DeleteTab(destSheet);
913     m_pDoc->DeleteTab(srcSheet);
914 }
915 
916 // InsertDeleteFlags::CONTENTS
testCopyPasteSpecialAsLinkTranspose()917 void TestCopyPaste::testCopyPasteSpecialAsLinkTranspose()
918 {
919     const SCTAB srcSheet = 0;
920     const SCTAB destSheet = 1;
921 
922     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
923 
924     m_pDoc->InsertTab(srcSheet, "Sheet1");
925     m_pDoc->InsertTab(destSheet, "Sheet2");
926 
927     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
928     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
929     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
930 
931     ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); // Copy A1:A4 to clip.
932     ScDocument aClipDoc(SCDOCMODE_CLIP);
933     copyToClip(m_pDoc, aSrcRange, &aClipDoc);
934 
935     // transpose
936     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
937     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false);
938 
939     ScRange aDestRange(1, 1, destSheet, 4, 1, destSheet); // Paste to B2:E2 on Sheet2.
940     ScMarkData aMark(m_pDoc->GetSheetLimits());
941     aMark.SetMarkArea(aDestRange);
942     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, pTransClip.get(),
943                          true, false);
944     pTransClip.reset();
945 
946     // Check pasted content to make sure they reference the correct cells.
947     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
948     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
949     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
950     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
951 
952     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
953     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
954     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C2", OUString("=$Sheet1.$A$2"), getFormula(2, 1, destSheet));
955     CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue());
956 
957     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
958     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D2.", !pFC);
959 
960     pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet));
961     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
962     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("=$Sheet1.$A$4"), getFormula(4, 1, destSheet));
963     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
964 
965     m_pDoc->DeleteTab(destSheet);
966     m_pDoc->DeleteTab(srcSheet);
967 }
968 
969 // InsertDeleteFlags::CONTENTS
testCopyPasteSpecialAsLinkFilteredTranspose()970 void TestCopyPaste::testCopyPasteSpecialAsLinkFilteredTranspose()
971 {
972     const SCTAB srcSheet = 0;
973     const SCTAB destSheet = 1;
974 
975     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
976 
977     m_pDoc->InsertTab(srcSheet, "Sheet1");
978     m_pDoc->InsertTab(destSheet, "Sheet2");
979 
980     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
981     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
982     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
983 
984     // Filter row 1
985     ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3);
986     m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData));
987 
988     pDBData->SetAutoFilter(true);
989     ScRange aRange;
990     pDBData->GetArea(aRange);
991     m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(),
992                           aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto);
993 
994     //create the query param
995     ScQueryParam aParam;
996     pDBData->GetQueryParam(aParam);
997     ScQueryEntry& rEntry = aParam.GetEntry(0);
998     rEntry.bDoQuery = true;
999     rEntry.nField = 0;
1000     rEntry.eOp = SC_NOT_EQUAL;
1001     rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1
1002     // add queryParam to database range.
1003     pDBData->SetQueryParam(aParam);
1004 
1005     // perform the query.
1006     m_pDoc->Query(srcSheet, aParam, true);
1007 
1008     // Check precondition for test: row 1 is hidden/filtered
1009     SCROW nRow1, nRow2;
1010     SCROW nFilteredRow1, nFilteredRow2;
1011     bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2);
1012     CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden);
1013     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1);
1014     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2);
1015     bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2);
1016     CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered);
1017     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1);
1018     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2);
1019 
1020     // Copy A1:A4 to clip.
1021     ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet);
1022     ScDocument aClipDoc(SCDOCMODE_CLIP);
1023     copyToClip(m_pDoc, aSrcRange, &aClipDoc);
1024 
1025     // transpose
1026     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1027     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::CONTENTS, true, false);
1028 
1029     ScRange aDestRange(1, 1, destSheet, 3, 1, destSheet); // Paste to B2:D2 on Sheet2.
1030     ScMarkData aMark(m_pDoc->GetSheetLimits());
1031     aMark.SetMarkArea(aDestRange);
1032     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, pTransClip.get(),
1033                          true, false, false);
1034     pTransClip.reset();
1035 
1036     // Check pasted content to make sure they reference the correct cells.
1037     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1038     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1039     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1040     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1041 
1042     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1043     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C2.", !pFC);
1044 
1045     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
1046     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1047     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("=$Sheet1.$A$4"), getFormula(3, 1, destSheet));
1048     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1049 
1050     m_pDoc->DeleteTab(destSheet);
1051     m_pDoc->DeleteTab(srcSheet);
1052 }
1053 
1054 // tdf#141683
1055 // InsertDeleteFlags::VALUE
testCopyPasteSpecialMultiRangeRowAsLinkTranspose()1056 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowAsLinkTranspose()
1057 {
1058     const SCTAB srcSheet = 0;
1059     const SCTAB destSheet = 1;
1060 
1061     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
1062 
1063     m_pDoc->InsertTab(srcSheet, "Sheet1");
1064     m_pDoc->InsertTab(destSheet, "Sheet2");
1065 
1066     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
1067     m_pDoc->SetValue(1, 0, srcSheet, 2); // B1
1068     m_pDoc->SetValue(3, 0, srcSheet, 4); // D1
1069 
1070     m_pDoc->SetValue(0, 2, srcSheet, 11); // A3
1071     m_pDoc->SetValue(1, 2, srcSheet, 12); // B3
1072     m_pDoc->SetValue(3, 2, srcSheet, 14); // D3
1073 
1074     ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
1075     aSrcMark.SelectOneTable(0);
1076     ScClipParam aClipParam;
1077     aClipParam.meDirection = ScClipParam::Row;
1078     aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 3, 0, srcSheet)); // A1:D1
1079     aClipParam.maRanges.push_back(ScRange(0, 2, srcSheet, 3, 2, srcSheet)); // A3:D3
1080 
1081     ScDocument aClipDoc(SCDOCMODE_CLIP);
1082     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false);
1083 
1084     // transpose
1085     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1086     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::VALUE, true, false);
1087 
1088     ScRange aDestRange(1, 1, destSheet, 2, 4, destSheet); // Paste to B2:C5 on Sheet2.
1089     ScMarkData aMark(m_pDoc->GetSheetLimits());
1090     aMark.SetMarkArea(aDestRange);
1091     m_pDoc->CopyMultiRangeFromClip(
1092         ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::VALUE | InsertDeleteFlags::FORMULA,
1093         pTransClip.get(), true, false /* false fixes tdf#141683 */, false, false);
1094     pTransClip.reset();
1095 
1096     // Check pasted content to make sure they reference the correct cells.
1097     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1098     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1099     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1100     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1101 
1102     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet));
1103     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC);
1104     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B3", OUString("=$Sheet1.$B$1"), getFormula(1, 2, destSheet));
1105     CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue());
1106 
1107     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, destSheet));
1108     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell B4.", !pFC);
1109 
1110     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 4, destSheet));
1111     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1112     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B5", OUString("=$Sheet1.$D$1"), getFormula(1, 4, destSheet));
1113     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1114 
1115     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1116     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC);
1117     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C2", OUString("=$Sheet1.$A$3"), getFormula(2, 1, destSheet));
1118     CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue());
1119 
1120     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet));
1121     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC);
1122     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C3", OUString("=$Sheet1.$B$3"), getFormula(2, 2, destSheet));
1123     CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue());
1124 
1125     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 3, destSheet));
1126     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C4.", !pFC);
1127 
1128     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 4, destSheet));
1129     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1130     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C5", OUString("=$Sheet1.$D$3"), getFormula(2, 4, destSheet));
1131     CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue());
1132 
1133     m_pDoc->DeleteTab(destSheet);
1134     m_pDoc->DeleteTab(srcSheet);
1135 }
1136 
1137 // tdf#141683
1138 // InsertDeleteFlags::VALUE
testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose()1139 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowAsLinkFilteredTranspose()
1140 {
1141     const SCTAB srcSheet = 0;
1142     const SCTAB destSheet = 1;
1143 
1144     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
1145 
1146     m_pDoc->InsertTab(srcSheet, "Sheet1");
1147     m_pDoc->InsertTab(destSheet, "Sheet2");
1148 
1149     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
1150     m_pDoc->SetValue(1, 0, srcSheet, 2); // B1
1151     m_pDoc->SetValue(3, 0, srcSheet, 4); // D1
1152 
1153     m_pDoc->SetValue(0, 1, srcSheet, -1); // A2, filtered and selected
1154     m_pDoc->SetValue(1, 1, srcSheet, -2); // B2, filtered and selected
1155     m_pDoc->SetValue(3, 1, srcSheet, -4); // D2, filtered and selected
1156 
1157     m_pDoc->SetValue(0, 2, srcSheet, 11); // A3
1158     m_pDoc->SetValue(1, 2, srcSheet, 12); // B3
1159     m_pDoc->SetValue(3, 2, srcSheet, 14); // D3
1160 
1161     m_pDoc->SetValue(0, 3, srcSheet, -11); // A4, filtered and not selected
1162     m_pDoc->SetValue(1, 3, srcSheet, -12); // B4, filtered and not selected
1163     m_pDoc->SetValue(3, 3, srcSheet, -14); // D4, filtered and not selected
1164 
1165     m_pDoc->SetValue(0, 5, srcSheet, 111); // A6
1166     m_pDoc->SetValue(1, 5, srcSheet, 112); // B6
1167     m_pDoc->SetValue(3, 5, srcSheet, 114); // D6
1168 
1169     // Filter row 1
1170     ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 3, 3);
1171     m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData));
1172 
1173     pDBData->SetAutoFilter(true);
1174     ScRange aRange;
1175     pDBData->GetArea(aRange);
1176     m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(),
1177                           aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto);
1178 
1179     //create the query param
1180     ScQueryParam aParam;
1181     pDBData->GetQueryParam(aParam);
1182     ScQueryEntry& rEntry = aParam.GetEntry(0);
1183     rEntry.bDoQuery = true;
1184     rEntry.nField = 0;
1185     rEntry.eOp = SC_GREATER_EQUAL;
1186     rEntry.GetQueryItem().mfVal = 0; // filtering negative values -> filtering row 1 and 2
1187     // add queryParam to database range.
1188     pDBData->SetQueryParam(aParam);
1189 
1190     // perform the query.
1191     m_pDoc->Query(srcSheet, aParam, true);
1192 
1193     ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
1194     aSrcMark.SelectOneTable(0);
1195     ScClipParam aClipParam;
1196     aClipParam.meDirection = ScClipParam::Row;
1197     aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 3, 2, srcSheet)); // A1:C3
1198     aClipParam.maRanges.push_back(ScRange(0, 5, srcSheet, 3, 5, srcSheet)); // A6:C6
1199 
1200     ScDocument aClipDoc(SCDOCMODE_CLIP);
1201     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false);
1202 
1203     printRange(m_pDoc, aClipParam.getWholeRange(), "Src range");
1204     // transpose
1205     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1206     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::VALUE, true, false);
1207 
1208     printRange(&aClipDoc, ScRange(0, 0, 0, 4, 5, 0), "Base doc (&aClipDoc)");
1209     printRange(pTransClip.get(), ScRange(0, 0, 0, 3, 3, 0),
1210                "Transposed filtered clipdoc (pTransClip.get())");
1211     ScRange aDestRange(1, 1, destSheet, 3, 4, destSheet); // Paste to B2:D5 on Sheet2.
1212     ScMarkData aMark(m_pDoc->GetSheetLimits());
1213     aMark.SetMarkArea(aDestRange);
1214     m_pDoc->CopyMultiRangeFromClip(
1215         ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::VALUE | InsertDeleteFlags::FORMULA,
1216         pTransClip.get(), true, false /* false fixes tdf#141683 */, false, false);
1217     pTransClip.reset();
1218     printRange(m_pDoc, aDestRange, "Transposed dest sheet");
1219 
1220     // Check pasted content to make sure they reference the correct cells.
1221     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1222     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1223     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1224     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1225 
1226     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet));
1227     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC);
1228     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B3", OUString("=$Sheet1.$B$1"), getFormula(1, 2, destSheet));
1229     CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue());
1230 
1231     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 3, destSheet));
1232     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell B4.", !pFC);
1233 
1234     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 4, destSheet));
1235     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1236     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B5", OUString("=$Sheet1.$D$1"), getFormula(1, 4, destSheet));
1237     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1238 
1239     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1240     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC);
1241     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C2", OUString("=$Sheet1.$A$3"), getFormula(2, 1, destSheet));
1242     CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue());
1243 
1244     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet));
1245     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC);
1246     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C3", OUString("=$Sheet1.$B$3"), getFormula(2, 2, destSheet));
1247     CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue());
1248 
1249     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 3, destSheet));
1250     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C4.", !pFC);
1251 
1252     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 4, destSheet));
1253     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1254     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C5", OUString("=$Sheet1.$D$3"), getFormula(2, 4, destSheet));
1255     CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue());
1256 
1257     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
1258     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell D2.", pFC);
1259     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("=$Sheet1.$A$6"), getFormula(3, 1, destSheet));
1260     CPPUNIT_ASSERT_EQUAL(111.0, pFC->GetValue());
1261 
1262     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet));
1263     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell D3.", pFC);
1264     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D3", OUString("=$Sheet1.$B$6"), getFormula(3, 2, destSheet));
1265     CPPUNIT_ASSERT_EQUAL(112.0, pFC->GetValue());
1266 
1267     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 3, destSheet));
1268     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D4.", !pFC);
1269 
1270     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 4, destSheet));
1271     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1272     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D5", OUString("=$Sheet1.$D$6"), getFormula(3, 4, destSheet));
1273     CPPUNIT_ASSERT_EQUAL(114.0, pFC->GetValue());
1274 
1275     m_pDoc->DeleteTab(destSheet);
1276     m_pDoc->DeleteTab(srcSheet);
1277 }
1278 
1279 // tdf#141683
1280 // InsertDeleteFlags::VALUE
testCopyPasteSpecialMultiRangeColAsLinkTranspose()1281 void TestCopyPaste::testCopyPasteSpecialMultiRangeColAsLinkTranspose()
1282 {
1283     const SCTAB srcSheet = 0;
1284     const SCTAB destSheet = 1;
1285 
1286     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
1287 
1288     m_pDoc->InsertTab(srcSheet, "Sheet1");
1289     m_pDoc->InsertTab(destSheet, "Sheet2");
1290 
1291     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
1292     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
1293     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
1294 
1295     m_pDoc->SetValue(2, 0, srcSheet, 11); // C1
1296     m_pDoc->SetValue(2, 1, srcSheet, 12); // C2
1297     m_pDoc->SetValue(2, 3, srcSheet, 14); // C4
1298 
1299     ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
1300     aSrcMark.SelectOneTable(0);
1301     ScClipParam aClipParam;
1302     aClipParam.meDirection = ScClipParam::Column;
1303     aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 0, 3, srcSheet)); // A1:A4
1304     aClipParam.maRanges.push_back(ScRange(2, 0, srcSheet, 2, 3, srcSheet)); // C1:C4
1305 
1306     ScDocument aClipDoc(SCDOCMODE_CLIP);
1307     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false);
1308 
1309     // transpose
1310     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1311     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::VALUE, true, false);
1312 
1313     ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2.
1314     ScMarkData aMark(m_pDoc->GetSheetLimits());
1315     aMark.SetMarkArea(aDestRange);
1316     m_pDoc->CopyMultiRangeFromClip(
1317         ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::VALUE | InsertDeleteFlags::FORMULA,
1318         pTransClip.get(), true, false /* false fixes tdf#141683 */, false, false);
1319     pTransClip.reset();
1320 
1321     // Check pasted content to make sure they reference the correct cells.
1322     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1323     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1324     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1325     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1326 
1327     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1328     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C2.", pFC);
1329     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C2", OUString("=$Sheet1.$A$2"), getFormula(2, 1, destSheet));
1330     CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue());
1331 
1332     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
1333     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D2.", !pFC);
1334 
1335     pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet));
1336     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1337     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("=$Sheet1.$A$4"), getFormula(4, 1, destSheet));
1338     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1339 
1340     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet));
1341     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC);
1342     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B3", OUString("=$Sheet1.$C$1"), getFormula(1, 2, destSheet));
1343     CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue());
1344 
1345     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet));
1346     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell C3.", pFC);
1347     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C3", OUString("=$Sheet1.$C$2"), getFormula(2, 2, destSheet));
1348     CPPUNIT_ASSERT_EQUAL(12.0, pFC->GetValue());
1349 
1350     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet));
1351     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell D3.", !pFC);
1352 
1353     pFC = m_pDoc->GetFormulaCell(ScAddress(4, 2, destSheet));
1354     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1355     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E3", OUString("=$Sheet1.$C$4"), getFormula(4, 2, destSheet));
1356     CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue());
1357 
1358     m_pDoc->DeleteTab(destSheet);
1359     m_pDoc->DeleteTab(srcSheet);
1360 }
1361 
1362 // tdf#141683
1363 // InsertDeleteFlags::VALUE
testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose()1364 void TestCopyPaste::testCopyPasteSpecialMultiRangeColAsLinkFilteredTranspose()
1365 {
1366     const SCTAB srcSheet = 0;
1367     const SCTAB destSheet = 1;
1368 
1369     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
1370 
1371     m_pDoc->InsertTab(srcSheet, "Sheet1");
1372     m_pDoc->InsertTab(destSheet, "Sheet2");
1373 
1374     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
1375     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
1376     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
1377 
1378     m_pDoc->SetValue(2, 0, srcSheet, 11); // C1
1379     m_pDoc->SetValue(2, 1, srcSheet, 12); // C2
1380     m_pDoc->SetValue(2, 3, srcSheet, 14); // C4
1381 
1382     // Filter row 1
1383     ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3);
1384     m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData));
1385 
1386     pDBData->SetAutoFilter(true);
1387     ScRange aRange;
1388     pDBData->GetArea(aRange);
1389     m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(),
1390                           aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto);
1391 
1392     //create the query param
1393     ScQueryParam aParam;
1394     pDBData->GetQueryParam(aParam);
1395     ScQueryEntry& rEntry = aParam.GetEntry(0);
1396     rEntry.bDoQuery = true;
1397     rEntry.nField = 0;
1398     rEntry.eOp = SC_NOT_EQUAL;
1399     rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1
1400     // add queryParam to database range.
1401     pDBData->SetQueryParam(aParam);
1402 
1403     // perform the query.
1404     m_pDoc->Query(srcSheet, aParam, true);
1405 
1406     ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
1407     aSrcMark.SelectOneTable(0);
1408     ScClipParam aClipParam;
1409     aClipParam.meDirection = ScClipParam::Column;
1410     aClipParam.maRanges.push_back(ScRange(0, 0, srcSheet, 0, 3, srcSheet)); // A1:A4
1411     aClipParam.maRanges.push_back(ScRange(2, 0, srcSheet, 2, 3, srcSheet)); // C1:C4
1412 
1413     ScDocument aClipDoc(SCDOCMODE_CLIP);
1414     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false);
1415 
1416     // transpose
1417     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1418     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::VALUE, true, false);
1419 
1420     ScRange aDestRange(1, 1, destSheet, 4, 2, destSheet); // Paste to B2:E3 on Sheet2.
1421     ScMarkData aMark(m_pDoc->GetSheetLimits());
1422     aMark.SetMarkArea(aDestRange);
1423     m_pDoc->CopyMultiRangeFromClip(
1424         ScAddress(1, 1, destSheet), aMark, InsertDeleteFlags::VALUE | InsertDeleteFlags::FORMULA,
1425         pTransClip.get(), true, false /* false fixes tdf#141683 */, false, false);
1426     pTransClip.reset();
1427 
1428     // Check pasted content to make sure they reference the correct cells.
1429     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1430     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1431     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1432     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1433 
1434     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1435     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C2.", !pFC);
1436 
1437     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
1438     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1439     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("=$Sheet1.$A$4"), getFormula(3, 1, destSheet));
1440     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1441 
1442     pFC = m_pDoc->GetFormulaCell(ScAddress(1, 2, destSheet));
1443     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B3.", pFC);
1444     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B3", OUString("=$Sheet1.$C$1"), getFormula(1, 2, destSheet));
1445     CPPUNIT_ASSERT_EQUAL(11.0, pFC->GetValue());
1446 
1447     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 2, destSheet));
1448     CPPUNIT_ASSERT_MESSAGE("This should be no formula cell C3.", !pFC);
1449 
1450     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 2, destSheet));
1451     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1452     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D3", OUString("=$Sheet1.$C$4"), getFormula(3, 2, destSheet));
1453     CPPUNIT_ASSERT_EQUAL(14.0, pFC->GetValue());
1454 
1455     m_pDoc->DeleteTab(destSheet);
1456     m_pDoc->DeleteTab(srcSheet);
1457 }
1458 
1459 // InsertDeleteFlags::ALL
testCopyPasteSpecialAllAsLinkTranspose()1460 void TestCopyPaste::testCopyPasteSpecialAllAsLinkTranspose()
1461 {
1462     const SCTAB srcSheet = 0;
1463     const SCTAB destSheet = 1;
1464 
1465     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
1466 
1467     m_pDoc->InsertTab(srcSheet, "Sheet1");
1468     m_pDoc->InsertTab(destSheet, "Sheet2");
1469 
1470     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
1471     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
1472     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
1473 
1474     ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet); // Copy A1:A4 to clip.
1475     ScDocument aClipDoc(SCDOCMODE_CLIP);
1476     copyToClip(m_pDoc, aSrcRange, &aClipDoc);
1477 
1478     // transpose
1479     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1480     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false);
1481 
1482     ScRange aDestRange(1, 1, destSheet, 4, 1, destSheet); // Paste to B2:E2 on Sheet2.
1483     ScMarkData aMark(m_pDoc->GetSheetLimits());
1484     aMark.SetMarkArea(aDestRange);
1485     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true,
1486                          false);
1487     pTransClip.reset();
1488 
1489     // Check pasted content to make sure they reference the correct cells.
1490     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1491     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1492     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1493     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1494 
1495     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1496     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1497     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C2", OUString("=$Sheet1.$A$2"), getFormula(2, 1, destSheet));
1498     CPPUNIT_ASSERT_EQUAL(2.0, pFC->GetValue());
1499 
1500     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
1501     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1502     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("=$Sheet1.$A$3"), getFormula(3, 1, destSheet));
1503     CPPUNIT_ASSERT_EQUAL(0.0, pFC->GetValue());
1504 
1505     pFC = m_pDoc->GetFormulaCell(ScAddress(4, 1, destSheet));
1506     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1507     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("=$Sheet1.$A$4"), getFormula(4, 1, destSheet));
1508     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1509 
1510     m_pDoc->DeleteTab(destSheet);
1511     m_pDoc->DeleteTab(srcSheet);
1512 }
1513 
1514 // InsertDeleteFlags::ALL
testCopyPasteSpecialAllAsLinkFilteredTranspose()1515 void TestCopyPaste::testCopyPasteSpecialAllAsLinkFilteredTranspose()
1516 {
1517     const SCTAB srcSheet = 0;
1518     const SCTAB destSheet = 1;
1519 
1520     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // Turn on auto calc.
1521 
1522     m_pDoc->InsertTab(srcSheet, "Sheet1");
1523     m_pDoc->InsertTab(destSheet, "Sheet2");
1524 
1525     m_pDoc->SetValue(0, 0, srcSheet, 1); // A1
1526     m_pDoc->SetValue(0, 1, srcSheet, 2); // A2
1527     m_pDoc->SetValue(0, 3, srcSheet, 4); // A4
1528 
1529     // Filter row 1
1530     ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, 0, 0, 0, 3);
1531     m_pDoc->SetAnonymousDBData(0, std::unique_ptr<ScDBData>(pDBData));
1532 
1533     pDBData->SetAutoFilter(true);
1534     ScRange aRange;
1535     pDBData->GetArea(aRange);
1536     m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(),
1537                           aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto);
1538 
1539     //create the query param
1540     ScQueryParam aParam;
1541     pDBData->GetQueryParam(aParam);
1542     ScQueryEntry& rEntry = aParam.GetEntry(0);
1543     rEntry.bDoQuery = true;
1544     rEntry.nField = 0;
1545     rEntry.eOp = SC_NOT_EQUAL;
1546     rEntry.GetQueryItem().mfVal = 2; // value of row A2 -> filtering row 1
1547     // add queryParam to database range.
1548     pDBData->SetQueryParam(aParam);
1549 
1550     // perform the query.
1551     m_pDoc->Query(srcSheet, aParam, true);
1552 
1553     // Check precondition for test: row 1 is hidden/filtered
1554     SCROW nRow1, nRow2;
1555     SCROW nFilteredRow1, nFilteredRow2;
1556     bool bHidden = m_pDoc->RowHidden(SCROW(1), srcSheet, &nRow1, &nRow2);
1557     CPPUNIT_ASSERT_MESSAGE("row 1 should be hidden", bHidden);
1558     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow1);
1559     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be hidden", SCROW(1), nRow2);
1560     bool bFiltered = m_pDoc->RowFiltered(SCROW(1), srcSheet, &nFilteredRow1, &nFilteredRow2);
1561     CPPUNIT_ASSERT_MESSAGE("row 1 should be filtered", bFiltered);
1562     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow1);
1563     CPPUNIT_ASSERT_EQUAL_MESSAGE("row 1 should be filtered", SCROW(1), nFilteredRow2);
1564 
1565     // Copy A1:A4 to clip.
1566     ScRange aSrcRange(0, 0, srcSheet, 0, 3, srcSheet);
1567     ScDocument aClipDoc(SCDOCMODE_CLIP);
1568     copyToClip(m_pDoc, aSrcRange, &aClipDoc);
1569 
1570     // transpose
1571     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
1572     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, true, false);
1573 
1574     ScRange aDestRange(1, 1, destSheet, 3, 1, destSheet); // Paste to B2:D2 on Sheet2.
1575     ScMarkData aMark(m_pDoc->GetSheetLimits());
1576     aMark.SetMarkArea(aDestRange);
1577     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(), true,
1578                          false, false);
1579     pTransClip.reset();
1580 
1581     // Check pasted content to make sure they reference the correct cells.
1582     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1, 1, destSheet));
1583     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell B2.", pFC);
1584     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B2", OUString("=$Sheet1.$A$1"), getFormula(1, 1, destSheet));
1585     CPPUNIT_ASSERT_EQUAL(1.0, pFC->GetValue());
1586 
1587     pFC = m_pDoc->GetFormulaCell(ScAddress(2, 1, destSheet));
1588     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1589     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C2", OUString("=$Sheet1.$A$3"), getFormula(2, 1, destSheet));
1590     CPPUNIT_ASSERT_EQUAL(0.0, pFC->GetValue());
1591 
1592     pFC = m_pDoc->GetFormulaCell(ScAddress(3, 1, destSheet));
1593     CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC);
1594     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("=$Sheet1.$A$4"), getFormula(3, 1, destSheet));
1595     CPPUNIT_ASSERT_EQUAL(4.0, pFC->GetValue());
1596 
1597     m_pDoc->DeleteTab(destSheet);
1598     m_pDoc->DeleteTab(srcSheet);
1599 }
1600 
1601 // Compatibility method since normal copy/paste tests do not test undo
executeCopyPasteSpecial(bool bApplyFilter,bool bIncludedFiltered,bool bAsLink,bool bTranspose,bool bMultiRangeSelection,bool bSkipEmpty,bool bCut,ScClipParam::Direction eDirection,CalcMode eCalcMode,InsertDeleteFlags aFlags)1602 void TestCopyPaste::executeCopyPasteSpecial(bool bApplyFilter, bool bIncludedFiltered, bool bAsLink,
1603                                             bool bTranspose, bool bMultiRangeSelection,
1604                                             bool bSkipEmpty, bool bCut,
1605                                             ScClipParam::Direction eDirection, CalcMode eCalcMode,
1606                                             InsertDeleteFlags aFlags)
1607 {
1608     std::unique_ptr<ScUndoCut> pUndoCut;
1609     std::unique_ptr<ScUndoPaste> pUndoPaste;
1610     executeCopyPasteSpecial(0, 1, bApplyFilter, bIncludedFiltered, bAsLink, bTranspose,
1611                             bMultiRangeSelection, bSkipEmpty, pUndoCut, pUndoPaste, bCut,
1612                             eDirection, eCalcMode, aFlags);
1613 }
1614 
1615 // This method is used to create the different copy/paste special test cases.
1616 // Principle: Creation of test cases is parameterized, whereas checking uses a minimum of logic
executeCopyPasteSpecial(const SCTAB srcSheet,const SCTAB destSheet,bool bApplyFilter,bool bIncludedFiltered,bool bAsLink,bool bTranspose,bool bMultiRangeSelection,bool bSkipEmpty,std::unique_ptr<ScUndoCut> & pUndoCut,std::unique_ptr<ScUndoPaste> & pUndoPaste,bool bCut,ScClipParam::Direction eDirection,CalcMode eCalcMode,InsertDeleteFlags aFlags)1617 void TestCopyPaste::executeCopyPasteSpecial(const SCTAB srcSheet, const SCTAB destSheet,
1618                                             bool bApplyFilter, bool bIncludedFiltered, bool bAsLink,
1619                                             bool bTranspose, bool bMultiRangeSelection,
1620                                             bool bSkipEmpty, std::unique_ptr<ScUndoCut>& pUndoCut,
1621                                             std::unique_ptr<ScUndoPaste>& pUndoPaste, bool bCut,
1622                                             ScClipParam::Direction eDirection, CalcMode eCalcMode,
1623                                             InsertDeleteFlags aFlags)
1624 {
1625     // turn on/off auto calc
1626     sc::AutoCalcSwitch aACSwitch(*m_pDoc, eCalcMode == AutoCalc);
1627 
1628     for (int i = 0; i < srcSheet; ++i)
1629         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
1630 
1631     m_pDoc->InsertTab(srcSheet, "SrcSheet");
1632 
1633     // We need a drawing layer in order to create caption objects.
1634     m_pDoc->InitDrawLayer(m_xDocShell.get());
1635     ScFieldEditEngine& rEditEngine = m_pDoc->GetEditEngine();
1636 
1637     /*
1638          | B   |    C     | D    |  E  |     F      |        G            |
1639 
1640     3r   | 1 B*| =B3+10  *| a    | R1 *| =B3+B5+60  | =SUMIF(B3:B6;"<4")  |
1641     4r   | 2 B*| =B4+20 b | b   *| R2 *|            |                    *| <- filtered row
1642     5r   | 3 B*| =E5+30 b*| c   *|  5 *|          B*|                     |
1643     6    | 4   | =B4+40 b*| d   *| R4 *| =B3+B5+70 *|    =C$3+$B$5+80    *|
1644    (7r   | 6   |    q     | r bB*| s bB|     t      |          u          |) optional, for row range
1645    (8    | -1  |    -2    |  -3  | -4  |     -5     |          -6         |) optional, for row range
1646    (9r   | -11 |    -12   | -13  | -14 |     -15    |          -16        |) optional, for row range
1647    (10   | -21 |    -22   | -23  | -24 |     -25    |          -26        |) optional, for row range
1648 
1649           \______________/      \________________________________________/
1650              col range 1                     col range 2
1651 
1652     refs to cells (used for cut/paste tests)
1653     15   | =C5 | =$C$5    | =$C5 | =C$5| =SUM(C5:C5) | =SUM($C5:$C5) | =SUM($C5:$C5) | =SUM(C$5:C$5) | =SUM($B$3:$B$6) | =SUM($B$3:$B$10) |
1654     16   | =Range_C5 | =Range_aCa5    | =Range_aC5 | =Range_Ca5| =SUM(Range_C5_C5) | =SUM(Range_aCa5_aCa5) | =SUM(Range_aC5_aC5) | =SUM(Range_Ca5_Ca5) | =SUM(Range_aCa5_aCa8) | =SUM(Range_aCa5_aCa10) |
1655 
1656     * means note attached
1657     B means background
1658     b means border
1659     r means row selected for row range in multi range selection
1660 
1661     The following test scenarios can be created:
1662 
1663     * Filtered row
1664     * Transpose
1665     * All cell types: numbers, strings, formulas, rich text, empty cell
1666     * Notes at different position
1667     * Formula references to rows before and after filtered row
1668     * Double reference (e.g. B3:B5)
1669     * Relative and absolute references
1670         * absolute references are not changed by transposing
1671     * Formatting patterns (e.g. cell backgrounds and borders)
1672     * Multi range selection with direction column and row
1673 
1674     */
1675     SCCOL nSrcCols = 6;
1676     SCROW nSrcRows = 4;
1677     // Add additional row for MultiRange test cases
1678     if (bMultiRangeSelection)
1679     {
1680         nSrcRows = eDirection == ScClipParam::Row ? nSrcRows + 2 : nSrcRows;
1681         nSrcCols = eDirection == ScClipParam::Column ? nSrcCols + 1 : nSrcCols;
1682     }
1683 
1684     const SCCOL nStartCol = 1;
1685     const SCROW nStartRow = 2;
1686 
1687     // col B
1688     m_pDoc->SetValue(1, 2, srcSheet, 1);
1689     m_pDoc->SetValue(1, 3, srcSheet, 2);
1690     m_pDoc->SetValue(1, 4, srcSheet, 3);
1691     m_pDoc->SetValue(1, 5, srcSheet, 4);
1692     // col C
1693     m_pDoc->SetString(2, 2, srcSheet, "=B3+10");
1694     m_pDoc->SetString(2, 3, srcSheet, "=B4+20");
1695     m_pDoc->SetString(2, 4, srcSheet, "=E5+30");
1696     m_pDoc->SetString(2, 5, srcSheet, "=B4+40");
1697     // col D
1698     m_pDoc->SetString(3, 2, srcSheet, "a");
1699     m_pDoc->SetString(3, 3, srcSheet, "b");
1700     m_pDoc->SetString(3, 4, srcSheet, "c");
1701     m_pDoc->SetString(3, 5, srcSheet, "d");
1702     // col E
1703     rEditEngine.SetTextCurrentDefaults("R1");
1704     m_pDoc->SetEditText(ScAddress(4, 2, srcSheet), rEditEngine.CreateTextObject());
1705     rEditEngine.SetTextCurrentDefaults("R2");
1706     m_pDoc->SetEditText(ScAddress(4, 3, srcSheet), rEditEngine.CreateTextObject());
1707     m_pDoc->SetValue(4, 4, srcSheet, 5);
1708     rEditEngine.SetTextCurrentDefaults("R4");
1709     m_pDoc->SetEditText(ScAddress(4, 5, srcSheet), rEditEngine.CreateTextObject());
1710     // col F
1711     m_pDoc->SetValue(5, 2, srcSheet, 9);
1712     m_pDoc->SetString(5, 2, srcSheet, "=B3+B5+60");
1713     m_pDoc->SetEmptyCell(ScAddress(5, 3, srcSheet));
1714     m_pDoc->SetEmptyCell(ScAddress(5, 4, srcSheet));
1715     m_pDoc->SetString(5, 5, srcSheet, "=B3+B5+70");
1716     // col G
1717     m_pDoc->SetValue(6, 2, srcSheet, 9);
1718     m_pDoc->SetString(6, 2, srcSheet, "=SUMIF(B3:B6;\"<4\")");
1719     m_pDoc->SetEmptyCell(ScAddress(6, 3, srcSheet));
1720     m_pDoc->SetEmptyCell(ScAddress(6, 4, srcSheet));
1721     m_pDoc->SetString(6, 5, srcSheet, "=C$3+$B$5+80");
1722 
1723     const SfxPoolItem* pItem = nullptr;
1724 
1725     // row 6, additional row for MultiRange test case, otherwise not selected
1726     m_pDoc->SetValue(1, 6, srcSheet, 6);
1727     m_pDoc->SetString(2, 6, srcSheet, "q");
1728     m_pDoc->SetString(3, 6, srcSheet, "r");
1729     m_pDoc->SetString(4, 6, srcSheet, "s");
1730     m_pDoc->SetString(5, 6, srcSheet, "t");
1731     m_pDoc->SetString(6, 6, srcSheet, "u");
1732 
1733     // row 7, not selected
1734     m_pDoc->SetValue(1, 7, srcSheet, -1);
1735     m_pDoc->SetValue(2, 7, srcSheet, -2);
1736     m_pDoc->SetValue(3, 7, srcSheet, -3);
1737     m_pDoc->SetValue(4, 7, srcSheet, -4);
1738     m_pDoc->SetValue(5, 7, srcSheet, -5);
1739     m_pDoc->SetValue(6, 7, srcSheet, -6);
1740 
1741     // row 8, additional row for MultiRange test case, otherwise not selected
1742     m_pDoc->SetValue(1, 8, srcSheet, -11);
1743     m_pDoc->SetValue(2, 8, srcSheet, -12);
1744     m_pDoc->SetValue(3, 8, srcSheet, -13);
1745     m_pDoc->SetValue(4, 8, srcSheet, -14);
1746     m_pDoc->SetValue(5, 8, srcSheet, -15);
1747     m_pDoc->SetValue(6, 8, srcSheet, -16);
1748 
1749     // row 9, additional row for MultiRange test case, otherwise not selected
1750     m_pDoc->SetValue(1, 9, srcSheet, -21);
1751     m_pDoc->SetValue(2, 9, srcSheet, -22);
1752     m_pDoc->SetValue(3, 9, srcSheet, -23);
1753     m_pDoc->SetValue(4, 9, srcSheet, -24);
1754     m_pDoc->SetValue(5, 9, srcSheet, -25);
1755     m_pDoc->SetValue(6, 9, srcSheet, -26);
1756 
1757     // Col H, not selected
1758     m_pDoc->SetValue(7, 2, srcSheet, 111);
1759     m_pDoc->SetValue(7, 3, srcSheet, 112);
1760     m_pDoc->SetValue(7, 4, srcSheet, 113);
1761     m_pDoc->SetValue(7, 5, srcSheet, 114);
1762     m_pDoc->SetValue(7, 6, srcSheet, 115);
1763     m_pDoc->SetValue(7, 7, srcSheet, 116);
1764 
1765     // Col I, additional col for MultiRange test case, otherwise not selected
1766     m_pDoc->SetValue(8, 2, srcSheet, 121);
1767     m_pDoc->SetValue(8, 3, srcSheet, 122);
1768     m_pDoc->SetValue(8, 4, srcSheet, 123);
1769     m_pDoc->SetValue(8, 5, srcSheet, 124);
1770     m_pDoc->SetValue(8, 6, srcSheet, 125);
1771     m_pDoc->SetValue(8, 7, srcSheet, 126);
1772 
1773     // Col J, not selected
1774     m_pDoc->SetValue(9, 2, srcSheet, 131);
1775     m_pDoc->SetValue(9, 3, srcSheet, 132);
1776     m_pDoc->SetValue(9, 4, srcSheet, 133);
1777     m_pDoc->SetValue(9, 5, srcSheet, 134);
1778     m_pDoc->SetValue(9, 6, srcSheet, 135);
1779     m_pDoc->SetValue(9, 7, srcSheet, 136);
1780 
1781     // row 16, refs to copied/cut range
1782     m_pDoc->SetString(1, 16, srcSheet, "=C5");
1783     m_pDoc->SetString(2, 16, srcSheet, "=$C$5");
1784     m_pDoc->SetString(3, 16, srcSheet, "=$C5");
1785     m_pDoc->SetString(4, 16, srcSheet, "=C$5");
1786     m_pDoc->SetString(5, 16, srcSheet, "=SUM(C5:C5)");
1787     m_pDoc->SetString(6, 16, srcSheet, "=SUM($C$5:$C$5)");
1788     m_pDoc->SetString(7, 16, srcSheet, "=SUM($C5:$C5)");
1789     m_pDoc->SetString(8, 16, srcSheet, "=SUM(C$5:C$5)");
1790     m_pDoc->SetString(9, 16, srcSheet, "=SUM($B$3:$B$6)");
1791     m_pDoc->SetString(10, 16, srcSheet, "=SUM($B$3:$B$10)");
1792 
1793     // Cell position is used for ranges relative to current position
1794     ScAddress cellC6(2, 5, srcSheet);
1795     ScAddress cellA1(0, 0, srcSheet);
1796     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C5", cellC6, "$SrcSheet.C5"));
1797     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aCa5", cellA1, "$SrcSheet.$C$5"));
1798     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aC5", cellC6, "$SrcSheet.$C5"));
1799     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_Ca5", cellC6, "$SrcSheet.C$5"));
1800     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C5_C5", cellC6, "$SrcSheet.C5:C5"));
1801     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aCa5_aCa5", cellA1, "$SrcSheet.$C$5:$C$5"));
1802     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aC5_aC5", cellC6, "$SrcSheet.$C5:$C5"));
1803     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aC5_aC5", cellC6, "$SrcSheet.$C5:$C5"));
1804     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_Ca5_Ca5", cellC6, "$SrcSheet.C$5:C$5"));
1805     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aCa5_aCa8", cellA1, "$SrcSheet.$B$3:$B$6"));
1806     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_aCa5_aCa10", cellA1, "$SrcSheet.$B$3:$B$10"));
1807 
1808     // row 17, refs to copied/cut range using range
1809     m_pDoc->SetString(1, 17, srcSheet, "=Range_C5");
1810     m_pDoc->SetString(2, 17, srcSheet, "=Range_aCa5");
1811     m_pDoc->SetString(3, 17, srcSheet, "=Range_aC5");
1812     m_pDoc->SetString(4, 17, srcSheet, "=Range_Ca5");
1813     m_pDoc->SetString(5, 17, srcSheet, "=SUM(Range_C5_C5)");
1814     m_pDoc->SetString(6, 17, srcSheet, "=SUM(Range_aCa5_aCa5)");
1815     m_pDoc->SetString(7, 17, srcSheet, "=SUM(Range_aC5_aC5)");
1816     m_pDoc->SetString(8, 17, srcSheet, "=SUM(Range_Ca5_Ca5)");
1817     m_pDoc->SetString(9, 17, srcSheet, "=SUM(Range_aCa5_aCa8)");
1818     m_pDoc->SetString(10, 17, srcSheet, "=SUM(Range_aCa5_aCa10)");
1819 
1820     // add patterns
1821     ScPatternAttr aCellBlueColor(m_pDoc->GetPool());
1822     aCellBlueColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND));
1823     m_pDoc->ApplyPatternAreaTab(1, 2, 1, 4, srcSheet, aCellBlueColor);
1824 
1825     // Check pattern precondition
1826     m_pDoc->GetPattern(ScAddress(1, 2, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
1827     CPPUNIT_ASSERT_MESSAGE("SrcSheet.B3 has a pattern", pItem);
1828     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
1829     m_pDoc->GetPattern(ScAddress(1, 3, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
1830     CPPUNIT_ASSERT_MESSAGE("SrcSheet.B4 has a pattern", pItem);
1831     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
1832     m_pDoc->GetPattern(ScAddress(1, 5, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
1833     CPPUNIT_ASSERT_MESSAGE("SrcSheet.B6 has no pattern", !pItem);
1834 
1835     // row 2 on empty cell
1836     ScPatternAttr aCellGreenColor(m_pDoc->GetPool());
1837     aCellGreenColor.GetItemSet().Put(SvxBrushItem(COL_GREEN, ATTR_BACKGROUND));
1838     m_pDoc->ApplyPatternAreaTab(5, 4, 5, 4, srcSheet, aCellGreenColor);
1839 
1840     // row 4 for multi range row selection
1841     ScPatternAttr aCellRedColor(m_pDoc->GetPool());
1842     aCellRedColor.GetItemSet().Put(SvxBrushItem(COL_RED, ATTR_BACKGROUND));
1843     m_pDoc->ApplyPatternAreaTab(3, 6, 4, 6, srcSheet, aCellRedColor);
1844 
1845     // add borders
1846     ::editeng::SvxBorderLine aLine(nullptr, 50, SvxBorderLineStyle::SOLID);
1847     SvxBoxItem aBorderItem(ATTR_BORDER);
1848     aBorderItem.SetLine(&aLine, SvxBoxItemLine::LEFT);
1849     aBorderItem.SetLine(&aLine, SvxBoxItemLine::RIGHT);
1850     m_pDoc->ApplyAttr(2, 3, srcSheet, aBorderItem);
1851     m_pDoc->ApplyAttr(2, 4, srcSheet, aBorderItem);
1852     m_pDoc->ApplyAttr(2, 5, srcSheet, aBorderItem);
1853     // Check border precondition
1854     pItem = m_pDoc->GetAttr(ScAddress(2, 2, srcSheet), ATTR_BORDER);
1855     CPPUNIT_ASSERT_MESSAGE("SrcSheet.B1 has a border", pItem);
1856     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
1857     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
1858     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
1859     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
1860     pItem = m_pDoc->GetAttr(ScAddress(2, 3, srcSheet), ATTR_BORDER);
1861     CPPUNIT_ASSERT_MESSAGE("SrcSheet.B2 has a border", pItem);
1862     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
1863     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
1864     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
1865     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
1866     // Check border precondition 2
1867     m_pDoc->GetPattern(ScAddress(2, 3, srcSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem);
1868     CPPUNIT_ASSERT_MESSAGE("SrcSheet.B2 has a border", pItem);
1869     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
1870     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
1871     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
1872     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
1873     // row 4 for multi range row selection
1874     ::editeng::SvxBorderLine aDoubleLine(nullptr, 50, SvxBorderLineStyle::DOUBLE);
1875     SvxBoxItem aDoubleBorderItem(ATTR_BORDER);
1876     aDoubleBorderItem.SetLine(&aDoubleLine, SvxBoxItemLine::TOP);
1877     aDoubleBorderItem.SetLine(&aDoubleLine, SvxBoxItemLine::BOTTOM);
1878     m_pDoc->ApplyAttr(3, 6, srcSheet, aDoubleBorderItem);
1879     m_pDoc->ApplyAttr(4, 6, srcSheet, aDoubleBorderItem);
1880 
1881     // add notes to B3:F4
1882 
1883     // add notes row 2
1884     setNote(1, 2, srcSheet, "Note A1");
1885     setNote(2, 2, srcSheet, "Note B1");
1886     // No note on D3
1887     setNote(4, 2, srcSheet, "Note D1");
1888     // No note on F3
1889     // No note on G3
1890 
1891     // add notes row 3
1892     setNote(1, 3, srcSheet, "Note A2");
1893     // No note on C4
1894     setNote(3, 3, srcSheet, "Note C2");
1895     setNote(4, 3, srcSheet, "Note D2");
1896     setNote(5, 4, srcSheet, "Note E2");
1897     setNote(6, 3, srcSheet, "Note F2");
1898 
1899     // add notes row 4
1900     setNote(1, 4, srcSheet, "Note A3");
1901     setNote(2, 4, srcSheet, "Note B3");
1902     setNote(3, 4, srcSheet, "Note C3");
1903     setNote(4, 4, srcSheet, "Note D3");
1904     // No note on F5
1905     // No note on G5
1906 
1907     // add notes row 5
1908     // No note on B6
1909     setNote(2, 5, srcSheet, "Note B4");
1910     setNote(3, 5, srcSheet, "Note C4");
1911     setNote(4, 5, srcSheet, "Note D4");
1912     setNote(5, 5, srcSheet, "Note E4");
1913     setNote(6, 5, srcSheet, "Note F4");
1914 
1915     // row 6 for multi range row selection
1916     setNote(3, 6, srcSheet, "Note C5");
1917 
1918     // Recalc if needed
1919     if (bMultiRangeSelection && bTranspose && eDirection == ScClipParam::Row
1920         && eCalcMode == RecalcAtEnd)
1921         m_pDoc->CalcFormulaTree();
1922     else if (bMultiRangeSelection && bTranspose && eDirection == ScClipParam::Row
1923              && eCalcMode == HardRecalcAtEnd)
1924         m_pDoc->CalcAll();
1925 
1926     // Filter out row 3
1927     if (bApplyFilter)
1928     {
1929         ScDBData* pDBData = new ScDBData("TRANSPOSE_TEST_DATA", srcSheet, nStartCol, nStartRow,
1930                                          nStartCol + nSrcCols - 1, nStartRow + nSrcRows - 1);
1931         m_pDoc->SetAnonymousDBData(srcSheet, std::unique_ptr<ScDBData>(pDBData));
1932 
1933         pDBData->SetAutoFilter(true);
1934         ScRange aRange;
1935         pDBData->GetArea(aRange);
1936         m_pDoc->ApplyFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(),
1937                               aRange.aStart.Row(), aRange.aStart.Tab(), ScMF::Auto);
1938 
1939         //create the query param
1940         ScQueryParam aParam;
1941         pDBData->GetQueryParam(aParam);
1942         ScQueryEntry& rEntry = aParam.GetEntry(0);
1943         rEntry.bDoQuery = true;
1944         rEntry.nField = nStartCol;
1945         rEntry.eOp = SC_NOT_EQUAL;
1946         rEntry.GetQueryItem().mfVal = 2; // value of row B4 -> filtering row 3
1947         // add queryParam to database range.
1948         pDBData->SetQueryParam(aParam);
1949 
1950         // perform the query.
1951         m_pDoc->Query(srcSheet, aParam, true);
1952 
1953         // Check precondition for test: row 3 is hidden/filtered
1954         SCROW nRow1, nRow2;
1955         SCROW nFilteredRow1, nFilteredRow2;
1956         bool bHidden = m_pDoc->RowHidden(SCROW(3), srcSheet, &nRow1, &nRow2);
1957         CPPUNIT_ASSERT_MESSAGE("row 3 should be hidden", bHidden);
1958         CPPUNIT_ASSERT_EQUAL_MESSAGE("row 3 should be hidden", SCROW(3), nRow1);
1959         CPPUNIT_ASSERT_EQUAL_MESSAGE("row 3 should be hidden", SCROW(3), nRow2);
1960         bool bFiltered = m_pDoc->RowFiltered(SCROW(3), srcSheet, &nFilteredRow1, &nFilteredRow2);
1961         CPPUNIT_ASSERT_MESSAGE("row 3 should be filtered", bFiltered);
1962         CPPUNIT_ASSERT_EQUAL_MESSAGE("row 3 should be filtered", SCROW(3), nFilteredRow1);
1963         CPPUNIT_ASSERT_EQUAL_MESSAGE("row 3 should be filtered", SCROW(3), nFilteredRow2);
1964     }
1965 
1966     // create destination sheet
1967     // const SCTAB destSheet = 1;
1968     for (int i = srcSheet + 1; i < destSheet; ++i)
1969         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
1970 
1971     if (srcSheet != destSheet)
1972         m_pDoc->InsertTab(destSheet, "DestSheet");
1973 
1974     m_pDoc->SetString(3, 101, srcSheet, "=DestSheet.D1");
1975     m_pDoc->SetString(3, 102, srcSheet, "=DestSheet.D2");
1976     m_pDoc->SetString(3, 103, srcSheet, "=DestSheet.D3");
1977     m_pDoc->SetString(3, 104, srcSheet, "=DestSheet.D4");
1978     m_pDoc->SetString(3, 105, srcSheet, "=DestSheet.D5");
1979     m_pDoc->SetString(3, 106, srcSheet, "=DestSheet.D6");
1980     m_pDoc->SetString(3, 107, srcSheet, "=DestSheet.D7");
1981     m_pDoc->SetString(4, 101, srcSheet, "=DestSheet.E1");
1982     m_pDoc->SetString(4, 102, srcSheet, "=DestSheet.E2");
1983     m_pDoc->SetString(4, 103, srcSheet, "=DestSheet.E3");
1984     m_pDoc->SetString(4, 104, srcSheet, "=DestSheet.E4");
1985     m_pDoc->SetString(4, 105, srcSheet, "=DestSheet.E5");
1986     m_pDoc->SetString(4, 106, srcSheet, "=DestSheet.E6");
1987     m_pDoc->SetString(4, 107, srcSheet, "=DestSheet.E7");
1988     m_pDoc->SetString(5, 101, srcSheet, "=DestSheet.F1");
1989     m_pDoc->SetString(5, 102, srcSheet, "=DestSheet.F2");
1990     m_pDoc->SetString(5, 103, srcSheet, "=DestSheet.F3");
1991     m_pDoc->SetString(5, 104, srcSheet, "=DestSheet.F4");
1992     m_pDoc->SetString(5, 105, srcSheet, "=DestSheet.F5");
1993     m_pDoc->SetString(5, 106, srcSheet, "=DestSheet.F6");
1994     m_pDoc->SetString(5, 107, srcSheet, "=DestSheet.F7");
1995     m_pDoc->SetString(6, 101, srcSheet, "=DestSheet.G1");
1996     m_pDoc->SetString(6, 102, srcSheet, "=DestSheet.G2");
1997     m_pDoc->SetString(6, 103, srcSheet, "=DestSheet.G3");
1998     m_pDoc->SetString(6, 104, srcSheet, "=DestSheet.G4");
1999     m_pDoc->SetString(6, 105, srcSheet, "=DestSheet.G5");
2000     m_pDoc->SetString(6, 106, srcSheet, "=DestSheet.G6");
2001     m_pDoc->SetString(6, 107, srcSheet, "=DestSheet.G7");
2002     m_pDoc->SetString(7, 101, srcSheet, "=DestSheet.H1");
2003     m_pDoc->SetString(7, 102, srcSheet, "=DestSheet.H2");
2004     m_pDoc->SetString(7, 103, srcSheet, "=DestSheet.H3");
2005     m_pDoc->SetString(7, 104, srcSheet, "=DestSheet.H4");
2006     m_pDoc->SetString(7, 105, srcSheet, "=DestSheet.H5");
2007     m_pDoc->SetString(7, 106, srcSheet, "=DestSheet.H6");
2008     m_pDoc->SetString(7, 107, srcSheet, "=DestSheet.H7");
2009     m_pDoc->SetString(8, 101, srcSheet, "=DestSheet.I1");
2010     m_pDoc->SetString(8, 102, srcSheet, "=DestSheet.I2");
2011     m_pDoc->SetString(8, 103, srcSheet, "=DestSheet.I3");
2012     m_pDoc->SetString(8, 104, srcSheet, "=DestSheet.I4");
2013     m_pDoc->SetString(8, 105, srcSheet, "=DestSheet.I5");
2014     m_pDoc->SetString(8, 106, srcSheet, "=DestSheet.I6");
2015     m_pDoc->SetString(8, 107, srcSheet, "=DestSheet.I7");
2016     m_pDoc->SetString(9, 101, srcSheet, "=DestSheet.J1");
2017     m_pDoc->SetString(9, 102, srcSheet, "=DestSheet.J2");
2018     m_pDoc->SetString(9, 103, srcSheet, "=DestSheet.J3");
2019     m_pDoc->SetString(9, 104, srcSheet, "=DestSheet.J4");
2020     m_pDoc->SetString(9, 105, srcSheet, "=DestSheet.J5");
2021     m_pDoc->SetString(9, 106, srcSheet, "=DestSheet.J6");
2022     m_pDoc->SetString(9, 107, srcSheet, "=DestSheet.J7");
2023 
2024     // Check precondition
2025     checkCopyPasteSpecialInitial(srcSheet);
2026 
2027     // set cells to 1000 to check empty cell behaviour and to detect destination range problems
2028     for (int i = 0; i < 10; ++i)
2029         for (int j = 0; j < 10; ++j)
2030             m_pDoc->SetValue(i, j, destSheet, 1000);
2031 
2032     // transpose clipboard, paste on DestSheet
2033     ScDocument aClipDoc(SCDOCMODE_CLIP);
2034     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
2035     ScRange aDestRange;
2036 
2037     ScDocumentUniquePtr pPasteUndoDoc;
2038     std::unique_ptr<ScDocument> pPasteRefUndoDoc;
2039     std::unique_ptr<ScRefUndoData> pUndoData;
2040 
2041     if (!bMultiRangeSelection)
2042     {
2043         ScRange aSrcRange(nStartCol, nStartRow, srcSheet, nStartCol + nSrcCols - 1,
2044                           nStartRow + nSrcRows - 1, srcSheet);
2045         printRange(m_pDoc, aSrcRange, "Src range");
2046         if (!bCut)
2047             copyToClip(m_pDoc, aSrcRange, &aClipDoc);
2048         else
2049         {
2050             pUndoCut.reset(cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, true));
2051         }
2052 
2053         printRange(&aClipDoc,
2054                    ScRange(nStartCol, nStartRow, srcSheet, nStartCol + nSrcCols,
2055                            nStartRow + nSrcRows, srcSheet),
2056                    "Base doc (&aClipDoc)");
2057 
2058         // ScDocument::TransposeClip() and ScDocument::CopyFromClip() calls
2059         // analog to ScViewFunc::PasteFromClip()
2060         if (bTranspose)
2061         {
2062             ScDocument* pOrigClipDoc = &aClipDoc;
2063             ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
2064             aClipDoc.TransposeClip(pTransClip.get(), aFlags, bAsLink, bIncludedFiltered);
2065             aDestRange = ScRange(3, 1, destSheet, 3 + nSrcRows - 1, 1 + nSrcCols - 1,
2066                                  destSheet); //target: D2:F6
2067             aDestMark.SetMarkArea(aDestRange);
2068             printRange(pTransClip.get(), ScRange(0, 0, srcSheet, nSrcCols, nSrcRows, srcSheet),
2069                        "Transposed clipdoc (pTransClip.get())");
2070 
2071             if (bCut)
2072                 prepareUndoBeforePaste(bCut, pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange,
2073                                        pUndoData);
2074 
2075             m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, pPasteRefUndoDoc.get(),
2076                                  pTransClip.get(), true, bAsLink, bIncludedFiltered, bSkipEmpty);
2077             printRange(m_pDoc, aDestRange, "Transposed dest sheet");
2078             if (bCut)
2079             {
2080                 m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark,
2081                                         pPasteRefUndoDoc.get());
2082                 printRange(m_pDoc, aDestRange, "Transposed dest sheet after UpdateTranspose()");
2083             }
2084             pTransClip.reset();
2085         }
2086         else
2087         {
2088             aDestRange = ScRange(3, 1, destSheet, 3 + nSrcCols - 1, 1 + nSrcRows - 1,
2089                                  destSheet); //target: D2:I5
2090             aDestMark.SetMarkArea(aDestRange);
2091             if (bCut)
2092                 prepareUndoBeforePaste(bCut, pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange,
2093                                        pUndoData);
2094 
2095             m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, pPasteRefUndoDoc.get(), &aClipDoc,
2096                                  true, bAsLink, bIncludedFiltered, bSkipEmpty);
2097             lcl_printValuesAndFormulasInRange(m_pDoc, aDestRange, "Dest sheet");
2098         }
2099 
2100         if (bCut)
2101             prepareUndoAfterPaste(pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange, pUndoData,
2102                                   pUndoPaste, bTranspose, bAsLink, bSkipEmpty);
2103     }
2104     else // multi range selection
2105     {
2106         ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
2107         aSrcMark.SelectOneTable(0);
2108         ScClipParam aClipParam;
2109         aClipParam.meDirection = eDirection;
2110         if (eDirection == ScClipParam::Column)
2111         {
2112             aClipParam.maRanges.push_back(ScRange(1, 2, srcSheet, 2, 5, srcSheet)); // B3:C6
2113             aClipParam.maRanges.push_back(ScRange(4, 2, srcSheet, 6, 5, srcSheet)); // E3:G6
2114             aClipParam.maRanges.push_back(ScRange(8, 2, srcSheet, 8, 5, srcSheet)); // I3:I6
2115         }
2116         else if (eDirection == ScClipParam::Row)
2117         {
2118             aClipParam.maRanges.push_back(ScRange(1, 2, srcSheet, 6, 4, srcSheet)); // B3:G5
2119             aClipParam.maRanges.push_back(ScRange(1, 6, srcSheet, 6, 6, srcSheet)); // B7:G7
2120             aClipParam.maRanges.push_back(ScRange(1, 8, srcSheet, 6, 8, srcSheet)); // A9:G9
2121         }
2122         CPPUNIT_ASSERT(aClipParam.isMultiRange());
2123         m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aSrcMark, false, false);
2124 
2125         // ScDocument::TransposeClip() and ScDocument::CopyMultiRangeFromClip() calls
2126         // analog to ScViewFunc::PasteFromClipToMultiRanges()
2127         if (bTranspose)
2128         {
2129             printRange(m_pDoc, aClipParam.getWholeRange(), "Src range");
2130             ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
2131             aClipDoc.TransposeClip(pTransClip.get(), aFlags, bAsLink, bIncludedFiltered);
2132             aDestRange = ScRange(3, 1, destSheet, 3 + nSrcRows - 1, 1 + nSrcCols - 1 - 1,
2133                                  destSheet); //target col: D2:G6, target row: D2:H6
2134             aDestMark.SetMarkArea(aDestRange);
2135             printRange(&aClipDoc, ScRange(0, 0, srcSheet, nSrcCols, nSrcRows, srcSheet),
2136                        "Base doc (&aClipDoc)");
2137             printRange(pTransClip.get(), ScRange(0, 0, srcSheet, nSrcCols, nSrcRows, srcSheet),
2138                        "Transposed clipdoc (pTransClip.get())");
2139             m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 1, destSheet), aDestMark, aFlags,
2140                                            pTransClip.get(), true, bAsLink && !bTranspose,
2141                                            bIncludedFiltered, bSkipEmpty);
2142             pTransClip.reset();
2143             printRange(m_pDoc, aDestRange, "Transposed dest sheet");
2144         }
2145         else
2146         {
2147             aDestRange = ScRange(3, 1, destSheet, 3 + nSrcCols - 1 - 1, 1 + nSrcRows - 1,
2148                                  destSheet); //target col: D2:I5, target row: D2:I6
2149             aDestMark.SetMarkArea(aDestRange);
2150             m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 1, destSheet), aDestMark, aFlags, &aClipDoc,
2151                                            true, bAsLink && !bTranspose, bIncludedFiltered,
2152                                            bSkipEmpty);
2153         }
2154     }
2155 
2156     if (eCalcMode == RecalcAtEnd)
2157         m_pDoc->CalcFormulaTree();
2158     else if (eCalcMode == HardRecalcAtEnd)
2159         m_pDoc->CalcAll();
2160 }
2161 
testCopyPasteSpecial()2162 void TestCopyPaste::testCopyPasteSpecial()
2163 {
2164     executeCopyPasteSpecial(false, false, false, false, false, false);
2165     checkCopyPasteSpecial(false);
2166 }
2167 
testCopyPasteSpecialFiltered()2168 void TestCopyPaste::testCopyPasteSpecialFiltered()
2169 {
2170     executeCopyPasteSpecial(true, false, false, false, false, false);
2171     checkCopyPasteSpecialFiltered(false);
2172 }
2173 
testCopyPasteSpecialIncludeFiltered()2174 void TestCopyPaste::testCopyPasteSpecialIncludeFiltered()
2175 {
2176     // For bIncludeFiltered=true, the non-filtered outcome is expected
2177     executeCopyPasteSpecial(false, true, false, false, false, false);
2178     checkCopyPasteSpecial(false);
2179 }
2180 
testCopyPasteSpecialFilteredIncludeFiltered()2181 void TestCopyPaste::testCopyPasteSpecialFilteredIncludeFiltered()
2182 {
2183     // For bIncludeFiltered=true, the non-filtered outcome is expected
2184     executeCopyPasteSpecial(true, true, false, false, false, false);
2185     checkCopyPasteSpecial(false);
2186 }
2187 
2188 // similar to TestCopyPaste::testCopyPasteTranspose(), but this test is more complex
testCopyPasteSpecialTranspose()2189 void TestCopyPaste::testCopyPasteSpecialTranspose()
2190 {
2191     executeCopyPasteSpecial(false, false, false, true, false, false);
2192     checkCopyPasteSpecialTranspose(false);
2193 }
2194 
2195 // tdf#107348
testCopyPasteSpecialFilteredTranspose()2196 void TestCopyPaste::testCopyPasteSpecialFilteredTranspose()
2197 {
2198     executeCopyPasteSpecial(true, false, false, true, false, false);
2199     checkCopyPasteSpecialFilteredTranspose(false);
2200 }
2201 
2202 // tdf#107348
testCopyPasteSpecialTransposeIncludeFiltered()2203 void TestCopyPaste::testCopyPasteSpecialTransposeIncludeFiltered()
2204 {
2205     // For bIncludeFiltered=true, the non-filtered outcome is expected
2206     executeCopyPasteSpecial(true, true, false, true, false, false);
2207     checkCopyPasteSpecialTranspose(false);
2208 }
2209 
testCopyPasteSpecialMultiRangeCol()2210 void TestCopyPaste::testCopyPasteSpecialMultiRangeCol()
2211 {
2212     executeCopyPasteSpecial(false, false, false, false, true, false, false, ScClipParam::Column);
2213     checkCopyPasteSpecialMultiRangeCol(false);
2214 }
2215 
testCopyPasteSpecialMultiRangeColIncludeFiltered()2216 void TestCopyPaste::testCopyPasteSpecialMultiRangeColIncludeFiltered()
2217 {
2218     // For bIncludeFiltered=true, the non-filtered outcome is expected
2219     executeCopyPasteSpecial(false, true, false, false, true, false, false, ScClipParam::Column);
2220     checkCopyPasteSpecialMultiRangeCol(false);
2221 }
2222 
2223 // tdf#45958
testCopyPasteSpecialMultiRangeColFiltered()2224 void TestCopyPaste::testCopyPasteSpecialMultiRangeColFiltered()
2225 {
2226     executeCopyPasteSpecial(true, false, false, false, true, false, false, ScClipParam::Column);
2227     checkCopyPasteSpecialMultiRangeColFiltered(false);
2228 }
2229 
2230 // tdf#45958
testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered()2231 void TestCopyPaste::testCopyPasteSpecialMultiRangeColFilteredIncludeFiltered()
2232 {
2233     // For bIncludeFiltered=true, the non-filtered outcome is expected
2234     executeCopyPasteSpecial(true, true, false, false, true, false, false, ScClipParam::Column);
2235     checkCopyPasteSpecialMultiRangeCol(false);
2236 }
2237 
testCopyPasteSpecialMultiRangeColTranspose()2238 void TestCopyPaste::testCopyPasteSpecialMultiRangeColTranspose()
2239 {
2240     executeCopyPasteSpecial(false, false, false, true, true, false, false, ScClipParam::Column);
2241     checkCopyPasteSpecialMultiRangeColTranspose(false);
2242 }
2243 
2244 // tdf#45958, tdf#107348
testCopyPasteSpecialMultiRangeColFilteredTranspose()2245 void TestCopyPaste::testCopyPasteSpecialMultiRangeColFilteredTranspose()
2246 {
2247     executeCopyPasteSpecial(true, false, false, true, true, false, false, ScClipParam::Column);
2248     checkCopyPasteSpecialMultiRangeColFilteredTranspose(false);
2249 }
2250 
2251 // tdf#45958, tdf#107348
testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose()2252 void TestCopyPaste::testCopyPasteSpecialMultiRangeColFilteredIncludeFilteredTranspose()
2253 {
2254     // For bIncludeFiltered=true, the non-filtered outcome is expected
2255     executeCopyPasteSpecial(true, true, false, true, true, false, false, ScClipParam::Column);
2256     checkCopyPasteSpecialMultiRangeColTranspose(false);
2257 }
2258 
testCopyPasteSpecialMultiRangeRow()2259 void TestCopyPaste::testCopyPasteSpecialMultiRangeRow()
2260 {
2261     executeCopyPasteSpecial(false, false, false, false, true, false, false, ScClipParam::Row);
2262     checkCopyPasteSpecialMultiRangeRow(false);
2263 }
2264 
testCopyPasteSpecialMultiRangeRowIncludeFiltered()2265 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowIncludeFiltered()
2266 {
2267     // For bIncludeFiltered=true, the non-filtered outcome is expected
2268     executeCopyPasteSpecial(false, true, false, false, true, false, false, ScClipParam::Row);
2269     checkCopyPasteSpecialMultiRangeRow(false);
2270 }
2271 
2272 // tdf#45958
testCopyPasteSpecialMultiRangeRowFiltered()2273 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFiltered()
2274 {
2275     executeCopyPasteSpecial(true, false, false, false, true, false, false, ScClipParam::Row);
2276     checkCopyPasteSpecialMultiRangeRowFiltered(false);
2277 }
2278 
2279 // tdf#45958
testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered()2280 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFilteredIncludeFiltered()
2281 {
2282     // For bIncludeFiltered=true, the non-filtered outcome is expected
2283     executeCopyPasteSpecial(true, true, false, false, true, false, false, ScClipParam::Row);
2284     checkCopyPasteSpecialMultiRangeRow(false);
2285 }
2286 
testCopyPasteSpecialMultiRangeRowTranspose()2287 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowTranspose()
2288 {
2289     executeCopyPasteSpecial(false, false, false, true, true, false, false, ScClipParam::Row,
2290                             HardRecalcAtEnd);
2291     checkCopyPasteSpecialMultiRangeRowTranspose(false);
2292 }
2293 
2294 // tdf#45958, tdf#107348
testCopyPasteSpecialMultiRangeRowFilteredTranspose()2295 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFilteredTranspose()
2296 {
2297     executeCopyPasteSpecial(true, false, false, true, true, false, false, ScClipParam::Row,
2298                             HardRecalcAtEnd);
2299     checkCopyPasteSpecialMultiRangeRowFilteredTranspose(false);
2300 }
2301 
2302 // tdf#45958, tdf#107348
testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose()2303 void TestCopyPaste::testCopyPasteSpecialMultiRangeRowFilteredIncludeFilteredTranspose()
2304 {
2305     // For bIncludeFiltered=true, the non-filtered outcome is expected
2306     executeCopyPasteSpecial(true, true, false, true, true, false, false, ScClipParam::Row,
2307                             HardRecalcAtEnd);
2308     checkCopyPasteSpecialMultiRangeRowTranspose(false);
2309 }
2310 
testCopyPasteSpecialSkipEmpty()2311 void TestCopyPaste::testCopyPasteSpecialSkipEmpty()
2312 {
2313     executeCopyPasteSpecial(false, false, false, false, false, true);
2314     checkCopyPasteSpecial(true);
2315 }
2316 
testCopyPasteSpecialSkipEmptyFiltered()2317 void TestCopyPaste::testCopyPasteSpecialSkipEmptyFiltered()
2318 {
2319     executeCopyPasteSpecial(true, false, false, false, false, true);
2320     checkCopyPasteSpecialFiltered(true);
2321 }
2322 
testCopyPasteSpecialSkipEmptyIncludeFiltered()2323 void TestCopyPaste::testCopyPasteSpecialSkipEmptyIncludeFiltered()
2324 {
2325     // For bIncludeFiltered=true, the non-filtered outcome is expected
2326     executeCopyPasteSpecial(false, true, false, false, false, true);
2327     checkCopyPasteSpecial(true);
2328 }
2329 
testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered()2330 void TestCopyPaste::testCopyPasteSpecialSkipEmptyFilteredIncludeFiltered()
2331 {
2332     // For bIncludeFiltered=true, the non-filtered outcome is expected
2333     executeCopyPasteSpecial(true, true, false, false, false, true);
2334     checkCopyPasteSpecial(true);
2335 }
2336 
2337 // similar to TestCopyPaste::testCopyPasteTranspose(), but this test is more complex
testCopyPasteSpecialSkipEmptyTranspose()2338 void TestCopyPaste::testCopyPasteSpecialSkipEmptyTranspose()
2339 {
2340     executeCopyPasteSpecial(false, false, false, true, false, true);
2341     checkCopyPasteSpecialTranspose(true);
2342 }
2343 
2344 // tdf#107348
testCopyPasteSpecialSkipEmptyFilteredTranspose()2345 void TestCopyPaste::testCopyPasteSpecialSkipEmptyFilteredTranspose()
2346 {
2347     executeCopyPasteSpecial(true, false, false, true, false, true);
2348     checkCopyPasteSpecialFilteredTranspose(true);
2349 }
2350 
2351 // tdf#107348
testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered()2352 void TestCopyPaste::testCopyPasteSpecialSkipEmptyTransposeIncludeFiltered()
2353 {
2354     // For bIncludeFiltered=true, the non-filtered outcome is expected
2355     executeCopyPasteSpecial(true, true, false, true, false, true);
2356     checkCopyPasteSpecialTranspose(true);
2357 }
2358 
testCopyPasteSpecialSkipEmptyMultiRangeCol()2359 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeCol()
2360 {
2361     executeCopyPasteSpecial(false, false, false, false, true, true, false, ScClipParam::Column);
2362     checkCopyPasteSpecialMultiRangeCol(true);
2363 }
2364 
testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered()2365 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColIncludeFiltered()
2366 {
2367     // For bIncludeFiltered=true, the non-filtered outcome is expected
2368     executeCopyPasteSpecial(false, true, false, false, true, true, false, ScClipParam::Column);
2369     checkCopyPasteSpecialMultiRangeCol(true);
2370 }
2371 
2372 // tdf#45958
testCopyPasteSpecialSkipEmptyMultiRangeColFiltered()2373 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFiltered()
2374 {
2375     executeCopyPasteSpecial(true, false, false, false, true, true, false, ScClipParam::Column);
2376     checkCopyPasteSpecialMultiRangeColFiltered(true);
2377 }
2378 
2379 // tdf#45958
testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered()2380 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFiltered()
2381 {
2382     // For bIncludeFiltered=true, the non-filtered outcome is expected
2383     executeCopyPasteSpecial(true, true, false, false, true, true, false, ScClipParam::Column);
2384     checkCopyPasteSpecialMultiRangeCol(true);
2385 }
2386 
testCopyPasteSpecialSkipEmptyMultiRangeColTranspose()2387 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColTranspose()
2388 {
2389     executeCopyPasteSpecial(false, false, false, true, true, true, false, ScClipParam::Column);
2390     checkCopyPasteSpecialMultiRangeColTranspose(true);
2391 }
2392 
2393 // tdf#45958, tdf#107348
testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose()2394 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredTranspose()
2395 {
2396     // For bIncludeFiltered=true, the non-filtered outcome is expected
2397     executeCopyPasteSpecial(true, false, false, true, true, true, false, ScClipParam::Column);
2398     checkCopyPasteSpecialMultiRangeColFilteredTranspose(true);
2399 }
2400 
2401 // tdf#45958, tdf#107348
testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose()2402 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeColFilteredIncludeFilteredTranspose()
2403 {
2404     // For bIncludeFiltered=true, the non-filtered outcome is expected
2405     executeCopyPasteSpecial(true, true, false, true, true, true, false, ScClipParam::Column);
2406     checkCopyPasteSpecialMultiRangeColTranspose(true);
2407 }
2408 
testCopyPasteSpecialSkipEmptyMultiRangeRow()2409 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRow()
2410 {
2411     executeCopyPasteSpecial(false, false, false, false, true, true, false, ScClipParam::Row);
2412     checkCopyPasteSpecialMultiRangeRow(true);
2413 }
2414 
testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered()2415 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowIncludeFiltered()
2416 {
2417     // For bIncludeFiltered=true, the non-filtered outcome is expected
2418     executeCopyPasteSpecial(false, true, false, false, true, true, false, ScClipParam::Row);
2419     checkCopyPasteSpecialMultiRangeRow(true);
2420 }
2421 
2422 // tdf#45958
testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered()2423 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFiltered()
2424 {
2425     executeCopyPasteSpecial(true, false, false, false, true, true, false, ScClipParam::Row);
2426     checkCopyPasteSpecialMultiRangeRowFiltered(true);
2427 }
2428 
2429 // tdf#45958
testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered()2430 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFiltered()
2431 {
2432     // For bIncludeFiltered=true, the non-filtered outcome is expected
2433     executeCopyPasteSpecial(true, true, false, false, true, true, false, ScClipParam::Row);
2434     checkCopyPasteSpecialMultiRangeRow(true);
2435 }
2436 
testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose()2437 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowTranspose()
2438 {
2439     executeCopyPasteSpecial(false, false, false, true, true, true, false, ScClipParam::Row,
2440                             HardRecalcAtEnd);
2441     checkCopyPasteSpecialMultiRangeRowTranspose(true);
2442 }
2443 
2444 // tdf#45958, tdf#107348
testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose()2445 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredTranspose()
2446 {
2447     executeCopyPasteSpecial(true, false, false, true, true, true, false, ScClipParam::Row,
2448                             HardRecalcAtEnd);
2449     checkCopyPasteSpecialMultiRangeRowFilteredTranspose(true);
2450 }
2451 
2452 // tdf#45958, tdf#107348
testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose()2453 void TestCopyPaste::testCopyPasteSpecialSkipEmptyMultiRangeRowFilteredIncludeFilteredTranspose()
2454 {
2455     // For bIncludeFiltered=true, the non-filtered outcome is expected
2456     executeCopyPasteSpecial(true, true, false, true, true, true, false, ScClipParam::Row,
2457                             HardRecalcAtEnd);
2458     checkCopyPasteSpecialMultiRangeRowTranspose(true);
2459 }
2460 
testCutPasteSpecial()2461 void TestCopyPaste::testCutPasteSpecial()
2462 {
2463     const SCTAB srcSheet = 0;
2464     const SCTAB destSheet = 1;
2465     std::unique_ptr<ScUndoCut> pUndoCut;
2466     std::unique_ptr<ScUndoPaste> pUndoPaste;
2467 
2468     executeCopyPasteSpecial(srcSheet, destSheet, false, true, false, false, false, false, pUndoCut,
2469                             pUndoPaste, true);
2470     checkCopyPasteSpecial(false, true);
2471 
2472     pUndoPaste->Undo();
2473     pUndoCut->Undo();
2474     checkCopyPasteSpecialInitial(srcSheet);
2475 
2476     pUndoCut->Redo();
2477     pUndoPaste->Redo();
2478     checkCopyPasteSpecial(false, true);
2479 
2480     pUndoPaste->Undo();
2481     pUndoCut->Undo();
2482     checkCopyPasteSpecialInitial(srcSheet);
2483 
2484     pUndoPaste.reset();
2485     pUndoCut.reset();
2486 
2487     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
2488         m_pDoc->DeleteTab(i - 1);
2489 }
2490 
testCutPasteSpecialTranspose()2491 void TestCopyPaste::testCutPasteSpecialTranspose()
2492 {
2493     const SCTAB srcSheet = 0;
2494     const SCTAB destSheet = 1;
2495     std::unique_ptr<ScUndoCut> pUndoCut;
2496     std::unique_ptr<ScUndoPaste> pUndoPaste;
2497 
2498     executeCopyPasteSpecial(srcSheet, destSheet, false, true, false, true, false, false, pUndoCut,
2499                             pUndoPaste, true);
2500     checkCopyPasteSpecialTranspose(false, true);
2501 
2502     pUndoPaste->Undo();
2503     pUndoCut->Undo();
2504     checkCopyPasteSpecialInitial(srcSheet);
2505 
2506     pUndoCut->Redo();
2507     pUndoPaste->Redo();
2508     checkCopyPasteSpecialTranspose(false, true);
2509 
2510     pUndoPaste->Undo();
2511     pUndoCut->Undo();
2512     checkCopyPasteSpecialInitial(srcSheet);
2513 
2514     pUndoPaste.reset();
2515     pUndoCut.reset();
2516 
2517     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
2518         m_pDoc->DeleteTab(i - 1);
2519 }
2520 
testCutPasteSpecialSkipEmpty()2521 void TestCopyPaste::testCutPasteSpecialSkipEmpty()
2522 {
2523     const SCTAB srcSheet = 0;
2524     const SCTAB destSheet = 1;
2525     std::unique_ptr<ScUndoCut> pUndoCut;
2526     std::unique_ptr<ScUndoPaste> pUndoPaste;
2527 
2528     executeCopyPasteSpecial(srcSheet, destSheet, false, true, false, false, false, true, pUndoCut,
2529                             pUndoPaste, true);
2530     checkCopyPasteSpecial(true, true);
2531 
2532     pUndoPaste->Undo();
2533     pUndoCut->Undo();
2534     checkCopyPasteSpecialInitial(srcSheet);
2535 
2536     pUndoCut->Redo();
2537     pUndoPaste->Redo();
2538     checkCopyPasteSpecial(true, true);
2539 
2540     pUndoPaste->Undo();
2541     pUndoCut->Undo();
2542     checkCopyPasteSpecialInitial(srcSheet);
2543 
2544     pUndoPaste.reset();
2545     pUndoCut.reset();
2546 
2547     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
2548         m_pDoc->DeleteTab(i - 1);
2549 }
2550 
testCutPasteSpecialSkipEmptyTranspose()2551 void TestCopyPaste::testCutPasteSpecialSkipEmptyTranspose()
2552 {
2553     const SCTAB srcSheet = 0;
2554     const SCTAB destSheet = 1;
2555     std::unique_ptr<ScUndoCut> pUndoCut;
2556     std::unique_ptr<ScUndoPaste> pUndoPaste;
2557 
2558     executeCopyPasteSpecial(srcSheet, destSheet, false, true, false, true, false, true, pUndoCut,
2559                             pUndoPaste, true);
2560     checkCopyPasteSpecialTranspose(true, true);
2561 
2562     pUndoPaste->Undo();
2563     pUndoCut->Undo();
2564     checkCopyPasteSpecialInitial(srcSheet);
2565 
2566     pUndoCut->Redo();
2567     pUndoPaste->Redo();
2568     checkCopyPasteSpecialTranspose(true, true);
2569 
2570     pUndoPaste->Undo();
2571     pUndoCut->Undo();
2572     checkCopyPasteSpecialInitial(srcSheet);
2573 
2574     pUndoPaste.reset();
2575     pUndoCut.reset();
2576 
2577     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
2578         m_pDoc->DeleteTab(i - 1);
2579 }
2580 
2581 // check initial source
checkCopyPasteSpecialInitial(const SCTAB srcSheet)2582 void TestCopyPaste::checkCopyPasteSpecialInitial(const SCTAB srcSheet)
2583 {
2584     const EditTextObject* pEditObj;
2585     // col 1
2586     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(1, 2, srcSheet));
2587     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(1, 3, srcSheet));
2588     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(1, 4, srcSheet));
2589     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(1, 5, srcSheet));
2590     // col 2, formulas
2591     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(2, 2, srcSheet));
2592     CPPUNIT_ASSERT_EQUAL(OUString("=B3+10"), getFormula(2, 2, srcSheet));
2593     CPPUNIT_ASSERT_EQUAL(OUString("=B4+20"), getFormula(2, 3, srcSheet));
2594     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 3, srcSheet));
2595     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 4, srcSheet));
2596     CPPUNIT_ASSERT_EQUAL(OUString("=E5+30"), getFormula(2, 4, srcSheet));
2597     CPPUNIT_ASSERT_EQUAL(42.0, m_pDoc->GetValue(2, 5, srcSheet));
2598     CPPUNIT_ASSERT_EQUAL(OUString("=B4+40"), getFormula(2, 5, srcSheet));
2599     // col 3, strings
2600     CPPUNIT_ASSERT_EQUAL(OUString("a"), m_pDoc->GetString(3, 2, srcSheet));
2601     CPPUNIT_ASSERT_EQUAL(OUString("b"), m_pDoc->GetString(3, 3, srcSheet));
2602     CPPUNIT_ASSERT_EQUAL(OUString("c"), m_pDoc->GetString(3, 4, srcSheet));
2603     CPPUNIT_ASSERT_EQUAL(OUString("d"), m_pDoc->GetString(3, 5, srcSheet));
2604     // col 4, rich text
2605     pEditObj = m_pDoc->GetEditText(ScAddress(4, 2, srcSheet));
2606     CPPUNIT_ASSERT(pEditObj);
2607     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
2608     pEditObj = m_pDoc->GetEditText(ScAddress(4, 3, srcSheet));
2609     CPPUNIT_ASSERT(pEditObj);
2610     CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0));
2611     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 4, srcSheet));
2612     pEditObj = m_pDoc->GetEditText(ScAddress(4, 5, srcSheet));
2613     CPPUNIT_ASSERT(pEditObj);
2614     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
2615     // col 5, formulas
2616     CPPUNIT_ASSERT_EQUAL(OUString("=B3+B5+60"), getFormula(5, 2, srcSheet));
2617     CPPUNIT_ASSERT_EQUAL(64.0, m_pDoc->GetValue(5, 2, srcSheet));
2618     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(5, 3, srcSheet));
2619     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(5, 4, srcSheet));
2620     CPPUNIT_ASSERT_EQUAL(OUString("=B3+B5+70"), getFormula(5, 5, srcSheet));
2621     CPPUNIT_ASSERT_EQUAL(74.0, m_pDoc->GetValue(5, 5, srcSheet));
2622     // col 6, formulas
2623     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(B3:B6;\"<4\")"), getFormula(6, 2, srcSheet));
2624     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(6, 2, srcSheet));
2625     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(6, 3, srcSheet));
2626     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(6, 4, srcSheet));
2627     CPPUNIT_ASSERT_EQUAL(OUString("=C$3+$B$5+80"), getFormula(6, 5, srcSheet));
2628     CPPUNIT_ASSERT_EQUAL(94.0, m_pDoc->GetValue(6, 5, srcSheet));
2629 
2630     // check patterns
2631     const SfxPoolItem* pItem = nullptr;
2632     m_pDoc->GetPattern(ScAddress(1, 2, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2633     CPPUNIT_ASSERT(pItem);
2634     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2635     m_pDoc->GetPattern(ScAddress(1, 3, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2636     CPPUNIT_ASSERT(pItem);
2637     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2638     m_pDoc->GetPattern(ScAddress(1, 4, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2639     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2640     m_pDoc->GetPattern(ScAddress(1, 5, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2641     CPPUNIT_ASSERT(!pItem);
2642     m_pDoc->GetPattern(ScAddress(1, 6, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2643     CPPUNIT_ASSERT(!pItem);
2644     m_pDoc->GetPattern(ScAddress(5, 4, srcSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2645     CPPUNIT_ASSERT(pItem);
2646     CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2647 
2648     // check border, left and right borders were transformed to top and bottom borders
2649     pItem = m_pDoc->GetAttr(ScAddress(2, 2, srcSheet), ATTR_BORDER);
2650     CPPUNIT_ASSERT(pItem);
2651     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2652     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2653     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2654     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
2655     pItem = m_pDoc->GetAttr(ScAddress(2, 3, srcSheet), ATTR_BORDER);
2656     CPPUNIT_ASSERT(pItem);
2657     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2658     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2659     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2660     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
2661     pItem = m_pDoc->GetAttr(ScAddress(2, 4, srcSheet), ATTR_BORDER);
2662     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2663     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2664     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2665     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
2666     pItem = m_pDoc->GetAttr(ScAddress(2, 5, srcSheet), ATTR_BORDER);
2667     CPPUNIT_ASSERT(pItem);
2668     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2669     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2670     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2671     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
2672     pItem = m_pDoc->GetAttr(ScAddress(2, 6, srcSheet), ATTR_BORDER);
2673     CPPUNIT_ASSERT(pItem);
2674     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2675     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2676     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2677     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
2678 
2679     // check notes after transposed copy/paste
2680     // check presence of notes
2681     CPPUNIT_ASSERT(m_pDoc->HasNote(1, 2, srcSheet));
2682     CPPUNIT_ASSERT(m_pDoc->HasNote(2, 2, srcSheet));
2683     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 2, srcSheet));
2684     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 2, srcSheet));
2685     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 2, srcSheet));
2686     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 2, srcSheet));
2687     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 2, srcSheet));
2688     CPPUNIT_ASSERT(m_pDoc->HasNote(1, 3, srcSheet));
2689     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, srcSheet));
2690     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 3, srcSheet));
2691     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, srcSheet));
2692     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 3, srcSheet));
2693     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 3, srcSheet));
2694     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 3, srcSheet));
2695     CPPUNIT_ASSERT(m_pDoc->HasNote(1, 4, srcSheet));
2696     CPPUNIT_ASSERT(m_pDoc->HasNote(2, 4, srcSheet));
2697     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 4, srcSheet));
2698     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 4, srcSheet));
2699     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 4, srcSheet));
2700     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 4, srcSheet));
2701     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 4, srcSheet));
2702     CPPUNIT_ASSERT(!m_pDoc->HasNote(1, 5, srcSheet));
2703     CPPUNIT_ASSERT(m_pDoc->HasNote(2, 5, srcSheet));
2704     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 5, srcSheet));
2705     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 5, srcSheet));
2706     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 5, srcSheet));
2707     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 5, srcSheet));
2708     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 5, srcSheet));
2709     CPPUNIT_ASSERT(!m_pDoc->HasNote(1, 6, srcSheet));
2710     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 6, srcSheet));
2711     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 6, srcSheet));
2712     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 6, srcSheet));
2713     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 6, srcSheet));
2714     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 6, srcSheet));
2715     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 6, srcSheet));
2716 
2717     // check values of notes
2718     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(1, 2, srcSheet));
2719     CPPUNIT_ASSERT_EQUAL(OUString("Note A2"), getNote(1, 3, srcSheet));
2720     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(1, 4, srcSheet));
2721     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(2, 2, srcSheet));
2722     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(2, 4, srcSheet));
2723     CPPUNIT_ASSERT_EQUAL(OUString("Note C2"), getNote(3, 3, srcSheet));
2724     CPPUNIT_ASSERT_EQUAL(OUString("Note C3"), getNote(3, 4, srcSheet));
2725     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(4, 2, srcSheet));
2726     CPPUNIT_ASSERT_EQUAL(OUString("Note D2"), getNote(4, 3, srcSheet));
2727     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(4, 4, srcSheet));
2728     CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(5, 4, srcSheet));
2729     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(5, 5, srcSheet));
2730     CPPUNIT_ASSERT_EQUAL(OUString("Note F2"), getNote(6, 3, srcSheet));
2731     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(6, 5, srcSheet));
2732 
2733     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
2734     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
2735     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
2736     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
2737     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
2738     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
2739     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
2740     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
2741     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
2742     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
2743 
2744     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
2745     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
2746     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
2747     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
2748     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
2749     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
2750     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
2751     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
2752     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
2753     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
2754 
2755     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
2756     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
2757     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
2758     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
2759     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
2760     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
2761     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
2762     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
2763     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
2764     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
2765 
2766     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
2767     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
2768     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
2769     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
2770     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
2771     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
2772     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
2773     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
2774     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
2775     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
2776 
2777     // Existing references to the destination range must not change
2778     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
2779     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
2780     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
2781     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
2782     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
2783     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
2784     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
2785     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
2786     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
2787     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
2788     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
2789     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
2790     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
2791     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
2792     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
2793     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
2794     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
2795     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
2796     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
2797     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
2798     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
2799     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
2800     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
2801     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
2802     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
2803     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
2804     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
2805     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
2806     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
2807     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
2808     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
2809     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
2810     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
2811     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
2812     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
2813     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
2814     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
2815     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
2816     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
2817     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
2818     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
2819     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
2820     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
2821     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
2822     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
2823     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
2824     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
2825     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
2826     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
2827 }
2828 
2829 // Base check, nothing filtered, nothing transposed
checkCopyPasteSpecial(bool bSkipEmpty,bool bCut)2830 void TestCopyPaste::checkCopyPasteSpecial(bool bSkipEmpty, bool bCut)
2831 {
2832     const SCTAB srcSheet = 0;
2833     const SCTAB destSheet = 1;
2834 
2835     /*
2836          |  D  |    E     | F  |  G  |     H      |        I            |
2837 
2838     2    | 1 B*| =D2+10  *| a  | R1 *| =D2+D4+60  | =SUMIF(D2:D5;"<4")  |
2839     3    | 2 B*| =D3+20 b | b *| R2 *|            |                    *|
2840     4    | 3 B*| =G4+30 b*| c *|  5 *|          B*|                     |
2841     5    | 4   | =D3+40 b*| d *| R4 *| =D2+D4+70 *|    =E$3+$B$5+80    *|
2842 
2843     * means note attached
2844     B means background
2845     b means border
2846     */
2847 
2848     const EditTextObject* pEditObj;
2849     // col 2
2850     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
2851     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
2852     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
2853     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
2854     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
2855     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
2856     // col 3, numbers
2857     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
2858     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
2859     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(3, 2, destSheet));
2860     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 3, destSheet));
2861     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(3, 4, destSheet));
2862     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 5, destSheet));
2863     // col 4, formulas
2864     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
2865     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 1, destSheet));
2866     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(4, 1, destSheet));
2867     CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), getFormula(4, 2, destSheet));
2868     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(4, 2, destSheet));
2869     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 3, destSheet));
2870     CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), getFormula(4, 3, destSheet));
2871     CPPUNIT_ASSERT_EQUAL(42.0, m_pDoc->GetValue(4, 4, destSheet));
2872     CPPUNIT_ASSERT_EQUAL(OUString("=D3+40"), getFormula(4, 4, destSheet));
2873     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
2874     // col 5, strings
2875     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
2876     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(5, 0, destSheet));
2877     CPPUNIT_ASSERT_EQUAL(OUString("a"), m_pDoc->GetString(5, 1, destSheet));
2878     CPPUNIT_ASSERT_EQUAL(OUString("b"), m_pDoc->GetString(5, 2, destSheet));
2879     CPPUNIT_ASSERT_EQUAL(OUString("c"), m_pDoc->GetString(5, 3, destSheet));
2880     CPPUNIT_ASSERT_EQUAL(OUString("d"), m_pDoc->GetString(5, 4, destSheet));
2881     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
2882     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(5, 5, destSheet));
2883     // col 6, rich text
2884     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
2885     pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet));
2886     CPPUNIT_ASSERT(pEditObj == nullptr);
2887     pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet));
2888     CPPUNIT_ASSERT(pEditObj);
2889     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
2890     pEditObj = m_pDoc->GetEditText(ScAddress(6, 2, destSheet));
2891     CPPUNIT_ASSERT(pEditObj);
2892     CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0));
2893     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(6, 3, destSheet));
2894     pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet));
2895     CPPUNIT_ASSERT(pEditObj);
2896     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
2897     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 5, destSheet));
2898     pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet));
2899     CPPUNIT_ASSERT(pEditObj == nullptr);
2900     // col 7, formulas
2901     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
2902     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 0, destSheet));
2903     CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), getFormula(7, 1, destSheet));
2904     CPPUNIT_ASSERT_EQUAL(64.0, m_pDoc->GetValue(7, 1, destSheet));
2905     if (!bSkipEmpty)
2906     {
2907         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 2, destSheet));
2908         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 3, destSheet));
2909     }
2910     else
2911     {
2912         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
2913         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
2914     }
2915     CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+70"), getFormula(7, 4, destSheet));
2916     CPPUNIT_ASSERT_EQUAL(74.0, m_pDoc->GetValue(7, 4, destSheet));
2917     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
2918     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
2919     // col 8, formulas
2920     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 0, destSheet));
2921     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 0, destSheet));
2922     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), getFormula(8, 1, destSheet));
2923     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(8, 1, destSheet));
2924     if (!bSkipEmpty)
2925     {
2926         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(8, 2, destSheet));
2927         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(8, 3, destSheet));
2928     }
2929     else
2930     {
2931         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 2, destSheet));
2932         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 3, destSheet));
2933     }
2934     OUString aStr;
2935     double fValue = m_pDoc->GetValue(8, 4, destSheet);
2936     m_pDoc->GetFormula(8, 4, destSheet, aStr);
2937     if (!bCut)
2938     {
2939         CPPUNIT_ASSERT_EQUAL(OUString("=E$3+$B$5+80"), aStr);
2940         CPPUNIT_ASSERT_EQUAL(1102.0, fValue);
2941     }
2942     else
2943     {
2944         CPPUNIT_ASSERT_EQUAL(OUString("=E$2+$D$4+80"), aStr);
2945         CPPUNIT_ASSERT_EQUAL(94.0, fValue);
2946     }
2947     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 5, destSheet));
2948     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 5, destSheet));
2949     // col 9, numbers
2950     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 0, destSheet));
2951     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 1, destSheet));
2952     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 2, destSheet));
2953     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 3, destSheet));
2954     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 4, destSheet));
2955     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 5, destSheet));
2956 
2957     // check patterns
2958     const SfxPoolItem* pItem = nullptr;
2959     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2960     CPPUNIT_ASSERT(pItem);
2961     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2962     m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2963     CPPUNIT_ASSERT(pItem);
2964     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2965     m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2966     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2967     m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2968     CPPUNIT_ASSERT(!pItem);
2969     m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2970     CPPUNIT_ASSERT(!pItem);
2971     m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
2972     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
2973     if (!bSkipEmpty)
2974         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
2975 
2976     // check border, left and right borders were transformed to top and bottom borders
2977     pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER);
2978     CPPUNIT_ASSERT(pItem);
2979     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2980     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2981     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2982     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
2983     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
2984     CPPUNIT_ASSERT(pItem);
2985     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2986     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2987     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2988     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
2989     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
2990     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2991     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2992     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2993     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
2994     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
2995     CPPUNIT_ASSERT(pItem);
2996     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
2997     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
2998     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
2999     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
3000     pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER);
3001     CPPUNIT_ASSERT(pItem);
3002     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
3003     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3004     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3005     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
3006 
3007     // check notes after transposed copy/paste
3008     // check presence of notes
3009     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
3010     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
3011     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
3012     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
3013     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
3014     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
3015     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 0, destSheet));
3016     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 0, destSheet));
3017     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
3018     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
3019     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
3020     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 1, destSheet));
3021     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 1, destSheet));
3022     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
3023     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 1, destSheet));
3024     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 1, destSheet));
3025     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
3026     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
3027     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 2, destSheet));
3028     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
3029     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 2, destSheet));
3030     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 2, destSheet));
3031     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(8, 2, destSheet));
3032     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 2, destSheet));
3033     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
3034     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 3, destSheet));
3035     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
3036     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
3037     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 3, destSheet));
3038     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(7, 3, destSheet));
3039     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 3, destSheet));
3040     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 3, destSheet));
3041     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
3042     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
3043     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 4, destSheet));
3044     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 4, destSheet));
3045     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 4, destSheet));
3046     CPPUNIT_ASSERT(m_pDoc->HasNote(7, 4, destSheet));
3047     CPPUNIT_ASSERT(m_pDoc->HasNote(8, 4, destSheet));
3048     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 4, destSheet));
3049     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 5, destSheet));
3050     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 5, destSheet));
3051     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 5, destSheet));
3052     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 5, destSheet));
3053     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 5, destSheet));
3054     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 5, destSheet));
3055     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 5, destSheet));
3056     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 5, destSheet));
3057 
3058     // check values of notes
3059     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
3060     CPPUNIT_ASSERT_EQUAL(OUString("Note A2"), getNote(3, 2, destSheet));
3061     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(3, 3, destSheet));
3062     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(4, 1, destSheet));
3063     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 3, destSheet));
3064     CPPUNIT_ASSERT_EQUAL(OUString("Note C2"), getNote(5, 2, destSheet));
3065     CPPUNIT_ASSERT_EQUAL(OUString("Note C3"), getNote(5, 3, destSheet));
3066     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(6, 1, destSheet));
3067     CPPUNIT_ASSERT_EQUAL(OUString("Note D2"), getNote(6, 2, destSheet));
3068     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(6, 3, destSheet));
3069     if (!bSkipEmpty)
3070         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(7, 3, destSheet));
3071     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(7, 4, destSheet));
3072     if (!bSkipEmpty)
3073         CPPUNIT_ASSERT_EQUAL(OUString("Note F2"), getNote(8, 2, destSheet));
3074     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(8, 4, destSheet));
3075 
3076     // Existing references to the destination range must not change
3077     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
3078     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
3079     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
3080     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
3081     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
3082     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
3083     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
3084     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
3085     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
3086     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
3087     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
3088     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
3089     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
3090     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
3091     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
3092     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
3093     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
3094     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
3095     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
3096     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
3097     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
3098     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
3099     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
3100     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
3101     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
3102     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
3103     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
3104     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
3105     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
3106     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
3107     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
3108     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
3109     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
3110     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
3111     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
3112     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
3113     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
3114     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
3115     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
3116     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
3117     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
3118     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
3119     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
3120     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
3121     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
3122     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
3123     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
3124     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
3125     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
3126 
3127     // row 14 on src sheet, refs to copied/cut range
3128     if (!bCut)
3129     {
3130         CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
3131         CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
3132         CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
3133         CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
3134         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
3135         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
3136         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
3137         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
3138         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
3139         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
3140 
3141         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
3142         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
3143         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
3144         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
3145         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
3146         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
3147         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
3148         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
3149         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
3150         CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
3151 
3152         CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
3153         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
3154         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
3155         CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
3156         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
3157         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
3158         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
3159         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
3160         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
3161         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
3162 
3163         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
3164         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
3165         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
3166         CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
3167         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
3168         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
3169         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
3170         CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
3171         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
3172         CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
3173 
3174         m_pDoc->DeleteTab(destSheet);
3175         m_pDoc->DeleteTab(srcSheet);
3176     }
3177     else
3178     {
3179         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(1, 16, srcSheet));
3180         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.$E$4"), getFormula(2, 16, srcSheet));
3181         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.$E4"), getFormula(3, 16, srcSheet));
3182         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E$4"), getFormula(4, 16, srcSheet));
3183         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.E4:E4)"), getFormula(5, 16, srcSheet));
3184         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.$E$4:$E$4)"), getFormula(6, 16, srcSheet));
3185         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.$E4:$E4)"), getFormula(7, 16, srcSheet));
3186         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.E$4:E$4)"), getFormula(8, 16, srcSheet));
3187         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.$D$2:$D$5)"), getFormula(9, 16, srcSheet));
3188         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
3189 
3190         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
3191         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
3192         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
3193         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
3194         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
3195         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
3196         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
3197         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
3198         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
3199         CPPUNIT_ASSERT_EQUAL(-27.0, m_pDoc->GetValue(10, 16, srcSheet));
3200 
3201         CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
3202         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
3203         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
3204         CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
3205         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
3206         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
3207         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
3208         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
3209         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
3210         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
3211 
3212         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
3213         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
3214         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
3215         CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(4, 17, srcSheet));
3216         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
3217         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
3218         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
3219         CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
3220         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
3221         CPPUNIT_ASSERT_EQUAL(-27.0, m_pDoc->GetValue(10, 17, srcSheet));
3222     }
3223 }
3224 
checkCopyPasteSpecialFiltered(bool bSkipEmpty)3225 void TestCopyPaste::checkCopyPasteSpecialFiltered(bool bSkipEmpty)
3226 {
3227     const SCTAB srcSheet = 0;
3228     const SCTAB destSheet = 1;
3229 
3230     /*
3231          |  D  |    E     | F  |  G  |     H      |        I            |
3232 
3233     2    | 1 B*| =D2+10  *| a  | R1 *| =D2+D4+60  | =SUMIF(D2:D5;"<4")  |
3234     3    | 3 B*| =G3+30 b*| c *|  5 *|          B*|                     |
3235     4    | 4   | =D2+40 b*| d *| R4 *| =D1+D3+70 *|    =E$3+$B$5+80    *|
3236     5    | 1 B*| =D5+10  *| a  | R1 *| =D5+D7+60  | =SUMIF(D5:D8;"<4")  |   <- repeated row
3237 
3238     * means note attached
3239     B means background
3240     b means border
3241     */
3242 
3243     const EditTextObject* pEditObj;
3244 
3245     // col 2
3246     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
3247     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
3248     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
3249     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
3250     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
3251     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
3252     // col 3, numbers
3253     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
3254     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
3255     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 2, destSheet));
3256     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(3, 3, destSheet));
3257     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 4, destSheet)); // repeated row 1
3258     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 5, destSheet));
3259     // col 4, formulas
3260     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
3261     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(4, 0, destSheet));
3262     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 1, destSheet));
3263     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(4, 1, destSheet));
3264     CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), getFormula(4, 2, destSheet));
3265     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 2, destSheet));
3266     CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), getFormula(4, 3, destSheet));
3267     CPPUNIT_ASSERT_EQUAL(41.0, m_pDoc->GetValue(4, 3, destSheet));
3268     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 4, destSheet)); // repeated row 1
3269     CPPUNIT_ASSERT_EQUAL(OUString("=D5+10"), getFormula(4, 4, destSheet));
3270     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 4, destSheet));
3271     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
3272     // col 5, strings
3273     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
3274     CPPUNIT_ASSERT_EQUAL(OUString("a"), m_pDoc->GetString(5, 1, destSheet));
3275     CPPUNIT_ASSERT_EQUAL(OUString("c"), m_pDoc->GetString(5, 2, destSheet));
3276     CPPUNIT_ASSERT_EQUAL(OUString("d"), m_pDoc->GetString(5, 3, destSheet));
3277     CPPUNIT_ASSERT_EQUAL(OUString("a"), m_pDoc->GetString(5, 4, destSheet)); // repeated row 1
3278     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
3279     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(4, 5, destSheet));
3280     // col 6, rich text
3281     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
3282     pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet));
3283     CPPUNIT_ASSERT(pEditObj == nullptr);
3284     pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet));
3285     CPPUNIT_ASSERT(pEditObj);
3286     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
3287     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(6, 2, destSheet));
3288     pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet));
3289     CPPUNIT_ASSERT(pEditObj);
3290     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
3291     pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet)); // repeated row 1
3292     CPPUNIT_ASSERT(pEditObj);
3293     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
3294     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 5, destSheet));
3295     pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet));
3296     CPPUNIT_ASSERT(pEditObj == nullptr);
3297     // col 7, formulas
3298     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
3299     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 0, destSheet));
3300     CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), getFormula(7, 1, destSheet));
3301     // formula is not adjusted due to filter row
3302     CPPUNIT_ASSERT_EQUAL(65.0, m_pDoc->GetValue(7, 1, destSheet));
3303     if (!bSkipEmpty)
3304         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 2, destSheet));
3305     else
3306         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
3307     CPPUNIT_ASSERT_EQUAL(OUString("=D1+D3+70"), getFormula(7, 3, destSheet));
3308     CPPUNIT_ASSERT_EQUAL(1073.0, m_pDoc->GetValue(7, 3, destSheet));
3309     CPPUNIT_ASSERT_EQUAL(OUString("=D5+D7+60"), getFormula(7, 4, destSheet)); // repeated row 1
3310     // formula is not adjusted due to filter row
3311     CPPUNIT_ASSERT_EQUAL(1061.0, m_pDoc->GetValue(7, 4, destSheet));
3312     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
3313     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
3314     // col 8, formulas
3315     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 0, destSheet));
3316     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 0, destSheet));
3317     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), getFormula(8, 1, destSheet));
3318     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(8, 1, destSheet));
3319     if (!bSkipEmpty)
3320         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(8, 2, destSheet));
3321     else
3322         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 2, destSheet));
3323     CPPUNIT_ASSERT_EQUAL(1115.0, m_pDoc->GetValue(8, 3, destSheet));
3324     CPPUNIT_ASSERT_EQUAL(OUString("=E$3+$B$5+80"), getFormula(8, 3, destSheet));
3325     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D5:D8;\"<4\")"), getFormula(8, 4, destSheet));
3326     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(8, 4, destSheet));
3327     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 5, destSheet));
3328     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 5, destSheet));
3329     // col 9, numbers
3330     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 0, destSheet));
3331     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 1, destSheet));
3332     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 2, destSheet));
3333     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 3, destSheet));
3334     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 4, destSheet));
3335     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 5, destSheet));
3336 
3337     // check patterns
3338     const SfxPoolItem* pItem = nullptr;
3339     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3340     CPPUNIT_ASSERT(pItem);
3341     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
3342     m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3343     CPPUNIT_ASSERT(pItem);
3344     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
3345     m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3346     CPPUNIT_ASSERT(!pItem);
3347     m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3348     CPPUNIT_ASSERT(pItem);
3349     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
3350     m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3351     CPPUNIT_ASSERT(!pItem);
3352     m_pDoc->GetPattern(ScAddress(7, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3353     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
3354     if (!bSkipEmpty)
3355         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
3356 
3357     // check border, left and right borders were transformed to top and bottom borders
3358     pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER);
3359     CPPUNIT_ASSERT(pItem);
3360     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
3361     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3362     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3363     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
3364     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
3365     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
3366     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3367     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3368     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
3369     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
3370     CPPUNIT_ASSERT(pItem);
3371     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
3372     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3373     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3374     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
3375     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
3376     CPPUNIT_ASSERT(pItem);
3377     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
3378     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3379     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3380     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
3381 
3382     // check notes after transposed copy/paste
3383     // check presence of notes
3384     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
3385     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
3386     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
3387     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
3388     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
3389     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
3390     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 0, destSheet));
3391     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 0, destSheet));
3392     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
3393     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
3394     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
3395     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 1, destSheet));
3396     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 1, destSheet));
3397     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
3398     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 1, destSheet));
3399     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 1, destSheet));
3400     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
3401     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
3402     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 2, destSheet));
3403     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
3404     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 2, destSheet));
3405     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(7, 2, destSheet));
3406     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 2, destSheet));
3407     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 2, destSheet));
3408     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
3409     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 3, destSheet));
3410     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
3411     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
3412     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 3, destSheet));
3413     CPPUNIT_ASSERT(m_pDoc->HasNote(7, 3, destSheet));
3414     CPPUNIT_ASSERT(m_pDoc->HasNote(8, 3, destSheet));
3415     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 3, destSheet));
3416     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
3417     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 4, destSheet));
3418     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 4, destSheet));
3419     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 4, destSheet));
3420     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 4, destSheet));
3421     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 4, destSheet));
3422     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 4, destSheet));
3423     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 4, destSheet));
3424     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 5, destSheet));
3425     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 5, destSheet));
3426     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 5, destSheet));
3427     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 5, destSheet));
3428     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 5, destSheet));
3429     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 5, destSheet));
3430     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 5, destSheet));
3431     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 5, destSheet));
3432 
3433     // check values of notes
3434     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
3435     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(3, 2, destSheet));
3436     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(4, 1, destSheet));
3437     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 2, destSheet));
3438     CPPUNIT_ASSERT_EQUAL(OUString("Note C3"), getNote(5, 2, destSheet));
3439     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(6, 1, destSheet));
3440     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(6, 2, destSheet));
3441     if (!bSkipEmpty)
3442         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(7, 2, destSheet));
3443     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(7, 3, destSheet));
3444     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(8, 3, destSheet));
3445 
3446     m_pDoc->DeleteTab(destSheet);
3447     m_pDoc->DeleteTab(srcSheet);
3448 }
3449 
checkCopyPasteSpecialTranspose(bool bSkipEmpty,bool bCut)3450 void TestCopyPaste::checkCopyPasteSpecialTranspose(bool bSkipEmpty, bool bCut)
3451 {
3452     const SCTAB srcSheet = 0;
3453     const SCTAB destSheet = 1;
3454 
3455     /*
3456              |         D          |    E     |    F     |       G       |
3457 
3458         2    |         1        B*|    2   B*|    3   B*|       4       |
3459         3    |      =D2+10       *| =E2+20 b | =F5+30 b*|    =E2+40   b*|
3460         4    |         a          |    b    *|    c    *|       d      *|
3461         5    |        R1         *|   R2    *|    5    *|      R4      *|
3462         6    |     =D2+F2+60      |          |        B*|  =D2+F2+70   *|
3463         7    | =SUMIF(D2:G2;"<4") |         *|          | =C$3+$B$5+80 *|
3464 
3465         * means note attached
3466         B means background
3467         b means border
3468     */
3469 
3470     //check cell content after transposed copy/paste of filtered data
3471     // Note: column F is a repetition of srcSheet.Column A
3472     // Col C and G are checked to be empty
3473     const EditTextObject* pEditObj;
3474     // row 0
3475     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
3476     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
3477     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
3478     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
3479     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
3480     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
3481     // row 1, numbers
3482     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
3483     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell D2", 1.0, m_pDoc->GetValue(3, 1, destSheet));
3484     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell E2", 2.0, m_pDoc->GetValue(4, 1, destSheet));
3485     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell F2", 3.0, m_pDoc->GetValue(5, 1, destSheet));
3486     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell G2", 4.0, m_pDoc->GetValue(6, 1, destSheet));
3487     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 1, destSheet));
3488     // row 2, formulas
3489     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
3490     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 2, destSheet));
3491     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", OUString("=D2+10"), getFormula(3, 2, destSheet));
3492     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", 11.0, m_pDoc->GetValue(3, 2, destSheet));
3493     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", OUString("=E2+20"), getFormula(4, 2, destSheet));
3494     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", 22.0, m_pDoc->GetValue(4, 2, destSheet));
3495     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", OUString("=F5+30"), getFormula(5, 2, destSheet));
3496     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", 35.0, m_pDoc->GetValue(5, 2, destSheet));
3497     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G3", OUString("=E2+40"), getFormula(6, 2, destSheet));
3498     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G3", 42.0, m_pDoc->GetValue(6, 2, destSheet));
3499     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
3500     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 2, destSheet));
3501     // row 3, strings
3502     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
3503     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 3, destSheet));
3504     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4", OUString("a"), m_pDoc->GetString(3, 3, destSheet));
3505     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("b"), m_pDoc->GetString(4, 3, destSheet));
3506     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("c"), m_pDoc->GetString(5, 3, destSheet));
3507     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4", OUString("d"), m_pDoc->GetString(6, 3, destSheet));
3508     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
3509     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 3, destSheet));
3510     // row 4, rich text
3511     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
3512     pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet));
3513     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr);
3514     pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet));
3515     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj);
3516     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"),
3517                                  pEditObj->GetText(0));
3518     pEditObj = m_pDoc->GetEditText(ScAddress(4, 4, destSheet));
3519     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in E5.", pEditObj);
3520     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong E5.", OUString("R2"), pEditObj->GetText(0));
3521     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell F5", 5.0, m_pDoc->GetValue(5, 4, destSheet));
3522     pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet));
3523     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in G5.", pEditObj);
3524     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong G5.", OUString("R4"), pEditObj->GetText(0));
3525     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 4, destSheet));
3526     pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet));
3527     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr);
3528     // row 5, formulas
3529     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
3530     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
3531     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", OUString("=D2+F2+60"),
3532                                  getFormula(3, 5, destSheet));
3533     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", 64.0, m_pDoc->GetValue(3, 5, destSheet));
3534     if (!bSkipEmpty)
3535     {
3536         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 5, destSheet));
3537         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(5, 5, destSheet));
3538     }
3539     else
3540     {
3541         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
3542         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
3543     }
3544     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G6", OUString("=D2+F2+70"),
3545                                  getFormula(6, 5, destSheet));
3546     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G6", 74.0, m_pDoc->GetValue(6, 5, destSheet));
3547     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
3548     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
3549     // row 6, formulas
3550     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 6, destSheet));
3551     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 6, destSheet));
3552     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", OUString("=SUMIF(D2:G2;\"<4\")"),
3553                                  getFormula(3, 6, destSheet));
3554     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", 6.0, m_pDoc->GetValue(3, 6, destSheet));
3555     if (!bSkipEmpty)
3556     {
3557         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 6, destSheet));
3558         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(5, 6, destSheet));
3559     }
3560     else
3561     {
3562         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 6, destSheet));
3563         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 6, destSheet));
3564     }
3565     double fValue = m_pDoc->GetValue(6, 6, destSheet); // G7
3566     OUString aStr;
3567     m_pDoc->GetFormula(6, 6, destSheet, aStr); // G7
3568     if (!bCut)
3569     {
3570         CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G7", OUString("=C$3+$B$5+80"), aStr);
3571         CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G7", 2080.0, fValue);
3572     }
3573     else
3574     {
3575         CPPUNIT_ASSERT_EQUAL(OUString("=D$3+$F$2+80"), aStr);
3576         CPPUNIT_ASSERT_EQUAL(94.0, fValue);
3577     }
3578     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 6, destSheet));
3579     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 6, destSheet));
3580     // row 7
3581     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
3582     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
3583     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
3584     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
3585     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
3586     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
3587 
3588     // check patterns
3589     const SfxPoolItem* pItem = nullptr;
3590     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3591     CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem);
3592     CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE,
3593                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
3594     m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3595     CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem);
3596     CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has blue background", COL_BLUE,
3597                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
3598     m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3599     CPPUNIT_ASSERT_MESSAGE("F2 has a pattern", pItem);
3600     CPPUNIT_ASSERT_EQUAL_MESSAGE("F2 has a pattern", COL_BLUE,
3601                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
3602     m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3603     CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem);
3604     m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3605     CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem);
3606     m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
3607     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
3608     if (!bSkipEmpty)
3609         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
3610 
3611     // check border, left and right borders were transformed to top and bottom borders
3612     pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER);
3613     CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem);
3614     CPPUNIT_ASSERT_MESSAGE("D3 has no top border",
3615                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
3616     CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border",
3617                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3618     CPPUNIT_ASSERT_MESSAGE("D3 has no left border",
3619                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3620     CPPUNIT_ASSERT_MESSAGE("D3 has no right border",
3621                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
3622 
3623     m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem);
3624     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
3625     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
3626 
3627     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
3628     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
3629     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
3630 
3631     CPPUNIT_ASSERT_MESSAGE("E3 has bottom border",
3632                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3633     CPPUNIT_ASSERT_MESSAGE("E3 has no left border",
3634                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3635     CPPUNIT_ASSERT_MESSAGE("E3 has no right border",
3636                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
3637     pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER);
3638     CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem);
3639     CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
3640     CPPUNIT_ASSERT_MESSAGE("F3 has bottom border",
3641                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3642     CPPUNIT_ASSERT_MESSAGE("F3 has no left border",
3643                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3644     CPPUNIT_ASSERT_MESSAGE("F3 has no right border",
3645                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
3646     pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER);
3647     CPPUNIT_ASSERT_MESSAGE("G3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
3648     CPPUNIT_ASSERT_MESSAGE("G3 has bottom border",
3649                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3650     CPPUNIT_ASSERT_MESSAGE("G3 has no left border",
3651                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3652     CPPUNIT_ASSERT_MESSAGE("G3 has no right border",
3653                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
3654     pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER);
3655     CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem);
3656     CPPUNIT_ASSERT_MESSAGE("H3 has no top border",
3657                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
3658     CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border",
3659                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
3660     CPPUNIT_ASSERT_MESSAGE("H3 has no left border",
3661                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
3662     CPPUNIT_ASSERT_MESSAGE("H3 has no right border",
3663                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
3664 
3665     // check notes after transposed copy/paste
3666     // check presence of notes
3667     CPPUNIT_ASSERT_MESSAGE("C1: no note", !m_pDoc->HasNote(2, 0, destSheet));
3668     CPPUNIT_ASSERT_MESSAGE("D1: no note", !m_pDoc->HasNote(3, 0, destSheet));
3669     CPPUNIT_ASSERT_MESSAGE("E1: no note", !m_pDoc->HasNote(4, 0, destSheet));
3670     CPPUNIT_ASSERT_MESSAGE("F1: no note", !m_pDoc->HasNote(5, 0, destSheet));
3671     CPPUNIT_ASSERT_MESSAGE("G1: no note", !m_pDoc->HasNote(6, 0, destSheet));
3672     CPPUNIT_ASSERT_MESSAGE("H1: no note", !m_pDoc->HasNote(7, 0, destSheet));
3673     CPPUNIT_ASSERT_MESSAGE("C2: no note", !m_pDoc->HasNote(2, 1, destSheet));
3674     CPPUNIT_ASSERT_MESSAGE("D2:  a note", m_pDoc->HasNote(3, 1, destSheet));
3675     CPPUNIT_ASSERT_MESSAGE("E2:  a note", m_pDoc->HasNote(4, 1, destSheet));
3676     CPPUNIT_ASSERT_MESSAGE("F2:  a note", m_pDoc->HasNote(5, 1, destSheet));
3677     CPPUNIT_ASSERT_MESSAGE("G2: no note", !m_pDoc->HasNote(6, 1, destSheet));
3678     CPPUNIT_ASSERT_MESSAGE("H2: no note", !m_pDoc->HasNote(7, 1, destSheet));
3679     CPPUNIT_ASSERT_MESSAGE("C3: no note", !m_pDoc->HasNote(2, 2, destSheet));
3680     CPPUNIT_ASSERT_MESSAGE("D3:  a note", m_pDoc->HasNote(3, 2, destSheet));
3681     CPPUNIT_ASSERT_MESSAGE("E3: no note", !m_pDoc->HasNote(4, 2, destSheet));
3682     CPPUNIT_ASSERT_MESSAGE("F3:  a note", m_pDoc->HasNote(5, 2, destSheet));
3683     CPPUNIT_ASSERT_MESSAGE("G3:  a note", m_pDoc->HasNote(6, 2, destSheet));
3684     CPPUNIT_ASSERT_MESSAGE("H3: no note", !m_pDoc->HasNote(7, 2, destSheet));
3685     CPPUNIT_ASSERT_MESSAGE("C4: no note", !m_pDoc->HasNote(2, 3, destSheet));
3686     CPPUNIT_ASSERT_MESSAGE("D4: no note", !m_pDoc->HasNote(3, 3, destSheet));
3687     CPPUNIT_ASSERT_MESSAGE("E4:  a note", m_pDoc->HasNote(4, 3, destSheet));
3688     CPPUNIT_ASSERT_MESSAGE("F4:  a note", m_pDoc->HasNote(5, 3, destSheet));
3689     CPPUNIT_ASSERT_MESSAGE("G4:  a note", m_pDoc->HasNote(6, 3, destSheet));
3690     CPPUNIT_ASSERT_MESSAGE("H4: no note", !m_pDoc->HasNote(7, 3, destSheet));
3691     CPPUNIT_ASSERT_MESSAGE("C5: no note", !m_pDoc->HasNote(2, 4, destSheet));
3692     CPPUNIT_ASSERT_MESSAGE("D5:  a note", m_pDoc->HasNote(3, 4, destSheet));
3693     CPPUNIT_ASSERT_MESSAGE("E5:  a note", m_pDoc->HasNote(4, 4, destSheet));
3694     CPPUNIT_ASSERT_MESSAGE("F5:  a note", m_pDoc->HasNote(5, 4, destSheet));
3695     CPPUNIT_ASSERT_MESSAGE("G5:  a note", m_pDoc->HasNote(6, 4, destSheet));
3696     CPPUNIT_ASSERT_MESSAGE("H5: no note", !m_pDoc->HasNote(7, 4, destSheet));
3697     CPPUNIT_ASSERT_MESSAGE("C6: no note", !m_pDoc->HasNote(2, 5, destSheet));
3698     CPPUNIT_ASSERT_MESSAGE("D6: no note", !m_pDoc->HasNote(3, 5, destSheet));
3699     CPPUNIT_ASSERT_MESSAGE("E6: no note", !m_pDoc->HasNote(4, 5, destSheet));
3700     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(5, 5, destSheet));
3701     CPPUNIT_ASSERT_MESSAGE("G6:  a note", m_pDoc->HasNote(6, 5, destSheet));
3702     CPPUNIT_ASSERT_MESSAGE("H6: no note", !m_pDoc->HasNote(7, 5, destSheet));
3703     CPPUNIT_ASSERT_MESSAGE("C7: no note", !m_pDoc->HasNote(2, 6, destSheet));
3704     CPPUNIT_ASSERT_MESSAGE("D7: no note", !m_pDoc->HasNote(3, 6, destSheet));
3705     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(4, 6, destSheet));
3706     CPPUNIT_ASSERT_MESSAGE("F7: no note", !m_pDoc->HasNote(5, 6, destSheet));
3707     CPPUNIT_ASSERT_MESSAGE("G7:  a note", m_pDoc->HasNote(6, 6, destSheet));
3708     CPPUNIT_ASSERT_MESSAGE("H7: no note", !m_pDoc->HasNote(7, 6, destSheet));
3709     CPPUNIT_ASSERT_MESSAGE("C8: no note", !m_pDoc->HasNote(2, 7, destSheet));
3710     CPPUNIT_ASSERT_MESSAGE("D8: no note", !m_pDoc->HasNote(3, 7, destSheet));
3711     CPPUNIT_ASSERT_MESSAGE("E8: no note", !m_pDoc->HasNote(4, 7, destSheet));
3712     CPPUNIT_ASSERT_MESSAGE("F8: no note", !m_pDoc->HasNote(5, 7, destSheet));
3713     CPPUNIT_ASSERT_MESSAGE("G8: no note", !m_pDoc->HasNote(6, 7, destSheet));
3714     CPPUNIT_ASSERT_MESSAGE("H8: no note", !m_pDoc->HasNote(7, 7, destSheet));
3715 
3716     // check values of notes
3717     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("Note A1"), getNote(3, 1, destSheet));
3718     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("Note A2"), getNote(4, 1, destSheet));
3719     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F2", OUString("Note A3"), getNote(5, 1, destSheet));
3720     // G2 has no note
3721     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D3", OUString("Note B1"), getNote(3, 2, destSheet));
3722     // E3 has no note
3723     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F3", OUString("Note B3"), getNote(5, 2, destSheet));
3724     // D4 has no note
3725     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("Note C2"), getNote(4, 3, destSheet));
3726     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("Note C3"), getNote(5, 3, destSheet));
3727     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D5", OUString("Note D1"), getNote(3, 4, destSheet));
3728     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", OUString("Note D2"), getNote(4, 4, destSheet));
3729     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F5", OUString("Note D3"), getNote(5, 4, destSheet));
3730     if (!bSkipEmpty)
3731         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(5, 5, destSheet));
3732     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G6", OUString("Note E4"), getNote(6, 5, destSheet));
3733     if (!bSkipEmpty)
3734         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E7", OUString("Note F2"), getNote(4, 6, destSheet));
3735     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G7", OUString("Note F4"), getNote(6, 6, destSheet));
3736 
3737     // row 14 on src sheet, refs to copied/cut range
3738     if (!bCut)
3739     {
3740         CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
3741         CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
3742         CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
3743         CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
3744         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
3745         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
3746         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
3747         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
3748         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
3749         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
3750 
3751         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
3752         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
3753         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
3754         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
3755         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
3756         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
3757         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
3758         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
3759         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
3760         CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
3761 
3762         CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
3763         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
3764         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
3765         CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
3766         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
3767         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
3768         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
3769         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
3770         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
3771         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
3772 
3773         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
3774         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
3775         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
3776         CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
3777         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
3778         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
3779         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
3780         CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
3781         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
3782         CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
3783 
3784         // Existing references to the destination range must not change
3785         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
3786         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
3787         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
3788         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
3789         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
3790         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
3791         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
3792         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
3793         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
3794         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
3795         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
3796         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
3797         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
3798         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
3799         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
3800         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
3801         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
3802         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
3803         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
3804         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
3805         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
3806         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
3807         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
3808         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
3809         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
3810         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
3811         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
3812         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
3813         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
3814         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
3815         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
3816         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
3817         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
3818         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
3819         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
3820         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
3821         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
3822         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
3823         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
3824         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
3825         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
3826         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
3827         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
3828         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
3829         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
3830         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
3831         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
3832         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
3833         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
3834 
3835         m_pDoc->DeleteTab(destSheet);
3836         m_pDoc->DeleteTab(srcSheet);
3837     }
3838     else
3839     {
3840         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(1, 16, srcSheet));
3841         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.$F$3"), getFormula(2, 16, srcSheet));
3842         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.$F3"), getFormula(3, 16, srcSheet));
3843         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F$3"), getFormula(4, 16, srcSheet));
3844         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.F3:F3)"), getFormula(5, 16, srcSheet));
3845         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.$F$3:$F$3)"), getFormula(6, 16, srcSheet));
3846         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.$F3:$F3)"), getFormula(7, 16, srcSheet));
3847         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.F$3:F$3)"), getFormula(8, 16, srcSheet));
3848         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(DestSheet.$D$2:$G$2)"), getFormula(9, 16, srcSheet));
3849         CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
3850 
3851         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
3852         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
3853         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
3854         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
3855         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
3856         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
3857         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
3858         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
3859         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
3860         CPPUNIT_ASSERT_EQUAL(-27.0, m_pDoc->GetValue(10, 16, srcSheet));
3861 
3862         CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
3863         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
3864         CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
3865         CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
3866         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
3867         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
3868         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
3869         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
3870         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
3871         CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
3872 
3873         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
3874         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
3875         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
3876         CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(4, 17, srcSheet));
3877         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
3878         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
3879         CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
3880         CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
3881         CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
3882         CPPUNIT_ASSERT_EQUAL(-27.0, m_pDoc->GetValue(10, 17, srcSheet));
3883 
3884         // Existing references to the destination range must not change
3885         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
3886         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
3887         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
3888         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
3889         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
3890         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
3891         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
3892         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
3893         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
3894         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
3895         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
3896         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
3897         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
3898         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
3899         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
3900         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
3901         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
3902         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
3903         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
3904         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
3905         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
3906         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
3907         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
3908         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
3909         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
3910         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
3911         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
3912         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
3913         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
3914         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
3915         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
3916         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
3917         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
3918         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
3919         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
3920         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
3921         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
3922         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
3923         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
3924         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
3925         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
3926         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
3927         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
3928         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
3929         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
3930         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
3931         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
3932         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
3933         CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
3934     }
3935 }
3936 
checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty)3937 void TestCopyPaste::checkCopyPasteSpecialFilteredTranspose(bool bSkipEmpty)
3938 {
3939     const SCTAB srcSheet = 0;
3940     const SCTAB destSheet = 1;
3941 
3942     /*
3943                                   ┌--- filtered src row 2          ┌--- repeated row
3944                                   v                                v
3945 
3946              |     D              |    E     |      F        |     G              |
3947 
3948         2    |     1            B*|   3    B*|      4        |     1            B*|
3949         3    |  =D2+10           *| =E5+30 b*| =D2+40      b*|  =G2+10           *|
3950         4    |     a              |    c    *|      d       *|     a              |
3951         5    |    R1             *|    5    *|     R4       *|    R1             *|
3952         6    | =D2+F2+60          |        B*| =C2+E2+70    *| =G2+I2+60          |
3953         7    | =SUMIF(D2:G2;"<4") |          | =B$3+$B$5+80 *| =SUMIF(G2:J2;"<4") |
3954 
3955         * means note attached
3956     */
3957 
3958     //check cell content after transposed copy/paste of filtered data
3959     // Note: column F is a repetition of srcSheet.Column A
3960     // Col C and G are checked to be empty
3961     const EditTextObject* pEditObj;
3962     // row 0
3963     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
3964     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
3965     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
3966     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
3967     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
3968     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
3969     // row 1, numbers
3970     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
3971     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 1, destSheet));
3972     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell D2", 1.0, m_pDoc->GetValue(3, 1, destSheet));
3973     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell E2", 3.0, m_pDoc->GetValue(4, 1, destSheet));
3974     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell F2", 4.0, m_pDoc->GetValue(5, 1, destSheet));
3975     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell G2 (repetition of D2)", 1.0,
3976                                  m_pDoc->GetValue(6, 1, destSheet));
3977     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 1, destSheet));
3978     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 1, destSheet));
3979     // row 2, formulas
3980     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
3981     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 2, destSheet));
3982     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", 11.0, m_pDoc->GetValue(3, 2, destSheet));
3983     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", OUString("=D2+10"), getFormula(3, 2, destSheet));
3984     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", OUString("=E5+30"), getFormula(4, 2, destSheet));
3985     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", 35.0, m_pDoc->GetValue(4, 2, destSheet));
3986     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", OUString("=D2+40"), getFormula(5, 2, destSheet));
3987     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", 41.0, m_pDoc->GetValue(5, 2, destSheet));
3988     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", 11.0, m_pDoc->GetValue(6, 2, destSheet));
3989     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G3 (repetition of D3)", OUString("=G2+10"),
3990                                  getFormula(6, 2, destSheet));
3991     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
3992     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 2, destSheet));
3993     // row 3, strings
3994     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
3995     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 3, destSheet));
3996     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4", OUString("a"), m_pDoc->GetString(3, 3, destSheet));
3997     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("c"), m_pDoc->GetString(4, 3, destSheet));
3998     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("d"), m_pDoc->GetString(5, 3, destSheet));
3999     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4 (repetition of D4)", OUString("a"),
4000                                  m_pDoc->GetString(6, 3, destSheet));
4001     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
4002     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 3, destSheet));
4003     // row 4, rich text
4004     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
4005     pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet));
4006     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr);
4007     pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet));
4008     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj);
4009     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"),
4010                                  pEditObj->GetText(0));
4011     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell E5", 5.0, m_pDoc->GetValue(4, 4, destSheet));
4012     pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet));
4013     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in F5.", pEditObj);
4014     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong F5.", OUString("R4"), pEditObj->GetText(0));
4015     pEditObj = m_pDoc->GetEditText(ScAddress(6, 4, destSheet));
4016     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in G5. (repetition of D5)", pEditObj);
4017     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong G5. (repetition of D5)", OUString("R1"),
4018                                  pEditObj->GetText(0));
4019     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 4, destSheet));
4020     pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet));
4021     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr);
4022     // row 5, formulas
4023     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
4024     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
4025     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", OUString("=D2+F2+60"),
4026                                  getFormula(3, 5, destSheet));
4027     // formulas over filtered rows are not adjusted
4028     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", 65.0,
4029                                  m_pDoc->GetValue(ScAddress(3, 5, destSheet)));
4030     if (!bSkipEmpty)
4031         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 5, destSheet));
4032     else
4033         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
4034     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F6", OUString("=C2+E2+70"),
4035                                  getFormula(5, 5, destSheet));
4036     // F6,  formulas over filtered rows are not adjusted
4037     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F6", 1073.0,
4038                                  m_pDoc->GetValue(ScAddress(5, 5, destSheet)));
4039     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G6 (repetition of D6)", OUString("=G2+I2+60"),
4040                                  getFormula(6, 5, destSheet));
4041     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G6 (repetition of D6)", 1061.0,
4042                                  m_pDoc->GetValue(6, 5, destSheet));
4043     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
4044     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
4045     // row 6, formulas
4046     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 6, destSheet));
4047     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 6, destSheet));
4048     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", OUString("=SUMIF(D2:G2;\"<4\")"),
4049                                  getFormula(3, 6, destSheet));
4050     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", 5.0, m_pDoc->GetValue(3, 6, destSheet));
4051     if (!bSkipEmpty)
4052         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 6, destSheet));
4053     else
4054         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 6, destSheet));
4055     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F7", OUString("=B$3+$B$5+80"),
4056                                  getFormula(5, 6, destSheet));
4057     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F6", 2080.0, m_pDoc->GetValue(5, 6, destSheet));
4058     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G7 (repetition of D7)",
4059                                  OUString("=SUMIF(G2:J2;\"<4\")"), getFormula(6, 6, destSheet));
4060     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed G7 (repetition of D7)", 1061.0,
4061                                  m_pDoc->GetValue(6, 5, destSheet));
4062     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 6, destSheet));
4063     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 6, destSheet));
4064 
4065     // row
4066     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
4067     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
4068     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
4069     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
4070     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
4071     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
4072 
4073     // check patterns
4074 
4075     const SfxPoolItem* pItem = nullptr;
4076     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4077     CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem);
4078     CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE,
4079                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
4080     m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4081     CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem);
4082     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4083     m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4084     CPPUNIT_ASSERT_MESSAGE("F2 has no pattern", !pItem);
4085     m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4086     CPPUNIT_ASSERT_MESSAGE("G2 has a pattern", pItem);
4087     CPPUNIT_ASSERT_EQUAL_MESSAGE("G2 has a pattern", COL_BLUE,
4088                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
4089     m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4090     CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem);
4091     m_pDoc->GetPattern(ScAddress(4, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4092     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
4093     if (!bSkipEmpty)
4094         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4095 
4096     // check border, left and right borders were transformed to top and bottom borders
4097     pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER);
4098     CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem);
4099     CPPUNIT_ASSERT_MESSAGE("D3 has no top border",
4100                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
4101     CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border",
4102                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4103     CPPUNIT_ASSERT_MESSAGE("D3 has no left border",
4104                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4105     CPPUNIT_ASSERT_MESSAGE("D3 has no right border",
4106                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
4107     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
4108     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
4109     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
4110     CPPUNIT_ASSERT_MESSAGE("E3 has bottom border",
4111                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4112     CPPUNIT_ASSERT_MESSAGE("E3 has no left border",
4113                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4114     CPPUNIT_ASSERT_MESSAGE("E3 has no right border",
4115                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
4116     pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER);
4117     CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem);
4118     CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
4119     CPPUNIT_ASSERT_MESSAGE("F3 has bottom border",
4120                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4121     CPPUNIT_ASSERT_MESSAGE("F3 has no left border",
4122                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4123     CPPUNIT_ASSERT_MESSAGE("F3 has no right border",
4124                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
4125     pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER);
4126     CPPUNIT_ASSERT_MESSAGE("G3 has a border", pItem);
4127     CPPUNIT_ASSERT_MESSAGE("G3 has no top border",
4128                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
4129     CPPUNIT_ASSERT_MESSAGE("G3 has no bottom border",
4130                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4131     CPPUNIT_ASSERT_MESSAGE("G3 has no left border",
4132                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4133     CPPUNIT_ASSERT_MESSAGE("G3 has no right border",
4134                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
4135     pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER);
4136     CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem);
4137     CPPUNIT_ASSERT_MESSAGE("H3 has no top border",
4138                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
4139     CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border",
4140                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4141     CPPUNIT_ASSERT_MESSAGE("H3 has no left border",
4142                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4143     CPPUNIT_ASSERT_MESSAGE("H3 has no right border",
4144                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
4145 
4146     // check notes after transposed copy/paste
4147     // check presence of notes
4148     CPPUNIT_ASSERT_MESSAGE("C1: no note", !m_pDoc->HasNote(2, 0, destSheet));
4149     CPPUNIT_ASSERT_MESSAGE("D1: no note", !m_pDoc->HasNote(3, 0, destSheet));
4150     CPPUNIT_ASSERT_MESSAGE("E1: no note", !m_pDoc->HasNote(4, 0, destSheet));
4151     CPPUNIT_ASSERT_MESSAGE("F1: no note", !m_pDoc->HasNote(5, 0, destSheet));
4152     CPPUNIT_ASSERT_MESSAGE("G1: no note", !m_pDoc->HasNote(6, 0, destSheet));
4153     CPPUNIT_ASSERT_MESSAGE("H1: no note", !m_pDoc->HasNote(7, 0, destSheet));
4154     CPPUNIT_ASSERT_MESSAGE("C2: no note", !m_pDoc->HasNote(2, 1, destSheet));
4155     CPPUNIT_ASSERT_MESSAGE("D2:  a note", m_pDoc->HasNote(3, 1, destSheet));
4156     CPPUNIT_ASSERT_MESSAGE("E2:  a note", m_pDoc->HasNote(4, 1, destSheet));
4157     CPPUNIT_ASSERT_MESSAGE("F2: no note", !m_pDoc->HasNote(5, 1, destSheet));
4158     CPPUNIT_ASSERT_MESSAGE("G2:  a note", m_pDoc->HasNote(6, 1, destSheet));
4159     CPPUNIT_ASSERT_MESSAGE("H2: no note", !m_pDoc->HasNote(7, 1, destSheet));
4160     CPPUNIT_ASSERT_MESSAGE("C3: no note", !m_pDoc->HasNote(2, 2, destSheet));
4161     CPPUNIT_ASSERT_MESSAGE("D3:  a note", m_pDoc->HasNote(3, 2, destSheet));
4162     CPPUNIT_ASSERT_MESSAGE("E3:  a note", m_pDoc->HasNote(4, 2, destSheet));
4163     CPPUNIT_ASSERT_MESSAGE("F3:  a note", m_pDoc->HasNote(5, 2, destSheet));
4164     CPPUNIT_ASSERT_MESSAGE("G3:  a note", m_pDoc->HasNote(6, 2, destSheet));
4165     CPPUNIT_ASSERT_MESSAGE("H3: no note", !m_pDoc->HasNote(7, 2, destSheet));
4166     CPPUNIT_ASSERT_MESSAGE("C4: no note", !m_pDoc->HasNote(2, 3, destSheet));
4167     CPPUNIT_ASSERT_MESSAGE("D4: no note", !m_pDoc->HasNote(3, 3, destSheet));
4168     CPPUNIT_ASSERT_MESSAGE("E4:  a note", m_pDoc->HasNote(4, 3, destSheet));
4169     CPPUNIT_ASSERT_MESSAGE("F4:  a note", m_pDoc->HasNote(5, 3, destSheet));
4170     CPPUNIT_ASSERT_MESSAGE("G4: no note", !m_pDoc->HasNote(6, 3, destSheet));
4171     CPPUNIT_ASSERT_MESSAGE("H4: no note", !m_pDoc->HasNote(7, 3, destSheet));
4172     CPPUNIT_ASSERT_MESSAGE("C5: no note", !m_pDoc->HasNote(2, 4, destSheet));
4173     CPPUNIT_ASSERT_MESSAGE("D5:  a note", m_pDoc->HasNote(3, 4, destSheet));
4174     CPPUNIT_ASSERT_MESSAGE("E5:  a note", m_pDoc->HasNote(4, 4, destSheet));
4175     CPPUNIT_ASSERT_MESSAGE("F5:  a note", m_pDoc->HasNote(5, 4, destSheet));
4176     CPPUNIT_ASSERT_MESSAGE("G5:  a note", m_pDoc->HasNote(6, 4, destSheet));
4177     CPPUNIT_ASSERT_MESSAGE("H5: no note", !m_pDoc->HasNote(7, 4, destSheet));
4178     CPPUNIT_ASSERT_MESSAGE("C6: no note", !m_pDoc->HasNote(2, 5, destSheet));
4179     CPPUNIT_ASSERT_MESSAGE("D6: no note", !m_pDoc->HasNote(3, 5, destSheet));
4180     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(4, 5, destSheet));
4181     CPPUNIT_ASSERT_MESSAGE("F6:  a note", m_pDoc->HasNote(5, 5, destSheet));
4182     CPPUNIT_ASSERT_MESSAGE("G6: no note", !m_pDoc->HasNote(6, 5, destSheet));
4183     CPPUNIT_ASSERT_MESSAGE("H6: no note", !m_pDoc->HasNote(7, 5, destSheet));
4184     CPPUNIT_ASSERT_MESSAGE("C7: no note", !m_pDoc->HasNote(2, 6, destSheet));
4185     CPPUNIT_ASSERT_MESSAGE("D7: no note", !m_pDoc->HasNote(3, 6, destSheet));
4186     CPPUNIT_ASSERT_MESSAGE("E7: no note", !m_pDoc->HasNote(4, 6, destSheet));
4187     CPPUNIT_ASSERT_MESSAGE("F7:  a note", m_pDoc->HasNote(5, 6, destSheet));
4188     CPPUNIT_ASSERT_MESSAGE("G7: no note", !m_pDoc->HasNote(6, 6, destSheet));
4189     CPPUNIT_ASSERT_MESSAGE("H7: no note", !m_pDoc->HasNote(7, 6, destSheet));
4190     CPPUNIT_ASSERT_MESSAGE("C8: no note", !m_pDoc->HasNote(2, 7, destSheet));
4191     CPPUNIT_ASSERT_MESSAGE("D8: no note", !m_pDoc->HasNote(3, 7, destSheet));
4192     CPPUNIT_ASSERT_MESSAGE("E8: no note", !m_pDoc->HasNote(4, 7, destSheet));
4193     CPPUNIT_ASSERT_MESSAGE("F8: no note", !m_pDoc->HasNote(5, 7, destSheet));
4194     CPPUNIT_ASSERT_MESSAGE("G8: no note", !m_pDoc->HasNote(6, 7, destSheet));
4195     CPPUNIT_ASSERT_MESSAGE("H8: no note", !m_pDoc->HasNote(7, 7, destSheet));
4196 
4197     // check values of notes
4198     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("Note A1"), getNote(3, 1, destSheet));
4199     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("Note A3"), getNote(4, 1, destSheet));
4200     // F2 has no note
4201     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G2", OUString("Note A1"), getNote(6, 1, destSheet));
4202     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D3", OUString("Note B1"), getNote(3, 2, destSheet));
4203     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E3", OUString("Note B3"), getNote(4, 2, destSheet));
4204     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F3", OUString("Note B4"), getNote(5, 2, destSheet));
4205     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G3", OUString("Note B1"), getNote(6, 2, destSheet));
4206     // D4 has no note
4207     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("Note C3"), getNote(4, 3, destSheet));
4208     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("Note C4"), getNote(5, 3, destSheet));
4209     // G4 has no note
4210     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D5", OUString("Note D1"), getNote(3, 4, destSheet));
4211     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", OUString("Note D3"), getNote(4, 4, destSheet));
4212     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F5", OUString("Note D4"), getNote(5, 4, destSheet));
4213     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G5", OUString("Note D1"), getNote(6, 4, destSheet));
4214     if (!bSkipEmpty)
4215         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(4, 5, destSheet));
4216     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F6", OUString("Note E4"), getNote(5, 5, destSheet));
4217     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F7", OUString("Note F4"), getNote(5, 6, destSheet));
4218 
4219     // check row 16 on src sheet, refs to copied/cut range
4220     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
4221     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
4222     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
4223     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
4224     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
4225     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
4226     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
4227     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
4228     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
4229     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
4230 
4231     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
4232     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
4233     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
4234     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
4235     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
4236     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
4237     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
4238     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
4239     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
4240     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
4241 
4242     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
4243     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
4244     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
4245     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
4246     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
4247     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
4248     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
4249     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
4250     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
4251     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
4252 
4253     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
4254     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
4255     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
4256     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
4257     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
4258     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
4259     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
4260     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
4261     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
4262     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
4263 
4264     // Existing references to the destination range must not change
4265     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
4266     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
4267     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
4268     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
4269     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
4270     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
4271     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
4272     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
4273     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
4274     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
4275     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
4276     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
4277     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
4278     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
4279     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
4280     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
4281     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
4282     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
4283     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
4284     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
4285     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
4286     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
4287     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
4288     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
4289     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
4290     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
4291     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
4292     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
4293     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
4294     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
4295     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
4296     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
4297     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
4298     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
4299     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
4300     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
4301     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
4302     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
4303     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
4304     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
4305     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
4306     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
4307     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
4308     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
4309     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
4310     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
4311     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
4312     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
4313     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
4314 
4315     m_pDoc->DeleteTab(destSheet);
4316     m_pDoc->DeleteTab(srcSheet);
4317 }
4318 
checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty)4319 void TestCopyPaste::checkCopyPasteSpecialMultiRangeCol(bool bSkipEmpty)
4320 {
4321     const SCTAB srcSheet = 0;
4322     const SCTAB destSheet = 1;
4323 
4324     /*
4325                           ┌--- not selected src col C
4326                           v
4327 
4328          |  D  |    E     |  F  |     G      |        H            |  I  |
4329 
4330     2    | 1 B*| =D2+10  *| R1 *| =C2+C4+60  | =SUMIF(C2:C5;"<4")  | 121 |
4331     3    | 2 B*| =D3+20 b | R2 *|            |                    *| 122 | <- filtered row
4332     4    | 3 B*| =G4+30 b*|  5 *|          B*|                     | 123 |
4333     5    | 4   | =D3+40 b*| R4 *| =C2+C4+70 *|    =D$3+$B$5+80    *| 124 |
4334 
4335     * means note attached
4336     B means background
4337     b means border
4338     */
4339 
4340     const EditTextObject* pEditObj;
4341     // col 2
4342     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
4343     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
4344     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
4345     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
4346     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
4347     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
4348     // col 3, numbers
4349     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
4350     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
4351     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(3, 2, destSheet));
4352     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 3, destSheet));
4353     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(3, 4, destSheet));
4354     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 5, destSheet));
4355     // col 4, formulas
4356     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
4357     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(4, 0, destSheet));
4358     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 1, destSheet));
4359     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(4, 1, destSheet));
4360     CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), getFormula(4, 2, destSheet));
4361     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(4, 2, destSheet));
4362     CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), getFormula(4, 3, destSheet));
4363     CPPUNIT_ASSERT_EQUAL(bSkipEmpty ? 1030.0 : 30.0,
4364                          m_pDoc->GetValue(4, 3, destSheet)); // It was 35
4365     CPPUNIT_ASSERT_EQUAL(OUString("=D3+40"), getFormula(4, 4, destSheet));
4366     CPPUNIT_ASSERT_EQUAL(42.0, m_pDoc->GetValue(4, 4, destSheet));
4367     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
4368     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(4, 5, destSheet));
4369     // col 5, strings are not selected
4370     // col 5, rich text
4371     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
4372     pEditObj = m_pDoc->GetEditText(ScAddress(5, 0, destSheet));
4373     CPPUNIT_ASSERT(pEditObj == nullptr);
4374     pEditObj = m_pDoc->GetEditText(ScAddress(5, 1, destSheet));
4375     CPPUNIT_ASSERT(pEditObj);
4376     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
4377     pEditObj = m_pDoc->GetEditText(ScAddress(5, 2, destSheet));
4378     CPPUNIT_ASSERT(pEditObj);
4379     CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0));
4380     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(5, 3, destSheet));
4381     pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet));
4382     CPPUNIT_ASSERT(pEditObj);
4383     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
4384     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
4385     pEditObj = m_pDoc->GetEditText(ScAddress(5, 5, destSheet));
4386     CPPUNIT_ASSERT(pEditObj == nullptr);
4387     // col 6, formulas
4388     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
4389     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(6, 0, destSheet));
4390     CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+60"), getFormula(6, 1, destSheet));
4391     CPPUNIT_ASSERT_EQUAL(2060.0, m_pDoc->GetValue(6, 1, destSheet)); // It was 64
4392     if (!bSkipEmpty)
4393     {
4394         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(6, 2, destSheet));
4395         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(6, 3, destSheet));
4396     }
4397     else
4398     {
4399         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 2, destSheet));
4400         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 3, destSheet));
4401     }
4402     CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+70"), getFormula(6, 4, destSheet));
4403     CPPUNIT_ASSERT_EQUAL(2070.0, m_pDoc->GetValue(6, 4, destSheet)); // It was 74
4404     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 5, destSheet));
4405     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(6, 5, destSheet));
4406     // col 7, formulas
4407     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
4408     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 0, destSheet));
4409     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(C2:C5;\"<4\")"), getFormula(7, 1, destSheet));
4410     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(7, 1, destSheet)); // It was 6
4411     if (!bSkipEmpty)
4412     {
4413         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 2, destSheet));
4414         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 3, destSheet));
4415     }
4416     else
4417     {
4418         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
4419         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
4420     }
4421     CPPUNIT_ASSERT_EQUAL(1082.0, m_pDoc->GetValue(7, 4, destSheet));
4422     CPPUNIT_ASSERT_EQUAL(OUString("=D$3+$B$5+80"), getFormula(7, 4, destSheet));
4423     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
4424     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
4425     // col 8, numbers
4426     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 0, destSheet));
4427     CPPUNIT_ASSERT_EQUAL(121.0, m_pDoc->GetValue(8, 1, destSheet));
4428     CPPUNIT_ASSERT_EQUAL(122.0, m_pDoc->GetValue(8, 2, destSheet));
4429     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 3, destSheet));
4430     CPPUNIT_ASSERT_EQUAL(124.0, m_pDoc->GetValue(8, 4, destSheet));
4431     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 5, destSheet));
4432     // col 9, col repetition is not supported for multi range copy/paste
4433     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 0, destSheet));
4434     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 1, destSheet));
4435     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 2, destSheet));
4436     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 3, destSheet));
4437     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 4, destSheet));
4438     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 5, destSheet));
4439 
4440     // check patterns
4441     const SfxPoolItem* pItem = nullptr;
4442     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4443     CPPUNIT_ASSERT(pItem);
4444     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4445     m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4446     CPPUNIT_ASSERT(pItem);
4447     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4448     m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4449     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4450     m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4451     CPPUNIT_ASSERT(!pItem);
4452     m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4453     CPPUNIT_ASSERT(!pItem);
4454     m_pDoc->GetPattern(ScAddress(6, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4455     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
4456     if (!bSkipEmpty)
4457         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4458 
4459     // check border, left and right borders were transformed to top and bottom borders
4460     pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER);
4461     CPPUNIT_ASSERT(pItem);
4462     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4463     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4464     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4465     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
4466     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
4467     CPPUNIT_ASSERT(pItem);
4468     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4469     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4470     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4471     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
4472     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
4473     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4474     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4475     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4476     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
4477     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
4478     CPPUNIT_ASSERT(pItem);
4479     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4480     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4481     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4482     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
4483     pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER);
4484     CPPUNIT_ASSERT(pItem);
4485     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4486     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4487     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4488     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
4489 
4490     // check notes after transposed copy/paste
4491     // check presence of notes
4492     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
4493     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
4494     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
4495     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
4496     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
4497     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
4498     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 0, destSheet));
4499     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
4500     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
4501     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
4502     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 1, destSheet));
4503     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 1, destSheet));
4504     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
4505     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 1, destSheet));
4506     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
4507     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
4508     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 2, destSheet));
4509     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
4510     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 2, destSheet));
4511     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(7, 2, destSheet));
4512     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 2, destSheet));
4513     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
4514     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 3, destSheet));
4515     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
4516     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
4517     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(6, 3, destSheet));
4518     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 3, destSheet));
4519     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 3, destSheet));
4520     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
4521     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
4522     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 4, destSheet));
4523     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 4, destSheet));
4524     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 4, destSheet));
4525     CPPUNIT_ASSERT(m_pDoc->HasNote(7, 4, destSheet));
4526     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 4, destSheet));
4527     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 5, destSheet));
4528     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 5, destSheet));
4529     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 5, destSheet));
4530     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 5, destSheet));
4531     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 5, destSheet));
4532     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 5, destSheet));
4533     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 5, destSheet));
4534 
4535     // check values of notes
4536     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
4537     CPPUNIT_ASSERT_EQUAL(OUString("Note A2"), getNote(3, 2, destSheet));
4538     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(3, 3, destSheet));
4539     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(4, 1, destSheet));
4540     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 3, destSheet));
4541     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(5, 1, destSheet));
4542     CPPUNIT_ASSERT_EQUAL(OUString("Note D2"), getNote(5, 2, destSheet));
4543     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(5, 3, destSheet));
4544     if (!bSkipEmpty)
4545         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(6, 3, destSheet));
4546     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(6, 4, destSheet));
4547     if (!bSkipEmpty)
4548         CPPUNIT_ASSERT_EQUAL(OUString("Note F2"), getNote(7, 2, destSheet));
4549     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(7, 4, destSheet));
4550 
4551     // check row 16 on src sheet, refs to copied/cut range
4552     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
4553     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
4554     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
4555     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
4556     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
4557     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
4558     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
4559     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
4560     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
4561     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
4562 
4563     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
4564     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
4565     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
4566     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
4567     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
4568     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
4569     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
4570     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
4571     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
4572     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
4573 
4574     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
4575     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
4576     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
4577     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
4578     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
4579     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
4580     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
4581     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
4582     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
4583     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
4584 
4585     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
4586     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
4587     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
4588     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
4589     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
4590     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
4591     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
4592     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
4593     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
4594     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
4595 
4596     // Existing references to the destination range must not change
4597     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
4598     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
4599     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
4600     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
4601     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
4602     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
4603     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
4604     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
4605     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
4606     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
4607     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
4608     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
4609     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
4610     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
4611     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
4612     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
4613     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
4614     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
4615     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
4616     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
4617     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
4618     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
4619     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
4620     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
4621     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
4622     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
4623     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
4624     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
4625     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
4626     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
4627     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
4628     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
4629     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
4630     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
4631     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
4632     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
4633     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
4634     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
4635     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
4636     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
4637     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
4638     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
4639     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
4640     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
4641     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
4642     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
4643     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
4644     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
4645     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
4646 
4647     m_pDoc->DeleteTab(destSheet);
4648     m_pDoc->DeleteTab(srcSheet);
4649 }
4650 
checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty)4651 void TestCopyPaste::checkCopyPasteSpecialMultiRangeColFiltered(bool bSkipEmpty)
4652 {
4653     const SCTAB srcSheet = 0;
4654     const SCTAB destSheet = 1;
4655 
4656     /*
4657                           ┌--- not selected src col C
4658                           v
4659 
4660          |  D  |    E     |  F  |     G      |        H            |  I  |
4661 
4662     2    | 1 B*| =D2+10  *| R1 *| =C2+C4+60  | =SUMIF(C2:C5;"<4")  | 121 |
4663     3    | 3 B*| =G4+30 b*|  5 *|          B*|                     | 123 |
4664     4    | 4   | =D2+40 b*| R4 *| =C1+C3+70 *|    =D$3+$B$5+80    *| 124 |
4665 
4666     * means note attached
4667     B means background
4668     b means border
4669     */
4670 
4671     const EditTextObject* pEditObj;
4672     // col 2
4673     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
4674     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
4675     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
4676     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
4677     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
4678     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
4679     // col 3, numbers
4680     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
4681     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
4682     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 2, destSheet));
4683     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(3, 3, destSheet));
4684     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 4, destSheet));
4685     // col 4, formulas
4686     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
4687     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(4, 0, destSheet));
4688     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 1, destSheet));
4689     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(4, 1, destSheet));
4690     // references over selection gaps are not adjusted
4691     CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), getFormula(4, 2, destSheet));
4692     CPPUNIT_ASSERT_EQUAL(bSkipEmpty ? 1030.0 : 30.0,
4693                          m_pDoc->GetValue(4, 2, destSheet)); // It was 35
4694     CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), getFormula(4, 3, destSheet));
4695     // was originally 42, not adjusted by filtering
4696     CPPUNIT_ASSERT_EQUAL(41.0, m_pDoc->GetValue(4, 3, destSheet));
4697     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 4, destSheet));
4698     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(4, 4, destSheet));
4699     // col 5, strings are not selected
4700     // col 5, rich text
4701     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
4702     pEditObj = m_pDoc->GetEditText(ScAddress(5, 0, destSheet));
4703     CPPUNIT_ASSERT(pEditObj == nullptr);
4704     pEditObj = m_pDoc->GetEditText(ScAddress(5, 1, destSheet));
4705     CPPUNIT_ASSERT(pEditObj);
4706     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
4707     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(5, 2, destSheet));
4708     pEditObj = m_pDoc->GetEditText(ScAddress(5, 3, destSheet));
4709     CPPUNIT_ASSERT(pEditObj);
4710     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
4711     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 4, destSheet));
4712     pEditObj = m_pDoc->GetEditText(ScAddress(5, 4, destSheet));
4713     CPPUNIT_ASSERT(pEditObj == nullptr);
4714     // col 6, formulas
4715     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
4716     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(6, 0, destSheet));
4717     CPPUNIT_ASSERT_EQUAL(OUString("=C2+C4+60"), getFormula(6, 1, destSheet));
4718     CPPUNIT_ASSERT_EQUAL(2060.0, m_pDoc->GetValue(6, 1, destSheet)); // It was 64
4719     if (!bSkipEmpty)
4720         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(6, 2, destSheet));
4721     else
4722         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 2, destSheet));
4723     CPPUNIT_ASSERT_EQUAL(OUString("=C1+C3+70"), getFormula(6, 3, destSheet));
4724     CPPUNIT_ASSERT_EQUAL(2070.0, m_pDoc->GetValue(6, 3, destSheet)); // It was 74
4725     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 4, destSheet));
4726     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(6, 4, destSheet));
4727     // col 7, formulas
4728     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
4729     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(7, 0, destSheet));
4730     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(C2:C5;\"<4\")"), getFormula(7, 1, destSheet));
4731     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(7, 1, destSheet)); // It was 6
4732     if (!bSkipEmpty)
4733         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 2, destSheet));
4734     else
4735         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
4736     CPPUNIT_ASSERT_EQUAL(1083.0, m_pDoc->GetValue(7, 3, destSheet));
4737     CPPUNIT_ASSERT_EQUAL(OUString("=D$3+$B$5+80"), getFormula(7, 3, destSheet));
4738     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 4, destSheet));
4739     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(7, 4, destSheet));
4740     // col 8, numbers
4741     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 0, destSheet));
4742     CPPUNIT_ASSERT_EQUAL(121.0, m_pDoc->GetValue(8, 1, destSheet));
4743     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 2, destSheet));
4744     CPPUNIT_ASSERT_EQUAL(124.0, m_pDoc->GetValue(8, 3, destSheet));
4745     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 4, destSheet));
4746     // col 9, col repetition is not supported for multi range copy/paste
4747     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 0, destSheet));
4748     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 1, destSheet));
4749     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 2, destSheet));
4750     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 3, destSheet));
4751     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 4, destSheet));
4752     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 5, destSheet));
4753 
4754     // check patterns
4755     const SfxPoolItem* pItem = nullptr;
4756     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4757     CPPUNIT_ASSERT(pItem);
4758     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4759     m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4760     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4761     m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4762     CPPUNIT_ASSERT(!pItem);
4763     m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4764     CPPUNIT_ASSERT(!pItem);
4765     m_pDoc->GetPattern(ScAddress(6, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
4766     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
4767     if (!bSkipEmpty)
4768         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
4769 
4770     // check border, left and right borders were transformed to top and bottom borders
4771     pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER);
4772     CPPUNIT_ASSERT(pItem);
4773     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4774     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4775     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4776     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
4777     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
4778     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4779     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4780     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4781     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
4782     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
4783     CPPUNIT_ASSERT(pItem);
4784     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4785     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4786     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4787     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
4788     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
4789     CPPUNIT_ASSERT(pItem);
4790     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
4791     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
4792     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
4793     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
4794 
4795     // check notes after transposed copy/paste
4796     // check presence of notes
4797     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
4798     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
4799     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
4800     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
4801     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
4802     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
4803     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 0, destSheet));
4804     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
4805     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
4806     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
4807     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 1, destSheet));
4808     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 1, destSheet));
4809     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
4810     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 1, destSheet));
4811     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
4812     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
4813     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 2, destSheet));
4814     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
4815     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(6, 2, destSheet));
4816     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 2, destSheet));
4817     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 2, destSheet));
4818     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
4819     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 3, destSheet));
4820     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
4821     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
4822     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 3, destSheet));
4823     CPPUNIT_ASSERT(m_pDoc->HasNote(7, 3, destSheet));
4824     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 3, destSheet));
4825     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
4826     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
4827     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 4, destSheet));
4828     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 4, destSheet));
4829     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 4, destSheet));
4830     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 4, destSheet));
4831     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 4, destSheet));
4832 
4833     // check values of notes
4834     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
4835     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(3, 2, destSheet));
4836     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(4, 1, destSheet));
4837     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 2, destSheet));
4838     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(5, 1, destSheet));
4839     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(5, 2, destSheet));
4840     if (!bSkipEmpty)
4841         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(6, 2, destSheet));
4842     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(6, 3, destSheet));
4843     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(7, 3, destSheet));
4844 
4845     // check row 16 on src sheet, refs to copied/cut range
4846     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
4847     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
4848     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
4849     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
4850     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
4851     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
4852     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
4853     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
4854     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
4855     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
4856 
4857     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
4858     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
4859     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
4860     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
4861     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
4862     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
4863     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
4864     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
4865     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
4866     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
4867 
4868     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
4869     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
4870     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
4871     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
4872     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
4873     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
4874     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
4875     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
4876     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
4877     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
4878 
4879     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
4880     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
4881     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
4882     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
4883     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
4884     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
4885     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
4886     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
4887     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
4888     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
4889 
4890     // Existing references to the destination range must not change
4891     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
4892     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
4893     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
4894     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
4895     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
4896     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
4897     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
4898     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
4899     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
4900     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
4901     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
4902     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
4903     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
4904     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
4905     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
4906     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
4907     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
4908     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
4909     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
4910     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
4911     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
4912     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
4913     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
4914     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
4915     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
4916     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
4917     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
4918     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
4919     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
4920     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
4921     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
4922     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
4923     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
4924     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
4925     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
4926     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
4927     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
4928     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
4929     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
4930     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
4931     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
4932     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
4933     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
4934     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
4935     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
4936     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
4937     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
4938     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
4939     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
4940 
4941     m_pDoc->DeleteTab(destSheet);
4942     m_pDoc->DeleteTab(srcSheet);
4943 }
4944 
checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty)4945 void TestCopyPaste::checkCopyPasteSpecialMultiRangeColTranspose(bool bSkipEmpty)
4946 {
4947     const SCTAB srcSheet = 0;
4948     const SCTAB destSheet = 1;
4949 
4950     /*
4951              |         D          |    E     |    F     |       G       |
4952 
4953         2    |         1        B*|    2   B*|    3   B*|       4       |
4954         3    |      =D2+10       *| =E2+20 b | =F5+30 b*|    =E2+40   b*|
4955         4    |        R1         *|   R2    *|    5    *|      R4      *|
4956         5    |     =D1+F1+60      |          |        B*|  =D1+F1+70   *|
4957         6    | =SUMIF(D1:G1;"<4") |         *|          | =C$3+$B$5+80 *|
4958         7    |       121          |   122    |   123    |     124       |
4959 
4960         * means note attached
4961         B means background
4962         b means border
4963     */
4964 
4965     // check cell content after transposed copy/paste of filtered data
4966     // Col C and G are checked to be empty
4967     const EditTextObject* pEditObj;
4968     // row 0
4969     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
4970     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
4971     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
4972     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
4973     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
4974     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
4975     // row 1, numbers
4976     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
4977     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
4978     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(4, 1, destSheet));
4979     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(5, 1, destSheet));
4980     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(6, 1, destSheet));
4981     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 1, destSheet));
4982     // row 2, formulas
4983     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
4984     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 2, destSheet));
4985     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(3, 2, destSheet));
4986     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(3, 2, destSheet));
4987     CPPUNIT_ASSERT_EQUAL(OUString("=E2+20"), getFormula(4, 2, destSheet));
4988     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(4, 2, destSheet));
4989     CPPUNIT_ASSERT_EQUAL(OUString("=F5+30"), getFormula(5, 2, destSheet));
4990     CPPUNIT_ASSERT_EQUAL(bSkipEmpty ? 1030.0 : 30.0,
4991                          m_pDoc->GetValue(5, 2, destSheet)); // It was 35
4992     CPPUNIT_ASSERT_EQUAL(OUString("=E2+40"), getFormula(6, 2, destSheet));
4993     CPPUNIT_ASSERT_EQUAL(42.0, m_pDoc->GetValue(6, 2, destSheet));
4994     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
4995     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 2, destSheet));
4996     // row 3, strings was not selected in multi range selection
4997     // row 3, rich text
4998     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
4999     pEditObj = m_pDoc->GetEditText(ScAddress(2, 3, destSheet));
5000     CPPUNIT_ASSERT(pEditObj == nullptr);
5001     pEditObj = m_pDoc->GetEditText(ScAddress(3, 3, destSheet));
5002     CPPUNIT_ASSERT(pEditObj);
5003     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
5004     pEditObj = m_pDoc->GetEditText(ScAddress(4, 3, destSheet));
5005     CPPUNIT_ASSERT(pEditObj);
5006     CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0));
5007     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(5, 3, destSheet));
5008     pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet));
5009     CPPUNIT_ASSERT(pEditObj);
5010     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
5011     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
5012     pEditObj = m_pDoc->GetEditText(ScAddress(7, 3, destSheet));
5013     CPPUNIT_ASSERT(pEditObj == nullptr);
5014     // row 4, formulas
5015     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
5016     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 4, destSheet));
5017     CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+60"), getFormula(3, 4, destSheet));
5018     CPPUNIT_ASSERT_EQUAL(2060.0, m_pDoc->GetValue(3, 4, destSheet)); // It was 64
5019     if (!bSkipEmpty)
5020     {
5021         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", EMPTY_OUSTRING, m_pDoc->GetString(4, 4, destSheet));
5022         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", EMPTY_OUSTRING, m_pDoc->GetString(5, 4, destSheet));
5023     }
5024     else
5025     {
5026         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 4, destSheet));
5027         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 4, destSheet));
5028     }
5029     CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+70"), getFormula(6, 4, destSheet));
5030     CPPUNIT_ASSERT_EQUAL(2070.0, m_pDoc->GetValue(6, 4, destSheet)); // It was 74
5031     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 4, destSheet));
5032     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 4, destSheet));
5033     // row 5, formulas
5034     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
5035     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
5036     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D1:G1;\"<4\")"), getFormula(3, 5, destSheet));
5037     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(3, 5, destSheet)); // It was 6
5038     if (!bSkipEmpty)
5039     {
5040         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 5, destSheet));
5041         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(5, 5, destSheet));
5042     }
5043     else
5044     {
5045         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
5046         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
5047     }
5048 
5049     CPPUNIT_ASSERT_EQUAL(OUString("=C$3+$B$5+80"), getFormula(6, 5, destSheet));
5050     CPPUNIT_ASSERT_EQUAL(2080.0, m_pDoc->GetValue(6, 5, destSheet));
5051     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
5052     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
5053     // row 6, numbers
5054     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 6, destSheet));
5055     CPPUNIT_ASSERT_EQUAL(121.0, m_pDoc->GetValue(3, 6, destSheet));
5056     CPPUNIT_ASSERT_EQUAL(122.0, m_pDoc->GetValue(4, 6, destSheet));
5057     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(5, 6, destSheet));
5058     CPPUNIT_ASSERT_EQUAL(124.0, m_pDoc->GetValue(6, 6, destSheet));
5059     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 6, destSheet));
5060     // row 7, not selected
5061     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
5062     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
5063     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
5064     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
5065     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
5066     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
5067 
5068     // check patterns
5069     const SfxPoolItem* pItem = nullptr;
5070     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5071     CPPUNIT_ASSERT(pItem);
5072     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5073     m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5074     CPPUNIT_ASSERT(pItem);
5075     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5076     m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5077     CPPUNIT_ASSERT(pItem);
5078     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5079     m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5080     CPPUNIT_ASSERT(!pItem);
5081     m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5082     CPPUNIT_ASSERT(!pItem);
5083     m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5084     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
5085     // std::cout << "bSkipEmpty: " << bSkipEmpty << ", pItem == nullptr: " << (pItem == nullptr) << std::endl;
5086     if (!bSkipEmpty)
5087         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5088 
5089     // check border, left and right borders were transformed to top and bottom borders
5090     pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER);
5091     CPPUNIT_ASSERT(pItem);
5092     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5093     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5094     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5095     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5096 
5097     m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem);
5098     CPPUNIT_ASSERT(pItem);
5099     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5100     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
5101     CPPUNIT_ASSERT(pItem);
5102     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5103     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5104     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5105     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5106     pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER);
5107     CPPUNIT_ASSERT(pItem);
5108     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5109     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5110     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5111     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5112     pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER);
5113     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5114     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5115     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5116     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5117     pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER);
5118     CPPUNIT_ASSERT(pItem);
5119     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5120     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5121     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5122     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5123 
5124     // check notes after transposed copy/paste
5125     // check presence of notes
5126     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
5127     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
5128     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
5129     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
5130     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
5131     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
5132     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
5133     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
5134     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
5135     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 1, destSheet));
5136     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 1, destSheet));
5137     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
5138     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
5139     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
5140     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 2, destSheet));
5141     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
5142     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 2, destSheet));
5143     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 2, destSheet));
5144     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
5145     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 3, destSheet));
5146     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
5147     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
5148     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 3, destSheet));
5149     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 3, destSheet));
5150     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
5151     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
5152     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 4, destSheet));
5153     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(5, 4, destSheet));
5154     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 4, destSheet));
5155     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 4, destSheet));
5156     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 5, destSheet));
5157     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 5, destSheet));
5158     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(4, 5, destSheet));
5159     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 5, destSheet));
5160     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 5, destSheet));
5161     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 5, destSheet));
5162     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 6, destSheet));
5163     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 6, destSheet));
5164     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 6, destSheet));
5165     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 6, destSheet));
5166     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 6, destSheet));
5167     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 6, destSheet));
5168 
5169     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
5170     CPPUNIT_ASSERT_EQUAL(OUString("Note A2"), getNote(4, 1, destSheet));
5171     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(5, 1, destSheet));
5172     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(3, 2, destSheet));
5173     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(5, 2, destSheet));
5174     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(3, 3, destSheet));
5175     CPPUNIT_ASSERT_EQUAL(OUString("Note D2"), getNote(4, 3, destSheet));
5176     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(5, 3, destSheet));
5177     if (!bSkipEmpty)
5178         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(5, 4, destSheet));
5179     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(6, 4, destSheet));
5180     if (!bSkipEmpty)
5181         CPPUNIT_ASSERT_EQUAL(OUString("Note F2"), getNote(4, 5, destSheet));
5182     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(6, 5, destSheet));
5183 
5184     // check row 16 on src sheet, refs to copied/cut range
5185     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
5186     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
5187     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
5188     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
5189     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
5190     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
5191     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
5192     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
5193     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
5194     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
5195 
5196     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
5197     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
5198     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
5199     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
5200     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
5201     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
5202     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
5203     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
5204     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
5205     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
5206 
5207     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
5208     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
5209     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
5210     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
5211     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
5212     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
5213     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
5214     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
5215     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
5216     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
5217 
5218     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
5219     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
5220     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
5221     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
5222     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
5223     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
5224     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
5225     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
5226     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
5227     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
5228 
5229     // Existing references to the destination range must not change
5230     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
5231     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
5232     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
5233     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
5234     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
5235     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
5236     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
5237     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
5238     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
5239     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
5240     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
5241     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
5242     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
5243     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
5244     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
5245     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
5246     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
5247     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
5248     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
5249     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
5250     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
5251     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
5252     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
5253     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
5254     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
5255     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
5256     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
5257     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
5258     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
5259     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
5260     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
5261     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
5262     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
5263     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
5264     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
5265     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
5266     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
5267     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
5268     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
5269     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
5270     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
5271     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
5272     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
5273     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
5274     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
5275     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
5276     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
5277     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
5278     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
5279 
5280     m_pDoc->DeleteTab(destSheet);
5281     m_pDoc->DeleteTab(srcSheet);
5282 }
5283 
checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty)5284 void TestCopyPaste::checkCopyPasteSpecialMultiRangeColFilteredTranspose(bool bSkipEmpty)
5285 {
5286     const SCTAB srcSheet = 0;
5287     const SCTAB destSheet = 1;
5288 
5289     /*
5290                                   ┌--- filtered src row 2
5291                                   v
5292 
5293              |         D          |    E     |       F       |
5294 
5295         2    |         1        B*|    3   B*|       4       |
5296         3    |      =D2+10       *| =E5+30 b*|    =D2+40   b*|
5297                                                                 <- not copied col C
5298         4    |        R1         *|    5    *|      R4      *|
5299         5    |     =D1+F1+60      |        B*|  =C1+E1+70   *|
5300         6    | =SUMIF(D1:G1;"<4") |          | =B$3+$B$5+80 *|
5301         7    |       121          |   123    |      124      |
5302 
5303         * means note attached
5304         B means background
5305         b means border
5306     */
5307 
5308     // check cell content after transposed copy/paste of filtered data
5309     // Col C and G are checked to be empty
5310     const EditTextObject* pEditObj;
5311     // row 0
5312     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
5313     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
5314     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
5315     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
5316     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
5317     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
5318     // row 1, numbers
5319     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
5320     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
5321     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(4, 1, destSheet));
5322     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(5, 1, destSheet));
5323     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 1, destSheet));
5324     // row 2, formulas
5325     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
5326     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
5327     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(3, 2, destSheet));
5328     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(3, 2, destSheet));
5329     CPPUNIT_ASSERT_EQUAL(OUString("=E5+30"), getFormula(4, 2, destSheet));
5330     CPPUNIT_ASSERT_EQUAL(bSkipEmpty ? 1030.0 : 30.0,
5331                          m_pDoc->GetValue(4, 2, destSheet)); // It was 35
5332     CPPUNIT_ASSERT_EQUAL(OUString("=D2+40"), getFormula(5, 2, destSheet));
5333     CPPUNIT_ASSERT_EQUAL(
5334         41.0, m_pDoc->GetValue(5, 2, destSheet)); // was originally 42, not adjusted by filtering
5335     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 2, destSheet));
5336     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(6, 2, destSheet));
5337     // row 3, strings was not selected in multi range selection
5338     // row 3, rich text
5339     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
5340     pEditObj = m_pDoc->GetEditText(ScAddress(2, 3, destSheet));
5341     CPPUNIT_ASSERT(pEditObj == nullptr);
5342     pEditObj = m_pDoc->GetEditText(ScAddress(3, 3, destSheet));
5343     CPPUNIT_ASSERT(pEditObj);
5344     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
5345     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 3, destSheet));
5346     pEditObj = m_pDoc->GetEditText(ScAddress(5, 3, destSheet));
5347     CPPUNIT_ASSERT(pEditObj);
5348     CPPUNIT_ASSERT_EQUAL(OUString("R4"), pEditObj->GetText(0));
5349     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 3, destSheet));
5350     pEditObj = m_pDoc->GetEditText(ScAddress(6, 3, destSheet));
5351     CPPUNIT_ASSERT(pEditObj == nullptr);
5352     // row 4, formulas
5353     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
5354     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 4, destSheet));
5355     // formulas over filtered rows are not adjusted
5356     CPPUNIT_ASSERT_EQUAL(OUString("=D1+F1+60"), getFormula(3, 4, destSheet));
5357     CPPUNIT_ASSERT_EQUAL(2060.0, m_pDoc->GetValue(3, 4, destSheet)); // It was 64
5358     if (!bSkipEmpty)
5359         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(4, 4, destSheet));
5360     else
5361         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 4, destSheet));
5362     CPPUNIT_ASSERT_EQUAL(OUString("=C1+E1+70"), getFormula(5, 4, destSheet));
5363     CPPUNIT_ASSERT_EQUAL(2070.0, m_pDoc->GetValue(5, 4, destSheet)); // It was 74
5364     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 4, destSheet));
5365     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(6, 4, destSheet));
5366     // row 5, formulas
5367     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
5368     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
5369     // formulas over filtered rows are not adjusted
5370     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D1:G1;\"<4\")"), getFormula(3, 5, destSheet));
5371     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(3, 5, destSheet)); // It was 6
5372     if (!bSkipEmpty)
5373         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 5, destSheet));
5374     else
5375         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
5376     CPPUNIT_ASSERT_EQUAL(OUString("=B$3+$B$5+80"), getFormula(5, 5, destSheet));
5377     CPPUNIT_ASSERT_EQUAL(2080.0, m_pDoc->GetValue(5, 5, destSheet));
5378     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 5, destSheet));
5379     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(6, 5, destSheet));
5380     // row 6, numbers
5381     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 6, destSheet));
5382     CPPUNIT_ASSERT_EQUAL(121.0, m_pDoc->GetValue(3, 6, destSheet));
5383     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(4, 6, destSheet));
5384     CPPUNIT_ASSERT_EQUAL(124.0, m_pDoc->GetValue(5, 6, destSheet));
5385     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 6, destSheet));
5386     // row 7, not copied
5387     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
5388     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
5389     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
5390     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
5391     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
5392     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
5393     // row 8, not copied
5394     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
5395     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
5396     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
5397     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
5398     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
5399     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
5400 
5401     // check patterns
5402     const SfxPoolItem* pItem = nullptr;
5403     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5404     CPPUNIT_ASSERT(pItem);
5405     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5406     m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5407     CPPUNIT_ASSERT(pItem);
5408     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5409     m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5410     CPPUNIT_ASSERT(!pItem);
5411     m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5412     CPPUNIT_ASSERT(!pItem);
5413     m_pDoc->GetPattern(ScAddress(4, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5414     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
5415     if (!bSkipEmpty)
5416         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5417 
5418     // check border, left and right borders were transformed to top and bottom borders
5419     pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER);
5420     CPPUNIT_ASSERT(pItem);
5421     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5422     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5423     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5424     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5425 
5426     m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem);
5427     CPPUNIT_ASSERT(pItem);
5428     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5429 
5430     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
5431     CPPUNIT_ASSERT(pItem);
5432     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5433     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5434     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5435     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5436     pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER);
5437     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5438     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5439     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5440     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5441     pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER);
5442     CPPUNIT_ASSERT(pItem);
5443     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5444     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5445     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5446     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5447 
5448     // check notes after transposed copy/paste
5449     // check presence of notes
5450     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
5451     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
5452     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
5453     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
5454     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
5455     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
5456     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
5457     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
5458     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 1, destSheet));
5459     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 1, destSheet));
5460     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
5461     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
5462     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 2, destSheet));
5463     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
5464     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 2, destSheet));
5465     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
5466     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 3, destSheet));
5467     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
5468     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
5469     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 3, destSheet));
5470     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
5471     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
5472     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(4, 4, destSheet));
5473     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 4, destSheet));
5474     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 4, destSheet));
5475     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 5, destSheet));
5476     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 5, destSheet));
5477     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 5, destSheet));
5478     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 5, destSheet));
5479     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 5, destSheet));
5480     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 6, destSheet));
5481     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 6, destSheet));
5482     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 6, destSheet));
5483     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 6, destSheet));
5484     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 6, destSheet));
5485 
5486     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
5487     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(4, 1, destSheet));
5488     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(3, 2, destSheet));
5489     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 2, destSheet));
5490     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(3, 3, destSheet));
5491     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(4, 3, destSheet));
5492     if (!bSkipEmpty)
5493         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(4, 4, destSheet));
5494     CPPUNIT_ASSERT_EQUAL(OUString("Note E4"), getNote(5, 4, destSheet));
5495     CPPUNIT_ASSERT_EQUAL(OUString("Note F4"), getNote(5, 5, destSheet));
5496 
5497     // check row 16 on src sheet, refs to copied/cut range
5498     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
5499     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
5500     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
5501     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
5502     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
5503     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
5504     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
5505     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
5506     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
5507     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
5508 
5509     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
5510     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
5511     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
5512     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
5513     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
5514     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
5515     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
5516     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
5517     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
5518     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
5519 
5520     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
5521     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
5522     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
5523     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
5524     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
5525     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
5526     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
5527     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
5528     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
5529     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
5530 
5531     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
5532     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
5533     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
5534     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
5535     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
5536     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
5537     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
5538     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
5539     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
5540     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
5541 
5542     // Existing references to the destination range must not change
5543     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
5544     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
5545     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
5546     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
5547     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
5548     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
5549     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
5550     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
5551     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
5552     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
5553     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
5554     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
5555     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
5556     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
5557     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
5558     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
5559     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
5560     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
5561     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
5562     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
5563     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
5564     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
5565     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
5566     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
5567     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
5568     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
5569     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
5570     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
5571     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
5572     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
5573     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
5574     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
5575     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
5576     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
5577     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
5578     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
5579     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
5580     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
5581     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
5582     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
5583     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
5584     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
5585     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
5586     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
5587     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
5588     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
5589     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
5590     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
5591     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
5592 
5593     m_pDoc->DeleteTab(destSheet);
5594     m_pDoc->DeleteTab(srcSheet);
5595 }
5596 
checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty)5597 void TestCopyPaste::checkCopyPasteSpecialMultiRangeRow(bool bSkipEmpty)
5598 {
5599     const SCTAB srcSheet = 0;
5600     const SCTAB destSheet = 1;
5601 
5602     /*
5603          |  D  |    E     | F    |  G   |     H      |        I            |
5604 
5605     2    | 1 B*| =D2+10  *| a    | R1  *| =D2+D4+60  | =SUMIF(D2:D5;"<4")  |
5606     3    | 2 B*| =D3+20 b | b   *| R2  *|            |                    *| <- filtered row
5607     4    | 3 B*| =G4+30 b*| c   *|  5  *|          B*|                     |
5608                                                                              <- not selected row
5609     5    | 6   |    q     | r bB*|  s bB|     t      |          u          |
5610     6    | -11 |   -12    | -13  |  -14 |    -15     |         -16         |
5611 
5612     * means note attached
5613     B means background
5614     b means border
5615     */
5616 
5617     const EditTextObject* pEditObj;
5618     // col 2
5619     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
5620     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
5621     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
5622     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
5623     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
5624     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
5625     // col 3, numbers
5626     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
5627     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
5628     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(3, 2, destSheet));
5629     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 3, destSheet));
5630     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(3, 4, destSheet));
5631     CPPUNIT_ASSERT_EQUAL(-11.0, m_pDoc->GetValue(3, 5, destSheet));
5632     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 6, destSheet));
5633     // col 4, formulas
5634     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
5635     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(4, 0, destSheet));
5636     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 1, destSheet));
5637     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(4, 1, destSheet));
5638     CPPUNIT_ASSERT_EQUAL(OUString("=D3+20"), getFormula(4, 2, destSheet));
5639     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(4, 2, destSheet));
5640     CPPUNIT_ASSERT_EQUAL(OUString("=G4+30"), getFormula(4, 3, destSheet));
5641     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 3, destSheet));
5642     CPPUNIT_ASSERT_EQUAL(OUString("q"), m_pDoc->GetString(4, 4, destSheet));
5643     CPPUNIT_ASSERT_EQUAL(-12.0, m_pDoc->GetValue(4, 5, destSheet));
5644     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 6, destSheet));
5645     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(4, 6, destSheet));
5646     // col 5, strings
5647     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
5648     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(5, 0, destSheet));
5649     CPPUNIT_ASSERT_EQUAL(OUString("a"), m_pDoc->GetString(5, 1, destSheet));
5650     CPPUNIT_ASSERT_EQUAL(OUString("b"), m_pDoc->GetString(5, 2, destSheet));
5651     CPPUNIT_ASSERT_EQUAL(OUString("c"), m_pDoc->GetString(5, 3, destSheet));
5652     CPPUNIT_ASSERT_EQUAL(OUString("r"), m_pDoc->GetString(5, 4, destSheet));
5653     CPPUNIT_ASSERT_EQUAL(-13.0, m_pDoc->GetValue(5, 5, destSheet));
5654     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 6, destSheet));
5655     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(5, 6, destSheet));
5656     // col 6, rich text
5657     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
5658     pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet));
5659     CPPUNIT_ASSERT(pEditObj == nullptr);
5660     pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet));
5661     CPPUNIT_ASSERT(pEditObj);
5662     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
5663     pEditObj = m_pDoc->GetEditText(ScAddress(6, 2, destSheet));
5664     CPPUNIT_ASSERT(pEditObj);
5665     CPPUNIT_ASSERT_EQUAL(OUString("R2"), pEditObj->GetText(0));
5666     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(6, 3, destSheet));
5667     CPPUNIT_ASSERT_EQUAL(OUString("s"), m_pDoc->GetString(6, 4, destSheet));
5668     CPPUNIT_ASSERT_EQUAL(-14.0, m_pDoc->GetValue(6, 5, destSheet));
5669     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 6, destSheet));
5670     pEditObj = m_pDoc->GetEditText(ScAddress(6, 6, destSheet));
5671     CPPUNIT_ASSERT(pEditObj == nullptr);
5672     // col 7, formulas
5673     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
5674     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 0, destSheet));
5675     CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), getFormula(7, 1, destSheet));
5676     CPPUNIT_ASSERT_EQUAL(64.0, m_pDoc->GetValue(7, 1, destSheet));
5677     if (!bSkipEmpty)
5678     {
5679         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 2, destSheet));
5680         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 3, destSheet));
5681     }
5682     else
5683     {
5684         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
5685         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
5686     }
5687     CPPUNIT_ASSERT_EQUAL(OUString("t"), m_pDoc->GetString(7, 4, destSheet));
5688     CPPUNIT_ASSERT_EQUAL(-15.0, m_pDoc->GetValue(7, 5, destSheet));
5689     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 6, destSheet));
5690     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 6, destSheet));
5691     // col 8, formulas
5692     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 0, destSheet));
5693     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 0, destSheet));
5694     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), getFormula(8, 1, destSheet));
5695     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(8, 1, destSheet));
5696     if (!bSkipEmpty)
5697     {
5698         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(8, 2, destSheet));
5699         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(8, 3, destSheet));
5700     }
5701     else
5702     {
5703         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 2, destSheet));
5704         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 3, destSheet));
5705     }
5706     CPPUNIT_ASSERT_EQUAL(OUString("u"), m_pDoc->GetString(8, 4, destSheet));
5707     CPPUNIT_ASSERT_EQUAL(-16.0, m_pDoc->GetValue(8, 5, destSheet));
5708     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 6, destSheet));
5709     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 6, destSheet));
5710     // col 9
5711     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 0, destSheet));
5712     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 1, destSheet));
5713     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 2, destSheet));
5714     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 3, destSheet));
5715     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 4, destSheet));
5716     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 5, destSheet));
5717 
5718     // check patterns
5719     const SfxPoolItem* pItem = nullptr;
5720     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5721     CPPUNIT_ASSERT(pItem);
5722     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5723     m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5724     CPPUNIT_ASSERT(pItem);
5725     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5726     m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5727     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5728     m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5729     CPPUNIT_ASSERT(!pItem);
5730     m_pDoc->GetPattern(ScAddress(3, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5731     CPPUNIT_ASSERT(!pItem);
5732     m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5733     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
5734     if (!bSkipEmpty)
5735         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5736 
5737     m_pDoc->GetPattern(ScAddress(4, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5738     CPPUNIT_ASSERT(!pItem);
5739     m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5740     CPPUNIT_ASSERT(pItem);
5741     CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5742     m_pDoc->GetPattern(ScAddress(6, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5743     CPPUNIT_ASSERT(pItem);
5744     CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor());
5745     m_pDoc->GetPattern(ScAddress(7, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
5746     CPPUNIT_ASSERT(!pItem);
5747 
5748     // check border, left and right borders were transformed to top and bottom borders
5749     pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER);
5750     CPPUNIT_ASSERT(pItem);
5751     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5752     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5753     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5754     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5755     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
5756     CPPUNIT_ASSERT(pItem);
5757     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5758     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5759     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5760     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
5761     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
5762     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5763     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5764     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5765     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
5766     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
5767     CPPUNIT_ASSERT(pItem);
5768     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5769     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5770     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5771     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5772     pItem = m_pDoc->GetAttr(ScAddress(4, 5, destSheet), ATTR_BORDER);
5773     CPPUNIT_ASSERT(pItem);
5774     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5775     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5776     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5777     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5778 
5779     pItem = m_pDoc->GetAttr(ScAddress(3, 4, destSheet), ATTR_BORDER);
5780     CPPUNIT_ASSERT(pItem);
5781     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5782     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5783     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5784     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5785     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
5786     CPPUNIT_ASSERT(pItem);
5787     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5788     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5789     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5790     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5791     pItem = m_pDoc->GetAttr(ScAddress(5, 4, destSheet), ATTR_BORDER);
5792     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5793     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5794     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5795     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5796     pItem = m_pDoc->GetAttr(ScAddress(6, 4, destSheet), ATTR_BORDER);
5797     CPPUNIT_ASSERT(pItem);
5798     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
5799     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5800     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5801     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5802     pItem = m_pDoc->GetAttr(ScAddress(7, 4, destSheet), ATTR_BORDER);
5803     CPPUNIT_ASSERT(pItem);
5804     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
5805     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
5806     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
5807     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
5808 
5809     // check notes after transposed copy/paste
5810     // check presence of notes
5811     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
5812     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
5813     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
5814     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
5815     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
5816     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
5817     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 0, destSheet));
5818     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 0, destSheet));
5819     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
5820     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
5821     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
5822     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 1, destSheet));
5823     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 1, destSheet));
5824     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
5825     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 1, destSheet));
5826     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 1, destSheet));
5827     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
5828     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
5829     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 2, destSheet));
5830     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
5831     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 2, destSheet));
5832     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 2, destSheet));
5833     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(8, 2, destSheet));
5834     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 2, destSheet));
5835     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
5836     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 3, destSheet));
5837     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 3, destSheet));
5838     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
5839     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 3, destSheet));
5840     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(7, 3, destSheet));
5841     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 3, destSheet));
5842     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 3, destSheet));
5843     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
5844     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
5845     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 4, destSheet));
5846     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 4, destSheet));
5847     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 4, destSheet));
5848     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 4, destSheet));
5849     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 4, destSheet));
5850     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 4, destSheet));
5851     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 5, destSheet));
5852     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 5, destSheet));
5853     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 5, destSheet));
5854     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 5, destSheet));
5855     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 5, destSheet));
5856     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 5, destSheet));
5857     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 5, destSheet));
5858     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 5, destSheet));
5859 
5860     // check values of notes
5861     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
5862     CPPUNIT_ASSERT_EQUAL(OUString("Note A2"), getNote(3, 2, destSheet));
5863     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(3, 3, destSheet));
5864     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(4, 1, destSheet));
5865     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 3, destSheet));
5866     CPPUNIT_ASSERT_EQUAL(OUString("Note C2"), getNote(5, 2, destSheet));
5867     CPPUNIT_ASSERT_EQUAL(OUString("Note C3"), getNote(5, 3, destSheet));
5868     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(6, 1, destSheet));
5869     CPPUNIT_ASSERT_EQUAL(OUString("Note D2"), getNote(6, 2, destSheet));
5870     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(6, 3, destSheet));
5871     if (!bSkipEmpty)
5872         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(7, 3, destSheet));
5873     if (!bSkipEmpty)
5874         CPPUNIT_ASSERT_EQUAL(OUString("Note F2"), getNote(8, 2, destSheet));
5875     CPPUNIT_ASSERT_EQUAL(OUString("Note C5"), getNote(5, 4, destSheet));
5876 
5877     // check row 16 on src sheet, refs to copied/cut range
5878     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
5879     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
5880     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
5881     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
5882     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
5883     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
5884     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
5885     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
5886     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
5887     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
5888 
5889     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
5890     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
5891     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
5892     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
5893     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
5894     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
5895     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
5896     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
5897     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
5898     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
5899 
5900     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
5901     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
5902     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
5903     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
5904     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
5905     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
5906     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
5907     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
5908     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
5909     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
5910 
5911     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
5912     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
5913     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
5914     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
5915     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
5916     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
5917     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
5918     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
5919     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
5920     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
5921 
5922     // Existing references to the destination range must not change
5923     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
5924     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
5925     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
5926     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
5927     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
5928     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
5929     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
5930     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
5931     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
5932     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
5933     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
5934     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
5935     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
5936     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
5937     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
5938     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
5939     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
5940     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
5941     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
5942     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
5943     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
5944     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
5945     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
5946     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
5947     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
5948     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
5949     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
5950     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
5951     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
5952     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
5953     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
5954     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
5955     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
5956     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
5957     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
5958     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
5959     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
5960     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
5961     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
5962     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
5963     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
5964     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
5965     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
5966     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
5967     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
5968     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
5969     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
5970     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
5971     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
5972 
5973     m_pDoc->DeleteTab(destSheet);
5974     m_pDoc->DeleteTab(srcSheet);
5975 }
5976 
checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty)5977 void TestCopyPaste::checkCopyPasteSpecialMultiRangeRowFiltered(bool bSkipEmpty)
5978 {
5979     const SCTAB srcSheet = 0;
5980     const SCTAB destSheet = 1;
5981 
5982     /*
5983          |  D  |    E     | F  |  G  |     H      |        I            |
5984 
5985     2    | 1 B*| =D2+10  *| a  | R1 *| =D2+D4+60  | =SUMIF(D2:D5;"<4")  |
5986     3    | 3 B*| =G3+30 b*| c *|  5 *|          B*|                     |
5987                                                                           <- not selected
5988     4    | 6   |    q     | r  |  s  |     t      |          u          |
5989     5    | -11 |   -12    |-13 | -14 |    -15     |         -16         |
5990 
5991     * means note attached
5992     B means background
5993     b means border
5994     */
5995 
5996     const EditTextObject* pEditObj;
5997     // col 2
5998     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
5999     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 1, destSheet));
6000     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
6001     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
6002     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
6003     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
6004     // col 3, numbers
6005     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
6006     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(3, 1, destSheet));
6007     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 2, destSheet));
6008     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(3, 3, destSheet));
6009     CPPUNIT_ASSERT_EQUAL(-11.0, m_pDoc->GetValue(3, 4, destSheet));
6010     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 5, destSheet));
6011     // col 4, formulas
6012     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
6013     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(4, 0, destSheet));
6014     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(4, 1, destSheet));
6015     CPPUNIT_ASSERT_EQUAL(OUString("=D2+10"), getFormula(4, 1, destSheet));
6016     CPPUNIT_ASSERT_EQUAL(OUString("=G3+30"), getFormula(4, 2, destSheet));
6017     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 2, destSheet));
6018     CPPUNIT_ASSERT_EQUAL(OUString("q"), m_pDoc->GetString(4, 3, destSheet));
6019     CPPUNIT_ASSERT_EQUAL(-12.0, m_pDoc->GetValue(4, 4, destSheet));
6020     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
6021     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(4, 5, destSheet));
6022     // col 5, strings
6023     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
6024     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(5, 0, destSheet));
6025     CPPUNIT_ASSERT_EQUAL(OUString("a"), m_pDoc->GetString(5, 1, destSheet));
6026     CPPUNIT_ASSERT_EQUAL(OUString("c"), m_pDoc->GetString(5, 2, destSheet));
6027     CPPUNIT_ASSERT_EQUAL(OUString("r"), m_pDoc->GetString(5, 3, destSheet));
6028     CPPUNIT_ASSERT_EQUAL(-13.0, m_pDoc->GetValue(5, 4, destSheet));
6029     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
6030     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(5, 5, destSheet));
6031     // col 6, rich text
6032     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
6033     pEditObj = m_pDoc->GetEditText(ScAddress(6, 0, destSheet));
6034     CPPUNIT_ASSERT(pEditObj == nullptr);
6035     pEditObj = m_pDoc->GetEditText(ScAddress(6, 1, destSheet));
6036     CPPUNIT_ASSERT(pEditObj);
6037     CPPUNIT_ASSERT_EQUAL(OUString("R1"), pEditObj->GetText(0));
6038     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(6, 2, destSheet));
6039     CPPUNIT_ASSERT_EQUAL(OUString("s"), m_pDoc->GetString(6, 3, destSheet));
6040     CPPUNIT_ASSERT_EQUAL(-14.0, m_pDoc->GetValue(6, 4, destSheet));
6041     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 5, destSheet));
6042     pEditObj = m_pDoc->GetEditText(ScAddress(6, 5, destSheet));
6043     CPPUNIT_ASSERT(pEditObj == nullptr);
6044     // col 7, formulas
6045     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
6046     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 0, destSheet));
6047     CPPUNIT_ASSERT_EQUAL(OUString("=D2+D4+60"), getFormula(7, 1, destSheet));
6048     CPPUNIT_ASSERT_EQUAL(67.0, m_pDoc->GetValue(7, 1, destSheet));
6049     if (!bSkipEmpty)
6050         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(7, 2, destSheet));
6051     else
6052         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
6053     CPPUNIT_ASSERT_EQUAL(OUString("t"), m_pDoc->GetString(7, 3, destSheet));
6054     CPPUNIT_ASSERT_EQUAL(-15.0, m_pDoc->GetValue(7, 4, destSheet));
6055     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
6056     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
6057     // col 8, formulas
6058     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 0, destSheet));
6059     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 0, destSheet));
6060     CPPUNIT_ASSERT_EQUAL(OUString("=SUMIF(D2:D5;\"<4\")"), getFormula(8, 1, destSheet));
6061     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(8, 1, destSheet));
6062     if (!bSkipEmpty)
6063         CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, m_pDoc->GetString(8, 2, destSheet));
6064     else
6065         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 2, destSheet));
6066     CPPUNIT_ASSERT_EQUAL(OUString("u"), m_pDoc->GetString(8, 3, destSheet));
6067     CPPUNIT_ASSERT_EQUAL(-16.0, m_pDoc->GetValue(8, 4, destSheet));
6068     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 5, destSheet));
6069     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 5, destSheet));
6070     // col 9
6071     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 0, destSheet));
6072     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 1, destSheet));
6073     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 2, destSheet));
6074     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 3, destSheet));
6075     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 4, destSheet));
6076     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(9, 5, destSheet));
6077 
6078     // check patterns
6079     const SfxPoolItem* pItem = nullptr;
6080     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6081     CPPUNIT_ASSERT(pItem);
6082     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6083     m_pDoc->GetPattern(ScAddress(3, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6084     CPPUNIT_ASSERT_EQUAL(COL_BLUE, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6085     m_pDoc->GetPattern(ScAddress(3, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6086     CPPUNIT_ASSERT(!pItem);
6087     m_pDoc->GetPattern(ScAddress(3, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6088     CPPUNIT_ASSERT(!pItem);
6089     m_pDoc->GetPattern(ScAddress(7, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6090     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
6091     if (!bSkipEmpty)
6092         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6093 
6094     m_pDoc->GetPattern(ScAddress(4, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6095     CPPUNIT_ASSERT(!pItem);
6096     m_pDoc->GetPattern(ScAddress(5, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6097     CPPUNIT_ASSERT(pItem);
6098     CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6099     m_pDoc->GetPattern(ScAddress(6, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6100     CPPUNIT_ASSERT(pItem);
6101     CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6102     m_pDoc->GetPattern(ScAddress(7, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6103     CPPUNIT_ASSERT(!pItem);
6104 
6105     // check border, left and right borders were transformed to top and bottom borders
6106     pItem = m_pDoc->GetAttr(ScAddress(4, 1, destSheet), ATTR_BORDER);
6107     CPPUNIT_ASSERT(pItem);
6108     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6109     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6110     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6111     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6112     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
6113     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6114     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6115     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6116     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
6117     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
6118     CPPUNIT_ASSERT(pItem);
6119     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6120     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6121     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6122     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6123     pItem = m_pDoc->GetAttr(ScAddress(4, 4, destSheet), ATTR_BORDER);
6124     CPPUNIT_ASSERT(pItem);
6125     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6126     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6127     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6128     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6129 
6130     pItem = m_pDoc->GetAttr(ScAddress(3, 3, destSheet), ATTR_BORDER);
6131     CPPUNIT_ASSERT(pItem);
6132     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6133     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6134     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6135     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6136     pItem = m_pDoc->GetAttr(ScAddress(4, 3, destSheet), ATTR_BORDER);
6137     CPPUNIT_ASSERT(pItem);
6138     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6139     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6140     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6141     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6142     pItem = m_pDoc->GetAttr(ScAddress(5, 3, destSheet), ATTR_BORDER);
6143     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
6144     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6145     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6146     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6147     pItem = m_pDoc->GetAttr(ScAddress(6, 3, destSheet), ATTR_BORDER);
6148     CPPUNIT_ASSERT(pItem);
6149     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetTop());
6150     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6151     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6152     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6153     pItem = m_pDoc->GetAttr(ScAddress(7, 3, destSheet), ATTR_BORDER);
6154     CPPUNIT_ASSERT(pItem);
6155     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6156     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6157     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6158     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetRight());
6159 
6160     // check notes after transposed copy/paste
6161     // check presence of notes
6162     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 0, destSheet));
6163     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 0, destSheet));
6164     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 0, destSheet));
6165     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 0, destSheet));
6166     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 0, destSheet));
6167     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 0, destSheet));
6168     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 0, destSheet));
6169     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 0, destSheet));
6170     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 1, destSheet));
6171     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 1, destSheet));
6172     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 1, destSheet));
6173     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 1, destSheet));
6174     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 1, destSheet));
6175     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 1, destSheet));
6176     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 1, destSheet));
6177     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 1, destSheet));
6178     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 2, destSheet));
6179     CPPUNIT_ASSERT(m_pDoc->HasNote(3, 2, destSheet));
6180     CPPUNIT_ASSERT(m_pDoc->HasNote(4, 2, destSheet));
6181     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 2, destSheet));
6182     CPPUNIT_ASSERT(m_pDoc->HasNote(6, 2, destSheet));
6183     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(7, 2, destSheet));
6184     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 2, destSheet));
6185     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 2, destSheet));
6186     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 3, destSheet));
6187     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 3, destSheet));
6188     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 3, destSheet));
6189     CPPUNIT_ASSERT(m_pDoc->HasNote(5, 3, destSheet));
6190     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 3, destSheet));
6191     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 3, destSheet));
6192     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 3, destSheet));
6193     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 3, destSheet));
6194     CPPUNIT_ASSERT(!m_pDoc->HasNote(2, 4, destSheet));
6195     CPPUNIT_ASSERT(!m_pDoc->HasNote(3, 4, destSheet));
6196     CPPUNIT_ASSERT(!m_pDoc->HasNote(4, 4, destSheet));
6197     CPPUNIT_ASSERT(!m_pDoc->HasNote(5, 4, destSheet));
6198     CPPUNIT_ASSERT(!m_pDoc->HasNote(6, 4, destSheet));
6199     CPPUNIT_ASSERT(!m_pDoc->HasNote(7, 4, destSheet));
6200     CPPUNIT_ASSERT(!m_pDoc->HasNote(8, 4, destSheet));
6201     CPPUNIT_ASSERT(!m_pDoc->HasNote(9, 4, destSheet));
6202 
6203     // check values of notes
6204     CPPUNIT_ASSERT_EQUAL(OUString("Note A1"), getNote(3, 1, destSheet));
6205     CPPUNIT_ASSERT_EQUAL(OUString("Note A3"), getNote(3, 2, destSheet));
6206     CPPUNIT_ASSERT_EQUAL(OUString("Note B1"), getNote(4, 1, destSheet));
6207     CPPUNIT_ASSERT_EQUAL(OUString("Note B3"), getNote(4, 2, destSheet));
6208     CPPUNIT_ASSERT_EQUAL(OUString("Note C3"), getNote(5, 2, destSheet));
6209     CPPUNIT_ASSERT_EQUAL(OUString("Note D1"), getNote(6, 1, destSheet));
6210     CPPUNIT_ASSERT_EQUAL(OUString("Note D3"), getNote(6, 2, destSheet));
6211     if (!bSkipEmpty)
6212         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(7, 2, destSheet));
6213     CPPUNIT_ASSERT_EQUAL(OUString("Note C5"), getNote(5, 3, destSheet));
6214 
6215     // check row 16 on src sheet, refs to copied/cut range
6216     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
6217     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
6218     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
6219     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
6220     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
6221     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
6222     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
6223     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
6224     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
6225     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
6226 
6227     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
6228     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
6229     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
6230     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
6231     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
6232     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
6233     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
6234     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
6235     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
6236     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
6237 
6238     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
6239     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
6240     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
6241     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
6242     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
6243     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
6244     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
6245     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
6246     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
6247     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
6248 
6249     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
6250     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
6251     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
6252     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
6253     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
6254     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
6255     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
6256     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
6257     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
6258     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
6259 
6260     // Existing references to the destination range must not change
6261     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
6262     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
6263     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
6264     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
6265     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
6266     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
6267     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
6268     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
6269     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
6270     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
6271     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
6272     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
6273     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
6274     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
6275     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
6276     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
6277     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
6278     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
6279     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
6280     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
6281     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
6282     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
6283     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
6284     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
6285     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
6286     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
6287     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
6288     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
6289     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
6290     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
6291     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
6292     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
6293     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
6294     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
6295     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
6296     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
6297     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
6298     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
6299     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
6300     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
6301     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
6302     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
6303     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
6304     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
6305     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
6306     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
6307     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
6308     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
6309     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
6310 
6311     m_pDoc->DeleteTab(destSheet);
6312     m_pDoc->DeleteTab(srcSheet);
6313 }
6314 
checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty)6315 void TestCopyPaste::checkCopyPasteSpecialMultiRangeRowTranspose(bool bSkipEmpty)
6316 {
6317     const SCTAB srcSheet = 0;
6318     const SCTAB destSheet = 1;
6319 
6320     /*
6321              |         D          |    E     |    F     | G  |  H  |
6322 
6323         2    |         1        B*|    2   B*|    3   B*| 6  | -11 |
6324         3    |      =D2+10       *| =E2+20 b | =F5+30 b*| q  | -12 |
6325         4    |         a          |    b    *|    c    *| r  | -13 |
6326         5    |        R1         *|   R2    *|    5    *| s  | -14 |
6327         6    |     =D2+F2+60      |          |        B*| t  | -15 |
6328         7    | =SUMIF(D2:G2;"<4") |         *|          | u  | -16 |
6329 
6330         * means note attached
6331         B means background
6332         b means border
6333     */
6334 
6335     //check cell content after transposed copy/paste of filtered data
6336     // Note: column F is a repetition of srcSheet.Column A
6337     // Col C and G are checked to be empty
6338     const EditTextObject* pEditObj;
6339     // row 0
6340     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
6341     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
6342     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
6343     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
6344     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
6345     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
6346     // row 1, numbers
6347     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell C2", 1000.0, m_pDoc->GetValue(2, 1, destSheet));
6348     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell D2", 1.0, m_pDoc->GetValue(3, 1, destSheet));
6349     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell E2", 2.0, m_pDoc->GetValue(4, 1, destSheet));
6350     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell F2", 3.0, m_pDoc->GetValue(5, 1, destSheet));
6351     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell G2", 6.0, m_pDoc->GetValue(6, 1, destSheet));
6352     CPPUNIT_ASSERT_EQUAL(-11.0, m_pDoc->GetValue(7, 1, destSheet));
6353     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell I2", 1000.0, m_pDoc->GetValue(8, 1, destSheet));
6354     // row 2, formulas
6355     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
6356     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 2, destSheet));
6357     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", 11.0, m_pDoc->GetValue(3, 2, destSheet));
6358     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", OUString("=D2+10"), getFormula(3, 2, destSheet));
6359     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", OUString("=E2+20"), getFormula(4, 2, destSheet));
6360     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", 22.0, m_pDoc->GetValue(4, 2, destSheet));
6361     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", 35.0, m_pDoc->GetValue(5, 2, destSheet));
6362     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed F3", OUString("=F5+30"), getFormula(5, 2, destSheet));
6363     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4", OUString("q"), m_pDoc->GetString(6, 2, destSheet));
6364     CPPUNIT_ASSERT_EQUAL(-12.0, m_pDoc->GetValue(7, 2, destSheet));
6365     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 2, destSheet));
6366     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 2, destSheet));
6367     // row 3, strings
6368     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
6369     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 3, destSheet));
6370     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4", OUString("a"), m_pDoc->GetString(3, 3, destSheet));
6371     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("b"), m_pDoc->GetString(4, 3, destSheet));
6372     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("c"), m_pDoc->GetString(5, 3, destSheet));
6373     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G4", OUString("r"), m_pDoc->GetString(6, 3, destSheet));
6374     CPPUNIT_ASSERT_EQUAL(-13.0, m_pDoc->GetValue(7, 3, destSheet));
6375     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 3, destSheet));
6376     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 3, destSheet));
6377     // row 4, rich text
6378     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
6379     pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet));
6380     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr);
6381     pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet));
6382     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj);
6383     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"),
6384                                  pEditObj->GetText(0));
6385     pEditObj = m_pDoc->GetEditText(ScAddress(4, 4, destSheet));
6386     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in E5.", pEditObj);
6387     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong E5.", OUString("R2"), pEditObj->GetText(0));
6388     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell F5", 5.0, m_pDoc->GetValue(5, 4, destSheet));
6389     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G5", OUString("s"), m_pDoc->GetString(6, 4, destSheet));
6390     CPPUNIT_ASSERT_EQUAL(-14.0, m_pDoc->GetValue(7, 4, destSheet));
6391     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 4, destSheet));
6392     pEditObj = m_pDoc->GetEditText(ScAddress(8, 4, destSheet));
6393     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in I5.", pEditObj == nullptr);
6394     // row 5, formulas
6395     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
6396     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
6397     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", OUString("=D2+F2+60"),
6398                                  getFormula(3, 5, destSheet));
6399     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", 64.0, m_pDoc->GetValue(3, 5, destSheet));
6400     if (!bSkipEmpty)
6401     {
6402         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 5, destSheet));
6403         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(5, 5, destSheet));
6404     }
6405     else
6406     {
6407         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
6408         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 5, destSheet));
6409     }
6410     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G6", OUString("t"), m_pDoc->GetString(6, 5, destSheet));
6411     CPPUNIT_ASSERT_EQUAL(-15.0, m_pDoc->GetValue(7, 5, destSheet));
6412     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 5, destSheet));
6413     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 5, destSheet));
6414     // row 6, formulas
6415     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 6, destSheet));
6416     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 6, destSheet));
6417     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", OUString("=SUMIF(D2:G2;\"<4\")"),
6418                                  getFormula(3, 6, destSheet));
6419     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", 6.0, m_pDoc->GetValue(3, 6, destSheet));
6420     if (!bSkipEmpty)
6421     {
6422         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 6, destSheet));
6423         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(5, 6, destSheet));
6424     }
6425     else
6426     {
6427         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 6, destSheet));
6428         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 6, destSheet));
6429     }
6430     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell G7", OUString("u"), m_pDoc->GetString(6, 6, destSheet));
6431     CPPUNIT_ASSERT_EQUAL(-16.0, m_pDoc->GetValue(7, 6, destSheet));
6432     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(8, 6, destSheet));
6433     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(8, 6, destSheet));
6434     // row 7
6435     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
6436     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
6437     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
6438     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
6439     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
6440     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
6441 
6442     // check patterns
6443     const SfxPoolItem* pItem = nullptr;
6444     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6445     CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem);
6446     CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE,
6447                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
6448     m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6449     CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem);
6450     CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has blue background", COL_BLUE,
6451                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
6452     m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6453     CPPUNIT_ASSERT_MESSAGE("F2 has a pattern", pItem);
6454     CPPUNIT_ASSERT_EQUAL_MESSAGE("F2 has a pattern", COL_BLUE,
6455                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
6456     m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6457     CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem);
6458     m_pDoc->GetPattern(ScAddress(7, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6459     CPPUNIT_ASSERT_MESSAGE("H2 has no pattern", !pItem);
6460     m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6461     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
6462     if (!bSkipEmpty)
6463         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6464 
6465     // check border, left and right borders were transformed to top and bottom borders
6466     pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER);
6467     CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem);
6468     CPPUNIT_ASSERT_MESSAGE("D3 has no top border",
6469                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
6470     CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border",
6471                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6472     CPPUNIT_ASSERT_MESSAGE("D3 has no left border",
6473                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6474     CPPUNIT_ASSERT_MESSAGE("D3 has no right border",
6475                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6476 
6477     m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem);
6478     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
6479     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
6480 
6481     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
6482     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
6483     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
6484     CPPUNIT_ASSERT_MESSAGE("E3 has bottom border",
6485                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6486     CPPUNIT_ASSERT_MESSAGE("E3 has no left border",
6487                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6488     CPPUNIT_ASSERT_MESSAGE("E3 has no right border",
6489                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6490     pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER);
6491     CPPUNIT_ASSERT_MESSAGE("F3 has a border", pItem);
6492     CPPUNIT_ASSERT_MESSAGE("F3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
6493     CPPUNIT_ASSERT_MESSAGE("F3 has bottom border",
6494                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6495     CPPUNIT_ASSERT_MESSAGE("F3 has no left border",
6496                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6497     CPPUNIT_ASSERT_MESSAGE("F3 has no right border",
6498                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6499     pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER);
6500     CPPUNIT_ASSERT_MESSAGE("G3 has top border", !static_cast<const SvxBoxItem*>(pItem)->GetTop());
6501     CPPUNIT_ASSERT_MESSAGE("G3 has bottom border",
6502                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6503     CPPUNIT_ASSERT_MESSAGE("G3 has no left border",
6504                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6505     CPPUNIT_ASSERT_MESSAGE("G3 has no right border",
6506                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6507     pItem = m_pDoc->GetAttr(ScAddress(7, 2, destSheet), ATTR_BORDER);
6508     CPPUNIT_ASSERT_MESSAGE("H3 has a border", pItem);
6509     CPPUNIT_ASSERT_MESSAGE("H3 has no top border",
6510                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
6511     CPPUNIT_ASSERT_MESSAGE("H3 has no bottom border",
6512                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6513     CPPUNIT_ASSERT_MESSAGE("H3 has no left border",
6514                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6515     CPPUNIT_ASSERT_MESSAGE("H3 has no right border",
6516                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6517 
6518     // check notes after transposed copy/paste
6519     // check presence of notes
6520     CPPUNIT_ASSERT_MESSAGE("C1: no note", !m_pDoc->HasNote(2, 0, destSheet));
6521     CPPUNIT_ASSERT_MESSAGE("D1: no note", !m_pDoc->HasNote(3, 0, destSheet));
6522     CPPUNIT_ASSERT_MESSAGE("E1: no note", !m_pDoc->HasNote(4, 0, destSheet));
6523     CPPUNIT_ASSERT_MESSAGE("F1: no note", !m_pDoc->HasNote(5, 0, destSheet));
6524     CPPUNIT_ASSERT_MESSAGE("G1: no note", !m_pDoc->HasNote(6, 0, destSheet));
6525     CPPUNIT_ASSERT_MESSAGE("H1: no note", !m_pDoc->HasNote(7, 0, destSheet));
6526     CPPUNIT_ASSERT_MESSAGE("C2: no note", !m_pDoc->HasNote(2, 1, destSheet));
6527     CPPUNIT_ASSERT_MESSAGE("D2:  a note", m_pDoc->HasNote(3, 1, destSheet));
6528     CPPUNIT_ASSERT_MESSAGE("E2:  a note", m_pDoc->HasNote(4, 1, destSheet));
6529     CPPUNIT_ASSERT_MESSAGE("F2:  a note", m_pDoc->HasNote(5, 1, destSheet));
6530     CPPUNIT_ASSERT_MESSAGE("G2: no note", !m_pDoc->HasNote(6, 1, destSheet));
6531     CPPUNIT_ASSERT_MESSAGE("H2: no note", !m_pDoc->HasNote(7, 1, destSheet));
6532     CPPUNIT_ASSERT_MESSAGE("C3: no note", !m_pDoc->HasNote(2, 2, destSheet));
6533     CPPUNIT_ASSERT_MESSAGE("D3:  a note", m_pDoc->HasNote(3, 2, destSheet));
6534     CPPUNIT_ASSERT_MESSAGE("E3: no note", !m_pDoc->HasNote(4, 2, destSheet));
6535     CPPUNIT_ASSERT_MESSAGE("F3:  a note", m_pDoc->HasNote(5, 2, destSheet));
6536     CPPUNIT_ASSERT_MESSAGE("G3: no note", !m_pDoc->HasNote(6, 2, destSheet));
6537     CPPUNIT_ASSERT_MESSAGE("H3: no note", !m_pDoc->HasNote(7, 2, destSheet));
6538     CPPUNIT_ASSERT_MESSAGE("C4: no note", !m_pDoc->HasNote(2, 3, destSheet));
6539     CPPUNIT_ASSERT_MESSAGE("D4: no note", !m_pDoc->HasNote(3, 3, destSheet));
6540     CPPUNIT_ASSERT_MESSAGE("E4:  a note", m_pDoc->HasNote(4, 3, destSheet));
6541     CPPUNIT_ASSERT_MESSAGE("F4:  a note", m_pDoc->HasNote(5, 3, destSheet));
6542     CPPUNIT_ASSERT_MESSAGE("G4:  a note", m_pDoc->HasNote(6, 3, destSheet));
6543     CPPUNIT_ASSERT_MESSAGE("H4: no note", !m_pDoc->HasNote(7, 3, destSheet));
6544     CPPUNIT_ASSERT_MESSAGE("C5: no note", !m_pDoc->HasNote(2, 4, destSheet));
6545     CPPUNIT_ASSERT_MESSAGE("D5:  a note", m_pDoc->HasNote(3, 4, destSheet));
6546     CPPUNIT_ASSERT_MESSAGE("E5:  a note", m_pDoc->HasNote(4, 4, destSheet));
6547     CPPUNIT_ASSERT_MESSAGE("F5:  a note", m_pDoc->HasNote(5, 4, destSheet));
6548     CPPUNIT_ASSERT_MESSAGE("G5: no note", !m_pDoc->HasNote(6, 4, destSheet));
6549     CPPUNIT_ASSERT_MESSAGE("H5: no note", !m_pDoc->HasNote(7, 4, destSheet));
6550     CPPUNIT_ASSERT_MESSAGE("C6: no note", !m_pDoc->HasNote(2, 5, destSheet));
6551     CPPUNIT_ASSERT_MESSAGE("D6: no note", !m_pDoc->HasNote(3, 5, destSheet));
6552     CPPUNIT_ASSERT_MESSAGE("E6: no note", !m_pDoc->HasNote(4, 5, destSheet));
6553     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(5, 5, destSheet));
6554     CPPUNIT_ASSERT_MESSAGE("G6: no note", !m_pDoc->HasNote(6, 5, destSheet));
6555     CPPUNIT_ASSERT_MESSAGE("H6: no note", !m_pDoc->HasNote(7, 5, destSheet));
6556     CPPUNIT_ASSERT_MESSAGE("C7: no note", !m_pDoc->HasNote(2, 6, destSheet));
6557     CPPUNIT_ASSERT_MESSAGE("D7: no note", !m_pDoc->HasNote(3, 6, destSheet));
6558     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(4, 6, destSheet));
6559     CPPUNIT_ASSERT_MESSAGE("F7: no note", !m_pDoc->HasNote(5, 6, destSheet));
6560     CPPUNIT_ASSERT_MESSAGE("G7: no note", !m_pDoc->HasNote(6, 6, destSheet));
6561     CPPUNIT_ASSERT_MESSAGE("H7: no note", !m_pDoc->HasNote(7, 6, destSheet));
6562     CPPUNIT_ASSERT_MESSAGE("C8: no note", !m_pDoc->HasNote(2, 7, destSheet));
6563     CPPUNIT_ASSERT_MESSAGE("D8: no note", !m_pDoc->HasNote(3, 7, destSheet));
6564     CPPUNIT_ASSERT_MESSAGE("E8: no note", !m_pDoc->HasNote(4, 7, destSheet));
6565     CPPUNIT_ASSERT_MESSAGE("F8: no note", !m_pDoc->HasNote(5, 7, destSheet));
6566     CPPUNIT_ASSERT_MESSAGE("G8: no note", !m_pDoc->HasNote(6, 7, destSheet));
6567     CPPUNIT_ASSERT_MESSAGE("H8: no note", !m_pDoc->HasNote(7, 7, destSheet));
6568 
6569     // check values of notes
6570     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("Note A1"), getNote(3, 1, destSheet));
6571     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("Note A2"), getNote(4, 1, destSheet));
6572     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F2", OUString("Note A3"), getNote(5, 1, destSheet));
6573     // G2 has no note
6574     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D3", OUString("Note B1"), getNote(3, 2, destSheet));
6575     // E3 has no note
6576     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F3", OUString("Note B3"), getNote(5, 2, destSheet));
6577     // D4 has no note
6578     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("Note C2"), getNote(4, 3, destSheet));
6579     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("Note C3"), getNote(5, 3, destSheet));
6580     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D5", OUString("Note D1"), getNote(3, 4, destSheet));
6581     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", OUString("Note D2"), getNote(4, 4, destSheet));
6582     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F5", OUString("Note D3"), getNote(5, 4, destSheet));
6583     if (!bSkipEmpty)
6584         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(5, 5, destSheet));
6585     if (!bSkipEmpty)
6586         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E7", OUString("Note F2"), getNote(4, 6, destSheet));
6587     CPPUNIT_ASSERT_EQUAL(OUString("Note C5"), getNote(6, 3, destSheet));
6588 
6589     // check row 16 on src sheet, refs to copied/cut range
6590     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
6591     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
6592     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
6593     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
6594     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
6595     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
6596     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
6597     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
6598     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
6599     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
6600 
6601     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
6602     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
6603     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
6604     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
6605     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
6606     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
6607     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
6608     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
6609     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
6610     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
6611 
6612     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
6613     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
6614     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
6615     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
6616     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
6617     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
6618     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
6619     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
6620     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
6621     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
6622 
6623     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
6624     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
6625     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
6626     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
6627     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
6628     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
6629     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
6630     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
6631     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
6632     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
6633 
6634     // Existing references to the destination range must not change
6635     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
6636     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
6637     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
6638     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
6639     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
6640     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
6641     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
6642     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
6643     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
6644     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
6645     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
6646     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
6647     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
6648     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
6649     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
6650     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
6651     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
6652     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
6653     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
6654     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
6655     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
6656     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
6657     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
6658     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
6659     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
6660     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
6661     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
6662     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
6663     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
6664     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
6665     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
6666     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
6667     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
6668     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
6669     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
6670     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
6671     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
6672     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
6673     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
6674     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
6675     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
6676     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
6677     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
6678     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
6679     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
6680     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
6681     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
6682     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
6683     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
6684 
6685     m_pDoc->DeleteTab(destSheet);
6686     m_pDoc->DeleteTab(srcSheet);
6687 }
6688 
checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty)6689 void TestCopyPaste::checkCopyPasteSpecialMultiRangeRowFilteredTranspose(bool bSkipEmpty)
6690 {
6691     const SCTAB srcSheet = 0;
6692     const SCTAB destSheet = 1;
6693 
6694     /*
6695              |         D          |    E     | F  |  G  |
6696 
6697         2    |         1        B*|    3   B*| 6  | -11 |
6698         3    |      =D2+10       *| =F5+30 b*| q  | -12 |
6699         4    |         a          |    c    *| r  | -13 |
6700         5    |        R1         *|    5    *| s  | -14 |
6701         6    |     =D2+F2+60      |        B*| t  | -15 |
6702         7    | =SUMIF(D2:G2;"<4") |          | u  | -16 |
6703 
6704         * means note attached
6705         B means background
6706         b means border
6707     */
6708 
6709     //check cell content after transposed copy/paste of filtered data
6710     // Note: column F is a repetition of srcSheet.Column A
6711     // Col C and G are checked to be empty
6712     const EditTextObject* pEditObj;
6713     // row 0
6714     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 0, destSheet));
6715     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 0, destSheet));
6716     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 0, destSheet));
6717     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 0, destSheet));
6718     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 0, destSheet));
6719     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 0, destSheet));
6720     // row 1, numbers
6721     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell C2", 1000.0, m_pDoc->GetValue(2, 1, destSheet));
6722     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell D2", 1.0, m_pDoc->GetValue(3, 1, destSheet));
6723     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell E2", 3.0, m_pDoc->GetValue(4, 1, destSheet));
6724     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell F2", 6.0, m_pDoc->GetValue(5, 1, destSheet));
6725     CPPUNIT_ASSERT_EQUAL(-11.0, m_pDoc->GetValue(6, 1, destSheet));
6726     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell H2", 1000.0, m_pDoc->GetValue(7, 1, destSheet));
6727     // row 2, formulas
6728     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 2, destSheet));
6729     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 2, destSheet));
6730     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", 11.0, m_pDoc->GetValue(3, 2, destSheet));
6731     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D3", OUString("=D2+10"), getFormula(3, 2, destSheet));
6732     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", 35.0, m_pDoc->GetValue(4, 2, destSheet));
6733     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed E3", OUString("=E5+30"), getFormula(4, 2, destSheet));
6734     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("q"), m_pDoc->GetString(5, 2, destSheet));
6735     CPPUNIT_ASSERT_EQUAL(-12.0, m_pDoc->GetValue(6, 2, destSheet));
6736     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 2, destSheet));
6737     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 2, destSheet));
6738     // row 3, strings
6739     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 3, destSheet));
6740     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 3, destSheet));
6741     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D4", OUString("a"), m_pDoc->GetString(3, 3, destSheet));
6742     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("c"), m_pDoc->GetString(4, 3, destSheet));
6743     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F4", OUString("r"), m_pDoc->GetString(5, 3, destSheet));
6744     CPPUNIT_ASSERT_EQUAL(-13.0, m_pDoc->GetValue(6, 3, destSheet));
6745     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 3, destSheet));
6746     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 3, destSheet));
6747     // row 4, rich text
6748     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 4, destSheet));
6749     pEditObj = m_pDoc->GetEditText(ScAddress(2, 4, destSheet));
6750     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in C5.", pEditObj == nullptr);
6751     pEditObj = m_pDoc->GetEditText(ScAddress(3, 4, destSheet));
6752     CPPUNIT_ASSERT_MESSAGE("There should be an edit cell in D5.", pEditObj);
6753     CPPUNIT_ASSERT_EQUAL_MESSAGE("Edit cell value wrong in D5 ", OUString("R1"),
6754                                  pEditObj->GetText(0));
6755     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed cell E5", 5.0, m_pDoc->GetValue(4, 4, destSheet));
6756     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F5", OUString("s"), m_pDoc->GetString(5, 4, destSheet));
6757     CPPUNIT_ASSERT_EQUAL(-14.0, m_pDoc->GetValue(6, 4, destSheet));
6758     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 4, destSheet));
6759     pEditObj = m_pDoc->GetEditText(ScAddress(7, 4, destSheet));
6760     CPPUNIT_ASSERT_MESSAGE("There should be no edit cell in H5.", pEditObj == nullptr);
6761     // row 5, formulas
6762     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 5, destSheet));
6763     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 5, destSheet));
6764     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", OUString("=D2+F2+60"),
6765                                  getFormula(3, 5, destSheet));
6766     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D6", 67.0, m_pDoc->GetValue(3, 5, destSheet));
6767     if (!bSkipEmpty)
6768     {
6769         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E6", EMPTY_OUSTRING, m_pDoc->GetString(4, 5, destSheet));
6770     }
6771     else
6772         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 5, destSheet));
6773     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F6", OUString("t"), m_pDoc->GetString(5, 5, destSheet));
6774     CPPUNIT_ASSERT_EQUAL(-15.0, m_pDoc->GetValue(6, 5, destSheet));
6775     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 5, destSheet));
6776     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 5, destSheet));
6777     // row 6, formulas
6778     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 6, destSheet));
6779     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(2, 6, destSheet));
6780     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", OUString("=SUMIF(D2:G2;\"<4\")"),
6781                                  getFormula(3, 6, destSheet));
6782     CPPUNIT_ASSERT_EQUAL_MESSAGE("transposed D7", -7.0, m_pDoc->GetValue(3, 6, destSheet));
6783     if (!bSkipEmpty)
6784         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E7", EMPTY_OUSTRING, m_pDoc->GetString(4, 6, destSheet));
6785     else
6786         CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 6, destSheet));
6787     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell F7", OUString("u"), m_pDoc->GetString(5, 6, destSheet));
6788     CPPUNIT_ASSERT_EQUAL(-16.0, m_pDoc->GetValue(6, 6, destSheet));
6789     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 6, destSheet));
6790     CPPUNIT_ASSERT_EQUAL(OUString("1000"), m_pDoc->GetString(7, 6, destSheet));
6791     // row 7
6792     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(2, 7, destSheet));
6793     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(3, 7, destSheet));
6794     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(4, 7, destSheet));
6795     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(5, 7, destSheet));
6796     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(6, 7, destSheet));
6797     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(7, 7, destSheet));
6798 
6799     // check patterns
6800     const SfxPoolItem* pItem = nullptr;
6801     m_pDoc->GetPattern(ScAddress(3, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6802     CPPUNIT_ASSERT_MESSAGE("D2 has a pattern", pItem);
6803     CPPUNIT_ASSERT_EQUAL_MESSAGE("D2 has blue background", COL_BLUE,
6804                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
6805     m_pDoc->GetPattern(ScAddress(4, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6806     CPPUNIT_ASSERT_MESSAGE("E2 has a pattern", pItem);
6807     CPPUNIT_ASSERT_EQUAL_MESSAGE("E2 has a pattern", COL_BLUE,
6808                                  static_cast<const SvxBrushItem*>(pItem)->GetColor());
6809     m_pDoc->GetPattern(ScAddress(5, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6810     CPPUNIT_ASSERT_MESSAGE("F2 has no pattern", !pItem);
6811     m_pDoc->GetPattern(ScAddress(6, 1, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6812     CPPUNIT_ASSERT_MESSAGE("G2 has no pattern", !pItem);
6813     m_pDoc->GetPattern(ScAddress(4, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6814     CPPUNIT_ASSERT_EQUAL(bSkipEmpty, pItem == nullptr);
6815     if (!bSkipEmpty)
6816         CPPUNIT_ASSERT_EQUAL(COL_GREEN, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6817 
6818     m_pDoc->GetPattern(ScAddress(5, 2, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6819     CPPUNIT_ASSERT(!pItem);
6820     m_pDoc->GetPattern(ScAddress(5, 3, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6821     CPPUNIT_ASSERT(pItem);
6822     CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6823     m_pDoc->GetPattern(ScAddress(5, 4, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6824     CPPUNIT_ASSERT(pItem);
6825     CPPUNIT_ASSERT_EQUAL(COL_RED, static_cast<const SvxBrushItem*>(pItem)->GetColor());
6826     m_pDoc->GetPattern(ScAddress(5, 5, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6827     CPPUNIT_ASSERT(!pItem);
6828     m_pDoc->GetPattern(ScAddress(5, 6, destSheet))->GetItemSet().HasItem(ATTR_BACKGROUND, &pItem);
6829     CPPUNIT_ASSERT(!pItem);
6830 
6831     // check border, left and right borders were transformed to top and bottom borders
6832     pItem = m_pDoc->GetAttr(ScAddress(3, 2, destSheet), ATTR_BORDER);
6833     CPPUNIT_ASSERT_MESSAGE("D3 has a border", pItem);
6834     CPPUNIT_ASSERT_MESSAGE("D3 has no top border",
6835                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
6836     CPPUNIT_ASSERT_MESSAGE("D3 has no bottom border",
6837                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6838     CPPUNIT_ASSERT_MESSAGE("D3 has no left border",
6839                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6840     CPPUNIT_ASSERT_MESSAGE("D3 has no right border",
6841                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6842     m_pDoc->GetPattern(ScAddress(4, 2, destSheet))->GetItemSet().HasItem(ATTR_BORDER, &pItem);
6843     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
6844     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
6845     pItem = m_pDoc->GetAttr(ScAddress(4, 2, destSheet), ATTR_BORDER);
6846     CPPUNIT_ASSERT_MESSAGE("E3 has a border", pItem);
6847     CPPUNIT_ASSERT_MESSAGE("E3 has top border", static_cast<const SvxBoxItem*>(pItem)->GetTop());
6848     CPPUNIT_ASSERT_MESSAGE("E3 has bottom border",
6849                            static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6850     CPPUNIT_ASSERT_MESSAGE("E3 has no left border",
6851                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6852     CPPUNIT_ASSERT_MESSAGE("E3 has no right border",
6853                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6854     pItem = m_pDoc->GetAttr(ScAddress(5, 2, destSheet), ATTR_BORDER);
6855     CPPUNIT_ASSERT_MESSAGE("F3 has top border", !static_cast<const SvxBoxItem*>(pItem)->GetTop());
6856     CPPUNIT_ASSERT_MESSAGE("F3 has bottom border",
6857                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6858     CPPUNIT_ASSERT_MESSAGE("F3 has no left border",
6859                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6860     CPPUNIT_ASSERT_MESSAGE("F3 has no right border",
6861                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6862     pItem = m_pDoc->GetAttr(ScAddress(6, 2, destSheet), ATTR_BORDER);
6863     CPPUNIT_ASSERT_MESSAGE("G3 has a border", pItem);
6864     CPPUNIT_ASSERT_MESSAGE("G3 has no top border",
6865                            !static_cast<const SvxBoxItem*>(pItem)->GetTop());
6866     CPPUNIT_ASSERT_MESSAGE("G3 has no bottom border",
6867                            !static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6868     CPPUNIT_ASSERT_MESSAGE("G3 has no left border",
6869                            !static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6870     CPPUNIT_ASSERT_MESSAGE("G3 has no right border",
6871                            !static_cast<const SvxBoxItem*>(pItem)->GetRight());
6872     pItem = m_pDoc->GetAttr(ScAddress(5, 3, destSheet), ATTR_BORDER);
6873     CPPUNIT_ASSERT(pItem);
6874     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6875     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6876     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6877     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
6878     pItem = m_pDoc->GetAttr(ScAddress(5, 4, destSheet), ATTR_BORDER);
6879     CPPUNIT_ASSERT(pItem);
6880     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetTop());
6881     CPPUNIT_ASSERT(!static_cast<const SvxBoxItem*>(pItem)->GetBottom());
6882     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetLeft());
6883     CPPUNIT_ASSERT(static_cast<const SvxBoxItem*>(pItem)->GetRight());
6884 
6885     // check notes after transposed copy/paste
6886     // check presence of notes
6887     CPPUNIT_ASSERT_MESSAGE("C1: no note", !m_pDoc->HasNote(2, 0, destSheet));
6888     CPPUNIT_ASSERT_MESSAGE("D1: no note", !m_pDoc->HasNote(3, 0, destSheet));
6889     CPPUNIT_ASSERT_MESSAGE("E1: no note", !m_pDoc->HasNote(4, 0, destSheet));
6890     CPPUNIT_ASSERT_MESSAGE("F1: no note", !m_pDoc->HasNote(5, 0, destSheet));
6891     CPPUNIT_ASSERT_MESSAGE("G1: no note", !m_pDoc->HasNote(6, 0, destSheet));
6892     CPPUNIT_ASSERT_MESSAGE("C2: no note", !m_pDoc->HasNote(2, 1, destSheet));
6893     CPPUNIT_ASSERT_MESSAGE("D2:  a note", m_pDoc->HasNote(3, 1, destSheet));
6894     CPPUNIT_ASSERT_MESSAGE("E2:  a note", m_pDoc->HasNote(4, 1, destSheet));
6895     CPPUNIT_ASSERT_MESSAGE("F2: no note", !m_pDoc->HasNote(5, 1, destSheet));
6896     CPPUNIT_ASSERT_MESSAGE("G2: no note", !m_pDoc->HasNote(6, 1, destSheet));
6897     CPPUNIT_ASSERT_MESSAGE("C3: no note", !m_pDoc->HasNote(2, 2, destSheet));
6898     CPPUNIT_ASSERT_MESSAGE("D3:  a note", m_pDoc->HasNote(3, 2, destSheet));
6899     CPPUNIT_ASSERT_MESSAGE("E3:  a note", m_pDoc->HasNote(4, 2, destSheet));
6900     CPPUNIT_ASSERT_MESSAGE("F3: no note", !m_pDoc->HasNote(5, 2, destSheet));
6901     CPPUNIT_ASSERT_MESSAGE("G3: no note", !m_pDoc->HasNote(6, 2, destSheet));
6902     CPPUNIT_ASSERT_MESSAGE("C4: no note", !m_pDoc->HasNote(2, 3, destSheet));
6903     CPPUNIT_ASSERT_MESSAGE("D4: no note", !m_pDoc->HasNote(3, 3, destSheet));
6904     CPPUNIT_ASSERT_MESSAGE("E4:  a note", m_pDoc->HasNote(4, 3, destSheet));
6905     CPPUNIT_ASSERT_MESSAGE("F4:  a note", m_pDoc->HasNote(5, 3, destSheet));
6906     CPPUNIT_ASSERT_MESSAGE("G4: no note", !m_pDoc->HasNote(6, 3, destSheet));
6907     CPPUNIT_ASSERT_MESSAGE("C5: no note", !m_pDoc->HasNote(2, 4, destSheet));
6908     CPPUNIT_ASSERT_MESSAGE("D5:  a note", m_pDoc->HasNote(3, 4, destSheet));
6909     CPPUNIT_ASSERT_MESSAGE("E5:  a note", m_pDoc->HasNote(4, 4, destSheet));
6910     CPPUNIT_ASSERT_MESSAGE("F5: no note", !m_pDoc->HasNote(5, 4, destSheet));
6911     CPPUNIT_ASSERT_MESSAGE("G5: no note", !m_pDoc->HasNote(6, 4, destSheet));
6912     CPPUNIT_ASSERT_MESSAGE("C6: no note", !m_pDoc->HasNote(2, 5, destSheet));
6913     CPPUNIT_ASSERT_MESSAGE("D6: no note", !m_pDoc->HasNote(3, 5, destSheet));
6914     CPPUNIT_ASSERT_EQUAL(!bSkipEmpty, m_pDoc->HasNote(4, 5, destSheet));
6915     CPPUNIT_ASSERT_MESSAGE("F6: no note", !m_pDoc->HasNote(5, 5, destSheet));
6916     CPPUNIT_ASSERT_MESSAGE("G6: no note", !m_pDoc->HasNote(6, 5, destSheet));
6917     CPPUNIT_ASSERT_MESSAGE("C7: no note", !m_pDoc->HasNote(2, 6, destSheet));
6918     CPPUNIT_ASSERT_MESSAGE("D7: no note", !m_pDoc->HasNote(3, 6, destSheet));
6919     CPPUNIT_ASSERT_MESSAGE("E7: no note", !m_pDoc->HasNote(4, 6, destSheet));
6920     CPPUNIT_ASSERT_MESSAGE("F7: no note", !m_pDoc->HasNote(5, 6, destSheet));
6921     CPPUNIT_ASSERT_MESSAGE("G7: no note", !m_pDoc->HasNote(6, 6, destSheet));
6922     CPPUNIT_ASSERT_MESSAGE("C8: no note", !m_pDoc->HasNote(2, 7, destSheet));
6923     CPPUNIT_ASSERT_MESSAGE("D8: no note", !m_pDoc->HasNote(3, 7, destSheet));
6924     CPPUNIT_ASSERT_MESSAGE("E8: no note", !m_pDoc->HasNote(4, 7, destSheet));
6925     CPPUNIT_ASSERT_MESSAGE("F8: no note", !m_pDoc->HasNote(5, 7, destSheet));
6926     CPPUNIT_ASSERT_MESSAGE("G8: no note", !m_pDoc->HasNote(6, 7, destSheet));
6927 
6928     // check values of notes
6929     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D2", OUString("Note A1"), getNote(3, 1, destSheet));
6930     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E2", OUString("Note A3"), getNote(4, 1, destSheet));
6931     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D3", OUString("Note B1"), getNote(3, 2, destSheet));
6932     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E3", OUString("Note B3"), getNote(4, 2, destSheet));
6933     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E4", OUString("Note C3"), getNote(4, 3, destSheet));
6934     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D5", OUString("Note D1"), getNote(3, 4, destSheet));
6935     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell E5", OUString("Note D3"), getNote(4, 4, destSheet));
6936     if (!bSkipEmpty)
6937         CPPUNIT_ASSERT_EQUAL(OUString("Note E2"), getNote(4, 5, destSheet));
6938     CPPUNIT_ASSERT_EQUAL(OUString("Note C5"), getNote(5, 3, destSheet));
6939 
6940     // check row 16 on src sheet, refs to copied/cut range
6941     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(1, 16, srcSheet));
6942     CPPUNIT_ASSERT_EQUAL(OUString("=$C$5"), getFormula(2, 16, srcSheet));
6943     CPPUNIT_ASSERT_EQUAL(OUString("=$C5"), getFormula(3, 16, srcSheet));
6944     CPPUNIT_ASSERT_EQUAL(OUString("=C$5"), getFormula(4, 16, srcSheet));
6945     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C5:C5)"), getFormula(5, 16, srcSheet));
6946     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$5:$C$5)"), getFormula(6, 16, srcSheet));
6947     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C5:$C5)"), getFormula(7, 16, srcSheet));
6948     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C$5:C$5)"), getFormula(8, 16, srcSheet));
6949     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$6)"), getFormula(9, 16, srcSheet));
6950     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$B$10)"), getFormula(10, 16, srcSheet));
6951 
6952     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 16, srcSheet));
6953     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 16, srcSheet));
6954     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 16, srcSheet));
6955     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(4, 16, srcSheet));
6956     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 16, srcSheet));
6957     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 16, srcSheet));
6958     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 16, srcSheet));
6959     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(8, 16, srcSheet));
6960     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 16, srcSheet));
6961     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 16, srcSheet));
6962 
6963     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C5"), getFormula(1, 17, srcSheet));
6964     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aCa5"), getFormula(2, 17, srcSheet));
6965     CPPUNIT_ASSERT_EQUAL(OUString("=Range_aC5"), getFormula(3, 17, srcSheet));
6966     CPPUNIT_ASSERT_EQUAL(OUString("=Range_Ca5"), getFormula(4, 17, srcSheet));
6967     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C5_C5)"), getFormula(5, 17, srcSheet));
6968     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa5)"), getFormula(6, 17, srcSheet));
6969     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aC5_aC5)"), getFormula(7, 17, srcSheet));
6970     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_Ca5_Ca5)"), getFormula(8, 17, srcSheet));
6971     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa8)"), getFormula(9, 17, srcSheet));
6972     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_aCa5_aCa10)"), getFormula(10, 17, srcSheet));
6973 
6974     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(1, 17, srcSheet));
6975     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(2, 17, srcSheet));
6976     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(3, 17, srcSheet));
6977     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(4, 17, srcSheet));
6978     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(5, 17, srcSheet));
6979     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(6, 17, srcSheet));
6980     CPPUNIT_ASSERT_EQUAL(35.0, m_pDoc->GetValue(7, 17, srcSheet));
6981     CPPUNIT_ASSERT_EQUAL(123.0, m_pDoc->GetValue(8, 17, srcSheet));
6982     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(9, 17, srcSheet));
6983     CPPUNIT_ASSERT_EQUAL(-17.0, m_pDoc->GetValue(10, 17, srcSheet));
6984 
6985     // Existing references to the destination range must not change
6986     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D1"), getFormula(3, 101, srcSheet));
6987     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D2"), getFormula(3, 102, srcSheet));
6988     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D3"), getFormula(3, 103, srcSheet));
6989     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D4"), getFormula(3, 104, srcSheet));
6990     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D5"), getFormula(3, 105, srcSheet));
6991     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D6"), getFormula(3, 106, srcSheet));
6992     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.D7"), getFormula(3, 107, srcSheet));
6993     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E1"), getFormula(4, 101, srcSheet));
6994     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E2"), getFormula(4, 102, srcSheet));
6995     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E3"), getFormula(4, 103, srcSheet));
6996     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E4"), getFormula(4, 104, srcSheet));
6997     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E5"), getFormula(4, 105, srcSheet));
6998     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E6"), getFormula(4, 106, srcSheet));
6999     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.E7"), getFormula(4, 107, srcSheet));
7000     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F1"), getFormula(5, 101, srcSheet));
7001     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F2"), getFormula(5, 102, srcSheet));
7002     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F3"), getFormula(5, 103, srcSheet));
7003     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F4"), getFormula(5, 104, srcSheet));
7004     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F5"), getFormula(5, 105, srcSheet));
7005     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F6"), getFormula(5, 106, srcSheet));
7006     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.F7"), getFormula(5, 107, srcSheet));
7007     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G1"), getFormula(6, 101, srcSheet));
7008     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G2"), getFormula(6, 102, srcSheet));
7009     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G3"), getFormula(6, 103, srcSheet));
7010     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G4"), getFormula(6, 104, srcSheet));
7011     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G5"), getFormula(6, 105, srcSheet));
7012     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G6"), getFormula(6, 106, srcSheet));
7013     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.G7"), getFormula(6, 107, srcSheet));
7014     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H1"), getFormula(7, 101, srcSheet));
7015     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H2"), getFormula(7, 102, srcSheet));
7016     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H3"), getFormula(7, 103, srcSheet));
7017     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H4"), getFormula(7, 104, srcSheet));
7018     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H5"), getFormula(7, 105, srcSheet));
7019     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H6"), getFormula(7, 106, srcSheet));
7020     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.H7"), getFormula(7, 107, srcSheet));
7021     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I1"), getFormula(8, 101, srcSheet));
7022     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I2"), getFormula(8, 102, srcSheet));
7023     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I3"), getFormula(8, 103, srcSheet));
7024     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I4"), getFormula(8, 104, srcSheet));
7025     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I5"), getFormula(8, 105, srcSheet));
7026     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I6"), getFormula(8, 106, srcSheet));
7027     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.I7"), getFormula(8, 107, srcSheet));
7028     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J1"), getFormula(9, 101, srcSheet));
7029     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J2"), getFormula(9, 102, srcSheet));
7030     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J3"), getFormula(9, 103, srcSheet));
7031     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J4"), getFormula(9, 104, srcSheet));
7032     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J5"), getFormula(9, 105, srcSheet));
7033     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J6"), getFormula(9, 106, srcSheet));
7034     CPPUNIT_ASSERT_EQUAL(OUString("=DestSheet.J7"), getFormula(9, 107, srcSheet));
7035 
7036     m_pDoc->DeleteTab(destSheet);
7037     m_pDoc->DeleteTab(srcSheet);
7038 }
7039 
testTdf142201Row()7040 void TestCopyPaste::testTdf142201Row()
7041 {
7042     const SCTAB nTab = 0;
7043     m_pDoc->InsertTab(nTab, "Test");
7044 
7045     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
7046     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
7047     m_pDoc->SetValue(1, 0, nTab, 11.0); // B1
7048     m_pDoc->SetValue(1, 1, nTab, 12.0); // B2
7049 
7050     m_pDoc->SetString(0, 3, nTab, "=A1"); // A4
7051     m_pDoc->SetString(0, 4, nTab, "=A2"); // A5
7052     m_pDoc->SetString(1, 3, nTab, "=B1"); // B4
7053     m_pDoc->SetString(1, 4, nTab, "=B2"); // B5
7054 
7055     // Check precondition
7056     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
7057     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
7058     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
7059     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
7060 
7061     ScRange aReferencesRange(0, 3, nTab, 1, 4, nTab);
7062     printRange(m_pDoc, ScRange(0, 0, nTab, 1, 1, nTab), "Source");
7063     printRange(m_pDoc, aReferencesRange, "References");
7064     printFormula(m_pDoc, 0, 3, nTab);
7065     printFormula(m_pDoc, 0, 4, nTab);
7066     printFormula(m_pDoc, 1, 3, nTab);
7067     printFormula(m_pDoc, 1, 4, nTab);
7068 
7069     // Cut A1:A2 to the clip document.
7070     ScDocument aClipDoc(SCDOCMODE_CLIP);
7071     ScRange aSrcRange(0, 0, nTab, 0, 1, nTab);
7072     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
7073 
7074     // To B7:C7
7075     ScRange aDestRange(1, 6, nTab, 2, 6, nTab);
7076     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
7077 
7078     // Transpose
7079     ScDocument* pOrigClipDoc = &aClipDoc;
7080     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
7081     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
7082     aDestMark.SetMarkArea(aDestRange);
7083     // Paste
7084     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
7085                          true, false, true, false);
7086     printRange(m_pDoc, aReferencesRange, "References after cut");
7087     printFormula(m_pDoc, 0, 3, nTab);
7088     printFormula(m_pDoc, 0, 4, nTab);
7089     printFormula(m_pDoc, 1, 3, nTab);
7090     printFormula(m_pDoc, 1, 4, nTab);
7091     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
7092     pTransClip.reset();
7093 
7094     printRange(m_pDoc, aReferencesRange, "References after cut transposed");
7095     printFormula(m_pDoc, 0, 3, nTab);
7096     printFormula(m_pDoc, 0, 4, nTab);
7097     printFormula(m_pDoc, 1, 3, nTab);
7098     printFormula(m_pDoc, 1, 4, nTab);
7099 
7100     // Check results
7101     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
7102     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
7103     // Without the fix in place, this would have failed with
7104     // - Expected: 11
7105     // - Actual  : 2
7106     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
7107     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
7108 
7109     CPPUNIT_ASSERT_EQUAL(OUString("=B7"), getFormula(0, 3, nTab));
7110     CPPUNIT_ASSERT_EQUAL(OUString("=C7"), getFormula(0, 4, nTab));
7111     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(1, 3, nTab));
7112     CPPUNIT_ASSERT_EQUAL(OUString("=B2"), getFormula(1, 4, nTab));
7113 }
7114 
testTdf142201ColRel()7115 void TestCopyPaste::testTdf142201ColRel()
7116 {
7117     const SCTAB nTab = 0;
7118     m_pDoc->InsertTab(nTab, "Test");
7119 
7120     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
7121     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
7122     m_pDoc->SetValue(1, 0, nTab, 11.0); // B1
7123     m_pDoc->SetValue(1, 1, nTab, 12.0); // B2
7124 
7125     m_pDoc->SetString(0, 3, nTab, "=A1"); // A4
7126     m_pDoc->SetString(0, 4, nTab, "=A2"); // A5
7127     m_pDoc->SetString(1, 3, nTab, "=B1"); // B4
7128     m_pDoc->SetString(1, 4, nTab, "=B2"); // B5
7129 
7130     // Check precondition
7131     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
7132     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
7133     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
7134     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
7135 
7136     ScRange aReferencesRange(0, 3, nTab, 1, 4, nTab);
7137     printRange(m_pDoc, ScRange(0, 0, nTab, 1, 1, nTab), "Source");
7138     printRange(m_pDoc, aReferencesRange, "References");
7139     printFormula(m_pDoc, 0, 3, nTab);
7140     printFormula(m_pDoc, 0, 4, nTab);
7141     printFormula(m_pDoc, 1, 3, nTab);
7142     printFormula(m_pDoc, 1, 4, nTab);
7143 
7144     // Cut values A1:B1 to the clip document.
7145     ScDocument aClipDoc(SCDOCMODE_CLIP);
7146     ScRange aSrcRange(0, 0, nTab, 1, 0, nTab);
7147     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
7148 
7149     // To B7:B8
7150     ScRange aDestRange(1, 6, nTab, 1, 7, nTab);
7151     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
7152 
7153     // Transpose
7154     ScDocument* pOrigClipDoc = &aClipDoc;
7155     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
7156     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
7157     aDestMark.SetMarkArea(aDestRange);
7158     // Paste
7159     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
7160                          true, false, true, false);
7161     printRange(m_pDoc, aReferencesRange, "References after paste");
7162     printFormula(m_pDoc, 0, 3, nTab);
7163     printFormula(m_pDoc, 0, 4, nTab);
7164     printFormula(m_pDoc, 1, 3, nTab);
7165     printFormula(m_pDoc, 1, 4, nTab);
7166     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
7167     pTransClip.reset();
7168 
7169     printRange(m_pDoc, aReferencesRange, "References after paste transposed");
7170     printFormula(m_pDoc, 0, 3, nTab);
7171     printFormula(m_pDoc, 0, 4, nTab);
7172     printFormula(m_pDoc, 1, 3, nTab);
7173     printFormula(m_pDoc, 1, 4, nTab);
7174 
7175     // Check results
7176     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
7177     // Without the fix in place, this would have failed with
7178     // - Expected: 2
7179     // - Actual  : 11
7180     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
7181     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
7182     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
7183 
7184     CPPUNIT_ASSERT_EQUAL(OUString("=B7"), getFormula(0, 3, nTab));
7185     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(0, 4, nTab));
7186     CPPUNIT_ASSERT_EQUAL(OUString("=B8"), getFormula(1, 3, nTab));
7187     CPPUNIT_ASSERT_EQUAL(OUString("=B2"), getFormula(1, 4, nTab));
7188 }
7189 
testTdf142201ColAbs()7190 void TestCopyPaste::testTdf142201ColAbs()
7191 {
7192     const SCTAB nTab = 0;
7193     m_pDoc->InsertTab(nTab, "Test");
7194 
7195     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
7196     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
7197     m_pDoc->SetValue(1, 0, nTab, 11.0); // B1
7198     m_pDoc->SetValue(1, 1, nTab, 12.0); // B2
7199 
7200     m_pDoc->SetString(0, 3, nTab, "=$A$1"); // A4
7201     m_pDoc->SetString(0, 4, nTab, "=$A$2"); // A5
7202     m_pDoc->SetString(1, 3, nTab, "=$B$1"); // B4
7203     m_pDoc->SetString(1, 4, nTab, "=$B$2"); // B5
7204 
7205     // Check precondition
7206     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
7207     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
7208     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
7209     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
7210 
7211     ScRange aReferencesRange(0, 3, nTab, 1, 4, nTab);
7212     printRange(m_pDoc, ScRange(0, 0, nTab, 1, 1, nTab), "Source");
7213     printRange(m_pDoc, aReferencesRange, "References");
7214     printFormula(m_pDoc, 0, 3, nTab);
7215     printFormula(m_pDoc, 0, 4, nTab);
7216     printFormula(m_pDoc, 1, 3, nTab);
7217     printFormula(m_pDoc, 1, 4, nTab);
7218 
7219     // Cut values A1:B1 to the clip document.
7220     ScDocument aClipDoc(SCDOCMODE_CLIP);
7221     ScRange aSrcRange(0, 0, nTab, 1, 0, nTab);
7222     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
7223 
7224     // To B7:B8
7225     ScRange aDestRange(1, 6, nTab, 1, 7, nTab);
7226     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
7227 
7228     // Transpose
7229     ScDocument* pOrigClipDoc = &aClipDoc;
7230     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
7231     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
7232     aDestMark.SetMarkArea(aDestRange);
7233     // Paste
7234     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
7235                          true, false, true, false);
7236     printRange(m_pDoc, aReferencesRange, "References after paste");
7237     printFormula(m_pDoc, 0, 3, nTab);
7238     printFormula(m_pDoc, 0, 4, nTab);
7239     printFormula(m_pDoc, 1, 3, nTab);
7240     printFormula(m_pDoc, 1, 4, nTab);
7241     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
7242     pTransClip.reset();
7243 
7244     printRange(m_pDoc, aReferencesRange, "References after paste transposed");
7245     printFormula(m_pDoc, 0, 3, nTab);
7246     printFormula(m_pDoc, 0, 4, nTab);
7247     printFormula(m_pDoc, 1, 3, nTab);
7248     printFormula(m_pDoc, 1, 4, nTab);
7249 
7250     // Check results
7251     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
7252     // Without the fix in place, this would have failed with
7253     // - Expected: 2
7254     // - Actual  : 11
7255     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
7256     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
7257     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
7258 
7259     CPPUNIT_ASSERT_EQUAL(OUString("=$B$7"), getFormula(0, 3, nTab));
7260     CPPUNIT_ASSERT_EQUAL(OUString("=$A$2"), getFormula(0, 4, nTab));
7261     CPPUNIT_ASSERT_EQUAL(OUString("=$B$8"), getFormula(1, 3, nTab));
7262     CPPUNIT_ASSERT_EQUAL(OUString("=$B$2"), getFormula(1, 4, nTab));
7263 }
7264 
checkReferencedCutRangesRowIntitial(const SCTAB nSrcTab,const OUString & rDesc)7265 void TestCopyPaste::checkReferencedCutRangesRowIntitial(const SCTAB nSrcTab, const OUString& rDesc)
7266 {
7267     printRange(m_pDoc, ScRange(1, 1, nSrcTab, 3, 2, nSrcTab), rDesc.toUtf8() + ": Source");
7268     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(1, 1, nSrcTab));
7269     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(2, 1, nSrcTab));
7270     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(3, 1, nSrcTab));
7271     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 2, nSrcTab));
7272     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 2, nSrcTab));
7273     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(3, 2, nSrcTab));
7274 
7275     // Guards
7276     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(0, 0, nSrcTab)); // A1
7277     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 0, nSrcTab)); // B1
7278     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(2, 0, nSrcTab)); // C1
7279     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(3, 0, nSrcTab)); // D1
7280     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(4, 0, nSrcTab)); // E1
7281     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(0, 1, nSrcTab)); // A2
7282     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(4, 1, nSrcTab)); // E2
7283     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(0, 2, nSrcTab)); // A3
7284     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(4, 2, nSrcTab)); // E3
7285     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(0, 3, nSrcTab)); // A4
7286     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(1, 3, nSrcTab)); // B4
7287     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(2, 3, nSrcTab)); // C4
7288     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(3, 3, nSrcTab)); // D4
7289     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(4, 3, nSrcTab)); // E4
7290     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(20, 0, nSrcTab)); // U1
7291     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(21, 0, nSrcTab)); // V1
7292     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(22, 0, nSrcTab)); // W1
7293     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(23, 0, nSrcTab)); // X1
7294     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(24, 0, nSrcTab)); // Y1
7295     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(20, 1, nSrcTab)); // U2
7296     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(24, 1, nSrcTab)); // Y2
7297     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(20, 2, nSrcTab)); // U3
7298     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(24, 2, nSrcTab)); // Y3
7299     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(20, 3, nSrcTab)); // U4
7300     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(21, 3, nSrcTab)); // B4
7301     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(22, 3, nSrcTab)); // W4
7302     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(23, 3, nSrcTab)); // X4
7303     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(24, 3, nSrcTab)); // Y4
7304     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(20, 0, nSrcTab)); // U1
7305     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(21, 0, nSrcTab)); // V1
7306     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(22, 0, nSrcTab)); // W1
7307     CPPUNIT_ASSERT_EQUAL(OUString("=D1"), getFormula(23, 0, nSrcTab)); // X1
7308     CPPUNIT_ASSERT_EQUAL(OUString("=E1"), getFormula(24, 0, nSrcTab)); // Y1
7309     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(20, 1, nSrcTab)); // U2
7310     CPPUNIT_ASSERT_EQUAL(OUString("=E2"), getFormula(24, 1, nSrcTab)); // Y2
7311     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(20, 2, nSrcTab)); // U3
7312     CPPUNIT_ASSERT_EQUAL(OUString("=E3"), getFormula(24, 2, nSrcTab)); // Y3
7313     CPPUNIT_ASSERT_EQUAL(OUString("=A4"), getFormula(20, 3, nSrcTab)); // U4
7314     CPPUNIT_ASSERT_EQUAL(OUString("=B4"), getFormula(21, 3, nSrcTab)); // B4
7315     CPPUNIT_ASSERT_EQUAL(OUString("=C4"), getFormula(22, 3, nSrcTab)); // W4
7316     CPPUNIT_ASSERT_EQUAL(OUString("=D4"), getFormula(23, 3, nSrcTab)); // X4
7317     CPPUNIT_ASSERT_EQUAL(OUString("=E4"), getFormula(24, 3, nSrcTab)); // Y4
7318 
7319     for (int i = 10; i < 20; ++i)
7320         for (int j = 0; j < 10; ++j)
7321         {
7322             CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(j, i, nSrcTab));
7323             CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(j, i, nSrcTab));
7324         }
7325 
7326     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 20, nSrcTab, 2, 21, nSrcTab),
7327                                       rDesc.toUtf8() + ": Relative references");
7328     CPPUNIT_ASSERT_EQUAL(OUString("=B2"), getFormula(0, 20, nSrcTab)); // A21
7329     CPPUNIT_ASSERT_EQUAL(OUString("=C2"), getFormula(1, 20, nSrcTab)); // B21
7330     CPPUNIT_ASSERT_EQUAL(OUString("=D2"), getFormula(2, 20, nSrcTab)); // C21
7331     CPPUNIT_ASSERT_EQUAL(OUString("=B3"), getFormula(0, 21, nSrcTab)); // A22
7332     CPPUNIT_ASSERT_EQUAL(OUString("=C3"), getFormula(1, 21, nSrcTab)); // B22
7333     CPPUNIT_ASSERT_EQUAL(OUString("=D3"), getFormula(2, 21, nSrcTab)); // C22
7334     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 20, nSrcTab));
7335     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 20, nSrcTab));
7336     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 20, nSrcTab));
7337     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 21, nSrcTab));
7338     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 21, nSrcTab));
7339     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 21, nSrcTab));
7340 
7341     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 30, nSrcTab, 2, 31, nSrcTab),
7342                                       rDesc.toUtf8() + ": Absolute references");
7343     CPPUNIT_ASSERT_EQUAL(OUString("=$B$2"), getFormula(0, 30, nSrcTab)); // A31
7344     CPPUNIT_ASSERT_EQUAL(OUString("=$C$2"), getFormula(1, 30, nSrcTab)); // B31
7345     CPPUNIT_ASSERT_EQUAL(OUString("=$D$2"), getFormula(2, 30, nSrcTab)); // C31
7346     CPPUNIT_ASSERT_EQUAL(OUString("=$B$3"), getFormula(0, 31, nSrcTab)); // A32
7347     CPPUNIT_ASSERT_EQUAL(OUString("=$C$3"), getFormula(1, 31, nSrcTab)); // B32
7348     CPPUNIT_ASSERT_EQUAL(OUString("=$D$3"), getFormula(2, 31, nSrcTab)); // C32
7349     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 30, nSrcTab));
7350     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 30, nSrcTab));
7351     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 30, nSrcTab));
7352     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 31, nSrcTab));
7353     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 31, nSrcTab));
7354     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 31, nSrcTab));
7355 
7356     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2"), getRangeByName("Range_B2"));
7357     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2"), getRangeByName("Range_C2"));
7358     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$D$2"), getRangeByName("Range_D2"));
7359     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3"), getRangeByName("Range_B3"));
7360     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$3"), getRangeByName("Range_C3"));
7361     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$D$3"), getRangeByName("Range_D3"));
7362     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$D$2"), getRangeByName("Range_B2_D2"));
7363     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3:$D$3"), getRangeByName("Range_B3_D3"));
7364     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$D$3"), getRangeByName("Range_B2_D3"));
7365     CPPUNIT_ASSERT_EQUAL(OUString("B2"), getRangeByName("RelRange_Cm20_R0"));
7366 
7367     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 40, nSrcTab, 2, 41, nSrcTab),
7368                                       rDesc.toUtf8() + ": Absolute ranges");
7369     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B2"), getFormula(0, 40, nSrcTab)); // A41
7370     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C2"), getFormula(1, 40, nSrcTab)); // B41
7371     CPPUNIT_ASSERT_EQUAL(OUString("=Range_D2"), getFormula(2, 40, nSrcTab)); // C41
7372     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B3"), getFormula(0, 41, nSrcTab)); // A42
7373     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C3"), getFormula(1, 41, nSrcTab)); // B42
7374     CPPUNIT_ASSERT_EQUAL(OUString("=Range_D3"), getFormula(2, 41, nSrcTab)); // C42
7375     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 40, nSrcTab));
7376     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 40, nSrcTab));
7377     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 40, nSrcTab));
7378     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 41, nSrcTab));
7379     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 41, nSrcTab));
7380     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 41, nSrcTab));
7381 
7382     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 50, nSrcTab, 2, 51, nSrcTab),
7383                                       rDesc.toUtf8() + ": Relative ranges");
7384     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 50, nSrcTab)); // A51
7385     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 50, nSrcTab)); // B51
7386     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(2, 50, nSrcTab)); // C51
7387     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 51, nSrcTab)); // A52
7388     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 51, nSrcTab)); // B52
7389     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(2, 51, nSrcTab)); // C52
7390     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 50, nSrcTab));
7391     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 50, nSrcTab));
7392     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 50, nSrcTab));
7393     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 51, nSrcTab));
7394     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 51, nSrcTab));
7395     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 51, nSrcTab));
7396 
7397     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 60, nSrcTab, 2, 61, nSrcTab),
7398                                       rDesc.toUtf8() + ": Relative sum");
7399     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B2:D2)"), getFormula(0, 60, nSrcTab)); // A61
7400     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B2:D2)"), getFormula(1, 60, nSrcTab)); // B61
7401     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B2:D2)"), getFormula(2, 60, nSrcTab)); // C61
7402     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(0, 61, nSrcTab)); // A62
7403     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(1, 61, nSrcTab)); // B62
7404     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(2, 61, nSrcTab)); // C62
7405     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 60, nSrcTab));
7406     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 60, nSrcTab));
7407     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 60, nSrcTab));
7408     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 61, nSrcTab));
7409     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 61, nSrcTab));
7410     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 61, nSrcTab));
7411 
7412     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 70, nSrcTab, 2, 71, nSrcTab),
7413                                       rDesc.toUtf8() + ": Absolute sum");
7414     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$2)"), getFormula(0, 70, nSrcTab)); // A71
7415     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$2)"), getFormula(1, 70, nSrcTab)); // B71
7416     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$2)"), getFormula(2, 70, nSrcTab)); // C71
7417     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(0, 71, nSrcTab)); // A72
7418     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(1, 71, nSrcTab)); // B72
7419     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(2, 71, nSrcTab)); // C72
7420     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 70, nSrcTab));
7421     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 70, nSrcTab));
7422     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 70, nSrcTab));
7423     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 71, nSrcTab));
7424     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 71, nSrcTab));
7425     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 71, nSrcTab));
7426 
7427     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 80, nSrcTab, 2, 81, nSrcTab),
7428                                       rDesc.toUtf8() + ": Relative range sum");
7429     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(0, 80, nSrcTab)); // A81
7430     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(1, 80, nSrcTab)); // B81
7431     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(2, 80, nSrcTab)); // C81
7432     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(0, 81, nSrcTab)); // A82
7433     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(1, 81, nSrcTab)); // B82
7434     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(2, 81, nSrcTab)); // C82
7435     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 80, nSrcTab));
7436     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 80, nSrcTab));
7437     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 80, nSrcTab));
7438     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 81, nSrcTab));
7439     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 81, nSrcTab));
7440     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 81, nSrcTab));
7441 
7442     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 90, nSrcTab, 2, 91, nSrcTab),
7443                                       rDesc.toUtf8() + ": Absolute sum");
7444     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(0, 90, nSrcTab)); // A91
7445     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(1, 90, nSrcTab)); // B91
7446     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(2, 90, nSrcTab)); // C91
7447     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(0, 91, nSrcTab)); // A92
7448     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(1, 91, nSrcTab)); // B92
7449     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(2, 91, nSrcTab)); // C92
7450     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 90, nSrcTab));
7451     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 90, nSrcTab));
7452     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(2, 90, nSrcTab));
7453     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 91, nSrcTab));
7454     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 91, nSrcTab));
7455     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(2, 91, nSrcTab));
7456 
7457     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 100, nSrcTab, 2, 101, nSrcTab),
7458                                       rDesc.toUtf8() + ": Relative range sum");
7459     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(0, 100, nSrcTab)); // A101
7460     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(1, 100, nSrcTab)); // B101
7461     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(2, 100, nSrcTab)); // C101
7462     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(0, 101, nSrcTab)); // A102
7463     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(1, 101, nSrcTab)); // B102
7464     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(2, 101, nSrcTab)); // C102
7465     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 100, nSrcTab));
7466     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 100, nSrcTab));
7467     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(2, 100, nSrcTab));
7468     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 101, nSrcTab));
7469     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 101, nSrcTab));
7470     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(2, 101, nSrcTab));
7471 }
7472 
executeReferencedCutRangesRow(const bool bTransposed,const SCTAB nSrcTab,const SCTAB nDestTab,const bool bUndo,std::unique_ptr<ScUndoCut> & pUndoCut,std::unique_ptr<ScUndoPaste> & pUndoPaste)7473 void TestCopyPaste::executeReferencedCutRangesRow(const bool bTransposed, const SCTAB nSrcTab,
7474                                                   const SCTAB nDestTab, const bool bUndo,
7475                                                   std::unique_ptr<ScUndoCut>& pUndoCut,
7476                                                   std::unique_ptr<ScUndoPaste>& pUndoPaste)
7477 {
7478     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
7479 
7480     for (int i = 0; i < nSrcTab; ++i)
7481         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
7482     m_pDoc->InsertTab(nSrcTab, "Test");
7483 
7484     m_pDoc->SetValue(1, 1, nSrcTab, 01.0); // B2  \.
7485     m_pDoc->SetValue(2, 1, nSrcTab, 11.0); // C2   | cut
7486     m_pDoc->SetValue(3, 1, nSrcTab, 21.0); // D2  /
7487     m_pDoc->SetValue(1, 2, nSrcTab, 02.0); // B3
7488     m_pDoc->SetValue(2, 2, nSrcTab, 12.0); // C3
7489     m_pDoc->SetValue(3, 2, nSrcTab, 22.0); // D3
7490     printRange(m_pDoc, ScRange(1, 1, nSrcTab, 3, 2, nSrcTab), "Source");
7491 
7492     // Guard values
7493     m_pDoc->SetValue(0, 0, nSrcTab, 1000.0); // A1
7494     m_pDoc->SetValue(1, 0, nSrcTab, 1001.0); // B1
7495     m_pDoc->SetValue(2, 0, nSrcTab, 1002.0); // C1
7496     m_pDoc->SetValue(3, 0, nSrcTab, 1003.0); // D1
7497     m_pDoc->SetValue(4, 0, nSrcTab, 1004.0); // E1
7498     m_pDoc->SetValue(0, 1, nSrcTab, 1010.0); // A2
7499     m_pDoc->SetValue(4, 1, nSrcTab, 1014.0); // E2
7500     m_pDoc->SetValue(0, 2, nSrcTab, 1020.0); // A3
7501     m_pDoc->SetValue(4, 2, nSrcTab, 1024.0); // E3
7502     m_pDoc->SetValue(0, 3, nSrcTab, 1030.0); // A4
7503     m_pDoc->SetValue(1, 3, nSrcTab, 1031.0); // B4
7504     m_pDoc->SetValue(2, 3, nSrcTab, 1032.0); // C4
7505     m_pDoc->SetValue(3, 3, nSrcTab, 1033.0); // D4
7506     m_pDoc->SetValue(4, 3, nSrcTab, 1034.0); // E4
7507 
7508     m_pDoc->SetString(20, 0, nSrcTab, "=A1"); // U1
7509     m_pDoc->SetString(21, 0, nSrcTab, "=B1"); // V1
7510     m_pDoc->SetString(22, 0, nSrcTab, "=C1"); // W1
7511     m_pDoc->SetString(23, 0, nSrcTab, "=D1"); // X1
7512     m_pDoc->SetString(24, 0, nSrcTab, "=E1"); // Y1
7513     m_pDoc->SetString(20, 1, nSrcTab, "=A2"); // U2
7514     m_pDoc->SetString(24, 1, nSrcTab, "=E2"); // Y2
7515     m_pDoc->SetString(20, 2, nSrcTab, "=A3"); // U3
7516     m_pDoc->SetString(24, 2, nSrcTab, "=E3"); // Y3
7517     m_pDoc->SetString(20, 3, nSrcTab, "=A4"); // U4
7518     m_pDoc->SetString(21, 3, nSrcTab, "=B4"); // B4
7519     m_pDoc->SetString(22, 3, nSrcTab, "=C4"); // W4
7520     m_pDoc->SetString(23, 3, nSrcTab, "=D4"); // X4
7521     m_pDoc->SetString(24, 3, nSrcTab, "=E4"); // Y4
7522 
7523     // Cell position is used for ranges relative to current position
7524     ScAddress cellA1(0, 0, nSrcTab);
7525     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B2", cellA1, "$Test.$B$2"));
7526     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C2", cellA1, "$Test.$C$2"));
7527     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_D2", cellA1, "$Test.$D$2"));
7528     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B3", cellA1, "$Test.$B$3"));
7529     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C3", cellA1, "$Test.$C$3"));
7530     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_D3", cellA1, "$Test.$D$3"));
7531     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B2_D2", cellA1, "$Test.$B$2:$D$2"));
7532     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B3_D3", cellA1, "$Test.$B$3:$D$3"));
7533     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B2_D3", cellA1, "$Test.$B$2:$D$3"));
7534     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("RelRange_Cm20_R0", ScAddress(1, 21, nSrcTab), "B2"));
7535 
7536     m_pDoc->SetString(0, 20, nSrcTab, "=B2"); // A21
7537     m_pDoc->SetString(1, 20, nSrcTab, "=C2"); // B21
7538     m_pDoc->SetString(2, 20, nSrcTab, "=D2"); // C21
7539     m_pDoc->SetString(0, 21, nSrcTab, "=B3"); // A22
7540     m_pDoc->SetString(1, 21, nSrcTab, "=C3"); // B22
7541     m_pDoc->SetString(2, 21, nSrcTab, "=D3"); // C22
7542 
7543     m_pDoc->SetString(0, 30, nSrcTab, "=$B$2"); // A31
7544     m_pDoc->SetString(1, 30, nSrcTab, "=$C$2"); // B31
7545     m_pDoc->SetString(2, 30, nSrcTab, "=$D$2"); // C31
7546     m_pDoc->SetString(0, 31, nSrcTab, "=$B$3"); // A32
7547     m_pDoc->SetString(1, 31, nSrcTab, "=$C$3"); // B32
7548     m_pDoc->SetString(2, 31, nSrcTab, "=$D$3"); // C32
7549 
7550     m_pDoc->SetString(0, 40, nSrcTab, "=Range_B2"); // A41
7551     m_pDoc->SetString(1, 40, nSrcTab, "=Range_C2"); // B41
7552     m_pDoc->SetString(2, 40, nSrcTab, "=Range_D2"); // C41
7553     m_pDoc->SetString(0, 41, nSrcTab, "=Range_B3"); // A42
7554     m_pDoc->SetString(1, 41, nSrcTab, "=Range_C3"); // B42
7555     m_pDoc->SetString(2, 41, nSrcTab, "=Range_D3"); // C42
7556 
7557     m_pDoc->SetString(0, 50, nSrcTab, "=RelRange_Cm20_R0"); // A51
7558     m_pDoc->SetString(1, 50, nSrcTab, "=RelRange_Cm20_R0"); // B51
7559     m_pDoc->SetString(2, 50, nSrcTab, "=RelRange_Cm20_R0"); // C51
7560     m_pDoc->SetString(0, 51, nSrcTab, "=RelRange_Cm20_R0"); // A52
7561     m_pDoc->SetString(1, 51, nSrcTab, "=RelRange_Cm20_R0"); // B52
7562     m_pDoc->SetString(2, 51, nSrcTab, "=RelRange_Cm20_R0"); // C52
7563 
7564     m_pDoc->SetString(0, 60, nSrcTab, "=SUM(B2:D2)"); // A61
7565     m_pDoc->SetString(1, 60, nSrcTab, "=SUM(B2:D2)"); // B61
7566     m_pDoc->SetString(2, 60, nSrcTab, "=SUM(B2:D2)"); // C61
7567     m_pDoc->SetString(0, 61, nSrcTab, "=SUM(B3:D3)"); // A62
7568     m_pDoc->SetString(1, 61, nSrcTab, "=SUM(B3:D3)"); // B62
7569     m_pDoc->SetString(2, 61, nSrcTab, "=SUM(B3:D3)"); // C62
7570 
7571     m_pDoc->SetString(0, 70, nSrcTab, "=SUM($B$2:$D$2)"); // A71
7572     m_pDoc->SetString(1, 70, nSrcTab, "=SUM($B$2:$D$2)"); // B71
7573     m_pDoc->SetString(2, 70, nSrcTab, "=SUM($B$2:$D$2)"); // C71
7574     m_pDoc->SetString(0, 71, nSrcTab, "=SUM($B$3:$D$3)"); // A72
7575     m_pDoc->SetString(1, 71, nSrcTab, "=SUM($B$3:$D$3)"); // B72
7576     m_pDoc->SetString(2, 71, nSrcTab, "=SUM($B$3:$D$3)"); // C72
7577 
7578     m_pDoc->SetString(0, 80, nSrcTab, "=SUM(Range_B2_D2)"); // A81
7579     m_pDoc->SetString(1, 80, nSrcTab, "=SUM(Range_B2_D2)"); // B81
7580     m_pDoc->SetString(2, 80, nSrcTab, "=SUM(Range_B2_D2)"); // C81
7581     m_pDoc->SetString(0, 81, nSrcTab, "=SUM(Range_B3_D3)"); // A82
7582     m_pDoc->SetString(1, 81, nSrcTab, "=SUM(Range_B3_D3)"); // B82
7583     m_pDoc->SetString(2, 81, nSrcTab, "=SUM(Range_B3_D3)"); // C82
7584 
7585     m_pDoc->SetString(0, 90, nSrcTab, "=SUM($B$2:$D$3)"); // A91
7586     m_pDoc->SetString(1, 90, nSrcTab, "=SUM($B$2:$D$3)"); // B91
7587     m_pDoc->SetString(2, 90, nSrcTab, "=SUM($B$2:$D$3)"); // C91
7588     m_pDoc->SetString(0, 91, nSrcTab, "=SUM($B$2:$D$3)"); // A92
7589     m_pDoc->SetString(1, 91, nSrcTab, "=SUM($B$2:$D$3)"); // B92
7590     m_pDoc->SetString(2, 91, nSrcTab, "=SUM($B$2:$D$3)"); // C92
7591 
7592     m_pDoc->SetString(0, 100, nSrcTab, "=SUM(Range_B2_D3)"); // A101
7593     m_pDoc->SetString(1, 100, nSrcTab, "=SUM(Range_B2_D3)"); // B101
7594     m_pDoc->SetString(2, 100, nSrcTab, "=SUM(Range_B2_D3)"); // C101
7595     m_pDoc->SetString(0, 101, nSrcTab, "=SUM(Range_B2_D3)"); // A102
7596     m_pDoc->SetString(1, 101, nSrcTab, "=SUM(Range_B2_D3)"); // B102
7597     m_pDoc->SetString(2, 101, nSrcTab, "=SUM(Range_B2_D3)"); // C102
7598 
7599     // Check precondition
7600     checkReferencedCutRangesRowIntitial(nSrcTab, "Initial");
7601 
7602     // Cut values B2:D2 to the clip document.
7603     ScDocument aClipDoc(SCDOCMODE_CLIP);
7604     ScRange aSrcRange(1, 1, nSrcTab, 3, 1, nSrcTab);
7605     ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
7606     aSrcMark.SetMarkArea(aSrcRange);
7607 
7608     pUndoCut.reset(cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, bUndo));
7609 
7610     for (int i = nSrcTab + 1; i < nDestTab; ++i)
7611         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
7612 
7613     if (nSrcTab < nDestTab)
7614         m_pDoc->InsertTab(nDestTab, "Dest");
7615     else if (nSrcTab > nDestTab)
7616         m_pDoc->RenameTab(nDestTab, "Dest");
7617 
7618     int nTabCount = m_pDoc->GetTableCount();
7619     for (int i = nTabCount; i < nTabCount + 2; ++i)
7620         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
7621     nTabCount = m_pDoc->GetTableCount();
7622 
7623     InsertDeleteFlags aFlags(InsertDeleteFlags::ALL);
7624 
7625     ScDocumentUniquePtr pPasteUndoDoc;
7626     std::unique_ptr<ScDocument> pPasteRefUndoDoc;
7627     std::unique_ptr<ScRefUndoData> pUndoData;
7628 
7629     ScRange aDestRange;
7630     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
7631 
7632     if (bTransposed)
7633     {
7634         // To C12:C14
7635         aDestRange = ScRange(2, 11, nDestTab, 2, 13, nDestTab);
7636         aDestMark.SetMarkArea(aDestRange);
7637 
7638         if (bUndo)
7639             prepareUndoBeforePaste(true, pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange,
7640                                    pUndoData);
7641 
7642         // Transpose
7643         ScDocument* pOrigClipDoc = &aClipDoc;
7644         ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
7645         aClipDoc.TransposeClip(pTransClip.get(), aFlags, false, true);
7646         // Paste
7647         m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, pPasteRefUndoDoc.get(),
7648                              pTransClip.get(), true, false, true, false);
7649         lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 20, nSrcTab, 2, 21, nSrcTab),
7650                                           "Relative references after copy");
7651 
7652         m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, pPasteRefUndoDoc.get());
7653         lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 20, nSrcTab, 2, 21, nSrcTab),
7654                                           "Relative references after UpdateTranspose");
7655         pTransClip.reset();
7656     }
7657     else
7658     {
7659         // To C12:E12
7660         aDestRange = ScRange(2, 11, nDestTab, 4, 11, nDestTab);
7661 
7662         aDestMark.SetMarkArea(aDestRange);
7663 
7664         if (bUndo)
7665             prepareUndoBeforePaste(true, pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange,
7666                                    pUndoData);
7667 
7668         m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, pPasteRefUndoDoc.get(), &aClipDoc, true,
7669                              false, false, false);
7670     }
7671 
7672     if (bUndo)
7673         prepareUndoAfterPaste(pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange, pUndoData,
7674                               pUndoPaste, bTransposed);
7675 }
7676 
checkReferencedCutRangesRow(const SCTAB nSrcTab,const SCTAB nDestTab)7677 void TestCopyPaste::checkReferencedCutRangesRow(const SCTAB nSrcTab, const SCTAB nDestTab)
7678 {
7679     // Cut B2:D2 and pasted to C12:E12
7680 
7681     OUString aFBase("=");
7682     if (nSrcTab != nDestTab)
7683         aFBase += "Dest.";
7684 
7685     // Precondition
7686     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(2, 11, nDestTab));
7687     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(3, 11, nDestTab));
7688     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(4, 11, nDestTab));
7689     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 2, nSrcTab));
7690     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 2, nSrcTab));
7691     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(3, 2, nSrcTab));
7692 
7693     // Guards
7694     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(0, 0, nSrcTab)); // A1
7695     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 0, nSrcTab)); // B1
7696     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(2, 0, nSrcTab)); // C1
7697     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(3, 0, nSrcTab)); // D1
7698     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(4, 0, nSrcTab)); // E1
7699     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(0, 1, nSrcTab)); // A2
7700     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(4, 1, nSrcTab)); // E2
7701     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(0, 2, nSrcTab)); // A3
7702     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(4, 2, nSrcTab)); // E3
7703     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(0, 3, nSrcTab)); // A4
7704     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(1, 3, nSrcTab)); // B4
7705     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(2, 3, nSrcTab)); // C4
7706     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(3, 3, nSrcTab)); // D4
7707     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(4, 3, nSrcTab)); // E4
7708     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(20, 0, nSrcTab)); // U1
7709     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(21, 0, nSrcTab)); // V1
7710     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(22, 0, nSrcTab)); // W1
7711     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(23, 0, nSrcTab)); // X1
7712     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(24, 0, nSrcTab)); // Y1
7713     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(20, 1, nSrcTab)); // U2
7714     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(24, 1, nSrcTab)); // Y2
7715     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(20, 2, nSrcTab)); // U3
7716     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(24, 2, nSrcTab)); // Y3
7717     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(20, 3, nSrcTab)); // U4
7718     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(21, 3, nSrcTab)); // B4
7719     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(22, 3, nSrcTab)); // W4
7720     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(23, 3, nSrcTab)); // X4
7721     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(24, 3, nSrcTab)); // Y4
7722     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(20, 0, nSrcTab)); // U1
7723     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(21, 0, nSrcTab)); // V1
7724     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(22, 0, nSrcTab)); // W1
7725     CPPUNIT_ASSERT_EQUAL(OUString("=D1"), getFormula(23, 0, nSrcTab)); // X1
7726     CPPUNIT_ASSERT_EQUAL(OUString("=E1"), getFormula(24, 0, nSrcTab)); // Y1
7727     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(20, 1, nSrcTab)); // U2
7728     CPPUNIT_ASSERT_EQUAL(OUString("=E2"), getFormula(24, 1, nSrcTab)); // Y2
7729     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(20, 2, nSrcTab)); // U3
7730     CPPUNIT_ASSERT_EQUAL(OUString("=E3"), getFormula(24, 2, nSrcTab)); // Y3
7731     CPPUNIT_ASSERT_EQUAL(OUString("=A4"), getFormula(20, 3, nSrcTab)); // U4
7732     CPPUNIT_ASSERT_EQUAL(OUString("=B4"), getFormula(21, 3, nSrcTab)); // B4
7733     CPPUNIT_ASSERT_EQUAL(OUString("=C4"), getFormula(22, 3, nSrcTab)); // W4
7734     CPPUNIT_ASSERT_EQUAL(OUString("=D4"), getFormula(23, 3, nSrcTab)); // X4
7735     CPPUNIT_ASSERT_EQUAL(OUString("=E4"), getFormula(24, 3, nSrcTab)); // Y4
7736 
7737     // Note: Values (mostly) remain the same
7738 
7739     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 20, nSrcTab)); // A21
7740     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D12"), getFormula(1, 20, nSrcTab)); // B21
7741     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E12"), getFormula(2, 20, nSrcTab)); // C21
7742     CPPUNIT_ASSERT_EQUAL(OUString("=B3"), getFormula(0, 21, nSrcTab)); // A22
7743     CPPUNIT_ASSERT_EQUAL(OUString("=C3"), getFormula(1, 21, nSrcTab)); // B22
7744     CPPUNIT_ASSERT_EQUAL(OUString("=D3"), getFormula(2, 21, nSrcTab)); // C22
7745     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 20, nSrcTab));
7746     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 20, nSrcTab));
7747     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 20, nSrcTab));
7748     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 21, nSrcTab));
7749     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 21, nSrcTab));
7750     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 21, nSrcTab));
7751 
7752     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$12"), getFormula(0, 30, nSrcTab)); // A31
7753     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$D$12"), getFormula(1, 30, nSrcTab)); // B31
7754     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$E$12"), getFormula(2, 30, nSrcTab)); // C31
7755     CPPUNIT_ASSERT_EQUAL(OUString("=$B$3"), getFormula(0, 31, nSrcTab)); // A32
7756     CPPUNIT_ASSERT_EQUAL(OUString("=$C$3"), getFormula(1, 31, nSrcTab)); // B32
7757     CPPUNIT_ASSERT_EQUAL(OUString("=$D$3"), getFormula(2, 31, nSrcTab)); // C32
7758     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 30, nSrcTab));
7759     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 30, nSrcTab));
7760     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 30, nSrcTab));
7761     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 31, nSrcTab));
7762     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 31, nSrcTab));
7763     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 31, nSrcTab));
7764 
7765     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12") : OUString("$Test.$C$12"),
7766                          getRangeByName("Range_B2"));
7767     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$D$12") : OUString("$Test.$D$12"),
7768                          getRangeByName("Range_C2"));
7769     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$E$12") : OUString("$Test.$E$12"),
7770                          getRangeByName("Range_D2"));
7771     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3"), getRangeByName("Range_B3")); // no change
7772     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$3"), getRangeByName("Range_C3")); // no change
7773     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$D$3"), getRangeByName("Range_D3")); // no change
7774     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12:$E$12")
7775                                              : OUString("$Test.$C$12:$E$12"),
7776                          getRangeByName("Range_B2_D2"));
7777     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3:$D$3"), getRangeByName("Range_B3_D3")); // no change
7778     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$D$3"), getRangeByName("Range_B2_D3")); // no change
7779     CPPUNIT_ASSERT_EQUAL(OUString("B2"), getRangeByName("RelRange_Cm20_R0")); // no change
7780 
7781     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B2"), getFormula(0, 40, nSrcTab)); // A41
7782     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C2"), getFormula(1, 40, nSrcTab)); // B41
7783     CPPUNIT_ASSERT_EQUAL(OUString("=Range_D2"), getFormula(2, 40, nSrcTab)); // C41
7784     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B3"), getFormula(0, 41, nSrcTab)); // A42
7785     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C3"), getFormula(1, 41, nSrcTab)); // B42
7786     CPPUNIT_ASSERT_EQUAL(OUString("=Range_D3"), getFormula(2, 41, nSrcTab)); // C42
7787     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 40, nSrcTab));
7788     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 40, nSrcTab));
7789     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 40, nSrcTab));
7790     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 41, nSrcTab));
7791     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 41, nSrcTab));
7792     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 41, nSrcTab));
7793 
7794     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 50, nSrcTab)); // A51
7795     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 50, nSrcTab)); // B51
7796     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(2, 50, nSrcTab)); // C51
7797     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 51, nSrcTab)); // A52
7798     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 51, nSrcTab)); // B52
7799     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(2, 51, nSrcTab)); // C52
7800     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 50, nSrcTab));
7801     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 50, nSrcTab));
7802     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 50, nSrcTab));
7803     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 51, nSrcTab));
7804     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 51, nSrcTab));
7805     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 51, nSrcTab));
7806 
7807     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:E12)")
7808                                              : OUString("=SUM(C12:E12)"),
7809                          getFormula(0, 60, nSrcTab)); // A61
7810     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:E12)")
7811                                              : OUString("=SUM(C12:E12)"),
7812                          getFormula(1, 60, nSrcTab)); // B61
7813     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:E12)")
7814                                              : OUString("=SUM(C12:E12)"),
7815                          getFormula(2, 60, nSrcTab)); // C61
7816     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(0, 61, nSrcTab)); // A62
7817     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(1, 61, nSrcTab)); // B62
7818     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(2, 61, nSrcTab)); // C62
7819     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 60, nSrcTab));
7820     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 60, nSrcTab));
7821     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 60, nSrcTab));
7822     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 61, nSrcTab));
7823     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 61, nSrcTab));
7824     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 61, nSrcTab));
7825 
7826     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$E$12)")
7827                                              : OUString("=SUM($C$12:$E$12)"),
7828                          getFormula(0, 70, nSrcTab)); // A71
7829     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$E$12)")
7830                                              : OUString("=SUM($C$12:$E$12)"),
7831                          getFormula(1, 70, nSrcTab)); // B71
7832     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$E$12)")
7833                                              : OUString("=SUM($C$12:$E$12)"),
7834                          getFormula(2, 70, nSrcTab)); // C71
7835     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(0, 71, nSrcTab)); // A72
7836     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(1, 71, nSrcTab)); // B72
7837     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(2, 71, nSrcTab)); // C72
7838     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 70, nSrcTab));
7839     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 70, nSrcTab));
7840     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 70, nSrcTab));
7841     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 71, nSrcTab));
7842     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 71, nSrcTab));
7843     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 71, nSrcTab));
7844 
7845     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(0, 80, nSrcTab)); // A81
7846     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(1, 80, nSrcTab)); // B81
7847     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(2, 80, nSrcTab)); // C81
7848     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(0, 81, nSrcTab)); // A82
7849     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(1, 81, nSrcTab)); // B82
7850     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(2, 81, nSrcTab)); // C82
7851     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 80, nSrcTab));
7852     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 80, nSrcTab));
7853     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 80, nSrcTab));
7854     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 81, nSrcTab));
7855     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 81, nSrcTab));
7856     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 81, nSrcTab));
7857 
7858     // no change in formula after cut
7859     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(0, 90, nSrcTab)); // A91
7860     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(1, 90, nSrcTab)); // B91
7861     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(2, 90, nSrcTab)); // C91
7862     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(0, 91, nSrcTab)); // A92
7863     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(1, 91, nSrcTab)); // B92
7864     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(2, 91, nSrcTab)); // C92
7865     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 90, nSrcTab)); // only 2nd row
7866     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 90, nSrcTab)); // only 2nd row
7867     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 90, nSrcTab)); // only 2nd row
7868     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 91, nSrcTab)); // only 2nd row
7869     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 91, nSrcTab)); // only 2nd row
7870     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 91, nSrcTab)); // only 2nd row
7871 
7872     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(0, 100, nSrcTab)); // A101
7873     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(1, 100, nSrcTab)); // B101
7874     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(2, 100, nSrcTab)); // C101
7875     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(0, 101, nSrcTab)); // A102
7876     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(1, 101, nSrcTab)); // B102
7877     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(2, 101, nSrcTab)); // C102
7878     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 100, nSrcTab)); // only 2nd row
7879     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 100, nSrcTab)); // only 2nd row
7880     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 100, nSrcTab)); // only 2nd row
7881     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 101, nSrcTab)); // only 2nd row
7882     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 101, nSrcTab)); // only 2nd row
7883     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 101, nSrcTab)); // only 2nd row
7884 }
7885 
checkReferencedCutTransposedRangesRow(const SCTAB nSrcTab,const SCTAB nDestTab)7886 void TestCopyPaste::checkReferencedCutTransposedRangesRow(const SCTAB nSrcTab, const SCTAB nDestTab)
7887 {
7888     // Cut B2:D2 and pasted transposed to C12:C14
7889 
7890     OUString aFBase("=");
7891     if (nSrcTab != nDestTab)
7892         aFBase += "Dest.";
7893 
7894     // Precondition
7895     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(2, 11, nDestTab));
7896     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(2, 12, nDestTab));
7897     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 13, nDestTab));
7898     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 2, nSrcTab));
7899     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 2, nSrcTab));
7900     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(3, 2, nSrcTab));
7901 
7902     // Guards
7903     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(0, 0, nSrcTab)); // A1
7904     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 0, nSrcTab)); // B1
7905     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(2, 0, nSrcTab)); // C1
7906     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(3, 0, nSrcTab)); // D1
7907     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(4, 0, nSrcTab)); // E1
7908     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(0, 1, nSrcTab)); // A2
7909     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(4, 1, nSrcTab)); // E2
7910     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(0, 2, nSrcTab)); // A3
7911     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(4, 2, nSrcTab)); // E3
7912     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(0, 3, nSrcTab)); // A4
7913     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(1, 3, nSrcTab)); // B4
7914     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(2, 3, nSrcTab)); // C4
7915     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(3, 3, nSrcTab)); // D4
7916     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(4, 3, nSrcTab)); // E4
7917     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(20, 0, nSrcTab)); // U1
7918     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(21, 0, nSrcTab)); // V1
7919     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(22, 0, nSrcTab)); // W1
7920     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(23, 0, nSrcTab)); // X1
7921     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(24, 0, nSrcTab)); // Y1
7922     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(20, 1, nSrcTab)); // U2
7923     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(24, 1, nSrcTab)); // Y2
7924     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(20, 2, nSrcTab)); // U3
7925     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(24, 2, nSrcTab)); // Y3
7926     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(20, 3, nSrcTab)); // U4
7927     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(21, 3, nSrcTab)); // B4
7928     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(22, 3, nSrcTab)); // W4
7929     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(23, 3, nSrcTab)); // X4
7930     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(24, 3, nSrcTab)); // Y4
7931     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(20, 0, nSrcTab)); // U1
7932     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(21, 0, nSrcTab)); // V1
7933     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(22, 0, nSrcTab)); // W1
7934     CPPUNIT_ASSERT_EQUAL(OUString("=D1"), getFormula(23, 0, nSrcTab)); // X1
7935     CPPUNIT_ASSERT_EQUAL(OUString("=E1"), getFormula(24, 0, nSrcTab)); // Y1
7936     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(20, 1, nSrcTab)); // U2
7937     CPPUNIT_ASSERT_EQUAL(OUString("=E2"), getFormula(24, 1, nSrcTab)); // Y2
7938     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(20, 2, nSrcTab)); // U3
7939     CPPUNIT_ASSERT_EQUAL(OUString("=E3"), getFormula(24, 2, nSrcTab)); // Y3
7940     CPPUNIT_ASSERT_EQUAL(OUString("=A4"), getFormula(20, 3, nSrcTab)); // U4
7941     CPPUNIT_ASSERT_EQUAL(OUString("=B4"), getFormula(21, 3, nSrcTab)); // B4
7942     CPPUNIT_ASSERT_EQUAL(OUString("=C4"), getFormula(22, 3, nSrcTab)); // W4
7943     CPPUNIT_ASSERT_EQUAL(OUString("=D4"), getFormula(23, 3, nSrcTab)); // X4
7944     CPPUNIT_ASSERT_EQUAL(OUString("=E4"), getFormula(24, 3, nSrcTab)); // Y4
7945 
7946     // Note: Values (mostly) remain the same
7947 
7948     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 20, nSrcTab));
7949     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 20, nSrcTab));
7950     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 20, nSrcTab));
7951     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 21, nSrcTab));
7952     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 21, nSrcTab));
7953     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 21, nSrcTab));
7954 
7955     // ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 20, nSrcTab), "C12", "Wrong reference");
7956     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 20, nSrcTab));
7957     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C13"), getFormula(1, 20, nSrcTab));
7958     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C14"), getFormula(2, 20, nSrcTab));
7959     CPPUNIT_ASSERT_EQUAL(OUString("=B3"), getFormula(0, 21, nSrcTab));
7960     CPPUNIT_ASSERT_EQUAL(OUString("=C3"), getFormula(1, 21, nSrcTab));
7961     CPPUNIT_ASSERT_EQUAL(OUString("=D3"), getFormula(2, 21, nSrcTab));
7962 
7963     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 30, nSrcTab));
7964     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 30, nSrcTab));
7965     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 30, nSrcTab));
7966     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 31, nSrcTab));
7967     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 31, nSrcTab));
7968     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 31, nSrcTab));
7969 
7970     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$12"), getFormula(0, 30, nSrcTab));
7971     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$13"), getFormula(1, 30, nSrcTab));
7972     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$14"), getFormula(2, 30, nSrcTab));
7973     CPPUNIT_ASSERT_EQUAL(OUString("=$B$3"), getFormula(0, 31, nSrcTab));
7974     CPPUNIT_ASSERT_EQUAL(OUString("=$C$3"), getFormula(1, 31, nSrcTab));
7975     CPPUNIT_ASSERT_EQUAL(OUString("=$D$3"), getFormula(2, 31, nSrcTab));
7976 
7977     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12") : OUString("$Test.$C$12"),
7978                          getRangeByName("Range_B2"));
7979     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$13") : OUString("$Test.$C$13"),
7980                          getRangeByName("Range_C2"));
7981     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$14") : OUString("$Test.$C$14"),
7982                          getRangeByName("Range_D2"));
7983     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3"), getRangeByName("Range_B3")); // no change
7984     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$3"), getRangeByName("Range_C3")); // no change
7985     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$D$3"), getRangeByName("Range_D3")); // no change
7986     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12:$C$14")
7987                                              : OUString("$Test.$C$12:$C$14"),
7988                          getRangeByName("Range_B2_D2"));
7989     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3:$D$3"), getRangeByName("Range_B3_D3")); // no change
7990     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$D$3"), getRangeByName("Range_B2_D3")); // no change
7991     CPPUNIT_ASSERT_EQUAL(OUString("B2"), getRangeByName("RelRange_Cm20_R0")); // no change
7992 
7993     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B2"), getFormula(0, 40, nSrcTab)); // A41
7994     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C2"), getFormula(1, 40, nSrcTab)); // B41
7995     CPPUNIT_ASSERT_EQUAL(OUString("=Range_D2"), getFormula(2, 40, nSrcTab)); // C41
7996     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B3"), getFormula(0, 41, nSrcTab)); // A42
7997     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C3"), getFormula(1, 41, nSrcTab)); // B42
7998     CPPUNIT_ASSERT_EQUAL(OUString("=Range_D3"), getFormula(2, 41, nSrcTab)); // C42
7999     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 40, nSrcTab));
8000     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 40, nSrcTab));
8001     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 40, nSrcTab));
8002     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 41, nSrcTab));
8003     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 41, nSrcTab));
8004     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 41, nSrcTab));
8005 
8006     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 50, nSrcTab)); // A51
8007     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 50, nSrcTab)); // B51
8008     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(2, 50, nSrcTab)); // C51
8009     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 51, nSrcTab)); // A52
8010     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 51, nSrcTab)); // B52
8011     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(2, 51, nSrcTab)); // C52
8012     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 50, nSrcTab));
8013     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 50, nSrcTab));
8014     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 50, nSrcTab));
8015     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(0, 51, nSrcTab));
8016     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 51, nSrcTab));
8017     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 51, nSrcTab));
8018 
8019     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:C14)")
8020                                              : OUString("=SUM(C12:C14)"),
8021                          getFormula(0, 60, nSrcTab)); // A61
8022     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:C14)")
8023                                              : OUString("=SUM(C12:C14)"),
8024                          getFormula(1, 60, nSrcTab)); // B61
8025     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:C14)")
8026                                              : OUString("=SUM(C12:C14)"),
8027                          getFormula(2, 60, nSrcTab)); // C61
8028     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(0, 61, nSrcTab)); // A62
8029     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(1, 61, nSrcTab)); // B62
8030     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B3:D3)"), getFormula(2, 61, nSrcTab)); // C62
8031     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 60, nSrcTab));
8032     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 60, nSrcTab));
8033     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 60, nSrcTab));
8034     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 61, nSrcTab));
8035     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 61, nSrcTab));
8036     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 61, nSrcTab));
8037 
8038     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$C$14)")
8039                                              : OUString("=SUM($C$12:$C$14)"),
8040                          getFormula(0, 70, nSrcTab)); // A71
8041     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$C$14)")
8042                                              : OUString("=SUM($C$12:$C$14)"),
8043                          getFormula(1, 70, nSrcTab)); // B71
8044     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$C$14)")
8045                                              : OUString("=SUM($C$12:$C$14)"),
8046                          getFormula(2, 70, nSrcTab)); // C71
8047     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(0, 71, nSrcTab)); // A72
8048     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(1, 71, nSrcTab)); // B72
8049     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$3:$D$3)"), getFormula(2, 71, nSrcTab)); // C72
8050     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 70, nSrcTab));
8051     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 70, nSrcTab));
8052     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 70, nSrcTab));
8053     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 71, nSrcTab));
8054     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 71, nSrcTab));
8055     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 71, nSrcTab));
8056 
8057     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(0, 80, nSrcTab)); // A81
8058     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(1, 80, nSrcTab)); // B81
8059     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D2)"), getFormula(2, 80, nSrcTab)); // C81
8060     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(0, 81, nSrcTab)); // A82
8061     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(1, 81, nSrcTab)); // B82
8062     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B3_D3)"), getFormula(2, 81, nSrcTab)); // C82
8063     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 80, nSrcTab));
8064     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(1, 80, nSrcTab));
8065     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(2, 80, nSrcTab));
8066     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 81, nSrcTab));
8067     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 81, nSrcTab));
8068     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 81, nSrcTab));
8069 
8070     // no change in formula after cut
8071     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(0, 90, nSrcTab)); // A91
8072     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(1, 90, nSrcTab)); // B91
8073     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(2, 90, nSrcTab)); // C91
8074     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(0, 91, nSrcTab)); // A92
8075     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(1, 91, nSrcTab)); // B92
8076     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$D$3)"), getFormula(2, 91, nSrcTab)); // C92
8077     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 90, nSrcTab)); // only 2nd row
8078     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 90, nSrcTab)); // only 2nd row
8079     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 90, nSrcTab)); // only 2nd row
8080     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 91, nSrcTab)); // only 2nd row
8081     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 91, nSrcTab)); // only 2nd row
8082     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 91, nSrcTab)); // only 2nd row
8083 
8084     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(0, 100, nSrcTab)); // A101
8085     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(1, 100, nSrcTab)); // B101
8086     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(2, 100, nSrcTab)); // C101
8087     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(0, 101, nSrcTab)); // A102
8088     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(1, 101, nSrcTab)); // B102
8089     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_D3)"), getFormula(2, 101, nSrcTab)); // C102
8090     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 100, nSrcTab)); // only 2nd row
8091     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 100, nSrcTab)); // only 2nd row
8092     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 100, nSrcTab)); // only 2nd row
8093     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 101, nSrcTab)); // only 2nd row
8094     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 101, nSrcTab)); // only 2nd row
8095     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(2, 101, nSrcTab)); // only 2nd row
8096 }
8097 
testReferencedCutRangesRow()8098 void TestCopyPaste::testReferencedCutRangesRow()
8099 {
8100     const SCTAB nSrcTab = 0;
8101     const SCTAB nDestTab = 2;
8102     std::unique_ptr<ScUndoCut> pUndoCut;
8103     std::unique_ptr<ScUndoPaste> pUndoPaste;
8104     executeReferencedCutRangesRow(false, nSrcTab, nDestTab, true, pUndoCut, pUndoPaste);
8105     checkReferencedCutRangesRow(nSrcTab, nDestTab);
8106 
8107     pUndoPaste->Undo();
8108     pUndoCut->Undo();
8109     checkReferencedCutRangesRowIntitial(nSrcTab, "After undo");
8110 
8111     pUndoCut->Redo();
8112     pUndoPaste->Redo();
8113     checkReferencedCutRangesRow(nSrcTab, nDestTab);
8114 
8115     pUndoPaste->Undo();
8116     pUndoCut->Undo();
8117     checkReferencedCutRangesRowIntitial(nSrcTab, "After undo");
8118 
8119     pUndoPaste.reset();
8120     pUndoCut.reset();
8121 
8122     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
8123         m_pDoc->DeleteTab(i - 1);
8124 }
8125 
8126 // tdf#142201
testReferencedCutTransposedRangesRowTab0To0()8127 void TestCopyPaste::testReferencedCutTransposedRangesRowTab0To0()
8128 {
8129     checkReferencedCutTransposedRangesRowUndo(0, 0);
8130 }
8131 
8132 // tdf#142201
testReferencedCutTransposedRangesRowTab0To1()8133 void TestCopyPaste::testReferencedCutTransposedRangesRowTab0To1()
8134 {
8135     checkReferencedCutTransposedRangesRowUndo(0, 1);
8136 }
8137 
8138 // tdf#142201
testReferencedCutTransposedRangesRowTab1To3()8139 void TestCopyPaste::testReferencedCutTransposedRangesRowTab1To3()
8140 {
8141     checkReferencedCutTransposedRangesRowUndo(1, 3);
8142 }
8143 
8144 // tdf#142201
testReferencedCutTransposedRangesRowTab3To1()8145 void TestCopyPaste::testReferencedCutTransposedRangesRowTab3To1()
8146 {
8147     checkReferencedCutTransposedRangesRowUndo(3, 1);
8148 }
8149 
8150 // tdf#142201
checkReferencedCutTransposedRangesRowUndo(const SCTAB nSrcTab,const SCTAB nDestTab)8151 void TestCopyPaste::checkReferencedCutTransposedRangesRowUndo(const SCTAB nSrcTab,
8152                                                               const SCTAB nDestTab)
8153 {
8154     std::unique_ptr<ScUndoCut> pUndoCut;
8155     std::unique_ptr<ScUndoPaste> pUndoPaste;
8156     executeReferencedCutRangesRow(true, nSrcTab, nDestTab, true, pUndoCut, pUndoPaste);
8157     checkReferencedCutTransposedRangesRow(nSrcTab, nDestTab);
8158 
8159     pUndoPaste->Undo();
8160     pUndoCut->Undo();
8161     checkReferencedCutRangesRowIntitial(nSrcTab, "After undo");
8162 
8163     pUndoCut->Redo();
8164     pUndoPaste->Redo();
8165     checkReferencedCutTransposedRangesRow(nSrcTab, nDestTab);
8166 
8167     pUndoPaste->Undo();
8168     pUndoCut->Undo();
8169     checkReferencedCutRangesRowIntitial(nSrcTab, "After undo");
8170 
8171     pUndoPaste.reset();
8172     pUndoCut.reset();
8173 
8174     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
8175         m_pDoc->DeleteTab(i - 1);
8176 }
8177 
checkReferencedCutRangesColIntitial(const SCTAB nSrcTab,const SCTAB nDestTab,const OUString & rDesc)8178 void TestCopyPaste::checkReferencedCutRangesColIntitial(const SCTAB nSrcTab, const SCTAB nDestTab,
8179                                                         const OUString& rDesc)
8180 {
8181     printRange(m_pDoc, ScRange(1, 1, nSrcTab, 2, 3, nSrcTab), rDesc.toUtf8() + ": Source");
8182     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(1, 1, nSrcTab));
8183     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 2, nSrcTab));
8184     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(1, 3, nSrcTab));
8185     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(2, 1, nSrcTab));
8186     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 2, nSrcTab));
8187     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 3, nSrcTab));
8188 
8189     // Guards
8190     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(0, 0, nSrcTab)); // A1
8191     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(0, 1, nSrcTab)); // A2
8192     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(0, 2, nSrcTab)); // A3
8193     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(0, 3, nSrcTab)); // A4
8194     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(0, 4, nSrcTab)); // A5
8195     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(1, 0, nSrcTab)); // B1
8196     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(1, 4, nSrcTab)); // B5
8197     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(2, 0, nSrcTab)); // C1
8198     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(2, 4, nSrcTab)); // C5
8199     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(3, 0, nSrcTab)); // D1
8200     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(3, 1, nSrcTab)); // D2
8201     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(3, 2, nSrcTab)); // D3
8202     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(3, 3, nSrcTab)); // D4
8203     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(3, 4, nSrcTab)); // D5
8204     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(20, 0, nSrcTab)); // U1
8205     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(20, 1, nSrcTab)); // U2
8206     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(20, 2, nSrcTab)); // U3
8207     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(20, 3, nSrcTab)); // U4
8208     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(20, 4, nSrcTab)); // U5
8209     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(21, 0, nSrcTab)); // V1
8210     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(21, 4, nSrcTab)); // V5
8211     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(22, 0, nSrcTab)); // W1
8212     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(22, 4, nSrcTab)); // W5
8213     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(23, 0, nSrcTab)); // X1
8214     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(23, 1, nSrcTab)); // X2
8215     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(23, 2, nSrcTab)); // X3
8216     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(23, 3, nSrcTab)); // X4
8217     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(23, 4, nSrcTab)); // X5
8218     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(20, 0, nSrcTab)); // U1
8219     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(20, 1, nSrcTab)); // U2
8220     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(20, 2, nSrcTab)); // U3
8221     CPPUNIT_ASSERT_EQUAL(OUString("=A4"), getFormula(20, 3, nSrcTab)); // U4
8222     CPPUNIT_ASSERT_EQUAL(OUString("=A5"), getFormula(20, 4, nSrcTab)); // U5
8223     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(21, 0, nSrcTab)); // V1
8224     CPPUNIT_ASSERT_EQUAL(OUString("=B5"), getFormula(21, 4, nSrcTab)); // V5
8225     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(22, 0, nSrcTab)); // W1
8226     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(22, 4, nSrcTab)); // W5
8227     CPPUNIT_ASSERT_EQUAL(OUString("=D1"), getFormula(23, 0, nSrcTab)); // X1
8228     CPPUNIT_ASSERT_EQUAL(OUString("=D2"), getFormula(23, 1, nSrcTab)); // X2
8229     CPPUNIT_ASSERT_EQUAL(OUString("=D3"), getFormula(23, 2, nSrcTab)); // X3
8230     CPPUNIT_ASSERT_EQUAL(OUString("=D4"), getFormula(23, 3, nSrcTab)); // X4
8231     CPPUNIT_ASSERT_EQUAL(OUString("=D5"), getFormula(23, 4, nSrcTab)); // X5
8232 
8233     for (int i = 10; i < 20; ++i)
8234         for (int j = 0; j < 10; ++j)
8235         {
8236             CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(j, i, nSrcTab));
8237             CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(j, i, nSrcTab));
8238         }
8239 
8240     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 20, nSrcTab, 1, 22, nSrcTab),
8241                                       rDesc.toUtf8() + ": Relative references");
8242     CPPUNIT_ASSERT_EQUAL(OUString("=B2"), getFormula(0, 20, nSrcTab)); // A21
8243     CPPUNIT_ASSERT_EQUAL(OUString("=B3"), getFormula(0, 21, nSrcTab)); // A22
8244     CPPUNIT_ASSERT_EQUAL(OUString("=B4"), getFormula(0, 22, nSrcTab)); // A23
8245     CPPUNIT_ASSERT_EQUAL(OUString("=C2"), getFormula(1, 20, nSrcTab)); // B21
8246     CPPUNIT_ASSERT_EQUAL(OUString("=C3"), getFormula(1, 21, nSrcTab)); // B22
8247     CPPUNIT_ASSERT_EQUAL(OUString("=C4"), getFormula(1, 22, nSrcTab)); // B23
8248     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 20, nSrcTab));
8249     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 21, nSrcTab));
8250     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 22, nSrcTab));
8251     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 20, nSrcTab));
8252     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 21, nSrcTab));
8253     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 22, nSrcTab));
8254 
8255     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 30, nSrcTab, 1, 32, nSrcTab),
8256                                       rDesc.toUtf8() + ": Absolute references");
8257     CPPUNIT_ASSERT_EQUAL(OUString("=$B$2"), getFormula(0, 30, nSrcTab)); // A31
8258     CPPUNIT_ASSERT_EQUAL(OUString("=$B$3"), getFormula(0, 31, nSrcTab)); // A32
8259     CPPUNIT_ASSERT_EQUAL(OUString("=$B$4"), getFormula(0, 32, nSrcTab)); // A33
8260     CPPUNIT_ASSERT_EQUAL(OUString("=$C$2"), getFormula(1, 30, nSrcTab)); // B31
8261     CPPUNIT_ASSERT_EQUAL(OUString("=$C$3"), getFormula(1, 31, nSrcTab)); // B32
8262     CPPUNIT_ASSERT_EQUAL(OUString("=$C$4"), getFormula(1, 32, nSrcTab)); // B33
8263     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 30, nSrcTab));
8264     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 31, nSrcTab));
8265     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 32, nSrcTab));
8266     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 30, nSrcTab));
8267     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 31, nSrcTab));
8268     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 32, nSrcTab));
8269 
8270     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2"), getRangeByName("Range_B2"));
8271     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$3"), getRangeByName("Range_B3"));
8272     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$4"), getRangeByName("Range_B4"));
8273     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2"), getRangeByName("Range_C2"));
8274     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$3"), getRangeByName("Range_C3"));
8275     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$4"), getRangeByName("Range_C4"));
8276     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$B$4"), getRangeByName("Range_B2_B4"));
8277     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2:$C$4"), getRangeByName("Range_C2_C4"));
8278     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$C$4"), getRangeByName("Range_B2_C4"));
8279     CPPUNIT_ASSERT_EQUAL(OUString("B2"), getRangeByName("RelRange_Cm20_R0"));
8280 
8281     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 40, nSrcTab, 1, 42, nSrcTab),
8282                                       rDesc.toUtf8() + ": Absolute ranges");
8283     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B2"), getFormula(0, 40, nSrcTab)); // A41
8284     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B3"), getFormula(0, 41, nSrcTab)); // A42
8285     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B4"), getFormula(0, 42, nSrcTab)); // A43
8286     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C2"), getFormula(1, 40, nSrcTab)); // B41
8287     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C3"), getFormula(1, 41, nSrcTab)); // B42
8288     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C4"), getFormula(1, 42, nSrcTab)); // B43
8289     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 40, nSrcTab));
8290     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 41, nSrcTab));
8291     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 42, nSrcTab));
8292     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 40, nSrcTab));
8293     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 41, nSrcTab));
8294     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 42, nSrcTab));
8295 
8296     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 50, nSrcTab, 1, 52, nSrcTab),
8297                                       rDesc.toUtf8() + ": Relative ranges");
8298     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 50, nSrcTab)); // A51
8299     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 51, nSrcTab)); // A52
8300     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 52, nSrcTab)); // A53
8301     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 50, nSrcTab)); // B51
8302     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 51, nSrcTab)); // B52
8303     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 52, nSrcTab)); // B53
8304     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 50, nSrcTab));
8305     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 51, nSrcTab));
8306     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 52, nSrcTab));
8307     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 50, nSrcTab));
8308     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 51, nSrcTab));
8309     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 52, nSrcTab));
8310 
8311     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 60, nSrcTab, 1, 62, nSrcTab),
8312                                       rDesc.toUtf8() + ": Relative sum");
8313     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B2:B4)"), getFormula(0, 60, nSrcTab)); // A61
8314     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B2:B4)"), getFormula(0, 61, nSrcTab)); // A62
8315     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B2:B4)"), getFormula(0, 62, nSrcTab)); // A63
8316     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 60, nSrcTab)); // B61
8317     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 61, nSrcTab)); // B62
8318     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 62, nSrcTab)); // B63
8319     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 60, nSrcTab));
8320     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 61, nSrcTab));
8321     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 62, nSrcTab));
8322     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 60, nSrcTab));
8323     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 61, nSrcTab));
8324     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 62, nSrcTab));
8325 
8326     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 70, nSrcTab, 1, 72, nSrcTab),
8327                                       rDesc.toUtf8() + ": Absolute sum");
8328     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$B$4)"), getFormula(0, 70, nSrcTab)); // A71
8329     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$B$4)"), getFormula(0, 71, nSrcTab)); // A72
8330     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$B$4)"), getFormula(0, 72, nSrcTab)); // A73
8331     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 70, nSrcTab)); // B71
8332     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 71, nSrcTab)); // B72
8333     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 72, nSrcTab)); // B73
8334     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 70, nSrcTab));
8335     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 71, nSrcTab));
8336     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 72, nSrcTab));
8337     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 70, nSrcTab));
8338     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 71, nSrcTab));
8339     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 72, nSrcTab));
8340 
8341     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 80, nSrcTab, 1, 82, nSrcTab),
8342                                       rDesc.toUtf8() + ": Relative range sum");
8343     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 80, nSrcTab)); // A81
8344     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 81, nSrcTab)); // A82
8345     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 82, nSrcTab)); // A83
8346     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 80, nSrcTab)); // B81
8347     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 81, nSrcTab)); // B82
8348     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 82, nSrcTab)); // B83
8349     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 80, nSrcTab));
8350     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 81, nSrcTab));
8351     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 82, nSrcTab));
8352     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 80, nSrcTab));
8353     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 81, nSrcTab));
8354     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 82, nSrcTab));
8355 
8356     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 90, nSrcTab, 1, 92, nSrcTab),
8357                                       rDesc.toUtf8() + ": Absolute sum");
8358     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 90, nSrcTab)); // A91
8359     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 91, nSrcTab)); // A92
8360     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 92, nSrcTab)); // A93
8361     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 90, nSrcTab)); // B91
8362     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 91, nSrcTab)); // B92
8363     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 92, nSrcTab)); // B93
8364     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 90, nSrcTab));
8365     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 91, nSrcTab));
8366     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 92, nSrcTab));
8367     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 90, nSrcTab));
8368     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 91, nSrcTab));
8369     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 92, nSrcTab));
8370 
8371     lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 100, nSrcTab, 1, 102, nSrcTab),
8372                                       rDesc.toUtf8() + ": Relative range sum");
8373     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 100, nSrcTab)); // A101
8374     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 101, nSrcTab)); // A102
8375     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 102, nSrcTab)); // A103
8376     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 100, nSrcTab)); // B101
8377     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 101, nSrcTab)); // B102
8378     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 102, nSrcTab)); // B103
8379     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 100, nSrcTab));
8380     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 101, nSrcTab));
8381     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(0, 102, nSrcTab));
8382     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 100, nSrcTab));
8383     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 101, nSrcTab));
8384     CPPUNIT_ASSERT_EQUAL(69.0, m_pDoc->GetValue(1, 102, nSrcTab));
8385 
8386     // References to the dest range
8387     OUString aFBase("=");
8388     if (nSrcTab != nDestTab)
8389         aFBase += "Dest.";
8390 
8391     // Existing references to the destination range must not change
8392     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 112, nSrcTab));
8393     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C13"), getFormula(0, 113, nSrcTab));
8394     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C14"), getFormula(0, 114, nSrcTab));
8395     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D12"), getFormula(1, 112, nSrcTab));
8396     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D13"), getFormula(1, 113, nSrcTab));
8397     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D14"), getFormula(1, 114, nSrcTab));
8398     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E12"), getFormula(2, 112, nSrcTab));
8399     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E13"), getFormula(2, 113, nSrcTab));
8400     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E14"), getFormula(2, 114, nSrcTab));
8401 }
8402 
executeReferencedCutRangesCol(const bool bTransposed,const SCTAB nSrcTab,const SCTAB nDestTab,const bool bUndo,std::unique_ptr<ScUndoCut> & pUndoCut,std::unique_ptr<ScUndoPaste> & pUndoPaste)8403 void TestCopyPaste::executeReferencedCutRangesCol(const bool bTransposed, const SCTAB nSrcTab,
8404                                                   const SCTAB nDestTab, const bool bUndo,
8405                                                   std::unique_ptr<ScUndoCut>& pUndoCut,
8406                                                   std::unique_ptr<ScUndoPaste>& pUndoPaste)
8407 {
8408     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
8409 
8410     for (int i = 0; i < nSrcTab; ++i)
8411         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
8412     m_pDoc->InsertTab(nSrcTab, "Test");
8413 
8414     m_pDoc->SetValue(1, 1, nSrcTab, 01.0); // B2  \.
8415     m_pDoc->SetValue(1, 2, nSrcTab, 11.0); // B3   | cut
8416     m_pDoc->SetValue(1, 3, nSrcTab, 21.0); // B4  /
8417     m_pDoc->SetValue(2, 1, nSrcTab, 02.0); // C2
8418     m_pDoc->SetValue(2, 2, nSrcTab, 12.0); // C3
8419     m_pDoc->SetValue(2, 3, nSrcTab, 22.0); // C4
8420     printRange(m_pDoc, ScRange(1, 1, nSrcTab, 2, 3, nSrcTab), "Source");
8421 
8422     // Guard values
8423     m_pDoc->SetValue(0, 0, nSrcTab, 1000.0); // A1
8424     m_pDoc->SetValue(0, 1, nSrcTab, 1001.0); // A2
8425     m_pDoc->SetValue(0, 2, nSrcTab, 1002.0); // A3
8426     m_pDoc->SetValue(0, 3, nSrcTab, 1003.0); // A4
8427     m_pDoc->SetValue(0, 4, nSrcTab, 1004.0); // A5
8428     m_pDoc->SetValue(1, 0, nSrcTab, 1010.0); // B1
8429     m_pDoc->SetValue(1, 4, nSrcTab, 1014.0); // B5
8430     m_pDoc->SetValue(2, 0, nSrcTab, 1020.0); // C1
8431     m_pDoc->SetValue(2, 4, nSrcTab, 1024.0); // C5
8432     m_pDoc->SetValue(3, 0, nSrcTab, 1030.0); // D1
8433     m_pDoc->SetValue(3, 1, nSrcTab, 1031.0); // D2
8434     m_pDoc->SetValue(3, 2, nSrcTab, 1032.0); // D3
8435     m_pDoc->SetValue(3, 3, nSrcTab, 1033.0); // D4
8436     m_pDoc->SetValue(3, 4, nSrcTab, 1034.0); // D5
8437 
8438     m_pDoc->SetString(20, 0, nSrcTab, "=A1"); // U1
8439     m_pDoc->SetString(20, 1, nSrcTab, "=A2"); // U2
8440     m_pDoc->SetString(20, 2, nSrcTab, "=A3"); // U3
8441     m_pDoc->SetString(20, 3, nSrcTab, "=A4"); // U4
8442     m_pDoc->SetString(20, 4, nSrcTab, "=A5"); // U5
8443     m_pDoc->SetString(21, 0, nSrcTab, "=B1"); // V1
8444     m_pDoc->SetString(21, 4, nSrcTab, "=B5"); // V5
8445     m_pDoc->SetString(22, 0, nSrcTab, "=C1"); // W1
8446     m_pDoc->SetString(22, 4, nSrcTab, "=C5"); // W5
8447     m_pDoc->SetString(23, 0, nSrcTab, "=D1"); // X1
8448     m_pDoc->SetString(23, 1, nSrcTab, "=D2"); // X2
8449     m_pDoc->SetString(23, 2, nSrcTab, "=D3"); // X3
8450     m_pDoc->SetString(23, 3, nSrcTab, "=D4"); // X4
8451     m_pDoc->SetString(23, 4, nSrcTab, "=D5"); // X5
8452 
8453     // Cell position is used for ranges relative to current position
8454     ScAddress cellA1(0, 0, nSrcTab);
8455     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B2", cellA1, "$Test.$B$2"));
8456     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B3", cellA1, "$Test.$B$3"));
8457     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B4", cellA1, "$Test.$B$4"));
8458     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C2", cellA1, "$Test.$C$2"));
8459     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C3", cellA1, "$Test.$C$3"));
8460     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C4", cellA1, "$Test.$C$4"));
8461     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B2_B4", cellA1, "$Test.$B$2:$B$4"));
8462     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_C2_C4", cellA1, "$Test.$C$2:$C$4"));
8463     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("Range_B2_C4", cellA1, "$Test.$B$2:$C$4"));
8464     CPPUNIT_ASSERT(m_pDoc->InsertNewRangeName("RelRange_Cm20_R0", ScAddress(1, 21, nSrcTab), "B2"));
8465 
8466     m_pDoc->SetString(0, 20, nSrcTab, "=B2"); // A21
8467     m_pDoc->SetString(0, 21, nSrcTab, "=B3"); // A22
8468     m_pDoc->SetString(0, 22, nSrcTab, "=B4"); // A23
8469     m_pDoc->SetString(1, 20, nSrcTab, "=C2"); // B21
8470     m_pDoc->SetString(1, 21, nSrcTab, "=C3"); // B22
8471     m_pDoc->SetString(1, 22, nSrcTab, "=C4"); // B23
8472 
8473     m_pDoc->SetString(0, 30, nSrcTab, "=$B$2"); // A31
8474     m_pDoc->SetString(0, 31, nSrcTab, "=$B$3"); // A32
8475     m_pDoc->SetString(0, 32, nSrcTab, "=$B$4"); // A33
8476     m_pDoc->SetString(1, 30, nSrcTab, "=$C$2"); // B31
8477     m_pDoc->SetString(1, 31, nSrcTab, "=$C$3"); // B32
8478     m_pDoc->SetString(1, 32, nSrcTab, "=$C$4"); // B33
8479 
8480     m_pDoc->SetString(0, 40, nSrcTab, "=Range_B2"); // A41
8481     m_pDoc->SetString(0, 41, nSrcTab, "=Range_B3"); // A42
8482     m_pDoc->SetString(0, 42, nSrcTab, "=Range_B4"); // A43
8483     m_pDoc->SetString(1, 40, nSrcTab, "=Range_C2"); // B41
8484     m_pDoc->SetString(1, 41, nSrcTab, "=Range_C3"); // B42
8485     m_pDoc->SetString(1, 42, nSrcTab, "=Range_C4"); // B43
8486 
8487     m_pDoc->SetString(0, 50, nSrcTab, "=RelRange_Cm20_R0"); // A51
8488     m_pDoc->SetString(0, 51, nSrcTab, "=RelRange_Cm20_R0"); // A52
8489     m_pDoc->SetString(0, 52, nSrcTab, "=RelRange_Cm20_R0"); // A53
8490     m_pDoc->SetString(1, 50, nSrcTab, "=RelRange_Cm20_R0"); // B51
8491     m_pDoc->SetString(1, 51, nSrcTab, "=RelRange_Cm20_R0"); // B52
8492     m_pDoc->SetString(1, 52, nSrcTab, "=RelRange_Cm20_R0"); // B53
8493 
8494     m_pDoc->SetString(0, 60, nSrcTab, "=SUM(B2:B4"); // A61
8495     m_pDoc->SetString(0, 61, nSrcTab, "=SUM(B2:B4"); // A62
8496     m_pDoc->SetString(0, 62, nSrcTab, "=SUM(B2:B4"); // A63
8497     m_pDoc->SetString(1, 60, nSrcTab, "=SUM(C2:C4"); // B61
8498     m_pDoc->SetString(1, 61, nSrcTab, "=SUM(C2:C4"); // B62
8499     m_pDoc->SetString(1, 62, nSrcTab, "=SUM(C2:C4"); // B63
8500 
8501     m_pDoc->SetString(0, 70, nSrcTab, "=SUM($B$2:$B$4"); // A71
8502     m_pDoc->SetString(0, 71, nSrcTab, "=SUM($B$2:$B$4"); // A72
8503     m_pDoc->SetString(0, 72, nSrcTab, "=SUM($B$2:$B$4"); // A73
8504     m_pDoc->SetString(1, 70, nSrcTab, "=SUM($C$2:$C$4"); // B71
8505     m_pDoc->SetString(1, 71, nSrcTab, "=SUM($C$2:$C$4"); // B72
8506     m_pDoc->SetString(1, 72, nSrcTab, "=SUM($C$2:$C$4"); // B73
8507 
8508     m_pDoc->SetString(0, 80, nSrcTab, "=SUM(Range_B2_B4)"); // A81
8509     m_pDoc->SetString(0, 81, nSrcTab, "=SUM(Range_B2_B4)"); // A82
8510     m_pDoc->SetString(0, 82, nSrcTab, "=SUM(Range_B2_B4)"); // A83
8511     m_pDoc->SetString(1, 80, nSrcTab, "=SUM(Range_C2_C4)"); // B81
8512     m_pDoc->SetString(1, 81, nSrcTab, "=SUM(Range_C2_C4)"); // B82
8513     m_pDoc->SetString(1, 82, nSrcTab, "=SUM(Range_C2_C4)"); // B83
8514 
8515     m_pDoc->SetString(0, 90, nSrcTab, "=SUM($B$2:$C$4"); // A91
8516     m_pDoc->SetString(0, 91, nSrcTab, "=SUM($B$2:$C$4"); // A92
8517     m_pDoc->SetString(0, 92, nSrcTab, "=SUM($B$2:$C$4"); // A93
8518     m_pDoc->SetString(1, 90, nSrcTab, "=SUM($B$2:$C$4"); // B91
8519     m_pDoc->SetString(1, 91, nSrcTab, "=SUM($B$2:$C$4"); // B92
8520     m_pDoc->SetString(1, 92, nSrcTab, "=SUM($B$2:$C$4"); // B93
8521 
8522     m_pDoc->SetString(0, 100, nSrcTab, "=SUM(Range_B2_C4"); // A101
8523     m_pDoc->SetString(0, 101, nSrcTab, "=SUM(Range_B2_C4"); // A102
8524     m_pDoc->SetString(0, 102, nSrcTab, "=SUM(Range_B2_C4"); // A103
8525     m_pDoc->SetString(1, 100, nSrcTab, "=SUM(Range_B2_C4"); // B101
8526     m_pDoc->SetString(1, 101, nSrcTab, "=SUM(Range_B2_C4"); // B102
8527     m_pDoc->SetString(1, 102, nSrcTab, "=SUM(Range_B2_C4"); // B103
8528 
8529     for (int i = nSrcTab + 1; i < nDestTab; ++i)
8530         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
8531 
8532     if (nSrcTab < nDestTab)
8533         m_pDoc->InsertTab(nDestTab, "Dest");
8534     else if (nSrcTab > nDestTab)
8535         m_pDoc->RenameTab(nDestTab, "Dest");
8536 
8537     int nTabCount = m_pDoc->GetTableCount();
8538     for (int i = nTabCount; i < nTabCount + 2; ++i)
8539         m_pDoc->InsertTab(i, "Empty Tab " + OUString::number(i));
8540     nTabCount = m_pDoc->GetTableCount();
8541 
8542     // References to the dest range
8543     OUString aFBase("=");
8544     if (nSrcTab != nDestTab)
8545         aFBase += "Dest.";
8546 
8547     m_pDoc->SetString(0, 112, nSrcTab, OUString(aFBase + "C12"));
8548     m_pDoc->SetString(0, 113, nSrcTab, OUString(aFBase + "C13"));
8549     m_pDoc->SetString(0, 114, nSrcTab, OUString(aFBase + "C14"));
8550     m_pDoc->SetString(1, 112, nSrcTab, OUString(aFBase + "D12"));
8551     m_pDoc->SetString(1, 113, nSrcTab, OUString(aFBase + "D13"));
8552     m_pDoc->SetString(1, 114, nSrcTab, OUString(aFBase + "D14"));
8553     m_pDoc->SetString(2, 112, nSrcTab, OUString(aFBase + "E12"));
8554     m_pDoc->SetString(2, 113, nSrcTab, OUString(aFBase + "E13"));
8555     m_pDoc->SetString(2, 114, nSrcTab, OUString(aFBase + "E14"));
8556 
8557     // Check precondition
8558     checkReferencedCutRangesColIntitial(nSrcTab, nDestTab, "Initial");
8559 
8560     // Cut values B2:B4 to the clip document.
8561     ScDocument aClipDoc(SCDOCMODE_CLIP);
8562     ScRange aSrcRange(1, 1, nSrcTab, 1, 3, nSrcTab);
8563     ScMarkData aSrcMark(m_pDoc->GetSheetLimits());
8564     aSrcMark.SetMarkArea(aSrcRange);
8565 
8566     pUndoCut.reset(cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, bUndo));
8567 
8568     InsertDeleteFlags aFlags(InsertDeleteFlags::ALL);
8569 
8570     ScDocumentUniquePtr pPasteUndoDoc;
8571     std::unique_ptr<ScDocument> pPasteRefUndoDoc;
8572     std::unique_ptr<ScRefUndoData> pUndoData;
8573 
8574     ScRange aDestRange;
8575     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
8576 
8577     if (bTransposed)
8578     {
8579         // To C12:E12
8580         aDestRange = ScRange(2, 11, nDestTab, 4, 11, nDestTab);
8581         aDestMark.SetMarkArea(aDestRange);
8582 
8583         if (bUndo)
8584             prepareUndoBeforePaste(true, pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange,
8585                                    pUndoData);
8586 
8587         // Transpose
8588         ScDocument* pOrigClipDoc = &aClipDoc;
8589         ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
8590         aClipDoc.TransposeClip(pTransClip.get(), aFlags, false, true);
8591         // Paste
8592         m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, pPasteRefUndoDoc.get(),
8593                              pTransClip.get(), true, false, true, false);
8594         lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 20, nSrcTab, 2, 21, nSrcTab),
8595                                           "Relative references after copy");
8596 
8597         m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, pPasteRefUndoDoc.get());
8598         lcl_printValuesAndFormulasInRange(m_pDoc, ScRange(0, 20, nSrcTab, 2, 21, nSrcTab),
8599                                           "Relative references after UpdateTranspose");
8600         pTransClip.reset();
8601     }
8602     else
8603     {
8604         // To C12:C14
8605         aDestRange = ScRange(2, 11, nDestTab, 2, 13, nDestTab);
8606         // aDestMark = ScMarkData(m_pDoc->GetSheetLimits());
8607 
8608         aDestMark.SetMarkArea(aDestRange);
8609 
8610         if (bUndo)
8611             prepareUndoBeforePaste(true, pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange,
8612                                    pUndoData);
8613 
8614         m_pDoc->CopyFromClip(aDestRange, aDestMark, aFlags, pPasteRefUndoDoc.get(), &aClipDoc, true,
8615                              false, false, false);
8616     }
8617 
8618     if (bUndo)
8619         prepareUndoAfterPaste(pPasteUndoDoc, pPasteRefUndoDoc, aDestMark, aDestRange, pUndoData,
8620                               pUndoPaste, bTransposed);
8621 }
8622 
checkReferencedCutRangesCol(const SCTAB nSrcTab,const SCTAB nDestTab)8623 void TestCopyPaste::checkReferencedCutRangesCol(const SCTAB nSrcTab, const SCTAB nDestTab)
8624 {
8625     // Cut B2:B4 and pasted to C12:C14
8626 
8627     OUString aFBase("=");
8628     if (nSrcTab != nDestTab)
8629         aFBase += "Dest.";
8630 
8631     // Precondition
8632     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(2, 11, nDestTab)); // C12
8633     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(2, 12, nDestTab)); // C13
8634     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 13, nDestTab)); // C14
8635     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(2, 1, nSrcTab)); // C2
8636     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 2, nSrcTab)); // C3
8637     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 3, nSrcTab)); // C4
8638 
8639     // Guards
8640     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(0, 0, nSrcTab)); // A1
8641     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(0, 1, nSrcTab)); // A2
8642     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(0, 2, nSrcTab)); // A3
8643     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(0, 3, nSrcTab)); // A4
8644     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(0, 4, nSrcTab)); // A5
8645     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(1, 0, nSrcTab)); // B1
8646     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(1, 4, nSrcTab)); // B5
8647     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(2, 0, nSrcTab)); // C1
8648     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(2, 4, nSrcTab)); // C5
8649     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(3, 0, nSrcTab)); // D1
8650     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(3, 1, nSrcTab)); // D2
8651     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(3, 2, nSrcTab)); // D3
8652     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(3, 3, nSrcTab)); // D4
8653     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(3, 4, nSrcTab)); // D5
8654     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(20, 0, nSrcTab)); // U1
8655     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(20, 1, nSrcTab)); // U2
8656     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(20, 2, nSrcTab)); // U3
8657     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(20, 3, nSrcTab)); // U4
8658     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(20, 4, nSrcTab)); // U5
8659     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(21, 0, nSrcTab)); // V1
8660     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(21, 4, nSrcTab)); // V5
8661     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(22, 0, nSrcTab)); // W1
8662     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(22, 4, nSrcTab)); // W5
8663     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(23, 0, nSrcTab)); // X1
8664     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(23, 1, nSrcTab)); // X2
8665     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(23, 2, nSrcTab)); // X3
8666     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(23, 3, nSrcTab)); // X4
8667     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(23, 4, nSrcTab)); // X5
8668     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(20, 0, nSrcTab)); // U1
8669     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(20, 1, nSrcTab)); // U2
8670     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(20, 2, nSrcTab)); // U3
8671     CPPUNIT_ASSERT_EQUAL(OUString("=A4"), getFormula(20, 3, nSrcTab)); // U4
8672     CPPUNIT_ASSERT_EQUAL(OUString("=A5"), getFormula(20, 4, nSrcTab)); // U5
8673     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(21, 0, nSrcTab)); // V1
8674     CPPUNIT_ASSERT_EQUAL(OUString("=B5"), getFormula(21, 4, nSrcTab)); // V5
8675     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(22, 0, nSrcTab)); // W1
8676     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(22, 4, nSrcTab)); // W5
8677     CPPUNIT_ASSERT_EQUAL(OUString("=D1"), getFormula(23, 0, nSrcTab)); // X1
8678     CPPUNIT_ASSERT_EQUAL(OUString("=D2"), getFormula(23, 1, nSrcTab)); // X2
8679     CPPUNIT_ASSERT_EQUAL(OUString("=D3"), getFormula(23, 2, nSrcTab)); // X3
8680     CPPUNIT_ASSERT_EQUAL(OUString("=D4"), getFormula(23, 3, nSrcTab)); // X4
8681     CPPUNIT_ASSERT_EQUAL(OUString("=D5"), getFormula(23, 4, nSrcTab)); // X5
8682 
8683     // Note: Values (mostly) remain the same
8684 
8685     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 20, nSrcTab)); // A21
8686     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C13"), getFormula(0, 21, nSrcTab)); // A22
8687     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C14"), getFormula(0, 22, nSrcTab)); // A23
8688     CPPUNIT_ASSERT_EQUAL(OUString("=C2"), getFormula(1, 20, nSrcTab)); // B21
8689     CPPUNIT_ASSERT_EQUAL(OUString("=C3"), getFormula(1, 21, nSrcTab)); // B22
8690     CPPUNIT_ASSERT_EQUAL(OUString("=C4"), getFormula(1, 22, nSrcTab)); // B23
8691     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 20, nSrcTab));
8692     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 21, nSrcTab));
8693     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 22, nSrcTab));
8694     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 20, nSrcTab));
8695     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 21, nSrcTab));
8696     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 22, nSrcTab));
8697 
8698     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$12"), getFormula(0, 30, nSrcTab)); // A31
8699     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$13"), getFormula(0, 31, nSrcTab)); // A32
8700     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$14"), getFormula(0, 32, nSrcTab)); // A33
8701     CPPUNIT_ASSERT_EQUAL(OUString("=$C$2"), getFormula(1, 30, nSrcTab)); // B31
8702     CPPUNIT_ASSERT_EQUAL(OUString("=$C$3"), getFormula(1, 31, nSrcTab)); // B32
8703     CPPUNIT_ASSERT_EQUAL(OUString("=$C$4"), getFormula(1, 32, nSrcTab)); // B33
8704     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 30, nSrcTab));
8705     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 31, nSrcTab));
8706     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 32, nSrcTab));
8707     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 30, nSrcTab));
8708     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 31, nSrcTab));
8709     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 32, nSrcTab));
8710 
8711     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12") : OUString("$Test.$C$12"),
8712                          getRangeByName("Range_B2"));
8713     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$13") : OUString("$Test.$C$13"),
8714                          getRangeByName("Range_B3"));
8715     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$14") : OUString("$Test.$C$14"),
8716                          getRangeByName("Range_B4"));
8717     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2"), getRangeByName("Range_C2"));
8718     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$3"), getRangeByName("Range_C3"));
8719     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$4"), getRangeByName("Range_C4"));
8720     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12:$C$14")
8721                                              : OUString("$Test.$C$12:$C$14"),
8722                          getRangeByName("Range_B2_B4"));
8723     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2:$C$4"), getRangeByName("Range_C2_C4"));
8724     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$C$4"), getRangeByName("Range_B2_C4"));
8725     CPPUNIT_ASSERT_EQUAL(OUString("B2"), getRangeByName("RelRange_Cm20_R0"));
8726 
8727     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B2"), getFormula(0, 40, nSrcTab)); // A41
8728     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B3"), getFormula(0, 41, nSrcTab)); // A42
8729     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B4"), getFormula(0, 42, nSrcTab)); // A43
8730     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C2"), getFormula(1, 40, nSrcTab)); // B41
8731     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C3"), getFormula(1, 41, nSrcTab)); // B42
8732     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C4"), getFormula(1, 42, nSrcTab)); // B43
8733     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 40, nSrcTab));
8734     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 41, nSrcTab));
8735     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 42, nSrcTab));
8736     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 40, nSrcTab));
8737     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 41, nSrcTab));
8738     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 42, nSrcTab));
8739 
8740     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 50, nSrcTab)); // A51
8741     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 51, nSrcTab)); // A52
8742     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 52, nSrcTab)); // A53
8743     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 50, nSrcTab)); // B51
8744     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 51, nSrcTab)); // B52
8745     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 52, nSrcTab)); // B53
8746     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 50, nSrcTab));
8747     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 51, nSrcTab));
8748     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 52, nSrcTab));
8749     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 50, nSrcTab));
8750     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 51, nSrcTab));
8751     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 52, nSrcTab));
8752 
8753     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:C14)")
8754                                              : OUString("=SUM(C12:C14)"),
8755                          getFormula(0, 60, nSrcTab)); // A61
8756     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:C14)")
8757                                              : OUString("=SUM(C12:C14)"),
8758                          getFormula(0, 61, nSrcTab)); // A62
8759     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:C14)")
8760                                              : OUString("=SUM(C12:C14)"),
8761                          getFormula(0, 62, nSrcTab)); // A63
8762     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 60, nSrcTab)); // B61
8763     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 61, nSrcTab)); // B62
8764     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 62, nSrcTab)); // B63
8765     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 60, nSrcTab));
8766     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 61, nSrcTab));
8767     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 62, nSrcTab));
8768     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 60, nSrcTab));
8769     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 61, nSrcTab));
8770     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 62, nSrcTab));
8771 
8772     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$C$14)")
8773                                              : OUString("=SUM($C$12:$C$14)"),
8774                          getFormula(0, 70, nSrcTab)); // A71
8775     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$C$14)")
8776                                              : OUString("=SUM($C$12:$C$14)"),
8777                          getFormula(0, 71, nSrcTab)); // A72
8778     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$C$14)")
8779                                              : OUString("=SUM($C$12:$C$14)"),
8780                          getFormula(0, 72, nSrcTab)); // A73
8781     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 70, nSrcTab)); // B71
8782     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 71, nSrcTab)); // B72
8783     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 72, nSrcTab)); // B73
8784     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 70, nSrcTab));
8785     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 71, nSrcTab));
8786     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 72, nSrcTab));
8787     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 70, nSrcTab));
8788     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 71, nSrcTab));
8789     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 72, nSrcTab));
8790 
8791     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 80, nSrcTab)); // A81
8792     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 81, nSrcTab)); // A82
8793     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 82, nSrcTab)); // A83
8794     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 80, nSrcTab)); // B81
8795     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 81, nSrcTab)); // B82
8796     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 82, nSrcTab)); // B83
8797     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 80, nSrcTab));
8798     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 81, nSrcTab));
8799     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 82, nSrcTab));
8800     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 80, nSrcTab));
8801     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 81, nSrcTab));
8802     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 82, nSrcTab));
8803 
8804     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 90, nSrcTab)); // A91
8805     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 91, nSrcTab)); // A92
8806     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 92, nSrcTab)); // A93
8807     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 90, nSrcTab)); // B91
8808     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 91, nSrcTab)); // B92
8809     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 92, nSrcTab)); // B93
8810     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 90, nSrcTab));
8811     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 91, nSrcTab));
8812     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 92, nSrcTab));
8813     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 90, nSrcTab));
8814     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 91, nSrcTab));
8815     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 92, nSrcTab));
8816 
8817     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 100, nSrcTab)); // A101
8818     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 101, nSrcTab)); // A102
8819     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 102, nSrcTab)); // A103
8820     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 100, nSrcTab)); // B101
8821     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 101, nSrcTab)); // B102
8822     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 102, nSrcTab)); // B103
8823     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 100, nSrcTab));
8824     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 101, nSrcTab));
8825     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 102, nSrcTab));
8826     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 100, nSrcTab));
8827     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 101, nSrcTab));
8828     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 102, nSrcTab));
8829 
8830     // Existing references to the destination range must not change
8831     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 112, nSrcTab));
8832     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C13"), getFormula(0, 113, nSrcTab));
8833     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C14"), getFormula(0, 114, nSrcTab));
8834     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D12"), getFormula(1, 112, nSrcTab));
8835     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D13"), getFormula(1, 113, nSrcTab));
8836     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D14"), getFormula(1, 114, nSrcTab));
8837     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E12"), getFormula(2, 112, nSrcTab));
8838     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E13"), getFormula(2, 113, nSrcTab));
8839     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E14"), getFormula(2, 114, nSrcTab));
8840 }
8841 
checkReferencedCutTransposedRangesCol(const SCTAB nSrcTab,const SCTAB nDestTab)8842 void TestCopyPaste::checkReferencedCutTransposedRangesCol(const SCTAB nSrcTab, const SCTAB nDestTab)
8843 {
8844     // Cut B2:D2 and pasted transposed to C12:E12
8845 
8846     OUString aFBase("=");
8847     if (nSrcTab != nDestTab)
8848         aFBase += "Dest.";
8849 
8850     // Precondition
8851     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(2, 11, nDestTab)); // C12
8852     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(3, 11, nDestTab)); // D12
8853     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(4, 11, nDestTab)); // E12
8854     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(2, 1, nSrcTab)); // C2
8855     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 2, nSrcTab)); // C3
8856     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 3, nSrcTab)); // C4
8857 
8858     // Guards
8859     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(0, 0, nSrcTab)); // A1
8860     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(0, 1, nSrcTab)); // A2
8861     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(0, 2, nSrcTab)); // A3
8862     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(0, 3, nSrcTab)); // A4
8863     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(0, 4, nSrcTab)); // A5
8864     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(1, 0, nSrcTab)); // B1
8865     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(1, 4, nSrcTab)); // B5
8866     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(2, 0, nSrcTab)); // C1
8867     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(2, 4, nSrcTab)); // C5
8868     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(3, 0, nSrcTab)); // D1
8869     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(3, 1, nSrcTab)); // D2
8870     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(3, 2, nSrcTab)); // D3
8871     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(3, 3, nSrcTab)); // D4
8872     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(3, 4, nSrcTab)); // D5
8873     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(20, 0, nSrcTab)); // U1
8874     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(20, 1, nSrcTab)); // U2
8875     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(20, 2, nSrcTab)); // U3
8876     CPPUNIT_ASSERT_EQUAL(1003.0, m_pDoc->GetValue(20, 3, nSrcTab)); // U4
8877     CPPUNIT_ASSERT_EQUAL(1004.0, m_pDoc->GetValue(20, 4, nSrcTab)); // U5
8878     CPPUNIT_ASSERT_EQUAL(1010.0, m_pDoc->GetValue(21, 0, nSrcTab)); // V1
8879     CPPUNIT_ASSERT_EQUAL(1014.0, m_pDoc->GetValue(21, 4, nSrcTab)); // V5
8880     CPPUNIT_ASSERT_EQUAL(1020.0, m_pDoc->GetValue(22, 0, nSrcTab)); // W1
8881     CPPUNIT_ASSERT_EQUAL(1024.0, m_pDoc->GetValue(22, 4, nSrcTab)); // W5
8882     CPPUNIT_ASSERT_EQUAL(1030.0, m_pDoc->GetValue(23, 0, nSrcTab)); // X1
8883     CPPUNIT_ASSERT_EQUAL(1031.0, m_pDoc->GetValue(23, 1, nSrcTab)); // X2
8884     CPPUNIT_ASSERT_EQUAL(1032.0, m_pDoc->GetValue(23, 2, nSrcTab)); // X3
8885     CPPUNIT_ASSERT_EQUAL(1033.0, m_pDoc->GetValue(23, 3, nSrcTab)); // X4
8886     CPPUNIT_ASSERT_EQUAL(1034.0, m_pDoc->GetValue(23, 4, nSrcTab)); // X5
8887     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(20, 0, nSrcTab)); // U1
8888     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(20, 1, nSrcTab)); // U2
8889     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(20, 2, nSrcTab)); // U3
8890     CPPUNIT_ASSERT_EQUAL(OUString("=A4"), getFormula(20, 3, nSrcTab)); // U4
8891     CPPUNIT_ASSERT_EQUAL(OUString("=A5"), getFormula(20, 4, nSrcTab)); // U5
8892     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(21, 0, nSrcTab)); // V1
8893     CPPUNIT_ASSERT_EQUAL(OUString("=B5"), getFormula(21, 4, nSrcTab)); // V5
8894     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(22, 0, nSrcTab)); // W1
8895     CPPUNIT_ASSERT_EQUAL(OUString("=C5"), getFormula(22, 4, nSrcTab)); // W5
8896     CPPUNIT_ASSERT_EQUAL(OUString("=D1"), getFormula(23, 0, nSrcTab)); // X1
8897     CPPUNIT_ASSERT_EQUAL(OUString("=D2"), getFormula(23, 1, nSrcTab)); // X2
8898     CPPUNIT_ASSERT_EQUAL(OUString("=D3"), getFormula(23, 2, nSrcTab)); // X3
8899     CPPUNIT_ASSERT_EQUAL(OUString("=D4"), getFormula(23, 3, nSrcTab)); // X4
8900     CPPUNIT_ASSERT_EQUAL(OUString("=D5"), getFormula(23, 4, nSrcTab)); // X5
8901 
8902     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 20, nSrcTab)); // A21
8903     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D12"), getFormula(0, 21, nSrcTab)); // A22
8904     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E12"), getFormula(0, 22, nSrcTab)); // A23
8905     CPPUNIT_ASSERT_EQUAL(OUString("=C2"), getFormula(1, 20, nSrcTab)); // B21
8906     CPPUNIT_ASSERT_EQUAL(OUString("=C3"), getFormula(1, 21, nSrcTab)); // B22
8907     CPPUNIT_ASSERT_EQUAL(OUString("=C4"), getFormula(1, 22, nSrcTab)); // B23
8908     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 20, nSrcTab));
8909     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 21, nSrcTab));
8910     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 22, nSrcTab));
8911     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 20, nSrcTab));
8912     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 21, nSrcTab));
8913     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 22, nSrcTab));
8914 
8915     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$C$12"), getFormula(0, 30, nSrcTab)); // A31
8916     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$D$12"), getFormula(0, 31, nSrcTab)); // A32
8917     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "$E$12"), getFormula(0, 32, nSrcTab)); // A33
8918     CPPUNIT_ASSERT_EQUAL(OUString("=$C$2"), getFormula(1, 30, nSrcTab)); // B31
8919     CPPUNIT_ASSERT_EQUAL(OUString("=$C$3"), getFormula(1, 31, nSrcTab)); // B32
8920     CPPUNIT_ASSERT_EQUAL(OUString("=$C$4"), getFormula(1, 32, nSrcTab)); // B33
8921     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 30, nSrcTab));
8922     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 31, nSrcTab));
8923     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 32, nSrcTab));
8924     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 30, nSrcTab));
8925     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 31, nSrcTab));
8926     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 32, nSrcTab));
8927 
8928     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12") : OUString("$Test.$C$12"),
8929                          getRangeByName("Range_B2"));
8930     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$D$12") : OUString("$Test.$D$12"),
8931                          getRangeByName("Range_B3"));
8932     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$E$12") : OUString("$Test.$E$12"),
8933                          getRangeByName("Range_B4"));
8934     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2"), getRangeByName("Range_C2"));
8935     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$3"), getRangeByName("Range_C3"));
8936     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$4"), getRangeByName("Range_C4"));
8937     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("$Dest.$C$12:$E$12")
8938                                              : OUString("$Test.$C$12:$E$12"),
8939                          getRangeByName("Range_B2_B4"));
8940     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$C$2:$C$4"), getRangeByName("Range_C2_C4"));
8941     CPPUNIT_ASSERT_EQUAL(OUString("$Test.$B$2:$C$4"), getRangeByName("Range_B2_C4"));
8942     CPPUNIT_ASSERT_EQUAL(OUString("B2"), getRangeByName("RelRange_Cm20_R0"));
8943 
8944     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B2"), getFormula(0, 40, nSrcTab)); // A41
8945     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B3"), getFormula(0, 41, nSrcTab)); // A42
8946     CPPUNIT_ASSERT_EQUAL(OUString("=Range_B4"), getFormula(0, 42, nSrcTab)); // A43
8947     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C2"), getFormula(1, 40, nSrcTab)); // B41
8948     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C3"), getFormula(1, 41, nSrcTab)); // B42
8949     CPPUNIT_ASSERT_EQUAL(OUString("=Range_C4"), getFormula(1, 42, nSrcTab)); // B43
8950     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 40, nSrcTab));
8951     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 41, nSrcTab));
8952     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 42, nSrcTab));
8953     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 40, nSrcTab));
8954     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 41, nSrcTab));
8955     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 42, nSrcTab));
8956 
8957     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 50, nSrcTab)); // A51
8958     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 51, nSrcTab)); // A52
8959     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(0, 52, nSrcTab)); // A53
8960     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 50, nSrcTab)); // B51
8961     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 51, nSrcTab)); // B52
8962     CPPUNIT_ASSERT_EQUAL(OUString("=RelRange_Cm20_R0"), getFormula(1, 52, nSrcTab)); // B53
8963     CPPUNIT_ASSERT_EQUAL(01.0, m_pDoc->GetValue(0, 50, nSrcTab));
8964     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(0, 51, nSrcTab));
8965     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(0, 52, nSrcTab));
8966     CPPUNIT_ASSERT_EQUAL(02.0, m_pDoc->GetValue(1, 50, nSrcTab));
8967     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 51, nSrcTab));
8968     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(1, 52, nSrcTab));
8969 
8970     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:E12)")
8971                                              : OUString("=SUM(C12:E12)"),
8972                          getFormula(0, 60, nSrcTab)); // A61
8973     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:E12)")
8974                                              : OUString("=SUM(C12:E12)"),
8975                          getFormula(0, 61, nSrcTab)); // A62
8976     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.C12:E12)")
8977                                              : OUString("=SUM(C12:E12)"),
8978                          getFormula(0, 62, nSrcTab)); // A63
8979     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 60, nSrcTab)); // B61
8980     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 61, nSrcTab)); // B62
8981     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(C2:C4)"), getFormula(1, 62, nSrcTab)); // B63
8982     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 60, nSrcTab));
8983     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 61, nSrcTab));
8984     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 62, nSrcTab));
8985     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 60, nSrcTab));
8986     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 61, nSrcTab));
8987     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 62, nSrcTab));
8988 
8989     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$E$12)")
8990                                              : OUString("=SUM($C$12:$E$12)"),
8991                          getFormula(0, 70, nSrcTab)); // A71
8992     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$E$12)")
8993                                              : OUString("=SUM($C$12:$E$12)"),
8994                          getFormula(0, 71, nSrcTab)); // A72
8995     CPPUNIT_ASSERT_EQUAL(nSrcTab != nDestTab ? OUString("=SUM(Dest.$C$12:$E$12)")
8996                                              : OUString("=SUM($C$12:$E$12)"),
8997                          getFormula(0, 72, nSrcTab)); // A73
8998     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 70, nSrcTab)); // B71
8999     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 71, nSrcTab)); // B72
9000     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($C$2:$C$4)"), getFormula(1, 72, nSrcTab)); // B73
9001     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 70, nSrcTab));
9002     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 71, nSrcTab));
9003     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 72, nSrcTab));
9004     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 70, nSrcTab));
9005     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 71, nSrcTab));
9006     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 72, nSrcTab));
9007 
9008     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 80, nSrcTab)); // A81
9009     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 81, nSrcTab)); // A82
9010     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_B4)"), getFormula(0, 82, nSrcTab)); // A83
9011     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 80, nSrcTab)); // B81
9012     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 81, nSrcTab)); // B82
9013     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_C2_C4)"), getFormula(1, 82, nSrcTab)); // B83
9014     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 80, nSrcTab));
9015     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 81, nSrcTab));
9016     CPPUNIT_ASSERT_EQUAL(33.0, m_pDoc->GetValue(0, 82, nSrcTab));
9017     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 80, nSrcTab));
9018     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 81, nSrcTab));
9019     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 82, nSrcTab));
9020 
9021     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 90, nSrcTab)); // A91
9022     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 91, nSrcTab)); // A92
9023     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(0, 92, nSrcTab)); // A93
9024     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 90, nSrcTab)); // B91
9025     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 91, nSrcTab)); // B92
9026     CPPUNIT_ASSERT_EQUAL(OUString("=SUM($B$2:$C$4)"), getFormula(1, 92, nSrcTab)); // B93
9027     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 90, nSrcTab));
9028     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 91, nSrcTab));
9029     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 92, nSrcTab));
9030     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 90, nSrcTab));
9031     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 91, nSrcTab));
9032     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 92, nSrcTab));
9033 
9034     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 100, nSrcTab)); // A101
9035     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 101, nSrcTab)); // A102
9036     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(0, 102, nSrcTab)); // A103
9037     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 100, nSrcTab)); // B101
9038     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 101, nSrcTab)); // B102
9039     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(Range_B2_C4)"), getFormula(1, 102, nSrcTab)); // B103
9040     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 100, nSrcTab));
9041     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 101, nSrcTab));
9042     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(0, 102, nSrcTab));
9043     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 100, nSrcTab));
9044     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 101, nSrcTab));
9045     CPPUNIT_ASSERT_EQUAL(36.0, m_pDoc->GetValue(1, 102, nSrcTab));
9046 
9047     // Existing references to the destination range must not change
9048     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C12"), getFormula(0, 112, nSrcTab));
9049     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C13"), getFormula(0, 113, nSrcTab));
9050     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "C14"), getFormula(0, 114, nSrcTab));
9051     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D12"), getFormula(1, 112, nSrcTab));
9052     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D13"), getFormula(1, 113, nSrcTab));
9053     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "D14"), getFormula(1, 114, nSrcTab));
9054     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E12"), getFormula(2, 112, nSrcTab));
9055     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E13"), getFormula(2, 113, nSrcTab));
9056     CPPUNIT_ASSERT_EQUAL(OUString(aFBase + "E14"), getFormula(2, 114, nSrcTab));
9057 }
9058 
testReferencedCutRangesCol()9059 void TestCopyPaste::testReferencedCutRangesCol()
9060 {
9061     const SCTAB nSrcTab = 0;
9062     const SCTAB nDestTab = 2;
9063     std::unique_ptr<ScUndoCut> pUndoCut;
9064     std::unique_ptr<ScUndoPaste> pUndoPaste;
9065     executeReferencedCutRangesCol(false, nSrcTab, nDestTab, true, pUndoCut, pUndoPaste);
9066     checkReferencedCutRangesCol(nSrcTab, nDestTab);
9067 
9068     pUndoPaste->Undo();
9069     pUndoCut->Undo();
9070     checkReferencedCutRangesColIntitial(nSrcTab, nDestTab, "After undo");
9071 
9072     pUndoCut->Redo();
9073     pUndoPaste->Redo();
9074     checkReferencedCutRangesCol(nSrcTab, nDestTab);
9075 
9076     pUndoPaste->Undo();
9077     pUndoCut->Undo();
9078     checkReferencedCutRangesColIntitial(nSrcTab, nDestTab, "After undo");
9079 
9080     pUndoPaste.reset();
9081     pUndoCut.reset();
9082 
9083     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
9084         m_pDoc->DeleteTab(i - 1);
9085 }
9086 
9087 // tdf#142201
testReferencedCutTransposedRangesColTab0To0()9088 void TestCopyPaste::testReferencedCutTransposedRangesColTab0To0()
9089 {
9090     checkReferencedCutTransposedRangesColUndo(0, 0);
9091 }
9092 
9093 // tdf#142201
testReferencedCutTransposedRangesColTab0To1()9094 void TestCopyPaste::testReferencedCutTransposedRangesColTab0To1()
9095 {
9096     checkReferencedCutTransposedRangesColUndo(0, 1);
9097 }
9098 
9099 // tdf#142201
testReferencedCutTransposedRangesColTab1To3()9100 void TestCopyPaste::testReferencedCutTransposedRangesColTab1To3()
9101 {
9102     checkReferencedCutTransposedRangesColUndo(1, 3);
9103 }
9104 
9105 // tdf#142201
testReferencedCutTransposedRangesColTab3To1()9106 void TestCopyPaste::testReferencedCutTransposedRangesColTab3To1()
9107 {
9108     checkReferencedCutTransposedRangesColUndo(3, 1);
9109 }
9110 
9111 // tdf#142201
checkReferencedCutTransposedRangesColUndo(const SCTAB nSrcTab,const SCTAB nDestTab)9112 void TestCopyPaste::checkReferencedCutTransposedRangesColUndo(const SCTAB nSrcTab,
9113                                                               const SCTAB nDestTab)
9114 {
9115     std::unique_ptr<ScUndoCut> pUndoCut;
9116     std::unique_ptr<ScUndoPaste> pUndoPaste;
9117     executeReferencedCutRangesCol(true, nSrcTab, nDestTab, true, pUndoCut, pUndoPaste);
9118     checkReferencedCutTransposedRangesCol(nSrcTab, nDestTab);
9119 
9120     pUndoPaste->Undo();
9121     pUndoCut->Undo();
9122     checkReferencedCutRangesColIntitial(nSrcTab, nDestTab, "After undo");
9123 
9124     pUndoCut->Redo();
9125     pUndoPaste->Redo();
9126     checkReferencedCutTransposedRangesCol(nSrcTab, nDestTab);
9127 
9128     pUndoPaste->Undo();
9129     pUndoCut->Undo();
9130     checkReferencedCutRangesColIntitial(nSrcTab, nDestTab, "After undo");
9131 
9132     pUndoPaste.reset();
9133     pUndoCut.reset();
9134 
9135     for (int i = m_pDoc->GetTableCount(); i > 0; --i)
9136         m_pDoc->DeleteTab(i - 1);
9137 }
9138 
testCutTransposedFormulas()9139 void TestCopyPaste::testCutTransposedFormulas()
9140 {
9141     const SCTAB nTab = 0;
9142     m_pDoc->InsertTab(nTab, "Test");
9143 
9144     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
9145     m_pDoc->SetValue(1, 0, nTab, 2.0); // B1
9146 
9147     m_pDoc->SetString(1, 1, nTab, "=A1"); // B2
9148     m_pDoc->SetString(2, 1, nTab, "=B1"); // C2
9149     m_pDoc->SetString(3, 1, nTab, "=SUM(A1:B1)"); // D2
9150     m_pDoc->SetString(4, 1, nTab, "=$B$1"); // E2
9151     m_pDoc->SetString(5, 1, nTab, "=$B1"); // F2
9152     m_pDoc->SetString(6, 1, nTab, "=B$1"); // G2
9153 
9154     // Check precondition
9155     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(3, 1, nTab));
9156 
9157     // Cut formulas B2:G2 to the clip document.
9158     ScDocument aClipDoc(SCDOCMODE_CLIP);
9159     ScRange aSrcRange(1, 1, nTab, 6, 1, nTab);
9160     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
9161 
9162     // To C3:C8
9163     ScRange aDestRange(2, 2, nTab, 2, 7, nTab);
9164     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
9165 
9166     // Transpose
9167     ScDocument* pOrigClipDoc = &aClipDoc;
9168     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
9169     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
9170     aDestMark.SetMarkArea(aDestRange);
9171     // Paste
9172     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
9173                          true, false, true, false);
9174     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
9175     pTransClip.reset();
9176 
9177     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(2, 2, nTab));
9178     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(2, 2, nTab));
9179 
9180     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(2, 3, nTab));
9181     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 3, nTab));
9182 
9183     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(A1:B1)"), getFormula(2, 4, nTab));
9184     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(2, 4, nTab));
9185 
9186     CPPUNIT_ASSERT_EQUAL(OUString("=$B$1"), getFormula(2, 5, nTab));
9187     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 5, nTab));
9188 
9189     CPPUNIT_ASSERT_EQUAL(OUString("=$B1"), getFormula(2, 6, nTab));
9190     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 6, nTab));
9191 
9192     CPPUNIT_ASSERT_EQUAL(OUString("=B$1"), getFormula(2, 7, nTab));
9193     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 7, nTab));
9194 }
9195 
testCutTransposedFormulasSquare()9196 void TestCopyPaste::testCutTransposedFormulasSquare()
9197 {
9198     const SCTAB nTab = 0;
9199     m_pDoc->InsertTab(nTab, "Test");
9200 
9201     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
9202     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
9203     m_pDoc->SetValue(1, 0, nTab, 11.0); // B1
9204     m_pDoc->SetValue(1, 1, nTab, 12.0); // B2
9205     m_pDoc->SetValue(2, 0, nTab, 21.0); // C1
9206     m_pDoc->SetValue(2, 1, nTab, 22.0); // C2
9207 
9208     m_pDoc->SetString(0, 3, nTab, "=A1"); // A4
9209     m_pDoc->SetString(0, 4, nTab, "=A2"); // A5
9210     m_pDoc->SetString(1, 3, nTab, "=B1"); // B4
9211     m_pDoc->SetString(1, 4, nTab, "=B2"); // B5
9212     m_pDoc->SetString(2, 3, nTab, "=C1"); // C4
9213     m_pDoc->SetString(2, 4, nTab, "=C2"); // C5
9214 
9215     // Check precondition
9216     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
9217     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
9218     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 3, nTab));
9219     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(1, 4, nTab));
9220     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(2, 3, nTab));
9221     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 4, nTab));
9222 
9223     printRange(m_pDoc, ScRange(0, 0, nTab, 2, 1, nTab), "Values");
9224     printRange(m_pDoc, ScRange(0, 3, nTab, 2, 4, nTab), "Formulas");
9225     printFormula(m_pDoc, 0, 4, nTab);
9226 
9227     // Cut formulas A4:B5 to the clip document.
9228     ScDocument aClipDoc(SCDOCMODE_CLIP);
9229     ScRange aSrcRange(0, 3, nTab, 2, 4, nTab);
9230     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
9231 
9232     // To B7:C9
9233     ScRange aDestRange(1, 6, nTab, 2, 8, nTab);
9234     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
9235 
9236     // Transpose
9237     ScDocument* pOrigClipDoc = &aClipDoc;
9238     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
9239     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
9240     aDestMark.SetMarkArea(aDestRange);
9241     // Paste
9242     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
9243                          true, false, true, false);
9244     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
9245     pTransClip.reset();
9246 
9247     printRange(m_pDoc, aDestRange, "Formulas after cut transposed");
9248     printFormula(m_pDoc, 2, 6, nTab);
9249 
9250     // Check results
9251     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(1, 6, nTab));
9252     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 6, nTab));
9253     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(1, 7, nTab));
9254     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(2, 7, nTab));
9255     CPPUNIT_ASSERT_EQUAL(21.0, m_pDoc->GetValue(1, 8, nTab));
9256     CPPUNIT_ASSERT_EQUAL(22.0, m_pDoc->GetValue(2, 8, nTab));
9257 
9258     CPPUNIT_ASSERT_EQUAL(OUString("=A1"), getFormula(1, 6, nTab));
9259     CPPUNIT_ASSERT_EQUAL(OUString("=A2"), getFormula(2, 6, nTab));
9260     CPPUNIT_ASSERT_EQUAL(OUString("=B1"), getFormula(1, 7, nTab));
9261     CPPUNIT_ASSERT_EQUAL(OUString("=B2"), getFormula(2, 7, nTab));
9262     CPPUNIT_ASSERT_EQUAL(OUString("=C1"), getFormula(1, 8, nTab));
9263     CPPUNIT_ASSERT_EQUAL(OUString("=C2"), getFormula(2, 8, nTab));
9264 }
9265 
testTdf142065()9266 void TestCopyPaste::testTdf142065()
9267 {
9268     const SCTAB nTab = 0;
9269     m_pDoc->InsertTab(nTab, "Test");
9270 
9271     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
9272     m_pDoc->SetString(1, 0, nTab, "=A1"); // B1
9273     m_pDoc->SetString(2, 0, nTab, "=SUM(A1:B1)"); // C1
9274     m_pDoc->SetString(3, 0, nTab, "=$A$1"); // D1
9275     m_pDoc->SetString(4, 0, nTab, "=$A1"); // E1
9276     m_pDoc->SetString(5, 0, nTab, "=A$1"); // F1
9277 
9278     // Check precondition
9279     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(2, 0, nTab));
9280 
9281     // Cut A1:F1 to the clip document.
9282     ScDocument aClipDoc(SCDOCMODE_CLIP);
9283     ScRange aSrcRange(0, 0, nTab, 5, 0, nTab);
9284     printRange(m_pDoc, aSrcRange, "Src sheet");
9285     printFormula(m_pDoc, 1, 0, nTab);
9286     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
9287     printRange(&aClipDoc, aSrcRange, "clip doc (&aClipDoc)");
9288     printFormula(&aClipDoc, 1, 0, nTab);
9289 
9290     // To A3:A9
9291     ScRange aDestRange(0, 2, nTab, 0, 7, nTab);
9292     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
9293 
9294     // Transpose
9295     ScDocument* pOrigClipDoc = &aClipDoc;
9296     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
9297     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
9298     printRange(pTransClip.get(), ScRange(0, 0, nTab, 0, 1, nTab),
9299                "transposed clip doc (pTransClip.get())");
9300     printFormula(pTransClip.get(), 0, 1, nTab);
9301     printFormula(pTransClip.get(), 1, 0, nTab);
9302     aDestMark.SetMarkArea(aDestRange);
9303     // Paste
9304     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
9305                          true, false, true, false);
9306     printRange(m_pDoc, aDestRange, "dest doc");
9307     printFormula(m_pDoc, 0, 3, nTab);
9308     printRange(pOrigClipDoc, aSrcRange, "orig clip doc (pOrigClipDoc)");
9309     printFormula(pOrigClipDoc, 1, 0, nTab);
9310     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
9311     pTransClip.reset();
9312     printRange(m_pDoc, aDestRange, "dest doc after UpdateTranspose()");
9313     printFormula(m_pDoc, 0, 3, nTab);
9314 
9315     // Check results
9316     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 2, nTab));
9317     // Without the fix in place, this would have failed with
9318     // - Expected: =A3
9319     // - Actual  : =#REF!#REF!
9320     CPPUNIT_ASSERT_EQUAL(OUString("=A3"), getFormula(0, 3, nTab));
9321     // Without the fix in place, this would have failed with
9322     // - Expected: 1
9323     // - Actual  : #REF!
9324     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 3, nTab));
9325     // Without the fix in place, this would have failed with
9326     // - Expected: =SUM(A3:A4)
9327     // - Actual  : =SUM(#REF!#REF!:#REF!#REF!)
9328     CPPUNIT_ASSERT_EQUAL(OUString("=SUM(A3:A4)"), getFormula(0, 4, nTab));
9329     // Without the fix in place, this would have failed with
9330     // - Expected: 2
9331     // - Actual  : #REF!
9332     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 4, nTab));
9333 
9334     CPPUNIT_ASSERT_EQUAL(OUString("=$A$3"), getFormula(0, 5, nTab));
9335     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 5, nTab));
9336 
9337     CPPUNIT_ASSERT_EQUAL(OUString("=$A3"), getFormula(0, 6, nTab));
9338     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 6, nTab));
9339 
9340     CPPUNIT_ASSERT_EQUAL(OUString("=A$3"), getFormula(0, 7, nTab));
9341     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 7, nTab));
9342 }
9343 
testCopyPasteMultiRange()9344 void TestCopyPaste::testCopyPasteMultiRange()
9345 {
9346     m_pDoc->InsertTab(0, "Test");
9347 
9348     // Fill A2:B6 with numbers.
9349     for (SCROW nRow = 1; nRow <= 5; ++nRow)
9350     {
9351         for (SCCOL nCol = 0; nCol <= 1; ++nCol)
9352         {
9353             ScAddress aPos(nCol, nRow, 0);
9354             m_pDoc->SetValue(aPos, nRow + nCol);
9355         }
9356     }
9357 
9358     // Fill D9:E11 with numbers.
9359     for (SCROW nRow = 8; nRow <= 10; ++nRow)
9360     {
9361         for (SCCOL nCol = 3; nCol <= 4; ++nCol)
9362         {
9363             ScAddress aPos(nCol, nRow, 0);
9364             m_pDoc->SetValue(aPos, 10.0);
9365         }
9366     }
9367 
9368     ScMarkData aMark(m_pDoc->GetSheetLimits());
9369     aMark.SelectOneTable(0);
9370 
9371     // Copy A2:B2, A4:B4, and A6:B6 to clipboard.
9372     ScDocument aClipDoc(SCDOCMODE_CLIP);
9373     ScClipParam aClipParam;
9374     aClipParam.maRanges.push_back(ScRange(0, 1, 0, 1, 1, 0)); // A2:B2
9375     aClipParam.maRanges.push_back(ScRange(0, 3, 0, 1, 3, 0)); // A4:B4
9376     aClipParam.maRanges.push_back(ScRange(0, 5, 0, 1, 5, 0)); // A6:B6
9377     aClipParam.meDirection = ScClipParam::Row;
9378     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
9379 
9380     // Paste to D9:E11, and make sure it won't crash (rhbz#1080196).
9381     m_pDoc->CopyMultiRangeFromClip(ScAddress(3, 8, 0), aMark, InsertDeleteFlags::CONTENTS,
9382                                    &aClipDoc);
9383     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(3, 8, 0)));
9384     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(4, 8, 0)));
9385     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(ScAddress(3, 9, 0)));
9386     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(ScAddress(4, 9, 0)));
9387     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(3, 10, 0)));
9388     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(4, 10, 0)));
9389 
9390     m_pDoc->DeleteTab(0);
9391 }
9392 
testCopyPasteSkipEmpty()9393 void TestCopyPaste::testCopyPasteSkipEmpty()
9394 {
9395     struct Check
9396     {
9397         const char* mpStr;
9398         Color maColor;
9399         bool mbHasNote;
9400     };
9401 
9402     struct TestRange
9403     {
9404         ScDocument* mpDoc;
9405 
9406         explicit TestRange(ScDocument* pDoc)
9407             : mpDoc(pDoc)
9408         {
9409         }
9410 
9411         bool checkRange(const ScAddress& rPos, const Check* p, const Check* pEnd)
9412         {
9413             ScAddress aPos(rPos);
9414             OUString aPosStr = aPos.Format(ScRefFlags::VALID);
9415             for (; p != pEnd; ++p, aPos.IncRow())
9416             {
9417                 if (!mpDoc->GetString(aPos).equalsAscii(p->mpStr))
9418                 {
9419                     cerr << aPosStr << ": incorrect string value: expected='" << p->mpStr
9420                          << "' actual='" << mpDoc->GetString(aPos) << endl;
9421                     return false;
9422                 }
9423 
9424                 const SvxBrushItem* pBrush = mpDoc->GetAttr(aPos, ATTR_BACKGROUND);
9425                 if (!pBrush)
9426                 {
9427                     cerr << aPosStr << ": failed to get brush item from the cell." << endl;
9428                     return false;
9429                 }
9430 
9431                 if (pBrush->GetColor() != p->maColor)
9432                 {
9433                     Color aExpected = p->maColor;
9434                     Color aActual = pBrush->GetColor();
9435                     cerr << aPosStr << ": incorrect cell background color: expected=("
9436                          << static_cast<int>(aExpected.GetRed()) << ","
9437                          << static_cast<int>(aExpected.GetGreen()) << ","
9438                          << static_cast<int>(aExpected.GetBlue()) << "), actual=("
9439                          << static_cast<int>(aActual.GetRed()) << ","
9440                          << static_cast<int>(aActual.GetGreen()) << ","
9441                          << static_cast<int>(aActual.GetBlue()) << ")" << endl;
9442 
9443                     return false;
9444                 }
9445 
9446                 bool bHasNote = mpDoc->HasNote(aPos);
9447                 if (bHasNote != p->mbHasNote)
9448                 {
9449                     cerr << aPosStr << ": ";
9450                     if (p->mbHasNote)
9451                         cerr << "this cell should have a cell note, but doesn't." << endl;
9452                     else
9453                         cerr << "this cell should NOT have a cell note, but one is found." << endl;
9454 
9455                     return false;
9456                 }
9457             }
9458 
9459             return true;
9460         }
9461 
9462     } aTest(m_pDoc);
9463 
9464     m_pDoc->InsertTab(0, "Test");
9465     m_pDoc->InitDrawLayer(m_xDocShell.get()); // for cell note objects.
9466 
9467     ScRange aSrcRange(0, 0, 0, 0, 4, 0);
9468     ScRange aDestRange(1, 0, 0, 1, 4, 0);
9469 
9470     ScMarkData aMark(m_pDoc->GetSheetLimits());
9471     aMark.SetMarkArea(aDestRange);
9472 
9473     // Put some texts in B1:B5.
9474     m_pDoc->SetString(ScAddress(1, 0, 0), "A");
9475     m_pDoc->SetString(ScAddress(1, 1, 0), "B");
9476     m_pDoc->SetString(ScAddress(1, 2, 0), "C");
9477     m_pDoc->SetString(ScAddress(1, 3, 0), "D");
9478     m_pDoc->SetString(ScAddress(1, 4, 0), "E");
9479 
9480     // Set the background color of B1:B5 to blue.
9481     ScPatternAttr aCellBackColor(m_pDoc->GetPool());
9482     aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND));
9483     m_pDoc->ApplyPatternAreaTab(1, 0, 1, 4, 0, aCellBackColor);
9484 
9485     // Insert notes to B1:B5.
9486     m_pDoc->GetOrCreateNote(ScAddress(1, 0, 0));
9487     m_pDoc->GetOrCreateNote(ScAddress(1, 1, 0));
9488     m_pDoc->GetOrCreateNote(ScAddress(1, 2, 0));
9489     m_pDoc->GetOrCreateNote(ScAddress(1, 3, 0));
9490     m_pDoc->GetOrCreateNote(ScAddress(1, 4, 0));
9491 
9492     // Prepare a clipboard content interleaved with empty cells.
9493     ScDocument aClipDoc(SCDOCMODE_CLIP);
9494     aClipDoc.ResetClip(m_pDoc, &aMark);
9495     ScClipParam aParam(aSrcRange, false);
9496     aClipDoc.SetClipParam(aParam);
9497     aClipDoc.SetString(ScAddress(0, 0, 0), "Clip1");
9498     aClipDoc.SetString(ScAddress(0, 2, 0), "Clip2");
9499     aClipDoc.SetString(ScAddress(0, 4, 0), "Clip3");
9500 
9501     // Set the background color of A1:A5 to yellow.
9502     aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_YELLOW, ATTR_BACKGROUND));
9503     aClipDoc.ApplyPatternAreaTab(0, 0, 0, 4, 0, aCellBackColor);
9504 
9505     CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0, 0, 0)));
9506     CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, aClipDoc.GetCellType(ScAddress(0, 1, 0)));
9507     CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0, 2, 0)));
9508     CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, aClipDoc.GetCellType(ScAddress(0, 3, 0)));
9509     CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, aClipDoc.GetCellType(ScAddress(0, 4, 0)));
9510 
9511     // Check the initial condition.
9512     {
9513         static const Check aChecks[] = {
9514             { "A", COL_BLUE, true }, { "B", COL_BLUE, true }, { "C", COL_BLUE, true },
9515             { "D", COL_BLUE, true }, { "E", COL_BLUE, true },
9516         };
9517 
9518         bool bRes
9519             = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks));
9520         CPPUNIT_ASSERT_MESSAGE("Initial check failed.", bRes);
9521     }
9522 
9523     // Create undo document.
9524     ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO));
9525     pUndoDoc->InitUndo(*m_pDoc, 0, 0);
9526     m_pDoc->CopyToDocument(aDestRange, InsertDeleteFlags::ALL, false, *pUndoDoc, &aMark);
9527 
9528     // Paste clipboard content onto A1:A5 but skip empty cells.
9529     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, pUndoDoc.get(), &aClipDoc, true,
9530                          false, false, true /*bSkipEmpty*/);
9531 
9532     // Create redo document.
9533     ScDocumentUniquePtr pRedoDoc(new ScDocument(SCDOCMODE_UNDO));
9534     pRedoDoc->InitUndo(*m_pDoc, 0, 0);
9535     m_pDoc->CopyToDocument(aDestRange, InsertDeleteFlags::ALL, false, *pRedoDoc, &aMark);
9536 
9537     // Create an undo object for this.
9538     std::unique_ptr<ScRefUndoData> pRefUndoData(new ScRefUndoData(m_pDoc));
9539     ScUndoPaste aUndo(m_xDocShell.get(), aDestRange, aMark, std::move(pUndoDoc),
9540                       std::move(pRedoDoc), InsertDeleteFlags::ALL, std::move(pRefUndoData));
9541 
9542     // Check the content after the paste.
9543     {
9544         static const Check aChecks[] = {
9545             { "Clip1", COL_YELLOW, false }, { "B", COL_BLUE, true },
9546             { "Clip2", COL_YELLOW, false }, { "D", COL_BLUE, true },
9547             { "Clip3", COL_YELLOW, false },
9548         };
9549 
9550         bool bRes
9551             = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks));
9552         CPPUNIT_ASSERT_MESSAGE("Check after paste failed.", bRes);
9553     }
9554 
9555     // Undo, and check the content.
9556     aUndo.Undo();
9557     {
9558         static const Check aChecks[] = {
9559             { "A", COL_BLUE, true }, { "B", COL_BLUE, true }, { "C", COL_BLUE, true },
9560             { "D", COL_BLUE, true }, { "E", COL_BLUE, true },
9561         };
9562 
9563         bool bRes
9564             = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks));
9565         CPPUNIT_ASSERT_MESSAGE("Check after undo failed.", bRes);
9566     }
9567 
9568     // Redo, and check the content again.
9569     aUndo.Redo();
9570     {
9571         static const Check aChecks[] = {
9572             { "Clip1", COL_YELLOW, false }, { "B", COL_BLUE, true },
9573             { "Clip2", COL_YELLOW, false }, { "D", COL_BLUE, true },
9574             { "Clip3", COL_YELLOW, false },
9575         };
9576 
9577         bool bRes
9578             = aTest.checkRange(ScAddress(1, 0, 0), aChecks, aChecks + SAL_N_ELEMENTS(aChecks));
9579         CPPUNIT_ASSERT_MESSAGE("Check after redo failed.", bRes);
9580     }
9581 
9582     m_pDoc->DeleteTab(0);
9583 }
9584 
testCopyPasteSkipEmpty2()9585 void TestCopyPaste::testCopyPasteSkipEmpty2()
9586 {
9587     m_pDoc->InsertTab(0, "Test");
9588 
9589     m_pDoc->SetString(ScAddress(0, 0, 0), "A");
9590     m_pDoc->SetString(ScAddress(2, 0, 0), "C");
9591 
9592     // Copy A1:C1 to clipboard.
9593     ScDocument aClipDoc(SCDOCMODE_CLIP);
9594     aClipDoc.ResetClip(m_pDoc, static_cast<SCTAB>(0));
9595     copyToClip(m_pDoc, ScRange(0, 0, 0, 2, 0, 0), &aClipDoc);
9596 
9597     // Paste to A3 with the skip empty option set.  This used to freeze. (fdo#77735)
9598     ScRange aDestRange(0, 2, 0, 2, 2, 0);
9599     ScMarkData aMark(m_pDoc->GetSheetLimits());
9600     aMark.SetMarkArea(aDestRange);
9601     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false,
9602                          false, true, true);
9603 
9604     CPPUNIT_ASSERT_EQUAL(OUString("A"), m_pDoc->GetString(ScAddress(0, 2, 0)));
9605     CPPUNIT_ASSERT_EQUAL_MESSAGE("B3 should be empty.", CELLTYPE_NONE,
9606                                  m_pDoc->GetCellType(ScAddress(1, 2, 0)));
9607     CPPUNIT_ASSERT_EQUAL(OUString("C"), m_pDoc->GetString(ScAddress(2, 2, 0)));
9608 
9609     m_pDoc->DeleteTab(0);
9610 }
9611 
testCutPasteRefUndo()9612 void TestCopyPaste::testCutPasteRefUndo()
9613 {
9614     // Testing scenario: A2 references B2, and B2 gets cut and pasted onto C2,
9615     // which updates A2's formula to reference C2. Then the paste action gets
9616     // undone, which should also undo A2's formula to reference back to B2.
9617 
9618     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
9619 
9620     m_pDoc->InsertTab(0, "Test");
9621 
9622     // A2 references B2.
9623     m_pDoc->SetString(ScAddress(0, 1, 0), "=B2");
9624 
9625     ScMarkData aMark(m_pDoc->GetSheetLimits());
9626     aMark.SelectOneTable(0);
9627 
9628     // Set up clip document for cutting of B2.
9629     ScDocument aClipDoc(SCDOCMODE_CLIP);
9630     aClipDoc.ResetClip(m_pDoc, &aMark);
9631     ScClipParam aParam(ScAddress(1, 1, 0), true);
9632     aClipDoc.SetClipParam(aParam);
9633     aClipDoc.SetValue(ScAddress(1, 1, 0), 12.0);
9634 
9635     // Set up undo document for reference update.
9636     ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO));
9637     pUndoDoc->InitUndo(*m_pDoc, 0, 0);
9638 
9639     // Do the pasting of 12 into C2.  This should update A2 to reference C2.
9640     m_pDoc->CopyFromClip(ScAddress(2, 1, 0), aMark, InsertDeleteFlags::CONTENTS, pUndoDoc.get(),
9641                          &aClipDoc);
9642     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(0, 1, 0));
9643 
9644     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 0), "C2", "A2 should be referencing C2.");
9645 
9646     // At this point, the ref undo document should contain a formula cell at A2 that references B2.
9647     ASSERT_FORMULA_EQUAL(*pUndoDoc, ScAddress(0, 1, 0), "B2",
9648                          "A2 in the undo document should be referencing B2.");
9649 
9650     ScUndoPaste aUndo(m_xDocShell.get(), ScRange(2, 1, 0), aMark, std::move(pUndoDoc), nullptr,
9651                       InsertDeleteFlags::CONTENTS, nullptr, false, nullptr);
9652     aUndo.Undo();
9653 
9654     // Now A2 should be referencing B2 once again.
9655     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 0), "B2",
9656                          "A2 should be referencing B2 after undo.");
9657 
9658     m_pDoc->DeleteTab(0);
9659 }
9660 
testCutPasteGroupRefUndo()9661 void TestCopyPaste::testCutPasteGroupRefUndo()
9662 {
9663     // Test that Cut&Paste part of a grouped formula adjusts references
9664     // correctly and Undo works.
9665 
9666     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
9667 
9668     m_pDoc->InsertTab(0, "Test");
9669 
9670     // Formula data in A1:A9
9671     std::vector<std::vector<const char*>> aData
9672         = { { "1" },      { "=A1+A1" }, { "=A2+A1" }, { "=A3+A2" }, { "=A4+A3" },
9673             { "=A5+A4" }, { "=A6+A5" }, { "=A7+A6" }, { "=A8+A7" } };
9674 
9675     ScAddress aPos(0, 0, 0);
9676     ScRange aDataRange = insertRangeData(m_pDoc, aPos, aData);
9677     CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to insert data", aPos, aDataRange.aStart);
9678 
9679     // Check initial data.
9680     const char* aDataCheck[][2] = { { "1", "" },        { "2", "=A1+A1" },  { "3", "=A2+A1" },
9681                                     { "5", "=A3+A2" },  { "8", "=A4+A3" },  { "13", "=A5+A4" },
9682                                     { "21", "=A6+A5" }, { "34", "=A7+A6" }, { "55", "=A8+A7" } };
9683     for (size_t i = 0; i < SAL_N_ELEMENTS(aDataCheck); ++i)
9684     {
9685         OUString aString = m_pDoc->GetString(0, i, 0);
9686         CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial data failure",
9687                                      OUString::createFromAscii(aDataCheck[i][0]), aString);
9688         m_pDoc->GetFormula(0, i, 0, aString);
9689         CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial formula failure",
9690                                      OUString::createFromAscii(aDataCheck[i][1]), aString);
9691     }
9692 
9693     ScMarkData aMark(m_pDoc->GetSheetLimits());
9694     aMark.SelectOneTable(0);
9695 
9696     // Set up clip document.
9697     ScDocument aClipDoc(SCDOCMODE_CLIP);
9698     aClipDoc.ResetClip(m_pDoc, &aMark);
9699     // Cut A4:A6 to clipboard with Undo.
9700     std::unique_ptr<ScUndoCut> pUndoCut(
9701         cutToClip(*m_xDocShell, ScRange(0, 3, 0, 0, 5, 0), &aClipDoc, true));
9702 
9703     // Check data after Cut.
9704     const char* aCutCheck[] = { "1", "2", "3", "", "", "", "0", "0", "0" };
9705     for (size_t i = 0; i < SAL_N_ELEMENTS(aCutCheck); ++i)
9706     {
9707         OUString aString = m_pDoc->GetString(0, i, 0);
9708         CPPUNIT_ASSERT_EQUAL_MESSAGE("Cut data failure", OUString::createFromAscii(aCutCheck[i]),
9709                                      aString);
9710     }
9711 
9712     // Paste to B5:B7 with Undo.
9713     ScRange aPasteRange(1, 4, 0, 1, 6, 0);
9714     aMark.SetMarkArea(aPasteRange);
9715     ScDocument* pPasteUndoDoc = new ScDocument(SCDOCMODE_UNDO);
9716     pPasteUndoDoc->InitUndoSelected(*m_pDoc, aMark);
9717     std::unique_ptr<ScUndoPaste> pUndoPaste(
9718         createUndoPaste(*m_xDocShell, aPasteRange, ScDocumentUniquePtr(pPasteUndoDoc)));
9719     m_pDoc->CopyFromClip(aPasteRange, aMark, InsertDeleteFlags::ALL, pPasteUndoDoc, &aClipDoc);
9720 
9721     // Check data after Paste.
9722     const char* aPasteCheck[][4] = { { "1", "", "", "" },
9723                                      { "2", "", "=A1+A1", "" },
9724                                      { "3", "", "=A2+A1", "" },
9725                                      { "", "", "", "" },
9726                                      { "", "5", "", "=A3+A2" },
9727                                      { "", "8", "", "=B5+A3" },
9728                                      { "21", "13", "=B7+B6", "=B6+B5" },
9729                                      { "34", "", "=A7+B7", "" },
9730                                      { "55", "", "=A8+A7", "" } };
9731     for (size_t i = 0; i < SAL_N_ELEMENTS(aPasteCheck); ++i)
9732     {
9733         for (size_t j = 0; j < 2; ++j)
9734         {
9735             OUString aString = m_pDoc->GetString(j, i, 0);
9736             CPPUNIT_ASSERT_EQUAL_MESSAGE("Paste data failure",
9737                                          OUString::createFromAscii(aPasteCheck[i][j]), aString);
9738             m_pDoc->GetFormula(j, i, 0, aString);
9739             CPPUNIT_ASSERT_EQUAL_MESSAGE("Paste formula failure",
9740                                          OUString::createFromAscii(aPasteCheck[i][2 + j]), aString);
9741         }
9742     }
9743 
9744     // Undo Paste and check, must be same as after Cut.
9745     pUndoPaste->Undo();
9746     for (size_t i = 0; i < SAL_N_ELEMENTS(aCutCheck); ++i)
9747     {
9748         OUString aString = m_pDoc->GetString(0, i, 0);
9749         CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Paste data failure",
9750                                      OUString::createFromAscii(aCutCheck[i]), aString);
9751     }
9752 
9753     // Undo Cut and check, must be initial data.
9754     pUndoCut->Undo();
9755     for (size_t i = 0; i < SAL_N_ELEMENTS(aDataCheck); ++i)
9756     {
9757         OUString aString = m_pDoc->GetString(0, i, 0);
9758         CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Cut data failure",
9759                                      OUString::createFromAscii(aDataCheck[i][0]), aString);
9760         m_pDoc->GetFormula(0, i, 0, aString);
9761         CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo Cut formula failure",
9762                                      OUString::createFromAscii(aDataCheck[i][1]), aString);
9763     }
9764 
9765     m_pDoc->DeleteTab(0);
9766 }
9767 
testMoveRefBetweenSheets()9768 void TestCopyPaste::testMoveRefBetweenSheets()
9769 {
9770     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
9771 
9772     m_pDoc->InsertTab(0, "Test1");
9773     m_pDoc->InsertTab(1, "Test2");
9774 
9775     m_pDoc->SetValue(ScAddress(0, 0, 0), 12.0);
9776     m_pDoc->SetValue(ScAddress(1, 0, 0), 10.0);
9777     m_pDoc->SetValue(ScAddress(2, 0, 0), 8.0);
9778     m_pDoc->SetString(ScAddress(0, 1, 0), "=A1");
9779     m_pDoc->SetString(ScAddress(0, 2, 0), "=SUM(A1:C1)");
9780 
9781     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0, 0, 0)));
9782     CPPUNIT_ASSERT_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0, 1, 0)));
9783     CPPUNIT_ASSERT_EQUAL(30.0, m_pDoc->GetValue(ScAddress(0, 2, 0)));
9784 
9785     // These formulas should not display the sheet name.
9786     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 0), "A1", "Wrong formula!");
9787     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 2, 0), "SUM(A1:C1)", "Wrong formula!");
9788 
9789     // Move Test1.A2:A3 to Test2.A2:A3.
9790     ScDocFunc& rFunc = m_xDocShell->GetDocFunc();
9791     bool bMoved
9792         = rFunc.MoveBlock(ScRange(0, 1, 0, 0, 2, 0), ScAddress(0, 1, 1), true, true, false, true);
9793     CPPUNIT_ASSERT(bMoved);
9794 
9795     CPPUNIT_ASSERT_EQUAL_MESSAGE("This cell should be empty after the move.", CELLTYPE_NONE,
9796                                  m_pDoc->GetCellType(ScAddress(0, 1, 0)));
9797     ASSERT_DOUBLES_EQUAL(12.0, m_pDoc->GetValue(ScAddress(0, 1, 1)));
9798     ASSERT_DOUBLES_EQUAL(30.0, m_pDoc->GetValue(ScAddress(0, 2, 1)));
9799 
9800     // The reference in the pasted formula should display sheet name after the move.
9801     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, 1), "Test1.A1", "Wrong formula!");
9802     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 2, 1), "SUM(Test1.A1:C1)", "Wrong formula!");
9803 
9804     m_pDoc->DeleteTab(1);
9805     m_pDoc->DeleteTab(0);
9806 }
9807 
testUndoCut()9808 void TestCopyPaste::testUndoCut()
9809 {
9810     m_pDoc->InsertTab(0, "Test");
9811 
9812     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
9813 
9814     // Insert values into A1:A3.
9815     m_pDoc->SetValue(ScAddress(0, 0, 0), 1.0);
9816     m_pDoc->SetValue(ScAddress(0, 1, 0), 10.0);
9817     m_pDoc->SetValue(ScAddress(0, 2, 0), 100.0);
9818 
9819     // SUM in A4.
9820     m_pDoc->SetString(ScAddress(0, 3, 0), "=SUM(A1:A3)");
9821     CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0, 3, 0));
9822 
9823     // Select A1:A3.
9824     ScMarkData aMark(m_pDoc->GetSheetLimits());
9825     ScRange aRange(0, 0, 0, 0, 2, 0);
9826     aMark.SetMarkArea(aRange);
9827     aMark.MarkToMulti();
9828 
9829     // Set up an undo object for cutting A1:A3.
9830     ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO));
9831     pUndoDoc->InitUndo(*m_pDoc, 0, 0);
9832     m_pDoc->CopyToDocument(aRange, InsertDeleteFlags::ALL, false, *pUndoDoc);
9833     ASSERT_DOUBLES_EQUAL(1.0, pUndoDoc->GetValue(ScAddress(0, 0, 0)));
9834     ASSERT_DOUBLES_EQUAL(10.0, pUndoDoc->GetValue(ScAddress(0, 1, 0)));
9835     ASSERT_DOUBLES_EQUAL(100.0, pUndoDoc->GetValue(ScAddress(0, 2, 0)));
9836     ScUndoCut aUndo(m_xDocShell.get(), aRange, aRange.aEnd, aMark, std::move(pUndoDoc));
9837 
9838     // "Cut" the selection.
9839     m_pDoc->DeleteSelection(InsertDeleteFlags::ALL, aMark);
9840     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(0, 3, 0)); // The SUM should be zero after the "cut".
9841 
9842     // Undo it, and check the result.
9843     aUndo.Undo();
9844     ASSERT_DOUBLES_EQUAL(1.0, m_pDoc->GetValue(ScAddress(0, 0, 0)));
9845     ASSERT_DOUBLES_EQUAL(10.0, m_pDoc->GetValue(ScAddress(0, 1, 0)));
9846     ASSERT_DOUBLES_EQUAL(100.0, m_pDoc->GetValue(ScAddress(0, 2, 0)));
9847     ASSERT_DOUBLES_EQUAL(
9848         111.0, m_pDoc->GetValue(0, 3, 0)); // The SUM value should be back to the original.
9849 
9850     // Redo it and check.
9851     aUndo.Redo();
9852     ASSERT_DOUBLES_EQUAL(0.0, m_pDoc->GetValue(0, 3, 0));
9853 
9854     // Undo again.
9855     aUndo.Undo();
9856     ASSERT_DOUBLES_EQUAL(111.0, m_pDoc->GetValue(0, 3, 0));
9857 
9858     m_pDoc->DeleteTab(0);
9859 }
9860 
testMoveBlock()9861 void TestCopyPaste::testMoveBlock()
9862 {
9863     m_pDoc->InsertTab(0, "SheetNotes");
9864 
9865     // We need a drawing layer in order to create caption objects.
9866     m_pDoc->InitDrawLayer(m_xDocShell.get());
9867 
9868     m_pDoc->SetValue(0, 0, 0, 1);
9869     m_pDoc->SetString(1, 0, 0, "=A1+1");
9870     m_pDoc->SetString(2, 0, 0, "test");
9871 
9872     // add notes to A1:C1
9873     ScAddress aAddrA1 = setNote(0, 0, 0, "Hello world in A1");
9874     ScAddress aAddrB1 = setNote(1, 0, 0, "Hello world in B1");
9875     ScAddress aAddrC1 = setNote(2, 0, 0, "Hello world in C1");
9876     ScAddress aAddrD1(3, 0, 0);
9877 
9878     // previous tests on cell note content are ok. this one fails !!! :(
9879     //CPPUNIT_ASSERT_MESSAGE("Note content in B1 before move block", m_pDoc->GetNote(aAddrB1)->GetText() == aHelloB1);
9880 
9881     // move notes to B1:D1
9882     ScDocFunc& rDocFunc = m_xDocShell->GetDocFunc();
9883     bool bMoveDone = rDocFunc.MoveBlock(ScRange(0, 0, 0, 2, 0, 0), ScAddress(1, 0, 0),
9884                                         true /*bCut*/, false, false, false);
9885 
9886     CPPUNIT_ASSERT_MESSAGE("Cells not moved", bMoveDone);
9887 
9888     //check cell content
9889     OUString aString = m_pDoc->GetString(3, 0, 0);
9890     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell D1 should contain: test", OUString("test"), aString);
9891     m_pDoc->GetFormula(2, 0, 0, aString);
9892     CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell C1 should contain an updated formula", OUString("=B1+1"),
9893                                  aString);
9894     double fValue = m_pDoc->GetValue(aAddrB1);
9895     ASSERT_DOUBLES_EQUAL_MESSAGE("Cell B1 should contain 1", fValue, 1);
9896 
9897     // cell notes has been moved 1 cell right (event when overlapping)
9898     CPPUNIT_ASSERT_MESSAGE("There should be NO note on A1", !m_pDoc->HasNote(aAddrA1));
9899     CPPUNIT_ASSERT_MESSAGE("There should be a note on B1", m_pDoc->HasNote(aAddrB1));
9900     CPPUNIT_ASSERT_MESSAGE("There should be a note on C1", m_pDoc->HasNote(aAddrC1));
9901     CPPUNIT_ASSERT_MESSAGE("There should be a note on D1", m_pDoc->HasNote(aAddrD1));
9902     /* still failing, wrong content ???
9903     OUString sNoteText;
9904     sNoteText =  m_pDoc->GetNote(aAddrB1)->GetText();
9905     CPPUNIT_ASSERT_MESSAGE("Note content in B1", sNoteText == aHelloA1);
9906     sNoteText =  m_pDoc->GetNote(aAddrC1)->GetText();
9907     CPPUNIT_ASSERT_MESSAGE("Note content in C1", sNoteText == aHelloB1);
9908     sNoteText =  m_pDoc->GetNote(aAddrD1)->GetText();
9909     CPPUNIT_ASSERT_MESSAGE("Note content in D1", sNoteText == aHelloC1);
9910     */
9911 
9912     m_pDoc->DeleteTab(0);
9913 }
9914 
testCopyPasteRelativeFormula()9915 void TestCopyPaste::testCopyPasteRelativeFormula()
9916 {
9917     m_pDoc->InsertTab(0, "Formula");
9918 
9919     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true);
9920 
9921     // Insert values to A2 and A4.
9922     m_pDoc->SetValue(ScAddress(0, 1, 0), 1);
9923     m_pDoc->SetValue(ScAddress(0, 3, 0), 2);
9924 
9925     // Insert formula to B4.
9926     m_pDoc->SetString(ScAddress(1, 3, 0), "=A4");
9927     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(1, 3, 0)));
9928 
9929     // Select and copy B3:B4 to the clipboard.
9930     ScRange aRange(1, 2, 0, 1, 3, 0);
9931     ScClipParam aClipParam(aRange, false);
9932     ScMarkData aMark(m_pDoc->GetSheetLimits());
9933     aMark.SetMarkArea(aRange);
9934     ScDocument aClipDoc(SCDOCMODE_CLIP);
9935     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
9936 
9937     // Paste it to B1:B2.
9938     InsertDeleteFlags nFlags = InsertDeleteFlags::ALL;
9939     ScRange aDestRange(1, 0, 0, 1, 1, 0);
9940     aMark.SetMarkArea(aDestRange);
9941     m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, nullptr, &aClipDoc);
9942 
9943     // B2 references A2, so the value should be 1.
9944     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(1, 1, 0)));
9945 
9946     // Clear content and start over.
9947     clearSheet(m_pDoc, 0);
9948     clearSheet(&aClipDoc, 0);
9949 
9950     // Insert a single formula cell in A1.
9951     m_pDoc->SetString(ScAddress(0, 0, 0), "=ROW()");
9952     const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(0, 0, 0));
9953     CPPUNIT_ASSERT(pFC);
9954     CPPUNIT_ASSERT(!pFC->IsShared()); // single formula cell is never shared.
9955 
9956     // Copy A1 to clipboard.
9957     aClipParam = ScClipParam(ScAddress(0, 0, 0), false);
9958     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
9959 
9960     pFC = aClipDoc.GetFormulaCell(ScAddress(0, 0, 0));
9961     CPPUNIT_ASSERT(pFC);
9962     CPPUNIT_ASSERT(!pFC->IsShared());
9963 
9964     // Paste to A3.
9965     aDestRange = ScRange(0, 2, 0, 0, 2, 0);
9966     aMark.SetMarkArea(aDestRange);
9967     m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, nullptr, &aClipDoc);
9968 
9969     pFC = m_pDoc->GetFormulaCell(ScAddress(0, 2, 0));
9970     CPPUNIT_ASSERT(pFC);
9971     CPPUNIT_ASSERT(!pFC->IsShared());
9972 
9973     // Delete A3 and make sure it doesn't crash (see fdo#76132).
9974     clearRange(m_pDoc, ScAddress(0, 2, 0));
9975     CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(ScAddress(0, 2, 0)));
9976 
9977     m_pDoc->DeleteTab(0);
9978 }
9979 
testCopyPasteRepeatOneFormula()9980 void TestCopyPaste::testCopyPasteRepeatOneFormula()
9981 {
9982     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true);
9983 
9984     m_pDoc->InsertTab(0, "Test");
9985 
9986     ScDocument aClipDoc(SCDOCMODE_CLIP);
9987     ScMarkData aMark(m_pDoc->GetSheetLimits());
9988 
9989     // Insert values in A1:B10.
9990     for (SCROW i = 0; i < 10; ++i)
9991     {
9992         m_pDoc->SetValue(ScAddress(0, i, 0), i + 1.0); // column A
9993         m_pDoc->SetValue(ScAddress(1, i, 0), (i + 1.0) * 10.0); // column B
9994     }
9995 
9996     // Insert a formula in C1.
9997     ScAddress aPos(2, 0, 0); // C1
9998     m_pDoc->SetString(aPos, "=SUM(A1:B1)");
9999     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(aPos));
10000 
10001     // This check makes only sense if group listeners are activated.
10002 #if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER
10003     // At this point, there should be only one normal area listener listening
10004     // on A1:B1.
10005     ScRange aWholeSheet(0, 0, 0, MAXCOL, MAXROW, 0);
10006     ScBroadcastAreaSlotMachine* pBASM = m_pDoc->GetBASM();
10007     CPPUNIT_ASSERT(pBASM);
10008     std::vector<sc::AreaListener> aListeners
10009         = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside);
10010     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size());
10011     const sc::AreaListener* pListener = aListeners.data();
10012     CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 0, 0), pListener->maArea);
10013     CPPUNIT_ASSERT_MESSAGE("This listener shouldn't be a group listener.",
10014                            !pListener->mbGroupListening);
10015 #endif
10016 
10017     // Copy C1 to clipboard.
10018     ScClipParam aClipParam(aPos, false);
10019     aMark.SetMarkArea(aPos);
10020     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
10021 
10022     // Paste it to C2:C10.
10023     ScRange aDestRange(2, 1, 0, 2, 9, 0);
10024     aMark.SetMarkArea(aDestRange);
10025     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, &aClipDoc);
10026 
10027     // Make sure C1:C10 are grouped.
10028     const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(aPos);
10029     CPPUNIT_ASSERT(pFC);
10030     CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(10), pFC->GetSharedLength());
10031 
10032     // Check the formula results.
10033     for (SCROW i = 0; i < 10; ++i)
10034     {
10035         double fExpected = (i + 1.0) * 11.0;
10036         CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2, i, 0)));
10037     }
10038 
10039         // This check makes only sense if group listeners are activated.
10040 #if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER
10041     // At this point, there should only be one area listener and it should be
10042     // a group listener listening on A1:B10.
10043     aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside);
10044     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size());
10045     pListener = aListeners.data();
10046     CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 9, 0), pListener->maArea);
10047     CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.",
10048                            pListener->mbGroupListening);
10049 #endif
10050 
10051     // Insert a new row at row 1.
10052     ScRange aRowOne(0, 0, 0, MAXCOL, 0, 0);
10053     aMark.SetMarkArea(aRowOne);
10054     ScDocFunc& rFunc = m_xDocShell->GetDocFunc();
10055     rFunc.InsertCells(aRowOne, &aMark, INS_INSROWS_BEFORE, true, true);
10056 
10057     CPPUNIT_ASSERT_EQUAL_MESSAGE("C1 should be empty.", CELLTYPE_NONE,
10058                                  m_pDoc->GetCellType(ScAddress(2, 0, 0)));
10059 
10060     // This check makes only sense if group listeners are activated.
10061 #if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER
10062     // Make there we only have one group area listener listening on A2:B11.
10063     aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside);
10064     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size());
10065     pListener = aListeners.data();
10066     CPPUNIT_ASSERT_EQUAL(ScRange(0, 1, 0, 1, 10, 0), pListener->maArea);
10067     CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.",
10068                            pListener->mbGroupListening);
10069 #endif
10070 
10071     // Check the formula results.
10072     for (SCROW i = 0; i < 10; ++i)
10073     {
10074         double fExpected = (i + 1.0) * 11.0;
10075         CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2, i + 1, 0)));
10076     }
10077 
10078     // Delete row at row 1 to shift the cells up.
10079     rFunc.DeleteCells(aRowOne, &aMark, DelCellCmd::Rows, true);
10080 
10081     // Check the formula results again.
10082     for (SCROW i = 0; i < 10; ++i)
10083     {
10084         double fExpected = (i + 1.0) * 11.0;
10085         CPPUNIT_ASSERT_EQUAL(fExpected, m_pDoc->GetValue(ScAddress(2, i, 0)));
10086     }
10087 
10088         // This check makes only sense if group listeners are activated.
10089 #if !defined(USE_FORMULA_GROUP_LISTENER) || USE_FORMULA_GROUP_LISTENER
10090     // Check the group area listener again to make sure it's listening on A1:B10 once again.
10091     aListeners = pBASM->GetAllListeners(aWholeSheet, sc::AreaOverlapType::Inside);
10092     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aListeners.size());
10093     pListener = aListeners.data();
10094     CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 9, 0), pListener->maArea);
10095     CPPUNIT_ASSERT_MESSAGE("This listener should be a group listener.",
10096                            pListener->mbGroupListening);
10097 #endif
10098 
10099     m_pDoc->DeleteTab(0);
10100 }
10101 
testCopyPasteMixedReferenceFormula()10102 void TestCopyPaste::testCopyPasteMixedReferenceFormula()
10103 {
10104     sc::AutoCalcSwitch aAC(*m_pDoc, true); // turn on auto calc.
10105     m_pDoc->InsertTab(0, "Test");
10106 
10107     // Insert value to C3
10108     m_pDoc->SetValue(2, 2, 0, 1.0);
10109 
10110     // Insert formula to A1 with mixed relative/absolute addressing.
10111     m_pDoc->SetString(0, 0, 0, "=SUM(B:$C)");
10112     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 0, 0), "SUM(B:$C)", "Wrong formula.");
10113     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 0, 0));
10114 
10115     // Copy formula in A1 to clipboard.
10116     ScRange aRange(ScAddress(0, 0, 0));
10117     ScDocument aClipDoc(SCDOCMODE_CLIP);
10118     copyToClip(m_pDoc, aRange, &aClipDoc);
10119 
10120     // Paste formula to B1.
10121     aRange = ScAddress(1, 0, 0);
10122     pasteFromClip(m_pDoc, aRange, &aClipDoc);
10123     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(1, 0, 0), "SUM(C:$C)", "Wrong formula.");
10124     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(0, 0, 0));
10125     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(1, 0, 0));
10126 
10127     // Paste formula to C1. All three results now must be circular reference.
10128     aRange = ScAddress(2, 0, 0);
10129     pasteFromClip(m_pDoc, aRange, &aClipDoc);
10130     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(2, 0, 0), "SUM($C:D)",
10131                          "Wrong formula."); // reference put in order
10132     CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(0, 0, 0));
10133     CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(1, 0, 0));
10134     CPPUNIT_ASSERT_EQUAL(OUString("Err:522"), m_pDoc->GetString(2, 0, 0));
10135 
10136     m_pDoc->DeleteTab(0);
10137 }
10138 
testCopyPasteFormulas()10139 void TestCopyPaste::testCopyPasteFormulas()
10140 {
10141     m_pDoc->InsertTab(0, "Sheet1");
10142     m_pDoc->InsertTab(1, "Sheet2");
10143 
10144     m_pDoc->SetString(0, 0, 0, "=COLUMN($A$1)");
10145     m_pDoc->SetString(0, 1, 0, "=$A$1+B2");
10146     m_pDoc->SetString(0, 2, 0, "=$Sheet2.A1");
10147     m_pDoc->SetString(0, 3, 0, "=$Sheet2.$A$1");
10148     m_pDoc->SetString(0, 4, 0, "=$Sheet2.A$1");
10149 
10150     // to prevent ScEditableTester in ScDocFunc::MoveBlock
10151     ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(0, 0, 0), 1.0);
10152     ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(0, 1, 0), 1.0);
10153     ScDocFunc& rDocFunc = m_xDocShell->GetDocFunc();
10154     bool bMoveDone = rDocFunc.MoveBlock(ScRange(0, 0, 0, 0, 4, 0), ScAddress(10, 10, 0), false,
10155                                         false, false, true);
10156 
10157     // check that moving was successful, mainly for editable tester
10158     CPPUNIT_ASSERT(bMoveDone);
10159     ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(10, 10, 0), 1.0);
10160     ASSERT_DOUBLES_EQUAL(m_pDoc->GetValue(10, 11, 0), 1.0);
10161     CPPUNIT_ASSERT_EQUAL(OUString("=COLUMN($A$1)"), getFormula(10, 10, 0));
10162     CPPUNIT_ASSERT_EQUAL(OUString("=$A$1+L12"), getFormula(10, 11, 0));
10163     CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.K11"), getFormula(10, 12, 0));
10164     CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.$A$1"), getFormula(10, 13, 0));
10165     CPPUNIT_ASSERT_EQUAL(OUString("=$Sheet2.K$1"), getFormula(10, 14, 0));
10166 }
10167 
testCopyPasteFormulasExternalDoc()10168 void TestCopyPaste::testCopyPasteFormulasExternalDoc()
10169 {
10170     SfxMedium* pMedium = new SfxMedium("file:///source.fake", StreamMode::STD_READWRITE);
10171     m_xDocShell->DoLoad(pMedium);
10172 
10173     ScDocShellRef xExtDocSh = new ScDocShell;
10174     xExtDocSh->SetIsInUcalc();
10175     OUString const aExtDocName("file:///extdata.fake");
10176     SfxMedium* pMed = new SfxMedium(aExtDocName, StreamMode::STD_READWRITE);
10177     xExtDocSh->DoLoad(pMed);
10178     CPPUNIT_ASSERT_MESSAGE("external document instance not loaded.",
10179                            findLoadedDocShellByName(aExtDocName) != nullptr);
10180 
10181     ScDocument& rExtDoc = xExtDocSh->GetDocument();
10182     rExtDoc.InsertTab(0, "ExtSheet1");
10183     rExtDoc.InsertTab(1, "ExtSheet2");
10184 
10185     m_pDoc->InsertTab(0, "Sheet1");
10186     m_pDoc->InsertTab(1, "Sheet2");
10187 
10188     m_pDoc->SetString(0, 0, 0, "=COLUMN($A$1)");
10189     m_pDoc->SetString(0, 1, 0, "=$A$1+B2");
10190     m_pDoc->SetString(0, 2, 0, "=$Sheet2.A1");
10191     m_pDoc->SetString(0, 3, 0, "=$Sheet2.$A$1");
10192     m_pDoc->SetString(0, 4, 0, "=$Sheet2.A$1");
10193     m_pDoc->SetString(0, 5, 0, "=$Sheet1.$A$1");
10194 
10195     ScRange aRange(0, 0, 0, 0, 5, 0);
10196     ScClipParam aClipParam(aRange, false);
10197     ScMarkData aMark(m_pDoc->GetSheetLimits());
10198     aMark.SetMarkArea(aRange);
10199     ScDocument aClipDoc(SCDOCMODE_CLIP);
10200     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
10201 
10202     aRange = ScRange(1, 1, 1, 1, 6, 1);
10203     ScMarkData aMarkData2(m_pDoc->GetSheetLimits());
10204     aMarkData2.SetMarkArea(aRange);
10205     rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, &aClipDoc);
10206 
10207     OUString aFormula;
10208     rExtDoc.GetFormula(1, 1, 1, aFormula);
10209     //adjust absolute refs pointing to the copy area
10210     CPPUNIT_ASSERT_EQUAL(OUString("=COLUMN($B$2)"), aFormula);
10211     rExtDoc.GetFormula(1, 2, 1, aFormula);
10212     //adjust absolute refs and keep relative refs
10213     CPPUNIT_ASSERT_EQUAL(OUString("=$B$2+C3"), aFormula);
10214     rExtDoc.GetFormula(1, 3, 1, aFormula);
10215     // make absolute sheet refs external refs
10216     CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.B2"), aFormula);
10217     rExtDoc.GetFormula(1, 4, 1, aFormula);
10218     CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.$A$1"), aFormula);
10219     rExtDoc.GetFormula(1, 5, 1, aFormula);
10220     CPPUNIT_ASSERT_EQUAL(OUString("='file:///source.fake'#$Sheet2.B$1"), aFormula);
10221     rExtDoc.GetFormula(1, 6, 1, aFormula);
10222     CPPUNIT_ASSERT_EQUAL(OUString("=$ExtSheet2.$B$2"), aFormula);
10223 
10224     xExtDocSh->DoClose();
10225 }
10226 
testCopyPasteReferencesExternalDoc()10227 void TestCopyPaste::testCopyPasteReferencesExternalDoc()
10228 {
10229     SfxMedium* pMedium = new SfxMedium("file:///source.fake", StreamMode::STD_READWRITE);
10230     m_xDocShell->DoLoad(pMedium);
10231 
10232     ScDocShellRef xExtDocSh = new ScDocShell;
10233     xExtDocSh->SetIsInUcalc();
10234     OUString aExtDocName("file:///extdata.fake");
10235     SfxMedium* pMed = new SfxMedium(aExtDocName, StreamMode::STD_READWRITE);
10236     xExtDocSh->DoLoad(pMed);
10237     CPPUNIT_ASSERT_MESSAGE("external document instance not loaded.",
10238                            findLoadedDocShellByName(aExtDocName) != nullptr);
10239 
10240     ScDocument& rExtDoc = xExtDocSh->GetDocument();
10241     rExtDoc.InsertTab(0, "ExtSheet1");
10242 
10243     m_pDoc->InsertTab(0, "Sheet1");
10244 
10245     m_pDoc->SetString(0, 5, 0, "=SUM($Sheet1.A1:A5)");
10246 
10247     ScRange aRange(0, 2, 0, 0, 5, 0);
10248     ScClipParam aClipParam(aRange, false);
10249     ScMarkData aMark(m_pDoc->GetSheetLimits());
10250     aMark.SetMarkArea(aRange);
10251     ScDocument aClipDoc(SCDOCMODE_CLIP);
10252     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
10253 
10254     aRange = ScRange(0, 0, 0, 0, 3, 0);
10255     ScMarkData aMarkData2(m_pDoc->GetSheetLimits());
10256     aMarkData2.SetMarkArea(aRange);
10257     rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, &aClipDoc);
10258 
10259     OUString aFormula;
10260     rExtDoc.GetFormula(0, 3, 0, aFormula);
10261     //adjust absolute refs pointing to the copy area
10262     CPPUNIT_ASSERT_EQUAL(OUString("=SUM('file:///source.fake'#$Sheet1.A#REF!:A3)"), aFormula);
10263 
10264     xExtDocSh->DoClose();
10265 }
10266 
testTdf68976()10267 void TestCopyPaste::testTdf68976()
10268 {
10269     const SCTAB nTab = 0;
10270     m_pDoc->InsertTab(nTab, "Test");
10271 
10272     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
10273     m_pDoc->SetString(0, 1, nTab, "=$A$1"); // A2
10274     m_pDoc->SetValue(0, 2, nTab, 1000.0); // A3
10275 
10276     // Cut A3 to the clip document.
10277     ScDocument aClipDoc(SCDOCMODE_CLIP);
10278     ScRange aSrcRange(0, 2, nTab, 0, 2, nTab);
10279     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false); // A3
10280 
10281     ScRange aDestRange(1, 3, nTab, 1, 3, nTab); // B4
10282     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
10283 
10284     // Transpose
10285     ScDocument* pOrigClipDoc = &aClipDoc;
10286     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
10287     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
10288     aDestMark.SetMarkArea(aDestRange);
10289     // Paste
10290     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
10291                          true, false, true, false);
10292     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
10293     pTransClip.reset();
10294 
10295     // Check results
10296     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 0, nTab)); // A1
10297     // Without the fix in place, this would have failed with
10298     // - Expected: =$A$1
10299     // - Actual  : =$B$4
10300     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0, 1, nTab), "$A$1", "Wrong formula");
10301     // Without the fix in place, this would have failed with
10302     // - Expected: 1
10303     // - Actual  : 1000
10304     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(0, 1, nTab)); // A2
10305     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(0, 2, nTab)); // A3
10306     CPPUNIT_ASSERT_EQUAL(1000.0, m_pDoc->GetValue(1, 3, nTab)); // B4
10307 }
10308 
testTdf71058()10309 void TestCopyPaste::testTdf71058()
10310 {
10311     const SCTAB nTab = 0;
10312     m_pDoc->InsertTab(nTab, "Test");
10313 
10314     m_pDoc->SetString(2, 2, nTab, "=C4"); // C3
10315     m_pDoc->SetString(3, 2, nTab, "=D4"); // D3
10316     m_pDoc->SetValue(2, 3, nTab, 1.0); // C4
10317     m_pDoc->SetValue(3, 3, nTab, 2.0); // D4
10318 
10319     // Cut C4:C5 to the clip document.
10320     ScDocument aClipDoc(SCDOCMODE_CLIP);
10321     ScRange aSrcRange(2, 3, nTab, 3, 3, nTab);
10322     cutToClip(*m_xDocShell, aSrcRange, &aClipDoc, false);
10323 
10324     // To E6:E7
10325     ScRange aDestRange(4, 5, nTab, 4, 6, nTab);
10326     ScMarkData aDestMark(m_pDoc->GetSheetLimits());
10327 
10328     // Transpose
10329     ScDocument* pOrigClipDoc = &aClipDoc;
10330     ScDocumentUniquePtr pTransClip(new ScDocument(SCDOCMODE_CLIP));
10331     aClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false, true);
10332     aDestMark.SetMarkArea(aDestRange);
10333     // Paste
10334     m_pDoc->CopyFromClip(aDestRange, aDestMark, InsertDeleteFlags::ALL, nullptr, pTransClip.get(),
10335                          true, false, true, false);
10336     m_pDoc->UpdateTranspose(aDestRange.aStart, pOrigClipDoc, aDestMark, nullptr);
10337     pTransClip.reset();
10338 
10339     // Check precondition
10340     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(4, 5, nTab));
10341     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(4, 6, nTab));
10342 
10343     // Check results
10344     // Without the fix in place, this would have failed with
10345     // - Expected: =E6
10346     // - Actual  : =C4
10347     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(2, 2, nTab), "E6", "Wrong formula");
10348     // Without the fix in place, this would have failed with
10349     // - Expected: 1
10350     // - Actual  : 0
10351     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(2, 2, nTab));
10352 
10353     // Without the fix in place, this would have failed with
10354     // - Expected: =E7
10355     // - Actual  : =D4
10356     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(3, 2, nTab), "E7", "Wrong formula");
10357     // Without the fix in place, this would have failed with
10358     // - Expected: 2
10359     // - Actual  : 0
10360     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(3, 2, nTab));
10361 }
10362 
testMixData()10363 void TestCopyPaste::testMixData()
10364 {
10365     m_pDoc->InsertTab(0, "Test");
10366 
10367     m_pDoc->SetValue(ScAddress(1, 0, 0), 2.0); // B1
10368     m_pDoc->SetValue(ScAddress(0, 1, 0), 3.0); // A2
10369 
10370     // Copy A1:B1 to the clip document.
10371     ScDocument aClipDoc(SCDOCMODE_CLIP);
10372     copyToClip(m_pDoc, ScRange(0, 0, 0, 1, 0, 0), &aClipDoc); // A1:B1
10373 
10374     // Copy A2:B2 to the mix document (for arithmetic paste).
10375     ScDocument aMixDoc(SCDOCMODE_CLIP);
10376     copyToClip(m_pDoc, ScRange(0, 1, 0, 1, 1, 0), &aMixDoc); // A2:B2
10377 
10378     // Paste A1:B1 to A2:B2 and perform addition.
10379     pasteFromClip(m_pDoc, ScRange(0, 1, 0, 1, 1, 0), &aClipDoc);
10380     m_pDoc->MixDocument(ScRange(0, 1, 0, 1, 1, 0), ScPasteFunc::ADD, false, aMixDoc);
10381 
10382     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(0, 1, 0)); // A2
10383     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(1, 1, 0)); // B2
10384 
10385     // Clear everything and start over.
10386     clearSheet(m_pDoc, 0);
10387     clearSheet(&aClipDoc, 0);
10388     clearSheet(&aMixDoc, 0);
10389 
10390     // Set values to A1, A2, and B1.  B2 will remain empty.
10391     m_pDoc->SetValue(ScAddress(0, 0, 0), 15.0);
10392     m_pDoc->SetValue(ScAddress(0, 1, 0), 16.0);
10393     m_pDoc->SetValue(ScAddress(1, 0, 0), 12.0);
10394     CPPUNIT_ASSERT_EQUAL_MESSAGE("B2 should be empty.", CELLTYPE_NONE,
10395                                  m_pDoc->GetCellType(ScAddress(1, 1, 0)));
10396 
10397     // Copy A1:A2 and paste it onto B1:B2 with subtraction operation.
10398     copyToClip(m_pDoc, ScRange(0, 0, 0, 0, 1, 0), &aClipDoc);
10399     CPPUNIT_ASSERT_EQUAL(m_pDoc->GetValue(ScAddress(0, 0, 0)),
10400                          aClipDoc.GetValue(ScAddress(0, 0, 0)));
10401     CPPUNIT_ASSERT_EQUAL(m_pDoc->GetValue(ScAddress(0, 1, 0)),
10402                          aClipDoc.GetValue(ScAddress(0, 1, 0)));
10403 
10404     copyToClip(m_pDoc, ScRange(1, 0, 0, 1, 1, 0), &aMixDoc);
10405     CPPUNIT_ASSERT_EQUAL(m_pDoc->GetValue(ScAddress(1, 0, 0)),
10406                          aMixDoc.GetValue(ScAddress(1, 0, 0)));
10407     CPPUNIT_ASSERT_EQUAL(m_pDoc->GetValue(ScAddress(1, 1, 0)),
10408                          aMixDoc.GetValue(ScAddress(1, 1, 0)));
10409 
10410     pasteFromClip(m_pDoc, ScRange(1, 0, 0, 1, 1, 0), &aClipDoc);
10411     m_pDoc->MixDocument(ScRange(1, 0, 0, 1, 1, 0), ScPasteFunc::SUB, false, aMixDoc);
10412 
10413     CPPUNIT_ASSERT_EQUAL(-3.0, m_pDoc->GetValue(ScAddress(1, 0, 0))); // 12 - 15
10414     CPPUNIT_ASSERT_EQUAL(-16.0, m_pDoc->GetValue(ScAddress(1, 1, 0))); //  0 - 16
10415 
10416     m_pDoc->DeleteTab(0);
10417 }
10418 
testMixDataAsLinkTdf116413()10419 void TestCopyPaste::testMixDataAsLinkTdf116413()
10420 {
10421     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calculation.
10422 
10423     const SCTAB nTab = 0;
10424     m_pDoc->InsertTab(nTab, "Test");
10425 
10426     // Scenario 1: Past "As Link" and "Add" operation (as described in tdf#116413)
10427     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
10428     m_pDoc->SetValue(0, 1, nTab, 1000.0); // A2
10429 
10430     // Copy A1 to the clip document.
10431     ScDocument aClipDoc(SCDOCMODE_CLIP);
10432     copyToClip(m_pDoc, ScRange(0, 0, nTab, 0, 0, nTab), &aClipDoc); // A1
10433 
10434     ScRange aDestRange(0, 1, nTab, 0, 1, nTab);
10435     // Copy A2 to the mix document (for arithmetic paste).
10436     ScDocument aMixDoc(SCDOCMODE_CLIP);
10437     copyToClip(m_pDoc, aDestRange, &aMixDoc); // A2
10438 
10439     // Paste A1 to A2 "As Link" and perform addition.
10440     ScMarkData aMark(m_pDoc->GetSheetLimits());
10441     aMark.SetMarkArea(aDestRange);
10442     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, true, true);
10443 
10444     m_pDoc->MixDocument(aDestRange, ScPasteFunc::ADD, false, aMixDoc);
10445 
10446     // Test precondition
10447     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(0, 1, nTab)); // A2
10448     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$1)"), getFormula(0, 1, nTab));
10449 
10450     // Change A1 from 1.0 to 2.0 (auto calculation is triggered)
10451     m_pDoc->SetValue(0, 0, nTab, 2.0); // A1
10452 
10453     // Without the fix in place, this would have failed with
10454     // - Expected: =1002
10455     // - Actual  : =1001
10456     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(0, 1, nTab)); // A2
10457     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$1)"), getFormula(0, 1, nTab));
10458 
10459     // Clear everything and start over.
10460     clearSheet(m_pDoc, nTab);
10461     clearSheet(&aClipDoc, nTab);
10462     clearSheet(&aMixDoc, nTab);
10463 
10464     // Scenario 2: Like Scenario 1, but with a range (3 columns)
10465     m_pDoc->InsertTab(nTab, "Test");
10466 
10467     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
10468     m_pDoc->SetValue(0, 1, nTab, 1000.0); // A2
10469     m_pDoc->SetValue(1, 0, nTab, 1.0); // B1
10470     m_pDoc->SetValue(1, 1, nTab, 1000.0); // B2
10471     m_pDoc->SetValue(2, 0, nTab, 1.0); // C1
10472     m_pDoc->SetValue(2, 1, nTab, 1000.0); // C2
10473 
10474     // Copy A1:C1 to the clip document.
10475     copyToClip(m_pDoc, ScRange(0, 0, nTab, 2, 0, nTab), &aClipDoc); // A1:C1
10476 
10477     aDestRange = ScRange(0, 1, nTab, 2, 1, nTab);
10478     // Copy A2:C2 to the mix document (for arithmetic paste).
10479     copyToClip(m_pDoc, aDestRange, &aMixDoc); // A2:C2
10480 
10481     // Paste A1:C1 to A2:C2 "As Link" and perform addition.
10482     aMark = ScMarkData(m_pDoc->GetSheetLimits());
10483     aMark.SetMarkArea(aDestRange);
10484     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, true, true);
10485 
10486     m_pDoc->MixDocument(aDestRange, ScPasteFunc::ADD, false, aMixDoc);
10487 
10488     // Test precondition
10489     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(0, 1, nTab)); // A2
10490     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$1)"), getFormula(0, 1, nTab));
10491 
10492     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 1, nTab)); // B2
10493     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$B$1)"), getFormula(1, 1, nTab));
10494 
10495     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(2, 1, nTab)); // C2
10496     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$C$1)"), getFormula(2, 1, nTab));
10497 
10498     // Change A1:C1 from 1.0 to 2.0 (auto calculation is triggered)
10499     m_pDoc->SetValue(0, 0, nTab, 2.0); // A1
10500     m_pDoc->SetValue(1, 0, nTab, 2.0); // B1
10501     m_pDoc->SetValue(2, 0, nTab, 2.0); // C1
10502 
10503     // Without the fix in place, this would have failed with
10504     // - Expected: =1002
10505     // - Actual  : =1001
10506     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(0, 1, nTab)); // A2
10507     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$1)"), getFormula(0, 1, nTab));
10508 
10509     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(1, 1, nTab)); // B2
10510     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$B$1)"), getFormula(1, 1, nTab));
10511 
10512     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(2, 1, nTab)); // C2
10513     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$C$1)"), getFormula(2, 1, nTab));
10514 
10515     // Scenario 3: Like Scenario 2, but transposed
10516     m_pDoc->InsertTab(nTab, "Test");
10517 
10518     m_pDoc->SetValue(0, 0, nTab, 1.0); // A1
10519     m_pDoc->SetValue(1, 0, nTab, 1000.0); // B1
10520     m_pDoc->SetValue(0, 1, nTab, 1.0); // A2
10521     m_pDoc->SetValue(1, 1, nTab, 1000.0); // B2
10522     m_pDoc->SetValue(0, 2, nTab, 1.0); // A3
10523     m_pDoc->SetValue(1, 2, nTab, 1000.0); // B3
10524 
10525     // Copy A1:A3 to the clip document.
10526     copyToClip(m_pDoc, ScRange(0, 0, nTab, 0, 2, nTab), &aClipDoc); // A1:A3
10527 
10528     aDestRange = ScRange(1, 0, nTab, 1, 2, nTab);
10529     // Copy B1:B3 to the mix document (for arithmetic paste).
10530     copyToClip(m_pDoc, aDestRange, &aMixDoc); // B1:B3
10531 
10532     // Paste A1:A3 to B1:B3 "As Link" and perform addition.
10533     aMark = ScMarkData(m_pDoc->GetSheetLimits());
10534     aMark.SetMarkArea(aDestRange);
10535     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, true, true);
10536 
10537     m_pDoc->MixDocument(aDestRange, ScPasteFunc::ADD, false, aMixDoc);
10538 
10539     // Test precondition
10540     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 0, nTab)); // B1
10541     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$1)"), getFormula(1, 0, nTab));
10542 
10543     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 1, nTab)); // B2
10544     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$2)"), getFormula(1, 1, nTab));
10545 
10546     CPPUNIT_ASSERT_EQUAL(1001.0, m_pDoc->GetValue(1, 2, nTab)); // B3
10547     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$3)"), getFormula(1, 2, nTab));
10548 
10549     // Change A1:C1 from 1.0 to 2.0 (auto calculation is triggered)
10550     m_pDoc->SetValue(0, 0, nTab, 2.0); // A1
10551     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
10552     m_pDoc->SetValue(0, 2, nTab, 2.0); // A3
10553 
10554     // Without the fix in place, this would have failed with
10555     // - Expected: =1002
10556     // - Actual  : =1001
10557     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(1, 0, nTab)); // B1
10558     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$1)"), getFormula(1, 0, nTab));
10559 
10560     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(1, 1, nTab)); // B2
10561     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$2)"), getFormula(1, 1, nTab));
10562 
10563     CPPUNIT_ASSERT_EQUAL(1002.0, m_pDoc->GetValue(1, 2, nTab)); // B3
10564     CPPUNIT_ASSERT_EQUAL(OUString("=1000+($Test.$A$3)"), getFormula(1, 2, nTab));
10565 
10566     m_pDoc->DeleteTab(nTab);
10567 }
10568 
testMixDataWithFormulaTdf116413()10569 void TestCopyPaste::testMixDataWithFormulaTdf116413()
10570 {
10571     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calculation.
10572 
10573     const SCTAB nTab = 0;
10574     m_pDoc->InsertTab(nTab, "Test");
10575 
10576     // Scenario 1: There is already a reference in destination cell
10577     m_pDoc->InsertTab(nTab, "Test");
10578 
10579     m_pDoc->SetValue(0, 0, nTab, 100.0); // A1
10580     m_pDoc->SetValue(0, 1, nTab, 1.0); // A2
10581     m_pDoc->SetString(0, 2, nTab, "=A2"); // A3
10582 
10583     // Copy A1 to the clip document.
10584     ScDocument aClipDoc(SCDOCMODE_CLIP);
10585     copyToClip(m_pDoc, ScRange(0, 0, nTab, 0, 0, nTab), &aClipDoc); // A1
10586 
10587     ScRange aDestRange(0, 2, nTab, 0, 2, nTab);
10588     ScDocument aMixDoc(SCDOCMODE_CLIP);
10589     // Copy A3 to the mix document (for arithmetic paste).
10590     copyToClip(m_pDoc, aDestRange, &aMixDoc); // A3
10591 
10592     // Paste A1 to A3 and perform addition.
10593     pasteFromClip(m_pDoc, aDestRange, &aClipDoc);
10594     m_pDoc->MixDocument(aDestRange, ScPasteFunc::ADD, false, aMixDoc);
10595 
10596     // Test precondition
10597     CPPUNIT_ASSERT_EQUAL(101.0, m_pDoc->GetValue(0, 2, nTab)); // A3
10598     CPPUNIT_ASSERT_EQUAL(OUString("=(A2)+100"), getFormula(0, 2, nTab));
10599 
10600     // Change A2 from 1.0 to 2.0 (auto calculation is triggered)
10601     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
10602 
10603     // Without the fix in place, this would have failed with
10604     // - Expected: =102
10605     // - Actual  : =101
10606     CPPUNIT_ASSERT_EQUAL(102.0, m_pDoc->GetValue(0, 2, nTab)); // A3
10607     CPPUNIT_ASSERT_EQUAL(OUString("=(A2)+100"), getFormula(0, 2, nTab));
10608 
10609     // Clear everything and start over.
10610     clearSheet(m_pDoc, nTab);
10611     clearSheet(&aClipDoc, nTab);
10612     clearSheet(&aMixDoc, nTab);
10613 
10614     // Scenario 2: Similar to scenario 1, but a range of 4 cells and 2 of them have references
10615     m_pDoc->InsertTab(nTab, "Test");
10616 
10617     m_pDoc->SetValue(0, 0, nTab, 100.0); // A1
10618     m_pDoc->SetValue(0, 1, nTab, 1.0); // A2
10619     m_pDoc->SetValue(0, 2, nTab, 1000.0); // A3
10620 
10621     m_pDoc->SetValue(1, 0, nTab, 100.0); // B1
10622     m_pDoc->SetValue(1, 1, nTab, 1.0); // B2
10623     m_pDoc->SetString(1, 2, nTab, "=B2"); // B3
10624 
10625     m_pDoc->SetValue(2, 0, nTab, 100.0); // C1
10626     m_pDoc->SetValue(2, 1, nTab, 1.0); // C2
10627     m_pDoc->SetString(2, 2, nTab, "=C2"); // C3
10628 
10629     m_pDoc->SetValue(3, 0, nTab, 100.0); // D1
10630     m_pDoc->SetValue(3, 1, nTab, 1.0); // D2
10631     m_pDoc->SetValue(3, 2, nTab, 1000.0); // D3
10632 
10633     // Copy A1:D1 to the clip document.
10634     copyToClip(m_pDoc, ScRange(0, 0, nTab, 3, 0, nTab), &aClipDoc); // A1:D1
10635 
10636     aDestRange = ScRange(0, 2, nTab, 3, 2, nTab);
10637     // Copy A3:D3 to the mix document (for arithmetic paste).
10638     copyToClip(m_pDoc, aDestRange, &aMixDoc); // A3:D3
10639 
10640     // Paste A1:D1 to A3:D3 and perform addition.
10641     pasteFromClip(m_pDoc, aDestRange, &aClipDoc);
10642     m_pDoc->MixDocument(aDestRange, ScPasteFunc::ADD, false, aMixDoc);
10643 
10644     // Test precondition
10645     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(0, 2, nTab)); // A3
10646     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(0, 2, nTab));
10647 
10648     CPPUNIT_ASSERT_EQUAL(101.0, m_pDoc->GetValue(1, 2, nTab)); // B3
10649     CPPUNIT_ASSERT_EQUAL(OUString("=(B2)+100"), getFormula(1, 2, nTab));
10650 
10651     CPPUNIT_ASSERT_EQUAL(101.0, m_pDoc->GetValue(2, 2, nTab)); // C3
10652     CPPUNIT_ASSERT_EQUAL(OUString("=(C2)+100"), getFormula(2, 2, nTab));
10653 
10654     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(3, 2, nTab)); // D3
10655     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(3, 2, nTab));
10656 
10657     // Change A2:D2 from 1.0 to 2.0 (auto calculation is triggered)
10658     m_pDoc->SetValue(0, 1, nTab, 2.0); // A2
10659     m_pDoc->SetValue(1, 1, nTab, 2.0); // B2
10660     m_pDoc->SetValue(2, 1, nTab, 2.0); // C2
10661     m_pDoc->SetValue(3, 1, nTab, 2.0); // D2
10662 
10663     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(0, 2, nTab)); // A3
10664     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(0, 2, nTab));
10665 
10666     // Without the fix in place, this would have failed with
10667     // - Expected: =102
10668     // - Actual  : =101
10669     CPPUNIT_ASSERT_EQUAL(102.0, m_pDoc->GetValue(1, 2, nTab)); // B3
10670     CPPUNIT_ASSERT_EQUAL(OUString("=(B2)+100"), getFormula(1, 2, nTab));
10671 
10672     CPPUNIT_ASSERT_EQUAL(102.0, m_pDoc->GetValue(2, 2, nTab)); // C3
10673     CPPUNIT_ASSERT_EQUAL(OUString("=(C2)+100"), getFormula(2, 2, nTab));
10674 
10675     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(3, 2, nTab)); // D3
10676     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(3, 2, nTab));
10677 
10678     // Scenario 3: Similar to scenario 2, but transposed
10679     m_pDoc->InsertTab(nTab, "Test");
10680 
10681     m_pDoc->SetValue(0, 0, nTab, 100.0); // A1
10682     m_pDoc->SetValue(1, 0, nTab, 1.0); // B1
10683     m_pDoc->SetValue(2, 0, nTab, 1000.0); // C1
10684 
10685     m_pDoc->SetValue(0, 1, nTab, 100.0); // A2
10686     m_pDoc->SetValue(1, 1, nTab, 1.0); // B2
10687     m_pDoc->SetString(2, 1, nTab, "=B2"); // C2
10688 
10689     m_pDoc->SetValue(0, 2, nTab, 100.0); // A3
10690     m_pDoc->SetValue(1, 2, nTab, 1.0); // B3
10691     m_pDoc->SetString(2, 2, nTab, "=B3"); // C3
10692 
10693     m_pDoc->SetValue(0, 3, nTab, 100.0); // A4
10694     m_pDoc->SetValue(1, 3, nTab, 1.0); // B4
10695     m_pDoc->SetValue(2, 3, nTab, 1000.0); // C4
10696 
10697     // Copy A1:A4 to the clip document.
10698     copyToClip(m_pDoc, ScRange(0, 0, nTab, 0, 3, nTab), &aClipDoc); // A1:A4
10699 
10700     aDestRange = ScRange(2, 0, nTab, 2, 3, nTab);
10701     // Copy C1:C4 to the mix document (for arithmetic paste).
10702     copyToClip(m_pDoc, aDestRange, &aMixDoc); // C1:C4
10703 
10704     // Paste A1:A4 to C1:C4 and perform addition.
10705     pasteFromClip(m_pDoc, aDestRange, &aClipDoc);
10706     m_pDoc->MixDocument(aDestRange, ScPasteFunc::ADD, false, aMixDoc);
10707 
10708     // Test precondition
10709     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(2, 0, nTab)); // C1
10710     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(2, 0, nTab));
10711 
10712     CPPUNIT_ASSERT_EQUAL(101.0, m_pDoc->GetValue(2, 1, nTab)); // C2
10713     CPPUNIT_ASSERT_EQUAL(OUString("=(B2)+100"), getFormula(2, 1, nTab));
10714 
10715     CPPUNIT_ASSERT_EQUAL(101.0, m_pDoc->GetValue(2, 2, nTab)); // C3
10716     CPPUNIT_ASSERT_EQUAL(OUString("=(B3)+100"), getFormula(2, 2, nTab));
10717 
10718     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(2, 3, nTab)); // C4
10719     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(2, 3, nTab));
10720 
10721     // Change B1:B4 from 1.0 to 2.0 (auto calculation is triggered)
10722     m_pDoc->SetValue(1, 0, nTab, 2.0); // B1
10723     m_pDoc->SetValue(1, 1, nTab, 2.0); // B2
10724     m_pDoc->SetValue(1, 2, nTab, 2.0); // B3
10725     m_pDoc->SetValue(1, 3, nTab, 2.0); // B4
10726 
10727     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(2, 0, nTab)); // C1
10728     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(2, 0, nTab));
10729 
10730     // Without the fix in place, this would have failed with
10731     // - Expected: =102
10732     // - Actual  : =101
10733     CPPUNIT_ASSERT_EQUAL(102.0, m_pDoc->GetValue(2, 1, nTab)); // C2
10734     CPPUNIT_ASSERT_EQUAL(OUString("=(B2)+100"), getFormula(2, 1, nTab));
10735 
10736     CPPUNIT_ASSERT_EQUAL(102.0, m_pDoc->GetValue(2, 2, nTab)); // C3
10737     CPPUNIT_ASSERT_EQUAL(OUString("=(B3)+100"), getFormula(2, 2, nTab));
10738 
10739     CPPUNIT_ASSERT_EQUAL(1100.0, m_pDoc->GetValue(2, 3, nTab)); // C4
10740     CPPUNIT_ASSERT_EQUAL(EMPTY_OUSTRING, getFormula(2, 3, nTab));
10741 
10742     m_pDoc->DeleteTab(nTab);
10743 }
10744 
testCopyPasteMatrixFormula()10745 void TestCopyPaste::testCopyPasteMatrixFormula()
10746 {
10747     m_pDoc->InsertTab(0, "hcv");
10748 
10749     // Set Values to B1, C1, D1
10750     m_pDoc->SetValue(ScAddress(1, 0, 0), 2.0); // B1
10751     m_pDoc->SetValue(ScAddress(2, 0, 0), 5.0); // C1
10752     m_pDoc->SetValue(ScAddress(3, 0, 0), 3.0); // D1
10753 
10754     // Set Values to B2, C2
10755     m_pDoc->SetString(ScAddress(1, 1, 0), "B2"); // B2
10756     //m_pDoc->SetString(ScAddress(2,1,0), "C2");  // C2
10757     m_pDoc->SetString(ScAddress(3, 1, 0), "D2"); // D2
10758 
10759     // Set Values to D3
10760     //m_pDoc->SetValue(ScAddress(1,2,0), 9.0);    // B3
10761     //m_pDoc->SetString(ScAddress(2,2,0), "C3");  // C3
10762     m_pDoc->SetValue(ScAddress(3, 2, 0), 11.0); // D3
10763 
10764     // Insert matrix formula to A1
10765     ScMarkData aMark(m_pDoc->GetSheetLimits());
10766     aMark.SelectOneTable(0);
10767     m_pDoc->InsertMatrixFormula(0, 0, 0, 0, aMark, "=COUNTIF(ISBLANK(B1:D1);TRUE())");
10768     m_pDoc->CalcAll();
10769     // A1 should contain 0
10770     CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(ScAddress(0, 0, 0))); // A1
10771 
10772     // Copy cell A1 to clipboard.
10773     ScAddress aPos(0, 0, 0); // A1
10774     ScDocument aClipDoc(SCDOCMODE_CLIP);
10775     ScClipParam aParam(aPos, false);
10776     m_pDoc->CopyToClip(aParam, &aClipDoc, &aMark, false, false);
10777     // Formula string should be equal.
10778     CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), aClipDoc.GetString(aPos));
10779 
10780     // First try single range.
10781     // Paste matrix formula to A2
10782     pasteFromClip(m_pDoc, ScRange(0, 1, 0, 0, 1, 0), &aClipDoc); // A2
10783     // A2 Cell value should contain 1.0
10784     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(0, 1, 0)));
10785 
10786     // Paste matrix formula to A3
10787     pasteFromClip(m_pDoc, ScRange(0, 2, 0, 0, 2, 0), &aClipDoc); // A3
10788     // A3 Cell value should contain 2.0
10789     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(0, 2, 0)));
10790 
10791     // Paste matrix formula to A4
10792     pasteFromClip(m_pDoc, ScRange(0, 3, 0, 0, 3, 0), &aClipDoc); // A4
10793     // A4 Cell value should contain 3.0
10794     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(ScAddress(0, 3, 0)));
10795 
10796     // Clear cell A2:A4
10797     clearRange(m_pDoc, ScRange(0, 1, 0, 0, 3, 0));
10798 
10799     // Paste matrix formula to range A2:A4
10800     pasteFromClip(m_pDoc, ScRange(0, 1, 0, 0, 3, 0), &aClipDoc); // A2:A4
10801 
10802     // A2 Cell value should contain 1.0
10803     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(0, 1, 0)));
10804     // A3 Cell value should contain 2.0
10805     CPPUNIT_ASSERT_EQUAL(2.0, m_pDoc->GetValue(ScAddress(0, 2, 0)));
10806     // A4 Cell value should contain 3.0
10807     CPPUNIT_ASSERT_EQUAL(3.0, m_pDoc->GetValue(ScAddress(0, 3, 0)));
10808 
10809     m_pDoc->DeleteTab(0);
10810 }
10811 
10812 CPPUNIT_TEST_SUITE_REGISTRATION(TestCopyPaste);
10813 
10814 CPPUNIT_PLUGIN_IMPLEMENT();
10815 
10816 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
10817