From e8323e2abc97156e3c416126686158b393083970 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Mon, 3 Oct 2011 22:37:49 +0200 Subject: [PATCH] Add two more unit tests for bug 659022 Both pointing out problems in gtk_tree_model_filter_row_deleted(). --- gtk/tests/filtermodel.c | 105 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/gtk/tests/filtermodel.c b/gtk/tests/filtermodel.c index e77f6cdaca..e874c6e1d7 100644 --- a/gtk/tests/filtermodel.c +++ b/gtk/tests/filtermodel.c @@ -6661,6 +6661,107 @@ specific_bug_659022_row_changed_emission (void) g_object_unref (model); } +static void +specific_bug_659022_row_deleted_node_invisible (void) +{ + GtkTreeModel *filter; + GtkTreeModel *model; + GtkTreeModelRefCount *ref_model; + GtkTreeIter parent, child; + GtkTreeIter parent2, child2, child3; + GtkWidget *tree_view; + + model = gtk_tree_model_ref_count_new (); + ref_model = GTK_TREE_MODEL_REF_COUNT (model); + + filter = gtk_tree_model_filter_new (model, NULL); + gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter), + specific_bug_659022_visible_func, + NULL, NULL); + + tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (filter)); + + gtk_tree_store_insert (GTK_TREE_STORE (model), &parent, NULL, 0); + gtk_tree_store_insert (GTK_TREE_STORE (model), &child, &parent, 0); + + gtk_tree_store_insert (GTK_TREE_STORE (model), &parent2, NULL, 0); + gtk_tree_store_insert (GTK_TREE_STORE (model), &child2, &parent2, 0); + gtk_tree_store_insert (GTK_TREE_STORE (model), &child3, &parent2, 0); + + gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view)); + + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter)); + + gtk_tree_store_remove (GTK_TREE_STORE (model), &parent); + + gtk_widget_destroy (tree_view); + g_object_unref (filter); + g_object_unref (model); +} + +static void +specific_bug_659022_row_deleted_free_level (void) +{ + GtkTreeModel *filter; + GtkTreeModel *model; + GtkTreeModelRefCount *ref_model; + GtkTreeIter parent, child; + GtkTreeIter parent2, child2, child3; + GtkWidget *tree_view; + + model = gtk_tree_model_ref_count_new (); + ref_model = GTK_TREE_MODEL_REF_COUNT (model); + + filter = gtk_tree_model_filter_new (model, NULL); + gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter), + specific_bug_659022_visible_func, + NULL, NULL); + + tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (filter)); + + /* Carefully construct a model */ + gtk_tree_store_insert (GTK_TREE_STORE (model), &parent, NULL, 0); + gtk_tree_store_insert (GTK_TREE_STORE (model), &child, &parent, 0); + + gtk_tree_store_insert (GTK_TREE_STORE (model), &parent2, NULL, 0); + gtk_tree_store_insert (GTK_TREE_STORE (model), &child2, &parent2, 0); + gtk_tree_store_insert (GTK_TREE_STORE (model), &child3, &parent2, 0); + + /* Only parent2 is visible, child3 holds first ref count for that level + * (Note that above, both child2 as child3 are inserted at position 0). + */ + assert_node_ref_count (ref_model, &parent, 0); + assert_node_ref_count (ref_model, &child, 0); + assert_node_ref_count (ref_model, &parent2, 3); + assert_node_ref_count (ref_model, &child3, 1); + assert_node_ref_count (ref_model, &child2, 0); + + /* Make sure child level is cached */ + gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view)); + + assert_node_ref_count (ref_model, &parent, 0); + assert_node_ref_count (ref_model, &child, 0); + assert_node_ref_count (ref_model, &parent2, 3); + assert_node_ref_count (ref_model, &child3, 2); + assert_node_ref_count (ref_model, &child2, 1); + + gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view)); + + assert_node_ref_count (ref_model, &parent, 0); + assert_node_ref_count (ref_model, &child, 0); + assert_node_ref_count (ref_model, &parent2, 3); + assert_node_ref_count (ref_model, &child3, 1); + assert_node_ref_count (ref_model, &child2, 0); + + /* Remove node with longer child level first */ + gtk_tree_store_remove (GTK_TREE_STORE (model), &parent2); + gtk_tree_store_remove (GTK_TREE_STORE (model), &parent); + + gtk_widget_destroy (tree_view); + g_object_unref (filter); + g_object_unref (model); +} + /* main */ void @@ -7016,4 +7117,8 @@ register_filter_model_tests (void) specific_bug_658696); g_test_add_func ("/TreeModelFilter/specific/bug-659022/row-changed-emission", specific_bug_659022_row_changed_emission); + g_test_add_func ("/TreeModelFilter/specific/bug-659022/row-deleted-node-invisible", + specific_bug_659022_row_deleted_node_invisible); + g_test_add_func ("/TreeModelFilter/specific/bug-659022/row-deleted-free-level", + specific_bug_659022_row_deleted_free_level); }