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
;
19 GSequenceNode
* parent
;
21 GSequenceNode
* right
;
26 get_priority (GSequenceNode
*node
)
28 guint key
= GPOINTER_TO_UINT (node
);
30 key
= (key
<< 15) - key
- 1;
31 key
= key
^ (key
>> 12);
32 key
= key
+ (key
<< 2);
33 key
= key
^ (key
>> 4);
34 key
= key
+ (key
<< 3) + (key
<< 11);
35 key
= key
^ (key
>> 16);
41 check_node (GSequenceNode
*node
)
45 g_assert (node
->parent
!= node
);
47 g_assert (node
->parent
->left
== node
|| node
->parent
->right
== node
);
48 g_assert (node
->n_nodes
== 1 + (node
->left
? node
->left
->n_nodes
: 0) + (node
->right
? node
->right
->n_nodes
: 0));
50 g_assert (get_priority (node
) >= get_priority (node
->left
));
52 g_assert (get_priority (node
) >= get_priority (node
->right
));
53 check_node (node
->left
);
54 check_node (node
->right
);
59 g_sequence_check (GSequence
*seq
)
61 GSequenceNode
*node
= seq
->end_node
;
71 g_assert (seq
->end_node
== node
);
72 g_assert (node
->data
== seq
);
78 NEW
, FREE
, GET_LENGTH
, FOREACH
, FOREACH_RANGE
, SORT
, SORT_ITER
,
81 GET_BEGIN_ITER
, GET_END_ITER
, GET_ITER_AT_POS
, APPEND
, PREPEND
,
82 INSERT_BEFORE
, MOVE
, SWAP
, INSERT_SORTED
, INSERT_SORTED_ITER
, SORT_CHANGED
,
83 SORT_CHANGED_ITER
, REMOVE
, REMOVE_RANGE
, MOVE_RANGE
, SEARCH
, SEARCH_ITER
,
88 /* operations on GSequenceIter * */
89 ITER_IS_BEGIN
, ITER_IS_END
, ITER_NEXT
, ITER_PREV
, ITER_GET_POSITION
,
90 ITER_MOVE
, ITER_GET_SEQUENCE
,
93 ITER_COMPARE
, RANGE_GET_MIDPOINT
,
97 typedef struct SequenceInfo
100 GSequence
* sequence
;
110 void g_sequence_check (GSequence
*sequence
);
113 fix_pointer (gconstpointer data
)
115 return (Item
*)((char *)data
- 1);
119 get_item (GSequenceIter
*iter
)
121 return fix_pointer (g_sequence_get (iter
));
125 check_integrity (SequenceInfo
*info
)
131 g_sequence_check (info
->sequence
);
133 if (g_sequence_get_length (info
->sequence
) != info
->n_items
)
135 g_sequence_get_length (info
->sequence
), info
->n_items
);
136 g_assert (info
->n_items
== g_queue_get_length (info
->queue
));
137 g_assert (g_sequence_get_length (info
->sequence
) == info
->n_items
);
139 iter
= g_sequence_get_begin_iter (info
->sequence
);
140 list
= info
->queue
->head
;
142 while (iter
!= g_sequence_get_end_iter (info
->sequence
))
145 g_assert (list
->data
== iter
);
146 item
= get_item (list
->data
);
147 g_assert (item
->seq
== info
);
149 iter
= g_sequence_iter_next (iter
);
154 g_assert (info
->n_items
== g_queue_get_length (info
->queue
));
155 g_assert (g_sequence_get_length (info
->sequence
) == info
->n_items
);
159 new_item (SequenceInfo
*seq
)
161 Item
*item
= g_new (Item
, 1);
164 item
->number
= g_random_int ();
166 /* There have been bugs in the past where the GSequence would
167 * dereference the user pointers. This will make sure such
168 * behavior causes crashes
170 return ((char *)item
+ 1);
174 free_item (gpointer data
)
176 Item
*item
= fix_pointer (data
);
177 item
->seq
->n_items
--;
182 seq_foreach (gpointer data
,
185 Item
*item
= fix_pointer (data
);
186 GList
**link
= user_data
;
189 g_assert (*link
!= NULL
);
191 iter
= (*link
)->data
;
193 g_assert (get_item (iter
) == item
);
195 item
->number
= g_random_int();
197 *link
= (*link
)->next
;
201 compare_items (gconstpointer a
,
205 const Item
*item_a
= fix_pointer (a
);
206 const Item
*item_b
= fix_pointer (b
);
208 if (item_a
->number
< item_b
->number
)
212 else if (item_a
->number
== item_b
->number
)
214 /* Force an arbitrary order on the items
215 * We have to do this, since g_queue_insert_sorted() and
216 * g_sequence_insert_sorted() do not agree on the exact
217 * position the item is inserted if the new item is
218 * equal to an existing one.
222 else if (item_a
== item_b
)
234 check_sorted (SequenceInfo
*info
)
238 GSequenceIter
*last_iter
;
240 check_integrity (info
);
244 for (list
= info
->queue
->head
; list
!= NULL
; list
= list
->next
)
246 GSequenceIter
*iter
= list
->data
;
247 Item
*item
= get_item (iter
);
249 g_assert (item
->number
>= last
);
250 /* Check that the ordering is the same as that of the queue,
251 * ie. that the sort is stable
254 g_assert (iter
== g_sequence_iter_next (last_iter
));
262 compare_iters (gconstpointer a
,
266 GSequence
*seq
= data
;
267 GSequenceIter
*iter_a
= (GSequenceIter
*)a
;
268 GSequenceIter
*iter_b
= (GSequenceIter
*)b
;
269 /* compare_items() will fix up the pointers */
270 Item
*item_a
= g_sequence_get (iter_a
);
271 Item
*item_b
= g_sequence_get (iter_b
);
275 g_assert (g_sequence_iter_get_sequence (iter_a
) == seq
);
276 g_assert (g_sequence_iter_get_sequence (iter_b
) == seq
);
279 return compare_items (item_a
, item_b
, data
);
282 /* A version of g_queue_link_index() that treats NULL as just
286 queue_link_index (SequenceInfo
*seq
, GList
*link
)
289 return g_queue_link_index (seq
->queue
, link
);
291 return g_queue_get_length (seq
->queue
);
295 get_random_range (SequenceInfo
*seq
,
296 GSequenceIter
**begin_iter
,
297 GSequenceIter
**end_iter
,
301 int length
= g_queue_get_length (seq
->queue
);
302 int b
= g_random_int_range (0, length
+ 1);
303 int e
= g_random_int_range (b
, length
+ 1);
305 g_assert (length
== g_sequence_get_length (seq
->sequence
));
308 *begin_iter
= g_sequence_get_iter_at_pos (seq
->sequence
, b
);
310 *end_iter
= g_sequence_get_iter_at_pos (seq
->sequence
, e
);
312 *begin_link
= g_queue_peek_nth_link (seq
->queue
, b
);
314 *end_link
= g_queue_peek_nth_link (seq
->queue
, e
);
315 if (begin_iter
&& begin_link
)
318 queue_link_index (seq
, *begin_link
) ==
319 g_sequence_iter_get_position (*begin_iter
));
321 if (end_iter
&& end_link
)
324 queue_link_index (seq
, *end_link
) ==
325 g_sequence_iter_get_position (*end_iter
));
330 get_random_position (SequenceInfo
*seq
)
332 int length
= g_queue_get_length (seq
->queue
);
334 g_assert (length
== g_sequence_get_length (seq
->sequence
));
336 return g_random_int_range (-2, length
+ 5);
339 static GSequenceIter
*
340 get_random_iter (SequenceInfo
*seq
,
344 int pos
= get_random_position (seq
);
346 *link
= g_queue_peek_nth_link (seq
->queue
, pos
);
347 iter
= g_sequence_get_iter_at_pos (seq
->sequence
, pos
);
349 g_assert (queue_link_index (seq
, *link
) == g_sequence_iter_get_position (iter
));
354 dump_info (SequenceInfo
*seq
)
360 iter
= g_sequence_get_begin_iter (seq
->sequence
);
361 list
= seq
->queue
->head
;
363 while (iter
!= g_sequence_get_end_iter (seq
->sequence
))
365 Item
*item
= get_item (iter
);
366 g_print ("%p %p %d\n", list
->data
, iter
, item
->number
);
368 iter
= g_sequence_iter_next (iter
);
374 /* A version of g_queue_insert_before() that appends if link is NULL */
376 queue_insert_before (SequenceInfo
*seq
, GList
*link
, gpointer data
)
379 g_queue_insert_before (seq
->queue
, link
, data
);
381 g_queue_push_tail (seq
->queue
, data
);
385 run_random_tests (guint32 seed
)
387 #define N_ITERATIONS 60000
388 #define N_SEQUENCES 8
391 SequenceInfo sequences
[N_SEQUENCES
];
394 g_print (" seed: %u\n", seed
);
396 g_random_set_seed (seed
);
398 for (k
= 0; k
< N_SEQUENCES
; ++k
)
400 sequences
[k
].queue
= g_queue_new ();
401 sequences
[k
].sequence
= g_sequence_new (free_item
);
402 sequences
[k
].n_items
= 0;
405 #define RANDOM_SEQUENCE() &(sequences[g_random_int_range (0, N_SEQUENCES)])
407 for (k
= 0; k
< N_ITERATIONS
; ++k
)
410 SequenceInfo
*seq
= RANDOM_SEQUENCE();
411 int op
= g_random_int_range (0, N_OPS
);
414 g_print ("%d on %p\n", op
, seq
);
422 g_queue_free (seq
->queue
);
423 g_sequence_free (seq
->sequence
);
425 g_assert (seq
->n_items
== 0);
427 seq
->queue
= g_queue_new ();
428 seq
->sequence
= g_sequence_new (free_item
);
430 check_integrity (seq
);
435 int slen
= g_sequence_get_length (seq
->sequence
);
436 int qlen
= g_queue_get_length (seq
->queue
);
438 g_assert (slen
== qlen
);
443 GList
*link
= seq
->queue
->head
;
444 g_sequence_foreach (seq
->sequence
, seq_foreach
, &link
);
445 g_assert (link
== NULL
);
450 GSequenceIter
*begin_iter
, *end_iter
;
451 GList
*begin_link
, *end_link
;
453 get_random_range (seq
, &begin_iter
, &end_iter
, &begin_link
, &end_link
);
455 check_integrity (seq
);
457 g_sequence_foreach_range (begin_iter
, end_iter
, seq_foreach
, &begin_link
);
459 g_assert (begin_link
== end_link
);
466 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
467 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
476 check_integrity (seq
);
477 g_sequence_sort_iter (seq
->sequence
,
478 (GSequenceIterCompareFunc
)compare_iters
, seq
->sequence
);
479 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
488 GSequenceIter
*begin_iter
;
489 GSequenceIter
*end_iter
;
490 GSequenceIter
*penultimate_iter
;
492 begin_iter
= g_sequence_get_begin_iter (seq
->sequence
);
493 check_integrity (seq
);
495 end_iter
= g_sequence_get_end_iter (seq
->sequence
);
496 check_integrity (seq
);
498 penultimate_iter
= g_sequence_iter_prev (end_iter
);
499 check_integrity (seq
);
501 if (g_sequence_get_length (seq
->sequence
) > 0)
503 g_assert (seq
->queue
->head
);
504 g_assert (seq
->queue
->head
->data
== begin_iter
);
505 g_assert (seq
->queue
->tail
);
506 g_assert (seq
->queue
->tail
->data
== penultimate_iter
);
510 g_assert (penultimate_iter
== end_iter
);
511 g_assert (begin_iter
== end_iter
);
512 g_assert (penultimate_iter
== begin_iter
);
513 g_assert (seq
->queue
->head
== NULL
);
514 g_assert (seq
->queue
->tail
== NULL
);
518 case GET_ITER_AT_POS
:
522 g_assert (g_queue_get_length (seq
->queue
) == g_sequence_get_length (seq
->sequence
));
524 for (i
= 0; i
< 10; ++i
)
526 int pos
= get_random_position (seq
);
527 GSequenceIter
*iter
= g_sequence_get_iter_at_pos (seq
->sequence
, pos
);
528 GList
*link
= g_queue_peek_nth_link (seq
->queue
, pos
);
529 check_integrity (seq
);
530 if (pos
>= g_sequence_get_length (seq
->sequence
) || pos
< 0)
532 g_assert (iter
== g_sequence_get_end_iter (seq
->sequence
));
533 g_assert (link
== NULL
);
538 g_assert (link
->data
== iter
);
545 for (i
= 0; i
< 10; ++i
)
547 GSequenceIter
*iter
= g_sequence_append (seq
->sequence
, new_item (seq
));
548 g_queue_push_tail (seq
->queue
, iter
);
554 for (i
= 0; i
< 10; ++i
)
556 GSequenceIter
*iter
= g_sequence_prepend (seq
->sequence
, new_item (seq
));
557 g_queue_push_head (seq
->queue
, iter
);
563 for (i
= 0; i
< 10; ++i
)
566 GSequenceIter
*iter
= get_random_iter (seq
, &link
);
567 GSequenceIter
*new_iter
;
568 check_integrity (seq
);
570 new_iter
= g_sequence_insert_before (iter
, new_item (seq
));
572 queue_insert_before (seq
, link
, new_iter
);
578 GList
*link1
, *link2
;
579 SequenceInfo
*seq1
= RANDOM_SEQUENCE();
580 SequenceInfo
*seq2
= RANDOM_SEQUENCE();
581 GSequenceIter
*iter1
= get_random_iter (seq1
, &link1
);
582 GSequenceIter
*iter2
= get_random_iter (seq2
, &link2
);
584 if (!g_sequence_iter_is_end (iter1
))
586 g_sequence_move (iter1
, iter2
);
589 g_assert (g_sequence_iter_is_end (iter2
));
591 queue_insert_before (seq2
, link2
, link1
->data
);
593 g_queue_delete_link (seq1
->queue
, link1
);
595 get_item (iter1
)->seq
= seq2
;
601 check_integrity (seq
);
603 iter1
= get_random_iter (seq
, NULL
);
605 /* Moving an iter to itself should have no effect */
606 if (!g_sequence_iter_is_end (iter1
))
607 g_sequence_move (iter1
, iter1
);
612 GList
*link1
, *link2
;
613 SequenceInfo
*seq1
= RANDOM_SEQUENCE();
614 SequenceInfo
*seq2
= RANDOM_SEQUENCE();
615 GSequenceIter
*iter1
= get_random_iter (seq1
, &link1
);
616 GSequenceIter
*iter2
= get_random_iter (seq2
, &link2
);
618 if (!g_sequence_iter_is_end (iter1
) &&
619 !g_sequence_iter_is_end (iter2
))
623 g_sequence_swap (iter1
, iter2
);
625 get_item (iter1
)->seq
= seq2
;
626 get_item (iter2
)->seq
= seq1
;
629 link1
->data
= link2
->data
;
639 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
640 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
644 for (i
= 0; i
< N_TIMES
; ++i
)
646 GSequenceIter
*iter
=
647 g_sequence_insert_sorted (seq
->sequence
, new_item(seq
), compare_items
, NULL
);
649 g_queue_insert_sorted (seq
->queue
, iter
, compare_iters
, NULL
);
657 case INSERT_SORTED_ITER
:
662 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
663 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
667 for (i
= 0; i
< N_TIMES
; ++i
)
671 iter
= g_sequence_insert_sorted_iter (seq
->sequence
,
673 (GSequenceIterCompareFunc
)compare_iters
,
676 g_queue_insert_sorted (seq
->queue
, iter
, compare_iters
, NULL
);
688 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
689 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
693 for (i
= 0; i
< N_TIMES
; ++i
)
696 GSequenceIter
*iter
= get_random_iter (seq
, &link
);
698 if (!g_sequence_iter_is_end (iter
))
700 g_sequence_set (iter
, new_item (seq
));
701 g_sequence_sort_changed (iter
, compare_items
, NULL
);
703 g_queue_delete_link (seq
->queue
, link
);
704 g_queue_insert_sorted (seq
->queue
, iter
, compare_iters
, NULL
);
711 case SORT_CHANGED_ITER
:
715 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
716 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
720 for (i
= 0; i
< N_TIMES
; ++i
)
723 GSequenceIter
*iter
= get_random_iter (seq
, &link
);
725 if (!g_sequence_iter_is_end (iter
))
727 g_sequence_set (iter
, new_item (seq
));
728 g_sequence_sort_changed_iter (iter
,
729 (GSequenceIterCompareFunc
)compare_iters
, seq
->sequence
);
731 g_queue_delete_link (seq
->queue
, link
);
732 g_queue_insert_sorted (seq
->queue
, iter
, compare_iters
, NULL
);
743 for (i
= 0; i
< N_TIMES
; ++i
)
746 GSequenceIter
*iter
= get_random_iter (seq
, &link
);
748 if (!g_sequence_iter_is_end (iter
))
750 g_sequence_remove (iter
);
751 g_queue_delete_link (seq
->queue
, link
);
758 GSequenceIter
*begin_iter
, *end_iter
;
759 GList
*begin_link
, *end_link
;
762 get_random_range (seq
, &begin_iter
, &end_iter
, &begin_link
, &end_link
);
764 g_sequence_remove_range (begin_iter
, end_iter
);
767 while (list
!= end_link
)
769 GList
*next
= list
->next
;
771 g_queue_delete_link (seq
->queue
, list
);
779 SequenceInfo
*src
= RANDOM_SEQUENCE();
780 SequenceInfo
*dst
= RANDOM_SEQUENCE();
782 GSequenceIter
*begin_iter
, *end_iter
;
783 GList
*begin_link
, *end_link
;
785 GSequenceIter
*dst_iter
;
790 g_assert (src
->queue
);
791 g_assert (dst
->queue
);
793 get_random_range (src
, &begin_iter
, &end_iter
, &begin_link
, &end_link
);
794 dst_iter
= get_random_iter (dst
, &dst_link
);
796 g_sequence_move_range (dst_iter
, begin_iter
, end_iter
);
798 if (dst_link
== begin_link
|| (src
== dst
&& dst_link
== end_link
))
800 check_integrity (src
);
801 check_integrity (dst
);
805 if (queue_link_index (src
, begin_link
) >=
806 queue_link_index (src
, end_link
))
812 queue_link_index (src
, dst_link
) >= queue_link_index (src
, begin_link
) &&
813 queue_link_index (src
, dst_link
) <= queue_link_index (src
, end_link
))
819 while (list
!= end_link
)
821 GList
*next
= list
->next
;
822 Item
*item
= get_item (list
->data
);
824 g_assert (dst
->queue
);
825 queue_insert_before (dst
, dst_link
, list
->data
);
826 g_queue_delete_link (src
->queue
, list
);
828 g_assert (item
->seq
== src
);
841 GSequenceIter
*search_iter
;
842 GSequenceIter
*insert_iter
;
844 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
845 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
849 item
= new_item (seq
);
850 search_iter
= g_sequence_search (seq
->sequence
, item
, compare_items
, NULL
);
852 insert_iter
= g_sequence_insert_sorted (seq
->sequence
, item
, compare_items
, NULL
);
854 g_assert (search_iter
== g_sequence_iter_next (insert_iter
));
856 g_queue_insert_sorted (seq
->queue
, insert_iter
, compare_iters
, NULL
);
862 GSequenceIter
*search_iter
;
863 GSequenceIter
*insert_iter
;
865 g_sequence_sort (seq
->sequence
, compare_items
, NULL
);
866 g_queue_sort (seq
->queue
, compare_iters
, NULL
);
870 item
= new_item (seq
);
871 search_iter
= g_sequence_search_iter (seq
->sequence
,
873 (GSequenceIterCompareFunc
)compare_iters
, seq
->sequence
);
875 insert_iter
= g_sequence_insert_sorted (seq
->sequence
, item
, compare_items
, NULL
);
877 g_assert (search_iter
== g_sequence_iter_next (insert_iter
));
879 g_queue_insert_sorted (seq
->queue
, insert_iter
, compare_iters
, NULL
);
890 iter
= get_random_iter (seq
, &link
);
892 if (!g_sequence_iter_is_end (iter
))
897 check_integrity (seq
);
899 /* Test basic functionality */
900 item
= new_item (seq
);
901 g_sequence_set (iter
, item
);
902 g_assert (g_sequence_get (iter
) == item
);
904 /* Make sure that existing items are freed */
905 for (i
= 0; i
< N_TIMES
; ++i
)
906 g_sequence_set (iter
, new_item (seq
));
908 check_integrity (seq
);
910 g_sequence_set (iter
, new_item (seq
));
915 /* operations on GSequenceIter * */
920 iter
= g_sequence_get_iter_at_pos (seq
->sequence
, 0);
922 g_assert (g_sequence_iter_is_begin (iter
));
924 check_integrity (seq
);
926 if (g_sequence_get_length (seq
->sequence
) > 0)
928 g_assert (!g_sequence_iter_is_begin (g_sequence_get_end_iter (seq
->sequence
)));
932 g_assert (g_sequence_iter_is_begin (g_sequence_get_end_iter (seq
->sequence
)));
935 g_assert (g_sequence_iter_is_begin (g_sequence_get_begin_iter (seq
->sequence
)));
941 int len
= g_sequence_get_length (seq
->sequence
);
943 iter
= g_sequence_get_iter_at_pos (seq
->sequence
, len
);
945 g_assert (g_sequence_iter_is_end (iter
));
949 g_assert (!g_sequence_iter_is_end (g_sequence_get_begin_iter (seq
->sequence
)));
953 g_assert (g_sequence_iter_is_end (g_sequence_get_begin_iter (seq
->sequence
)));
956 g_assert (g_sequence_iter_is_end (g_sequence_get_end_iter (seq
->sequence
)));
961 GSequenceIter
*iter1
, *iter2
, *iter3
, *end
;
963 iter1
= g_sequence_append (seq
->sequence
, new_item (seq
));
964 iter2
= g_sequence_append (seq
->sequence
, new_item (seq
));
965 iter3
= g_sequence_append (seq
->sequence
, new_item (seq
));
967 end
= g_sequence_get_end_iter (seq
->sequence
);
969 g_assert (g_sequence_iter_next (iter1
) == iter2
);
970 g_assert (g_sequence_iter_next (iter2
) == iter3
);
971 g_assert (g_sequence_iter_next (iter3
) == end
);
972 g_assert (g_sequence_iter_next (end
) == end
);
974 g_queue_push_tail (seq
->queue
, iter1
);
975 g_queue_push_tail (seq
->queue
, iter2
);
976 g_queue_push_tail (seq
->queue
, iter3
);
981 GSequenceIter
*iter1
, *iter2
, *iter3
, *begin
;
983 iter1
= g_sequence_prepend (seq
->sequence
, new_item (seq
));
984 iter2
= g_sequence_prepend (seq
->sequence
, new_item (seq
));
985 iter3
= g_sequence_prepend (seq
->sequence
, new_item (seq
));
987 begin
= g_sequence_get_begin_iter (seq
->sequence
);
989 g_assert (g_sequence_iter_prev (iter1
) == iter2
);
990 g_assert (g_sequence_iter_prev (iter2
) == iter3
);
991 g_assert (iter3
== begin
);
992 g_assert (g_sequence_iter_prev (iter3
) == begin
);
993 g_assert (g_sequence_iter_prev (begin
) == begin
);
995 g_queue_push_head (seq
->queue
, iter1
);
996 g_queue_push_head (seq
->queue
, iter2
);
997 g_queue_push_head (seq
->queue
, iter3
);
1000 case ITER_GET_POSITION
:
1003 GSequenceIter
*iter
= get_random_iter (seq
, &link
);
1005 g_assert (g_sequence_iter_get_position (iter
) ==
1006 queue_link_index (seq
, link
));
1011 int len
= g_sequence_get_length (seq
->sequence
);
1012 GSequenceIter
*iter
;
1015 iter
= get_random_iter (seq
, NULL
);
1016 pos
= g_sequence_iter_get_position (iter
);
1017 iter
= g_sequence_iter_move (iter
, len
- pos
);
1018 g_assert (g_sequence_iter_is_end (iter
));
1021 iter
= get_random_iter (seq
, NULL
);
1022 pos
= g_sequence_iter_get_position (iter
);
1025 g_assert (!g_sequence_iter_is_end (iter
));
1027 iter
= g_sequence_iter_move (iter
, 1);
1029 g_assert (g_sequence_iter_is_end (iter
));
1032 case ITER_GET_SEQUENCE
:
1034 GSequenceIter
*iter
= get_random_iter (seq
, NULL
);
1036 g_assert (g_sequence_iter_get_sequence (iter
) == seq
->sequence
);
1043 GList
*link1
, *link2
;
1044 GSequenceIter
*iter1
= get_random_iter (seq
, &link1
);
1045 GSequenceIter
*iter2
= get_random_iter (seq
, &link2
);
1047 int cmp
= g_sequence_iter_compare (iter1
, iter2
);
1048 int pos1
= queue_link_index (seq
, link1
);
1049 int pos2
= queue_link_index (seq
, link2
);
1053 g_assert (pos1
== pos2
);
1057 g_assert (pos1
< pos2
);
1061 g_assert (pos1
> pos2
);
1065 case RANGE_GET_MIDPOINT
:
1067 GSequenceIter
*iter1
= get_random_iter (seq
, NULL
);
1068 GSequenceIter
*iter2
= get_random_iter (seq
, NULL
);
1069 GSequenceIter
*iter3
;
1072 cmp
= g_sequence_iter_compare (iter1
, iter2
);
1083 iter3
= g_sequence_range_get_midpoint (iter1
, iter2
);
1087 g_assert (iter3
== iter1
);
1088 g_assert (iter3
== iter2
);
1091 g_assert (g_sequence_iter_get_position (iter3
) >=
1092 g_sequence_iter_get_position (iter1
));
1093 g_assert (g_sequence_iter_get_position (iter2
) >=
1094 g_sequence_iter_get_position (iter3
));
1100 check_integrity (seq
);
1104 /* Random seeds known to have failed at one point
1106 static gulong seeds
[] =
1120 static void standalone_tests (void);
1123 get_seed (int argc
, char **argv
)
1129 return strtol (argv
[1], &endptr
, 0);
1133 return g_random_int();
1141 guint32 seed
= get_seed (argc
, argv
);
1144 /* Run stand alone tests */
1145 g_print ("running standalone tests\n");
1148 g_print ("running regression tests:\n");
1149 /* Run regression tests */
1150 for (i
= 0; i
< G_N_ELEMENTS (seeds
); ++i
)
1152 run_random_tests (seeds
[i
]);
1155 /* Run with a new random seed */
1156 g_print ("random seed:\n");
1157 run_random_tests (seed
);
1164 /* Single, stand-alone tests */
1167 test_out_of_range_jump (void)
1169 GSequence
*seq
= g_sequence_new (NULL
);
1170 GSequenceIter
*iter
= g_sequence_get_begin_iter (seq
);
1172 g_sequence_iter_move (iter
, 5);
1174 g_assert (g_sequence_iter_is_begin (iter
));
1175 g_assert (g_sequence_iter_is_end (iter
));
1179 compare (gconstpointer a
, gconstpointer b
, gpointer userdata
)
1183 ai
= GPOINTER_TO_INT (a
);
1184 bi
= GPOINTER_TO_INT (b
);
1195 compare_iter (GSequenceIter
*a
,
1199 return compare (g_sequence_get (a
),
1205 test_insert_sorted_non_pointer (void)
1209 for (i
= 0; i
< 10; i
++)
1211 GSequence
*seq
= g_sequence_new (NULL
);
1214 for (j
= 0; j
< 10000; j
++)
1216 g_sequence_insert_sorted (seq
, GINT_TO_POINTER (g_random_int()),
1219 g_sequence_insert_sorted_iter (seq
, GINT_TO_POINTER (g_random_int()),
1220 compare_iter
, NULL
);
1223 g_sequence_check (seq
);
1225 g_sequence_free (seq
);
1230 test_stable_sort (void)
1233 GSequence
*seq
= g_sequence_new (NULL
);
1235 #define N_ITEMS 1000
1237 GSequenceIter
*iters
[N_ITEMS
];
1238 GSequenceIter
*iter
;
1240 for (i
= 0; i
< N_ITEMS
; ++i
)
1242 iters
[i
] = g_sequence_append (seq
, GINT_TO_POINTER (3000));
1243 g_sequence_check (seq
);
1244 g_assert (g_sequence_iter_get_sequence (iters
[i
]) == seq
);
1248 iter
= g_sequence_get_begin_iter (seq
);
1249 g_assert (g_sequence_iter_get_sequence (iter
) == seq
);
1250 g_sequence_check (seq
);
1251 while (!g_sequence_iter_is_end (iter
))
1253 g_assert (g_sequence_iter_get_sequence (iters
[i
]) == seq
);
1254 g_assert (iters
[i
++] == iter
);
1256 iter
= g_sequence_iter_next (iter
);
1257 g_sequence_check (seq
);
1260 g_sequence_sort (seq
, compare
, NULL
);
1263 iter
= g_sequence_get_begin_iter (seq
);
1264 while (!g_sequence_iter_is_end (iter
))
1266 g_assert (g_sequence_iter_get_sequence (iters
[i
]) == seq
);
1267 g_assert (iters
[i
] == iter
);
1269 iter
= g_sequence_iter_next (iter
);
1270 g_sequence_check (seq
);
1275 for (i
= N_ITEMS
- 1; i
>= 0; --i
)
1277 g_sequence_check (seq
);
1278 g_assert (g_sequence_iter_get_sequence (iters
[i
]) == seq
);
1279 g_assert (g_sequence_get_end_iter (seq
) != iters
[i
]);
1280 g_sequence_sort_changed (iters
[i
], compare
, NULL
);
1284 iter
= g_sequence_get_begin_iter (seq
);
1285 while (!g_sequence_iter_is_end (iter
))
1287 g_assert (iters
[i
++] == iter
);
1289 iter
= g_sequence_iter_next (iter
);
1290 g_sequence_check (seq
);
1295 standalone_tests (void)
1297 test_out_of_range_jump ();
1298 test_insert_sorted_non_pointer ();
1299 test_stable_sort ();