1 /*
2  *  Copyright (c) 2007 Boudewijn Rempt <boud@valdyas.org>
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_node_facade_test.h"
20 #include <QTest>
21 #include <limits.h>
22 
23 
24 #include "kis_node_facade.h"
25 #include "kis_types.h"
26 #include "kis_global.h"
27 #include "testutil.h"
28 
testCreation()29 void KisNodeFacadeTest::testCreation()
30 {
31     TestUtil::TestGraphListener graphListener;
32 
33     KisNodeSP node = new TestNodeA();
34     QVERIFY(node->graphListener() == 0);
35 
36     KisNodeFacade facade(node);
37     QVERIFY(facade.root() == node);
38 
39     node->setGraphListener(&graphListener);
40     QVERIFY(node->graphListener() != 0);
41 
42     // Test contract for initial state
43     QVERIFY(node->parent() == 0);
44     QVERIFY(node->firstChild() == 0);
45     QVERIFY(node->lastChild() == 0);
46     QVERIFY(node->prevSibling() == 0);
47     QVERIFY(node->nextSibling() == 0);
48     QVERIFY(node->childCount() == 0);
49     QVERIFY(node->at(0) == 0);
50     QVERIFY(node->at(UINT_MAX) == 0);
51     QVERIFY(node->index(0) == -1);
52 
53 }
54 
dumpNodeStack(KisNodeSP node,QString prefix=QString ("\\t"))55 void dumpNodeStack(KisNodeSP node, QString prefix = QString("\t"))
56 {
57     for (uint i = 0; i < node->childCount(); ++i) {
58         if (node->at(i)->parent())
59             dbgImage << prefix << "\t" << node->at(i) << "node at" << i << " has index from parent:" << node->index(node->at(i));
60 
61         if (node->at(i)->childCount() > 0) {
62             dumpNodeStack(node->at(i), prefix + '\t');
63         }
64     }
65 
66 }
67 
testOrdering()68 void KisNodeFacadeTest::testOrdering()
69 {
70     TestUtil::TestGraphListener graphListener;
71 
72     KisNodeSP root = new TestNodeA();
73     root->setGraphListener(&graphListener);
74 
75     KisNodeFacade facade(root);
76 
77     KisNodeSP node1 = new TestNodeA();
78     KisNodeSP node2 = new TestNodeA();
79     KisNodeSP node3 = new TestNodeA();
80     KisNodeSP node4 = new TestNodeA();
81     KisNodeSP node5 = new TestNodeA();
82 
83     /*
84      +---------+
85      | node 4  |
86      | node 2  |
87      |   node 3|
88      | node 1  |
89      |root     |
90      +---------+
91     */
92 
93     graphListener.resetBools();
94     QVERIFY(facade.addNode(node1, root, root->childCount()) == true);
95     QVERIFY(graphListener.beforeInsertRow == true);
96     QVERIFY(graphListener.afterInsertRow == true);
97     QVERIFY(graphListener.beforeRemoveRow == false);
98     QVERIFY(graphListener.afterRemoveRow == false);
99     QVERIFY(root->firstChild() == node1);
100     QVERIFY(root->lastChild() == node1);
101     QVERIFY(root->childCount() == 1);
102     graphListener.resetBools();
103 
104     QVERIFY(facade.addNode(node2, root, root->childCount()) == true);
105     QVERIFY(graphListener.beforeInsertRow == true);
106     QVERIFY(graphListener.afterInsertRow == true);
107     QVERIFY(graphListener.beforeRemoveRow == false);
108     QVERIFY(graphListener.afterRemoveRow == false);
109     QVERIFY(root->firstChild() == node1);
110     QVERIFY(root->lastChild() == node2);
111     QVERIFY(root->childCount() == 2);
112     graphListener.resetBools();
113 
114     QVERIFY(facade.addNode(node3, node1) == true);
115     QVERIFY(graphListener.beforeInsertRow == true);
116     QVERIFY(graphListener.afterInsertRow == true);
117     QVERIFY(graphListener.beforeRemoveRow == false);
118     QVERIFY(graphListener.afterRemoveRow == false);
119     QVERIFY(root->firstChild() == node1);
120     QVERIFY(root->lastChild() == node2);
121     QVERIFY(root->childCount() == 2);
122     QVERIFY(node1->childCount() == 1);
123     graphListener.resetBools();
124 
125     QVERIFY(facade.addNode(node4, root, root->lastChild()) == true);
126     QVERIFY(graphListener.beforeInsertRow == true);
127     QVERIFY(graphListener.afterInsertRow == true);
128     QVERIFY(graphListener.beforeRemoveRow == false);
129     QVERIFY(graphListener.afterRemoveRow == false);
130     QVERIFY(root->firstChild() == node1);
131     QVERIFY(root->lastChild() == node4);
132     QVERIFY(root->childCount() == 3);
133     graphListener.resetBools();
134 
135     QVERIFY(node1->parent() == root);
136     QVERIFY(node2->parent() == root);
137     QVERIFY(node3->parent() == node1);
138     QVERIFY(node4->parent() == root);
139 
140     QVERIFY(root->firstChild() == node1);
141     QVERIFY(root->lastChild() == node4);
142 
143     QVERIFY(root->at(0) == node1);
144     QVERIFY(root->at(1) == node2);
145     QVERIFY(root->at(2) == node4);
146     QVERIFY(node1->at(0) == node3);
147 
148     QVERIFY(root->index(node1) == 0);
149     QVERIFY(root->index(node2) == 1);
150     QVERIFY(root->index(node4) == 2);
151     QVERIFY(node1->index(node3) == 0);
152 
153     QVERIFY(node4->prevSibling() == node2);
154     QVERIFY(node2->prevSibling() == node1);
155     QVERIFY(node1->prevSibling() == 0);
156     QVERIFY(node3->prevSibling() == 0);
157 
158     QVERIFY(node4->nextSibling() == 0);
159     QVERIFY(node2->nextSibling() == node4);
160     QVERIFY(node1->nextSibling() == node2);
161     QVERIFY(node3->nextSibling() == 0);
162 
163     /*
164           node 4
165         node 2
166           node 3
167         node 1
168        root
169      */
170     graphListener.resetBools();
171     QVERIFY(facade.removeNode(node4) == true);
172     QVERIFY(node4->parent() == 0);
173     QVERIFY(graphListener.beforeInsertRow == false);
174     QVERIFY(graphListener.afterInsertRow == false);
175     QVERIFY(graphListener.beforeRemoveRow == true);
176     QVERIFY(graphListener.afterRemoveRow == true);
177     QVERIFY(root->childCount() == 2);
178     QVERIFY(root->lastChild() == node2);
179     QVERIFY(root->firstChild() == node1);
180     QVERIFY(node4->prevSibling() == 0);
181     QVERIFY(node4->nextSibling() == 0);
182     graphListener.resetBools();
183 
184     QVERIFY(facade.addNode(node4, node3) == true);
185     QVERIFY(graphListener.beforeInsertRow == true);
186     QVERIFY(graphListener.afterInsertRow == true);
187     QVERIFY(graphListener.beforeRemoveRow == false);
188     QVERIFY(graphListener.afterRemoveRow == false);
189     QVERIFY(root->childCount() == 2);
190     QVERIFY(root->lastChild() == node2);
191     QVERIFY(root->firstChild() == node1);
192     QVERIFY(node3->childCount() == 1);
193     QVERIFY(node3->firstChild() == node4);
194     QVERIFY(node3->lastChild() == node4);
195     QVERIFY(node4->prevSibling() == 0);
196     QVERIFY(node4->nextSibling() == 0);
197     graphListener.resetBools();
198 
199     QVERIFY(facade.removeNode(node4) == true);
200     QVERIFY(graphListener.beforeInsertRow == false);
201     QVERIFY(graphListener.afterInsertRow == false);
202     QVERIFY(graphListener.beforeRemoveRow == true);
203     QVERIFY(graphListener.afterRemoveRow == true);
204     QVERIFY(node3->childCount() == 0);
205     QVERIFY(node4->parent() == 0);
206     QVERIFY(root->childCount() == 2);
207     QVERIFY(root->lastChild() == node2);
208     QVERIFY(root->firstChild() == node1);
209     QVERIFY(node4->prevSibling() == 0);
210     QVERIFY(node4->nextSibling() == 0);
211     graphListener.resetBools();
212 
213     QVERIFY(facade.addNode(node4, node2) == true);
214     graphListener.resetBools();
215 
216     QVERIFY(graphListener.beforeMove == false);
217     QVERIFY(graphListener.afterMove == false);
218     QVERIFY(facade.moveNode(node3, root, 0) == true);
219     QVERIFY(graphListener.beforeMove == true);
220     QVERIFY(graphListener.afterMove == true);
221     graphListener.resetBools();
222 
223     /*
224             node4
225           node2
226           node1
227         node 3
228       root
229 
230      */
231 
232     QVERIFY(facade.moveNode(node1, node3, 0) == true);
233     QVERIFY(facade.moveNode(node2, node3, node1) == true);
234 
235     QVERIFY(graphListener.beforeInsertRow == true);
236     QVERIFY(graphListener.afterInsertRow == true);
237     QVERIFY(graphListener.beforeRemoveRow == true);
238     QVERIFY(graphListener.afterRemoveRow == true);
239     graphListener.resetBools();
240 
241     QVERIFY(facade.moveNode(node4, node4, node4) == false);
242 
243     QVERIFY(graphListener.beforeInsertRow == false);
244     QVERIFY(graphListener.afterInsertRow == false);
245     QVERIFY(graphListener.beforeRemoveRow == false);
246     QVERIFY(graphListener.afterRemoveRow == false);
247     graphListener.resetBools();
248 
249     QCOMPARE(root->childCount(), 1u);
250     QVERIFY(root->firstChild() == node3);
251     QVERIFY(root->lastChild() == node3);
252     QVERIFY(node3->childCount() == 2);
253     QVERIFY(node3->firstChild() == node1);
254     QVERIFY(node3->lastChild() == node2);
255 
256     /*
257         node4
258       node2
259       node5
260       node1
261      node3
262     root
263     */
264     QVERIFY(facade.addNode(node5, node3, node1) == true);
265     QVERIFY(node5->parent() == node3);
266     QVERIFY(node5->prevSibling() == node1);
267     QVERIFY(node5->nextSibling() == node2);
268 
269     /*
270        node5
271          node4
272        node2
273        node1
274       node3
275      root
276     */
277 
278     QVERIFY(facade.raiseNode(node5) == true);
279     QVERIFY(node5->parent() == node3);
280     QVERIFY(node5->nextSibling() == 0);
281     QVERIFY(node5->prevSibling() == node2);
282 
283     // Try raising topnode to top
284     QVERIFY(facade.raiseNode(node5) == true);
285     QVERIFY(node5->parent() == node3);
286     QVERIFY(node5->nextSibling() == 0);
287     QVERIFY(node5->prevSibling() == node2);
288 
289     /*
290        node5
291        node1
292          node4
293        node2
294       node3
295      root
296     */
297     QVERIFY(facade.lowerNode(node2) == true);
298     QVERIFY(node2->nextSibling() == node1);
299     QVERIFY(node2->prevSibling() == 0);
300 
301     // Try lowering bottomnode to bottomg
302     QVERIFY(facade.lowerNode(node2) == true);
303     QVERIFY(node2->nextSibling() == node1);
304     QVERIFY(node2->prevSibling() == 0);
305 
306     /**
307        node4
308      node2
309      node5
310      node1
311     node3
312     root
313     */
314     QVERIFY(facade.toTop(node2) == true);
315     QVERIFY(node2->nextSibling() == 0);
316     QVERIFY(node2->prevSibling() == node5);
317 
318     /**
319      node5
320      node1
321        node4
322      node2
323     node3
324     root
325     */
326     QVERIFY(facade.toBottom(node2) == true);
327     QVERIFY(node2->nextSibling() == node1);
328     QVERIFY(node2->prevSibling() == 0);
329 
330 }
331 
332 
testMove()333 void KisNodeFacadeTest::testMove()
334 {
335     TestUtil::TestGraphListener graphListener;
336 
337     KisNodeSP root = new TestNodeA();
338     root->setGraphListener(&graphListener);
339 
340     KisNodeFacade facade(root);
341 
342     KisNodeSP node1 = new TestNodeA();
343     node1->setName("node1");
344     KisNodeSP node2 = new TestNodeA();
345     node2->setName("node2");
346     KisNodeSP node3 = new TestNodeA();
347     node3->setName("node3");
348 
349     facade.addNode(node1);
350     facade.addNode(node2);
351     facade.addNode(node3);
352 
353     QVERIFY(root->at(0) == node1);
354     QVERIFY(root->at(1) == node2);
355     QVERIFY(root->at(2) == node3);
356 
357     facade.moveNode(node3, root, node1);
358 
359     QVERIFY(root->at(0) == node1);
360     QVERIFY(root->at(1) == node3);
361     QVERIFY(root->at(2) == node2);
362 
363 }
364 
365 QTEST_MAIN(KisNodeFacadeTest)
366