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