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