1 /* Extensive GtkTreeModelFilter tests.
2 * Copyright (C) 2009 Kristian Rietveld <kris@gtk.org>
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.
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.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
27 #define LEVEL_LENGTH 5
30 create_tree_store_set_values (GtkTreeStore *store,
36 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
37 gtk_tree_store_set (store, iter,
38 0, gtk_tree_path_to_string (path),
41 gtk_tree_path_free (path);
45 create_tree_store_recurse (int depth,
52 for (i = 0; i < LEVEL_LENGTH; i++)
56 gtk_tree_store_insert (store, &iter, parent, i);
57 create_tree_store_set_values (store, &iter, visible);
60 create_tree_store_recurse (depth - 1, store, &iter, visible);
65 create_tree_store (int depth,
70 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
72 create_tree_store_recurse (depth, store, NULL, visible);
87 GtkTreeModelFilter *filter;
91 filter_test_setup_generic (FilterTest *fixture,
92 gconstpointer test_data,
97 const GtkTreePath *vroot = test_data;
100 fixture->store = create_tree_store (depth, !empty);
102 /* Please forgive me for casting const away. */
103 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture->store),
104 (GtkTreePath *)vroot);
105 fixture->filter = GTK_TREE_MODEL_FILTER (filter);
108 gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
110 /* We need a tree view that's listening to get ref counting from that
113 fixture->tree_view = gtk_tree_view_new_with_model (filter);
117 filter_test_setup (FilterTest *fixture,
118 gconstpointer test_data)
120 filter_test_setup_generic (fixture, test_data, 3, FALSE, FALSE);
124 filter_test_setup_empty (FilterTest *fixture,
125 gconstpointer test_data)
127 filter_test_setup_generic (fixture, test_data, 3, TRUE, FALSE);
131 filter_test_setup_unfiltered (FilterTest *fixture,
132 gconstpointer test_data)
134 filter_test_setup_generic (fixture, test_data, 3, FALSE, TRUE);
138 filter_test_setup_empty_unfiltered (FilterTest *fixture,
139 gconstpointer test_data)
141 filter_test_setup_generic (fixture, test_data, 3, TRUE, TRUE);
145 filter_test_enable_filter (FilterTest *fixture)
147 gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
148 gtk_tree_model_filter_refilter (fixture->filter);
152 filter_test_teardown (FilterTest *fixture,
153 gconstpointer test_data)
155 g_object_unref (fixture->filter);
156 g_object_unref (fixture->store);
160 * Model structure validation
164 check_filter_model_recurse (FilterTest *fixture,
165 GtkTreePath *store_parent_path,
166 GtkTreePath *filter_parent_path)
169 GtkTreeIter store_iter;
170 GtkTreeIter filter_iter;
171 gboolean store_has_next, filter_has_next;
173 gtk_tree_path_down (store_parent_path);
174 gtk_tree_path_down (filter_parent_path);
176 store_has_next = gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
177 &store_iter, store_parent_path);
178 filter_has_next = gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->filter),
179 &filter_iter, filter_parent_path);
181 for (i = 0; i < LEVEL_LENGTH; i++)
185 g_return_if_fail (store_has_next == TRUE);
187 gtk_tree_model_get (GTK_TREE_MODEL (fixture->store),
195 gchar *filter_str, *store_str;
197 g_return_if_fail (filter_has_next == TRUE);
200 tmp = gtk_tree_model_get_path (GTK_TREE_MODEL (fixture->filter),
202 g_return_if_fail (gtk_tree_path_compare (tmp, filter_parent_path) == 0);
204 /* Verify model content */
205 gtk_tree_model_get (GTK_TREE_MODEL (fixture->store),
209 gtk_tree_model_get (GTK_TREE_MODEL (fixture->filter),
214 g_return_if_fail (g_strcmp0 (store_str, filter_str) == 0);
219 if (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->filter),
222 g_return_if_fail (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->store), &store_iter));
224 check_filter_model_recurse (fixture,
225 gtk_tree_path_copy (store_parent_path),
229 gtk_tree_path_next (filter_parent_path);
230 filter_has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->filter), &filter_iter);
233 gtk_tree_path_next (store_parent_path);
234 store_has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &store_iter);
237 /* Both models should have no more content! */
238 g_return_if_fail (store_has_next == FALSE);
239 g_return_if_fail (filter_has_next == FALSE);
241 gtk_tree_path_free (store_parent_path);
242 gtk_tree_path_free (filter_parent_path);
246 check_filter_model (FilterTest *fixture)
250 path = gtk_tree_path_new ();
252 check_filter_model_recurse (fixture, path, gtk_tree_path_copy (path));
256 check_filter_model_with_root (FilterTest *fixture,
259 check_filter_model_recurse (fixture,
260 gtk_tree_path_copy (path),
261 gtk_tree_path_new ());
267 check_level_length (GtkTreeModelFilter *filter,
273 int l = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (filter), NULL);
274 g_return_if_fail (l == length);
279 gboolean retrieved_iter = FALSE;
282 retrieved_iter = gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (filter),
284 g_return_if_fail (retrieved_iter);
285 l = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (filter), &iter);
286 g_return_if_fail (l == length);
291 set_path_visibility (FilterTest *fixture,
295 GtkTreeIter store_iter;
297 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store),
299 gtk_tree_store_set (fixture->store, &store_iter,
305 insert_path_with_visibility (FilterTest *fixture,
306 const gchar *path_string,
311 GtkTreeIter parent, iter;
313 path = gtk_tree_path_new_from_string (path_string);
314 position = gtk_tree_path_get_indices (path)[gtk_tree_path_get_depth (path)];
315 gtk_tree_path_up (path);
317 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &parent, path))
319 gtk_tree_store_insert (fixture->store, &iter, &parent, position);
320 create_tree_store_set_values (fixture->store, &iter, visible);
322 gtk_tree_path_free (path);
330 verify_test_suite (FilterTest *fixture,
331 gconstpointer user_data)
333 check_filter_model (fixture);
337 verify_test_suite_vroot (FilterTest *fixture,
338 gconstpointer user_data)
340 check_filter_model_with_root (fixture, (GtkTreePath *)user_data);
345 filled_hide_root_level (FilterTest *fixture,
346 gconstpointer user_data)
348 set_path_visibility (fixture, "2", FALSE);
349 check_filter_model (fixture);
350 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
352 set_path_visibility (fixture, "0", FALSE);
353 check_filter_model (fixture);
354 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
356 set_path_visibility (fixture, "4", FALSE);
357 check_filter_model (fixture);
358 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
362 set_path_visibility (fixture, "1", FALSE);
363 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
365 set_path_visibility (fixture, "3", FALSE);
366 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 5);
368 check_filter_model (fixture);
371 set_path_visibility (fixture, "1", TRUE);
372 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
374 set_path_visibility (fixture, "3", TRUE);
375 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
377 check_filter_model (fixture);
381 filled_hide_child_levels (FilterTest *fixture,
382 gconstpointer user_data)
384 set_path_visibility (fixture, "0:2", FALSE);
385 check_filter_model (fixture);
386 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
387 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 1);
389 set_path_visibility (fixture, "0:4", FALSE);
390 check_filter_model (fixture);
391 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
392 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
394 set_path_visibility (fixture, "0:4:3", FALSE);
395 check_filter_model (fixture);
396 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
397 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
399 set_path_visibility (fixture, "0:4:0", FALSE);
400 set_path_visibility (fixture, "0:4:1", FALSE);
401 set_path_visibility (fixture, "0:4:2", FALSE);
402 set_path_visibility (fixture, "0:4:4", FALSE);
403 check_filter_model (fixture);
404 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
405 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
407 set_path_visibility (fixture, "0:4", TRUE);
408 /* Since "0:2" is hidden, "0:4" must be "0:3" in the filter model */
409 check_filter_model (fixture);
410 check_level_length (fixture->filter, "0:3", 0);
412 set_path_visibility (fixture, "0:2", TRUE);
413 check_filter_model (fixture);
414 check_level_length (fixture->filter, "0:2", LEVEL_LENGTH);
415 check_level_length (fixture->filter, "0:3", LEVEL_LENGTH);
416 check_level_length (fixture->filter, "0:4", 0);
418 set_path_visibility (fixture, "0:4:2", TRUE);
419 set_path_visibility (fixture, "0:4:4", TRUE);
420 check_level_length (fixture->filter, "0:4", 2);
425 filled_vroot_hide_root_level (FilterTest *fixture,
426 gconstpointer user_data)
428 GtkTreePath *path = (GtkTreePath *)user_data;
430 /* These changes do not affect the filter's root level */
431 set_path_visibility (fixture, "0", FALSE);
432 check_filter_model_with_root (fixture, path);
433 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
434 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
436 set_path_visibility (fixture, "4", FALSE);
437 check_filter_model_with_root (fixture, path);
438 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
439 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
441 /* Even though we set the virtual root parent node to FALSE,
442 * the virtual root contents remain.
444 set_path_visibility (fixture, "2", FALSE);
445 check_filter_model_with_root (fixture, path);
446 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
447 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
450 set_path_visibility (fixture, "1", FALSE);
451 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
452 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
454 set_path_visibility (fixture, "3", FALSE);
455 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
456 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
458 check_filter_model_with_root (fixture, path);
461 set_path_visibility (fixture, "2", TRUE);
462 check_filter_model_with_root (fixture, path);
463 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
464 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
466 set_path_visibility (fixture, "1", TRUE);
467 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
468 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
470 set_path_visibility (fixture, "3", TRUE);
471 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
472 check_level_length (fixture->filter, "0", LEVEL_LENGTH);
474 check_filter_model_with_root (fixture, path);
476 /* Now test changes in the virtual root level */
477 set_path_visibility (fixture, "2:2", FALSE);
478 check_filter_model_with_root (fixture, path);
479 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
481 set_path_visibility (fixture, "2:4", FALSE);
482 check_filter_model_with_root (fixture, path);
483 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
485 set_path_visibility (fixture, "1:4", FALSE);
486 check_filter_model_with_root (fixture, path);
487 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
489 set_path_visibility (fixture, "2:4", TRUE);
490 check_filter_model_with_root (fixture, path);
491 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
493 set_path_visibility (fixture, "2", FALSE);
494 check_filter_model_with_root (fixture, path);
495 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
497 set_path_visibility (fixture, "2:0", FALSE);
498 set_path_visibility (fixture, "2:1", FALSE);
499 set_path_visibility (fixture, "2:2", FALSE);
500 set_path_visibility (fixture, "2:3", FALSE);
501 set_path_visibility (fixture, "2:4", FALSE);
502 check_filter_model_with_root (fixture, path);
503 check_level_length (fixture->filter, NULL, 0);
505 set_path_visibility (fixture, "2", TRUE);
506 check_filter_model_with_root (fixture, path);
507 check_level_length (fixture->filter, NULL, 0);
509 set_path_visibility (fixture, "1:4", FALSE);
510 check_filter_model_with_root (fixture, path);
511 check_level_length (fixture->filter, NULL, 0);
513 set_path_visibility (fixture, "2:4", TRUE);
514 check_filter_model_with_root (fixture, path);
515 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
517 set_path_visibility (fixture, "2:4", FALSE);
518 check_filter_model_with_root (fixture, path);
519 check_level_length (fixture->filter, NULL, 0);
521 set_path_visibility (fixture, "2", FALSE);
522 check_filter_model_with_root (fixture, path);
523 check_level_length (fixture->filter, NULL, 0);
525 set_path_visibility (fixture, "2:0", TRUE);
526 set_path_visibility (fixture, "2:1", TRUE);
527 set_path_visibility (fixture, "2:2", TRUE);
528 check_filter_model_with_root (fixture, path);
529 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
531 set_path_visibility (fixture, "2", TRUE);
532 check_filter_model_with_root (fixture, path);
533 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
537 filled_vroot_hide_child_levels (FilterTest *fixture,
538 gconstpointer user_data)
540 GtkTreePath *path = (GtkTreePath *)user_data;
542 set_path_visibility (fixture, "2:0:2", FALSE);
543 check_filter_model_with_root (fixture, path);
544 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
545 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 1);
547 set_path_visibility (fixture, "2:0:4", FALSE);
548 check_filter_model_with_root (fixture, path);
549 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
550 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
552 set_path_visibility (fixture, "2:0:4:3", FALSE);
553 check_filter_model_with_root (fixture, path);
554 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
555 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
557 set_path_visibility (fixture, "2:0:4:0", FALSE);
558 set_path_visibility (fixture, "2:0:4:1", FALSE);
559 set_path_visibility (fixture, "2:0:4:2", FALSE);
560 set_path_visibility (fixture, "2:0:4:4", FALSE);
561 check_filter_model_with_root (fixture, path);
562 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
563 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
565 set_path_visibility (fixture, "2:0:4", TRUE);
566 /* Since "0:2" is hidden, "0:4" must be "0:3" in the filter model */
567 check_filter_model_with_root (fixture, path);
568 check_level_length (fixture->filter, "0:3", 0);
570 set_path_visibility (fixture, "2:0:2", TRUE);
571 check_filter_model_with_root (fixture, path);
572 check_level_length (fixture->filter, "0:2", LEVEL_LENGTH);
573 check_level_length (fixture->filter, "0:3", LEVEL_LENGTH);
574 check_level_length (fixture->filter, "0:4", 0);
576 set_path_visibility (fixture, "2:0:4:2", TRUE);
577 set_path_visibility (fixture, "2:0:4:4", TRUE);
578 check_level_length (fixture->filter, "0:4", 2);
583 empty_show_nodes (FilterTest *fixture,
584 gconstpointer user_data)
586 check_filter_model (fixture);
587 check_level_length (fixture->filter, NULL, 0);
589 set_path_visibility (fixture, "3", TRUE);
590 check_filter_model (fixture);
591 check_level_length (fixture->filter, NULL, 1);
592 check_level_length (fixture->filter, "0", 0);
594 set_path_visibility (fixture, "3:2:2", TRUE);
595 check_filter_model (fixture);
596 check_level_length (fixture->filter, NULL, 1);
597 check_level_length (fixture->filter, "0", 0);
599 set_path_visibility (fixture, "3:2", TRUE);
600 check_filter_model (fixture);
601 check_level_length (fixture->filter, NULL, 1);
602 check_level_length (fixture->filter, "0", 1);
603 check_level_length (fixture->filter, "0:0", 1);
604 check_level_length (fixture->filter, "0:0:0", 0);
606 set_path_visibility (fixture, "3", FALSE);
607 check_filter_model (fixture);
608 check_level_length (fixture->filter, NULL, 0);
610 set_path_visibility (fixture, "3:2:1", TRUE);
611 set_path_visibility (fixture, "3", TRUE);
612 check_filter_model (fixture);
613 check_level_length (fixture->filter, NULL, 1);
614 check_level_length (fixture->filter, "0", 1);
615 check_level_length (fixture->filter, "0:0", 2);
616 check_level_length (fixture->filter, "0:0:0", 0);
620 empty_vroot_show_nodes (FilterTest *fixture,
621 gconstpointer user_data)
623 GtkTreePath *path = (GtkTreePath *)user_data;
625 check_filter_model_with_root (fixture, path);
626 check_level_length (fixture->filter, NULL, 0);
628 set_path_visibility (fixture, "2", TRUE);
629 check_filter_model_with_root (fixture, path);
630 check_level_length (fixture->filter, NULL, 0);
632 set_path_visibility (fixture, "2:2:2", TRUE);
633 check_filter_model_with_root (fixture, path);
634 check_level_length (fixture->filter, NULL, 0);
636 set_path_visibility (fixture, "2:2", TRUE);
637 check_filter_model_with_root (fixture, path);
638 check_level_length (fixture->filter, NULL, 1);
639 check_level_length (fixture->filter, "0", 1);
640 check_level_length (fixture->filter, "0:0", 0);
642 set_path_visibility (fixture, "3", TRUE);
643 check_filter_model_with_root (fixture, path);
644 check_level_length (fixture->filter, NULL, 1);
646 set_path_visibility (fixture, "2:2", FALSE);
647 check_filter_model_with_root (fixture, path);
648 check_level_length (fixture->filter, NULL, 0);
650 set_path_visibility (fixture, "2:2:1", TRUE);
651 set_path_visibility (fixture, "2:2", TRUE);
652 check_filter_model_with_root (fixture, path);
653 check_level_length (fixture->filter, NULL, 1);
654 check_level_length (fixture->filter, "0", 2);
655 check_level_length (fixture->filter, "0:1", 0);
660 unfiltered_hide_single (FilterTest *fixture,
661 gconstpointer user_data)
664 set_path_visibility (fixture, "2", FALSE);
666 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
668 filter_test_enable_filter (fixture);
670 check_filter_model (fixture);
671 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
675 unfiltered_hide_single_child (FilterTest *fixture,
676 gconstpointer user_data)
679 set_path_visibility (fixture, "2:2", FALSE);
681 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
682 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
684 filter_test_enable_filter (fixture);
686 check_filter_model (fixture);
687 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
688 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
692 unfiltered_hide_single_multi_level (FilterTest *fixture,
693 gconstpointer user_data)
696 set_path_visibility (fixture, "2:2:2", FALSE);
697 set_path_visibility (fixture, "2:2", FALSE);
699 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
700 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
701 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
703 filter_test_enable_filter (fixture);
705 check_filter_model (fixture);
706 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
707 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
709 set_path_visibility (fixture, "2:2", TRUE);
711 check_filter_model (fixture);
712 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
713 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
714 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH - 1);
719 unfiltered_show_single (FilterTest *fixture,
720 gconstpointer user_data)
723 set_path_visibility (fixture, "2", TRUE);
725 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
727 filter_test_enable_filter (fixture);
729 check_filter_model (fixture);
730 check_level_length (fixture->filter, NULL, 1);
734 unfiltered_show_single_child (FilterTest *fixture,
735 gconstpointer user_data)
738 set_path_visibility (fixture, "2:2", TRUE);
740 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
741 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
743 filter_test_enable_filter (fixture);
745 check_filter_model (fixture);
746 check_level_length (fixture->filter, NULL, 0);
748 /* From here we are filtered, "2" in the real model is "0" in the filter
751 set_path_visibility (fixture, "2", TRUE);
752 check_level_length (fixture->filter, NULL, 1);
753 check_level_length (fixture->filter, "0", 1);
757 unfiltered_show_single_multi_level (FilterTest *fixture,
758 gconstpointer user_data)
761 set_path_visibility (fixture, "2:2:2", TRUE);
762 set_path_visibility (fixture, "2:2", TRUE);
764 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
765 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
766 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
768 filter_test_enable_filter (fixture);
770 check_filter_model (fixture);
771 check_level_length (fixture->filter, NULL, 0);
773 /* From here we are filtered, "2" in the real model is "0" in the filter
776 set_path_visibility (fixture, "2", TRUE);
777 check_filter_model (fixture);
778 check_level_length (fixture->filter, NULL, 1);
779 check_level_length (fixture->filter, "0", 1);
780 check_level_length (fixture->filter, "0:0", 1);
785 specific_path_dependent_filter_func (GtkTreeModel *model,
791 path = gtk_tree_model_get_path (model, iter);
792 if (gtk_tree_path_get_indices (path)[0] < 4)
799 specific_path_dependent_filter (void)
805 GtkTreeModel *filter;
807 list = gtk_list_store_new (1, G_TYPE_INT);
808 gtk_list_store_insert_with_values (list, &iter, 0, 0, 1, -1);
809 gtk_list_store_insert_with_values (list, &iter, 1, 0, 2, -1);
810 gtk_list_store_insert_with_values (list, &iter, 2, 0, 3, -1);
811 gtk_list_store_insert_with_values (list, &iter, 3, 0, 4, -1);
812 gtk_list_store_insert_with_values (list, &iter, 4, 0, 5, -1);
813 gtk_list_store_insert_with_values (list, &iter, 5, 0, 6, -1);
814 gtk_list_store_insert_with_values (list, &iter, 6, 0, 7, -1);
815 gtk_list_store_insert_with_values (list, &iter, 7, 0, 8, -1);
817 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (list));
818 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (sort), NULL);
819 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
820 specific_path_dependent_filter_func,
823 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), 0,
824 GTK_SORT_DESCENDING);
826 for (i = 0; i < 4; i++)
828 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
830 gtk_list_store_remove (list, &iter);
832 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
834 gtk_list_store_remove (list, &iter);
840 specific_append_after_collapse_visible_func (GtkTreeModel *model,
845 gboolean hide_negative_numbers;
847 gtk_tree_model_get (model, iter, 1, &number, -1);
848 hide_negative_numbers = GPOINTER_TO_INT (g_object_get_data (data, "private-hide-negative-numbers"));
850 return (number >= 0 || !hide_negative_numbers);
854 specific_append_after_collapse (void)
856 /* This test is based on one of the test cases I found in my
857 * old test cases directory. I unfortunately do not have a record
858 * from who this test case originated. -Kris.
862 * - Show tree, expand, collapse.
867 GtkTreeIter child_iter;
868 GtkTreeIter child_iter2;
869 GtkTreePath *append_path;
871 GtkTreeModel *filter;
875 GtkWidget *tree_view;
877 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
879 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
880 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
881 GINT_TO_POINTER (FALSE));
882 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
883 specific_append_after_collapse_visible_func,
886 sort = gtk_tree_model_sort_new_with_model (filter);
888 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
889 tree_view = gtk_tree_view_new_with_model (sort);
890 gtk_container_add (GTK_CONTAINER (window), tree_view);
891 gtk_widget_realize (tree_view);
893 while (gtk_events_pending ())
894 gtk_main_iteration ();
896 gtk_tree_store_prepend (store, &iter, NULL);
897 gtk_tree_store_set (store, &iter,
898 0, "hallo", 1, 1, -1);
900 gtk_tree_store_append (store, &child_iter, &iter);
901 gtk_tree_store_set (store, &child_iter,
902 0, "toemaar", 1, 1, -1);
904 gtk_tree_store_append (store, &child_iter2, &child_iter);
905 gtk_tree_store_set (store, &child_iter2,
906 0, "very deep", 1, 1, -1);
908 append_path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &child_iter2);
910 gtk_tree_store_append (store, &child_iter, &iter);
911 gtk_tree_store_set (store, &child_iter,
914 gtk_tree_store_append (store, &child_iter, &iter);
915 gtk_tree_store_set (store, &child_iter,
916 0, "some word", 1, -1, -1);
918 /* Expand and collapse the tree */
919 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
920 while (gtk_events_pending ())
921 gtk_main_iteration ();
923 gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
924 while (gtk_events_pending ())
925 gtk_main_iteration ();
928 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
929 GINT_TO_POINTER (TRUE));
931 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, append_path))
933 gtk_tree_store_append (store, &child_iter, &iter);
934 gtk_tree_store_set (store, &child_iter,
935 0, "new new new !!", 1, 1, -1);
937 gtk_tree_path_free (append_path);
940 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
941 while (gtk_events_pending ())
942 gtk_main_iteration ();
947 specific_sort_filter_remove_node_compare_func (GtkTreeModel *model,
956 specific_sort_filter_remove_node_visible_func (GtkTreeModel *model,
962 /* Do reference the model */
963 gtk_tree_model_get (model, iter, 0, &item, -1);
970 specific_sort_filter_remove_node (void)
972 /* This test is based on one of the test cases I found in my
973 * old test cases directory. I unfortunately do not have a record
974 * from who this test case originated. -Kris.
977 * - Create tree store, sort, filter models. The sort model has
978 * a default sort func that is enabled, filter model a visible func
979 * that defaults to returning FALSE.
980 * - Remove a node from the tree store.
985 GtkTreeModel *filter;
989 GtkWidget *tree_view;
991 store = gtk_tree_store_new (1, G_TYPE_STRING);
992 gtk_tree_store_append (store, &iter, NULL);
993 gtk_tree_store_set (store, &iter, 0, "Hello1", -1);
995 gtk_tree_store_append (store, &iter, NULL);
996 gtk_tree_store_set (store, &iter, 0, "Hello2", -1);
998 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
999 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
1000 specific_sort_filter_remove_node_compare_func, NULL, NULL);
1002 filter = gtk_tree_model_filter_new (sort, NULL);
1003 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1004 specific_sort_filter_remove_node_visible_func,
1008 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1009 tree_view = gtk_tree_view_new_with_model (filter);
1010 gtk_container_add (GTK_CONTAINER (window), tree_view);
1011 gtk_widget_realize (tree_view);
1013 while (gtk_events_pending ())
1014 gtk_main_iteration ();
1017 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
1018 gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter);
1019 gtk_tree_store_remove (store, &iter);
1021 while (gtk_events_pending ())
1022 gtk_main_iteration ();
1027 specific_sort_filter_remove_root (void)
1029 /* This test is based on one of the test cases I found in my
1030 * old test cases directory. I unfortunately do not have a record
1031 * from who this test case originated. -Kris.
1034 GtkTreeModel *model, *sort, *filter;
1035 GtkTreeIter root, mid, leaf;
1038 model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_INT));
1039 gtk_tree_store_append (GTK_TREE_STORE (model), &root, NULL);
1040 gtk_tree_store_append (GTK_TREE_STORE (model), &mid, &root);
1041 gtk_tree_store_append (GTK_TREE_STORE (model), &leaf, &mid);
1043 path = gtk_tree_model_get_path (model, &mid);
1045 sort = gtk_tree_model_sort_new_with_model (model);
1046 filter = gtk_tree_model_filter_new (sort, path);
1048 gtk_tree_store_remove (GTK_TREE_STORE (model), &root);
1050 g_object_unref (filter);
1051 g_object_unref (sort);
1052 g_object_unref (model);
1057 specific_root_mixed_visibility (void)
1060 /* A bit nasty, apologies */
1062 GtkTreeModel *filter;
1065 fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
1067 for (i = 0; i < LEVEL_LENGTH; i++)
1071 gtk_tree_store_insert (fixture.store, &iter, NULL, i);
1073 create_tree_store_set_values (fixture.store, &iter, TRUE);
1075 create_tree_store_set_values (fixture.store, &iter, FALSE);
1078 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
1079 fixture.filter = GTK_TREE_MODEL_FILTER (filter);
1081 gtk_tree_model_filter_set_visible_column (fixture.filter, 1);
1083 /* In order to trigger the potential bug, we should not access
1084 * the filter model here (so don't call the check functions).
1087 /* Change visibility of an odd row to TRUE */
1088 set_path_visibility (&fixture, "3", TRUE);
1089 check_filter_model (&fixture);
1090 check_level_length (fixture.filter, NULL, 4);
1095 specific_filter_add_child (void)
1097 /* This test is based on one of the test cases I found in my
1098 * old test cases directory. I unfortunately do not have a record
1099 * from who this test case originated. -Kris.
1103 GtkTreeIter iter_first;
1105 GtkTreeStore *store;
1106 GtkTreeModel *filter;
1108 store = gtk_tree_store_new (1, G_TYPE_STRING);
1110 gtk_tree_store_append (store, &iter_first, NULL);
1111 gtk_tree_store_set (store, &iter_first, 0, "Hello", -1);
1113 gtk_tree_store_append (store, &iter, NULL);
1114 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1116 gtk_tree_store_append (store, &iter, NULL);
1117 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1119 gtk_tree_store_append (store, &iter, NULL);
1120 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1122 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1124 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1125 gtk_tree_store_append (store, &child, &iter_first);
1126 gtk_tree_store_set (store, &child, 0, "Hello", -1);
1131 specific_bug_300089 (void)
1133 /* Test case for GNOME Bugzilla bug 300089. Written by
1136 GtkTreeModel *sort_model, *child_model;
1138 GtkTreeIter iter, iter2, sort_iter;
1140 child_model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING));
1142 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
1143 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
1144 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
1145 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "B", -1);
1147 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
1148 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "D", -1);
1149 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
1150 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "E", -1);
1152 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
1153 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "C", -1);
1156 sort_model = GTK_TREE_MODEL (gtk_tree_model_sort_new_with_model (child_model));
1157 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model),
1158 0, GTK_SORT_ASCENDING);
1160 path = gtk_tree_path_new_from_indices (1, 1, -1);
1162 /* make sure a level is constructed */
1163 gtk_tree_model_get_iter (sort_model, &sort_iter, path);
1165 /* change the "E" row in a way that causes it to change position */
1166 gtk_tree_model_get_iter (child_model, &iter, path);
1167 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
1172 specific_bug_301558_sort_func (GtkTreeModel *model,
1179 gtk_tree_model_get (model, a, 0, &i, -1);
1180 gtk_tree_model_get (model, b, 0, &j, -1);
1186 specific_bug_301558 (void)
1188 /* Test case for GNOME Bugzilla bug 301558 provided by
1192 GtkTreeModel *filter;
1194 GtkTreeIter root, iter, iter2;
1199 tree = gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_BOOLEAN);
1200 gtk_tree_store_append (tree, &iter, NULL);
1201 gtk_tree_store_set (tree, &iter, 0, 123, 1, TRUE, -1);
1202 gtk_tree_store_append (tree, &iter2, &iter);
1203 gtk_tree_store_set (tree, &iter2, 0, 73, 1, TRUE, -1);
1205 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (tree));
1206 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
1207 specific_bug_301558_sort_func,
1210 filter = gtk_tree_model_filter_new (sort, NULL);
1211 gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (filter), 1);
1213 view = gtk_tree_view_new_with_model (filter);
1215 while (gtk_events_pending ())
1216 gtk_main_iteration ();
1220 for (i = 0; i < 10; i++)
1222 if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (tree), &root))
1223 g_assert_not_reached ();
1227 gtk_tree_store_append (tree, &iter, &root);
1228 gtk_tree_store_set (tree, &iter, 0, 456, 1, TRUE, -1);
1233 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (tree), &root);
1234 gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (tree), &iter,
1236 gtk_tree_store_remove (tree, &iter);
1245 specific_bug_311955_filter_func (GtkTreeModel *model,
1251 gtk_tree_model_get (model, iter, 0, &value, -1);
1253 return (value != 0);
1257 specific_bug_311955 (void)
1259 /* This is a test case for GNOME Bugzilla bug 311955. It was written
1262 GtkTreeIter iter, child, root;
1263 GtkTreeStore *store;
1265 GtkTreeModel *filter;
1268 GtkWidget *tree_view;
1272 store = gtk_tree_store_new (1, G_TYPE_INT);
1274 gtk_tree_store_append (store, &root, NULL);
1275 gtk_tree_store_set (store, &root, 0, 33, -1);
1277 gtk_tree_store_append (store, &iter, &root);
1278 gtk_tree_store_set (store, &iter, 0, 50, -1);
1280 gtk_tree_store_append (store, &iter, NULL);
1281 gtk_tree_store_set (store, &iter, 0, 22, -1);
1283 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1284 filter = gtk_tree_model_filter_new (sort, NULL);
1286 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1287 specific_bug_311955_filter_func,
1290 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1291 tree_view = gtk_tree_view_new_with_model (filter);
1292 g_object_unref (store);
1294 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
1296 while (gtk_events_pending ())
1297 gtk_main_iteration ();
1300 for (i = 0; i < 4; i++)
1302 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1304 gtk_tree_store_append (store, &iter, &root);
1307 gtk_tree_store_set (store, &iter, 0, i, -1);
1311 gtk_tree_store_append (store, &child, &iter);
1312 gtk_tree_store_set (store, &child, 0, 10, -1);
1316 while (gtk_events_pending ())
1317 gtk_main_iteration ();
1319 /* Remove bottommost child from the tree. */
1320 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1321 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &root);
1323 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter, &root, n - 2))
1325 if (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &child, &iter))
1326 gtk_tree_store_remove (store, &child);
1329 g_assert_not_reached ();
1333 specific_bug_346800 (void)
1335 /* This is a test case for GNOME Bugzilla bug 346800. It was written
1336 * by Jonathan Matthew.
1339 GtkTreeIter node_iters[50];
1340 GtkTreeIter child_iters[50];
1341 GtkTreeModel *model;
1342 GtkTreeModelFilter *filter;
1343 GtkTreeStore *store;
1347 columns = g_new (GType, 2);
1348 columns[0] = G_TYPE_STRING;
1349 columns[1] = G_TYPE_BOOLEAN;
1350 store = gtk_tree_store_newv (2, columns);
1351 model = GTK_TREE_MODEL (store);
1353 filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
1354 gtk_tree_model_filter_set_visible_column (filter, 1);
1356 for (i=0; i<items; i++)
1358 /* allocate random amounts of junk, otherwise the filter model's arrays can expand without moving */
1361 gtk_tree_store_append (store, &node_iters[i], NULL);
1362 gtk_tree_store_set (store, &node_iters[i],
1364 1, ((i%6) == 0) ? FALSE : TRUE,
1368 gtk_tree_store_append (store, &child_iters[i], &node_iters[i]);
1369 gtk_tree_store_set (store, &child_iters[i],
1370 0, "something else",
1373 gtk_tree_model_filter_refilter (filter);
1377 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-1], 1,
1378 (i & 1) ? TRUE : FALSE, -1);
1379 gtk_tree_model_filter_refilter (filter);
1381 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-2], 1,
1382 (i & 1) ? FALSE: TRUE, -1);
1383 gtk_tree_model_filter_refilter (filter);
1390 specific_bug_364946 (void)
1392 /* This is a test case for GNOME Bugzilla bug 364946. It was written
1393 * by Andreas Koehler.
1395 GtkTreeStore *store;
1396 GtkTreeIter a, aa, aaa, aab, iter;
1397 GtkTreeModel *s_model;
1399 store = gtk_tree_store_new (1, G_TYPE_STRING);
1401 gtk_tree_store_append (store, &a, NULL);
1402 gtk_tree_store_set (store, &a, 0, "0", -1);
1404 gtk_tree_store_append (store, &aa, &a);
1405 gtk_tree_store_set (store, &aa, 0, "0:0", -1);
1407 gtk_tree_store_append (store, &aaa, &aa);
1408 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1410 gtk_tree_store_append (store, &aab, &aa);
1411 gtk_tree_store_set (store, &aab, 0, "0:0:1", -1);
1413 s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1414 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model), 0,
1415 GTK_SORT_ASCENDING);
1417 gtk_tree_model_get_iter_from_string (s_model, &iter, "0:0:0");
1419 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1420 gtk_tree_store_remove (store, &aaa);
1421 gtk_tree_store_remove (store, &aab);
1423 gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (s_model));
1428 specific_bug_464173_visible_func (GtkTreeModel *model,
1432 gboolean *visible = (gboolean *)data;
1438 specific_bug_464173 (void)
1440 /* Test case for GNOME Bugzilla bug 464173, test case written
1441 * by Andreas Koehler.
1443 GtkTreeStore *model;
1444 GtkTreeModelFilter *f_model;
1445 GtkTreeIter iter1, iter2;
1447 gboolean visible = TRUE;
1449 model = gtk_tree_store_new (1, G_TYPE_STRING);
1450 gtk_tree_store_append (model, &iter1, NULL);
1451 gtk_tree_store_set (model, &iter1, 0, "Foo", -1);
1452 gtk_tree_store_append (model, &iter2, &iter1);
1453 gtk_tree_store_set (model, &iter2, 0, "Bar", -1);
1455 f_model = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL(model), NULL));
1456 gtk_tree_model_filter_set_visible_func (f_model,
1457 specific_bug_464173_visible_func,
1460 view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (f_model));
1463 gtk_tree_model_filter_refilter (f_model);
1468 specific_bug_540201_filter_func (GtkTreeModel *model,
1472 gboolean has_children;
1474 has_children = gtk_tree_model_iter_has_child (model, iter);
1476 return has_children;
1480 specific_bug_540201 (void)
1482 /* Test case for GNOME Bugzilla bug 540201, steps provided by
1485 GtkTreeIter iter, root;
1486 GtkTreeStore *store;
1487 GtkTreeModel *filter;
1489 GtkWidget *tree_view;
1491 store = gtk_tree_store_new (1, G_TYPE_INT);
1493 gtk_tree_store_append (store, &root, NULL);
1494 gtk_tree_store_set (store, &root, 0, 33, -1);
1496 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1497 tree_view = gtk_tree_view_new_with_model (filter);
1499 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1500 specific_bug_540201_filter_func,
1503 gtk_tree_store_append (store, &iter, &root);
1504 gtk_tree_store_set (store, &iter, 0, 50, -1);
1506 gtk_tree_store_append (store, &iter, &root);
1507 gtk_tree_store_set (store, &iter, 0, 22, -1);
1510 gtk_tree_store_append (store, &root, NULL);
1511 gtk_tree_store_set (store, &root, 0, 33, -1);
1513 gtk_tree_store_append (store, &iter, &root);
1514 gtk_tree_store_set (store, &iter, 0, 22, -1);
1519 specific_bug_549287_visible_func (GtkTreeModel *model,
1523 gboolean result = FALSE;
1525 result = gtk_tree_model_iter_has_child (model, iter);
1531 specific_bug_549287 (void)
1533 /* Test case for GNOME Bugzilla bug 529287, provided by Julient Puydt */
1536 GtkTreeStore *store;
1537 GtkTreeModel *filtered;
1540 GtkTreeIter *swap, *parent, *child;
1542 store = gtk_tree_store_new (1, G_TYPE_STRING);
1543 filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1544 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filtered),
1545 specific_bug_549287_visible_func,
1548 view = gtk_tree_view_new_with_model (filtered);
1550 for (i = 0; i < 4; i++)
1552 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
1554 parent = gtk_tree_iter_copy (&iter);
1555 child = gtk_tree_iter_copy (&iter);
1557 while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store),
1566 gtk_tree_store_append (store, child, parent);
1567 gtk_tree_store_set (store, child,
1571 gtk_tree_iter_free (parent);
1572 gtk_tree_iter_free (child);
1576 gtk_tree_store_append (store, &iter, NULL);
1577 gtk_tree_store_set (store, &iter,
1582 /* since we inserted something, we changed the visibility conditions: */
1583 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filtered));
1593 gtk_test_init (&argc, &argv, NULL);
1595 g_test_add ("/FilterModel/self/verify-test-suite",
1599 filter_test_teardown);
1601 g_test_add ("/FilterModel/self/verify-test-suite/vroot/depth-1",
1602 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1604 verify_test_suite_vroot,
1605 filter_test_teardown);
1606 g_test_add ("/FilterModel/self/verify-test-suite/vroot/depth-2",
1607 FilterTest, gtk_tree_path_new_from_indices (2, 3, -1),
1609 verify_test_suite_vroot,
1610 filter_test_teardown);
1613 g_test_add ("/FilterModel/filled/hide-root-level",
1616 filled_hide_root_level,
1617 filter_test_teardown);
1618 g_test_add ("/FilterModel/filled/hide-child-levels",
1621 filled_hide_child_levels,
1622 filter_test_teardown);
1624 g_test_add ("/FilterModel/filled/hide-root-level/vroot",
1625 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1627 filled_vroot_hide_root_level,
1628 filter_test_teardown);
1629 g_test_add ("/FilterModel/filled/hide-child-levels/vroot",
1630 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1632 filled_vroot_hide_child_levels,
1633 filter_test_teardown);
1636 g_test_add ("/FilterModel/empty/show-nodes",
1638 filter_test_setup_empty,
1640 filter_test_teardown);
1642 g_test_add ("/FilterModel/empty/show-nodes/vroot",
1643 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1644 filter_test_setup_empty,
1645 empty_vroot_show_nodes,
1646 filter_test_teardown);
1649 g_test_add ("/FilterModel/unfiltered/hide-single",
1651 filter_test_setup_unfiltered,
1652 unfiltered_hide_single,
1653 filter_test_teardown);
1654 g_test_add ("/FilterModel/unfiltered/hide-single-child",
1656 filter_test_setup_unfiltered,
1657 unfiltered_hide_single_child,
1658 filter_test_teardown);
1659 g_test_add ("/FilterModel/unfiltered/hide-single-multi-level",
1661 filter_test_setup_unfiltered,
1662 unfiltered_hide_single_multi_level,
1663 filter_test_teardown);
1665 g_test_add ("/FilterModel/unfiltered/show-single",
1667 filter_test_setup_empty_unfiltered,
1668 unfiltered_show_single,
1669 filter_test_teardown);
1670 g_test_add ("/FilterModel/unfiltered/show-single-child",
1672 filter_test_setup_empty_unfiltered,
1673 unfiltered_show_single_child,
1674 filter_test_teardown);
1675 g_test_add ("/FilterModel/unfiltered/show-single-multi-level",
1677 filter_test_setup_empty_unfiltered,
1678 unfiltered_show_single_multi_level,
1679 filter_test_teardown);
1682 g_test_add_func ("/FilterModel/specific/path-dependent-filter",
1683 specific_path_dependent_filter);
1684 g_test_add_func ("/FilterModel/specific/append-after-collapse",
1685 specific_append_after_collapse);
1686 g_test_add_func ("/FilterModel/specific/sort-filter-remove-node",
1687 specific_sort_filter_remove_node);
1688 g_test_add_func ("/FilterModel/specific/sort-filter-remove-root",
1689 specific_sort_filter_remove_root);
1690 g_test_add_func ("/FilterModel/specific/root-mixed-visibility",
1691 specific_root_mixed_visibility);
1692 g_test_add_func ("/FilterModel/specific/filter-add-child",
1693 specific_filter_add_child);
1695 g_test_add_func ("/FilterModel/specific/bug-300089",
1696 specific_bug_300089);
1697 g_test_add_func ("/FilterModel/specific/bug-301558",
1698 specific_bug_301558);
1699 g_test_add_func ("/FilterModel/specific/bug-311955",
1700 specific_bug_311955);
1701 g_test_add_func ("/FilterModel/specific/bug-346800",
1702 specific_bug_346800);
1703 g_test_add_func ("/FilterModel/specific/bug-364946",
1704 specific_bug_364946);
1705 g_test_add_func ("/FilterModel/specific/bug-464173",
1706 specific_bug_464173);
1707 g_test_add_func ("/FilterModel/specific/bug-540201",
1708 specific_bug_540201);
1709 g_test_add_func ("/FilterModel/specific/bug-549287",
1710 specific_bug_549287);
1712 return g_test_run ();