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,
293 insert_path_with_visibility (FilterTest *fixture,
294 const gchar *path_string,
299 GtkTreeIter parent, iter;
301 path = gtk_tree_path_new_from_string (path_string);
302 position = gtk_tree_path_get_indices (path)[gtk_tree_path_get_depth (path)];
303 gtk_tree_path_up (path);
305 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &parent, path))
307 gtk_tree_store_insert (fixture->store, &iter, &parent, position);
308 create_tree_store_set_values (fixture->store, &iter, visible);
310 gtk_tree_path_free (path);
318 verify_test_suite (FilterTest *fixture,
319 gconstpointer user_data)
321 check_filter_model (fixture);
326 filled_hide_root_level (FilterTest *fixture,
327 gconstpointer user_data)
329 set_path_visibility (fixture, "2", FALSE);
330 check_filter_model (fixture);
331 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
333 set_path_visibility (fixture, "0", FALSE);
334 check_filter_model (fixture);
335 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
337 set_path_visibility (fixture, "4", FALSE);
338 check_filter_model (fixture);
339 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
343 set_path_visibility (fixture, "1", FALSE);
344 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
346 set_path_visibility (fixture, "3", FALSE);
347 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 5);
349 check_filter_model (fixture);
352 set_path_visibility (fixture, "1", TRUE);
353 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
355 set_path_visibility (fixture, "3", TRUE);
356 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
358 check_filter_model (fixture);
362 filled_hide_child_levels (FilterTest *fixture,
363 gconstpointer user_data)
365 set_path_visibility (fixture, "0:2", FALSE);
366 check_filter_model (fixture);
367 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
368 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 1);
370 set_path_visibility (fixture, "0:4", FALSE);
371 check_filter_model (fixture);
372 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
373 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
375 set_path_visibility (fixture, "0:4:3", FALSE);
376 check_filter_model (fixture);
377 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
378 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
380 set_path_visibility (fixture, "0:4:0", FALSE);
381 set_path_visibility (fixture, "0:4:1", FALSE);
382 set_path_visibility (fixture, "0:4:2", FALSE);
383 set_path_visibility (fixture, "0:4:4", FALSE);
384 check_filter_model (fixture);
385 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
386 check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
388 set_path_visibility (fixture, "0:4", TRUE);
389 /* Since "0:2" is hidden, "0:4" must be "0:3" in the filter model */
390 check_filter_model (fixture);
391 check_level_length (fixture->filter, "0:3", 0);
393 set_path_visibility (fixture, "0:2", TRUE);
394 check_filter_model (fixture);
395 check_level_length (fixture->filter, "0:2", LEVEL_LENGTH);
396 check_level_length (fixture->filter, "0:3", LEVEL_LENGTH);
397 check_level_length (fixture->filter, "0:4", 0);
399 set_path_visibility (fixture, "0:4:2", TRUE);
400 set_path_visibility (fixture, "0:4:4", TRUE);
401 check_level_length (fixture->filter, "0:4", 2);
405 empty_show_nodes (FilterTest *fixture,
406 gconstpointer user_data)
408 check_filter_model (fixture);
409 check_level_length (fixture->filter, NULL, 0);
411 set_path_visibility (fixture, "3", TRUE);
412 check_filter_model (fixture);
413 check_level_length (fixture->filter, NULL, 1);
414 check_level_length (fixture->filter, "0", 0);
416 set_path_visibility (fixture, "3:2:2", TRUE);
417 check_filter_model (fixture);
418 check_level_length (fixture->filter, NULL, 1);
419 check_level_length (fixture->filter, "0", 0);
421 set_path_visibility (fixture, "3:2", TRUE);
422 check_filter_model (fixture);
423 check_level_length (fixture->filter, NULL, 1);
424 check_level_length (fixture->filter, "0", 1);
425 check_level_length (fixture->filter, "0:0", 1);
426 check_level_length (fixture->filter, "0:0:0", 0);
428 set_path_visibility (fixture, "3", FALSE);
429 check_filter_model (fixture);
430 check_level_length (fixture->filter, NULL, 0);
432 set_path_visibility (fixture, "3:2:1", TRUE);
433 set_path_visibility (fixture, "3", TRUE);
434 check_filter_model (fixture);
435 check_level_length (fixture->filter, NULL, 1);
436 check_level_length (fixture->filter, "0", 1);
437 check_level_length (fixture->filter, "0:0", 2);
438 check_level_length (fixture->filter, "0:0:0", 0);
443 unfiltered_hide_single (FilterTest *fixture,
444 gconstpointer user_data)
447 set_path_visibility (fixture, "2", FALSE);
449 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
451 filter_test_enable_filter (fixture);
453 check_filter_model (fixture);
454 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
458 unfiltered_hide_single_child (FilterTest *fixture,
459 gconstpointer user_data)
462 set_path_visibility (fixture, "2:2", FALSE);
464 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
465 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
467 filter_test_enable_filter (fixture);
469 check_filter_model (fixture);
470 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
471 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
475 unfiltered_hide_single_multi_level (FilterTest *fixture,
476 gconstpointer user_data)
479 set_path_visibility (fixture, "2:2:2", FALSE);
480 set_path_visibility (fixture, "2:2", FALSE);
482 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
483 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
484 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
486 filter_test_enable_filter (fixture);
488 check_filter_model (fixture);
489 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
490 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
492 set_path_visibility (fixture, "2:2", TRUE);
494 check_filter_model (fixture);
495 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
496 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
497 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH - 1);
502 unfiltered_show_single (FilterTest *fixture,
503 gconstpointer user_data)
506 set_path_visibility (fixture, "2", TRUE);
508 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
510 filter_test_enable_filter (fixture);
512 check_filter_model (fixture);
513 check_level_length (fixture->filter, NULL, 1);
517 unfiltered_show_single_child (FilterTest *fixture,
518 gconstpointer user_data)
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);
526 filter_test_enable_filter (fixture);
528 check_filter_model (fixture);
529 check_level_length (fixture->filter, NULL, 0);
531 set_path_visibility (fixture, "2", TRUE);
532 check_level_length (fixture->filter, NULL, 1);
533 check_level_length (fixture->filter, "2", 1);
537 unfiltered_show_single_multi_level (FilterTest *fixture,
538 gconstpointer user_data)
541 set_path_visibility (fixture, "2:2:2", TRUE);
542 set_path_visibility (fixture, "2:2", TRUE);
544 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
545 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
546 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
548 filter_test_enable_filter (fixture);
550 check_filter_model (fixture);
551 check_level_length (fixture->filter, NULL, 0);
553 set_path_visibility (fixture, "2", TRUE);
554 check_filter_model (fixture);
555 check_level_length (fixture->filter, NULL, 1);
556 check_level_length (fixture->filter, "2", 1);
557 check_level_length (fixture->filter, "2:2", 1);
562 specific_path_dependent_filter_func (GtkTreeModel *model,
568 path = gtk_tree_model_get_path (model, iter);
569 if (gtk_tree_path_get_indices (path)[0] < 4)
576 specific_path_dependent_filter (void)
582 GtkTreeModel *filter;
584 list = gtk_list_store_new (1, G_TYPE_INT);
585 gtk_list_store_insert_with_values (list, &iter, 0, 0, 1, -1);
586 gtk_list_store_insert_with_values (list, &iter, 1, 0, 2, -1);
587 gtk_list_store_insert_with_values (list, &iter, 2, 0, 3, -1);
588 gtk_list_store_insert_with_values (list, &iter, 3, 0, 4, -1);
589 gtk_list_store_insert_with_values (list, &iter, 4, 0, 5, -1);
590 gtk_list_store_insert_with_values (list, &iter, 5, 0, 6, -1);
591 gtk_list_store_insert_with_values (list, &iter, 6, 0, 7, -1);
592 gtk_list_store_insert_with_values (list, &iter, 7, 0, 8, -1);
594 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (list));
595 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (sort), NULL);
596 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
597 specific_path_dependent_filter_func,
600 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), 0,
601 GTK_SORT_DESCENDING);
603 for (i = 0; i < 4; i++)
605 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
607 gtk_list_store_remove (list, &iter);
609 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
611 gtk_list_store_remove (list, &iter);
617 specific_append_after_collapse_visible_func (GtkTreeModel *model,
622 gboolean hide_negative_numbers;
624 gtk_tree_model_get (model, iter, 1, &number, -1);
625 hide_negative_numbers = GPOINTER_TO_INT (g_object_get_data (data, "private-hide-negative-numbers"));
627 return (number >= 0 || !hide_negative_numbers);
631 specific_append_after_collapse (void)
633 /* This test is based on one of the test cases I found in my
634 * old test cases directory. I unfortunately do not have a record
635 * from who this test case originated. -Kris.
639 * - Show tree, expand, collapse.
644 GtkTreeIter child_iter;
645 GtkTreeIter child_iter2;
646 GtkTreePath *append_path;
648 GtkTreeModel *filter;
652 GtkWidget *tree_view;
654 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
656 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
657 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
658 GINT_TO_POINTER (FALSE));
659 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
660 specific_append_after_collapse_visible_func,
663 sort = gtk_tree_model_sort_new_with_model (filter);
665 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
666 tree_view = gtk_tree_view_new_with_model (sort);
667 gtk_container_add (GTK_CONTAINER (window), tree_view);
668 gtk_widget_realize (tree_view);
670 while (gtk_events_pending ())
671 gtk_main_iteration ();
673 gtk_tree_store_prepend (store, &iter, NULL);
674 gtk_tree_store_set (store, &iter,
675 0, "hallo", 1, 1, -1);
677 gtk_tree_store_append (store, &child_iter, &iter);
678 gtk_tree_store_set (store, &child_iter,
679 0, "toemaar", 1, 1, -1);
681 gtk_tree_store_append (store, &child_iter2, &child_iter);
682 gtk_tree_store_set (store, &child_iter2,
683 0, "very deep", 1, 1, -1);
685 append_path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &child_iter2);
687 gtk_tree_store_append (store, &child_iter, &iter);
688 gtk_tree_store_set (store, &child_iter,
691 gtk_tree_store_append (store, &child_iter, &iter);
692 gtk_tree_store_set (store, &child_iter,
693 0, "some word", 1, -1, -1);
695 /* Expand and collapse the tree */
696 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
697 while (gtk_events_pending ())
698 gtk_main_iteration ();
700 gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
701 while (gtk_events_pending ())
702 gtk_main_iteration ();
705 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
706 GINT_TO_POINTER (TRUE));
708 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, append_path))
710 gtk_tree_store_append (store, &child_iter, &iter);
711 gtk_tree_store_set (store, &child_iter,
712 0, "new new new !!", 1, 1, -1);
714 gtk_tree_path_free (append_path);
717 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
718 while (gtk_events_pending ())
719 gtk_main_iteration ();
724 specific_sort_filter_remove_node_compare_func (GtkTreeModel *model,
733 specific_sort_filter_remove_node_visible_func (GtkTreeModel *model,
739 /* Do reference the model */
740 gtk_tree_model_get (model, iter, 0, &item, -1);
747 specific_sort_filter_remove_node (void)
749 /* This test is based on one of the test cases I found in my
750 * old test cases directory. I unfortunately do not have a record
751 * from who this test case originated. -Kris.
754 * - Create tree store, sort, filter models. The sort model has
755 * a default sort func that is enabled, filter model a visible func
756 * that defaults to returning FALSE.
757 * - Remove a node from the tree store.
762 GtkTreeModel *filter;
766 GtkWidget *tree_view;
768 store = gtk_tree_store_new (1, G_TYPE_STRING);
769 gtk_tree_store_append (store, &iter, NULL);
770 gtk_tree_store_set (store, &iter, 0, "Hello1", -1);
772 gtk_tree_store_append (store, &iter, NULL);
773 gtk_tree_store_set (store, &iter, 0, "Hello2", -1);
775 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
776 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
777 specific_sort_filter_remove_node_compare_func, NULL, NULL);
779 filter = gtk_tree_model_filter_new (sort, NULL);
780 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
781 specific_sort_filter_remove_node_visible_func,
785 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
786 tree_view = gtk_tree_view_new_with_model (filter);
787 gtk_container_add (GTK_CONTAINER (window), tree_view);
788 gtk_widget_realize (tree_view);
790 while (gtk_events_pending ())
791 gtk_main_iteration ();
794 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
795 gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter);
796 gtk_tree_store_remove (store, &iter);
798 while (gtk_events_pending ())
799 gtk_main_iteration ();
804 specific_sort_filter_remove_root (void)
806 /* This test is based on one of the test cases I found in my
807 * old test cases directory. I unfortunately do not have a record
808 * from who this test case originated. -Kris.
811 GtkTreeModel *model, *sort, *filter;
812 GtkTreeIter root, mid, leaf;
815 model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_INT));
816 gtk_tree_store_append (GTK_TREE_STORE (model), &root, NULL);
817 gtk_tree_store_append (GTK_TREE_STORE (model), &mid, &root);
818 gtk_tree_store_append (GTK_TREE_STORE (model), &leaf, &mid);
820 path = gtk_tree_model_get_path (model, &mid);
822 sort = gtk_tree_model_sort_new_with_model (model);
823 filter = gtk_tree_model_filter_new (sort, path);
825 gtk_tree_store_remove (GTK_TREE_STORE (model), &root);
827 g_object_unref (filter);
828 g_object_unref (sort);
829 g_object_unref (model);
834 specific_filter_add_child (void)
836 /* This test is based on one of the test cases I found in my
837 * old test cases directory. I unfortunately do not have a record
838 * from who this test case originated. -Kris.
842 GtkTreeIter iter_first;
845 GtkTreeModel *filter;
847 store = gtk_tree_store_new (1, G_TYPE_STRING);
849 gtk_tree_store_append (store, &iter_first, NULL);
850 gtk_tree_store_set (store, &iter_first, 0, "Hello", -1);
852 gtk_tree_store_append (store, &iter, NULL);
853 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
855 gtk_tree_store_append (store, &iter, NULL);
856 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
858 gtk_tree_store_append (store, &iter, NULL);
859 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
861 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
863 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
864 gtk_tree_store_append (store, &child, &iter_first);
865 gtk_tree_store_set (store, &child, 0, "Hello", -1);
870 specific_bug_300089 (void)
872 /* Test case for GNOME Bugzilla bug 300089. Written by
875 GtkTreeModel *sort_model, *child_model;
877 GtkTreeIter iter, iter2, sort_iter;
879 child_model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING));
881 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
882 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
883 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
884 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "B", -1);
886 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
887 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "D", -1);
888 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
889 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "E", -1);
891 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
892 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "C", -1);
895 sort_model = GTK_TREE_MODEL (gtk_tree_model_sort_new_with_model (child_model));
896 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model),
897 0, GTK_SORT_ASCENDING);
899 path = gtk_tree_path_new_from_indices (1, 1, -1);
901 /* make sure a level is constructed */
902 gtk_tree_model_get_iter (sort_model, &sort_iter, path);
904 /* change the "E" row in a way that causes it to change position */
905 gtk_tree_model_get_iter (child_model, &iter, path);
906 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
911 specific_bug_301558_sort_func (GtkTreeModel *model,
918 gtk_tree_model_get (model, a, 0, &i, -1);
919 gtk_tree_model_get (model, b, 0, &j, -1);
925 specific_bug_301558 (void)
927 /* Test case for GNOME Bugzilla bug 301558 provided by
931 GtkTreeModel *filter;
933 GtkTreeIter root, iter, iter2;
938 tree = gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_BOOLEAN);
939 gtk_tree_store_append (tree, &iter, NULL);
940 gtk_tree_store_set (tree, &iter, 0, 123, 1, TRUE, -1);
941 gtk_tree_store_append (tree, &iter2, &iter);
942 gtk_tree_store_set (tree, &iter2, 0, 73, 1, TRUE, -1);
944 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (tree));
945 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
946 specific_bug_301558_sort_func,
949 filter = gtk_tree_model_filter_new (sort, NULL);
950 gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (filter), 1);
952 view = gtk_tree_view_new_with_model (filter);
954 while (gtk_events_pending ())
955 gtk_main_iteration ();
959 for (i = 0; i < 10; i++)
961 if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (tree), &root))
962 g_assert_not_reached ();
966 gtk_tree_store_append (tree, &iter, &root);
967 gtk_tree_store_set (tree, &iter, 0, 456, 1, TRUE, -1);
972 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (tree), &root);
973 gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (tree), &iter,
975 gtk_tree_store_remove (tree, &iter);
984 specific_bug_311955_filter_func (GtkTreeModel *model,
990 gtk_tree_model_get (model, iter, 0, &value, -1);
996 specific_bug_311955 (void)
998 /* This is a test case for GNOME Bugzilla bug 311955. It was written
1001 GtkTreeIter iter, child, root;
1002 GtkTreeStore *store;
1004 GtkTreeModel *filter;
1007 GtkWidget *tree_view;
1011 store = gtk_tree_store_new (1, G_TYPE_INT);
1013 gtk_tree_store_append (store, &root, NULL);
1014 gtk_tree_store_set (store, &root, 0, 33, -1);
1016 gtk_tree_store_append (store, &iter, &root);
1017 gtk_tree_store_set (store, &iter, 0, 50, -1);
1019 gtk_tree_store_append (store, &iter, NULL);
1020 gtk_tree_store_set (store, &iter, 0, 22, -1);
1022 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1023 filter = gtk_tree_model_filter_new (sort, NULL);
1025 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1026 specific_bug_311955_filter_func,
1029 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1030 tree_view = gtk_tree_view_new_with_model (filter);
1031 g_object_unref (store);
1033 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
1035 while (gtk_events_pending ())
1036 gtk_main_iteration ();
1039 for (i = 0; i < 4; i++)
1041 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1043 gtk_tree_store_append (store, &iter, &root);
1046 gtk_tree_store_set (store, &iter, 0, i, -1);
1050 gtk_tree_store_append (store, &child, &iter);
1051 gtk_tree_store_set (store, &child, 0, 10, -1);
1055 while (gtk_events_pending ())
1056 gtk_main_iteration ();
1058 /* Remove bottommost child from the tree. */
1059 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1060 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &root);
1062 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter, &root, n - 2))
1064 if (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &child, &iter))
1065 gtk_tree_store_remove (store, &child);
1068 g_assert_not_reached ();
1072 specific_bug_346800 (void)
1074 /* This is a test case for GNOME Bugzilla bug 346800. It was written
1075 * by Jonathan Matthew.
1078 GtkTreeIter node_iters[50];
1079 GtkTreeIter child_iters[50];
1080 GtkTreeModel *model;
1081 GtkTreeModelFilter *filter;
1082 GtkTreeStore *store;
1086 columns = g_new (GType, 2);
1087 columns[0] = G_TYPE_STRING;
1088 columns[1] = G_TYPE_BOOLEAN;
1089 store = gtk_tree_store_newv (2, columns);
1090 model = GTK_TREE_MODEL (store);
1092 filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
1093 gtk_tree_model_filter_set_visible_column (filter, 1);
1095 for (i=0; i<items; i++)
1097 /* allocate random amounts of junk, otherwise the filter model's arrays can expand without moving */
1100 gtk_tree_store_append (store, &node_iters[i], NULL);
1101 gtk_tree_store_set (store, &node_iters[i],
1103 1, ((i%6) == 0) ? FALSE : TRUE,
1107 gtk_tree_store_append (store, &child_iters[i], &node_iters[i]);
1108 gtk_tree_store_set (store, &child_iters[i],
1109 0, "something else",
1112 gtk_tree_model_filter_refilter (filter);
1116 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-1], 1,
1117 (i & 1) ? TRUE : FALSE, -1);
1118 gtk_tree_model_filter_refilter (filter);
1120 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-2], 1,
1121 (i & 1) ? FALSE: TRUE, -1);
1122 gtk_tree_model_filter_refilter (filter);
1129 specific_bug_364946 (void)
1131 /* This is a test case for GNOME Bugzilla bug 364946. It was written
1132 * by Andreas Koehler.
1134 GtkTreeStore *store;
1135 GtkTreeIter a, aa, aaa, aab, iter;
1136 GtkTreeModel *s_model;
1138 store = gtk_tree_store_new (1, G_TYPE_STRING);
1140 gtk_tree_store_append (store, &a, NULL);
1141 gtk_tree_store_set (store, &a, 0, "0", -1);
1143 gtk_tree_store_append (store, &aa, &a);
1144 gtk_tree_store_set (store, &aa, 0, "0:0", -1);
1146 gtk_tree_store_append (store, &aaa, &aa);
1147 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1149 gtk_tree_store_append (store, &aab, &aa);
1150 gtk_tree_store_set (store, &aab, 0, "0:0:1", -1);
1152 s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1153 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model), 0,
1154 GTK_SORT_ASCENDING);
1156 gtk_tree_model_get_iter_from_string (s_model, &iter, "0:0:0");
1158 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1159 gtk_tree_store_remove (store, &aaa);
1160 gtk_tree_store_remove (store, &aab);
1162 gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (s_model));
1171 gtk_test_init (&argc, &argv, NULL);
1173 g_test_add ("/FilterModel/self/verify-test-suite",
1177 filter_test_teardown);
1179 g_test_add ("/FilterModel/filled/hide-root-level",
1182 filled_hide_root_level,
1183 filter_test_teardown);
1184 g_test_add ("/FilterModel/filled/hide-child-levels",
1187 filled_hide_child_levels,
1188 filter_test_teardown);
1190 g_test_add ("/FilterModel/empty/show-nodes",
1192 filter_test_setup_empty,
1194 filter_test_teardown);
1196 g_test_add ("/FilterModel/unfiltered/hide-single",
1198 filter_test_setup_unfiltered,
1199 unfiltered_hide_single,
1200 filter_test_teardown);
1201 g_test_add ("/FilterModel/unfiltered/hide-single-child",
1203 filter_test_setup_unfiltered,
1204 unfiltered_hide_single_child,
1205 filter_test_teardown);
1206 g_test_add ("/FilterModel/unfiltered/hide-single-multi-level",
1208 filter_test_setup_unfiltered,
1209 unfiltered_hide_single_multi_level,
1210 filter_test_teardown);
1212 g_test_add ("/FilterModel/unfiltered/show-single",
1214 filter_test_setup_empty_unfiltered,
1215 unfiltered_show_single,
1216 filter_test_teardown);
1217 g_test_add ("/FilterModel/unfiltered/show-single-child",
1219 filter_test_setup_empty_unfiltered,
1220 unfiltered_show_single_child,
1221 filter_test_teardown);
1222 g_test_add ("/FilterModel/unfiltered/show-single-multi-level",
1224 filter_test_setup_empty_unfiltered,
1225 unfiltered_show_single_multi_level,
1226 filter_test_teardown);
1229 g_test_add_func ("/FilterModel/specific/path-dependent-filter",
1230 specific_path_dependent_filter);
1231 g_test_add_func ("/FilterModel/specific/append-after-collapse",
1232 specific_append_after_collapse);
1233 g_test_add_func ("/FilterModel/specific/sort-filter-remove-node",
1234 specific_sort_filter_remove_node);
1235 g_test_add_func ("/FilterModel/specific/sort-filter-remove-root",
1236 specific_sort_filter_remove_root);
1237 g_test_add_func ("/FilterModel/specific/filter-add-child",
1238 specific_filter_add_child);
1240 g_test_add_func ("/FilterModel/specific/bug-300089",
1241 specific_bug_300089);
1242 g_test_add_func ("/FilterModel/specific/bug-301558",
1243 specific_bug_301558);
1244 g_test_add_func ("/FilterModel/specific/bug-311955",
1245 specific_bug_311955);
1246 g_test_add_func ("/FilterModel/specific/bug-346800",
1247 specific_bug_346800);
1248 g_test_add_func ("/FilterModel/specific/bug-364946",
1249 specific_bug_364946);
1251 return g_test_run ();