1 /* Extensive GtkListStore 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 * - Test implementations of the interfaces: DnD, sortable, buildable
23 * and the tree model interface itself?
24 * - Need to check if the emitted signals are right.
25 * - Needs analysis with the code coverage tool once it is there.
30 static inline gboolean
31 iters_equal (GtkTreeIter *a,
34 if (a->stamp != b->stamp)
37 if (a->user_data != b->user_data)
40 /* user_data2 and user_data3 are not used in GtkListStore */
46 iter_position (GtkListStore *store,
53 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
57 if (gtk_tree_path_get_indices (path, NULL)[0] != n)
60 gtk_tree_path_free (path);
75 list_store_setup (ListStore *fixture,
76 gconstpointer test_data)
80 fixture->store = gtk_list_store_new (1, G_TYPE_INT);
82 for (i = 0; i < 5; i++)
84 gtk_list_store_insert (fixture->store, &fixture->iter[i], i);
85 gtk_list_store_set (fixture->store, &fixture->iter[i], 0, i, -1);
90 list_store_teardown (ListStore *fixture,
91 gconstpointer test_data)
93 g_object_unref (fixture->store);
101 check_model (ListStore *fixture,
108 path = gtk_tree_path_new ();
109 gtk_tree_path_down (path);
111 /* Check validity of the model and validity of the iters-persistent
114 for (i = 0; i < 5; i++)
121 /* The saved iterator at new_order[i] should match the iterator
125 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
128 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter));
129 g_assert (iters_equal (&iter, &fixture->iter[new_order[i]]));
131 gtk_tree_path_next (path);
134 gtk_tree_path_free (path);
139 list_store_test_insert_high_values (void)
141 GtkTreeIter iter, iter2;
142 GtkTreeIter iter_copy;
145 store = gtk_list_store_new (1, G_TYPE_INT);
147 gtk_list_store_insert (store, &iter, 1234);
148 g_assert (gtk_list_store_iter_is_valid (store, &iter));
149 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
150 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
151 g_assert (iters_equal (&iter, &iter_copy));
152 g_assert (iter_position (store, &iter, 0));
154 gtk_list_store_insert (store, &iter2, 765);
155 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
156 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
158 /* Walk over the model */
159 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
160 g_assert (iters_equal (&iter, &iter_copy));
161 g_assert (iter_position (store, &iter, 0));
163 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
164 g_assert (iters_equal (&iter2, &iter_copy));
165 g_assert (iter_position (store, &iter2, 1));
167 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
169 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
170 g_assert (iters_equal (&iter2, &iter_copy));
172 g_object_unref (store);
176 list_store_test_append (void)
178 GtkTreeIter iter, iter2;
179 GtkTreeIter iter_copy;
182 store = gtk_list_store_new (1, G_TYPE_INT);
184 gtk_list_store_append (store, &iter);
185 g_assert (gtk_list_store_iter_is_valid (store, &iter));
186 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
187 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
188 g_assert (iters_equal (&iter, &iter_copy));
189 g_assert (iter_position (store, &iter, 0));
191 gtk_list_store_append (store, &iter2);
192 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
193 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
195 /* Walk over the model */
196 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
197 g_assert (iters_equal (&iter, &iter_copy));
198 g_assert (iter_position (store, &iter, 0));
200 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
201 g_assert (iters_equal (&iter2, &iter_copy));
202 g_assert (iter_position (store, &iter2, 1));
204 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
206 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
207 g_assert (iters_equal (&iter2, &iter_copy));
209 g_object_unref (store);
213 list_store_test_prepend (void)
215 GtkTreeIter iter, iter2;
216 GtkTreeIter iter_copy;
219 store = gtk_list_store_new (1, G_TYPE_INT);
221 gtk_list_store_prepend (store, &iter);
222 g_assert (gtk_list_store_iter_is_valid (store, &iter));
223 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
224 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
225 g_assert (iters_equal (&iter, &iter_copy));
226 g_assert (iter_position (store, &iter, 0));
228 gtk_list_store_prepend (store, &iter2);
229 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
230 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
232 /* Walk over the model */
233 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
234 g_assert (iters_equal (&iter2, &iter_copy));
235 g_assert (iter_position (store, &iter2, 0));
237 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
238 g_assert (iters_equal (&iter, &iter_copy));
239 g_assert (iter_position (store, &iter, 1));
241 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
243 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
244 g_assert (iters_equal (&iter, &iter_copy));
246 g_object_unref (store);
250 list_store_test_insert_after (void)
252 GtkTreeIter iter, iter2, iter3;
253 GtkTreeIter iter_copy;
256 store = gtk_list_store_new (1, G_TYPE_INT);
258 gtk_list_store_append (store, &iter);
259 gtk_list_store_append (store, &iter2);
261 gtk_list_store_insert_after (store, &iter3, &iter);
262 g_assert (gtk_list_store_iter_is_valid (store, &iter3));
263 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
264 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
265 g_assert (iters_equal (&iter3, &iter_copy));
266 g_assert (iter_position (store, &iter3, 1));
268 /* Walk over the model */
269 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
270 g_assert (iters_equal (&iter, &iter_copy));
271 g_assert (iter_position (store, &iter_copy, 0));
273 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
274 g_assert (iters_equal (&iter3, &iter_copy));
275 g_assert (iter_position (store, &iter_copy, 1));
277 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
278 g_assert (iters_equal (&iter2, &iter_copy));
279 g_assert (iter_position (store, &iter_copy, 2));
281 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
283 g_object_unref (store);
287 list_store_test_insert_after_NULL (void)
289 GtkTreeIter iter, iter2;
290 GtkTreeIter iter_copy;
293 store = gtk_list_store_new (1, G_TYPE_INT);
295 gtk_list_store_append (store, &iter);
297 /* move_after NULL is basically a prepend */
298 gtk_list_store_insert_after (store, &iter2, NULL);
299 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
300 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
302 /* Walk over the model */
303 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
304 g_assert (iters_equal (&iter2, &iter_copy));
305 g_assert (iter_position (store, &iter2, 0));
307 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
308 g_assert (iters_equal (&iter, &iter_copy));
309 g_assert (iter_position (store, &iter, 1));
311 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
313 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
314 g_assert (iters_equal (&iter2, &iter_copy));
316 g_object_unref (store);
320 list_store_test_insert_before (void)
322 GtkTreeIter iter, iter2, iter3;
323 GtkTreeIter iter_copy;
326 store = gtk_list_store_new (1, G_TYPE_INT);
328 gtk_list_store_append (store, &iter);
329 gtk_list_store_append (store, &iter2);
331 gtk_list_store_insert_before (store, &iter3, &iter2);
332 g_assert (gtk_list_store_iter_is_valid (store, &iter3));
333 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
334 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
335 g_assert (iters_equal (&iter3, &iter_copy));
336 g_assert (iter_position (store, &iter3, 1));
338 /* Walk over the model */
339 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
340 g_assert (iters_equal (&iter, &iter_copy));
341 g_assert (iter_position (store, &iter_copy, 0));
343 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
344 g_assert (iters_equal (&iter3, &iter_copy));
345 g_assert (iter_position (store, &iter_copy, 1));
347 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
348 g_assert (iters_equal (&iter2, &iter_copy));
349 g_assert (iter_position (store, &iter_copy, 2));
351 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
353 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
354 g_assert (iters_equal (&iter3, &iter_copy));
356 g_object_unref (store);
360 list_store_test_insert_before_NULL (void)
362 GtkTreeIter iter, iter2;
363 GtkTreeIter iter_copy;
366 store = gtk_list_store_new (1, G_TYPE_INT);
368 gtk_list_store_append (store, &iter);
370 /* move_before NULL is basically an append */
371 gtk_list_store_insert_before (store, &iter2, NULL);
372 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
373 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
375 /* Walk over the model */
376 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
377 g_assert (iters_equal (&iter, &iter_copy));
378 g_assert (iter_position (store, &iter, 0));
380 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
381 g_assert (iters_equal (&iter2, &iter_copy));
382 g_assert (iter_position (store, &iter2, 1));
384 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
386 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
387 g_assert (iters_equal (&iter2, &iter_copy));
389 g_object_unref (store);
394 list_store_test_remove_begin (ListStore *fixture,
395 gconstpointer user_data)
397 int new_order[5] = { -1, 1, 2, 3, 4 };
401 /* Remove node at 0 */
402 path = gtk_tree_path_new_from_indices (0, -1);
403 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
404 gtk_tree_path_free (path);
406 g_assert (gtk_list_store_remove (fixture->store, &iter) == TRUE);
407 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[0]));
408 g_assert (iters_equal (&iter, &fixture->iter[1]));
410 check_model (fixture, new_order, 0);
414 list_store_test_remove_middle (ListStore *fixture,
415 gconstpointer user_data)
417 int new_order[5] = { 0, 1, -1, 3, 4 };
421 /* Remove node at 2 */
422 path = gtk_tree_path_new_from_indices (2, -1);
423 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
424 gtk_tree_path_free (path);
426 g_assert (gtk_list_store_remove (fixture->store, &iter) == TRUE);
427 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[2]));
428 g_assert (iters_equal (&iter, &fixture->iter[3]));
430 check_model (fixture, new_order, 2);
434 list_store_test_remove_end (ListStore *fixture,
435 gconstpointer user_data)
437 int new_order[5] = { 0, 1, 2, 3, -1 };
441 /* Remove node at 4 */
442 path = gtk_tree_path_new_from_indices (4, -1);
443 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
444 gtk_tree_path_free (path);
446 g_assert (gtk_list_store_remove (fixture->store, &iter) == FALSE);
447 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[4]));
449 check_model (fixture, new_order, 4);
453 list_store_test_clear (ListStore *fixture,
454 gconstpointer user_data)
458 gtk_list_store_clear (fixture->store);
460 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (fixture->store), NULL) == 0);
462 for (i = 0; i < 5; i++)
463 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[i]));
469 list_store_test_reorder (ListStore *fixture,
470 gconstpointer user_data)
472 int new_order[5] = { 4, 1, 0, 2, 3 };
474 gtk_list_store_reorder (fixture->store, new_order);
475 check_model (fixture, new_order, -1);
481 list_store_test_swap_begin (ListStore *fixture,
482 gconstpointer user_data)
484 /* We swap nodes 0 and 1 at the beginning */
485 int new_order[5] = { 1, 0, 2, 3, 4 };
490 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "0"));
491 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "1"));
493 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
494 check_model (fixture, new_order, -1);
498 list_store_test_swap_middle_next (ListStore *fixture,
499 gconstpointer user_data)
501 /* We swap nodes 2 and 3 in the middle that are next to each other */
502 int new_order[5] = { 0, 1, 3, 2, 4 };
507 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "2"));
508 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
510 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
511 check_model (fixture, new_order, -1);
515 list_store_test_swap_middle_apart (ListStore *fixture,
516 gconstpointer user_data)
518 /* We swap nodes 1 and 3 in the middle that are apart from each other */
519 int new_order[5] = { 0, 3, 2, 1, 4 };
524 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "1"));
525 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
527 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
528 check_model (fixture, new_order, -1);
532 list_store_test_swap_end (ListStore *fixture,
533 gconstpointer user_data)
535 /* We swap nodes 3 and 4 at the end */
536 int new_order[5] = { 0, 1, 2, 4, 3 };
541 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "3"));
542 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "4"));
544 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
545 check_model (fixture, new_order, -1);
549 list_store_test_swap_single (void)
552 GtkTreeIter iter_copy;
555 store = gtk_list_store_new (1, G_TYPE_INT);
557 /* Check if swap on a store with a single node does not corrupt
561 gtk_list_store_append (store, &iter);
564 gtk_list_store_swap (store, &iter, &iter);
565 g_assert (iters_equal (&iter, &iter_copy));
566 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
567 g_assert (iters_equal (&iter, &iter_copy));
569 g_object_unref (store);
575 list_store_test_move_after_from_start (ListStore *fixture,
576 gconstpointer user_data)
578 /* We move node 0 after 2 */
579 int new_order[5] = { 1, 2, 0, 3, 4 };
582 GtkTreeIter position;
584 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
585 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
587 gtk_list_store_move_after (fixture->store, &iter, &position);
588 check_model (fixture, new_order, -1);
592 list_store_test_move_after_next (ListStore *fixture,
593 gconstpointer user_data)
595 /* We move node 2 after 3 */
596 int new_order[5] = { 0, 1, 3, 2, 4 };
599 GtkTreeIter position;
601 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
602 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
604 gtk_list_store_move_after (fixture->store, &iter, &position);
605 check_model (fixture, new_order, -1);
609 list_store_test_move_after_apart (ListStore *fixture,
610 gconstpointer user_data)
612 /* We move node 1 after 3 */
613 int new_order[5] = { 0, 2, 3, 1, 4 };
616 GtkTreeIter position;
618 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
619 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
621 gtk_list_store_move_after (fixture->store, &iter, &position);
622 check_model (fixture, new_order, -1);
626 list_store_test_move_after_end (ListStore *fixture,
627 gconstpointer user_data)
629 /* We move node 2 after 4 */
630 int new_order[5] = { 0, 1, 3, 4, 2 };
633 GtkTreeIter position;
635 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
636 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
638 gtk_list_store_move_after (fixture->store, &iter, &position);
639 check_model (fixture, new_order, -1);
643 list_store_test_move_after_from_end (ListStore *fixture,
644 gconstpointer user_data)
646 /* We move node 4 after 1 */
647 int new_order[5] = { 0, 1, 4, 2, 3 };
650 GtkTreeIter position;
652 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
653 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "1"));
655 gtk_list_store_move_after (fixture->store, &iter, &position);
656 check_model (fixture, new_order, -1);
660 list_store_test_move_after_change_ends (ListStore *fixture,
661 gconstpointer user_data)
663 /* We move 0 after 4, this will cause both the head and tail ends to
666 int new_order[5] = { 1, 2, 3, 4, 0 };
669 GtkTreeIter position;
671 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
672 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
674 gtk_list_store_move_after (fixture->store, &iter, &position);
675 check_model (fixture, new_order, -1);
679 list_store_test_move_after_NULL (ListStore *fixture,
680 gconstpointer user_data)
682 /* We move node 2, NULL should prepend */
683 int new_order[5] = { 2, 0, 1, 3, 4 };
687 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
689 gtk_list_store_move_after (fixture->store, &iter, NULL);
690 check_model (fixture, new_order, -1);
694 list_store_test_move_after_single (void)
697 GtkTreeIter iter_copy;
700 store = gtk_list_store_new (1, G_TYPE_INT);
702 /* Check if move-after on a store with a single node does not corrupt
706 gtk_list_store_append (store, &iter);
709 gtk_list_store_move_after (store, &iter, NULL);
710 g_assert (iters_equal (&iter, &iter_copy));
711 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
712 g_assert (iters_equal (&iter, &iter_copy));
714 gtk_list_store_move_after (store, &iter, &iter);
715 g_assert (iters_equal (&iter, &iter_copy));
716 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
717 g_assert (iters_equal (&iter, &iter_copy));
719 g_object_unref (store);
725 list_store_test_move_before_next (ListStore *fixture,
726 gconstpointer user_data)
728 /* We move node 3 before 2 */
729 int new_order[5] = { 0, 1, 3, 2, 4 };
732 GtkTreeIter position;
734 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "3"));
735 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
737 gtk_list_store_move_before (fixture->store, &iter, &position);
738 check_model (fixture, new_order, -1);
742 list_store_test_move_before_apart (ListStore *fixture,
743 gconstpointer user_data)
745 /* We move node 1 before 3 */
746 int new_order[5] = { 0, 2, 1, 3, 4 };
749 GtkTreeIter position;
751 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
752 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
754 gtk_list_store_move_before (fixture->store, &iter, &position);
755 check_model (fixture, new_order, -1);
759 list_store_test_move_before_to_start (ListStore *fixture,
760 gconstpointer user_data)
762 /* We move node 2 before 0 */
763 int new_order[5] = { 2, 0, 1, 3, 4 };
766 GtkTreeIter position;
768 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
769 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
771 gtk_list_store_move_before (fixture->store, &iter, &position);
772 check_model (fixture, new_order, -1);
776 list_store_test_move_before_from_end (ListStore *fixture,
777 gconstpointer user_data)
779 /* We move node 4 before 2 (replace end) */
780 int new_order[5] = { 0, 1, 4, 2, 3 };
783 GtkTreeIter position;
785 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
786 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
788 gtk_list_store_move_before (fixture->store, &iter, &position);
789 check_model (fixture, new_order, -1);
793 list_store_test_move_before_change_ends (ListStore *fixture,
794 gconstpointer user_data)
796 /* We move node 4 before 0 */
797 int new_order[5] = { 4, 0, 1, 2, 3 };
800 GtkTreeIter position;
802 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
803 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
805 gtk_list_store_move_before (fixture->store, &iter, &position);
806 check_model (fixture, new_order, -1);
810 list_store_test_move_before_NULL (ListStore *fixture,
811 gconstpointer user_data)
813 /* We move node 2, NULL should append */
814 int new_order[5] = { 0, 1, 3, 4, 2 };
818 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
820 gtk_list_store_move_before (fixture->store, &iter, NULL);
821 check_model (fixture, new_order, -1);
825 list_store_test_move_before_single (void)
828 GtkTreeIter iter_copy;
831 store = gtk_list_store_new (1, G_TYPE_INT);
833 /* Check if move-before on a store with a single node does not corrupt
837 gtk_list_store_append (store, &iter);
840 gtk_list_store_move_before (store, &iter, NULL);
841 g_assert (iters_equal (&iter, &iter_copy));
842 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
843 g_assert (iters_equal (&iter, &iter_copy));
845 gtk_list_store_move_before (store, &iter, &iter);
846 g_assert (iters_equal (&iter, &iter_copy));
847 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
848 g_assert (iters_equal (&iter, &iter_copy));
850 g_object_unref (store);
854 /* iter invalidation */
857 list_store_test_iter_next_invalid (ListStore *fixture,
858 gconstpointer user_data)
863 path = gtk_tree_path_new_from_indices (4, -1);
864 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
865 gtk_tree_path_free (path);
867 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store),
869 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
870 g_assert (iter.stamp == 0);
874 list_store_test_iter_children_invalid (ListStore *fixture,
875 gconstpointer user_data)
877 GtkTreeIter iter, child;
879 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
880 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == TRUE);
882 g_assert (gtk_tree_model_iter_children (GTK_TREE_MODEL (fixture->store),
883 &child, &iter) == FALSE);
884 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == FALSE);
885 g_assert (child.stamp == 0);
889 list_store_test_iter_nth_child_invalid (ListStore *fixture,
890 gconstpointer user_data)
892 GtkTreeIter iter, child;
894 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
895 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == TRUE);
897 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (fixture->store),
898 &child, &iter, 0) == FALSE);
899 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == FALSE);
900 g_assert (child.stamp == 0);
904 list_store_test_iter_parent_invalid (ListStore *fixture,
905 gconstpointer user_data)
907 GtkTreeIter iter, child;
909 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &child);
910 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == TRUE);
912 g_assert (gtk_tree_model_iter_parent (GTK_TREE_MODEL (fixture->store),
913 &iter, &child) == FALSE);
914 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
915 g_assert (iter.stamp == 0);
925 gtk_test_init (&argc, &argv, NULL);
928 g_test_add_func ("/list-store/insert-high-values",
929 list_store_test_insert_high_values);
930 g_test_add_func ("/list-store/append",
931 list_store_test_append);
932 g_test_add_func ("/list-store/prepend",
933 list_store_test_prepend);
934 g_test_add_func ("/list-store/insert-after",
935 list_store_test_insert_after);
936 g_test_add_func ("/list-store/insert-after-NULL",
937 list_store_test_insert_after_NULL);
938 g_test_add_func ("/list-store/insert-before",
939 list_store_test_insert_before);
940 g_test_add_func ("/list-store/insert-before-NULL",
941 list_store_test_insert_before_NULL);
943 /* setting values (FIXME) */
946 g_test_add ("/list-store/remove-begin", ListStore, NULL,
947 list_store_setup, list_store_test_remove_begin,
948 list_store_teardown);
949 g_test_add ("/list-store/remove-middle", ListStore, NULL,
950 list_store_setup, list_store_test_remove_middle,
951 list_store_teardown);
952 g_test_add ("/list-store/remove-end", ListStore, NULL,
953 list_store_setup, list_store_test_remove_end,
954 list_store_teardown);
956 g_test_add ("/list-store/clear", ListStore, NULL,
957 list_store_setup, list_store_test_clear,
958 list_store_teardown);
961 g_test_add ("/list-store/reorder", ListStore, NULL,
962 list_store_setup, list_store_test_reorder,
963 list_store_teardown);
966 g_test_add ("/list-store/swap-begin", ListStore, NULL,
967 list_store_setup, list_store_test_swap_begin,
968 list_store_teardown);
969 g_test_add ("/list-store/swap-middle-next", ListStore, NULL,
970 list_store_setup, list_store_test_swap_middle_next,
971 list_store_teardown);
972 g_test_add ("/list-store/swap-middle-apart", ListStore, NULL,
973 list_store_setup, list_store_test_swap_middle_apart,
974 list_store_teardown);
975 g_test_add ("/list-store/swap-end", ListStore, NULL,
976 list_store_setup, list_store_test_swap_end,
977 list_store_teardown);
978 g_test_add_func ("/list-store/swap-single",
979 list_store_test_swap_single);
982 g_test_add ("/list-store/move-after-from-start", ListStore, NULL,
983 list_store_setup, list_store_test_move_after_from_start,
984 list_store_teardown);
985 g_test_add ("/list-store/move-after-next", ListStore, NULL,
986 list_store_setup, list_store_test_move_after_next,
987 list_store_teardown);
988 g_test_add ("/list-store/move-after-apart", ListStore, NULL,
989 list_store_setup, list_store_test_move_after_apart,
990 list_store_teardown);
991 g_test_add ("/list-store/move-after-end", ListStore, NULL,
992 list_store_setup, list_store_test_move_after_end,
993 list_store_teardown);
994 g_test_add ("/list-store/move-after-from-end", ListStore, NULL,
995 list_store_setup, list_store_test_move_after_from_end,
996 list_store_teardown);
997 g_test_add ("/list-store/move-after-change-ends", ListStore, NULL,
998 list_store_setup, list_store_test_move_after_change_ends,
999 list_store_teardown);
1000 g_test_add ("/list-store/move-after-NULL", ListStore, NULL,
1001 list_store_setup, list_store_test_move_after_NULL,
1002 list_store_teardown);
1003 g_test_add_func ("/list-store/move-after-single",
1004 list_store_test_move_after_single);
1006 g_test_add ("/list-store/move-before-next", ListStore, NULL,
1007 list_store_setup, list_store_test_move_before_next,
1008 list_store_teardown);
1009 g_test_add ("/list-store/move-before-apart", ListStore, NULL,
1010 list_store_setup, list_store_test_move_before_apart,
1011 list_store_teardown);
1012 g_test_add ("/list-store/move-before-to-start", ListStore, NULL,
1013 list_store_setup, list_store_test_move_before_to_start,
1014 list_store_teardown);
1015 g_test_add ("/list-store/move-before-from-end", ListStore, NULL,
1016 list_store_setup, list_store_test_move_before_from_end,
1017 list_store_teardown);
1018 g_test_add ("/list-store/move-before-change-ends", ListStore, NULL,
1019 list_store_setup, list_store_test_move_before_change_ends,
1020 list_store_teardown);
1021 g_test_add ("/list-store/move-before-NULL", ListStore, NULL,
1022 list_store_setup, list_store_test_move_before_NULL,
1023 list_store_teardown);
1024 g_test_add_func ("/list-store/move-before-single",
1025 list_store_test_move_before_single);
1027 /* iter invalidation */
1028 g_test_add ("/list-store/iter-next-invalid", ListStore, NULL,
1029 list_store_setup, list_store_test_iter_next_invalid,
1030 list_store_teardown);
1031 g_test_add ("/list-store/iter-children-invalid", ListStore, NULL,
1032 list_store_setup, list_store_test_iter_children_invalid,
1033 list_store_teardown);
1034 g_test_add ("/list-store/iter-nth-child-invalid", ListStore, NULL,
1035 list_store_setup, list_store_test_iter_nth_child_invalid,
1036 list_store_teardown);
1037 g_test_add ("/list-store/iter-parent-invalid", ListStore, NULL,
1038 list_store_setup, list_store_test_iter_parent_invalid,
1039 list_store_teardown);
1041 return g_test_run ();