1/* GtkTreeModel ref counting tests
2 * Copyright (C) 2011 Kristian Rietveld <kris@gtk.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library 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 GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "gtktreemodelrefcount.h"
19#include "treemodel.h"
20
21/* And the tests themselves */
22
23static void
24test_list_no_reference (void)
25{
26 GtkTreeIter iter;
27 GtkTreeModel *model;
28 GtkTreeModelRefCount *ref_model;
29
30 model = gtk_tree_model_ref_count_new ();
31 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
32
33 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
34 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
35 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
36 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
37 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
38
39 assert_root_level_unreferenced (ref_model);
40
41 g_object_unref (object: ref_model);
42}
43
44static void
45test_list_reference_during_creation (void)
46{
47 GtkTreeIter iter;
48 GtkTreeModel *model;
49 GtkTreeModelRefCount *ref_model;
50 GtkWidget *tree_view;
51
52 model = gtk_tree_model_ref_count_new ();
53 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
54 tree_view = gtk_tree_view_new_with_model (model);
55
56 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
57 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
58 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
59 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
60 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
61
62 assert_root_level_referenced (ref_model, ref_count: 1);
63
64 g_object_unref (g_object_ref_sink (tree_view));
65
66 assert_root_level_unreferenced (ref_model);
67
68 g_object_unref (object: ref_model);
69}
70
71static void
72test_list_reference_after_creation (void)
73{
74 GtkTreeIter iter;
75 GtkTreeModel *model;
76 GtkTreeModelRefCount *ref_model;
77 GtkWidget *tree_view;
78
79 model = gtk_tree_model_ref_count_new ();
80 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
81
82 assert_root_level_unreferenced (ref_model);
83
84 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
85 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
86 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
87 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
88 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
89
90 tree_view = gtk_tree_view_new_with_model (model);
91
92 assert_root_level_referenced (ref_model, ref_count: 1);
93
94 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
95 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
96
97 assert_root_level_referenced (ref_model, ref_count: 1);
98
99 g_object_unref (g_object_ref_sink (tree_view));
100
101 assert_root_level_unreferenced (ref_model);
102
103 g_object_unref (object: ref_model);
104}
105
106static void
107test_list_reference_reordered (void)
108{
109 GtkTreeIter iter1, iter2, iter3, iter4, iter5;
110 GtkTreeModel *model;
111 GtkTreeModelRefCount *ref_model;
112 GtkWidget *tree_view;
113
114 model = gtk_tree_model_ref_count_new ();
115 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
116
117 assert_root_level_unreferenced (ref_model);
118
119 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
120 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
121 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter3, NULL);
122 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter4, NULL);
123 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter5, NULL);
124
125 tree_view = gtk_tree_view_new_with_model (model);
126
127 assert_root_level_referenced (ref_model, ref_count: 1);
128
129 gtk_tree_store_move_after (GTK_TREE_STORE (model),
130 iter: &iter1, position: &iter5);
131
132 assert_root_level_referenced (ref_model, ref_count: 1);
133
134 gtk_tree_store_move_after (GTK_TREE_STORE (model),
135 iter: &iter3, position: &iter4);
136
137 assert_root_level_referenced (ref_model, ref_count: 1);
138
139 g_object_unref (g_object_ref_sink (tree_view));
140
141 assert_root_level_unreferenced (ref_model);
142
143 g_object_unref (object: ref_model);
144}
145
146
147static void
148test_tree_no_reference (void)
149{
150 GtkTreeIter iter, child;
151 GtkTreeModel *model;
152 GtkTreeModelRefCount *ref_model;
153
154 model = gtk_tree_model_ref_count_new ();
155 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
156
157 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
158 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
159 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
160 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
161 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
162 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
163 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
164 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
165 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
166 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
167 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
168
169 assert_entire_model_unreferenced (ref_model);
170
171 g_object_unref (object: ref_model);
172}
173
174static void
175test_tree_reference_during_creation (void)
176{
177 GtkTreeIter iter, child;
178 GtkTreeModel *model;
179 GtkTreeModelRefCount *ref_model;
180 GtkWidget *tree_view;
181
182 model = gtk_tree_model_ref_count_new ();
183 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
184 tree_view = gtk_tree_view_new_with_model (model);
185
186 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
187 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
188 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
189 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
190 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
191 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
192 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
193 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
194 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
195 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
196 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
197
198 assert_root_level_referenced (ref_model, ref_count: 1);
199 assert_not_entire_model_referenced (ref_model, ref_count: 1);
200 assert_level_unreferenced (ref_model, iter: &child);
201
202 g_object_unref (g_object_ref_sink (tree_view));
203
204 assert_entire_model_unreferenced (ref_model);
205
206 g_object_unref (object: ref_model);
207}
208
209static void
210test_tree_reference_after_creation (void)
211{
212 GtkTreeIter iter, child;
213 GtkTreeModel *model;
214 GtkTreeModelRefCount *ref_model;
215 GtkWidget *tree_view;
216
217 model = gtk_tree_model_ref_count_new ();
218 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
219
220 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
221 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
222 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
223 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
224 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
225 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
226 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
227 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
228 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
229 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
230 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
231
232 assert_entire_model_unreferenced (ref_model);
233
234 tree_view = gtk_tree_view_new_with_model (model);
235
236 assert_root_level_referenced (ref_model, ref_count: 1);
237 assert_not_entire_model_referenced (ref_model, ref_count: 1);
238 assert_level_unreferenced (ref_model, iter: &child);
239
240 g_object_unref (g_object_ref_sink (tree_view));
241
242 assert_entire_model_unreferenced (ref_model);
243
244 g_object_unref (object: ref_model);
245}
246
247static void
248test_tree_reference_reordered (void)
249{
250 GtkTreeIter parent;
251 GtkTreeIter iter1, iter2, iter3, iter4, iter5;
252 GtkTreeModel *model;
253 GtkTreeModelRefCount *ref_model;
254 GtkWidget *tree_view;
255
256 model = gtk_tree_model_ref_count_new ();
257 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
258
259 assert_root_level_unreferenced (ref_model);
260
261 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &parent, NULL);
262 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, parent: &parent);
263 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, parent: &parent);
264 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter3, parent: &parent);
265 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter4, parent: &parent);
266 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter5, parent: &parent);
267
268 tree_view = gtk_tree_view_new_with_model (model);
269 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
270
271 assert_entire_model_referenced (ref_model, ref_count: 1);
272
273 gtk_tree_store_move_after (GTK_TREE_STORE (model),
274 iter: &iter1, position: &iter5);
275
276 assert_entire_model_referenced (ref_model, ref_count: 1);
277
278 gtk_tree_store_move_after (GTK_TREE_STORE (model),
279 iter: &iter3, position: &iter4);
280
281 assert_entire_model_referenced (ref_model, ref_count: 1);
282
283 g_object_unref (g_object_ref_sink (tree_view));
284
285 assert_entire_model_unreferenced (ref_model);
286
287 g_object_unref (object: ref_model);
288}
289
290static void
291test_tree_reference_expand_all (void)
292{
293 GtkTreeIter iter, child;
294 GtkTreeModel *model;
295 GtkTreeModelRefCount *ref_model;
296 GtkWidget *tree_view;
297
298 model = gtk_tree_model_ref_count_new ();
299 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
300
301 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
302 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
303 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
304 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
305 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
306 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
307 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
308 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
309 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
310 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
311 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
312
313 assert_entire_model_unreferenced (ref_model);
314
315 tree_view = gtk_tree_view_new_with_model (model);
316
317 assert_root_level_referenced (ref_model, ref_count: 1);
318 assert_not_entire_model_referenced (ref_model, ref_count: 1);
319 assert_level_unreferenced (ref_model, iter: &child);
320
321 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
322
323 assert_entire_model_referenced (ref_model, ref_count: 1);
324
325 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
326 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
327 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
328
329 assert_root_level_referenced (ref_model, ref_count: 1);
330 assert_not_entire_model_referenced (ref_model, ref_count: 1);
331 assert_level_unreferenced (ref_model, iter: &child);
332
333 g_object_unref (g_object_ref_sink (tree_view));
334
335 assert_entire_model_unreferenced (ref_model);
336
337 g_object_unref (object: ref_model);
338}
339
340static void
341test_tree_reference_collapse_all (void)
342{
343 GtkTreeIter iter, child;
344 GtkTreeModel *model;
345 GtkTreeModelRefCount *ref_model;
346 GtkWidget *tree_view;
347
348 model = gtk_tree_model_ref_count_new ();
349 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
350
351 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
352 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
353 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
354 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
355 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
356 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
357 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
358 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
359 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter, NULL);
360 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
361 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &iter);
362
363 assert_entire_model_unreferenced (ref_model);
364
365 tree_view = gtk_tree_view_new_with_model (model);
366 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
367
368 assert_entire_model_referenced (ref_model, ref_count: 1);
369
370 gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
371
372 assert_root_level_referenced (ref_model, ref_count: 1);
373 assert_not_entire_model_referenced (ref_model, ref_count: 1);
374 assert_level_unreferenced (ref_model, iter: &child);
375
376 g_object_unref (g_object_ref_sink (tree_view));
377
378 assert_entire_model_unreferenced (ref_model);
379
380 g_object_unref (object: ref_model);
381}
382
383static void
384test_tree_reference_expand_collapse (void)
385{
386 GtkTreeIter parent1, parent2, child;
387 GtkTreePath *path1, *path2;
388 GtkTreeModel *model;
389 GtkTreeModelRefCount *ref_model;
390 GtkWidget *tree_view;
391
392 model = gtk_tree_model_ref_count_new ();
393 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
394 tree_view = gtk_tree_view_new_with_model (model);
395
396 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &parent1, NULL);
397 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &parent1);
398 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &parent1);
399 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &parent2, NULL);
400 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &parent2, NULL);
401 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &parent2);
402 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child, parent: &parent2);
403
404 path1 = gtk_tree_model_get_path (tree_model: model, iter: &parent1);
405 path2 = gtk_tree_model_get_path (tree_model: model, iter: &parent2);
406
407 assert_level_unreferenced (ref_model, iter: &parent1);
408 assert_level_unreferenced (ref_model, iter: &parent2);
409
410 gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path: path1, FALSE);
411
412 assert_level_referenced (ref_model, ref_count: 1, iter: &parent1);
413 assert_level_unreferenced (ref_model, iter: &parent2);
414
415 gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree_view), path: path1);
416
417 assert_level_unreferenced (ref_model, iter: &parent1);
418 assert_level_unreferenced (ref_model, iter: &parent2);
419
420 gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path: path2, FALSE);
421
422 assert_level_unreferenced (ref_model, iter: &parent1);
423 assert_level_referenced (ref_model, ref_count: 1, iter: &parent2);
424
425 gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree_view), path: path2);
426
427 assert_level_unreferenced (ref_model, iter: &parent1);
428 assert_level_unreferenced (ref_model, iter: &parent2);
429
430 gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path: path2, FALSE);
431
432 assert_level_unreferenced (ref_model, iter: &parent1);
433 assert_level_referenced (ref_model, ref_count: 1, iter: &parent2);
434
435 gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path: path1, FALSE);
436
437 assert_level_referenced (ref_model, ref_count: 1, iter: &parent1);
438 assert_level_referenced (ref_model, ref_count: 1, iter: &parent2);
439
440 gtk_tree_path_free (path: path1);
441 gtk_tree_path_free (path: path2);
442
443 g_object_unref (g_object_ref_sink (tree_view));
444 g_object_unref (object: ref_model);
445}
446
447static void
448test_row_reference_list (void)
449{
450 GtkTreeIter iter0, iter1, iter2;
451 GtkTreePath *path;
452 GtkTreeModel *model;
453 GtkTreeModelRefCount *ref_model;
454 GtkTreeRowReference *row_ref;
455 GtkWidget *tree_view;
456
457 model = gtk_tree_model_ref_count_new ();
458 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
459
460 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter0, NULL);
461 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
462 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
463
464 assert_root_level_unreferenced (ref_model);
465
466 /* create and remove a row ref and check reference counts */
467 path = gtk_tree_path_new_from_indices (first_index: 1, -1);
468 row_ref = gtk_tree_row_reference_new (model, path);
469
470 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
471 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
472 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 0);
473
474 gtk_tree_row_reference_free (reference: row_ref);
475
476 assert_root_level_unreferenced (ref_model);
477
478 /* the same, but then also with a tree view monitoring the model */
479 tree_view = gtk_tree_view_new_with_model (model);
480
481 assert_root_level_referenced (ref_model, ref_count: 1);
482
483 row_ref = gtk_tree_row_reference_new (model, path);
484
485 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
486 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 2);
487 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
488
489 g_object_unref (g_object_ref_sink (tree_view));
490
491 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
492 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
493 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 0);
494
495 gtk_tree_row_reference_free (reference: row_ref);
496
497 assert_root_level_unreferenced (ref_model);
498
499 gtk_tree_path_free (path);
500
501 g_object_unref (object: ref_model);
502}
503
504static void
505test_row_reference_list_remove (void)
506{
507 GtkTreeIter iter0, iter1, iter2;
508 GtkTreePath *path;
509 GtkTreeModel *model;
510 GtkTreeModelRefCount *ref_model;
511 GtkTreeRowReference *row_ref;
512
513 model = gtk_tree_model_ref_count_new ();
514 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
515
516 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter0, NULL);
517 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
518 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
519
520 assert_root_level_unreferenced (ref_model);
521
522 /* test creating the row reference and then removing the node */
523 path = gtk_tree_path_new_from_indices (first_index: 1, -1);
524 row_ref = gtk_tree_row_reference_new (model, path);
525
526 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
527 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
528 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 0);
529
530 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &iter1);
531
532 assert_root_level_unreferenced (ref_model);
533
534 gtk_tree_row_reference_free (reference: row_ref);
535
536 assert_root_level_unreferenced (ref_model);
537
538 /* test creating a row ref, removing another node and then removing
539 * the row ref node.
540 */
541 row_ref = gtk_tree_row_reference_new (model, path);
542
543 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
544 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
545
546 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &iter0);
547
548 assert_root_level_referenced (ref_model, ref_count: 1);
549
550 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &iter2);
551
552 g_assert_false (gtk_tree_model_get_iter_first (model, &iter0));
553
554 gtk_tree_row_reference_free (reference: row_ref);
555
556 gtk_tree_path_free (path);
557
558 g_object_unref (object: ref_model);
559}
560
561static void
562test_row_reference_tree (void)
563{
564 GtkTreeIter iter0, iter1, iter2;
565 GtkTreeIter child0, child1, child2;
566 GtkTreeIter grandchild0, grandchild1, grandchild2;
567 GtkTreePath *path;
568 GtkTreeModel *model;
569 GtkTreeModelRefCount *ref_model;
570 GtkTreeRowReference *row_ref, *row_ref1;
571 GtkWidget *tree_view;
572
573 model = gtk_tree_model_ref_count_new ();
574 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
575
576 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter0, NULL);
577 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child0, parent: &iter0);
578 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild0, parent: &child0);
579 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
580 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child1, parent: &iter1);
581 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild1, parent: &child1);
582 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
583 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child2, parent: &iter2);
584 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild2, parent: &child2);
585
586 assert_entire_model_unreferenced (ref_model);
587
588 /* create and remove a row ref and check reference counts */
589 path = gtk_tree_path_new_from_indices (first_index: 1, 0, 0, -1);
590 row_ref = gtk_tree_row_reference_new (model, path);
591 gtk_tree_path_free (path);
592
593 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
594 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
595 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
596 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
597 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
598 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 1);
599 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 0);
600 assert_node_ref_count (ref_model, iter: &child2, ref_count: 0);
601 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
602
603 gtk_tree_row_reference_free (reference: row_ref);
604
605 assert_entire_model_unreferenced (ref_model);
606
607 /* again, with path 1:1 */
608 path = gtk_tree_path_new_from_indices (first_index: 1, 0, -1);
609 row_ref = gtk_tree_row_reference_new (model, path);
610 gtk_tree_path_free (path);
611
612 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
613 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
614 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
615 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
616 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
617 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 0);
618 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 0);
619 assert_node_ref_count (ref_model, iter: &child2, ref_count: 0);
620 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
621
622 gtk_tree_row_reference_free (reference: row_ref);
623
624 assert_entire_model_unreferenced (ref_model);
625
626 /* both row refs existent at once and also with a tree view monitoring
627 * the model
628 */
629 tree_view = gtk_tree_view_new_with_model (model);
630
631 assert_root_level_referenced (ref_model, ref_count: 1);
632
633 path = gtk_tree_path_new_from_indices (first_index: 1, 0, 0, -1);
634 row_ref = gtk_tree_row_reference_new (model, path);
635 gtk_tree_path_free (path);
636
637 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
638 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
639 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
640 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 2);
641 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
642 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 1);
643 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
644 assert_node_ref_count (ref_model, iter: &child2, ref_count: 0);
645 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
646
647 path = gtk_tree_path_new_from_indices (first_index: 1, 0, -1);
648 row_ref1 = gtk_tree_row_reference_new (model, path);
649 gtk_tree_path_free (path);
650
651 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
652 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
653 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
654 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 3);
655 assert_node_ref_count (ref_model, iter: &child1, ref_count: 2);
656 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 1);
657 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
658 assert_node_ref_count (ref_model, iter: &child2, ref_count: 0);
659 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
660
661 gtk_tree_row_reference_free (reference: row_ref);
662
663 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
664 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
665 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
666 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 2);
667 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
668 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 0);
669 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
670 assert_node_ref_count (ref_model, iter: &child2, ref_count: 0);
671 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
672
673 g_object_unref (g_object_ref_sink (tree_view));
674
675 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
676 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
677 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
678 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
679 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
680 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 0);
681 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 0);
682 assert_node_ref_count (ref_model, iter: &child2, ref_count: 0);
683 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
684
685 gtk_tree_row_reference_free (reference: row_ref1);
686
687 assert_root_level_unreferenced (ref_model);
688
689 g_object_unref (object: ref_model);
690}
691
692static void
693test_row_reference_tree_remove (void)
694{
695 GtkTreeIter iter0, iter1, iter2;
696 GtkTreeIter child0, child1, child2;
697 GtkTreeIter grandchild0, grandchild1, grandchild2;
698 GtkTreePath *path;
699 GtkTreeModel *model;
700 GtkTreeModelRefCount *ref_model;
701 GtkTreeRowReference *row_ref, *row_ref1, *row_ref2;
702
703 model = gtk_tree_model_ref_count_new ();
704 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
705
706 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter0, NULL);
707 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child0, parent: &iter0);
708 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild0, parent: &child0);
709 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
710 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child1, parent: &iter1);
711 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild1, parent: &child1);
712 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
713 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child2, parent: &iter2);
714 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild2, parent: &child2);
715
716 assert_entire_model_unreferenced (ref_model);
717
718 path = gtk_tree_path_new_from_indices (first_index: 1, 0, 0, -1);
719 row_ref = gtk_tree_row_reference_new (model, path);
720 gtk_tree_path_free (path);
721
722 path = gtk_tree_path_new_from_indices (first_index: 2, 0, -1);
723 row_ref1 = gtk_tree_row_reference_new (model, path);
724 gtk_tree_path_free (path);
725
726 path = gtk_tree_path_new_from_indices (first_index: 2, -1);
727 row_ref2 = gtk_tree_row_reference_new (model, path);
728 gtk_tree_path_free (path);
729
730 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
731 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
732 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
733 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
734 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
735 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 1);
736 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 2);
737 assert_node_ref_count (ref_model, iter: &child2, ref_count: 1);
738 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
739
740 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &grandchild1);
741
742 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
743 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
744 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
745 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 0);
746 assert_node_ref_count (ref_model, iter: &child1, ref_count: 0);
747 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 2);
748 assert_node_ref_count (ref_model, iter: &child2, ref_count: 1);
749 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
750
751 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &child2);
752
753 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
754 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
755 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
756 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 0);
757 assert_node_ref_count (ref_model, iter: &child1, ref_count: 0);
758 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
759
760 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &iter2);
761
762 assert_entire_model_unreferenced (ref_model);
763
764 gtk_tree_row_reference_free (reference: row_ref);
765 gtk_tree_row_reference_free (reference: row_ref1);
766 gtk_tree_row_reference_free (reference: row_ref2);
767
768 g_object_unref (object: ref_model);
769}
770
771static void
772test_row_reference_tree_remove_ancestor (void)
773{
774 GtkTreeIter iter0, iter1, iter2;
775 GtkTreeIter child0, child1, child2;
776 GtkTreeIter grandchild0, grandchild1, grandchild2;
777 GtkTreePath *path;
778 GtkTreeModel *model;
779 GtkTreeModelRefCount *ref_model;
780 GtkTreeRowReference *row_ref, *row_ref1;
781
782 model = gtk_tree_model_ref_count_new ();
783 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
784
785 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter0, NULL);
786 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child0, parent: &iter0);
787 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild0, parent: &child0);
788 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
789 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child1, parent: &iter1);
790 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild1, parent: &child1);
791 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
792 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child2, parent: &iter2);
793 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild2, parent: &child2);
794
795 assert_entire_model_unreferenced (ref_model);
796
797 path = gtk_tree_path_new_from_indices (first_index: 1, 0, 0, -1);
798 row_ref = gtk_tree_row_reference_new (model, path);
799 gtk_tree_path_free (path);
800
801 path = gtk_tree_path_new_from_indices (first_index: 2, 0, -1);
802 row_ref1 = gtk_tree_row_reference_new (model, path);
803 gtk_tree_path_free (path);
804
805 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
806 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
807 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
808 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
809 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
810 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 1);
811 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
812 assert_node_ref_count (ref_model, iter: &child2, ref_count: 1);
813 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
814
815 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &child1);
816
817 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 0);
818 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
819 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
820 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 0);
821 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 1);
822 assert_node_ref_count (ref_model, iter: &child2, ref_count: 1);
823 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 0);
824
825 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &iter2);
826
827 assert_entire_model_unreferenced (ref_model);
828
829 gtk_tree_row_reference_free (reference: row_ref);
830 gtk_tree_row_reference_free (reference: row_ref1);
831
832 g_object_unref (object: ref_model);
833}
834
835static void
836test_row_reference_tree_expand (void)
837{
838 GtkTreeIter iter0, iter1, iter2;
839 GtkTreeIter child0, child1, child2;
840 GtkTreeIter grandchild0, grandchild1, grandchild2;
841 GtkTreePath *path;
842 GtkTreeModel *model;
843 GtkTreeModelRefCount *ref_model;
844 GtkTreeRowReference *row_ref, *row_ref1, *row_ref2;
845 GtkWidget *tree_view;
846
847 model = gtk_tree_model_ref_count_new ();
848 ref_model = GTK_TREE_MODEL_REF_COUNT (model);
849 tree_view = gtk_tree_view_new_with_model (model);
850
851 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter0, NULL);
852 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child0, parent: &iter0);
853 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild0, parent: &child0);
854 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter1, NULL);
855 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child1, parent: &iter1);
856 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild1, parent: &child1);
857 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &iter2, NULL);
858 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &child2, parent: &iter2);
859 gtk_tree_store_append (GTK_TREE_STORE (model), iter: &grandchild2, parent: &child2);
860
861 assert_root_level_referenced (ref_model, ref_count: 1);
862
863 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
864
865 assert_entire_model_referenced (ref_model, ref_count: 1);
866
867 path = gtk_tree_path_new_from_indices (first_index: 1, 0, 0, -1);
868 row_ref = gtk_tree_row_reference_new (model, path);
869 gtk_tree_path_free (path);
870
871 path = gtk_tree_path_new_from_indices (first_index: 2, 0, -1);
872 row_ref1 = gtk_tree_row_reference_new (model, path);
873 gtk_tree_path_free (path);
874
875 path = gtk_tree_path_new_from_indices (first_index: 2, -1);
876 row_ref2 = gtk_tree_row_reference_new (model, path);
877 gtk_tree_path_free (path);
878
879 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
880 assert_node_ref_count (ref_model, iter: &child0, ref_count: 1);
881 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 1);
882 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 2);
883 assert_node_ref_count (ref_model, iter: &child1, ref_count: 2);
884 assert_node_ref_count (ref_model, iter: &grandchild1, ref_count: 2);
885 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 3);
886 assert_node_ref_count (ref_model, iter: &child2, ref_count: 2);
887 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 1);
888
889 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &grandchild1);
890
891 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
892 assert_node_ref_count (ref_model, iter: &child0, ref_count: 1);
893 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 1);
894 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
895 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
896 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 3);
897 assert_node_ref_count (ref_model, iter: &child2, ref_count: 2);
898 assert_node_ref_count (ref_model, iter: &grandchild2, ref_count: 1);
899
900 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &child2);
901
902 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
903 assert_node_ref_count (ref_model, iter: &child0, ref_count: 1);
904 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 1);
905 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
906 assert_node_ref_count (ref_model, iter: &child1, ref_count: 1);
907 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 2);
908
909 gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
910
911 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
912 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
913 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
914 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
915 assert_node_ref_count (ref_model, iter: &child1, ref_count: 0);
916 assert_node_ref_count (ref_model, iter: &iter2, ref_count: 2);
917
918 gtk_tree_store_remove (GTK_TREE_STORE (model), iter: &iter2);
919
920 assert_node_ref_count (ref_model, iter: &iter0, ref_count: 1);
921 assert_node_ref_count (ref_model, iter: &child0, ref_count: 0);
922 assert_node_ref_count (ref_model, iter: &grandchild0, ref_count: 0);
923 assert_node_ref_count (ref_model, iter: &iter1, ref_count: 1);
924 assert_node_ref_count (ref_model, iter: &child1, ref_count: 0);
925
926 gtk_tree_row_reference_free (reference: row_ref);
927 gtk_tree_row_reference_free (reference: row_ref1);
928 gtk_tree_row_reference_free (reference: row_ref2);
929
930 g_object_unref (g_object_ref_sink (tree_view));
931 g_object_unref (object: ref_model);
932}
933
934void
935register_model_ref_count_tests (void)
936{
937 /* lists (though based on GtkTreeStore) */
938 g_test_add_func (testpath: "/TreeModel/ref-count/list/no-reference",
939 test_func: test_list_no_reference);
940 g_test_add_func (testpath: "/TreeModel/ref-count/list/reference-during-creation",
941 test_func: test_list_reference_during_creation);
942 g_test_add_func (testpath: "/TreeModel/ref-count/list/reference-after-creation",
943 test_func: test_list_reference_after_creation);
944 g_test_add_func (testpath: "/TreeModel/ref-count/list/reference-reordered",
945 test_func: test_list_reference_reordered);
946
947 /* trees */
948 g_test_add_func (testpath: "/TreeModel/ref-count/tree/no-reference",
949 test_func: test_tree_no_reference);
950 g_test_add_func (testpath: "/TreeModel/ref-count/tree/reference-during-creation",
951 test_func: test_tree_reference_during_creation);
952 g_test_add_func (testpath: "/TreeModel/ref-count/tree/reference-after-creation",
953 test_func: test_tree_reference_after_creation);
954 g_test_add_func (testpath: "/TreeModel/ref-count/tree/expand-all",
955 test_func: test_tree_reference_expand_all);
956 g_test_add_func (testpath: "/TreeModel/ref-count/tree/collapse-all",
957 test_func: test_tree_reference_collapse_all);
958 g_test_add_func (testpath: "/TreeModel/ref-count/tree/expand-collapse",
959 test_func: test_tree_reference_expand_collapse);
960 g_test_add_func (testpath: "/TreeModel/ref-count/tree/reference-reordered",
961 test_func: test_tree_reference_reordered);
962
963 /* row references */
964 g_test_add_func (testpath: "/TreeModel/ref-count/row-reference/list",
965 test_func: test_row_reference_list);
966 g_test_add_func (testpath: "/TreeModel/ref-count/row-reference/list-remove",
967 test_func: test_row_reference_list_remove);
968 g_test_add_func (testpath: "/TreeModel/ref-count/row-reference/tree",
969 test_func: test_row_reference_tree);
970 g_test_add_func (testpath: "/TreeModel/ref-count/row-reference/tree-remove",
971 test_func: test_row_reference_tree_remove);
972 g_test_add_func (testpath: "/TreeModel/ref-count/row-reference/tree-remove-ancestor",
973 test_func: test_row_reference_tree_remove_ancestor);
974 g_test_add_func (testpath: "/TreeModel/ref-count/row-reference/tree-expand",
975 test_func: test_row_reference_tree_expand);
976}
977

source code of gtk/testsuite/gtk/modelrefcount.c