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