5 /* Keep this in sync with gsequence.c !!! */
6 typedef struct _GSequenceNode GSequenceNode;
10 GSequenceNode * end_node;
11 GDestroyNotify data_destroy_notify;
12 gboolean access_prohibited;
13 GSequence * real_sequence;
20 GSequenceNode * parent;
22 GSequenceNode * right;
27 get_priority (GSequenceNode *node)
29 guint key = node->priority;
31 /* We rely on 0 being less than all other priorities */
36 check_node (GSequenceNode *node)
40 g_assert (node->parent != node);
42 g_assert (node->parent->left == node || node->parent->right == node);
43 g_assert (node->n_nodes == 1 + (node->left ? node->left->n_nodes : 0) + (node->right ? node->right->n_nodes : 0));
45 g_assert (get_priority (node) >= get_priority (node->left));
47 g_assert (get_priority (node) >= get_priority (node->right));
48 check_node (node->left);
49 check_node (node->right);
54 g_sequence_check (GSequence *seq)
56 GSequenceNode *node = seq->end_node;
66 g_assert (seq->end_node == node);
67 g_assert (node->data == seq);
73 NEW, FREE, GET_LENGTH, FOREACH, FOREACH_RANGE, SORT, SORT_ITER,
76 GET_BEGIN_ITER, GET_END_ITER, GET_ITER_AT_POS, APPEND, PREPEND,
77 INSERT_BEFORE, MOVE, SWAP, INSERT_SORTED, INSERT_SORTED_ITER, SORT_CHANGED,
78 SORT_CHANGED_ITER, REMOVE, REMOVE_RANGE, MOVE_RANGE, SEARCH, SEARCH_ITER,
84 /* operations on GSequenceIter * */
85 ITER_IS_BEGIN, ITER_IS_END, ITER_NEXT, ITER_PREV, ITER_GET_POSITION,
86 ITER_MOVE, ITER_GET_SEQUENCE,
89 ITER_COMPARE, RANGE_GET_MIDPOINT,
93 typedef struct SequenceInfo
106 void g_sequence_check (GSequence *sequence);
109 fix_pointer (gconstpointer data)
111 return (Item *)((char *)data - 1);
115 get_item (GSequenceIter *iter)
117 return fix_pointer (g_sequence_get (iter));
121 check_integrity (SequenceInfo *info)
127 g_sequence_check (info->sequence);
130 if (g_sequence_get_length (info->sequence) != info->n_items)
131 g_printerr ("%d %d\n",
132 g_sequence_get_length (info->sequence), info->n_items);
134 g_assert (info->n_items == g_queue_get_length (info->queue));
135 g_assert ((guint) g_sequence_get_length (info->sequence) == info->n_items);
137 iter = g_sequence_get_begin_iter (info->sequence);
138 list = info->queue->head;
140 while (iter != g_sequence_get_end_iter (info->sequence))
143 g_assert (list->data == iter);
144 item = get_item (list->data);
145 g_assert (item->seq == info);
147 iter = g_sequence_iter_next (iter);
152 g_assert_cmpuint (i, ==, info->n_items);
153 g_assert (info->n_items == g_queue_get_length (info->queue));
154 g_assert ((guint) g_sequence_get_length (info->sequence) == info->n_items);
158 new_item (SequenceInfo *seq)
160 Item *item = g_new (Item, 1);
163 item->number = g_random_int ();
165 /* There have been bugs in the past where the GSequence would
166 * dereference the user pointers. This will make sure such
167 * behavior causes crashes
169 return ((char *)item + 1);
173 free_item (gpointer data)
175 Item *item = fix_pointer (data);
176 item->seq->n_items--;
181 seq_foreach (gpointer data,
184 Item *item = fix_pointer (data);
185 GList **link = user_data;
188 g_assert (*link != NULL);
190 iter = (*link)->data;
192 g_assert (get_item (iter) == item);
194 item->number = g_random_int();
196 *link = (*link)->next;
200 simple_items_cmp (gconstpointer a,
204 const Item *item_a = fix_pointer (a);
205 const Item *item_b = fix_pointer (b);
207 if (item_a->number > item_b->number)
209 else if (item_a->number < item_b->number)
216 simple_iters_cmp (gconstpointer a,
220 GSequence *seq = data;
221 GSequenceIter *iter_a = (GSequenceIter *)a;
222 GSequenceIter *iter_b = (GSequenceIter *)b;
223 gpointer item_a = g_sequence_get (iter_a);
224 gpointer item_b = g_sequence_get (iter_b);
228 g_assert (g_sequence_iter_get_sequence (iter_a) == seq);
229 g_assert (g_sequence_iter_get_sequence (iter_b) == seq);
232 return simple_items_cmp (item_a, item_b, data);
236 compare_items (gconstpointer a,
240 const Item *item_a = fix_pointer (a);
241 const Item *item_b = fix_pointer (b);
243 if (item_a->number < item_b->number)
247 else if (item_a->number == item_b->number)
249 /* Force an arbitrary order on the items
250 * We have to do this, since g_queue_insert_sorted() and
251 * g_sequence_insert_sorted() do not agree on the exact
252 * position the item is inserted if the new item is
253 * equal to an existing one.
257 else if (item_a == item_b)
269 check_sorted (SequenceInfo *info)
273 GSequenceIter *last_iter;
275 check_integrity (info);
279 for (list = info->queue->head; list != NULL; list = list->next)
281 GSequenceIter *iter = list->data;
282 Item *item = get_item (iter);
284 g_assert (item->number >= last);
285 /* Check that the ordering is the same as that of the queue,
286 * ie. that the sort is stable
289 g_assert (iter == g_sequence_iter_next (last_iter));
297 compare_iters (gconstpointer a,
301 GSequence *seq = data;
302 GSequenceIter *iter_a = (GSequenceIter *)a;
303 GSequenceIter *iter_b = (GSequenceIter *)b;
304 /* compare_items() will fix up the pointers */
305 Item *item_a = g_sequence_get (iter_a);
306 Item *item_b = g_sequence_get (iter_b);
310 g_assert (g_sequence_iter_get_sequence (iter_a) == seq);
311 g_assert (g_sequence_iter_get_sequence (iter_b) == seq);
314 return compare_items (item_a, item_b, data);
317 /* A version of g_queue_link_index() that treats NULL as just
321 queue_link_index (SequenceInfo *seq, GList *link)
324 return g_queue_link_index (seq->queue, link);
326 return g_queue_get_length (seq->queue);
330 get_random_range (SequenceInfo *seq,
331 GSequenceIter **begin_iter,
332 GSequenceIter **end_iter,
336 int length = g_queue_get_length (seq->queue);
337 int b = g_random_int_range (0, length + 1);
338 int e = g_random_int_range (b, length + 1);
340 g_assert (length == g_sequence_get_length (seq->sequence));
343 *begin_iter = g_sequence_get_iter_at_pos (seq->sequence, b);
345 *end_iter = g_sequence_get_iter_at_pos (seq->sequence, e);
347 *begin_link = g_queue_peek_nth_link (seq->queue, b);
349 *end_link = g_queue_peek_nth_link (seq->queue, e);
350 if (begin_iter && begin_link)
353 queue_link_index (seq, *begin_link) ==
354 g_sequence_iter_get_position (*begin_iter));
356 if (end_iter && end_link)
359 queue_link_index (seq, *end_link) ==
360 g_sequence_iter_get_position (*end_iter));
365 get_random_position (SequenceInfo *seq)
367 int length = g_queue_get_length (seq->queue);
369 g_assert (length == g_sequence_get_length (seq->sequence));
371 return g_random_int_range (-2, length + 5);
374 static GSequenceIter *
375 get_random_iter (SequenceInfo *seq,
379 int pos = get_random_position (seq);
381 *link = g_queue_peek_nth_link (seq->queue, pos);
382 iter = g_sequence_get_iter_at_pos (seq->sequence, pos);
384 g_assert (queue_link_index (seq, *link) == g_sequence_iter_get_position (iter));
389 dump_info (SequenceInfo *seq)
395 iter = g_sequence_get_begin_iter (seq->sequence);
396 list = seq->queue->head;
398 while (iter != g_sequence_get_end_iter (seq->sequence))
400 Item *item = get_item (iter);
401 g_printerr ("%p %p %d\n", list->data, iter, item->number);
403 iter = g_sequence_iter_next (iter);
410 run_random_tests (gconstpointer d)
412 guint32 seed = GPOINTER_TO_UINT (d);
413 #define N_ITERATIONS 60000
414 #define N_SEQUENCES 8
417 SequenceInfo sequences[N_SEQUENCES];
421 g_printerr (" seed: %u\n", seed);
424 g_random_set_seed (seed);
426 for (k = 0; k < N_SEQUENCES; ++k)
428 sequences[k].queue = g_queue_new ();
429 sequences[k].sequence = g_sequence_new (free_item);
430 sequences[k].n_items = 0;
433 #define RANDOM_SEQUENCE() &(sequences[g_random_int_range (0, N_SEQUENCES)])
435 for (k = 0; k < N_ITERATIONS; ++k)
438 SequenceInfo *seq = RANDOM_SEQUENCE();
439 int op = g_random_int_range (0, N_OPS);
442 g_printerr ("%d on %p\n", op, seq);
450 g_queue_free (seq->queue);
451 g_sequence_free (seq->sequence);
453 g_assert (seq->n_items == 0);
455 seq->queue = g_queue_new ();
456 seq->sequence = g_sequence_new (free_item);
458 check_integrity (seq);
463 int slen = g_sequence_get_length (seq->sequence);
464 int qlen = g_queue_get_length (seq->queue);
466 g_assert (slen == qlen);
471 GList *link = seq->queue->head;
472 g_sequence_foreach (seq->sequence, seq_foreach, &link);
473 g_assert (link == NULL);
478 GSequenceIter *begin_iter, *end_iter;
479 GList *begin_link, *end_link;
481 get_random_range (seq, &begin_iter, &end_iter, &begin_link, &end_link);
483 check_integrity (seq);
485 g_sequence_foreach_range (begin_iter, end_iter, seq_foreach, &begin_link);
487 g_assert (begin_link == end_link);
494 g_sequence_sort (seq->sequence, compare_items, NULL);
495 g_queue_sort (seq->queue, compare_iters, NULL);
504 check_integrity (seq);
505 g_sequence_sort_iter (seq->sequence,
506 (GSequenceIterCompareFunc)compare_iters, seq->sequence);
507 g_queue_sort (seq->queue, compare_iters, NULL);
516 GSequenceIter *begin_iter;
517 GSequenceIter *end_iter;
518 GSequenceIter *penultimate_iter;
520 begin_iter = g_sequence_get_begin_iter (seq->sequence);
521 check_integrity (seq);
523 end_iter = g_sequence_get_end_iter (seq->sequence);
524 check_integrity (seq);
526 penultimate_iter = g_sequence_iter_prev (end_iter);
527 check_integrity (seq);
529 if (g_sequence_get_length (seq->sequence) > 0)
531 g_assert (seq->queue->head);
532 g_assert (seq->queue->head->data == begin_iter);
533 g_assert (seq->queue->tail);
534 g_assert (seq->queue->tail->data == penultimate_iter);
538 g_assert (penultimate_iter == end_iter);
539 g_assert (begin_iter == end_iter);
540 g_assert (penultimate_iter == begin_iter);
541 g_assert (seq->queue->head == NULL);
542 g_assert (seq->queue->tail == NULL);
546 case GET_ITER_AT_POS:
548 g_assert (g_queue_get_length (seq->queue) == (guint) g_sequence_get_length (seq->sequence));
550 for (i = 0; i < 10; ++i)
552 int pos = get_random_position (seq);
553 GSequenceIter *iter = g_sequence_get_iter_at_pos (seq->sequence, pos);
554 GList *link = g_queue_peek_nth_link (seq->queue, pos);
555 check_integrity (seq);
556 if (pos >= g_sequence_get_length (seq->sequence) || pos < 0)
558 g_assert (iter == g_sequence_get_end_iter (seq->sequence));
559 g_assert (link == NULL);
564 g_assert (link->data == iter);
571 for (i = 0; i < 10; ++i)
573 GSequenceIter *iter = g_sequence_append (seq->sequence, new_item (seq));
574 g_queue_push_tail (seq->queue, iter);
580 for (i = 0; i < 10; ++i)
582 GSequenceIter *iter = g_sequence_prepend (seq->sequence, new_item (seq));
583 g_queue_push_head (seq->queue, iter);
589 for (i = 0; i < 10; ++i)
592 GSequenceIter *iter = get_random_iter (seq, &link);
593 GSequenceIter *new_iter;
594 check_integrity (seq);
596 new_iter = g_sequence_insert_before (iter, new_item (seq));
598 g_queue_insert_before (seq->queue, link, new_iter);
604 GList *link1, *link2;
605 SequenceInfo *seq1 = RANDOM_SEQUENCE();
606 SequenceInfo *seq2 = RANDOM_SEQUENCE();
607 GSequenceIter *iter1 = get_random_iter (seq1, &link1);
608 GSequenceIter *iter2 = get_random_iter (seq2, &link2);
610 if (!g_sequence_iter_is_end (iter1))
612 g_sequence_move (iter1, iter2);
615 g_assert (g_sequence_iter_is_end (iter2));
617 g_queue_insert_before (seq2->queue, link2, link1->data);
619 g_queue_delete_link (seq1->queue, link1);
621 get_item (iter1)->seq = seq2;
627 check_integrity (seq);
629 iter1 = get_random_iter (seq, NULL);
631 /* Moving an iter to itself should have no effect */
632 if (!g_sequence_iter_is_end (iter1))
633 g_sequence_move (iter1, iter1);
638 GList *link1, *link2;
639 SequenceInfo *seq1 = RANDOM_SEQUENCE();
640 SequenceInfo *seq2 = RANDOM_SEQUENCE();
641 GSequenceIter *iter1 = get_random_iter (seq1, &link1);
642 GSequenceIter *iter2 = get_random_iter (seq2, &link2);
644 if (!g_sequence_iter_is_end (iter1) &&
645 !g_sequence_iter_is_end (iter2))
649 g_sequence_swap (iter1, iter2);
651 get_item (iter1)->seq = seq2;
652 get_item (iter2)->seq = seq1;
655 link1->data = link2->data;
664 g_sequence_sort (seq->sequence, compare_items, NULL);
665 g_queue_sort (seq->queue, compare_iters, NULL);
669 for (i = 0; i < N_TIMES; ++i)
671 GSequenceIter *iter =
672 g_sequence_insert_sorted (seq->sequence, new_item(seq), compare_items, NULL);
674 g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
682 case INSERT_SORTED_ITER:
686 g_sequence_sort (seq->sequence, compare_items, NULL);
687 g_queue_sort (seq->queue, compare_iters, NULL);
691 for (i = 0; i < N_TIMES; ++i)
695 iter = g_sequence_insert_sorted_iter (seq->sequence,
697 (GSequenceIterCompareFunc)compare_iters,
700 g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
710 g_sequence_sort (seq->sequence, compare_items, NULL);
711 g_queue_sort (seq->queue, compare_iters, NULL);
715 for (i = 0; i < N_TIMES; ++i)
718 GSequenceIter *iter = get_random_iter (seq, &link);
720 if (!g_sequence_iter_is_end (iter))
722 g_sequence_set (iter, new_item (seq));
723 g_sequence_sort_changed (iter, compare_items, NULL);
725 g_queue_delete_link (seq->queue, link);
726 g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
733 case SORT_CHANGED_ITER:
735 g_sequence_sort (seq->sequence, compare_items, NULL);
736 g_queue_sort (seq->queue, compare_iters, NULL);
740 for (i = 0; i < N_TIMES; ++i)
743 GSequenceIter *iter = get_random_iter (seq, &link);
745 if (!g_sequence_iter_is_end (iter))
747 g_sequence_set (iter, new_item (seq));
748 g_sequence_sort_changed_iter (iter,
749 (GSequenceIterCompareFunc)compare_iters, seq->sequence);
751 g_queue_delete_link (seq->queue, link);
752 g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
761 for (i = 0; i < N_TIMES; ++i)
764 GSequenceIter *iter = get_random_iter (seq, &link);
766 if (!g_sequence_iter_is_end (iter))
768 g_sequence_remove (iter);
769 g_queue_delete_link (seq->queue, link);
776 GSequenceIter *begin_iter, *end_iter;
777 GList *begin_link, *end_link;
780 get_random_range (seq, &begin_iter, &end_iter, &begin_link, &end_link);
782 g_sequence_remove_range (begin_iter, end_iter);
785 while (list != end_link)
787 GList *next = list->next;
789 g_queue_delete_link (seq->queue, list);
797 SequenceInfo *src = RANDOM_SEQUENCE();
798 SequenceInfo *dst = RANDOM_SEQUENCE();
800 GSequenceIter *begin_iter, *end_iter;
801 GList *begin_link, *end_link;
803 GSequenceIter *dst_iter;
808 g_assert (src->queue);
809 g_assert (dst->queue);
811 get_random_range (src, &begin_iter, &end_iter, &begin_link, &end_link);
812 dst_iter = get_random_iter (dst, &dst_link);
814 g_sequence_move_range (dst_iter, begin_iter, end_iter);
816 if (dst_link == begin_link || (src == dst && dst_link == end_link))
818 check_integrity (src);
819 check_integrity (dst);
823 if (queue_link_index (src, begin_link) >=
824 queue_link_index (src, end_link))
830 queue_link_index (src, dst_link) >= queue_link_index (src, begin_link) &&
831 queue_link_index (src, dst_link) <= queue_link_index (src, end_link))
837 while (list != end_link)
839 GList *next = list->next;
840 Item *item = get_item (list->data);
842 g_assert (dst->queue);
843 g_queue_insert_before (dst->queue, dst_link, list->data);
844 g_queue_delete_link (src->queue, list);
846 g_assert (item->seq == src);
859 GSequenceIter *search_iter;
860 GSequenceIter *insert_iter;
862 g_sequence_sort (seq->sequence, compare_items, NULL);
863 g_queue_sort (seq->queue, compare_iters, NULL);
867 item = new_item (seq);
868 search_iter = g_sequence_search (seq->sequence, item, compare_items, NULL);
870 insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL);
872 g_assert (search_iter == g_sequence_iter_next (insert_iter));
874 g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL);
880 GSequenceIter *search_iter;
881 GSequenceIter *insert_iter;
883 g_sequence_sort (seq->sequence, compare_items, NULL);
884 g_queue_sort (seq->queue, compare_iters, NULL);
888 item = new_item (seq);
889 search_iter = g_sequence_search_iter (seq->sequence,
891 (GSequenceIterCompareFunc)compare_iters, seq->sequence);
893 insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL);
895 g_assert (search_iter == g_sequence_iter_next (insert_iter));
897 g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL);
903 GSequenceIter *lookup_iter;
904 GSequenceIter *insert_iter;
906 g_sequence_sort (seq->sequence, compare_items, NULL);
907 g_queue_sort (seq->queue, compare_iters, NULL);
911 item = new_item (seq);
912 insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL);
913 g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL);
915 lookup_iter = g_sequence_lookup (seq->sequence, item, simple_items_cmp, NULL);
916 g_assert (simple_iters_cmp (insert_iter, lookup_iter, NULL) == 0);
922 GSequenceIter *lookup_iter;
923 GSequenceIter *insert_iter;
925 g_sequence_sort (seq->sequence, compare_items, NULL);
926 g_queue_sort (seq->queue, compare_iters, NULL);
930 item = new_item (seq);
931 insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL);
932 g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL);
934 lookup_iter = g_sequence_lookup_iter (seq->sequence, item,
935 (GSequenceIterCompareFunc) simple_iters_cmp, NULL);
936 g_assert (simple_iters_cmp (insert_iter, lookup_iter, NULL) == 0);
947 iter = get_random_iter (seq, &link);
949 if (!g_sequence_iter_is_end (iter))
953 check_integrity (seq);
955 /* Test basic functionality */
956 item = new_item (seq);
957 g_sequence_set (iter, item);
958 g_assert (g_sequence_get (iter) == item);
960 /* Make sure that existing items are freed */
961 for (i = 0; i < N_TIMES; ++i)
962 g_sequence_set (iter, new_item (seq));
964 check_integrity (seq);
966 g_sequence_set (iter, new_item (seq));
971 /* operations on GSequenceIter * */
976 iter = g_sequence_get_iter_at_pos (seq->sequence, 0);
978 g_assert (g_sequence_iter_is_begin (iter));
980 check_integrity (seq);
982 if (g_sequence_get_length (seq->sequence) > 0)
984 g_assert (!g_sequence_iter_is_begin (g_sequence_get_end_iter (seq->sequence)));
988 g_assert (g_sequence_iter_is_begin (g_sequence_get_end_iter (seq->sequence)));
991 g_assert (g_sequence_iter_is_begin (g_sequence_get_begin_iter (seq->sequence)));
997 int len = g_sequence_get_length (seq->sequence);
999 iter = g_sequence_get_iter_at_pos (seq->sequence, len);
1001 g_assert (g_sequence_iter_is_end (iter));
1005 g_assert (!g_sequence_iter_is_end (g_sequence_get_begin_iter (seq->sequence)));
1009 g_assert (g_sequence_iter_is_end (g_sequence_get_begin_iter (seq->sequence)));
1012 g_assert (g_sequence_iter_is_end (g_sequence_get_end_iter (seq->sequence)));
1017 GSequenceIter *iter1, *iter2, *iter3, *end;
1019 iter1 = g_sequence_append (seq->sequence, new_item (seq));
1020 iter2 = g_sequence_append (seq->sequence, new_item (seq));
1021 iter3 = g_sequence_append (seq->sequence, new_item (seq));
1023 end = g_sequence_get_end_iter (seq->sequence);
1025 g_assert (g_sequence_iter_next (iter1) == iter2);
1026 g_assert (g_sequence_iter_next (iter2) == iter3);
1027 g_assert (g_sequence_iter_next (iter3) == end);
1028 g_assert (g_sequence_iter_next (end) == end);
1030 g_queue_push_tail (seq->queue, iter1);
1031 g_queue_push_tail (seq->queue, iter2);
1032 g_queue_push_tail (seq->queue, iter3);
1037 GSequenceIter *iter1, *iter2, *iter3, *begin;
1039 iter1 = g_sequence_prepend (seq->sequence, new_item (seq));
1040 iter2 = g_sequence_prepend (seq->sequence, new_item (seq));
1041 iter3 = g_sequence_prepend (seq->sequence, new_item (seq));
1043 begin = g_sequence_get_begin_iter (seq->sequence);
1045 g_assert (g_sequence_iter_prev (iter1) == iter2);
1046 g_assert (g_sequence_iter_prev (iter2) == iter3);
1047 g_assert (iter3 == begin);
1048 g_assert (g_sequence_iter_prev (iter3) == begin);
1049 g_assert (g_sequence_iter_prev (begin) == begin);
1051 g_queue_push_head (seq->queue, iter1);
1052 g_queue_push_head (seq->queue, iter2);
1053 g_queue_push_head (seq->queue, iter3);
1056 case ITER_GET_POSITION:
1059 GSequenceIter *iter = get_random_iter (seq, &link);
1061 g_assert (g_sequence_iter_get_position (iter) ==
1062 queue_link_index (seq, link));
1067 int len = g_sequence_get_length (seq->sequence);
1068 GSequenceIter *iter;
1071 iter = get_random_iter (seq, NULL);
1072 pos = g_sequence_iter_get_position (iter);
1073 iter = g_sequence_iter_move (iter, len - pos);
1074 g_assert (g_sequence_iter_is_end (iter));
1077 iter = get_random_iter (seq, NULL);
1078 pos = g_sequence_iter_get_position (iter);
1081 g_assert (!g_sequence_iter_is_end (iter));
1083 iter = g_sequence_iter_move (iter, 1);
1085 g_assert (g_sequence_iter_is_end (iter));
1088 case ITER_GET_SEQUENCE:
1090 GSequenceIter *iter = get_random_iter (seq, NULL);
1092 g_assert (g_sequence_iter_get_sequence (iter) == seq->sequence);
1099 GList *link1, *link2;
1100 GSequenceIter *iter1 = get_random_iter (seq, &link1);
1101 GSequenceIter *iter2 = get_random_iter (seq, &link2);
1103 int cmp = g_sequence_iter_compare (iter1, iter2);
1104 int pos1 = queue_link_index (seq, link1);
1105 int pos2 = queue_link_index (seq, link2);
1109 g_assert (pos1 == pos2);
1113 g_assert (pos1 < pos2);
1117 g_assert (pos1 > pos2);
1121 case RANGE_GET_MIDPOINT:
1123 GSequenceIter *iter1 = get_random_iter (seq, NULL);
1124 GSequenceIter *iter2 = get_random_iter (seq, NULL);
1125 GSequenceIter *iter3;
1128 cmp = g_sequence_iter_compare (iter1, iter2);
1139 iter3 = g_sequence_range_get_midpoint (iter1, iter2);
1143 g_assert (iter3 == iter1);
1144 g_assert (iter3 == iter2);
1147 g_assert (g_sequence_iter_get_position (iter3) >=
1148 g_sequence_iter_get_position (iter1));
1149 g_assert (g_sequence_iter_get_position (iter2) >=
1150 g_sequence_iter_get_position (iter3));
1156 check_integrity (seq);
1159 for (k = 0; k < N_SEQUENCES; ++k)
1161 g_queue_free (sequences[k].queue);
1162 g_sequence_free (sequences[k].sequence);
1163 sequences[k].n_items = 0;
1167 /* Random seeds known to have failed at one point
1169 static gulong seeds[] =
1183 /* Single, stand-alone tests */
1186 test_out_of_range_jump (void)
1188 GSequence *seq = g_sequence_new (NULL);
1189 GSequenceIter *iter = g_sequence_get_begin_iter (seq);
1191 g_sequence_iter_move (iter, 5);
1193 g_assert (g_sequence_iter_is_begin (iter));
1194 g_assert (g_sequence_iter_is_end (iter));
1196 g_sequence_free (seq);
1200 test_iter_move (void)
1202 GSequence *seq = g_sequence_new (NULL);
1203 GSequenceIter *iter;
1206 for (i = 0; i < 10; ++i)
1207 g_sequence_append (seq, GINT_TO_POINTER (i));
1209 iter = g_sequence_get_begin_iter (seq);
1210 iter = g_sequence_iter_move (iter, 5);
1211 g_assert_cmpint (GPOINTER_TO_INT (g_sequence_get (iter)), ==, 5);
1213 iter = g_sequence_iter_move (iter, -10);
1214 g_assert (g_sequence_iter_is_begin (iter));
1216 iter = g_sequence_get_end_iter (seq);
1217 iter = g_sequence_iter_move (iter, -5);
1218 g_assert_cmpint (GPOINTER_TO_INT (g_sequence_get (iter)), ==, 5);
1220 iter = g_sequence_iter_move (iter, 10);
1221 g_assert (g_sequence_iter_is_end (iter));
1223 g_sequence_free (seq);
1227 compare (gconstpointer a, gconstpointer b, gpointer userdata)
1231 ai = GPOINTER_TO_INT (a);
1232 bi = GPOINTER_TO_INT (b);
1243 compare_iter (GSequenceIter *a,
1247 return compare (g_sequence_get (a),
1253 test_insert_sorted_non_pointer (void)
1257 for (i = 0; i < 10; i++)
1259 GSequence *seq = g_sequence_new (NULL);
1262 for (j = 0; j < 10000; j++)
1264 g_sequence_insert_sorted (seq, GINT_TO_POINTER (g_random_int()),
1267 g_sequence_insert_sorted_iter (seq, GINT_TO_POINTER (g_random_int()),
1268 compare_iter, NULL);
1271 g_sequence_check (seq);
1273 g_sequence_free (seq);
1278 test_stable_sort (void)
1281 GSequence *seq = g_sequence_new (NULL);
1283 #define N_ITEMS 1000
1285 GSequenceIter *iters[N_ITEMS];
1286 GSequenceIter *iter;
1288 for (i = 0; i < N_ITEMS; ++i)
1290 iters[i] = g_sequence_append (seq, GINT_TO_POINTER (3000));
1291 g_sequence_check (seq);
1292 g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
1296 iter = g_sequence_get_begin_iter (seq);
1297 g_assert (g_sequence_iter_get_sequence (iter) == seq);
1298 g_sequence_check (seq);
1299 while (!g_sequence_iter_is_end (iter))
1301 g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
1302 g_assert (iters[i++] == iter);
1304 iter = g_sequence_iter_next (iter);
1305 g_sequence_check (seq);
1308 g_sequence_sort (seq, compare, NULL);
1311 iter = g_sequence_get_begin_iter (seq);
1312 while (!g_sequence_iter_is_end (iter))
1314 g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
1315 g_assert (iters[i] == iter);
1317 iter = g_sequence_iter_next (iter);
1318 g_sequence_check (seq);
1323 for (i = N_ITEMS - 1; i >= 0; --i)
1325 g_sequence_check (seq);
1326 g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
1327 g_assert (g_sequence_get_end_iter (seq) != iters[i]);
1328 g_sequence_sort_changed (iters[i], compare, NULL);
1332 iter = g_sequence_get_begin_iter (seq);
1333 while (!g_sequence_iter_is_end (iter))
1335 g_assert (iters[i++] == iter);
1337 iter = g_sequence_iter_next (iter);
1338 g_sequence_check (seq);
1341 g_sequence_free (seq);
1350 seq = g_sequence_new (NULL);
1351 g_assert_true (g_sequence_is_empty (seq));
1353 for (i = 0; i < 1000; i++)
1355 g_sequence_append (seq, GINT_TO_POINTER (i));
1356 g_assert_false (g_sequence_is_empty (seq));
1359 for (i = 0; i < 1000; i++)
1361 GSequenceIter *end = g_sequence_get_end_iter (seq);
1362 g_assert_false (g_sequence_is_empty (seq));
1363 g_sequence_remove (g_sequence_iter_prev (end));
1366 g_assert_true (g_sequence_is_empty (seq));
1368 g_sequence_free (seq);
1379 g_test_init (&argc, &argv, NULL);
1381 /* Standalone tests */
1382 g_test_add_func ("/sequence/out-of-range-jump", test_out_of_range_jump);
1383 g_test_add_func ("/sequence/iter-move", test_iter_move);
1384 g_test_add_func ("/sequence/insert-sorted-non-pointer", test_insert_sorted_non_pointer);
1385 g_test_add_func ("/sequence/stable-sort", test_stable_sort);
1386 g_test_add_func ("/sequence/is_empty", test_empty);
1388 /* Regression tests */
1389 for (i = 0; i < G_N_ELEMENTS (seeds); ++i)
1391 path = g_strdup_printf ("/sequence/random/seed:%lu", seeds[i]);
1392 g_test_add_data_func (path, GUINT_TO_POINTER (seeds[i]), run_random_tests);
1396 /* New random seed */
1397 seed = g_test_rand_int_range (0, G_MAXINT);
1398 path = g_strdup_printf ("/sequence/random/seed:%u", seed);
1399 g_test_add_data_func (path, GUINT_TO_POINTER (seed), run_random_tests);
1402 return g_test_run ();