1 /*
2 * Copyright (c) 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 #include "kis_model_index_converter_test.h"
20
21 #include <QTest>
22
23 #include "kis_node_model.h"
24 #include "kis_dummies_facade.h"
25 #include "kis_node_dummies_graph.h"
26 #include "kis_model_index_converter.h"
27 #include "kis_model_index_converter_show_all.h"
28
29
init()30 void KisModelIndexConverterTest::init()
31 {
32 m_dummiesFacade = new KisDummiesFacade(0);
33 m_nodeModel = new KisNodeModel(0);
34 initBase();
35 constructImage();
36 addSelectionMasks();
37
38 m_dummiesFacade->setImage(m_image);
39 m_nodeModel->setDummiesFacade(m_dummiesFacade, m_image, 0, 0, 0);
40 }
41
cleanup()42 void KisModelIndexConverterTest::cleanup()
43 {
44 m_nodeModel->setDummiesFacade(0, 0, 0, 0, 0);
45 m_dummiesFacade->setImage(0);
46
47 cleanupBase();
48 delete m_indexConverter;
49 delete m_nodeModel;
50 delete m_dummiesFacade;
51 }
52
checkIndexFromDummy(KisNodeSP node,int row)53 inline void KisModelIndexConverterTest::checkIndexFromDummy(KisNodeSP node, int row) {
54 QModelIndex index;
55 KisNodeDummy *dummy;
56
57 dummy = m_dummiesFacade->dummyForNode(node);
58 index = m_indexConverter->indexFromDummy(dummy);
59
60 QVERIFY(index.isValid());
61 QCOMPARE(index.column(), 0);
62 QCOMPARE(index.row(), row);
63 QCOMPARE(m_indexConverter->dummyFromIndex(index), dummy);
64 }
65
checkInvalidIndexFromDummy(KisNodeSP node)66 inline void KisModelIndexConverterTest::checkInvalidIndexFromDummy(KisNodeSP node) {
67 QModelIndex index;
68 KisNodeDummy *dummy;
69
70 dummy = m_dummiesFacade->dummyForNode(node);
71 index = m_indexConverter->indexFromDummy(dummy);
72
73 QVERIFY(!index.isValid());
74 }
75
checkIndexFromAddedAllowedDummy(KisNodeSP parent,int index,int parentRow,int childRow,bool parentValid)76 inline void KisModelIndexConverterTest::checkIndexFromAddedAllowedDummy(KisNodeSP parent, int index, int parentRow, int childRow, bool parentValid)
77 {
78 QString type = KisLayer::staticMetaObject.className();
79 checkIndexFromAddedDummy(parent, index, type, parentRow, childRow, parentValid);
80 }
81
checkIndexFromAddedDeniedDummy(KisNodeSP parent,int index,int parentRow,int childRow,bool parentValid)82 inline void KisModelIndexConverterTest::checkIndexFromAddedDeniedDummy(KisNodeSP parent, int index, int parentRow, int childRow, bool parentValid)
83 {
84 QString type = KisSelectionMask::staticMetaObject.className();
85 checkIndexFromAddedDummy(parent, index, type, parentRow, childRow, parentValid);
86 }
87
checkIndexFromAddedDummy(KisNodeSP parent,int index,const QString & type,int parentRow,int childRow,bool parentValid)88 inline void KisModelIndexConverterTest::checkIndexFromAddedDummy(KisNodeSP parent, int index, const QString &type, int parentRow, int childRow, bool parentValid)
89 {
90 QModelIndex modelIndex;
91 KisNodeDummy *dummy;
92
93 int row = 0;
94 bool result;
95
96 dummy = parent ? m_dummiesFacade->dummyForNode(parent) : 0;
97 result = m_indexConverter->indexFromAddedDummy(dummy, index, type, modelIndex, row);
98 if(!result) dbgKrita << "Failing parent:" << (parent ? parent->name() : "none") << "index:" << index;
99 QVERIFY(result);
100
101 QCOMPARE(modelIndex.isValid(), parentValid);
102
103 if(modelIndex.isValid()) {
104 QCOMPARE(modelIndex.row(), parentRow);
105 QCOMPARE(modelIndex.column(), 0);
106 }
107
108 if(row != childRow) dbgKrita << "Failing parent:" << (parent ? parent->name() : "none") << "index:" << index;
109 QCOMPARE(row, childRow);
110 }
111
checkInvalidIndexFromAddedAllowedDummy(KisNodeSP parent,int index)112 inline void KisModelIndexConverterTest::checkInvalidIndexFromAddedAllowedDummy(KisNodeSP parent, int index)
113 {
114 QString type = KisLayer::staticMetaObject.className();
115 checkInvalidIndexFromAddedDummy(parent, index, type);
116 }
117
checkInvalidIndexFromAddedDeniedDummy(KisNodeSP parent,int index)118 inline void KisModelIndexConverterTest::checkInvalidIndexFromAddedDeniedDummy(KisNodeSP parent, int index)
119 {
120 QString type = KisSelectionMask::staticMetaObject.className();
121 checkInvalidIndexFromAddedDummy(parent, index, type);
122 }
123
checkInvalidIndexFromAddedDummy(KisNodeSP parent,int index,const QString & type)124 inline void KisModelIndexConverterTest::checkInvalidIndexFromAddedDummy(KisNodeSP parent, int index, const QString &type)
125 {
126 QModelIndex modelIndex;
127 KisNodeDummy *dummy;
128
129 int row = 0;
130 bool result;
131
132 dummy = parent ? m_dummiesFacade->dummyForNode(parent) : 0;
133 result = m_indexConverter->indexFromAddedDummy(dummy, index, type, modelIndex, row);
134 QVERIFY(!result);
135 }
136
checkDummyFromRow(KisNodeSP parent,int row,KisNodeSP expectedNode)137 inline void KisModelIndexConverterTest::checkDummyFromRow(KisNodeSP parent, int row, KisNodeSP expectedNode)
138 {
139 QModelIndex parentIndex;
140 KisNodeDummy *parentDummy;
141
142 if(parent) {
143 parentDummy = m_dummiesFacade->dummyForNode(parent);
144 parentIndex = m_indexConverter->indexFromDummy(parentDummy);
145 }
146
147 KisNodeDummy *resultDummy = m_indexConverter->dummyFromRow(row, parentIndex);
148 KisNodeSP resultNode = resultDummy ? resultDummy->node() : 0;
149
150 if(resultNode != expectedNode) {
151 dbgKrita << "Actual node: " << (resultNode ? resultNode->name() : "none");
152 dbgKrita << "Expected node:" << (expectedNode ? expectedNode->name() : "none");
153 QFAIL("Wrong node");
154 }
155 }
156
checkRowCount(KisNodeSP parent,int rowCount)157 inline void KisModelIndexConverterTest::checkRowCount(KisNodeSP parent, int rowCount)
158 {
159 QModelIndex parentIndex;
160 KisNodeDummy *parentDummy;
161
162 if(parent) {
163 parentDummy = m_dummiesFacade->dummyForNode(parent);
164 parentIndex = m_indexConverter->indexFromDummy(parentDummy);
165 }
166
167 int resultRowCount = m_indexConverter->rowCount(parentIndex);
168
169 if(resultRowCount != rowCount) {
170 dbgKrita << "Wrong row count for:" << (parent ? parent->name() : "none");
171 dbgKrita << "Actual: " << resultRowCount;
172 dbgKrita << "Expected:" << rowCount;
173 QFAIL("Wrong row count");
174 }
175 }
176
testIndexFromDummy()177 void KisModelIndexConverterTest::testIndexFromDummy()
178 {
179 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, false);
180
181 checkIndexFromDummy(m_layer1, 3);
182 checkIndexFromDummy(m_layer2, 2);
183 checkIndexFromDummy(m_layer3, 1);
184 checkIndexFromDummy(m_layer4, 0);
185
186 checkIndexFromDummy(m_mask1, 1);
187 checkIndexFromDummy(m_sel3, 0);
188
189 checkInvalidIndexFromDummy(m_image->root());
190 checkInvalidIndexFromDummy(m_sel1);
191 checkInvalidIndexFromDummy(m_sel2);
192 }
193
testIndexFromAddedAllowedDummy()194 void KisModelIndexConverterTest::testIndexFromAddedAllowedDummy()
195 {
196 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, false);
197
198 checkIndexFromAddedAllowedDummy(m_image->root(), 0, 0, 4, false);
199 checkIndexFromAddedAllowedDummy(m_image->root(), 1, 0, 4, false);
200 checkIndexFromAddedAllowedDummy(m_image->root(), 2, 0, 3, false);
201 checkIndexFromAddedAllowedDummy(m_image->root(), 3, 0, 2, false);
202 checkIndexFromAddedAllowedDummy(m_image->root(), 4, 0, 2, false);
203 checkIndexFromAddedAllowedDummy(m_image->root(), 5, 0, 1, false);
204 checkIndexFromAddedAllowedDummy(m_image->root(), 6, 0, 0, false);
205
206 checkIndexFromAddedAllowedDummy(m_layer1, 0, 3, 0, true);
207
208 checkIndexFromAddedAllowedDummy(m_layer3, 0, 1, 2, true);
209 checkIndexFromAddedAllowedDummy(m_layer3, 1, 1, 1, true);
210 checkIndexFromAddedAllowedDummy(m_layer3, 2, 1, 0, true);
211
212 checkInvalidIndexFromAddedAllowedDummy(0, 0);
213 }
214
testIndexFromAddedDeniedDummy()215 void KisModelIndexConverterTest::testIndexFromAddedDeniedDummy()
216 {
217 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, false);
218
219 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 0);
220 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 1);
221 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 2);
222 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 3);
223 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 4);
224 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 5);
225 checkInvalidIndexFromAddedDeniedDummy(m_image->root(), 6);
226
227 checkIndexFromAddedDeniedDummy(m_layer1, 0, 3, 0, true);
228
229 checkIndexFromAddedDeniedDummy(m_layer3, 0, 1, 2, true);
230 checkIndexFromAddedDeniedDummy(m_layer3, 1, 1, 1, true);
231 checkIndexFromAddedDeniedDummy(m_layer3, 2, 1, 0, true);
232
233 checkInvalidIndexFromAddedDeniedDummy(0, 0);
234 }
235
testDummyFromRow()236 void KisModelIndexConverterTest::testDummyFromRow()
237 {
238 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, false);
239
240 checkDummyFromRow(m_image->root(), 0, m_layer4);
241 checkDummyFromRow(m_image->root(), 1, m_layer3);
242 checkDummyFromRow(m_image->root(), 2, m_layer2);
243 checkDummyFromRow(m_image->root(), 3, m_layer1);
244
245 checkDummyFromRow(0, 0, m_layer4);
246 checkDummyFromRow(0, 1, m_layer3);
247 checkDummyFromRow(0, 2, m_layer2);
248 checkDummyFromRow(0, 3, m_layer1);
249
250 checkDummyFromRow(m_layer3, 0, m_sel3);
251 checkDummyFromRow(m_layer3, 1, m_mask1);
252 }
253
testRowCount()254 void KisModelIndexConverterTest::testRowCount()
255 {
256 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, false);
257
258 checkRowCount(m_image->root(), 4);
259 checkRowCount(0, 4);
260
261 checkRowCount(m_layer1, 0);
262 checkRowCount(m_layer2, 0);
263 checkRowCount(m_layer3, 2);
264 checkRowCount(m_layer4, 0);
265 }
266
testIndexFromDummyShowGlobalSelection()267 void KisModelIndexConverterTest::testIndexFromDummyShowGlobalSelection()
268 {
269 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, true);
270
271 checkIndexFromDummy(m_sel1, 5);
272 checkIndexFromDummy(m_layer1, 4);
273 checkIndexFromDummy(m_layer2, 3);
274 checkIndexFromDummy(m_sel2, 2);
275 checkIndexFromDummy(m_layer3, 1);
276 checkIndexFromDummy(m_layer4, 0);
277
278 checkIndexFromDummy(m_mask1, 1);
279 checkIndexFromDummy(m_sel3, 0);
280
281 checkInvalidIndexFromDummy(m_image->root());
282 }
283
testIndexFromAddedAllowedDummyShowGlobalSelection()284 void KisModelIndexConverterTest::testIndexFromAddedAllowedDummyShowGlobalSelection()
285 {
286 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, true);
287
288 checkIndexFromAddedAllowedDummy(m_image->root(), 0, 0, 6, false);
289 checkIndexFromAddedAllowedDummy(m_image->root(), 1, 0, 5, false);
290 checkIndexFromAddedAllowedDummy(m_image->root(), 2, 0, 4, false);
291 checkIndexFromAddedAllowedDummy(m_image->root(), 3, 0, 3, false);
292 checkIndexFromAddedAllowedDummy(m_image->root(), 4, 0, 2, false);
293 checkIndexFromAddedAllowedDummy(m_image->root(), 5, 0, 1, false);
294 checkIndexFromAddedAllowedDummy(m_image->root(), 6, 0, 0, false);
295
296 checkIndexFromAddedAllowedDummy(m_layer1, 0, 4, 0, true);
297
298 checkIndexFromAddedAllowedDummy(m_layer3, 0, 1, 2, true);
299 checkIndexFromAddedAllowedDummy(m_layer3, 1, 1, 1, true);
300 checkIndexFromAddedAllowedDummy(m_layer3, 2, 1, 0, true);
301
302 checkInvalidIndexFromAddedAllowedDummy(0, 0);
303 }
304
testIndexFromAddedDeniedDummyShowGlobalSelection()305 void KisModelIndexConverterTest::testIndexFromAddedDeniedDummyShowGlobalSelection()
306 {
307 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, true);
308
309 checkIndexFromAddedDeniedDummy(m_image->root(), 0, 0, 6, false);
310 checkIndexFromAddedDeniedDummy(m_image->root(), 1, 0, 5, false);
311 checkIndexFromAddedDeniedDummy(m_image->root(), 2, 0, 4, false);
312 checkIndexFromAddedDeniedDummy(m_image->root(), 3, 0, 3, false);
313 checkIndexFromAddedDeniedDummy(m_image->root(), 4, 0, 2, false);
314 checkIndexFromAddedDeniedDummy(m_image->root(), 5, 0, 1, false);
315 checkIndexFromAddedDeniedDummy(m_image->root(), 6, 0, 0, false);
316
317 checkIndexFromAddedDeniedDummy(m_layer1, 0, 4, 0, true);
318
319 checkIndexFromAddedDeniedDummy(m_layer3, 0, 1, 2, true);
320 checkIndexFromAddedDeniedDummy(m_layer3, 1, 1, 1, true);
321 checkIndexFromAddedDeniedDummy(m_layer3, 2, 1, 0, true);
322
323 checkInvalidIndexFromAddedDeniedDummy(0, 0);
324 }
325
testDummyFromRowShowGlobalSelection()326 void KisModelIndexConverterTest::testDummyFromRowShowGlobalSelection()
327 {
328 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, true);
329
330 checkDummyFromRow(m_image->root(), 0, m_layer4);
331 checkDummyFromRow(m_image->root(), 1, m_layer3);
332 checkDummyFromRow(m_image->root(), 2, m_sel2);
333 checkDummyFromRow(m_image->root(), 3, m_layer2);
334 checkDummyFromRow(m_image->root(), 4, m_layer1);
335 checkDummyFromRow(m_image->root(), 5, m_sel1);
336
337 checkDummyFromRow(0, 0, m_layer4);
338 checkDummyFromRow(0, 1, m_layer3);
339 checkDummyFromRow(0, 2, m_sel2);
340 checkDummyFromRow(0, 3, m_layer2);
341 checkDummyFromRow(0, 4, m_layer1);
342 checkDummyFromRow(0, 5, m_sel1);
343
344 checkDummyFromRow(m_layer3, 0, m_sel3);
345 checkDummyFromRow(m_layer3, 1, m_mask1);
346 }
347
testRowCountShowGlobalSelection()348 void KisModelIndexConverterTest::testRowCountShowGlobalSelection()
349 {
350 m_indexConverter = new KisModelIndexConverter(m_dummiesFacade, m_nodeModel, true);
351
352 checkRowCount(m_image->root(), 6);
353 checkRowCount(0, 6);
354
355 checkRowCount(m_layer1, 0);
356 checkRowCount(m_layer2, 0);
357 checkRowCount(m_layer3, 2);
358 checkRowCount(m_layer4, 0);
359 }
360
testIndexFromDummyShowAll()361 void KisModelIndexConverterTest::testIndexFromDummyShowAll()
362 {
363 m_indexConverter = new KisModelIndexConverterShowAll(m_dummiesFacade, m_nodeModel);
364
365 checkIndexFromDummy(m_sel1, 5);
366 checkIndexFromDummy(m_layer1, 4);
367 checkIndexFromDummy(m_layer2, 3);
368 checkIndexFromDummy(m_sel2, 2);
369 checkIndexFromDummy(m_layer3, 1);
370 checkIndexFromDummy(m_layer4, 0);
371
372 checkIndexFromDummy(m_mask1, 1);
373 checkIndexFromDummy(m_sel3, 0);
374
375 checkIndexFromDummy(m_image->root(), 0);
376 }
377
testIndexFromAddedAllowedDummyShowAll()378 void KisModelIndexConverterTest::testIndexFromAddedAllowedDummyShowAll()
379 {
380 m_indexConverter = new KisModelIndexConverterShowAll(m_dummiesFacade, m_nodeModel);
381
382 checkIndexFromAddedAllowedDummy(m_image->root(), 0, 0, 6, true);
383 checkIndexFromAddedAllowedDummy(m_image->root(), 1, 0, 5, true);
384 checkIndexFromAddedAllowedDummy(m_image->root(), 2, 0, 4, true);
385 checkIndexFromAddedAllowedDummy(m_image->root(), 3, 0, 3, true);
386 checkIndexFromAddedAllowedDummy(m_image->root(), 4, 0, 2, true);
387 checkIndexFromAddedAllowedDummy(m_image->root(), 5, 0, 1, true);
388 checkIndexFromAddedAllowedDummy(m_image->root(), 6, 0, 0, true);
389
390 checkIndexFromAddedAllowedDummy(m_layer1, 0, 4, 0, true);
391
392 checkIndexFromAddedAllowedDummy(m_layer3, 0, 1, 2, true);
393 checkIndexFromAddedAllowedDummy(m_layer3, 1, 1, 1, true);
394 checkIndexFromAddedAllowedDummy(m_layer3, 2, 1, 0, true);
395
396 checkIndexFromAddedAllowedDummy(0, 0, 0, 0, false);
397 }
398
testIndexFromAddedDeniedDummyShowAll()399 void KisModelIndexConverterTest::testIndexFromAddedDeniedDummyShowAll()
400 {
401 m_indexConverter = new KisModelIndexConverterShowAll(m_dummiesFacade, m_nodeModel);
402
403 checkIndexFromAddedDeniedDummy(m_image->root(), 0, 0, 6, true);
404 checkIndexFromAddedDeniedDummy(m_image->root(), 1, 0, 5, true);
405 checkIndexFromAddedDeniedDummy(m_image->root(), 2, 0, 4, true);
406 checkIndexFromAddedDeniedDummy(m_image->root(), 3, 0, 3, true);
407 checkIndexFromAddedDeniedDummy(m_image->root(), 4, 0, 2, true);
408 checkIndexFromAddedDeniedDummy(m_image->root(), 5, 0, 1, true);
409 checkIndexFromAddedDeniedDummy(m_image->root(), 6, 0, 0, true);
410
411 checkIndexFromAddedDeniedDummy(m_layer1, 0, 4, 0, true);
412
413 checkIndexFromAddedDeniedDummy(m_layer3, 0, 1, 2, true);
414 checkIndexFromAddedDeniedDummy(m_layer3, 1, 1, 1, true);
415 checkIndexFromAddedDeniedDummy(m_layer3, 2, 1, 0, true);
416
417 checkIndexFromAddedDeniedDummy(0, 0, 0, 0, false);
418 }
419
testDummyFromRowShowAll()420 void KisModelIndexConverterTest::testDummyFromRowShowAll()
421 {
422 m_indexConverter = new KisModelIndexConverterShowAll(m_dummiesFacade, m_nodeModel);
423
424 checkDummyFromRow(m_image->root(), 0, m_layer4);
425 checkDummyFromRow(m_image->root(), 1, m_layer3);
426 checkDummyFromRow(m_image->root(), 2, m_sel2);
427 checkDummyFromRow(m_image->root(), 3, m_layer2);
428 checkDummyFromRow(m_image->root(), 4, m_layer1);
429 checkDummyFromRow(m_image->root(), 5, m_sel1);
430
431 checkDummyFromRow(0, 0, m_image->root());
432
433 checkDummyFromRow(m_layer3, 0, m_sel3);
434 checkDummyFromRow(m_layer3, 1, m_mask1);
435 }
436
437
testRowCountShowAll()438 void KisModelIndexConverterTest::testRowCountShowAll()
439 {
440 m_indexConverter = new KisModelIndexConverterShowAll(m_dummiesFacade, m_nodeModel);
441
442 checkRowCount(m_image->root(), 6);
443 checkRowCount(0, 1);
444
445 checkRowCount(m_layer1, 0);
446 checkRowCount(m_layer2, 0);
447 checkRowCount(m_layer3, 2);
448 checkRowCount(m_layer4, 0);
449 }
450
451 QTEST_MAIN(KisModelIndexConverterTest)
452