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, see <http://www.gnu.org/licenses/>.
20 * - Test implementations of the interfaces: DnD, sortable, buildable
21 * and the tree model interface itself?
22 * - Need to check if the emitted signals are right.
23 * - Needs analysis with the code coverage tool once it is there.
28 #include "treemodel.h"
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)[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));
171 g_assert (iter_position (store, &iter2, 1));
173 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
174 g_assert (iters_equal (&iter, &iter_copy));
175 g_assert (iter_position (store, &iter, 0));
177 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
179 g_object_unref (store);
183 list_store_test_append (void)
185 GtkTreeIter iter, iter2;
186 GtkTreeIter iter_copy;
189 store = gtk_list_store_new (1, G_TYPE_INT);
191 gtk_list_store_append (store, &iter);
192 g_assert (gtk_list_store_iter_is_valid (store, &iter));
193 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
194 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
195 g_assert (iters_equal (&iter, &iter_copy));
196 g_assert (iter_position (store, &iter, 0));
198 gtk_list_store_append (store, &iter2);
199 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
200 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
202 /* Walk over the model */
203 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
204 g_assert (iters_equal (&iter, &iter_copy));
205 g_assert (iter_position (store, &iter, 0));
207 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
208 g_assert (iters_equal (&iter2, &iter_copy));
209 g_assert (iter_position (store, &iter2, 1));
211 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
213 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
214 g_assert (iters_equal (&iter2, &iter_copy));
215 g_assert (iter_position (store, &iter2, 1));
217 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
218 g_assert (iters_equal (&iter, &iter_copy));
219 g_assert (iter_position (store, &iter, 0));
221 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
223 g_object_unref (store);
227 list_store_test_prepend (void)
229 GtkTreeIter iter, iter2;
230 GtkTreeIter iter_copy;
233 store = gtk_list_store_new (1, G_TYPE_INT);
235 gtk_list_store_prepend (store, &iter);
236 g_assert (gtk_list_store_iter_is_valid (store, &iter));
237 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 1);
238 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
239 g_assert (iters_equal (&iter, &iter_copy));
240 g_assert (iter_position (store, &iter, 0));
242 gtk_list_store_prepend (store, &iter2);
243 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
244 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
246 /* Walk over the model */
247 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
248 g_assert (iters_equal (&iter2, &iter_copy));
249 g_assert (iter_position (store, &iter2, 0));
251 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
252 g_assert (iters_equal (&iter, &iter_copy));
253 g_assert (iter_position (store, &iter, 1));
255 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
257 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
258 g_assert (iters_equal (&iter, &iter_copy));
259 g_assert (iter_position (store, &iter, 1));
261 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
262 g_assert (iters_equal (&iter2, &iter_copy));
263 g_assert (iter_position (store, &iter2, 0));
265 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
267 g_object_unref (store);
271 list_store_test_insert_after (void)
273 GtkTreeIter iter, iter2, iter3;
274 GtkTreeIter iter_copy;
277 store = gtk_list_store_new (1, G_TYPE_INT);
279 gtk_list_store_append (store, &iter);
280 gtk_list_store_append (store, &iter2);
282 gtk_list_store_insert_after (store, &iter3, &iter);
283 g_assert (gtk_list_store_iter_is_valid (store, &iter3));
284 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
285 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
286 g_assert (iters_equal (&iter3, &iter_copy));
287 g_assert (iter_position (store, &iter3, 1));
289 /* Walk over the model */
290 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
291 g_assert (iters_equal (&iter, &iter_copy));
292 g_assert (iter_position (store, &iter_copy, 0));
294 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
295 g_assert (iters_equal (&iter3, &iter_copy));
296 g_assert (iter_position (store, &iter_copy, 1));
298 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
299 g_assert (iters_equal (&iter2, &iter_copy));
300 g_assert (iter_position (store, &iter_copy, 2));
302 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
304 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
305 g_assert (iters_equal (&iter2, &iter_copy));
306 g_assert (iter_position (store, &iter2, 2));
308 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
309 g_assert (iters_equal (&iter3, &iter_copy));
310 g_assert (iter_position (store, &iter3, 1));
312 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
313 g_assert (iters_equal (&iter, &iter_copy));
314 g_assert (iter_position (store, &iter, 0));
316 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
318 g_object_unref (store);
322 list_store_test_insert_after_NULL (void)
324 GtkTreeIter iter, iter2;
325 GtkTreeIter iter_copy;
328 store = gtk_list_store_new (1, G_TYPE_INT);
330 gtk_list_store_append (store, &iter);
332 /* move_after NULL is basically a prepend */
333 gtk_list_store_insert_after (store, &iter2, NULL);
334 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
335 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
337 /* Walk over the model */
338 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
339 g_assert (iters_equal (&iter2, &iter_copy));
340 g_assert (iter_position (store, &iter2, 0));
342 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
343 g_assert (iters_equal (&iter, &iter_copy));
344 g_assert (iter_position (store, &iter, 1));
346 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
348 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
349 g_assert (iters_equal (&iter2, &iter_copy));
351 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
352 g_assert (iters_equal (&iter, &iter_copy));
353 g_assert (iter_position (store, &iter, 1));
355 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
356 g_assert (iters_equal (&iter2, &iter_copy));
357 g_assert (iter_position (store, &iter2, 0));
359 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
361 g_object_unref (store);
365 list_store_test_insert_before (void)
367 GtkTreeIter iter, iter2, iter3;
368 GtkTreeIter iter_copy;
371 store = gtk_list_store_new (1, G_TYPE_INT);
373 gtk_list_store_append (store, &iter);
374 gtk_list_store_append (store, &iter2);
376 gtk_list_store_insert_before (store, &iter3, &iter2);
377 g_assert (gtk_list_store_iter_is_valid (store, &iter3));
378 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 3);
379 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
380 g_assert (iters_equal (&iter3, &iter_copy));
381 g_assert (iter_position (store, &iter3, 1));
383 /* Walk over the model */
384 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
385 g_assert (iters_equal (&iter, &iter_copy));
386 g_assert (iter_position (store, &iter_copy, 0));
388 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
389 g_assert (iters_equal (&iter3, &iter_copy));
390 g_assert (iter_position (store, &iter_copy, 1));
392 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
393 g_assert (iters_equal (&iter2, &iter_copy));
394 g_assert (iter_position (store, &iter_copy, 2));
396 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
398 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
399 g_assert (iters_equal (&iter3, &iter_copy));
401 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
402 g_assert (iters_equal (&iter2, &iter_copy));
403 g_assert (iter_position (store, &iter2, 2));
405 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
406 g_assert (iters_equal (&iter3, &iter_copy));
407 g_assert (iter_position (store, &iter3, 1));
409 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
410 g_assert (iters_equal (&iter, &iter_copy));
411 g_assert (iter_position (store, &iter, 0));
413 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
415 g_object_unref (store);
419 list_store_test_insert_before_NULL (void)
421 GtkTreeIter iter, iter2;
422 GtkTreeIter iter_copy;
425 store = gtk_list_store_new (1, G_TYPE_INT);
427 gtk_list_store_append (store, &iter);
429 /* move_before NULL is basically an append */
430 gtk_list_store_insert_before (store, &iter2, NULL);
431 g_assert (gtk_list_store_iter_is_valid (store, &iter2));
432 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 2);
434 /* Walk over the model */
435 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter_copy));
436 g_assert (iters_equal (&iter, &iter_copy));
437 g_assert (iter_position (store, &iter, 0));
439 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
440 g_assert (iters_equal (&iter2, &iter_copy));
441 g_assert (iter_position (store, &iter2, 1));
443 g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
445 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
446 g_assert (iters_equal (&iter2, &iter_copy));
447 g_assert (iter_position (store, &iter2, 1));
449 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
450 g_assert (iters_equal (&iter, &iter_copy));
451 g_assert (iter_position (store, &iter, 0));
453 g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
455 g_object_unref (store);
460 list_store_test_remove_begin (ListStore *fixture,
461 gconstpointer user_data)
463 int new_order[5] = { -1, 1, 2, 3, 4 };
467 /* Remove node at 0 */
468 path = gtk_tree_path_new_from_indices (0, -1);
469 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
470 gtk_tree_path_free (path);
472 g_assert (gtk_list_store_remove (fixture->store, &iter) == TRUE);
473 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[0]));
474 g_assert (iters_equal (&iter, &fixture->iter[1]));
476 check_model (fixture, new_order, 0);
480 list_store_test_remove_middle (ListStore *fixture,
481 gconstpointer user_data)
483 int new_order[5] = { 0, 1, -1, 3, 4 };
487 /* Remove node at 2 */
488 path = gtk_tree_path_new_from_indices (2, -1);
489 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
490 gtk_tree_path_free (path);
492 g_assert (gtk_list_store_remove (fixture->store, &iter) == TRUE);
493 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[2]));
494 g_assert (iters_equal (&iter, &fixture->iter[3]));
496 check_model (fixture, new_order, 2);
500 list_store_test_remove_end (ListStore *fixture,
501 gconstpointer user_data)
503 int new_order[5] = { 0, 1, 2, 3, -1 };
507 /* Remove node at 4 */
508 path = gtk_tree_path_new_from_indices (4, -1);
509 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
510 gtk_tree_path_free (path);
512 g_assert (gtk_list_store_remove (fixture->store, &iter) == FALSE);
513 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[4]));
515 check_model (fixture, new_order, 4);
519 list_store_test_clear (ListStore *fixture,
520 gconstpointer user_data)
524 gtk_list_store_clear (fixture->store);
526 g_assert (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (fixture->store), NULL) == 0);
528 for (i = 0; i < 5; i++)
529 g_assert (!gtk_list_store_iter_is_valid (fixture->store, &fixture->iter[i]));
535 list_store_test_reorder (ListStore *fixture,
536 gconstpointer user_data)
538 int new_order[5] = { 4, 1, 0, 2, 3 };
540 gtk_list_store_reorder (fixture->store, new_order);
541 check_model (fixture, new_order, -1);
547 list_store_test_swap_begin (ListStore *fixture,
548 gconstpointer user_data)
550 /* We swap nodes 0 and 1 at the beginning */
551 int new_order[5] = { 1, 0, 2, 3, 4 };
556 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "0"));
557 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "1"));
559 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
560 check_model (fixture, new_order, -1);
564 list_store_test_swap_middle_next (ListStore *fixture,
565 gconstpointer user_data)
567 /* We swap nodes 2 and 3 in the middle that are next to each other */
568 int new_order[5] = { 0, 1, 3, 2, 4 };
573 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "2"));
574 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
576 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
577 check_model (fixture, new_order, -1);
581 list_store_test_swap_middle_apart (ListStore *fixture,
582 gconstpointer user_data)
584 /* We swap nodes 1 and 3 in the middle that are apart from each other */
585 int new_order[5] = { 0, 3, 2, 1, 4 };
590 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "1"));
591 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "3"));
593 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
594 check_model (fixture, new_order, -1);
598 list_store_test_swap_end (ListStore *fixture,
599 gconstpointer user_data)
601 /* We swap nodes 3 and 4 at the end */
602 int new_order[5] = { 0, 1, 2, 4, 3 };
607 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_a, "3"));
608 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter_b, "4"));
610 gtk_list_store_swap (fixture->store, &iter_a, &iter_b);
611 check_model (fixture, new_order, -1);
615 list_store_test_swap_single (void)
618 GtkTreeIter iter_copy;
621 store = gtk_list_store_new (1, G_TYPE_INT);
623 /* Check if swap on a store with a single node does not corrupt
627 gtk_list_store_append (store, &iter);
630 gtk_list_store_swap (store, &iter, &iter);
631 g_assert (iters_equal (&iter, &iter_copy));
632 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
633 g_assert (iters_equal (&iter, &iter_copy));
635 g_object_unref (store);
641 list_store_test_move_after_from_start (ListStore *fixture,
642 gconstpointer user_data)
644 /* We move node 0 after 2 */
645 int new_order[5] = { 1, 2, 0, 3, 4 };
648 GtkTreeIter position;
650 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
651 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
653 gtk_list_store_move_after (fixture->store, &iter, &position);
654 check_model (fixture, new_order, -1);
658 list_store_test_move_after_next (ListStore *fixture,
659 gconstpointer user_data)
661 /* We move node 2 after 3 */
662 int new_order[5] = { 0, 1, 3, 2, 4 };
665 GtkTreeIter position;
667 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
668 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
670 gtk_list_store_move_after (fixture->store, &iter, &position);
671 check_model (fixture, new_order, -1);
675 list_store_test_move_after_apart (ListStore *fixture,
676 gconstpointer user_data)
678 /* We move node 1 after 3 */
679 int new_order[5] = { 0, 2, 3, 1, 4 };
682 GtkTreeIter position;
684 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
685 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
687 gtk_list_store_move_after (fixture->store, &iter, &position);
688 check_model (fixture, new_order, -1);
692 list_store_test_move_after_end (ListStore *fixture,
693 gconstpointer user_data)
695 /* We move node 2 after 4 */
696 int new_order[5] = { 0, 1, 3, 4, 2 };
699 GtkTreeIter position;
701 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
702 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
704 gtk_list_store_move_after (fixture->store, &iter, &position);
705 check_model (fixture, new_order, -1);
709 list_store_test_move_after_from_end (ListStore *fixture,
710 gconstpointer user_data)
712 /* We move node 4 after 1 */
713 int new_order[5] = { 0, 1, 4, 2, 3 };
716 GtkTreeIter position;
718 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
719 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "1"));
721 gtk_list_store_move_after (fixture->store, &iter, &position);
722 check_model (fixture, new_order, -1);
726 list_store_test_move_after_change_ends (ListStore *fixture,
727 gconstpointer user_data)
729 /* We move 0 after 4, this will cause both the head and tail ends to
732 int new_order[5] = { 1, 2, 3, 4, 0 };
735 GtkTreeIter position;
737 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "0"));
738 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "4"));
740 gtk_list_store_move_after (fixture->store, &iter, &position);
741 check_model (fixture, new_order, -1);
745 list_store_test_move_after_NULL (ListStore *fixture,
746 gconstpointer user_data)
748 /* We move node 2, NULL should prepend */
749 int new_order[5] = { 2, 0, 1, 3, 4 };
753 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
755 gtk_list_store_move_after (fixture->store, &iter, NULL);
756 check_model (fixture, new_order, -1);
760 list_store_test_move_after_single (void)
763 GtkTreeIter iter_copy;
766 store = gtk_list_store_new (1, G_TYPE_INT);
768 /* Check if move-after on a store with a single node does not corrupt
772 gtk_list_store_append (store, &iter);
775 gtk_list_store_move_after (store, &iter, NULL);
776 g_assert (iters_equal (&iter, &iter_copy));
777 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
778 g_assert (iters_equal (&iter, &iter_copy));
780 gtk_list_store_move_after (store, &iter, &iter);
781 g_assert (iters_equal (&iter, &iter_copy));
782 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
783 g_assert (iters_equal (&iter, &iter_copy));
785 g_object_unref (store);
791 list_store_test_move_before_next (ListStore *fixture,
792 gconstpointer user_data)
794 /* We move node 3 before 2 */
795 int new_order[5] = { 0, 1, 3, 2, 4 };
798 GtkTreeIter position;
800 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "3"));
801 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
803 gtk_list_store_move_before (fixture->store, &iter, &position);
804 check_model (fixture, new_order, -1);
808 list_store_test_move_before_apart (ListStore *fixture,
809 gconstpointer user_data)
811 /* We move node 1 before 3 */
812 int new_order[5] = { 0, 2, 1, 3, 4 };
815 GtkTreeIter position;
817 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "1"));
818 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "3"));
820 gtk_list_store_move_before (fixture->store, &iter, &position);
821 check_model (fixture, new_order, -1);
825 list_store_test_move_before_to_start (ListStore *fixture,
826 gconstpointer user_data)
828 /* We move node 2 before 0 */
829 int new_order[5] = { 2, 0, 1, 3, 4 };
832 GtkTreeIter position;
834 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
835 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
837 gtk_list_store_move_before (fixture->store, &iter, &position);
838 check_model (fixture, new_order, -1);
842 list_store_test_move_before_from_end (ListStore *fixture,
843 gconstpointer user_data)
845 /* We move node 4 before 2 (replace end) */
846 int new_order[5] = { 0, 1, 4, 2, 3 };
849 GtkTreeIter position;
851 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
852 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "2"));
854 gtk_list_store_move_before (fixture->store, &iter, &position);
855 check_model (fixture, new_order, -1);
859 list_store_test_move_before_change_ends (ListStore *fixture,
860 gconstpointer user_data)
862 /* We move node 4 before 0 */
863 int new_order[5] = { 4, 0, 1, 2, 3 };
866 GtkTreeIter position;
868 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "4"));
869 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &position, "0"));
871 gtk_list_store_move_before (fixture->store, &iter, &position);
872 check_model (fixture, new_order, -1);
876 list_store_test_move_before_NULL (ListStore *fixture,
877 gconstpointer user_data)
879 /* We move node 2, NULL should append */
880 int new_order[5] = { 0, 1, 3, 4, 2 };
884 g_assert (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store), &iter, "2"));
886 gtk_list_store_move_before (fixture->store, &iter, NULL);
887 check_model (fixture, new_order, -1);
891 list_store_test_move_before_single (void)
894 GtkTreeIter iter_copy;
897 store = gtk_list_store_new (1, G_TYPE_INT);
899 /* Check if move-before on a store with a single node does not corrupt
903 gtk_list_store_append (store, &iter);
906 gtk_list_store_move_before (store, &iter, NULL);
907 g_assert (iters_equal (&iter, &iter_copy));
908 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
909 g_assert (iters_equal (&iter, &iter_copy));
911 gtk_list_store_move_before (store, &iter, &iter);
912 g_assert (iters_equal (&iter, &iter_copy));
913 g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter));
914 g_assert (iters_equal (&iter, &iter_copy));
916 g_object_unref (store);
920 /* iter invalidation */
923 list_store_test_iter_previous_invalid (ListStore *fixture,
924 gconstpointer user_data)
928 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
930 g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (fixture->store),
932 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
933 g_assert (iter.stamp == 0);
937 list_store_test_iter_next_invalid (ListStore *fixture,
938 gconstpointer user_data)
943 path = gtk_tree_path_new_from_indices (4, -1);
944 gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &iter, path);
945 gtk_tree_path_free (path);
947 g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store),
949 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
950 g_assert (iter.stamp == 0);
954 list_store_test_iter_children_invalid (ListStore *fixture,
955 gconstpointer user_data)
957 GtkTreeIter iter, child;
959 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
960 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == TRUE);
962 g_assert (gtk_tree_model_iter_children (GTK_TREE_MODEL (fixture->store),
963 &child, &iter) == FALSE);
964 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == FALSE);
965 g_assert (child.stamp == 0);
969 list_store_test_iter_nth_child_invalid (ListStore *fixture,
970 gconstpointer user_data)
972 GtkTreeIter iter, child;
974 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
975 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == TRUE);
977 g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (fixture->store),
978 &child, &iter, 0) == FALSE);
979 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == FALSE);
980 g_assert (child.stamp == 0);
984 list_store_test_iter_parent_invalid (ListStore *fixture,
985 gconstpointer user_data)
987 GtkTreeIter iter, child;
989 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &child);
990 g_assert (gtk_list_store_iter_is_valid (fixture->store, &child) == TRUE);
992 g_assert (gtk_tree_model_iter_parent (GTK_TREE_MODEL (fixture->store),
993 &iter, &child) == FALSE);
994 g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
995 g_assert (iter.stamp == 0);
1002 register_list_store_tests (void)
1005 g_test_add_func ("/ListStore/insert-high-values",
1006 list_store_test_insert_high_values);
1007 g_test_add_func ("/ListStore/append",
1008 list_store_test_append);
1009 g_test_add_func ("/ListStore/prepend",
1010 list_store_test_prepend);
1011 g_test_add_func ("/ListStore/insert-after",
1012 list_store_test_insert_after);
1013 g_test_add_func ("/ListStore/insert-after-NULL",
1014 list_store_test_insert_after_NULL);
1015 g_test_add_func ("/ListStore/insert-before",
1016 list_store_test_insert_before);
1017 g_test_add_func ("/ListStore/insert-before-NULL",
1018 list_store_test_insert_before_NULL);
1020 /* setting values (FIXME) */
1023 g_test_add ("/ListStore/remove-begin", ListStore, NULL,
1024 list_store_setup, list_store_test_remove_begin,
1025 list_store_teardown);
1026 g_test_add ("/ListStore/remove-middle", ListStore, NULL,
1027 list_store_setup, list_store_test_remove_middle,
1028 list_store_teardown);
1029 g_test_add ("/ListStore/remove-end", ListStore, NULL,
1030 list_store_setup, list_store_test_remove_end,
1031 list_store_teardown);
1033 g_test_add ("/ListStore/clear", ListStore, NULL,
1034 list_store_setup, list_store_test_clear,
1035 list_store_teardown);
1038 g_test_add ("/ListStore/reorder", ListStore, NULL,
1039 list_store_setup, list_store_test_reorder,
1040 list_store_teardown);
1043 g_test_add ("/ListStore/swap-begin", ListStore, NULL,
1044 list_store_setup, list_store_test_swap_begin,
1045 list_store_teardown);
1046 g_test_add ("/ListStore/swap-middle-next", ListStore, NULL,
1047 list_store_setup, list_store_test_swap_middle_next,
1048 list_store_teardown);
1049 g_test_add ("/ListStore/swap-middle-apart", ListStore, NULL,
1050 list_store_setup, list_store_test_swap_middle_apart,
1051 list_store_teardown);
1052 g_test_add ("/ListStore/swap-end", ListStore, NULL,
1053 list_store_setup, list_store_test_swap_end,
1054 list_store_teardown);
1055 g_test_add_func ("/ListStore/swap-single",
1056 list_store_test_swap_single);
1059 g_test_add ("/ListStore/move-after-from-start", ListStore, NULL,
1060 list_store_setup, list_store_test_move_after_from_start,
1061 list_store_teardown);
1062 g_test_add ("/ListStore/move-after-next", ListStore, NULL,
1063 list_store_setup, list_store_test_move_after_next,
1064 list_store_teardown);
1065 g_test_add ("/ListStore/move-after-apart", ListStore, NULL,
1066 list_store_setup, list_store_test_move_after_apart,
1067 list_store_teardown);
1068 g_test_add ("/ListStore/move-after-end", ListStore, NULL,
1069 list_store_setup, list_store_test_move_after_end,
1070 list_store_teardown);
1071 g_test_add ("/ListStore/move-after-from-end", ListStore, NULL,
1072 list_store_setup, list_store_test_move_after_from_end,
1073 list_store_teardown);
1074 g_test_add ("/ListStore/move-after-change-ends", ListStore, NULL,
1075 list_store_setup, list_store_test_move_after_change_ends,
1076 list_store_teardown);
1077 g_test_add ("/ListStore/move-after-NULL", ListStore, NULL,
1078 list_store_setup, list_store_test_move_after_NULL,
1079 list_store_teardown);
1080 g_test_add_func ("/ListStore/move-after-single",
1081 list_store_test_move_after_single);
1083 g_test_add ("/ListStore/move-before-next", ListStore, NULL,
1084 list_store_setup, list_store_test_move_before_next,
1085 list_store_teardown);
1086 g_test_add ("/ListStore/move-before-apart", ListStore, NULL,
1087 list_store_setup, list_store_test_move_before_apart,
1088 list_store_teardown);
1089 g_test_add ("/ListStore/move-before-to-start", ListStore, NULL,
1090 list_store_setup, list_store_test_move_before_to_start,
1091 list_store_teardown);
1092 g_test_add ("/ListStore/move-before-from-end", ListStore, NULL,
1093 list_store_setup, list_store_test_move_before_from_end,
1094 list_store_teardown);
1095 g_test_add ("/ListStore/move-before-change-ends", ListStore, NULL,
1096 list_store_setup, list_store_test_move_before_change_ends,
1097 list_store_teardown);
1098 g_test_add ("/ListStore/move-before-NULL", ListStore, NULL,
1099 list_store_setup, list_store_test_move_before_NULL,
1100 list_store_teardown);
1101 g_test_add_func ("/ListStore/move-before-single",
1102 list_store_test_move_before_single);
1104 /* iter invalidation */
1105 g_test_add ("/ListStore/iter-prev-invalid", ListStore, NULL,
1106 list_store_setup, list_store_test_iter_previous_invalid,
1107 list_store_teardown);
1108 g_test_add ("/ListStore/iter-next-invalid", ListStore, NULL,
1109 list_store_setup, list_store_test_iter_next_invalid,
1110 list_store_teardown);
1111 g_test_add ("/ListStore/iter-children-invalid", ListStore, NULL,
1112 list_store_setup, list_store_test_iter_children_invalid,
1113 list_store_teardown);
1114 g_test_add ("/ListStore/iter-nth-child-invalid", ListStore, NULL,
1115 list_store_setup, list_store_test_iter_nth_child_invalid,
1116 list_store_teardown);
1117 g_test_add ("/ListStore/iter-parent-invalid", ListStore, NULL,
1118 list_store_setup, list_store_test_iter_parent_invalid,
1119 list_store_teardown);