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_vroot_hide_single (FilterTest *fixture,
720 gconstpointer user_data)
723 GtkTreePath *path = (GtkTreePath *)user_data;
725 set_path_visibility (fixture, "2:2", FALSE);
727 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
729 filter_test_enable_filter (fixture);
731 check_filter_model_with_root (fixture, path);
732 check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
736 unfiltered_vroot_hide_single_child (FilterTest *fixture,
737 gconstpointer user_data)
740 GtkTreePath *path = (GtkTreePath *)user_data;
742 set_path_visibility (fixture, "2:2:2", FALSE);
744 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
745 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
747 filter_test_enable_filter (fixture);
749 check_filter_model_with_root (fixture, path);
750 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
751 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
755 unfiltered_vroot_hide_single_multi_level (FilterTest *fixture,
756 gconstpointer user_data)
759 GtkTreePath *path = (GtkTreePath *)user_data;
761 set_path_visibility (fixture, "2:2:2:2", FALSE);
762 set_path_visibility (fixture, "2:2:2", FALSE);
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_with_root (fixture, path);
771 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
772 check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
774 set_path_visibility (fixture, "2:2:2", TRUE);
776 check_filter_model_with_root (fixture, path);
777 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
778 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
779 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH - 1);
785 unfiltered_show_single (FilterTest *fixture,
786 gconstpointer user_data)
789 set_path_visibility (fixture, "2", TRUE);
791 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
793 filter_test_enable_filter (fixture);
795 check_filter_model (fixture);
796 check_level_length (fixture->filter, NULL, 1);
800 unfiltered_show_single_child (FilterTest *fixture,
801 gconstpointer user_data)
804 set_path_visibility (fixture, "2:2", TRUE);
806 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
807 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
809 filter_test_enable_filter (fixture);
811 check_filter_model (fixture);
812 check_level_length (fixture->filter, NULL, 0);
814 /* From here we are filtered, "2" in the real model is "0" in the filter
817 set_path_visibility (fixture, "2", TRUE);
818 check_level_length (fixture->filter, NULL, 1);
819 check_level_length (fixture->filter, "0", 1);
823 unfiltered_show_single_multi_level (FilterTest *fixture,
824 gconstpointer user_data)
827 set_path_visibility (fixture, "2:2:2", TRUE);
828 set_path_visibility (fixture, "2:2", TRUE);
830 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
831 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
832 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
834 filter_test_enable_filter (fixture);
836 check_filter_model (fixture);
837 check_level_length (fixture->filter, NULL, 0);
839 /* From here we are filtered, "2" in the real model is "0" in the filter
842 set_path_visibility (fixture, "2", TRUE);
843 check_filter_model (fixture);
844 check_level_length (fixture->filter, NULL, 1);
845 check_level_length (fixture->filter, "0", 1);
846 check_level_length (fixture->filter, "0:0", 1);
851 unfiltered_vroot_show_single (FilterTest *fixture,
852 gconstpointer user_data)
855 GtkTreePath *path = (GtkTreePath *)user_data;
857 set_path_visibility (fixture, "2:2", TRUE);
859 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
861 filter_test_enable_filter (fixture);
863 check_filter_model_with_root (fixture, path);
864 check_level_length (fixture->filter, NULL, 1);
868 unfiltered_vroot_show_single_child (FilterTest *fixture,
869 gconstpointer user_data)
872 GtkTreePath *path = (GtkTreePath *)user_data;
874 set_path_visibility (fixture, "2:2:2", TRUE);
876 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
877 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
879 filter_test_enable_filter (fixture);
881 check_filter_model_with_root (fixture, path);
882 check_level_length (fixture->filter, NULL, 0);
884 /* From here we are filtered, "2" in the real model is "0" in the filter
887 set_path_visibility (fixture, "2:2", TRUE);
888 check_level_length (fixture->filter, NULL, 1);
889 check_level_length (fixture->filter, "0", 1);
893 unfiltered_vroot_show_single_multi_level (FilterTest *fixture,
894 gconstpointer user_data)
897 GtkTreePath *path = (GtkTreePath *)user_data;
899 set_path_visibility (fixture, "2:2:2:2", TRUE);
900 set_path_visibility (fixture, "2:2:2", TRUE);
902 check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
903 check_level_length (fixture->filter, "2", LEVEL_LENGTH);
904 check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
906 filter_test_enable_filter (fixture);
908 check_filter_model_with_root (fixture, path);
909 check_level_length (fixture->filter, NULL, 0);
911 /* From here we are filtered, "2" in the real model is "0" in the filter
914 set_path_visibility (fixture, "2:2", TRUE);
915 check_filter_model_with_root (fixture, path);
916 check_level_length (fixture->filter, NULL, 1);
917 check_level_length (fixture->filter, "0", 1);
918 check_level_length (fixture->filter, "0:0", 1);
923 specific_path_dependent_filter_func (GtkTreeModel *model,
929 path = gtk_tree_model_get_path (model, iter);
930 if (gtk_tree_path_get_indices (path)[0] < 4)
937 specific_path_dependent_filter (void)
943 GtkTreeModel *filter;
945 list = gtk_list_store_new (1, G_TYPE_INT);
946 gtk_list_store_insert_with_values (list, &iter, 0, 0, 1, -1);
947 gtk_list_store_insert_with_values (list, &iter, 1, 0, 2, -1);
948 gtk_list_store_insert_with_values (list, &iter, 2, 0, 3, -1);
949 gtk_list_store_insert_with_values (list, &iter, 3, 0, 4, -1);
950 gtk_list_store_insert_with_values (list, &iter, 4, 0, 5, -1);
951 gtk_list_store_insert_with_values (list, &iter, 5, 0, 6, -1);
952 gtk_list_store_insert_with_values (list, &iter, 6, 0, 7, -1);
953 gtk_list_store_insert_with_values (list, &iter, 7, 0, 8, -1);
955 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (list));
956 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (sort), NULL);
957 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
958 specific_path_dependent_filter_func,
961 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), 0,
962 GTK_SORT_DESCENDING);
964 for (i = 0; i < 4; i++)
966 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
968 gtk_list_store_remove (list, &iter);
970 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
972 gtk_list_store_remove (list, &iter);
978 specific_append_after_collapse_visible_func (GtkTreeModel *model,
983 gboolean hide_negative_numbers;
985 gtk_tree_model_get (model, iter, 1, &number, -1);
986 hide_negative_numbers = GPOINTER_TO_INT (g_object_get_data (data, "private-hide-negative-numbers"));
988 return (number >= 0 || !hide_negative_numbers);
992 specific_append_after_collapse (void)
994 /* This test is based on one of the test cases I found in my
995 * old test cases directory. I unfortunately do not have a record
996 * from who this test case originated. -Kris.
1000 * - Show tree, expand, collapse.
1005 GtkTreeIter child_iter;
1006 GtkTreeIter child_iter2;
1007 GtkTreePath *append_path;
1008 GtkTreeStore *store;
1009 GtkTreeModel *filter;
1013 GtkWidget *tree_view;
1015 store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
1017 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1018 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
1019 GINT_TO_POINTER (FALSE));
1020 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1021 specific_append_after_collapse_visible_func,
1024 sort = gtk_tree_model_sort_new_with_model (filter);
1026 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1027 tree_view = gtk_tree_view_new_with_model (sort);
1028 gtk_container_add (GTK_CONTAINER (window), tree_view);
1029 gtk_widget_realize (tree_view);
1031 while (gtk_events_pending ())
1032 gtk_main_iteration ();
1034 gtk_tree_store_prepend (store, &iter, NULL);
1035 gtk_tree_store_set (store, &iter,
1036 0, "hallo", 1, 1, -1);
1038 gtk_tree_store_append (store, &child_iter, &iter);
1039 gtk_tree_store_set (store, &child_iter,
1040 0, "toemaar", 1, 1, -1);
1042 gtk_tree_store_append (store, &child_iter2, &child_iter);
1043 gtk_tree_store_set (store, &child_iter2,
1044 0, "very deep", 1, 1, -1);
1046 append_path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &child_iter2);
1048 gtk_tree_store_append (store, &child_iter, &iter);
1049 gtk_tree_store_set (store, &child_iter,
1050 0, "sja", 1, 1, -1);
1052 gtk_tree_store_append (store, &child_iter, &iter);
1053 gtk_tree_store_set (store, &child_iter,
1054 0, "some word", 1, -1, -1);
1056 /* Expand and collapse the tree */
1057 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
1058 while (gtk_events_pending ())
1059 gtk_main_iteration ();
1061 gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
1062 while (gtk_events_pending ())
1063 gtk_main_iteration ();
1065 /* Add another it */
1066 g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
1067 GINT_TO_POINTER (TRUE));
1069 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, append_path))
1071 gtk_tree_store_append (store, &child_iter, &iter);
1072 gtk_tree_store_set (store, &child_iter,
1073 0, "new new new !!", 1, 1, -1);
1075 gtk_tree_path_free (append_path);
1078 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
1079 while (gtk_events_pending ())
1080 gtk_main_iteration ();
1085 specific_sort_filter_remove_node_compare_func (GtkTreeModel *model,
1094 specific_sort_filter_remove_node_visible_func (GtkTreeModel *model,
1100 /* Do reference the model */
1101 gtk_tree_model_get (model, iter, 0, &item, -1);
1108 specific_sort_filter_remove_node (void)
1110 /* This test is based on one of the test cases I found in my
1111 * old test cases directory. I unfortunately do not have a record
1112 * from who this test case originated. -Kris.
1115 * - Create tree store, sort, filter models. The sort model has
1116 * a default sort func that is enabled, filter model a visible func
1117 * that defaults to returning FALSE.
1118 * - Remove a node from the tree store.
1122 GtkTreeStore *store;
1123 GtkTreeModel *filter;
1127 GtkWidget *tree_view;
1129 store = gtk_tree_store_new (1, G_TYPE_STRING);
1130 gtk_tree_store_append (store, &iter, NULL);
1131 gtk_tree_store_set (store, &iter, 0, "Hello1", -1);
1133 gtk_tree_store_append (store, &iter, NULL);
1134 gtk_tree_store_set (store, &iter, 0, "Hello2", -1);
1136 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1137 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
1138 specific_sort_filter_remove_node_compare_func, NULL, NULL);
1140 filter = gtk_tree_model_filter_new (sort, NULL);
1141 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1142 specific_sort_filter_remove_node_visible_func,
1146 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1147 tree_view = gtk_tree_view_new_with_model (filter);
1148 gtk_container_add (GTK_CONTAINER (window), tree_view);
1149 gtk_widget_realize (tree_view);
1151 while (gtk_events_pending ())
1152 gtk_main_iteration ();
1155 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
1156 gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter);
1157 gtk_tree_store_remove (store, &iter);
1159 while (gtk_events_pending ())
1160 gtk_main_iteration ();
1165 specific_sort_filter_remove_root (void)
1167 /* This test is based on one of the test cases I found in my
1168 * old test cases directory. I unfortunately do not have a record
1169 * from who this test case originated. -Kris.
1172 GtkTreeModel *model, *sort, *filter;
1173 GtkTreeIter root, mid, leaf;
1176 model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_INT));
1177 gtk_tree_store_append (GTK_TREE_STORE (model), &root, NULL);
1178 gtk_tree_store_append (GTK_TREE_STORE (model), &mid, &root);
1179 gtk_tree_store_append (GTK_TREE_STORE (model), &leaf, &mid);
1181 path = gtk_tree_model_get_path (model, &mid);
1183 sort = gtk_tree_model_sort_new_with_model (model);
1184 filter = gtk_tree_model_filter_new (sort, path);
1186 gtk_tree_store_remove (GTK_TREE_STORE (model), &root);
1188 g_object_unref (filter);
1189 g_object_unref (sort);
1190 g_object_unref (model);
1195 specific_root_mixed_visibility (void)
1198 GtkTreeModel *filter;
1199 /* A bit nasty, apologies */
1202 fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
1204 for (i = 0; i < LEVEL_LENGTH; i++)
1208 gtk_tree_store_insert (fixture.store, &iter, NULL, i);
1210 create_tree_store_set_values (fixture.store, &iter, TRUE);
1212 create_tree_store_set_values (fixture.store, &iter, FALSE);
1215 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
1216 fixture.filter = GTK_TREE_MODEL_FILTER (filter);
1218 gtk_tree_model_filter_set_visible_column (fixture.filter, 1);
1220 /* In order to trigger the potential bug, we should not access
1221 * the filter model here (so don't call the check functions).
1224 /* Change visibility of an odd row to TRUE */
1225 set_path_visibility (&fixture, "3", TRUE);
1226 check_filter_model (&fixture);
1227 check_level_length (fixture.filter, NULL, 4);
1233 specific_has_child_filter_filter_func (GtkTreeModel *model,
1237 return gtk_tree_model_iter_has_child (model, iter);
1241 specific_has_child_filter (void)
1243 GtkTreeModel *filter;
1244 GtkTreeIter iter, root;
1245 /* A bit nasty, apologies */
1248 fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
1249 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
1250 fixture.filter = GTK_TREE_MODEL_FILTER (filter);
1252 /* We will filter on parent state using a filter function. We will
1253 * manually keep the boolean column in sync, so that we can use
1254 * check_filter_model() to check the consistency of the model.
1256 /* FIXME: We need a check_filter_model() that is not tied to LEVEL_LENGTH
1257 * to be able to check the structure here. We keep the calls to
1258 * check_filter_model() commented out until then.
1260 gtk_tree_model_filter_set_visible_func (fixture.filter,
1261 specific_has_child_filter_filter_func,
1264 gtk_tree_store_append (fixture.store, &root, NULL);
1265 create_tree_store_set_values (fixture.store, &root, FALSE);
1267 /* check_filter_model (&fixture); */
1268 check_level_length (fixture.filter, NULL, 0);
1270 gtk_tree_store_append (fixture.store, &iter, &root);
1271 create_tree_store_set_values (fixture.store, &iter, TRUE);
1273 /* Parent must now be visible. Do the level length check first,
1274 * to avoid modifying the child model triggering a row-changed to
1277 check_level_length (fixture.filter, NULL, 1);
1278 check_level_length (fixture.filter, "0", 0);
1280 set_path_visibility (&fixture, "0", TRUE);
1281 /* check_filter_model (&fixture); */
1283 gtk_tree_store_append (fixture.store, &root, NULL);
1284 check_level_length (fixture.filter, NULL, 1);
1286 gtk_tree_store_append (fixture.store, &iter, &root);
1287 check_level_length (fixture.filter, NULL, 2);
1288 check_level_length (fixture.filter, "1", 0);
1290 create_tree_store_set_values (fixture.store, &root, TRUE);
1291 create_tree_store_set_values (fixture.store, &iter, TRUE);
1293 /* check_filter_model (&fixture); */
1295 gtk_tree_store_append (fixture.store, &iter, &root);
1296 create_tree_store_set_values (fixture.store, &iter, TRUE);
1297 check_level_length (fixture.filter, NULL, 2);
1298 check_level_length (fixture.filter, "0", 0);
1299 check_level_length (fixture.filter, "1", 0);
1301 /* Now remove one of the remaining child rows */
1302 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture.store),
1304 gtk_tree_store_remove (fixture.store, &iter);
1306 check_level_length (fixture.filter, NULL, 1);
1307 check_level_length (fixture.filter, "0", 0);
1309 set_path_visibility (&fixture, "0", FALSE);
1310 /* check_filter_model (&fixture); */
1315 specific_root_has_child_filter_filter_func (GtkTreeModel *model,
1322 path = gtk_tree_model_get_path (model, iter);
1323 depth = gtk_tree_path_get_depth (path);
1324 gtk_tree_path_free (path);
1329 return gtk_tree_model_iter_has_child (model, iter);
1333 specific_root_has_child_filter (void)
1335 GtkTreeModel *filter;
1336 GtkTreeIter iter, root;
1337 /* A bit nasty, apologies */
1340 /* This is a variation on the above test case wherein the has-child
1341 * check for visibility only applies to root level nodes.
1344 fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
1345 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
1346 fixture.filter = GTK_TREE_MODEL_FILTER (filter);
1348 /* We will filter on parent state using a filter function. We will
1349 * manually keep the boolean column in sync, so that we can use
1350 * check_filter_model() to check the consistency of the model.
1352 /* FIXME: We need a check_filter_model() that is not tied to LEVEL_LENGTH
1353 * to be able to check the structure here. We keep the calls to
1354 * check_filter_model() commented out until then.
1356 gtk_tree_model_filter_set_visible_func (fixture.filter,
1357 specific_root_has_child_filter_filter_func,
1360 gtk_tree_store_append (fixture.store, &root, NULL);
1361 create_tree_store_set_values (fixture.store, &root, FALSE);
1363 /* check_filter_model (&fixture); */
1364 check_level_length (fixture.filter, NULL, 0);
1366 gtk_tree_store_append (fixture.store, &iter, &root);
1367 create_tree_store_set_values (fixture.store, &iter, TRUE);
1369 /* Parent must now be visible. Do the level length check first,
1370 * to avoid modifying the child model triggering a row-changed to
1373 check_level_length (fixture.filter, NULL, 1);
1374 check_level_length (fixture.filter, "0", 1);
1376 set_path_visibility (&fixture, "0", TRUE);
1377 /* check_filter_model (&fixture); */
1379 gtk_tree_store_append (fixture.store, &root, NULL);
1380 check_level_length (fixture.filter, NULL, 1);
1382 gtk_tree_store_append (fixture.store, &iter, &root);
1383 check_level_length (fixture.filter, NULL, 2);
1384 check_level_length (fixture.filter, "1", 1);
1386 create_tree_store_set_values (fixture.store, &root, TRUE);
1387 create_tree_store_set_values (fixture.store, &iter, TRUE);
1389 /* check_filter_model (&fixture); */
1391 gtk_tree_store_append (fixture.store, &iter, &root);
1392 create_tree_store_set_values (fixture.store, &iter, TRUE);
1393 check_level_length (fixture.filter, NULL, 2);
1394 check_level_length (fixture.filter, "0", 1);
1395 check_level_length (fixture.filter, "1", 2);
1397 /* Now remove one of the remaining child rows */
1398 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture.store),
1400 gtk_tree_store_remove (fixture.store, &iter);
1402 check_level_length (fixture.filter, NULL, 1);
1403 check_level_length (fixture.filter, "0", 2);
1405 set_path_visibility (&fixture, "0", FALSE);
1406 /* check_filter_model (&fixture); */
1411 specific_filter_add_child (void)
1413 /* This test is based on one of the test cases I found in my
1414 * old test cases directory. I unfortunately do not have a record
1415 * from who this test case originated. -Kris.
1419 GtkTreeIter iter_first;
1421 GtkTreeStore *store;
1422 GtkTreeModel *filter;
1424 store = gtk_tree_store_new (1, G_TYPE_STRING);
1426 gtk_tree_store_append (store, &iter_first, NULL);
1427 gtk_tree_store_set (store, &iter_first, 0, "Hello", -1);
1429 gtk_tree_store_append (store, &iter, NULL);
1430 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1432 gtk_tree_store_append (store, &iter, NULL);
1433 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1435 gtk_tree_store_append (store, &iter, NULL);
1436 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1438 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1440 gtk_tree_store_set (store, &iter, 0, "Hello", -1);
1441 gtk_tree_store_append (store, &child, &iter_first);
1442 gtk_tree_store_set (store, &child, 0, "Hello", -1);
1447 specific_bug_300089 (void)
1449 /* Test case for GNOME Bugzilla bug 300089. Written by
1452 GtkTreeModel *sort_model, *child_model;
1454 GtkTreeIter iter, iter2, sort_iter;
1456 child_model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING));
1458 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
1459 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
1460 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
1461 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "B", -1);
1463 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
1464 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "D", -1);
1465 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
1466 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "E", -1);
1468 gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
1469 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "C", -1);
1472 sort_model = GTK_TREE_MODEL (gtk_tree_model_sort_new_with_model (child_model));
1473 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model),
1474 0, GTK_SORT_ASCENDING);
1476 path = gtk_tree_path_new_from_indices (1, 1, -1);
1478 /* make sure a level is constructed */
1479 gtk_tree_model_get_iter (sort_model, &sort_iter, path);
1481 /* change the "E" row in a way that causes it to change position */
1482 gtk_tree_model_get_iter (child_model, &iter, path);
1483 gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
1488 specific_bug_301558_sort_func (GtkTreeModel *model,
1495 gtk_tree_model_get (model, a, 0, &i, -1);
1496 gtk_tree_model_get (model, b, 0, &j, -1);
1502 specific_bug_301558 (void)
1504 /* Test case for GNOME Bugzilla bug 301558 provided by
1508 GtkTreeModel *filter;
1510 GtkTreeIter root, iter, iter2;
1515 tree = gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_BOOLEAN);
1516 gtk_tree_store_append (tree, &iter, NULL);
1517 gtk_tree_store_set (tree, &iter, 0, 123, 1, TRUE, -1);
1518 gtk_tree_store_append (tree, &iter2, &iter);
1519 gtk_tree_store_set (tree, &iter2, 0, 73, 1, TRUE, -1);
1521 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (tree));
1522 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
1523 specific_bug_301558_sort_func,
1526 filter = gtk_tree_model_filter_new (sort, NULL);
1527 gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (filter), 1);
1529 view = gtk_tree_view_new_with_model (filter);
1531 while (gtk_events_pending ())
1532 gtk_main_iteration ();
1536 for (i = 0; i < 10; i++)
1538 if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (tree), &root))
1539 g_assert_not_reached ();
1543 gtk_tree_store_append (tree, &iter, &root);
1544 gtk_tree_store_set (tree, &iter, 0, 456, 1, TRUE, -1);
1549 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (tree), &root);
1550 gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (tree), &iter,
1552 gtk_tree_store_remove (tree, &iter);
1561 specific_bug_311955_filter_func (GtkTreeModel *model,
1567 gtk_tree_model_get (model, iter, 0, &value, -1);
1569 return (value != 0);
1573 specific_bug_311955 (void)
1575 /* This is a test case for GNOME Bugzilla bug 311955. It was written
1578 GtkTreeIter iter, child, root;
1579 GtkTreeStore *store;
1581 GtkTreeModel *filter;
1584 GtkWidget *tree_view;
1588 store = gtk_tree_store_new (1, G_TYPE_INT);
1590 gtk_tree_store_append (store, &root, NULL);
1591 gtk_tree_store_set (store, &root, 0, 33, -1);
1593 gtk_tree_store_append (store, &iter, &root);
1594 gtk_tree_store_set (store, &iter, 0, 50, -1);
1596 gtk_tree_store_append (store, &iter, NULL);
1597 gtk_tree_store_set (store, &iter, 0, 22, -1);
1599 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1600 filter = gtk_tree_model_filter_new (sort, NULL);
1602 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1603 specific_bug_311955_filter_func,
1606 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1607 tree_view = gtk_tree_view_new_with_model (filter);
1608 g_object_unref (store);
1610 gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
1612 while (gtk_events_pending ())
1613 gtk_main_iteration ();
1616 for (i = 0; i < 4; i++)
1618 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1620 gtk_tree_store_append (store, &iter, &root);
1623 gtk_tree_store_set (store, &iter, 0, i, -1);
1627 gtk_tree_store_append (store, &child, &iter);
1628 gtk_tree_store_set (store, &child, 0, 10, -1);
1632 while (gtk_events_pending ())
1633 gtk_main_iteration ();
1635 /* Remove bottommost child from the tree. */
1636 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
1637 n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &root);
1639 if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter, &root, n - 2))
1641 if (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &child, &iter))
1642 gtk_tree_store_remove (store, &child);
1645 g_assert_not_reached ();
1649 specific_bug_346800 (void)
1651 /* This is a test case for GNOME Bugzilla bug 346800. It was written
1652 * by Jonathan Matthew.
1655 GtkTreeIter node_iters[50];
1656 GtkTreeIter child_iters[50];
1657 GtkTreeModel *model;
1658 GtkTreeModelFilter *filter;
1659 GtkTreeStore *store;
1663 columns = g_new (GType, 2);
1664 columns[0] = G_TYPE_STRING;
1665 columns[1] = G_TYPE_BOOLEAN;
1666 store = gtk_tree_store_newv (2, columns);
1667 model = GTK_TREE_MODEL (store);
1669 filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
1670 gtk_tree_model_filter_set_visible_column (filter, 1);
1672 for (i=0; i<items; i++)
1674 /* allocate random amounts of junk, otherwise the filter model's arrays can expand without moving */
1677 gtk_tree_store_append (store, &node_iters[i], NULL);
1678 gtk_tree_store_set (store, &node_iters[i],
1680 1, ((i%6) == 0) ? FALSE : TRUE,
1684 gtk_tree_store_append (store, &child_iters[i], &node_iters[i]);
1685 gtk_tree_store_set (store, &child_iters[i],
1686 0, "something else",
1689 gtk_tree_model_filter_refilter (filter);
1693 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-1], 1,
1694 (i & 1) ? TRUE : FALSE, -1);
1695 gtk_tree_model_filter_refilter (filter);
1697 gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-2], 1,
1698 (i & 1) ? FALSE: TRUE, -1);
1699 gtk_tree_model_filter_refilter (filter);
1706 specific_bug_364946 (void)
1708 /* This is a test case for GNOME Bugzilla bug 364946. It was written
1709 * by Andreas Koehler.
1711 GtkTreeStore *store;
1712 GtkTreeIter a, aa, aaa, aab, iter;
1713 GtkTreeModel *s_model;
1715 store = gtk_tree_store_new (1, G_TYPE_STRING);
1717 gtk_tree_store_append (store, &a, NULL);
1718 gtk_tree_store_set (store, &a, 0, "0", -1);
1720 gtk_tree_store_append (store, &aa, &a);
1721 gtk_tree_store_set (store, &aa, 0, "0:0", -1);
1723 gtk_tree_store_append (store, &aaa, &aa);
1724 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1726 gtk_tree_store_append (store, &aab, &aa);
1727 gtk_tree_store_set (store, &aab, 0, "0:0:1", -1);
1729 s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
1730 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model), 0,
1731 GTK_SORT_ASCENDING);
1733 gtk_tree_model_get_iter_from_string (s_model, &iter, "0:0:0");
1735 gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
1736 gtk_tree_store_remove (store, &aaa);
1737 gtk_tree_store_remove (store, &aab);
1739 gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (s_model));
1744 specific_bug_464173_visible_func (GtkTreeModel *model,
1748 gboolean *visible = (gboolean *)data;
1754 specific_bug_464173 (void)
1756 /* Test case for GNOME Bugzilla bug 464173, test case written
1757 * by Andreas Koehler.
1759 GtkTreeStore *model;
1760 GtkTreeModelFilter *f_model;
1761 GtkTreeIter iter1, iter2;
1763 gboolean visible = TRUE;
1765 model = gtk_tree_store_new (1, G_TYPE_STRING);
1766 gtk_tree_store_append (model, &iter1, NULL);
1767 gtk_tree_store_set (model, &iter1, 0, "Foo", -1);
1768 gtk_tree_store_append (model, &iter2, &iter1);
1769 gtk_tree_store_set (model, &iter2, 0, "Bar", -1);
1771 f_model = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL(model), NULL));
1772 gtk_tree_model_filter_set_visible_func (f_model,
1773 specific_bug_464173_visible_func,
1776 view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (f_model));
1779 gtk_tree_model_filter_refilter (f_model);
1784 specific_bug_540201_filter_func (GtkTreeModel *model,
1788 gboolean has_children;
1790 has_children = gtk_tree_model_iter_has_child (model, iter);
1792 return has_children;
1796 specific_bug_540201 (void)
1798 /* Test case for GNOME Bugzilla bug 540201, steps provided by
1801 GtkTreeIter iter, root;
1802 GtkTreeStore *store;
1803 GtkTreeModel *filter;
1805 GtkWidget *tree_view;
1807 store = gtk_tree_store_new (1, G_TYPE_INT);
1809 gtk_tree_store_append (store, &root, NULL);
1810 gtk_tree_store_set (store, &root, 0, 33, -1);
1812 filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1813 tree_view = gtk_tree_view_new_with_model (filter);
1815 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
1816 specific_bug_540201_filter_func,
1819 gtk_tree_store_append (store, &iter, &root);
1820 gtk_tree_store_set (store, &iter, 0, 50, -1);
1822 gtk_tree_store_append (store, &iter, &root);
1823 gtk_tree_store_set (store, &iter, 0, 22, -1);
1826 gtk_tree_store_append (store, &root, NULL);
1827 gtk_tree_store_set (store, &root, 0, 33, -1);
1829 gtk_tree_store_append (store, &iter, &root);
1830 gtk_tree_store_set (store, &iter, 0, 22, -1);
1835 specific_bug_549287_visible_func (GtkTreeModel *model,
1839 gboolean result = FALSE;
1841 result = gtk_tree_model_iter_has_child (model, iter);
1847 specific_bug_549287 (void)
1849 /* Test case for GNOME Bugzilla bug 529287, provided by Julient Puydt */
1852 GtkTreeStore *store;
1853 GtkTreeModel *filtered;
1856 GtkTreeIter *swap, *parent, *child;
1858 store = gtk_tree_store_new (1, G_TYPE_STRING);
1859 filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
1860 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filtered),
1861 specific_bug_549287_visible_func,
1864 view = gtk_tree_view_new_with_model (filtered);
1866 for (i = 0; i < 4; i++)
1868 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
1870 parent = gtk_tree_iter_copy (&iter);
1871 child = gtk_tree_iter_copy (&iter);
1873 while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store),
1882 gtk_tree_store_append (store, child, parent);
1883 gtk_tree_store_set (store, child,
1887 gtk_tree_iter_free (parent);
1888 gtk_tree_iter_free (child);
1892 gtk_tree_store_append (store, &iter, NULL);
1893 gtk_tree_store_set (store, &iter,
1898 /* since we inserted something, we changed the visibility conditions: */
1899 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filtered));
1909 gtk_test_init (&argc, &argv, NULL);
1911 g_test_add ("/FilterModel/self/verify-test-suite",
1915 filter_test_teardown);
1917 g_test_add ("/FilterModel/self/verify-test-suite/vroot/depth-1",
1918 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1920 verify_test_suite_vroot,
1921 filter_test_teardown);
1922 g_test_add ("/FilterModel/self/verify-test-suite/vroot/depth-2",
1923 FilterTest, gtk_tree_path_new_from_indices (2, 3, -1),
1925 verify_test_suite_vroot,
1926 filter_test_teardown);
1929 g_test_add ("/FilterModel/filled/hide-root-level",
1932 filled_hide_root_level,
1933 filter_test_teardown);
1934 g_test_add ("/FilterModel/filled/hide-child-levels",
1937 filled_hide_child_levels,
1938 filter_test_teardown);
1940 g_test_add ("/FilterModel/filled/hide-root-level/vroot",
1941 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1943 filled_vroot_hide_root_level,
1944 filter_test_teardown);
1945 g_test_add ("/FilterModel/filled/hide-child-levels/vroot",
1946 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1948 filled_vroot_hide_child_levels,
1949 filter_test_teardown);
1952 g_test_add ("/FilterModel/empty/show-nodes",
1954 filter_test_setup_empty,
1956 filter_test_teardown);
1958 g_test_add ("/FilterModel/empty/show-nodes/vroot",
1959 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1960 filter_test_setup_empty,
1961 empty_vroot_show_nodes,
1962 filter_test_teardown);
1965 g_test_add ("/FilterModel/unfiltered/hide-single",
1967 filter_test_setup_unfiltered,
1968 unfiltered_hide_single,
1969 filter_test_teardown);
1970 g_test_add ("/FilterModel/unfiltered/hide-single-child",
1972 filter_test_setup_unfiltered,
1973 unfiltered_hide_single_child,
1974 filter_test_teardown);
1975 g_test_add ("/FilterModel/unfiltered/hide-single-multi-level",
1977 filter_test_setup_unfiltered,
1978 unfiltered_hide_single_multi_level,
1979 filter_test_teardown);
1981 g_test_add ("/FilterModel/unfiltered/hide-single/vroot",
1982 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1983 filter_test_setup_unfiltered,
1984 unfiltered_vroot_hide_single,
1985 filter_test_teardown);
1986 g_test_add ("/FilterModel/unfiltered/hide-single-child/vroot",
1987 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1988 filter_test_setup_unfiltered,
1989 unfiltered_vroot_hide_single_child,
1990 filter_test_teardown);
1991 g_test_add ("/FilterModel/unfiltered/hide-single-multi-level/vroot",
1992 FilterTest, gtk_tree_path_new_from_indices (2, -1),
1993 filter_test_setup_unfiltered,
1994 unfiltered_vroot_hide_single_multi_level,
1995 filter_test_teardown);
1999 g_test_add ("/FilterModel/unfiltered/show-single",
2001 filter_test_setup_empty_unfiltered,
2002 unfiltered_show_single,
2003 filter_test_teardown);
2004 g_test_add ("/FilterModel/unfiltered/show-single-child",
2006 filter_test_setup_empty_unfiltered,
2007 unfiltered_show_single_child,
2008 filter_test_teardown);
2009 g_test_add ("/FilterModel/unfiltered/show-single-multi-level",
2011 filter_test_setup_empty_unfiltered,
2012 unfiltered_show_single_multi_level,
2013 filter_test_teardown);
2015 g_test_add ("/FilterModel/unfiltered/show-single/vroot",
2016 FilterTest, gtk_tree_path_new_from_indices (2, -1),
2017 filter_test_setup_empty_unfiltered,
2018 unfiltered_vroot_show_single,
2019 filter_test_teardown);
2020 g_test_add ("/FilterModel/unfiltered/show-single-child/vroot",
2021 FilterTest, gtk_tree_path_new_from_indices (2, -1),
2022 filter_test_setup_empty_unfiltered,
2023 unfiltered_vroot_show_single_child,
2024 filter_test_teardown);
2025 g_test_add ("/FilterModel/unfiltered/show-single-multi-level/vroot",
2026 FilterTest, gtk_tree_path_new_from_indices (2, -1),
2027 filter_test_setup_empty_unfiltered,
2028 unfiltered_vroot_show_single_multi_level,
2029 filter_test_teardown);
2032 g_test_add_func ("/FilterModel/specific/path-dependent-filter",
2033 specific_path_dependent_filter);
2034 g_test_add_func ("/FilterModel/specific/append-after-collapse",
2035 specific_append_after_collapse);
2036 g_test_add_func ("/FilterModel/specific/sort-filter-remove-node",
2037 specific_sort_filter_remove_node);
2038 g_test_add_func ("/FilterModel/specific/sort-filter-remove-root",
2039 specific_sort_filter_remove_root);
2040 g_test_add_func ("/FilterModel/specific/root-mixed-visibility",
2041 specific_root_mixed_visibility);
2042 g_test_add_func ("/FilterModel/specific/has-child-filter",
2043 specific_has_child_filter);
2044 g_test_add_func ("/FilterModel/specific/root-has-child-filter",
2045 specific_root_has_child_filter);
2046 g_test_add_func ("/FilterModel/specific/filter-add-child",
2047 specific_filter_add_child);
2049 g_test_add_func ("/FilterModel/specific/bug-300089",
2050 specific_bug_300089);
2051 g_test_add_func ("/FilterModel/specific/bug-301558",
2052 specific_bug_301558);
2053 g_test_add_func ("/FilterModel/specific/bug-311955",
2054 specific_bug_311955);
2055 g_test_add_func ("/FilterModel/specific/bug-346800",
2056 specific_bug_346800);
2057 g_test_add_func ("/FilterModel/specific/bug-364946",
2058 specific_bug_364946);
2059 g_test_add_func ("/FilterModel/specific/bug-464173",
2060 specific_bug_464173);
2061 g_test_add_func ("/FilterModel/specific/bug-540201",
2062 specific_bug_540201);
2063 g_test_add_func ("/FilterModel/specific/bug-549287",
2064 specific_bug_549287);
2066 return g_test_run ();