1 /* Extensive GtkTreeStore tests.
2 * Copyright (C) 2007 Imendio AB
3 * Authors: Kristian Rietveld <kris@imendio.com>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * - All the to do items from liststore.c, plus:
23 * - Finish up the insertion tests; things aren't as nicely refactored
24 * here as in GtkListStore, so we need to check for corner cases on
25 * all insertion functions separately.
26 * - We only test in the root level, we also need all tests "duplicated"
28 * - And we also need tests for creating these child levels, etc.
33 static inline gboolean
34 iters_equal (GtkTreeIter *a,
37 if (a->stamp != b->stamp)
40 if (a->user_data != b->user_data)
43 /* user_data2 and user_data3 are not used in GtkTreeStore */
49 iter_position (GtkTreeStore *store,
56 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
60 if (gtk_tree_path_get_indices (path)[0] != n)
63 gtk_tree_path_free (path);
78 tree_store_setup (TreeStore *fixture,
79 gconstpointer test_data)
83 fixture->store = gtk_tree_store_new (1, G_TYPE_INT);
85 for (i = 0; i < 5; i++)
87 gtk_tree_store_insert (fixture->store, &fixture->iter[i], NULL, i);
88 gtk_tree_store_set (fixture->store, &fixture->iter[i], 0, i, -1);
93 tree_store_teardown (TreeStore *fixture,
94 gconstpointer test_data)
96 g_object_unref (fixture->store);
104 check_model (TreeStore *fixture,
111 path = gtk_tree_path_new ();
112 gtk_tree_path_down (path);
114 /* Check validity of the model and validity of the iters-persistent
117 for (i = 0; i < 5; i++)
124 /* The saved iterator at new_order[i] should match the iterator
128 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
131 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter));
132 g_assert (iters_equal (&iter, &fixture->iter[new_order[i]]));
134 gtk_tree_path_next (path);
137 gtk_tree_path_free (path);
142 tree_store_test_insert_high_values (void)
144 GtkTreeIter iter, iter2;
145 GtkTreeIter iter_copy;
148 store = gtk_tree_store_new (1, G_TYPE_INT);
150 gtk_tree_store_insert (store, &iter, NULL, 1234);
151 g_assert (gtk_tree_store_iter_is_valid (store, &iter));
152 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
153 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
154 g_assert (iters_equal (&iter, &iter_copy));
155 g_assert (iter_position (store, &iter, 0));
157 gtk_tree_store_insert (store, &iter2, NULL, 765);
158 g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
159 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
161 /* Walk over the model */
162 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
163 g_assert (iters_equal (&iter, &iter_copy));
164 g_assert (iter_position (store, &iter, 0));
166 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
167 g_assert (iters_equal (&iter2, &iter_copy));
168 g_assert (iter_position (store, &iter2, 1));
170 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
172 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
173 g_assert (iters_equal (&iter2, &iter_copy));
174 g_assert (iter_position (store, &iter2, 1));
176 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
177 g_assert (iters_equal (&iter, &iter_copy));
178 g_assert (iter_position (store, &iter, 0));
180 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
182 g_object_unref (store);
186 tree_store_test_append (void)
188 GtkTreeIter iter, iter2;
189 GtkTreeIter iter_copy;
192 store = gtk_tree_store_new (1, G_TYPE_INT);
194 gtk_tree_store_append (store, &iter, NULL);
195 g_assert (gtk_tree_store_iter_is_valid (store, &iter));
196 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
197 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
198 g_assert (iters_equal (&iter, &iter_copy));
199 g_assert (iter_position (store, &iter, 0));
201 gtk_tree_store_append (store, &iter2, NULL);
202 g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
203 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
205 /* Walk over the model */
206 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
207 g_assert (iters_equal (&iter, &iter_copy));
208 g_assert (iter_position (store, &iter, 0));
210 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
211 g_assert (iters_equal (&iter2, &iter_copy));
212 g_assert (iter_position (store, &iter2, 1));
214 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
216 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
217 g_assert (iters_equal (&iter2, &iter_copy));
218 g_assert (iter_position (store, &iter2, 1));
220 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
221 g_assert (iters_equal (&iter, &iter_copy));
222 g_assert (iter_position (store, &iter, 0));
224 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
226 g_object_unref (store);
230 tree_store_test_prepend (void)
232 GtkTreeIter iter, iter2;
233 GtkTreeIter iter_copy;
236 store = gtk_tree_store_new (1, G_TYPE_INT);
238 gtk_tree_store_prepend (store, &iter, NULL);
239 g_assert (gtk_tree_store_iter_is_valid (store, &iter));
240 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
241 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
242 g_assert (iters_equal (&iter, &iter_copy));
243 g_assert (iter_position (store, &iter, 0));
245 gtk_tree_store_prepend (store, &iter2, NULL);
246 g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
247 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
249 /* Walk over the model */
250 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
251 g_assert (iters_equal (&iter2, &iter_copy));
252 g_assert (iter_position (store, &iter2, 0));
254 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
255 g_assert (iters_equal (&iter, &iter_copy));
256 g_assert (iter_position (store, &iter, 1));
258 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
260 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
261 g_assert (iters_equal (&iter, &iter_copy));
262 g_assert (iter_position (store, &iter, 1));
264 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
265 g_assert (iters_equal (&iter2, &iter_copy));
266 g_assert (iter_position (store, &iter2, 0));
268 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
270 g_object_unref (store);
274 tree_store_test_insert_after (void)
276 GtkTreeIter iter, iter2, iter3;
277 GtkTreeIter iter_copy;
280 store = gtk_tree_store_new (1, G_TYPE_INT);
282 gtk_tree_store_append (store, &iter, NULL);
283 gtk_tree_store_append (store, &iter2, NULL);
285 gtk_tree_store_insert_after (store, &iter3, NULL, &iter);
286 g_assert (gtk_tree_store_iter_is_valid (store, &iter3));
287 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
288 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
289 g_assert (iters_equal (&iter3, &iter_copy));
290 g_assert (iter_position (store, &iter3, 1));
292 /* Walk over the model */
293 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
294 g_assert (iters_equal (&iter, &iter_copy));
295 g_assert (iter_position (store, &iter_copy, 0));
297 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
298 g_assert (iters_equal (&iter3, &iter_copy));
299 g_assert (iter_position (store, &iter_copy, 1));
301 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
302 g_assert (iters_equal (&iter2, &iter_copy));
303 g_assert (iter_position (store, &iter_copy, 2));
305 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
307 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
308 g_assert (iters_equal (&iter2, &iter_copy));
309 g_assert (iter_position (store, &iter2, 2));
311 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
312 g_assert (iters_equal (&iter3, &iter_copy));
313 g_assert (iter_position (store, &iter3, 1));
315 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
316 g_assert (iters_equal (&iter, &iter_copy));
317 g_assert (iter_position (store, &iter, 0));
319 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
321 g_object_unref (store);
325 tree_store_test_insert_after_NULL (void)
327 GtkTreeIter iter, iter2;
328 GtkTreeIter iter_copy;
331 store = gtk_tree_store_new (1, G_TYPE_INT);
333 gtk_tree_store_append (store, &iter, NULL);
335 /* move_after NULL is basically a prepend */
336 gtk_tree_store_insert_after (store, &iter2, NULL, NULL);
337 g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
338 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
340 /* Walk over the model */
341 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
342 g_assert (iters_equal (&iter2, &iter_copy));
343 g_assert (iter_position (store, &iter2, 0));
345 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
346 g_assert (iters_equal (&iter, &iter_copy));
347 g_assert (iter_position (store, &iter, 1));
349 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
351 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
352 g_assert (iters_equal (&iter2, &iter_copy));
354 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
355 g_assert (iters_equal (&iter, &iter_copy));
356 g_assert (iter_position (store, &iter, 1));
358 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
359 g_assert (iters_equal (&iter2, &iter_copy));
360 g_assert (iter_position (store, &iter2, 0));
362 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
364 g_object_unref (store);
368 tree_store_test_insert_before (void)
370 GtkTreeIter iter, iter2, iter3;
371 GtkTreeIter iter_copy;
374 store = gtk_tree_store_new (1, G_TYPE_INT);
376 gtk_tree_store_append (store, &iter, NULL);
377 gtk_tree_store_append (store, &iter2, NULL);
379 gtk_tree_store_insert_before (store, &iter3, NULL, &iter2);
380 g_assert (gtk_tree_store_iter_is_valid (store, &iter3));
381 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
382 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
383 g_assert (iters_equal (&iter3, &iter_copy));
384 g_assert (iter_position (store, &iter3, 1));
386 /* Walk over the model */
387 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
388 g_assert (iters_equal (&iter, &iter_copy));
389 g_assert (iter_position (store, &iter_copy, 0));
391 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
392 g_assert (iters_equal (&iter3, &iter_copy));
393 g_assert (iter_position (store, &iter_copy, 1));
395 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
396 g_assert (iters_equal (&iter2, &iter_copy));
397 g_assert (iter_position (store, &iter_copy, 2));
399 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
401 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
402 g_assert (iters_equal (&iter3, &iter_copy));
404 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
405 g_assert (iters_equal (&iter2, &iter_copy));
406 g_assert (iter_position (store, &iter2, 2));
408 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
409 g_assert (iters_equal (&iter3, &iter_copy));
410 g_assert (iter_position (store, &iter3, 1));
412 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
413 g_assert (iters_equal (&iter, &iter_copy));
414 g_assert (iter_position (store, &iter, 0));
416 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
418 g_object_unref (store);
422 tree_store_test_insert_before_NULL (void)
424 GtkTreeIter iter, iter2;
425 GtkTreeIter iter_copy;
428 store = gtk_tree_store_new (1, G_TYPE_INT);
430 gtk_tree_store_append (store, &iter, NULL);
432 /* move_before NULL is basically an append */
433 gtk_tree_store_insert_before (store, &iter2, NULL, NULL);
434 g_assert (gtk_tree_store_iter_is_valid (store, &iter2));
435 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
437 /* Walk over the model */
438 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
439 g_assert (iters_equal (&iter, &iter_copy));
440 g_assert (iter_position (store, &iter, 0));
442 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
443 g_assert (iters_equal (&iter2, &iter_copy));
444 g_assert (iter_position (store, &iter2, 1));
446 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
448 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
449 g_assert (iters_equal (&iter2, &iter_copy));
450 g_assert (iter_position (store, &iter2, 1));
452 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
453 g_assert (iters_equal (&iter, &iter_copy));
454 g_assert (iter_position (store, &iter, 0));
456 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
458 g_object_unref (store);
463 tree_store_test_remove_begin (TreeStore *fixture,
464 gconstpointer user_data)
466 int new_order[5] = { -1, 1, 2, 3, 4 };
470 /* Remove node at 0 */
471 path = gtk_tree_path_new_from_indices (0, -1);
472 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
473 gtk_tree_path_free (path);
475 g_assert (gtk_tree_store_remove (fixture->store, &iter) == TRUE);
476 g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[0]));
477 g_assert (iters_equal (&iter, &fixture->iter[1]));
479 check_model (fixture, new_order, 0);
483 tree_store_test_remove_middle (TreeStore *fixture,
484 gconstpointer user_data)
486 int new_order[5] = { 0, 1, -1, 3, 4 };
490 /* Remove node at 2 */
491 path = gtk_tree_path_new_from_indices (2, -1);
492 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
493 gtk_tree_path_free (path);
495 g_assert (gtk_tree_store_remove (fixture->store, &iter) == TRUE);
496 g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[2]));
497 g_assert (iters_equal (&iter, &fixture->iter[3]));
499 check_model (fixture, new_order, 2);
503 tree_store_test_remove_end (TreeStore *fixture,
504 gconstpointer user_data)
506 int new_order[5] = { 0, 1, 2, 3, -1 };
510 /* Remove node at 4 */
511 path = gtk_tree_path_new_from_indices (4, -1);
512 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
513 gtk_tree_path_free (path);
515 g_assert (gtk_tree_store_remove (fixture->store, &iter) == FALSE);
516 g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[4]));
518 check_model (fixture, new_order, 4);
522 tree_store_test_clear (TreeStore *fixture,
523 gconstpointer user_data)
527 gtk_tree_store_clear (fixture->store);
529 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (fixture->store), NULL) == 0);
531 for (i = 0; i < 5; i++)
532 g_assert (!gtk_tree_store_iter_is_valid (fixture->store, &fixture->iter[i]));
538 tree_store_test_reorder (TreeStore *fixture,
539 gconstpointer user_data)
541 int new_order[5] = { 4, 1, 0, 2, 3 };
543 gtk_tree_store_reorder (fixture->store, NULL, new_order);
544 check_model (fixture, new_order, -1);
550 tree_store_test_swap_begin (TreeStore *fixture,
551 gconstpointer user_data)
553 /* We swap nodes 0 and 1 at the beginning */
554 int new_order[5] = { 1, 0, 2, 3, 4 };
559 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "0"));
560 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "1"));
562 gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
563 check_model (fixture, new_order, -1);
567 tree_store_test_swap_middle_next (TreeStore *fixture,
568 gconstpointer user_data)
570 /* We swap nodes 2 and 3 in the middle that are next to each other */
571 int new_order[5] = { 0, 1, 3, 2, 4 };
576 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "2"));
577 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
579 gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
580 check_model (fixture, new_order, -1);
584 tree_store_test_swap_middle_apart (TreeStore *fixture,
585 gconstpointer user_data)
587 /* We swap nodes 1 and 3 in the middle that are apart from each other */
588 int new_order[5] = { 0, 3, 2, 1, 4 };
593 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "1"));
594 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
596 gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
597 check_model (fixture, new_order, -1);
601 tree_store_test_swap_end (TreeStore *fixture,
602 gconstpointer user_data)
604 /* We swap nodes 3 and 4 at the end */
605 int new_order[5] = { 0, 1, 2, 4, 3 };
610 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "3"));
611 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "4"));
613 gtk_tree_store_swap (fixture->store, &iter_a, &iter_b);
614 check_model (fixture, new_order, -1);
618 tree_store_test_swap_single (void)
621 GtkTreeIter iter_copy;
624 store = gtk_tree_store_new (1, G_TYPE_INT);
626 /* Check if swap on a store with a single node does not corrupt
630 gtk_tree_store_append (store, &iter, NULL);
633 gtk_tree_store_swap (store, &iter, &iter);
634 g_assert (iters_equal (&iter, &iter_copy));
635 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
636 g_assert (iters_equal (&iter, &iter_copy));
638 g_object_unref (store);
644 tree_store_test_move_after_from_start (TreeStore *fixture,
645 gconstpointer user_data)
647 /* We move node 0 after 2 */
648 int new_order[5] = { 1, 2, 0, 3, 4 };
651 GtkTreeIter position;
653 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
654 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
656 gtk_tree_store_move_after (fixture->store, &iter, &position);
657 check_model (fixture, new_order, -1);
661 tree_store_test_move_after_next (TreeStore *fixture,
662 gconstpointer user_data)
664 /* We move node 2 after 3 */
665 int new_order[5] = { 0, 1, 3, 2, 4 };
668 GtkTreeIter position;
670 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
671 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
673 gtk_tree_store_move_after (fixture->store, &iter, &position);
674 check_model (fixture, new_order, -1);
678 tree_store_test_move_after_apart (TreeStore *fixture,
679 gconstpointer user_data)
681 /* We move node 1 after 3 */
682 int new_order[5] = { 0, 2, 3, 1, 4 };
685 GtkTreeIter position;
687 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
688 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
690 gtk_tree_store_move_after (fixture->store, &iter, &position);
691 check_model (fixture, new_order, -1);
695 tree_store_test_move_after_end (TreeStore *fixture,
696 gconstpointer user_data)
698 /* We move node 2 after 4 */
699 int new_order[5] = { 0, 1, 3, 4, 2 };
702 GtkTreeIter position;
704 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
705 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
707 gtk_tree_store_move_after (fixture->store, &iter, &position);
708 check_model (fixture, new_order, -1);
712 tree_store_test_move_after_from_end (TreeStore *fixture,
713 gconstpointer user_data)
715 /* We move node 4 after 1 */
716 int new_order[5] = { 0, 1, 4, 2, 3 };
719 GtkTreeIter position;
721 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
722 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "1"));
724 gtk_tree_store_move_after (fixture->store, &iter, &position);
725 check_model (fixture, new_order, -1);
729 tree_store_test_move_after_change_ends (TreeStore *fixture,
730 gconstpointer user_data)
732 /* We move 0 after 4, this will cause both the head and tail ends to
735 int new_order[5] = { 1, 2, 3, 4, 0 };
738 GtkTreeIter position;
740 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
741 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
743 gtk_tree_store_move_after (fixture->store, &iter, &position);
744 check_model (fixture, new_order, -1);
748 tree_store_test_move_after_NULL (TreeStore *fixture,
749 gconstpointer user_data)
751 /* We move node 2, NULL should prepend */
752 int new_order[5] = { 2, 0, 1, 3, 4 };
756 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
758 gtk_tree_store_move_after (fixture->store, &iter, NULL);
759 check_model (fixture, new_order, -1);
763 tree_store_test_move_after_single (void)
766 GtkTreeIter iter_copy;
769 store = gtk_tree_store_new (1, G_TYPE_INT);
771 /* Check if move-after on a store with a single node does not corrupt
775 gtk_tree_store_append (store, &iter, NULL);
778 gtk_tree_store_move_after (store, &iter, NULL);
779 g_assert (iters_equal (&iter, &iter_copy));
780 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
781 g_assert (iters_equal (&iter, &iter_copy));
783 gtk_tree_store_move_after (store, &iter, &iter);
784 g_assert (iters_equal (&iter, &iter_copy));
785 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
786 g_assert (iters_equal (&iter, &iter_copy));
788 g_object_unref (store);
794 tree_store_test_move_before_next (TreeStore *fixture,
795 gconstpointer user_data)
797 /* We move node 3 before 2 */
798 int new_order[5] = { 0, 1, 3, 2, 4 };
801 GtkTreeIter position;
803 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "3"));
804 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
806 gtk_tree_store_move_before (fixture->store, &iter, &position);
807 check_model (fixture, new_order, -1);
811 tree_store_test_move_before_apart (TreeStore *fixture,
812 gconstpointer user_data)
814 /* We move node 1 before 3 */
815 int new_order[5] = { 0, 2, 1, 3, 4 };
818 GtkTreeIter position;
820 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
821 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
823 gtk_tree_store_move_before (fixture->store, &iter, &position);
824 check_model (fixture, new_order, -1);
828 tree_store_test_move_before_to_start (TreeStore *fixture,
829 gconstpointer user_data)
831 /* We move node 2 before 0 */
832 int new_order[5] = { 2, 0, 1, 3, 4 };
835 GtkTreeIter position;
837 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
838 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
840 gtk_tree_store_move_before (fixture->store, &iter, &position);
841 check_model (fixture, new_order, -1);
845 tree_store_test_move_before_from_end (TreeStore *fixture,
846 gconstpointer user_data)
848 /* We move node 4 before 2 (replace end) */
849 int new_order[5] = { 0, 1, 4, 2, 3 };
852 GtkTreeIter position;
854 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
855 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
857 gtk_tree_store_move_before (fixture->store, &iter, &position);
858 check_model (fixture, new_order, -1);
862 tree_store_test_move_before_change_ends (TreeStore *fixture,
863 gconstpointer user_data)
865 /* We move node 4 before 0 */
866 int new_order[5] = { 4, 0, 1, 2, 3 };
869 GtkTreeIter position;
871 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
872 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
874 gtk_tree_store_move_before (fixture->store, &iter, &position);
875 check_model (fixture, new_order, -1);
879 tree_store_test_move_before_NULL (TreeStore *fixture,
880 gconstpointer user_data)
882 /* We move node 2, NULL should append */
883 int new_order[5] = { 0, 1, 3, 4, 2 };
887 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
889 gtk_tree_store_move_before (fixture->store, &iter, NULL);
890 check_model (fixture, new_order, -1);
894 tree_store_test_move_before_single (void)
897 GtkTreeIter iter_copy;
900 store = gtk_tree_store_new (1, G_TYPE_INT);
902 /* Check if move-after on a store with a single node does not corrupt
906 gtk_tree_store_append (store, &iter, NULL);
909 gtk_tree_store_move_before (store, &iter, NULL);
910 g_assert (iters_equal (&iter, &iter_copy));
911 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
912 g_assert (iters_equal (&iter, &iter_copy));
914 gtk_tree_store_move_before (store, &iter, &iter);
915 g_assert (iters_equal (&iter, &iter_copy));
916 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
917 g_assert (iters_equal (&iter, &iter_copy));
919 g_object_unref (store);
923 /* iter invalidation */
926 tree_store_test_iter_previous_invalid (TreeStore *fixture,
927 gconstpointer user_data)
931 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
933 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (fixture->store),
935 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
936 g_assert (iter.stamp == 0);
940 tree_store_test_iter_next_invalid (TreeStore *fixture,
941 gconstpointer user_data)
946 path = gtk_tree_path_new_from_indices (4, -1);
947 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
948 gtk_tree_path_free (path);
950 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store),
952 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
953 g_assert (iter.stamp == 0);
957 tree_store_test_iter_children_invalid (TreeStore *fixture,
958 gconstpointer user_data)
960 GtkTreeIter iter, child;
962 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
963 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == TRUE);
965 g_assert (gtk_tree_model_iter_children (GTK_TREE_MODEL (fixture->store),
966 &child, &iter) == FALSE);
967 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &child) == FALSE);
968 g_assert (child.stamp == 0);
972 tree_store_test_iter_nth_child_invalid (TreeStore *fixture,
973 gconstpointer user_data)
975 GtkTreeIter iter, child;
977 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
978 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == TRUE);
980 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (fixture->store),
981 &child, &iter, 0) == FALSE);
982 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &child) == FALSE);
983 g_assert (child.stamp == 0);
987 tree_store_test_iter_parent_invalid (TreeStore *fixture,
988 gconstpointer user_data)
990 GtkTreeIter iter, child;
992 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &child);
993 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &child) == TRUE);
995 g_assert (gtk_tree_model_iter_parent (GTK_TREE_MODEL (fixture->store),
996 &iter, &child) == FALSE);
997 g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
998 g_assert (iter.stamp == 0);
1003 specific_bug_77977 (void)
1005 GtkTreeStore *tree_store;
1006 GtkTreeIter iter1, iter2, iter3;
1008 GtkTreeRowReference *row_ref;
1010 /* Stripped down version of test case for bug 77977 by Damon Chaplin */
1012 g_test_bug ("77977");
1014 tree_store = gtk_tree_store_new (1, G_TYPE_STRING);
1016 gtk_tree_store_append (tree_store, &iter1, NULL);
1017 gtk_tree_store_set (tree_store, &iter1, 0, "Window1", -1);
1019 gtk_tree_store_append (tree_store, &iter2, &iter1);
1020 gtk_tree_store_set (tree_store, &iter2, 0, "Table1", -1);
1022 gtk_tree_store_append (tree_store, &iter3, &iter2);
1023 gtk_tree_store_set (tree_store, &iter3, 0, "Button1", -1);
1025 path = gtk_tree_path_new_from_indices (0, 0, 0, -1);
1026 row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (tree_store), path);
1027 gtk_tree_path_free (path);
1029 gtk_tree_store_remove (tree_store, &iter1);
1031 gtk_tree_row_reference_free (row_ref);
1032 g_object_unref (tree_store);
1038 register_tree_store_tests (void)
1041 g_test_add_func ("/TreeStore/insert-high-values",
1042 tree_store_test_insert_high_values);
1043 g_test_add_func ("/TreeStore/append",
1044 tree_store_test_append);
1045 g_test_add_func ("/TreeStore/prepend",
1046 tree_store_test_prepend);
1047 g_test_add_func ("/TreeStore/insert-after",
1048 tree_store_test_insert_after);
1049 g_test_add_func ("/TreeStore/insert-after-NULL",
1050 tree_store_test_insert_after_NULL);
1051 g_test_add_func ("/TreeStore/insert-before",
1052 tree_store_test_insert_before);
1053 g_test_add_func ("/TreeStore/insert-before-NULL",
1054 tree_store_test_insert_before_NULL);
1056 /* setting values (FIXME) */
1059 g_test_add ("/TreeStore/remove-begin", TreeStore, NULL,
1060 tree_store_setup, tree_store_test_remove_begin,
1061 tree_store_teardown);
1062 g_test_add ("/TreeStore/remove-middle", TreeStore, NULL,
1063 tree_store_setup, tree_store_test_remove_middle,
1064 tree_store_teardown);
1065 g_test_add ("/TreeStore/remove-end", TreeStore, NULL,
1066 tree_store_setup, tree_store_test_remove_end,
1067 tree_store_teardown);
1069 g_test_add ("/TreeStore/clear", TreeStore, NULL,
1070 tree_store_setup, tree_store_test_clear,
1071 tree_store_teardown);
1074 g_test_add ("/TreeStore/reorder", TreeStore, NULL,
1075 tree_store_setup, tree_store_test_reorder,
1076 tree_store_teardown);
1079 g_test_add ("/TreeStore/swap-begin", TreeStore, NULL,
1080 tree_store_setup, tree_store_test_swap_begin,
1081 tree_store_teardown);
1082 g_test_add ("/TreeStore/swap-middle-next", TreeStore, NULL,
1083 tree_store_setup, tree_store_test_swap_middle_next,
1084 tree_store_teardown);
1085 g_test_add ("/TreeStore/swap-middle-apart", TreeStore, NULL,
1086 tree_store_setup, tree_store_test_swap_middle_apart,
1087 tree_store_teardown);
1088 g_test_add ("/TreeStore/swap-end", TreeStore, NULL,
1089 tree_store_setup, tree_store_test_swap_end,
1090 tree_store_teardown);
1091 g_test_add_func ("/TreeStore/swap-single",
1092 tree_store_test_swap_single);
1095 g_test_add ("/TreeStore/move-after-from-start", TreeStore, NULL,
1096 tree_store_setup, tree_store_test_move_after_from_start,
1097 tree_store_teardown);
1098 g_test_add ("/TreeStore/move-after-next", TreeStore, NULL,
1099 tree_store_setup, tree_store_test_move_after_next,
1100 tree_store_teardown);
1101 g_test_add ("/TreeStore/move-after-apart", TreeStore, NULL,
1102 tree_store_setup, tree_store_test_move_after_apart,
1103 tree_store_teardown);
1104 g_test_add ("/TreeStore/move-after-end", TreeStore, NULL,
1105 tree_store_setup, tree_store_test_move_after_end,
1106 tree_store_teardown);
1107 g_test_add ("/TreeStore/move-after-from-end", TreeStore, NULL,
1108 tree_store_setup, tree_store_test_move_after_from_end,
1109 tree_store_teardown);
1110 g_test_add ("/TreeStore/move-after-change-ends", TreeStore, NULL,
1111 tree_store_setup, tree_store_test_move_after_change_ends,
1112 tree_store_teardown);
1113 g_test_add ("/TreeStore/move-after-NULL", TreeStore, NULL,
1114 tree_store_setup, tree_store_test_move_after_NULL,
1115 tree_store_teardown);
1116 g_test_add_func ("/TreeStore/move-after-single",
1117 tree_store_test_move_after_single);
1119 g_test_add ("/TreeStore/move-before-next", TreeStore, NULL,
1120 tree_store_setup, tree_store_test_move_before_next,
1121 tree_store_teardown);
1122 g_test_add ("/TreeStore/move-before-apart", TreeStore, NULL,
1123 tree_store_setup, tree_store_test_move_before_apart,
1124 tree_store_teardown);
1125 g_test_add ("/TreeStore/move-before-to-start", TreeStore, NULL,
1126 tree_store_setup, tree_store_test_move_before_to_start,
1127 tree_store_teardown);
1128 g_test_add ("/TreeStore/move-before-from-end", TreeStore, NULL,
1129 tree_store_setup, tree_store_test_move_before_from_end,
1130 tree_store_teardown);
1131 g_test_add ("/TreeStore/move-before-change-ends", TreeStore, NULL,
1132 tree_store_setup, tree_store_test_move_before_change_ends,
1133 tree_store_teardown);
1134 g_test_add ("/TreeStore/move-before-NULL", TreeStore, NULL,
1135 tree_store_setup, tree_store_test_move_before_NULL,
1136 tree_store_teardown);
1137 g_test_add_func ("/TreeStore/move-before-single",
1138 tree_store_test_move_before_single);
1140 /* iter invalidation */
1141 g_test_add ("/TreeStore/iter-prev-invalid", TreeStore, NULL,
1142 tree_store_setup, tree_store_test_iter_previous_invalid,
1143 tree_store_teardown);
1144 g_test_add ("/TreeStore/iter-next-invalid", TreeStore, NULL,
1145 tree_store_setup, tree_store_test_iter_next_invalid,
1146 tree_store_teardown);
1147 g_test_add ("/TreeStore/iter-children-invalid", TreeStore, NULL,
1148 tree_store_setup, tree_store_test_iter_children_invalid,
1149 tree_store_teardown);
1150 g_test_add ("/TreeStore/iter-nth-child-invalid", TreeStore, NULL,
1151 tree_store_setup, tree_store_test_iter_nth_child_invalid,
1152 tree_store_teardown);
1153 g_test_add ("/TreeStore/iter-parent-invalid", TreeStore, NULL,
1154 tree_store_setup, tree_store_test_iter_parent_invalid,
1155 tree_store_teardown);
1158 g_test_add_func ("/TreeStore/bug-77977", specific_bug_77977);