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 (FilterTest *fixture,
92 gconstpointer test_data)
94 fixture->store = create_tree_store (3, TRUE);
95 fixture->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture->store), NULL));
96 gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
98 /* We need a tree view that's listening to get ref counting from that
101 fixture->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (fixture->filter));
105 filter_test_setup_empty (FilterTest *fixture,
106 gconstpointer test_data)
108 fixture->store = create_tree_store (3, FALSE);
109 fixture->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture->store), NULL));
110 gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
112 /* We need a tree view that's listening to get ref counting from that
115 fixture->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (fixture->filter));
119 filter_test_setup_unfiltered (FilterTest *fixture,
120 gconstpointer test_data)
122 fixture->store = create_tree_store (3, TRUE);
123 fixture->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture->store), NULL));
125 /* We need a tree view that's listening to get ref counting from that
128 fixture->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (fixture->filter));
132 filter_test_setup_empty_unfiltered (FilterTest *fixture,
133 gconstpointer test_data)
135 fixture->store = create_tree_store (3, FALSE);
136 fixture->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture->store), NULL));
138 /* We need a tree view that's listening to get ref counting from that
141 fixture->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (fixture->filter));
145 filter_test_enable_filter (FilterTest *fixture)
147 gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
151 filter_test_teardown (FilterTest *fixture,
152 gconstpointer test_data)
154 g_object_unref (fixture->filter);
155 g_object_unref (fixture->store);
159 * Model structure validation
163 check_filter_model_recurse (FilterTest *fixture,
164 GtkTreePath *store_parent_path,
165 GtkTreePath *filter_parent_path)
168 GtkTreeIter store_iter;
169 GtkTreeIter filter_iter;
170 gboolean store_has_next, filter_has_next;
172 gtk_tree_path_down (store_parent_path);
173 gtk_tree_path_down (filter_parent_path);
175 store_has_next = gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
176 &store_iter, store_parent_path);
177 filter_has_next = gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->filter),
178 &filter_iter, filter_parent_path);
180 for (i = 0; i < LEVEL_LENGTH; i++)
184 g_return_if_fail (store_has_next == TRUE);
186 gtk_tree_model_get (GTK_TREE_MODEL (fixture->store),
194 gchar *filter_str, *store_str;
196 g_return_if_fail (filter_has_next == TRUE);
199 tmp = gtk_tree_model_get_path (GTK_TREE_MODEL (fixture->filter),
201 g_return_if_fail (gtk_tree_path_compare (tmp, filter_parent_path) == 0);
203 /* Verify model content */
204 gtk_tree_model_get (GTK_TREE_MODEL (fixture->store),
208 gtk_tree_model_get (GTK_TREE_MODEL (fixture->filter),
213 g_return_if_fail (g_strcmp0 (store_str, filter_str) == 0);
218 if (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->filter),
221 g_return_if_fail (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->store), &store_iter));
223 check_filter_model_recurse (fixture,
224 gtk_tree_path_copy (store_parent_path),
228 gtk_tree_path_next (filter_parent_path);
229 filter_has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->filter), &filter_iter);
232 gtk_tree_path_next (store_parent_path);
233 store_has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &store_iter);
236 /* Both models should have no more content! */
237 g_return_if_fail (store_has_next == FALSE);
238 g_return_if_fail (filter_has_next == FALSE);
240 gtk_tree_path_free (store_parent_path);
241 gtk_tree_path_free (filter_parent_path);
245 check_filter_model (FilterTest *fixture)
249 path = gtk_tree_path_new ();
251 check_filter_model_recurse (fixture, path, gtk_tree_path_copy (path));
257 check_level_length (GtkTreeModelFilter *filter,
263 int l = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (filter), NULL);
264 g_return_if_fail (l == length);
271 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (filter),
273 l = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (filter), &iter);
274 g_return_if_fail (l == length);
279 set_path_visibility (FilterTest *fixture,
283 GtkTreeIter store_iter;
285 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store),
287 gtk_tree_store_set (fixture->store, &store_iter,
297 verify_test_suite (FilterTest *fixture,
298 gconstpointer user_data)
300 check_filter_model (fixture);
305 filled_hide_root_level (FilterTest *fixture,
306 gconstpointer user_data)
308 set_path_visibility (fixture, "2", FALSE);
309 check_filter_model (fixture);
310 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
312 set_path_visibility (fixture, "0", FALSE);
313 check_filter_model (fixture);
314 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
316 set_path_visibility (fixture, "4", FALSE);
317 check_filter_model (fixture);
318 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
322 set_path_visibility (fixture, "1", FALSE);
323 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
325 set_path_visibility (fixture, "3", FALSE);
326 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 5);
328 check_filter_model (fixture);
331 set_path_visibility (fixture, "1", TRUE);
332 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
334 set_path_visibility (fixture, "3", TRUE);
335 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
337 check_filter_model (fixture);
341 filled_hide_child_levels (FilterTest *fixture,
342 gconstpointer user_data)
344 set_path_visibility (fixture, "0:2", FALSE);
345 check_filter_model (fixture);
346 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
347 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 1);
349 set_path_visibility (fixture, "0:4", FALSE);
350 check_filter_model (fixture);
351 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
352 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
354 set_path_visibility (fixture, "0:4:3", FALSE);
355 check_filter_model (fixture);
356 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
357 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
359 set_path_visibility (fixture, "0:4:0", FALSE);
360 set_path_visibility (fixture, "0:4:1", FALSE);
361 set_path_visibility (fixture, "0:4:2", FALSE);
362 set_path_visibility (fixture, "0:4:4", FALSE);
363 check_filter_model (fixture);
364 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
365 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
367 set_path_visibility (fixture, "0:4", TRUE);
368 /* Since "0:2" is hidden, "0:4" must be "0:3" in the filter model */
369 check_filter_model (fixture);
370 check_level_length (fixture->filter, "0:3", 0);
372 set_path_visibility (fixture, "0:2", TRUE);
373 check_filter_model (fixture);
374 check_level_length (fixture->filter, "0:2", LEVEL_LENGTH);
375 check_level_length (fixture->filter, "0:3", LEVEL_LENGTH);
376 check_level_length (fixture->filter, "0:4", 0);
378 set_path_visibility (fixture, "0:4:2", TRUE);
379 set_path_visibility (fixture, "0:4:4", TRUE);
380 check_level_length (fixture->filter, "0:4", 2);
384 empty_show_nodes (FilterTest *fixture,
385 gconstpointer user_data)
387 check_filter_model (fixture);
388 check_level_length (fixture->filter, NULL, 0);
390 set_path_visibility (fixture, "3", TRUE);
391 check_filter_model (fixture);
392 check_level_length (fixture->filter, NULL, 1);
393 check_level_length (fixture->filter, "0", 0);
395 set_path_visibility (fixture, "3:2:2", TRUE);
396 check_filter_model (fixture);
397 check_level_length (fixture->filter, NULL, 1);
398 check_level_length (fixture->filter, "0", 0);
400 set_path_visibility (fixture, "3:2", TRUE);
401 check_filter_model (fixture);
402 check_level_length (fixture->filter, NULL, 1);
403 check_level_length (fixture->filter, "0", 1);
404 check_level_length (fixture->filter, "0:0", 1);
405 check_level_length (fixture->filter, "0:0:0", 0);
407 set_path_visibility (fixture, "3", FALSE);
408 check_filter_model (fixture);
409 check_level_length (fixture->filter, NULL, 0);
411 set_path_visibility (fixture, "3:2:1", TRUE);
412 set_path_visibility (fixture, "3", TRUE);
413 check_filter_model (fixture);
414 check_level_length (fixture->filter, NULL, 1);
415 check_level_length (fixture->filter, "0", 1);
416 check_level_length (fixture->filter, "0:0", 2);
417 check_level_length (fixture->filter, "0:0:0", 0);
422 unfiltered_hide_single (FilterTest *fixture,
423 gconstpointer user_data)
426 set_path_visibility (fixture, "2", FALSE);
428 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
430 filter_test_enable_filter (fixture);
432 check_filter_model (fixture);
433 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
437 unfiltered_hide_single_child (FilterTest *fixture,
438 gconstpointer user_data)
441 set_path_visibility (fixture, "2:2", FALSE);
443 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
444 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
446 filter_test_enable_filter (fixture);
448 check_filter_model (fixture);
449 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
450 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
454 unfiltered_hide_single_multi_level (FilterTest *fixture,
455 gconstpointer user_data)
458 set_path_visibility (fixture, "2:2:2", FALSE);
459 set_path_visibility (fixture, "2:2", FALSE);
461 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
462 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
463 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
465 filter_test_enable_filter (fixture);
467 check_filter_model (fixture);
468 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
469 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
471 set_path_visibility (fixture, "2:2", TRUE);
473 check_filter_model (fixture);
474 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
475 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
476 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH - 1);
481 unfiltered_show_single (FilterTest *fixture,
482 gconstpointer user_data)
485 set_path_visibility (fixture, "2", TRUE);
487 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
489 filter_test_enable_filter (fixture);
491 check_filter_model (fixture);
492 check_level_length (fixture->filter, NULL, 1);
496 unfiltered_show_single_child (FilterTest *fixture,
497 gconstpointer user_data)
500 set_path_visibility (fixture, "2:2", TRUE);
502 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
503 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
505 filter_test_enable_filter (fixture);
507 check_filter_model (fixture);
508 check_level_length (fixture->filter, NULL, 0);
510 set_path_visibility (fixture, "2", TRUE);
511 check_level_length (fixture->filter, NULL, 1);
512 check_level_length (fixture->filter, "2", 1);
516 unfiltered_show_single_multi_level (FilterTest *fixture,
517 gconstpointer user_data)
520 set_path_visibility (fixture, "2:2:2", TRUE);
521 set_path_visibility (fixture, "2:2", TRUE);
523 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
524 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
525 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
527 filter_test_enable_filter (fixture);
529 check_filter_model (fixture);
530 check_level_length (fixture->filter, NULL, 0);
532 set_path_visibility (fixture, "2", TRUE);
533 check_filter_model (fixture);
534 check_level_length (fixture->filter, NULL, 1);
535 check_level_length (fixture->filter, "2", 1);
536 check_level_length (fixture->filter, "2:2", 1);
541 specific_path_dependent_filter_func (GtkTreeModel *model,
547 path = gtk_tree_model_get_path (model, iter);
548 if (gtk_tree_path_get_indices (path)[0] < 4)
555 specific_path_dependent_filter (void)
561 GtkTreeModel *filter;
563 list = gtk_list_store_new (1, G_TYPE_INT);
564 gtk_list_store_insert_with_values (list, &iter, 0, 0, 1, -1);
565 gtk_list_store_insert_with_values (list, &iter, 1, 0, 2, -1);
566 gtk_list_store_insert_with_values (list, &iter, 2, 0, 3, -1);
567 gtk_list_store_insert_with_values (list, &iter, 3, 0, 4, -1);
568 gtk_list_store_insert_with_values (list, &iter, 4, 0, 5, -1);
569 gtk_list_store_insert_with_values (list, &iter, 5, 0, 6, -1);
570 gtk_list_store_insert_with_values (list, &iter, 6, 0, 7, -1);
571 gtk_list_store_insert_with_values (list, &iter, 7, 0, 8, -1);
573 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (list));
574 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (sort), NULL);
575 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
576 specific_path_dependent_filter_func,
579 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), 0,
580 GTK_SORT_DESCENDING);
582 for (i = 0; i < 4; i++)
584 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
586 gtk_list_store_remove (list, &iter);
588 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
590 gtk_list_store_remove (list, &iter);
596 specific_append_after_collapse_visible_func (GtkTreeModel *model,
601 gboolean hide_negative_numbers;
603 gtk_tree_model_get (model, iter, 1, &number, -1);
604 hide_negative_numbers = GPOINTER_TO_INT (g_object_get_data (data, "private-hide-negative-numbers"));
606 return (number >= 0 || !hide_negative_numbers);
610 specific_append_after_collapse (void)
612 /* This test is based on one of the test cases I found in my
613 * old test cases directory. I unfortunately do not have a record
614 * from who this test case originated. -Kris.
618 * - Show tree, expand, collapse.
623 GtkTreeIter child_iter;
624 GtkTreeIter child_iter2;
625 GtkTreePath *append_path;
627 GtkTreeModel *filter;
631 GtkWidget *tree_view;
633 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
635 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
636 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
637 GINT_TO_POINTER (FALSE));
638 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
639 specific_append_after_collapse_visible_func,
642 sort = gtk_tree_model_sort_new_with_model (filter);
644 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
645 tree_view = gtk_tree_view_new_with_model (sort);
646 gtk_container_add (GTK_CONTAINER (window), tree_view);
647 gtk_widget_realize (tree_view);
649 while (gtk_events_pending ())
650 gtk_main_iteration ();
652 gtk_tree_store_prepend (store, &iter, NULL);
653 gtk_tree_store_set (store, &iter,
654 0, "hallo", 1, 1, -1);
656 gtk_tree_store_append (store, &child_iter, &iter);
657 gtk_tree_store_set (store, &child_iter,
658 0, "toemaar", 1, 1, -1);
660 gtk_tree_store_append (store, &child_iter2, &child_iter);
661 gtk_tree_store_set (store, &child_iter2,
662 0, "very deep", 1, 1, -1);
664 append_path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &child_iter2);
666 gtk_tree_store_append (store, &child_iter, &iter);
667 gtk_tree_store_set (store, &child_iter,
670 gtk_tree_store_append (store, &child_iter, &iter);
671 gtk_tree_store_set (store, &child_iter,
672 0, "some word", 1, -1, -1);
674 /* Expand and collapse the tree */
675 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
676 while (gtk_events_pending ())
677 gtk_main_iteration ();
679 gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
680 while (gtk_events_pending ())
681 gtk_main_iteration ();
684 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
685 GINT_TO_POINTER (TRUE));
687 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, append_path))
689 gtk_tree_store_append (store, &child_iter, &iter);
690 gtk_tree_store_set (store, &child_iter,
691 0, "new new new !!", 1, 1, -1);
693 gtk_tree_path_free (append_path);
696 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
697 while (gtk_events_pending ())
698 gtk_main_iteration ();
703 specific_sort_filter_remove_node_compare_func (GtkTreeModel *model,
712 specific_sort_filter_remove_node_visible_func (GtkTreeModel *model,
718 /* Do reference the model */
719 gtk_tree_model_get (model, iter, 0, &item, -1);
726 specific_sort_filter_remove_node (void)
728 /* This test is based on one of the test cases I found in my
729 * old test cases directory. I unfortunately do not have a record
730 * from who this test case originated. -Kris.
733 * - Create tree store, sort, filter models. The sort model has
734 * a default sort func that is enabled, filter model a visible func
735 * that defaults to returning FALSE.
736 * - Remove a node from the tree store.
741 GtkTreeModel *filter;
745 GtkWidget *tree_view;
747 store = gtk_tree_store_new (1, G_TYPE_STRING);
748 gtk_tree_store_append (store, &iter, NULL);
749 gtk_tree_store_set (store, &iter, 0, "Hello1", -1);
751 gtk_tree_store_append (store, &iter, NULL);
752 gtk_tree_store_set (store, &iter, 0, "Hello2", -1);
754 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
755 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
756 specific_sort_filter_remove_node_compare_func, NULL, NULL);
758 filter = gtk_tree_model_filter_new (sort, NULL);
759 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
760 specific_sort_filter_remove_node_visible_func,
764 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
765 tree_view = gtk_tree_view_new_with_model (filter);
766 gtk_container_add (GTK_CONTAINER (window), tree_view);
767 gtk_widget_realize (tree_view);
769 while (gtk_events_pending ())
770 gtk_main_iteration ();
773 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
774 gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter);
775 gtk_tree_store_remove (store, &iter);
777 while (gtk_events_pending ())
778 gtk_main_iteration ();
783 specific_sort_filter_remove_root (void)
785 /* This test is based on one of the test cases I found in my
786 * old test cases directory. I unfortunately do not have a record
787 * from who this test case originated. -Kris.
790 GtkTreeModel *model, *sort, *filter;
791 GtkTreeIter root, mid, leaf;
794 model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_INT));
795 gtk_tree_store_append (GTK_TREE_STORE (model), &root, NULL);
796 gtk_tree_store_append (GTK_TREE_STORE (model), &mid, &root);
797 gtk_tree_store_append (GTK_TREE_STORE (model), &leaf, &mid);
799 path = gtk_tree_model_get_path (model, &mid);
801 sort = gtk_tree_model_sort_new_with_model (model);
802 filter = gtk_tree_model_filter_new (sort, path);
804 gtk_tree_store_remove (GTK_TREE_STORE (model), &root);
806 g_object_unref (filter);
807 g_object_unref (sort);
808 g_object_unref (model);
813 specific_filter_add_child (void)
815 /* This test is based on one of the test cases I found in my
816 * old test cases directory. I unfortunately do not have a record
817 * from who this test case originated. -Kris.
821 GtkTreeIter iter_first;
824 GtkTreeModel *filter;
826 store = gtk_tree_store_new (1, G_TYPE_STRING);
828 gtk_tree_store_append (store, &iter_first, NULL);
829 gtk_tree_store_set (store, &iter_first, 0, "Hello", -1);
831 gtk_tree_store_append (store, &iter, NULL);
832 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
834 gtk_tree_store_append (store, &iter, NULL);
835 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
837 gtk_tree_store_append (store, &iter, NULL);
838 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
840 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
842 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
843 gtk_tree_store_append (store, &child, &iter_first);
844 gtk_tree_store_set (store, &child, 0, "Hello", -1);
849 specific_bug_300089 (void)
851 /* Test case for GNOME Bugzilla bug 300089. Written by
854 GtkTreeModel *sort_model, *child_model;
856 GtkTreeIter iter, iter2, sort_iter;
858 child_model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING));
860 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
861 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
862 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
863 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "B", -1);
865 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
866 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "D", -1);
867 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
868 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "E", -1);
870 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
871 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "C", -1);
874 sort_model = GTK_TREE_MODEL (gtk_tree_model_sort_new_with_model (child_model));
875 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model),
876 0, GTK_SORT_ASCENDING);
878 path = gtk_tree_path_new_from_indices (1, 1, -1);
880 /* make sure a level is constructed */
881 gtk_tree_model_get_iter (sort_model, &sort_iter, path);
883 /* change the "E" row in a way that causes it to change position */
884 gtk_tree_model_get_iter (child_model, &iter, path);
885 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
890 specific_bug_301558_sort_func (GtkTreeModel *model,
897 gtk_tree_model_get (model, a, 0, &i, -1);
898 gtk_tree_model_get (model, b, 0, &j, -1);
904 specific_bug_301558 (void)
906 /* Test case for GNOME Bugzilla bug 301558 provided by
910 GtkTreeModel *filter;
912 GtkTreeIter root, iter, iter2;
917 tree = gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_BOOLEAN);
918 gtk_tree_store_append (tree, &iter, NULL);
919 gtk_tree_store_set (tree, &iter, 0, 123, 1, TRUE, -1);
920 gtk_tree_store_append (tree, &iter2, &iter);
921 gtk_tree_store_set (tree, &iter2, 0, 73, 1, TRUE, -1);
923 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (tree));
924 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
925 specific_bug_301558_sort_func,
928 filter = gtk_tree_model_filter_new (sort, NULL);
929 gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (filter), 1);
931 view = gtk_tree_view_new_with_model (filter);
933 while (gtk_events_pending ())
934 gtk_main_iteration ();
938 for (i = 0; i < 10; i++)
940 if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (tree), &root))
941 g_assert_not_reached ();
945 gtk_tree_store_append (tree, &iter, &root);
946 gtk_tree_store_set (tree, &iter, 0, 456, 1, TRUE, -1);
951 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (tree), &root);
952 gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (tree), &iter,
954 gtk_tree_store_remove (tree, &iter);
963 specific_bug_311955_filter_func (GtkTreeModel *model,
969 gtk_tree_model_get (model, iter, 0, &value, -1);
975 specific_bug_311955 (void)
977 /* This is a test case for GNOME Bugzilla bug 311955. It was written
980 GtkTreeIter iter, child, root;
983 GtkTreeModel *filter;
986 GtkWidget *tree_view;
990 store = gtk_tree_store_new (1, G_TYPE_INT);
992 gtk_tree_store_append (store, &root, NULL);
993 gtk_tree_store_set (store, &root, 0, 33, -1);
995 gtk_tree_store_append (store, &iter, &root);
996 gtk_tree_store_set (store, &iter, 0, 50, -1);
998 gtk_tree_store_append (store, &iter, NULL);
999 gtk_tree_store_set (store, &iter, 0, 22, -1);
1001 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1002 filter = gtk_tree_model_filter_new (sort, NULL);
1004 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1005 specific_bug_311955_filter_func,
1008 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1009 tree_view = gtk_tree_view_new_with_model (filter);
1010 g_object_unref (store);
1012 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
1014 while (gtk_events_pending ())
1015 gtk_main_iteration ();
1018 for (i = 0; i < 4; i++)
1020 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1022 gtk_tree_store_append (store, &iter, &root);
1025 gtk_tree_store_set (store, &iter, 0, i, -1);
1029 gtk_tree_store_append (store, &child, &iter);
1030 gtk_tree_store_set (store, &child, 0, 10, -1);
1034 while (gtk_events_pending ())
1035 gtk_main_iteration ();
1037 /* Remove bottommost child from the tree. */
1038 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1039 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &root);
1041 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter, &root, n - 2))
1043 if (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &child, &iter))
1044 gtk_tree_store_remove (store, &child);
1047 g_assert_not_reached ();
1051 specific_bug_346800 (void)
1053 /* This is a test case for GNOME Bugzilla bug 346800. It was written
1054 * by Jonathan Matthew.
1057 GtkTreeIter node_iters[50];
1058 GtkTreeIter child_iters[50];
1059 GtkTreeModel *model;
1060 GtkTreeModelFilter *filter;
1061 GtkTreeStore *store;
1065 columns = g_new (GType, 2);
1066 columns[0] = G_TYPE_STRING;
1067 columns[1] = G_TYPE_BOOLEAN;
1068 store = gtk_tree_store_newv (2, columns);
1069 model = GTK_TREE_MODEL (store);
1071 filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
1072 gtk_tree_model_filter_set_visible_column (filter, 1);
1074 for (i=0; i<items; i++)
1076 /* allocate random amounts of junk, otherwise the filter model's arrays can expand without moving */
1079 gtk_tree_store_append (store, &node_iters[i], NULL);
1080 gtk_tree_store_set (store, &node_iters[i],
1082 1, ((i%6) == 0) ? FALSE : TRUE,
1086 gtk_tree_store_append (store, &child_iters[i], &node_iters[i]);
1087 gtk_tree_store_set (store, &child_iters[i],
1088 0, "something else",
1091 gtk_tree_model_filter_refilter (filter);
1095 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-1], 1,
1096 (i & 1) ? TRUE : FALSE, -1);
1097 gtk_tree_model_filter_refilter (filter);
1099 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-2], 1,
1100 (i & 1) ? FALSE: TRUE, -1);
1101 gtk_tree_model_filter_refilter (filter);
1108 specific_bug_364946 (void)
1110 /* This is a test case for GNOME Bugzilla bug 364946. It was written
1111 * by Andreas Koehler.
1113 GtkTreeStore *store;
1114 GtkTreeIter a, aa, aaa, aab, iter;
1115 GtkTreeModel *s_model;
1117 store = gtk_tree_store_new (1, G_TYPE_STRING);
1119 gtk_tree_store_append (store, &a, NULL);
1120 gtk_tree_store_set (store, &a, 0, "0", -1);
1122 gtk_tree_store_append (store, &aa, &a);
1123 gtk_tree_store_set (store, &aa, 0, "0:0", -1);
1125 gtk_tree_store_append (store, &aaa, &aa);
1126 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1128 gtk_tree_store_append (store, &aab, &aa);
1129 gtk_tree_store_set (store, &aab, 0, "0:0:1", -1);
1131 s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1132 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model), 0,
1133 GTK_SORT_ASCENDING);
1135 gtk_tree_model_get_iter_from_string (s_model, &iter, "0:0:0");
1137 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1138 gtk_tree_store_remove (store, &aaa);
1139 gtk_tree_store_remove (store, &aab);
1141 gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (s_model));
1150 gtk_test_init (&argc, &argv, NULL);
1152 g_test_add ("/FilterModel/self/verify-test-suite",
1156 filter_test_teardown);
1158 g_test_add ("/FilterModel/filled/hide-root-level",
1161 filled_hide_root_level,
1162 filter_test_teardown);
1163 g_test_add ("/FilterModel/filled/hide-child-levels",
1166 filled_hide_child_levels,
1167 filter_test_teardown);
1169 g_test_add ("/FilterModel/empty/show-nodes",
1171 filter_test_setup_empty,
1173 filter_test_teardown);
1175 g_test_add ("/FilterModel/unfiltered/hide-single",
1177 filter_test_setup_unfiltered,
1178 unfiltered_hide_single,
1179 filter_test_teardown);
1180 g_test_add ("/FilterModel/unfiltered/hide-single-child",
1182 filter_test_setup_unfiltered,
1183 unfiltered_hide_single_child,
1184 filter_test_teardown);
1185 g_test_add ("/FilterModel/unfiltered/hide-single-multi-level",
1187 filter_test_setup_unfiltered,
1188 unfiltered_hide_single_multi_level,
1189 filter_test_teardown);
1191 g_test_add ("/FilterModel/unfiltered/show-single",
1193 filter_test_setup_empty_unfiltered,
1194 unfiltered_show_single,
1195 filter_test_teardown);
1196 g_test_add ("/FilterModel/unfiltered/show-single-child",
1198 filter_test_setup_empty_unfiltered,
1199 unfiltered_show_single_child,
1200 filter_test_teardown);
1201 g_test_add ("/FilterModel/unfiltered/show-single-multi-level",
1203 filter_test_setup_empty_unfiltered,
1204 unfiltered_show_single_multi_level,
1205 filter_test_teardown);
1208 g_test_add_func ("/FilterModel/specific/path-dependent-filter",
1209 specific_path_dependent_filter);
1210 g_test_add_func ("/FilterModel/specific/append-after-collapse",
1211 specific_append_after_collapse);
1212 g_test_add_func ("/FilterModel/specific/sort-filter-remove-node",
1213 specific_sort_filter_remove_node);
1214 g_test_add_func ("/FilterModel/specific/sort-filter-remove-root",
1215 specific_sort_filter_remove_root);
1216 g_test_add_func ("/FilterModel/specific/filter-add-child",
1217 specific_filter_add_child);
1219 g_test_add_func ("/FilterModel/specific/bug-300089",
1220 specific_bug_300089);
1221 g_test_add_func ("/FilterModel/specific/bug-301558",
1222 specific_bug_301558);
1223 g_test_add_func ("/FilterModel/specific/bug-311955",
1224 specific_bug_311955);
1225 g_test_add_func ("/FilterModel/specific/bug-346800",
1226 specific_bug_346800);
1227 g_test_add_func ("/FilterModel/specific/bug-364946",
1228 specific_bug_364946);
1230 return g_test_run ();