Line data Source code
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 <sal/config.h>
11 : #include <test/bootstrapfixture.hxx>
12 : #include "document.hxx"
13 : #include "docsh.hxx"
14 :
15 : #include "rangelst.hxx"
16 :
17 63 : class Test : public test::BootstrapFixture {
18 :
19 : public:
20 : virtual void setUp();
21 : virtual void tearDown();
22 :
23 : void testDeleteArea_4Ranges();
24 : void testDeleteArea_3Ranges();
25 : void testDeleteArea_3Ranges_Case2();
26 : void testDeleteArea_3Ranges_Case3();
27 : void testDeleteArea_3Ranges_Case4();
28 : void testDeleteArea_3Ranges_Case5();
29 : void testDeleteArea_2Ranges();
30 : void testDeleteArea_2Ranges_Case2();
31 : void testDeleteArea_2Ranges_Case3();
32 : void testDeleteArea_2Ranges_Case4();
33 : void testDeleteArea_2Ranges_Case5();
34 : void testDeleteArea_2Ranges_Case6();
35 : void testDeleteArea_2Ranges_Case7();
36 : void testDeleteArea_2Ranges_Case8();
37 : void testDeleteArea_1Range();
38 : void testDeleteArea_0Ranges();
39 : void testJoin_Case1();
40 : void testJoin_Case2();
41 : void testGetIntersectedRange();
42 :
43 : void testUpdateReference_DeleteRow();
44 : void testUpdateReference_DeleteCol();
45 :
46 2 : CPPUNIT_TEST_SUITE(Test);
47 1 : CPPUNIT_TEST(testDeleteArea_4Ranges);
48 1 : CPPUNIT_TEST(testDeleteArea_3Ranges);
49 1 : CPPUNIT_TEST(testDeleteArea_3Ranges_Case2);
50 1 : CPPUNIT_TEST(testDeleteArea_3Ranges_Case3);
51 1 : CPPUNIT_TEST(testDeleteArea_3Ranges_Case4);
52 1 : CPPUNIT_TEST(testDeleteArea_3Ranges_Case5);
53 1 : CPPUNIT_TEST(testDeleteArea_2Ranges);
54 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case2);
55 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case3);
56 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case4);
57 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case5);
58 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case6);
59 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case7);
60 1 : CPPUNIT_TEST(testDeleteArea_2Ranges_Case8);
61 1 : CPPUNIT_TEST(testDeleteArea_1Range);
62 1 : CPPUNIT_TEST(testDeleteArea_0Ranges);
63 1 : CPPUNIT_TEST(testJoin_Case1);
64 1 : CPPUNIT_TEST(testJoin_Case2);
65 1 : CPPUNIT_TEST(testUpdateReference_DeleteRow);
66 1 : CPPUNIT_TEST(testUpdateReference_DeleteCol);
67 1 : CPPUNIT_TEST(testGetIntersectedRange);
68 2 : CPPUNIT_TEST_SUITE_END();
69 :
70 :
71 : private:
72 : ScDocument *m_pDoc;
73 : ScDocShellRef m_xDocShRef;
74 : };
75 :
76 0 : static std::ostream& operator<<(std::ostream& rStrm, const ScAddress& rAddr)
77 : {
78 0 : rStrm << "Col: " << rAddr.Col() << " Row: " << rAddr.Row() << " Tab: " << rAddr.Tab() << "\n";
79 0 : return rStrm;
80 : }
81 :
82 0 : static std::ostream& operator<<(std::ostream& rStrm, const ScRange& rRange)
83 : {
84 0 : rStrm << "ScRange: " << rRange.aStart << rRange.aEnd << "\n";
85 0 : return rStrm;
86 : }
87 :
88 0 : static std::ostream& operator<<(std::ostream& rStrm, const ScRangeList& rList)
89 : {
90 0 : rStrm << "ScRangeList: \n";
91 0 : for(size_t i = 0; i < rList.size(); ++i)
92 0 : rStrm << *rList[i];
93 0 : return rStrm;
94 : }
95 :
96 21 : void Test::setUp()
97 : {
98 21 : BootstrapFixture::setUp();
99 :
100 21 : ScDLL::Init();
101 42 : m_xDocShRef = new ScDocShell(
102 : SFXMODEL_STANDARD |
103 : SFXMODEL_DISABLE_EMBEDDED_SCRIPTS |
104 42 : SFXMODEL_DISABLE_DOCUMENT_RECOVERY);
105 :
106 21 : m_pDoc = m_xDocShRef->GetDocument();
107 21 : }
108 :
109 21 : void Test::tearDown()
110 : {
111 21 : m_xDocShRef.Clear();
112 21 : BootstrapFixture::tearDown();
113 21 : }
114 :
115 1 : void Test::testDeleteArea_4Ranges()
116 : {
117 1 : ScRangeList aList(ScRange(0,0,0,5,5,0));
118 1 : aList.DeleteArea(2,2,0,3,3,0);
119 :
120 1 : CPPUNIT_ASSERT_EQUAL(aList.size(), static_cast<size_t>(4));
121 7 : for(SCCOL nCol = 0; nCol <= 5; ++nCol)
122 : {
123 42 : for(SCROW nRow = 0; nRow <= 5; ++nRow)
124 : {
125 36 : if((nCol == 2 || nCol == 3) && ( nRow == 2 || nRow == 3))
126 4 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
127 : else
128 32 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
129 : }
130 1 : }
131 1 : }
132 :
133 1 : void Test::testDeleteArea_3Ranges()
134 : {
135 1 : ScRangeList aList(ScRange(1,1,0,6,6,0));
136 1 : aList.DeleteArea(3,3,0,8,4,0);
137 :
138 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aList.size());
139 7 : for(SCCOL nCol = 1; nCol <= 6; ++nCol)
140 : {
141 42 : for(SCROW nRow = 1; nRow <= 6; ++nRow)
142 : {
143 36 : if((nRow == 3 || nRow == 4) && (nCol >= 3))
144 8 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
145 : else
146 28 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
147 : }
148 : }
149 :
150 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(28), aList.GetCellCount());
151 1 : }
152 :
153 1 : void Test::testDeleteArea_3Ranges_Case2()
154 : {
155 1 : ScRangeList aList(ScRange(1,1,0,6,6,0));
156 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
157 1 : aList.DeleteArea(0,2,0,2,4,0);
158 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aList.size());
159 :
160 : // Column 1-2 && Row 2-4 should not be in the range list. The rest should
161 : // be in the list.
162 7 : for (SCCOL nCol = 1; nCol <= 6; ++nCol)
163 : {
164 42 : for (SCROW nRow = 1; nRow <= 6; ++nRow)
165 : {
166 36 : if ((1 <= nCol && nCol <= 2) && (2 <= nRow && nRow <= 4))
167 6 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
168 : else
169 30 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
170 : }
171 1 : }
172 1 : }
173 :
174 1 : void Test::testDeleteArea_3Ranges_Case3()
175 : {
176 1 : ScRangeList aList(ScRange(1,5,0,6,11,0));
177 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
178 1 : aList.DeleteArea(3,2,0,4,8,0);
179 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aList.size());
180 :
181 : // Column 3-4 && Row 5-8 should not be in the range list.
182 7 : for (SCCOL nCol = 1; nCol <= 6; ++nCol)
183 : {
184 48 : for (SCROW nRow = 5; nRow <= 11; ++nRow)
185 : {
186 42 : if ((3 <= nCol && nCol <= 4) && (5 <= nRow && nRow <= 8))
187 8 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
188 : else
189 34 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
190 : }
191 1 : }
192 1 : }
193 :
194 1 : void Test::testDeleteArea_3Ranges_Case4()
195 : {
196 1 : ScRangeList aList(ScRange(1,5,0,6,11,0));
197 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
198 1 : aList.DeleteArea(3,5,0,4,5,0);
199 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aList.size());
200 :
201 : // Column 3-4 && Row 5 should not be in the range list.
202 7 : for (SCCOL nCol = 1; nCol <= 6; ++nCol)
203 : {
204 48 : for (SCROW nRow = 5; nRow <= 11; ++nRow)
205 : {
206 42 : if ((3 <= nCol && nCol <= 4) && 5 == nRow )
207 2 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
208 : else
209 40 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
210 : }
211 1 : }
212 1 : }
213 :
214 1 : void Test::testDeleteArea_3Ranges_Case5()
215 : {
216 1 : ScRangeList aList(ScRange(1,5,0,6,11,0));
217 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
218 1 : aList.DeleteArea(6,7,0,6,9,0);
219 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aList.size());
220 :
221 : // Column 6 && Row 7-9 should not be in the range list.
222 7 : for (SCCOL nCol = 1; nCol <= 6; ++nCol)
223 : {
224 48 : for (SCROW nRow = 5; nRow <= 11; ++nRow)
225 : {
226 42 : if ( nCol == 6 && (7 <= nRow && nRow <= 9))
227 3 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
228 : else
229 39 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
230 : }
231 1 : }
232 1 : }
233 :
234 1 : void Test::testDeleteArea_2Ranges()
235 : {
236 1 : ScRangeList aList(ScRange(0,0,0,5,5,5));
237 2 : ScRangeList aList2(aList);
238 :
239 1 : aList.DeleteArea(4,4,0,6,7,0);
240 1 : aList2.DeleteArea(4,4,0,6,7,0);
241 1 : CPPUNIT_ASSERT_EQUAL(aList.size(), static_cast<size_t>(2));
242 1 : CPPUNIT_ASSERT_EQUAL(aList2.size(), static_cast<size_t>(2));
243 :
244 7 : for(SCCOL nCol = 0; nCol <= 5; ++nCol)
245 : {
246 42 : for(SCROW nRow = 0; nRow <= 5; ++nRow)
247 : {
248 36 : if(nCol>=4 && nRow >= 4)
249 4 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
250 : else
251 32 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
252 : }
253 1 : }
254 1 : }
255 :
256 1 : void Test::testDeleteArea_2Ranges_Case2()
257 : {
258 1 : ScRangeList aList(ScRange(1,1,0,1,5,0));
259 1 : aList.DeleteArea(0,3,0,MAXCOL,3,0);
260 :
261 6 : for(SCROW nRow = 1; nRow <= 5; ++nRow)
262 : {
263 5 : if(nRow == 3)
264 1 : CPPUNIT_ASSERT(!aList.In(ScRange(1,3,0)));
265 : else
266 4 : CPPUNIT_ASSERT(aList.In(ScRange(1,nRow,0)));
267 : }
268 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), aList.GetCellCount());
269 1 : }
270 :
271 1 : void Test::testDeleteArea_2Ranges_Case3()
272 : {
273 1 : ScRangeList aList(ScRange(0,5,0,2,10,0));
274 1 : aList.DeleteArea(2,3,0,3,7,0);
275 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aList.size());
276 :
277 : // Column 2 Row 5-7 shouldn't be in the list.
278 4 : for (SCCOL nCol = 0; nCol <= 2; ++nCol)
279 : {
280 21 : for (SCROW nRow = 5; nRow <= 10; ++nRow)
281 : {
282 18 : if (nCol == 2 && (5 <= nRow && nRow <= 7))
283 3 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol,nRow,0)));
284 : else
285 15 : CPPUNIT_ASSERT(aList.In(ScRange(nCol,nRow,0)));
286 : }
287 1 : }
288 1 : }
289 :
290 1 : void Test::testDeleteArea_2Ranges_Case4()
291 : {
292 1 : ScRangeList aList(ScRange(2,3,0,4,7,0));
293 1 : aList.DeleteArea(0,1,0,2,5,0);
294 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aList.size());
295 :
296 : // Column 2 Row 3-5 shouldn't be in the list.
297 4 : for (SCCOL nCol = 2; nCol <= 4; ++nCol)
298 : {
299 18 : for (SCROW nRow = 3; nRow <= 7; ++nRow)
300 : {
301 15 : if (nCol == 2 && (3 <= nRow && nRow <= 5))
302 3 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol,nRow,0)));
303 : else
304 12 : CPPUNIT_ASSERT(aList.In(ScRange(nCol,nRow,0)));
305 : }
306 1 : }
307 1 : }
308 :
309 1 : void Test::testDeleteArea_2Ranges_Case5()
310 : {
311 1 : ScRangeList aList(ScRange(2,2,0,5,5,0));
312 1 : aList.DeleteArea(4,5,0,5,5,0);
313 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aList.size());
314 :
315 : // Column 4 and 5 Row 5 shouldn't be in the list.
316 5 : for(SCCOL nCol = 2; nCol <= 5; ++nCol)
317 : {
318 20 : for(SCROW nRow = 2; nRow <= 5; ++nRow)
319 : {
320 16 : if(nRow == 5 && 4 <= nCol)
321 2 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
322 : else
323 14 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
324 : }
325 1 : }
326 1 : }
327 :
328 1 : void Test::testDeleteArea_2Ranges_Case6()
329 : {
330 1 : ScRangeList aList(ScRange(2,2,0,5,5,0));
331 1 : aList.DeleteArea(4,2,0,5,2,0);
332 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aList.size());
333 :
334 : // Column 4 and 5 Row 2 shouldn't be in the list.
335 5 : for(SCCOL nCol = 2; nCol <= 5; ++nCol)
336 : {
337 20 : for(SCROW nRow = 2; nRow <= 5; ++nRow)
338 : {
339 16 : if(nRow == 2 && 4 <= nCol)
340 2 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
341 : else
342 14 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
343 : }
344 1 : }
345 1 : }
346 :
347 1 : void Test::testDeleteArea_2Ranges_Case7()
348 : {
349 1 : ScRangeList aList(ScRange(2,2,0,5,5,0));
350 1 : aList.DeleteArea(2,5,0,2,5,0);
351 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aList.size());
352 :
353 : // Column 2 Row 5 shouldn't be in the list.
354 5 : for(SCCOL nCol = 2; nCol <= 5; ++nCol)
355 : {
356 20 : for(SCROW nRow = 2; nRow <= 5; ++nRow)
357 : {
358 16 : if(nRow == 5 && nCol == 2)
359 1 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
360 : else
361 15 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
362 : }
363 1 : }
364 1 : }
365 :
366 1 : void Test::testDeleteArea_2Ranges_Case8()
367 : {
368 1 : ScRangeList aList(ScRange(2,2,0,5,5,0));
369 1 : aList.DeleteArea(2,2,0,3,2,0);
370 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aList.size());
371 :
372 : // Column 2 & 3 Row 2 shouldn't be in the list.
373 5 : for(SCCOL nCol = 2; nCol <= 5; ++nCol)
374 : {
375 20 : for(SCROW nRow = 2; nRow <= 5; ++nRow)
376 : {
377 16 : if(nRow == 2 && nCol <= 3)
378 2 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, nRow, 0)));
379 : else
380 14 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
381 : }
382 1 : }
383 1 : }
384 :
385 1 : void Test::testDeleteArea_1Range()
386 : {
387 1 : ScRangeList aList(ScRange(1,1,0,3,3,0));
388 1 : aList.DeleteArea(1,1,0,2,3,0);
389 :
390 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
391 :
392 4 : for(SCROW nRow = 1; nRow <= 3; ++nRow)
393 : {
394 3 : CPPUNIT_ASSERT(aList.In(ScRange(3,nRow,0)));
395 : }
396 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aList.GetCellCount());
397 1 : }
398 :
399 1 : void Test::testDeleteArea_0Ranges()
400 : {
401 1 : ScRangeList aList(ScRange(1,1,0,3,3,0));
402 1 : aList.DeleteArea(1,1,0,3,3,0);
403 :
404 1 : CPPUNIT_ASSERT(aList.empty());
405 :
406 2 : ScRangeList aList2(ScRange(1,1,0,3,3,0));
407 1 : aList2.DeleteArea(0,0,0,4,4,0);
408 :
409 2 : CPPUNIT_ASSERT(aList.empty());
410 1 : }
411 :
412 1 : void Test::testJoin_Case1()
413 : {
414 1 : ScRangeList aList;
415 1 : aList.push_back(new ScRange(1,1,0,3,3,0));
416 1 : aList.Join(ScRange(4,1,0,6,3,0));
417 :
418 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
419 1 : CPPUNIT_ASSERT( ScRange(1,1,0,6,3,0) == *aList[0]);
420 1 : }
421 :
422 1 : void Test::testJoin_Case2()
423 : {
424 1 : ScRangeList aList;
425 1 : aList.push_back(new ScRange(1,1,0,3,3,0));
426 1 : aList.push_back(new ScRange(4,1,0,6,3,0));
427 1 : aList.push_back(new ScRange(7,1,0,9,3,0));
428 :
429 1 : aList.Join(*aList[2], true);
430 :
431 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aList.size());
432 1 : CPPUNIT_ASSERT(ScRange(1,1,0,9,3,0) == *aList[0]);
433 1 : }
434 :
435 1 : void Test::testUpdateReference_DeleteRow()
436 : {
437 1 : ScRangeList aList(ScRange(1,1,0,4,4,0));
438 1 : bool bUpdated = aList.UpdateReference(URM_INSDEL, m_pDoc, ScRange(0,3,0,MAXCOL,MAXROW,0), 0, -1, 0);
439 1 : CPPUNIT_ASSERT(bUpdated);
440 :
441 5 : for(SCCOL nCol = 1; nCol <= 4; ++nCol)
442 : {
443 16 : for(SCROW nRow = 1; nRow <= 3; ++nRow)
444 : {
445 12 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
446 : }
447 4 : CPPUNIT_ASSERT(!aList.In(ScRange(nCol, 4, 0)));
448 : }
449 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(12), aList.GetCellCount());
450 :
451 2 : ScRangeList aList2(ScRange(2,2,0,2,2,0));
452 1 : aList2.UpdateReference(URM_INSDEL, m_pDoc, ScRange(0,3,0,MAXCOL,MAXROW,0), 0, -1, 0);
453 2 : CPPUNIT_ASSERT(aList2.empty());
454 1 : }
455 :
456 1 : void Test::testUpdateReference_DeleteCol()
457 : {
458 1 : ScRangeList aList(ScRange(1,1,0,4,4,0));
459 1 : bool bUpdated = aList.UpdateReference(URM_INSDEL, m_pDoc, ScRange(3,0,0,MAXCOL,MAXROW,0), -1, 0, 0);
460 1 : CPPUNIT_ASSERT(bUpdated);
461 :
462 5 : for(SCROW nRow = 1; nRow <= 4; ++nRow)
463 : {
464 16 : for(SCCOL nCol = 1; nCol <= 3; ++nCol)
465 : {
466 12 : CPPUNIT_ASSERT(aList.In(ScRange(nCol, nRow, 0)));
467 : }
468 4 : CPPUNIT_ASSERT(!aList.In(ScRange(4, nRow, 0)));
469 : }
470 1 : CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(12), aList.GetCellCount());
471 1 : }
472 :
473 1 : void Test::testGetIntersectedRange()
474 : {
475 1 : ScRangeList aList(ScRange(2, 2, 0, 5, 5, 0));
476 2 : ScRangeList aIntersecting = aList.GetIntersectedRange(ScRange(0, 0, 0, 3, 3, 0));
477 2 : CPPUNIT_ASSERT_EQUAL(ScRangeList(ScRange(2,2,0,3,3,0)), aIntersecting);
478 1 : }
479 :
480 1 : CPPUNIT_TEST_SUITE_REGISTRATION(Test);
481 :
482 4 : CPPUNIT_PLUGIN_IMPLEMENT();
483 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|