Add two more unit tests for bug 659022
Both pointing out problems in gtk_tree_model_filter_row_deleted().
This commit is contained in:
		| @ -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); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Kristian Rietveld
					Kristian Rietveld