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 #include "treemodel.h"
32 static inline gboolean
33 iters_equal (GtkTreeIter *a,
36 if (a->stamp != b->stamp)
39 if (a->user_data != b->user_data)
42 /* user_data2 and user_data3 are not used in GtkListStore */
48 iter_position (GtkListStore *store,
55 path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
59 if (gtk_tree_path_get_indices (path)[0] != n)
62 gtk_tree_path_free (path);
77 list_store_setup (ListStore *fixture,
78 gconstpointer test_data)
82 fixture->store = gtk_list_store_new (1, G_TYPE_INT);
84 for (i = 0; i < 5; i++)
86 gtk_list_store_insert (fixture->store, &fixture->iter[i], i);
87 gtk_list_store_set (fixture->store, &fixture->iter[i], 0, i, -1);
92 list_store_teardown (ListStore *fixture,
93 gconstpointer test_data)
95 g_object_unref (fixture->store);
103 check_model (ListStore *fixture,
110 path = gtk_tree_path_new ();
111 gtk_tree_path_down (path);
113 /* Check validity of the model and validity of the iters-persistent
116 for (i = 0; i < 5; i++)
123 /* The saved iterator at new_order[i] should match the iterator
127 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
130 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter));
131 g_assert (iters_equal (&iter, &fixture->iter[new_order[i]]));
133 gtk_tree_path_next (path);
136 gtk_tree_path_free (path);
141 list_store_test_insert_high_values (void)
143 GtkTreeIter iter, iter2;
144 GtkTreeIter iter_copy;
147 store = gtk_list_store_new (1, G_TYPE_INT);
149 gtk_list_store_insert (store, &iter, 1234);
150 g_assert (gtk_list_store_iter_is_valid (store, &iter));
151 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
152 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
153 g_assert (iters_equal (&iter, &iter_copy));
154 g_assert (iter_position (store, &iter, 0));
156 gtk_list_store_insert (store, &iter2, 765);
157 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
158 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
160 /* Walk over the model */
161 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
162 g_assert (iters_equal (&iter, &iter_copy));
163 g_assert (iter_position (store, &iter, 0));
165 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
166 g_assert (iters_equal (&iter2, &iter_copy));
167 g_assert (iter_position (store, &iter2, 1));
169 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
171 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
172 g_assert (iters_equal (&iter2, &iter_copy));
173 g_assert (iter_position (store, &iter2, 1));
175 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
176 g_assert (iters_equal (&iter, &iter_copy));
177 g_assert (iter_position (store, &iter, 0));
179 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
181 g_object_unref (store);
185 list_store_test_append (void)
187 GtkTreeIter iter, iter2;
188 GtkTreeIter iter_copy;
191 store = gtk_list_store_new (1, G_TYPE_INT);
193 gtk_list_store_append (store, &iter);
194 g_assert (gtk_list_store_iter_is_valid (store, &iter));
195 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
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 gtk_list_store_append (store, &iter2);
201 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
202 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
204 /* Walk over the model */
205 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
206 g_assert (iters_equal (&iter, &iter_copy));
207 g_assert (iter_position (store, &iter, 0));
209 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
210 g_assert (iters_equal (&iter2, &iter_copy));
211 g_assert (iter_position (store, &iter2, 1));
213 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
215 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
216 g_assert (iters_equal (&iter2, &iter_copy));
217 g_assert (iter_position (store, &iter2, 1));
219 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
220 g_assert (iters_equal (&iter, &iter_copy));
221 g_assert (iter_position (store, &iter, 0));
223 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
225 g_object_unref (store);
229 list_store_test_prepend (void)
231 GtkTreeIter iter, iter2;
232 GtkTreeIter iter_copy;
235 store = gtk_list_store_new (1, G_TYPE_INT);
237 gtk_list_store_prepend (store, &iter);
238 g_assert (gtk_list_store_iter_is_valid (store, &iter));
239 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
240 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
241 g_assert (iters_equal (&iter, &iter_copy));
242 g_assert (iter_position (store, &iter, 0));
244 gtk_list_store_prepend (store, &iter2);
245 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
246 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
248 /* Walk over the model */
249 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
250 g_assert (iters_equal (&iter2, &iter_copy));
251 g_assert (iter_position (store, &iter2, 0));
253 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
254 g_assert (iters_equal (&iter, &iter_copy));
255 g_assert (iter_position (store, &iter, 1));
257 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
259 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
260 g_assert (iters_equal (&iter, &iter_copy));
261 g_assert (iter_position (store, &iter, 1));
263 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
264 g_assert (iters_equal (&iter2, &iter_copy));
265 g_assert (iter_position (store, &iter2, 0));
267 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
269 g_object_unref (store);
273 list_store_test_insert_after (void)
275 GtkTreeIter iter, iter2, iter3;
276 GtkTreeIter iter_copy;
279 store = gtk_list_store_new (1, G_TYPE_INT);
281 gtk_list_store_append (store, &iter);
282 gtk_list_store_append (store, &iter2);
284 gtk_list_store_insert_after (store, &iter3, &iter);
285 g_assert (gtk_list_store_iter_is_valid (store, &iter3));
286 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
287 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
288 g_assert (iters_equal (&iter3, &iter_copy));
289 g_assert (iter_position (store, &iter3, 1));
291 /* Walk over the model */
292 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
293 g_assert (iters_equal (&iter, &iter_copy));
294 g_assert (iter_position (store, &iter_copy, 0));
296 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
297 g_assert (iters_equal (&iter3, &iter_copy));
298 g_assert (iter_position (store, &iter_copy, 1));
300 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
301 g_assert (iters_equal (&iter2, &iter_copy));
302 g_assert (iter_position (store, &iter_copy, 2));
304 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
306 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
307 g_assert (iters_equal (&iter2, &iter_copy));
308 g_assert (iter_position (store, &iter2, 2));
310 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
311 g_assert (iters_equal (&iter3, &iter_copy));
312 g_assert (iter_position (store, &iter3, 1));
314 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
315 g_assert (iters_equal (&iter, &iter_copy));
316 g_assert (iter_position (store, &iter, 0));
318 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
320 g_object_unref (store);
324 list_store_test_insert_after_NULL (void)
326 GtkTreeIter iter, iter2;
327 GtkTreeIter iter_copy;
330 store = gtk_list_store_new (1, G_TYPE_INT);
332 gtk_list_store_append (store, &iter);
334 /* move_after NULL is basically a prepend */
335 gtk_list_store_insert_after (store, &iter2, NULL);
336 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
337 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
339 /* Walk over the model */
340 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
341 g_assert (iters_equal (&iter2, &iter_copy));
342 g_assert (iter_position (store, &iter2, 0));
344 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
345 g_assert (iters_equal (&iter, &iter_copy));
346 g_assert (iter_position (store, &iter, 1));
348 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
350 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
351 g_assert (iters_equal (&iter2, &iter_copy));
353 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
354 g_assert (iters_equal (&iter, &iter_copy));
355 g_assert (iter_position (store, &iter, 1));
357 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
358 g_assert (iters_equal (&iter2, &iter_copy));
359 g_assert (iter_position (store, &iter2, 0));
361 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
363 g_object_unref (store);
367 list_store_test_insert_before (void)
369 GtkTreeIter iter, iter2, iter3;
370 GtkTreeIter iter_copy;
373 store = gtk_list_store_new (1, G_TYPE_INT);
375 gtk_list_store_append (store, &iter);
376 gtk_list_store_append (store, &iter2);
378 gtk_list_store_insert_before (store, &iter3, &iter2);
379 g_assert (gtk_list_store_iter_is_valid (store, &iter3));
380 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
381 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
382 g_assert (iters_equal (&iter3, &iter_copy));
383 g_assert (iter_position (store, &iter3, 1));
385 /* Walk over the model */
386 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
387 g_assert (iters_equal (&iter, &iter_copy));
388 g_assert (iter_position (store, &iter_copy, 0));
390 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
391 g_assert (iters_equal (&iter3, &iter_copy));
392 g_assert (iter_position (store, &iter_copy, 1));
394 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
395 g_assert (iters_equal (&iter2, &iter_copy));
396 g_assert (iter_position (store, &iter_copy, 2));
398 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
400 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
401 g_assert (iters_equal (&iter3, &iter_copy));
403 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
404 g_assert (iters_equal (&iter2, &iter_copy));
405 g_assert (iter_position (store, &iter2, 2));
407 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
408 g_assert (iters_equal (&iter3, &iter_copy));
409 g_assert (iter_position (store, &iter3, 1));
411 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
412 g_assert (iters_equal (&iter, &iter_copy));
413 g_assert (iter_position (store, &iter, 0));
415 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
417 g_object_unref (store);
421 list_store_test_insert_before_NULL (void)
423 GtkTreeIter iter, iter2;
424 GtkTreeIter iter_copy;
427 store = gtk_list_store_new (1, G_TYPE_INT);
429 gtk_list_store_append (store, &iter);
431 /* move_before NULL is basically an append */
432 gtk_list_store_insert_before (store, &iter2, NULL);
433 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
434 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
436 /* Walk over the model */
437 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
438 g_assert (iters_equal (&iter, &iter_copy));
439 g_assert (iter_position (store, &iter, 0));
441 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
442 g_assert (iters_equal (&iter2, &iter_copy));
443 g_assert (iter_position (store, &iter2, 1));
445 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
447 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
448 g_assert (iters_equal (&iter2, &iter_copy));
449 g_assert (iter_position (store, &iter2, 1));
451 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
452 g_assert (iters_equal (&iter, &iter_copy));
453 g_assert (iter_position (store, &iter, 0));
455 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
457 g_object_unref (store);
462 list_store_test_remove_begin (ListStore *fixture,
463 gconstpointer user_data)
465 int new_order[5] = { -1, 1, 2, 3, 4 };
469 /* Remove node at 0 */
470 path = gtk_tree_path_new_from_indices (0, -1);
471 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
472 gtk_tree_path_free (path);
474 g_assert (gtk_list_store_remove (fixture->store, &iter) == TRUE);
475 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[0]));
476 g_assert (iters_equal (&iter, &fixture->iter[1]));
478 check_model (fixture, new_order, 0);
482 list_store_test_remove_middle (ListStore *fixture,
483 gconstpointer user_data)
485 int new_order[5] = { 0, 1, -1, 3, 4 };
489 /* Remove node at 2 */
490 path = gtk_tree_path_new_from_indices (2, -1);
491 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
492 gtk_tree_path_free (path);
494 g_assert (gtk_list_store_remove (fixture->store, &iter) == TRUE);
495 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[2]));
496 g_assert (iters_equal (&iter, &fixture->iter[3]));
498 check_model (fixture, new_order, 2);
502 list_store_test_remove_end (ListStore *fixture,
503 gconstpointer user_data)
505 int new_order[5] = { 0, 1, 2, 3, -1 };
509 /* Remove node at 4 */
510 path = gtk_tree_path_new_from_indices (4, -1);
511 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
512 gtk_tree_path_free (path);
514 g_assert (gtk_list_store_remove (fixture->store, &iter) == FALSE);
515 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[4]));
517 check_model (fixture, new_order, 4);
521 list_store_test_clear (ListStore *fixture,
522 gconstpointer user_data)
526 gtk_list_store_clear (fixture->store);
528 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (fixture->store), NULL) == 0);
530 for (i = 0; i < 5; i++)
531 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[i]));
537 list_store_test_reorder (ListStore *fixture,
538 gconstpointer user_data)
540 int new_order[5] = { 4, 1, 0, 2, 3 };
542 gtk_list_store_reorder (fixture->store, new_order);
543 check_model (fixture, new_order, -1);
549 list_store_test_swap_begin (ListStore *fixture,
550 gconstpointer user_data)
552 /* We swap nodes 0 and 1 at the beginning */
553 int new_order[5] = { 1, 0, 2, 3, 4 };
558 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "0"));
559 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "1"));
561 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
562 check_model (fixture, new_order, -1);
566 list_store_test_swap_middle_next (ListStore *fixture,
567 gconstpointer user_data)
569 /* We swap nodes 2 and 3 in the middle that are next to each other */
570 int new_order[5] = { 0, 1, 3, 2, 4 };
575 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "2"));
576 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
578 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
579 check_model (fixture, new_order, -1);
583 list_store_test_swap_middle_apart (ListStore *fixture,
584 gconstpointer user_data)
586 /* We swap nodes 1 and 3 in the middle that are apart from each other */
587 int new_order[5] = { 0, 3, 2, 1, 4 };
592 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "1"));
593 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
595 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
596 check_model (fixture, new_order, -1);
600 list_store_test_swap_end (ListStore *fixture,
601 gconstpointer user_data)
603 /* We swap nodes 3 and 4 at the end */
604 int new_order[5] = { 0, 1, 2, 4, 3 };
609 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "3"));
610 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "4"));
612 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
613 check_model (fixture, new_order, -1);
617 list_store_test_swap_single (void)
620 GtkTreeIter iter_copy;
623 store = gtk_list_store_new (1, G_TYPE_INT);
625 /* Check if swap on a store with a single node does not corrupt
629 gtk_list_store_append (store, &iter);
632 gtk_list_store_swap (store, &iter, &iter);
633 g_assert (iters_equal (&iter, &iter_copy));
634 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
635 g_assert (iters_equal (&iter, &iter_copy));
637 g_object_unref (store);
643 list_store_test_move_after_from_start (ListStore *fixture,
644 gconstpointer user_data)
646 /* We move node 0 after 2 */
647 int new_order[5] = { 1, 2, 0, 3, 4 };
650 GtkTreeIter position;
652 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
653 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
655 gtk_list_store_move_after (fixture->store, &iter, &position);
656 check_model (fixture, new_order, -1);
660 list_store_test_move_after_next (ListStore *fixture,
661 gconstpointer user_data)
663 /* We move node 2 after 3 */
664 int new_order[5] = { 0, 1, 3, 2, 4 };
667 GtkTreeIter position;
669 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
670 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
672 gtk_list_store_move_after (fixture->store, &iter, &position);
673 check_model (fixture, new_order, -1);
677 list_store_test_move_after_apart (ListStore *fixture,
678 gconstpointer user_data)
680 /* We move node 1 after 3 */
681 int new_order[5] = { 0, 2, 3, 1, 4 };
684 GtkTreeIter position;
686 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
687 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
689 gtk_list_store_move_after (fixture->store, &iter, &position);
690 check_model (fixture, new_order, -1);
694 list_store_test_move_after_end (ListStore *fixture,
695 gconstpointer user_data)
697 /* We move node 2 after 4 */
698 int new_order[5] = { 0, 1, 3, 4, 2 };
701 GtkTreeIter position;
703 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
704 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
706 gtk_list_store_move_after (fixture->store, &iter, &position);
707 check_model (fixture, new_order, -1);
711 list_store_test_move_after_from_end (ListStore *fixture,
712 gconstpointer user_data)
714 /* We move node 4 after 1 */
715 int new_order[5] = { 0, 1, 4, 2, 3 };
718 GtkTreeIter position;
720 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
721 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "1"));
723 gtk_list_store_move_after (fixture->store, &iter, &position);
724 check_model (fixture, new_order, -1);
728 list_store_test_move_after_change_ends (ListStore *fixture,
729 gconstpointer user_data)
731 /* We move 0 after 4, this will cause both the head and tail ends to
734 int new_order[5] = { 1, 2, 3, 4, 0 };
737 GtkTreeIter position;
739 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
740 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
742 gtk_list_store_move_after (fixture->store, &iter, &position);
743 check_model (fixture, new_order, -1);
747 list_store_test_move_after_NULL (ListStore *fixture,
748 gconstpointer user_data)
750 /* We move node 2, NULL should prepend */
751 int new_order[5] = { 2, 0, 1, 3, 4 };
755 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
757 gtk_list_store_move_after (fixture->store, &iter, NULL);
758 check_model (fixture, new_order, -1);
762 list_store_test_move_after_single (void)
765 GtkTreeIter iter_copy;
768 store = gtk_list_store_new (1, G_TYPE_INT);
770 /* Check if move-after on a store with a single node does not corrupt
774 gtk_list_store_append (store, &iter);
777 gtk_list_store_move_after (store, &iter, NULL);
778 g_assert (iters_equal (&iter, &iter_copy));
779 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
780 g_assert (iters_equal (&iter, &iter_copy));
782 gtk_list_store_move_after (store, &iter, &iter);
783 g_assert (iters_equal (&iter, &iter_copy));
784 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
785 g_assert (iters_equal (&iter, &iter_copy));
787 g_object_unref (store);
793 list_store_test_move_before_next (ListStore *fixture,
794 gconstpointer user_data)
796 /* We move node 3 before 2 */
797 int new_order[5] = { 0, 1, 3, 2, 4 };
800 GtkTreeIter position;
802 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "3"));
803 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
805 gtk_list_store_move_before (fixture->store, &iter, &position);
806 check_model (fixture, new_order, -1);
810 list_store_test_move_before_apart (ListStore *fixture,
811 gconstpointer user_data)
813 /* We move node 1 before 3 */
814 int new_order[5] = { 0, 2, 1, 3, 4 };
817 GtkTreeIter position;
819 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
820 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
822 gtk_list_store_move_before (fixture->store, &iter, &position);
823 check_model (fixture, new_order, -1);
827 list_store_test_move_before_to_start (ListStore *fixture,
828 gconstpointer user_data)
830 /* We move node 2 before 0 */
831 int new_order[5] = { 2, 0, 1, 3, 4 };
834 GtkTreeIter position;
836 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
837 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
839 gtk_list_store_move_before (fixture->store, &iter, &position);
840 check_model (fixture, new_order, -1);
844 list_store_test_move_before_from_end (ListStore *fixture,
845 gconstpointer user_data)
847 /* We move node 4 before 2 (replace end) */
848 int new_order[5] = { 0, 1, 4, 2, 3 };
851 GtkTreeIter position;
853 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
854 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
856 gtk_list_store_move_before (fixture->store, &iter, &position);
857 check_model (fixture, new_order, -1);
861 list_store_test_move_before_change_ends (ListStore *fixture,
862 gconstpointer user_data)
864 /* We move node 4 before 0 */
865 int new_order[5] = { 4, 0, 1, 2, 3 };
868 GtkTreeIter position;
870 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
871 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
873 gtk_list_store_move_before (fixture->store, &iter, &position);
874 check_model (fixture, new_order, -1);
878 list_store_test_move_before_NULL (ListStore *fixture,
879 gconstpointer user_data)
881 /* We move node 2, NULL should append */
882 int new_order[5] = { 0, 1, 3, 4, 2 };
886 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
888 gtk_list_store_move_before (fixture->store, &iter, NULL);
889 check_model (fixture, new_order, -1);
893 list_store_test_move_before_single (void)
896 GtkTreeIter iter_copy;
899 store = gtk_list_store_new (1, G_TYPE_INT);
901 /* Check if move-before on a store with a single node does not corrupt
905 gtk_list_store_append (store, &iter);
908 gtk_list_store_move_before (store, &iter, NULL);
909 g_assert (iters_equal (&iter, &iter_copy));
910 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
911 g_assert (iters_equal (&iter, &iter_copy));
913 gtk_list_store_move_before (store, &iter, &iter);
914 g_assert (iters_equal (&iter, &iter_copy));
915 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
916 g_assert (iters_equal (&iter, &iter_copy));
918 g_object_unref (store);
922 /* iter invalidation */
925 list_store_test_iter_previous_invalid (ListStore *fixture,
926 gconstpointer user_data)
930 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
932 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (fixture->store),
934 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
935 g_assert (iter.stamp == 0);
939 list_store_test_iter_next_invalid (ListStore *fixture,
940 gconstpointer user_data)
945 path = gtk_tree_path_new_from_indices (4, -1);
946 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
947 gtk_tree_path_free (path);
949 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store),
951 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
952 g_assert (iter.stamp == 0);
956 list_store_test_iter_children_invalid (ListStore *fixture,
957 gconstpointer user_data)
959 GtkTreeIter iter, child;
961 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
962 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == TRUE);
964 g_assert (gtk_tree_model_iter_children (GTK_TREE_MODEL (fixture->store),
965 &child, &iter) == FALSE);
966 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == FALSE);
967 g_assert (child.stamp == 0);
971 list_store_test_iter_nth_child_invalid (ListStore *fixture,
972 gconstpointer user_data)
974 GtkTreeIter iter, child;
976 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
977 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == TRUE);
979 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (fixture->store),
980 &child, &iter, 0) == FALSE);
981 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == FALSE);
982 g_assert (child.stamp == 0);
986 list_store_test_iter_parent_invalid (ListStore *fixture,
987 gconstpointer user_data)
989 GtkTreeIter iter, child;
991 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &child);
992 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == TRUE);
994 g_assert (gtk_tree_model_iter_parent (GTK_TREE_MODEL (fixture->store),
995 &iter, &child) == FALSE);
996 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
997 g_assert (iter.stamp == 0);
1004 register_list_store_tests (void)
1007 g_test_add_func ("/ListStore/insert-high-values",
1008 list_store_test_insert_high_values);
1009 g_test_add_func ("/ListStore/append",
1010 list_store_test_append);
1011 g_test_add_func ("/ListStore/prepend",
1012 list_store_test_prepend);
1013 g_test_add_func ("/ListStore/insert-after",
1014 list_store_test_insert_after);
1015 g_test_add_func ("/ListStore/insert-after-NULL",
1016 list_store_test_insert_after_NULL);
1017 g_test_add_func ("/ListStore/insert-before",
1018 list_store_test_insert_before);
1019 g_test_add_func ("/ListStore/insert-before-NULL",
1020 list_store_test_insert_before_NULL);
1022 /* setting values (FIXME) */
1025 g_test_add ("/ListStore/remove-begin", ListStore, NULL,
1026 list_store_setup, list_store_test_remove_begin,
1027 list_store_teardown);
1028 g_test_add ("/ListStore/remove-middle", ListStore, NULL,
1029 list_store_setup, list_store_test_remove_middle,
1030 list_store_teardown);
1031 g_test_add ("/ListStore/remove-end", ListStore, NULL,
1032 list_store_setup, list_store_test_remove_end,
1033 list_store_teardown);
1035 g_test_add ("/ListStore/clear", ListStore, NULL,
1036 list_store_setup, list_store_test_clear,
1037 list_store_teardown);
1040 g_test_add ("/ListStore/reorder", ListStore, NULL,
1041 list_store_setup, list_store_test_reorder,
1042 list_store_teardown);
1045 g_test_add ("/ListStore/swap-begin", ListStore, NULL,
1046 list_store_setup, list_store_test_swap_begin,
1047 list_store_teardown);
1048 g_test_add ("/ListStore/swap-middle-next", ListStore, NULL,
1049 list_store_setup, list_store_test_swap_middle_next,
1050 list_store_teardown);
1051 g_test_add ("/ListStore/swap-middle-apart", ListStore, NULL,
1052 list_store_setup, list_store_test_swap_middle_apart,
1053 list_store_teardown);
1054 g_test_add ("/ListStore/swap-end", ListStore, NULL,
1055 list_store_setup, list_store_test_swap_end,
1056 list_store_teardown);
1057 g_test_add_func ("/ListStore/swap-single",
1058 list_store_test_swap_single);
1061 g_test_add ("/ListStore/move-after-from-start", ListStore, NULL,
1062 list_store_setup, list_store_test_move_after_from_start,
1063 list_store_teardown);
1064 g_test_add ("/ListStore/move-after-next", ListStore, NULL,
1065 list_store_setup, list_store_test_move_after_next,
1066 list_store_teardown);
1067 g_test_add ("/ListStore/move-after-apart", ListStore, NULL,
1068 list_store_setup, list_store_test_move_after_apart,
1069 list_store_teardown);
1070 g_test_add ("/ListStore/move-after-end", ListStore, NULL,
1071 list_store_setup, list_store_test_move_after_end,
1072 list_store_teardown);
1073 g_test_add ("/ListStore/move-after-from-end", ListStore, NULL,
1074 list_store_setup, list_store_test_move_after_from_end,
1075 list_store_teardown);
1076 g_test_add ("/ListStore/move-after-change-ends", ListStore, NULL,
1077 list_store_setup, list_store_test_move_after_change_ends,
1078 list_store_teardown);
1079 g_test_add ("/ListStore/move-after-NULL", ListStore, NULL,
1080 list_store_setup, list_store_test_move_after_NULL,
1081 list_store_teardown);
1082 g_test_add_func ("/ListStore/move-after-single",
1083 list_store_test_move_after_single);
1085 g_test_add ("/ListStore/move-before-next", ListStore, NULL,
1086 list_store_setup, list_store_test_move_before_next,
1087 list_store_teardown);
1088 g_test_add ("/ListStore/move-before-apart", ListStore, NULL,
1089 list_store_setup, list_store_test_move_before_apart,
1090 list_store_teardown);
1091 g_test_add ("/ListStore/move-before-to-start", ListStore, NULL,
1092 list_store_setup, list_store_test_move_before_to_start,
1093 list_store_teardown);
1094 g_test_add ("/ListStore/move-before-from-end", ListStore, NULL,
1095 list_store_setup, list_store_test_move_before_from_end,
1096 list_store_teardown);
1097 g_test_add ("/ListStore/move-before-change-ends", ListStore, NULL,
1098 list_store_setup, list_store_test_move_before_change_ends,
1099 list_store_teardown);
1100 g_test_add ("/ListStore/move-before-NULL", ListStore, NULL,
1101 list_store_setup, list_store_test_move_before_NULL,
1102 list_store_teardown);
1103 g_test_add_func ("/ListStore/move-before-single",
1104 list_store_test_move_before_single);
1106 /* iter invalidation */
1107 g_test_add ("/ListStore/iter-prev-invalid", ListStore, NULL,
1108 list_store_setup, list_store_test_iter_previous_invalid,
1109 list_store_teardown);
1110 g_test_add ("/ListStore/iter-next-invalid", ListStore, NULL,
1111 list_store_setup, list_store_test_iter_next_invalid,
1112 list_store_teardown);
1113 g_test_add ("/ListStore/iter-children-invalid", ListStore, NULL,
1114 list_store_setup, list_store_test_iter_children_invalid,
1115 list_store_teardown);
1116 g_test_add ("/ListStore/iter-nth-child-invalid", ListStore, NULL,
1117 list_store_setup, list_store_test_iter_nth_child_invalid,
1118 list_store_teardown);
1119 g_test_add ("/ListStore/iter-parent-invalid", ListStore, NULL,
1120 list_store_setup, list_store_test_iter_parent_invalid,
1121 list_store_teardown);