 a4f45483b1
			
		
	
	a4f45483b1
	
	
	
		
			
			Since GLib 2.73.0 it can only be called once per process. Based on commit 78c153ae in GTK 4, but combining the icontheme test's two custom log writers into one log writer that serves both purposes, to avoid the need for a subprocess. Co-authored-by: Matthias Clasen <mclasen@redhat.com> Resolves: https://gitlab.gnome.org/GNOME/gtk/-/issues/5119
		
			
				
	
	
		
			1202 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1202 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Extensive GtkTreeStore tests.
 | |
|  * Copyright (C) 2007  Imendio AB
 | |
|  * Authors: Kristian Rietveld  <kris@imendio.com>
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| /* To do:
 | |
|  *  - All the to do items from liststore.c, plus:
 | |
|  *  - Finish up the insertion tests; things aren't as nicely refactored
 | |
|  *    here as in GtkListStore, so we need to check for corner cases on
 | |
|  *    all insertion functions separately.
 | |
|  *  - We only test in the root level, we also need all tests "duplicated"
 | |
|  *    for child levels.
 | |
|  *  - And we also need tests for creating these child levels, etc.
 | |
|  */
 | |
| 
 | |
| #include "treemodel.h"
 | |
| 
 | |
| #include <gtk/gtk.h>
 | |
| 
 | |
| static inline gboolean
 | |
| iters_equal (GtkTreeIter *a,
 | |
| 	     GtkTreeIter *b)
 | |
| {
 | |
|   if (a->stamp != b->stamp)
 | |
|     return FALSE;
 | |
| 
 | |
|   if (a->user_data != b->user_data)
 | |
|     return FALSE;
 | |
| 
 | |
|   /* user_data2 and user_data3 are not used in GtkTreeStore */
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| static gboolean
 | |
| iter_position (GtkTreeStore *store,
 | |
| 	       GtkTreeIter  *iter,
 | |
| 	       int           n)
 | |
| {
 | |
|   gboolean ret = TRUE;
 | |
|   GtkTreePath *path;
 | |
| 
 | |
|   path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
 | |
|   if (!path)
 | |
|     return FALSE;
 | |
| 
 | |
|   if (gtk_tree_path_get_indices (path)[0] != n)
 | |
|     ret = FALSE;
 | |
| 
 | |
|   gtk_tree_path_free (path);
 | |
| 
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Fixture
 | |
|  */
 | |
| typedef struct
 | |
| {
 | |
|   GtkTreeIter iter[5];
 | |
|   GtkTreeStore *store;
 | |
| } TreeStore;
 | |
| 
 | |
| static void
 | |
| tree_store_setup (TreeStore     *fixture,
 | |
| 		  gconstpointer  test_data)
 | |
| {
 | |
|   int i;
 | |
| 
 | |
|   fixture->store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   for (i = 0; i < 5; i++)
 | |
|     {
 | |
|       gtk_tree_store_insert (fixture->store, &fixture->iter[i], NULL, i);
 | |
|       gtk_tree_store_set (fixture->store, &fixture->iter[i], 0, i, -1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_teardown (TreeStore     *fixture,
 | |
| 		     gconstpointer  test_data)
 | |
| {
 | |
|   g_object_unref (fixture->store);
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * The actual tests.
 | |
|  */
 | |
| 
 | |
| static void
 | |
| check_model (TreeStore *fixture,
 | |
| 	     gint      *new_order,
 | |
| 	     gint       skip)
 | |
| {
 | |
|   int i;
 | |
|   GtkTreePath *path;
 | |
| 
 | |
|   path = gtk_tree_path_new ();
 | |
|   gtk_tree_path_down (path);
 | |
| 
 | |
|   /* Check validity of the model and validity of the iters-persistent
 | |
|    * claim.
 | |
|    */
 | |
|   for (i = 0; i < 5; i++)
 | |
|     {
 | |
|       GtkTreeIter iter;
 | |
| 
 | |
|       if (i == skip)
 | |
| 	continue;
 | |
| 
 | |
|       /* The saved iterator at new_order[i] should match the iterator
 | |
|        * at i.
 | |
|        */
 | |
| 
 | |
|       gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
 | |
| 			       &iter, path);
 | |
| 
 | |
|       g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter));
 | |
|       g_assert (iters_equal (&iter, &fixture->iter[new_order[i]]));
 | |
| 
 | |
|       gtk_tree_path_next (path);
 | |
|     }
 | |
| 
 | |
|   gtk_tree_path_free (path);
 | |
| }
 | |
| 
 | |
| /* insertion */
 | |
| static void
 | |
| tree_store_test_insert_high_values (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_insert (store, &iter, NULL, 1234);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   gtk_tree_store_insert (store, &iter2, NULL, 765);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 1));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_append (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter2, NULL);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 1));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_prepend (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_prepend (store, &iter, NULL);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   gtk_tree_store_prepend (store, &iter2, NULL);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 1));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_insert_after (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2, iter3;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
|   gtk_tree_store_append (store, &iter2, NULL);
 | |
| 
 | |
|   gtk_tree_store_insert_after (store, &iter3, NULL, &iter);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter3));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter3, 1));
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter_copy, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter_copy, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter_copy, 2));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 2));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter3, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_insert_after_NULL (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
| 
 | |
|   /* move_after NULL is basically a prepend */
 | |
|   gtk_tree_store_insert_after (store, &iter2, NULL, NULL);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 1));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_insert_before (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2, iter3;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
|   gtk_tree_store_append (store, &iter2, NULL);
 | |
| 
 | |
|   gtk_tree_store_insert_before (store, &iter3, NULL, &iter2);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter3));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter3, 1));
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter_copy, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter_copy, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter_copy, 2));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 2));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter3, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter3, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_insert_before_NULL (void)
 | |
| {
 | |
|   GtkTreeIter iter, iter2;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
| 
 | |
|   /* move_before NULL is basically an append */
 | |
|   gtk_tree_store_insert_before (store, &iter2, NULL, NULL);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
 | |
| 
 | |
|   /* Walk over the model */
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 1));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
 | |
|   g_assert (iters_equal (&iter2, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter2, 1));
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (iter_position (store, &iter, 0));
 | |
| 
 | |
|   g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| /* setting values */
 | |
| static void
 | |
| tree_store_set_gvalue_to_transform (void)
 | |
| {
 | |
|   GtkTreeStore *store;
 | |
|   GtkTreeIter iter;
 | |
|   GValue value = G_VALUE_INIT;
 | |
| 
 | |
|   /* https://bugzilla.gnome.org/show_bug.cgi?id=677649 */
 | |
|   store = gtk_tree_store_new (1, G_TYPE_LONG);
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
| 
 | |
|   g_value_init (&value, G_TYPE_INT);
 | |
|   g_value_set_int (&value, 42);
 | |
|   gtk_tree_store_set_value (store, &iter, 0, &value);
 | |
| }
 | |
| 
 | |
| /* removal */
 | |
| static void
 | |
| tree_store_test_remove_begin (TreeStore     *fixture,
 | |
| 			      gconstpointer  user_data)
 | |
| {
 | |
|   int new_order[5] = { -1, 1, 2, 3, 4 };
 | |
|   GtkTreePath *path;
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   /* Remove node at 0 */
 | |
|   path = gtk_tree_path_new_from_indices (0, -1);
 | |
|   gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
 | |
|   gtk_tree_path_free (path);
 | |
| 
 | |
|   g_assert (gtk_tree_store_remove (fixture->store, &iter) == TRUE);
 | |
|   g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[0]));
 | |
|   g_assert (iters_equal (&iter, &fixture->iter[1]));
 | |
| 
 | |
|   check_model (fixture, new_order, 0);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_remove_middle (TreeStore     *fixture,
 | |
| 			       gconstpointer  user_data)
 | |
| {
 | |
|   int new_order[5] = { 0, 1, -1, 3, 4 };
 | |
|   GtkTreePath *path;
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   /* Remove node at 2 */
 | |
|   path = gtk_tree_path_new_from_indices (2, -1);
 | |
|   gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
 | |
|   gtk_tree_path_free (path);
 | |
| 
 | |
|   g_assert (gtk_tree_store_remove (fixture->store, &iter) == TRUE);
 | |
|   g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[2]));
 | |
|   g_assert (iters_equal (&iter, &fixture->iter[3]));
 | |
| 
 | |
|   check_model (fixture, new_order, 2);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_remove_end (TreeStore     *fixture,
 | |
| 			    gconstpointer  user_data)
 | |
| {
 | |
|   int new_order[5] = { 0, 1, 2, 3, -1 };
 | |
|   GtkTreePath *path;
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   /* Remove node at 4 */
 | |
|   path = gtk_tree_path_new_from_indices (4, -1);
 | |
|   gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
 | |
|   gtk_tree_path_free (path);
 | |
| 
 | |
|   g_assert (gtk_tree_store_remove (fixture->store, &iter) == FALSE);
 | |
|   g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[4]));
 | |
| 
 | |
|   check_model (fixture, new_order, 4);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_clear (TreeStore     *fixture,
 | |
| 		       gconstpointer  user_data)
 | |
| {
 | |
|   int i;
 | |
| 
 | |
|   gtk_tree_store_clear (fixture->store);
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (fixture->store), NULL) == 0);
 | |
| 
 | |
|   for (i = 0; i < 5; i++)
 | |
|     g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[i]));
 | |
| }
 | |
| 
 | |
| /* reorder */
 | |
| 
 | |
| static void
 | |
| tree_store_test_reorder (TreeStore     *fixture,
 | |
| 			 gconstpointer  user_data)
 | |
| {
 | |
|   int new_order[5] = { 4, 1, 0, 2, 3 };
 | |
| 
 | |
|   gtk_tree_store_reorder (fixture->store, NULL, new_order);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| /* swapping */
 | |
| 
 | |
| static void
 | |
| tree_store_test_swap_begin (TreeStore     *fixture,
 | |
| 		            gconstpointer  user_data)
 | |
| {
 | |
|   /* We swap nodes 0 and 1 at the beginning */
 | |
|   int new_order[5] = { 1, 0, 2, 3, 4 };
 | |
| 
 | |
|   GtkTreeIter iter_a;
 | |
|   GtkTreeIter iter_b;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "0"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "1"));
 | |
| 
 | |
|   gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_swap_middle_next (TreeStore     *fixture,
 | |
| 		                  gconstpointer  user_data)
 | |
| {
 | |
|   /* We swap nodes 2 and 3 in the middle that are next to each other */
 | |
|   int new_order[5] = { 0, 1, 3, 2, 4 };
 | |
| 
 | |
|   GtkTreeIter iter_a;
 | |
|   GtkTreeIter iter_b;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "2"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
 | |
| 
 | |
|   gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_swap_middle_apart (TreeStore     *fixture,
 | |
| 		                   gconstpointer  user_data)
 | |
| {
 | |
|   /* We swap nodes 1 and 3 in the middle that are apart from each other */
 | |
|   int new_order[5] = { 0, 3, 2, 1, 4 };
 | |
| 
 | |
|   GtkTreeIter iter_a;
 | |
|   GtkTreeIter iter_b;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "1"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
 | |
| 
 | |
|   gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_swap_end (TreeStore     *fixture,
 | |
| 		          gconstpointer  user_data)
 | |
| {
 | |
|   /* We swap nodes 3 and 4 at the end */
 | |
|   int new_order[5] = { 0, 1, 2, 4, 3 };
 | |
| 
 | |
|   GtkTreeIter iter_a;
 | |
|   GtkTreeIter iter_b;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "3"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "4"));
 | |
| 
 | |
|   gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_swap_single (void)
 | |
| {
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   /* Check if swap on a store with a single node does not corrupt
 | |
|    * the store.
 | |
|    */
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
|   iter_copy = iter;
 | |
| 
 | |
|   gtk_tree_store_swap (store, &iter, &iter);
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| /* move after */
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_from_start (TreeStore     *fixture,
 | |
| 				       gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 0 after 2 */
 | |
|   int new_order[5] = { 1, 2, 0, 3, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_next (TreeStore     *fixture,
 | |
| 			         gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 2 after 3 */
 | |
|   int new_order[5] = { 0, 1, 3, 2, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_apart (TreeStore     *fixture,
 | |
| 			          gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 1 after 3 */
 | |
|   int new_order[5] = { 0, 2, 3, 1, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_end (TreeStore     *fixture,
 | |
| 			        gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 2 after 4 */
 | |
|   int new_order[5] = { 0, 1, 3, 4, 2 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_from_end (TreeStore     *fixture,
 | |
| 			             gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 4 after 1 */
 | |
|   int new_order[5] = { 0, 1, 4, 2, 3 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "1"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_change_ends (TreeStore     *fixture,
 | |
| 			                gconstpointer  user_data)
 | |
| {
 | |
|   /* We move 0 after 4, this will cause both the head and tail ends to
 | |
|    * change.
 | |
|    */
 | |
|   int new_order[5] = { 1, 2, 3, 4, 0 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_NULL (TreeStore     *fixture,
 | |
| 			         gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 2, NULL should prepend */
 | |
|   int new_order[5] = { 2, 0, 1, 3, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
 | |
| 
 | |
|   gtk_tree_store_move_after (fixture->store, &iter, NULL);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_after_single (void)
 | |
| {
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   /* Check if move-after on a store with a single node does not corrupt
 | |
|    * the store.
 | |
|    */
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
|   iter_copy = iter;
 | |
| 
 | |
|   gtk_tree_store_move_after (store, &iter, NULL);
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
| 
 | |
|   gtk_tree_store_move_after (store, &iter, &iter);
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| /* move before */
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_next (TreeStore     *fixture,
 | |
| 		                  gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 3 before 2 */
 | |
|   int new_order[5] = { 0, 1, 3, 2, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "3"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
 | |
| 
 | |
|   gtk_tree_store_move_before (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_apart (TreeStore     *fixture,
 | |
| 				   gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 1 before 3 */
 | |
|   int new_order[5] = { 0, 2, 1, 3, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
 | |
| 
 | |
|   gtk_tree_store_move_before (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_to_start (TreeStore     *fixture,
 | |
| 				      gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 2 before 0 */
 | |
|   int new_order[5] = { 2, 0, 1, 3, 4 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
 | |
| 
 | |
|   gtk_tree_store_move_before (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_from_end (TreeStore     *fixture,
 | |
| 			              gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 4 before 2 (replace end) */
 | |
|   int new_order[5] = { 0, 1, 4, 2, 3 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
 | |
| 
 | |
|   gtk_tree_store_move_before (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_change_ends (TreeStore     *fixture,
 | |
| 				         gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 4 before 0 */
 | |
|   int new_order[5] = { 4, 0, 1, 2, 3 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter position;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
 | |
| 
 | |
|   gtk_tree_store_move_before (fixture->store, &iter, &position);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_NULL (TreeStore     *fixture,
 | |
| 			          gconstpointer  user_data)
 | |
| {
 | |
|   /* We move node 2, NULL should append */
 | |
|   int new_order[5] = { 0, 1, 3, 4, 2 };
 | |
| 
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
 | |
| 
 | |
|   gtk_tree_store_move_before (fixture->store, &iter, NULL);
 | |
|   check_model (fixture, new_order, -1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_move_before_single (void)
 | |
| {
 | |
|   GtkTreeIter iter;
 | |
|   GtkTreeIter iter_copy;
 | |
|   GtkTreeStore *store;
 | |
| 
 | |
|   store = gtk_tree_store_new (1, G_TYPE_INT);
 | |
| 
 | |
|   /* Check if move-after on a store with a single node does not corrupt
 | |
|    * the store.
 | |
|    */
 | |
| 
 | |
|   gtk_tree_store_append (store, &iter, NULL);
 | |
|   iter_copy = iter;
 | |
| 
 | |
|   gtk_tree_store_move_before (store, &iter, NULL);
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
| 
 | |
|   gtk_tree_store_move_before (store, &iter, &iter);
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
|   g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
 | |
|   g_assert (iters_equal (&iter, &iter_copy));
 | |
| 
 | |
|   g_object_unref (store);
 | |
| }
 | |
| 
 | |
| 
 | |
| /* iter invalidation */
 | |
| 
 | |
| static void
 | |
| tree_store_test_iter_previous_invalid (TreeStore     *fixture,
 | |
|                                        gconstpointer  user_data)
 | |
| {
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (fixture->store),
 | |
|                                           &iter) == FALSE);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
 | |
|   g_assert (iter.stamp == 0);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_iter_next_invalid (TreeStore     *fixture,
 | |
|                                    gconstpointer  user_data)
 | |
| {
 | |
|   GtkTreePath *path;
 | |
|   GtkTreeIter iter;
 | |
| 
 | |
|   path = gtk_tree_path_new_from_indices (4, -1);
 | |
|   gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
 | |
|   gtk_tree_path_free (path);
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store),
 | |
|                                       &iter) == FALSE);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
 | |
|   g_assert (iter.stamp == 0);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_iter_children_invalid (TreeStore     *fixture,
 | |
|                                        gconstpointer  user_data)
 | |
| {
 | |
|   GtkTreeIter iter, child;
 | |
| 
 | |
|   gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == TRUE);
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_children (GTK_TREE_MODEL (fixture->store),
 | |
|                                           &child, &iter) == FALSE);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &child) == FALSE);
 | |
|   g_assert (child.stamp == 0);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_iter_nth_child_invalid (TreeStore     *fixture,
 | |
|                                         gconstpointer  user_data)
 | |
| {
 | |
|   GtkTreeIter iter, child;
 | |
| 
 | |
|   gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == TRUE);
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (fixture->store),
 | |
|                                            &child, &iter, 0) == FALSE);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &child) == FALSE);
 | |
|   g_assert (child.stamp == 0);
 | |
| }
 | |
| 
 | |
| static void
 | |
| tree_store_test_iter_parent_invalid (TreeStore     *fixture,
 | |
|                                      gconstpointer  user_data)
 | |
| {
 | |
|   GtkTreeIter iter, child;
 | |
| 
 | |
|   gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &child);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &child) == TRUE);
 | |
| 
 | |
|   g_assert (gtk_tree_model_iter_parent (GTK_TREE_MODEL (fixture->store),
 | |
|                                         &iter, &child) == FALSE);
 | |
|   g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
 | |
|   g_assert (iter.stamp == 0);
 | |
| }
 | |
| 
 | |
| /* specific bugs */
 | |
| static void
 | |
| specific_bug_77977 (void)
 | |
| {
 | |
|   GtkTreeStore *tree_store;
 | |
|   GtkTreeIter iter1, iter2, iter3;
 | |
|   GtkTreePath *path;
 | |
|   GtkTreeRowReference *row_ref;
 | |
| 
 | |
|   /* Stripped down version of test case for bug 77977 by Damon Chaplin */
 | |
| 
 | |
|   g_test_bug ("77977");
 | |
| 
 | |
|   tree_store = gtk_tree_store_new (1, G_TYPE_STRING);
 | |
| 
 | |
|   gtk_tree_store_append (tree_store, &iter1, NULL);
 | |
|   gtk_tree_store_set (tree_store, &iter1, 0, "Window1", -1);
 | |
| 
 | |
|   gtk_tree_store_append (tree_store, &iter2, &iter1);
 | |
|   gtk_tree_store_set (tree_store, &iter2, 0, "Table1", -1);
 | |
| 
 | |
|   gtk_tree_store_append (tree_store, &iter3, &iter2);
 | |
|   gtk_tree_store_set (tree_store, &iter3, 0, "Button1", -1);
 | |
| 
 | |
|   path = gtk_tree_path_new_from_indices (0, 0, 0, -1);
 | |
|   row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (tree_store), path);
 | |
|   gtk_tree_path_free (path);
 | |
| 
 | |
|   gtk_tree_store_remove (tree_store, &iter1);
 | |
| 
 | |
|   gtk_tree_row_reference_free (row_ref);
 | |
|   g_object_unref (tree_store);
 | |
| }
 | |
| 
 | |
| static void
 | |
| specific_bug_698396 (void)
 | |
| {
 | |
|   g_test_bug ("698396");
 | |
| 
 | |
|   if (g_test_subprocess ())
 | |
|     {
 | |
|       GtkTreeStore *tree_store;
 | |
|       int new_order[1] = { 0 };
 | |
| 
 | |
|       tree_store = gtk_tree_store_new (1, G_TYPE_STRING);
 | |
|       gtk_tree_store_reorder (tree_store, NULL, new_order);
 | |
|       g_object_unref (tree_store);
 | |
| 
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|   g_test_trap_subprocess (NULL, 0, 0);
 | |
|   g_test_trap_assert_stderr ("*Cannot reorder, parent has no children*");
 | |
|   g_test_trap_assert_failed ();
 | |
| }
 | |
| 
 | |
| /* main */
 | |
| 
 | |
| void
 | |
| register_tree_store_tests (void)
 | |
| {
 | |
|   /* insertion */
 | |
|   g_test_add_func ("/TreeStore/insert-high-values",
 | |
| 	           tree_store_test_insert_high_values);
 | |
|   g_test_add_func ("/TreeStore/append",
 | |
| 		   tree_store_test_append);
 | |
|   g_test_add_func ("/TreeStore/prepend",
 | |
| 		   tree_store_test_prepend);
 | |
|   g_test_add_func ("/TreeStore/insert-after",
 | |
| 		   tree_store_test_insert_after);
 | |
|   g_test_add_func ("/TreeStore/insert-after-NULL",
 | |
| 		   tree_store_test_insert_after_NULL);
 | |
|   g_test_add_func ("/TreeStore/insert-before",
 | |
| 		   tree_store_test_insert_before);
 | |
|   g_test_add_func ("/TreeStore/insert-before-NULL",
 | |
| 		   tree_store_test_insert_before_NULL);
 | |
| 
 | |
|   /* setting values (FIXME) */
 | |
|   g_test_add_func ("/TreeStore/set-gvalue-to-transform",
 | |
|                    tree_store_set_gvalue_to_transform);
 | |
| 
 | |
|   /* removal */
 | |
|   g_test_add ("/TreeStore/remove-begin", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_remove_begin,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/remove-middle", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_remove_middle,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/remove-end", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_remove_end,
 | |
| 	      tree_store_teardown);
 | |
| 
 | |
|   g_test_add ("/TreeStore/clear", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_clear,
 | |
| 	      tree_store_teardown);
 | |
| 
 | |
|   /* reordering */
 | |
|   g_test_add ("/TreeStore/reorder", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_reorder,
 | |
| 	      tree_store_teardown);
 | |
| 
 | |
|   /* swapping */
 | |
|   g_test_add ("/TreeStore/swap-begin", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_swap_begin,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/swap-middle-next", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_swap_middle_next,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/swap-middle-apart", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_swap_middle_apart,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/swap-end", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_swap_end,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add_func ("/TreeStore/swap-single",
 | |
| 		   tree_store_test_swap_single);
 | |
| 
 | |
|   /* moving */
 | |
|   g_test_add ("/TreeStore/move-after-from-start", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_from_start,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-after-next", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_next,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-after-apart", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_apart,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-after-end", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_end,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-after-from-end", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_from_end,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-after-change-ends", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_change_ends,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-after-NULL", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_after_NULL,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add_func ("/TreeStore/move-after-single",
 | |
| 		   tree_store_test_move_after_single);
 | |
| 
 | |
|   g_test_add ("/TreeStore/move-before-next", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_before_next,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-before-apart", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_before_apart,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-before-to-start", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_before_to_start,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-before-from-end", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_before_from_end,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-before-change-ends", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_before_change_ends,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/move-before-NULL", TreeStore, NULL,
 | |
| 	      tree_store_setup, tree_store_test_move_before_NULL,
 | |
| 	      tree_store_teardown);
 | |
|   g_test_add_func ("/TreeStore/move-before-single",
 | |
| 		   tree_store_test_move_before_single);
 | |
| 
 | |
|   /* iter invalidation */
 | |
|   g_test_add ("/TreeStore/iter-prev-invalid", TreeStore, NULL,
 | |
|               tree_store_setup, tree_store_test_iter_previous_invalid,
 | |
|               tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/iter-next-invalid", TreeStore, NULL,
 | |
|               tree_store_setup, tree_store_test_iter_next_invalid,
 | |
|               tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/iter-children-invalid", TreeStore, NULL,
 | |
|               tree_store_setup, tree_store_test_iter_children_invalid,
 | |
|               tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/iter-nth-child-invalid", TreeStore, NULL,
 | |
|               tree_store_setup, tree_store_test_iter_nth_child_invalid,
 | |
|               tree_store_teardown);
 | |
|   g_test_add ("/TreeStore/iter-parent-invalid", TreeStore, NULL,
 | |
|               tree_store_setup, tree_store_test_iter_parent_invalid,
 | |
|               tree_store_teardown);
 | |
| 
 | |
|   /* specific bugs */
 | |
|   g_test_add_func ("/TreeStore/bug-77977", specific_bug_77977);
 | |
|   g_test_add_func ("/TreeStore/bug-698396", specific_bug_698396);
 | |
| }
 |