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