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