1 #undef G_DISABLE_ASSERT
11 check_integrity (GQueue
*queue
)
19 g_assert (queue
->length
< 4000000000u);
21 g_assert (g_queue_get_length (queue
) == queue
->length
);
24 g_assert (!queue
->tail
);
26 g_assert (!queue
->head
);
30 for (list
= queue
->head
; list
!= NULL
; list
= list
->next
)
36 g_assert (n
== queue
->length
);
37 g_assert (last
== queue
->tail
);
41 for (list
= queue
->tail
; list
!= NULL
; list
= list
->prev
)
47 g_assert (n
== queue
->length
);
48 g_assert (last
== queue
->head
);
51 for (list
= queue
->head
; list
!= NULL
; list
= list
->next
)
52 links
= g_list_prepend (links
, list
);
55 for (list
= queue
->tail
; list
!= NULL
; list
= list
->prev
)
57 g_assert (list
== link
->data
);
63 for (list
= queue
->tail
; list
!= NULL
; list
= list
->prev
)
64 links
= g_list_prepend (links
, list
);
67 for (list
= queue
->head
; list
!= NULL
; list
= list
->next
)
69 g_assert (list
== link
->data
);
78 return g_random_int_range (0, 2);
82 check_max (gpointer elm
, gpointer user_data
)
84 gint
*best
= user_data
;
85 gint element
= GPOINTER_TO_INT (elm
);
92 check_min (gpointer elm
, gpointer user_data
)
94 gint
*best
= user_data
;
95 gint element
= GPOINTER_TO_INT (elm
);
102 find_min (GQueue
*queue
)
106 g_queue_foreach (queue
, check_min
, &min
);
112 find_max (GQueue
*queue
)
116 g_queue_foreach (queue
, check_max
, &max
);
122 delete_elm (gpointer elm
, gpointer user_data
)
124 g_queue_remove ((GQueue
*)user_data
, elm
);
125 check_integrity ((GQueue
*)user_data
);
129 delete_all (GQueue
*queue
)
131 g_queue_foreach (queue
, delete_elm
, queue
);
135 compare_int (gconstpointer a
, gconstpointer b
, gpointer data
)
137 int ai
= GPOINTER_TO_INT (a
);
138 int bi
= GPOINTER_TO_INT (b
);
149 get_random_position (GQueue
*queue
, gboolean allow_offlist
)
152 enum { OFF_QUEUE
, HEAD
, TAIL
, MIDDLE
, LAST
} where
;
155 where
= g_random_int_range (OFF_QUEUE
, LAST
);
157 where
= g_random_int_range (HEAD
, LAST
);
173 n
= queue
->length
- 1;
177 if (queue
->length
== 0)
180 n
= g_random_int_range (0, queue
->length
);
184 g_assert_not_reached();
194 random_test (gconstpointer d
)
196 guint32 seed
= GPOINTER_TO_UINT (d
);
199 IS_EMPTY
, GET_LENGTH
, REVERSE
, COPY
,
200 FOREACH
, FIND
, FIND_CUSTOM
, SORT
,
201 PUSH_HEAD
, PUSH_TAIL
, PUSH_NTH
, POP_HEAD
,
202 POP_TAIL
, POP_NTH
, PEEK_HEAD
, PEEK_TAIL
,
203 PEEK_NTH
, INDEX
, REMOVE
, REMOVE_ALL
,
204 INSERT_BEFORE
, INSERT_AFTER
, INSERT_SORTED
, PUSH_HEAD_LINK
,
205 PUSH_TAIL_LINK
, PUSH_NTH_LINK
, POP_HEAD_LINK
, POP_TAIL_LINK
,
206 POP_NTH_LINK
, PEEK_HEAD_LINK
, PEEK_TAIL_LINK
, PEEK_NTH_LINK
,
207 LINK_INDEX
, UNLINK
, DELETE_LINK
, LAST_OP
210 #define N_ITERATIONS 500000
213 #define RANDOM_QUEUE() &(queues[g_random_int_range(0, N_QUEUES)])
215 typedef struct QueueInfo QueueInfo
;
226 QueueInfo queues
[N_QUEUES
];
228 g_random_set_seed (seed
);
230 for (i
= 0; i
< N_QUEUES
; ++i
)
232 queues
[i
].queue
= g_queue_new ();
233 queues
[i
].head
= NULL
;
234 queues
[i
].tail
= NULL
;
235 queues
[i
].length
= 0;
238 for (i
= 0; i
< N_ITERATIONS
; ++i
)
241 QueueInfo
*qinf
= RANDOM_QUEUE();
242 GQueue
*q
= qinf
->queue
;
243 op
= g_random_int_range (IS_EMPTY
, LAST_OP
);
245 g_assert (qinf
->head
== q
->head
);
246 g_assert (qinf
->tail
== q
->tail
);
247 g_assert (qinf
->length
== q
->length
);
253 if (g_queue_is_empty (qinf
->queue
))
255 g_assert (q
->head
== NULL
);
256 g_assert (q
->tail
== NULL
);
257 g_assert (q
->length
== 0);
263 g_assert (q
->length
> 0);
271 l
= g_queue_get_length (q
);
273 g_assert (qinf
->length
== q
->length
);
274 g_assert (qinf
->length
== l
);
279 g_assert (qinf
->tail
== q
->head
);
280 g_assert (qinf
->head
== q
->tail
);
281 g_assert (qinf
->length
== q
->length
);
282 qinf
->tail
= q
->tail
;
283 qinf
->head
= q
->head
;
287 QueueInfo
*random_queue
= RANDOM_QUEUE();
288 GQueue
*new_queue
= g_queue_copy (random_queue
->queue
);
290 g_queue_free (qinf
->queue
);
291 q
= qinf
->queue
= new_queue
;
292 qinf
->head
= new_queue
->head
;
293 qinf
->tail
= g_list_last (new_queue
->head
);
294 qinf
->length
= new_queue
->length
;
305 gboolean find_existing
= rnd_bool ();
306 int first
= find_max (q
);
307 int second
= find_min (q
);
310 find_existing
= FALSE
;
319 g_assert (g_queue_find (q
, GINT_TO_POINTER (first
)));
320 g_assert (g_queue_find (q
, GINT_TO_POINTER (second
)));
324 g_assert (!g_queue_find (q
, GINT_TO_POINTER (first
)));
325 g_assert (!g_queue_find (q
, GINT_TO_POINTER (second
)));
333 if (!g_queue_is_empty (q
))
335 int max
= find_max (q
);
336 int min
= find_min (q
);
337 g_queue_remove_all (q
, GINT_TO_POINTER (max
));
339 g_queue_remove_all (q
, GINT_TO_POINTER (min
));
341 g_queue_push_head (q
, GINT_TO_POINTER (max
));
343 g_queue_push_head (q
, GINT_TO_POINTER (min
));
344 qinf
->length
= q
->length
;
349 g_queue_sort (q
, compare_int
, NULL
);
353 qinf
->head
= g_queue_find (q
, GINT_TO_POINTER (find_min(q
)));
354 qinf
->tail
= g_queue_find (q
, GINT_TO_POINTER (find_max(q
)));
356 g_assert (qinf
->tail
== q
->tail
);
361 int x
= g_random_int_range (0, 435435);
362 g_queue_push_head (q
, GINT_TO_POINTER (x
));
364 qinf
->tail
= qinf
->head
= q
->head
;
366 qinf
->head
= qinf
->head
->prev
;
372 int x
= g_random_int_range (0, 236546);
373 g_queue_push_tail (q
, GINT_TO_POINTER (x
));
375 qinf
->tail
= qinf
->head
= q
->head
;
377 qinf
->tail
= qinf
->tail
->next
;
383 int pos
= get_random_position (q
, TRUE
);
384 int x
= g_random_int_range (0, 236546);
385 g_queue_push_nth (q
, GINT_TO_POINTER (x
), pos
);
386 if (qinf
->head
&& qinf
->head
->prev
)
387 qinf
->head
= qinf
->head
->prev
;
389 qinf
->head
= q
->head
;
390 if (qinf
->tail
&& qinf
->tail
->next
)
391 qinf
->tail
= qinf
->tail
->next
;
393 qinf
->tail
= g_list_last (qinf
->head
);
399 qinf
->head
= qinf
->head
->next
;
402 qinf
->length
= (qinf
->length
== 0)? 0 : qinf
->length
- 1;
403 g_queue_pop_head (q
);
407 qinf
->tail
= qinf
->tail
->prev
;
410 qinf
->length
= (qinf
->length
== 0)? 0 : qinf
->length
- 1;
411 g_queue_pop_tail (q
);
414 if (!g_queue_is_empty (q
))
416 int n
= get_random_position (q
, TRUE
);
417 gpointer elm
= g_queue_peek_nth (q
, n
);
419 if (n
== q
->length
- 1)
420 qinf
->tail
= qinf
->tail
->prev
;
423 qinf
->head
= qinf
->head
->next
;
425 if (n
>= 0 && n
< q
->length
)
428 g_assert (elm
== g_queue_pop_nth (q
, n
));
433 g_assert (qinf
->head
->data
== g_queue_peek_head (q
));
435 g_assert (g_queue_peek_head (q
) == NULL
);
439 g_assert (qinf
->tail
->data
== g_queue_peek_tail (q
));
441 g_assert (g_queue_peek_tail (q
) == NULL
);
444 if (g_queue_is_empty (q
))
446 for (j
= -10; j
< 10; ++j
)
447 g_assert (g_queue_peek_nth (q
, j
) == NULL
);
452 int n
= get_random_position (q
, TRUE
);
453 if (n
< 0 || n
>= q
->length
)
455 g_assert (g_queue_peek_nth (q
, n
) == NULL
);
460 for (j
= 0; j
< n
; ++j
)
463 g_assert (list
->data
== g_queue_peek_nth (q
, n
));
470 int x
= g_random_int_range (0, 386538);
474 g_queue_remove_all (q
, GINT_TO_POINTER (x
));
476 g_queue_push_tail (q
, GINT_TO_POINTER (x
));
478 g_queue_sort (q
, compare_int
, NULL
);
482 for (list
= q
->head
; list
!= NULL
; list
= list
->next
)
484 if (list
->data
== GINT_TO_POINTER (x
))
489 g_assert (g_queue_index (q
, GINT_TO_POINTER (x
)) ==
490 g_queue_link_index (q
, list
));
491 g_assert (g_queue_link_index (q
, list
) == n
);
493 qinf
->head
= q
->head
;
494 qinf
->tail
= q
->tail
;
495 qinf
->length
= q
->length
;
499 if (!g_queue_is_empty (q
))
500 g_queue_remove (q
, qinf
->tail
->data
);
501 /* qinf->head/qinf->tail may be invalid at this point */
502 if (!g_queue_is_empty (q
))
503 g_queue_remove (q
, q
->head
->data
);
504 if (!g_queue_is_empty (q
))
505 g_queue_remove (q
, g_queue_peek_nth (q
, get_random_position (q
, TRUE
)));
507 qinf
->head
= q
->head
;
508 qinf
->tail
= q
->tail
;
509 qinf
->length
= q
->length
;
512 if (!g_queue_is_empty (q
))
513 g_queue_remove_all (q
, qinf
->tail
->data
);
514 /* qinf->head/qinf->tail may be invalid at this point */
515 if (!g_queue_is_empty (q
))
516 g_queue_remove_all (q
, q
->head
->data
);
517 if (!g_queue_is_empty (q
))
518 g_queue_remove_all (q
, g_queue_peek_nth (q
, get_random_position (q
, TRUE
)));
520 qinf
->head
= q
->head
;
521 qinf
->tail
= q
->tail
;
522 qinf
->length
= q
->length
;
525 if (!g_queue_is_empty (q
))
527 gpointer x
= GINT_TO_POINTER (g_random_int_range (0, 386538));
529 g_queue_insert_before (q
, qinf
->tail
, x
);
530 g_queue_insert_before (q
, qinf
->head
, x
);
531 g_queue_insert_before (q
, g_queue_find (q
, x
), x
);
533 qinf
->head
= q
->head
;
534 qinf
->tail
= q
->tail
;
535 qinf
->length
= q
->length
;
538 if (!g_queue_is_empty (q
))
540 gpointer x
= GINT_TO_POINTER (g_random_int_range (0, 386538));
542 g_queue_insert_after (q
, qinf
->tail
, x
);
543 g_queue_insert_after (q
, qinf
->head
, x
);
544 g_queue_insert_after (q
, g_queue_find (q
, x
), x
);
546 qinf
->head
= q
->head
;
547 qinf
->tail
= q
->tail
;
548 qinf
->length
= q
->length
;
552 int max
= find_max (q
);
553 int min
= find_min (q
);
555 if (g_queue_is_empty (q
))
561 g_queue_sort (q
, compare_int
, NULL
);
563 g_queue_insert_sorted (q
, GINT_TO_POINTER (max
+ 1), compare_int
, NULL
);
565 g_assert (GPOINTER_TO_INT (q
->tail
->data
) == max
+ 1);
566 g_queue_insert_sorted (q
, GINT_TO_POINTER (min
- 1), compare_int
, NULL
);
568 g_assert (GPOINTER_TO_INT (q
->head
->data
) == min
- 1);
569 qinf
->head
= q
->head
;
570 qinf
->tail
= q
->tail
;
571 qinf
->length
= q
->length
;
576 GList
*link
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
577 g_queue_push_head_link (q
, link
);
586 GList
*link
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
587 g_queue_push_tail_link (q
, link
);
596 GList
*link
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
597 gint n
= get_random_position (q
, TRUE
);
598 g_queue_push_nth_link (q
, n
, link
);
600 if (qinf
->head
&& qinf
->head
->prev
)
601 qinf
->head
= qinf
->head
->prev
;
603 qinf
->head
= q
->head
;
604 if (qinf
->tail
&& qinf
->tail
->next
)
605 qinf
->tail
= qinf
->tail
->next
;
607 qinf
->tail
= g_list_last (qinf
->head
);
612 if (!g_queue_is_empty (q
))
614 qinf
->head
= qinf
->head
->next
;
618 g_list_free (g_queue_pop_head_link (q
));
622 if (!g_queue_is_empty (q
))
624 qinf
->tail
= qinf
->tail
->prev
;
628 g_list_free (g_queue_pop_tail_link (q
));
632 if (g_queue_is_empty (q
))
633 g_assert (g_queue_pop_nth_link (q
, 200) == NULL
);
636 int n
= get_random_position (q
, FALSE
);
638 if (n
== g_queue_get_length (q
) - 1)
639 qinf
->tail
= qinf
->tail
->prev
;
642 qinf
->head
= qinf
->head
->next
;
646 g_list_free (g_queue_pop_nth_link (q
, n
));
650 if (g_queue_is_empty (q
))
651 g_assert (g_queue_peek_head_link (q
) == NULL
);
653 g_assert (g_queue_peek_head_link (q
) == qinf
->head
);
656 if (g_queue_is_empty (q
))
657 g_assert (g_queue_peek_tail_link (q
) == NULL
);
659 g_assert (g_queue_peek_tail_link (q
) == qinf
->tail
);
662 if (g_queue_is_empty(q
))
663 g_assert (g_queue_peek_nth_link (q
, 1000) == NULL
);
666 gint n
= get_random_position (q
, FALSE
);
670 for (j
= 0; j
< n
; ++j
)
673 g_assert (g_queue_peek_nth_link (q
, n
) == link
);
677 if (!g_queue_is_empty (q
))
679 gint n
= g_random_int_range (0, g_queue_get_length (q
));
683 for (j
= 0; j
< n
; ++j
)
686 g_queue_unlink (q
, link
);
691 qinf
->head
= q
->head
;
692 qinf
->tail
= q
->tail
;
697 if (!g_queue_is_empty (q
))
699 gint n
= g_random_int_range (0, g_queue_get_length (q
));
703 for (j
= 0; j
< n
; ++j
)
706 g_queue_delete_link (q
, link
);
709 qinf
->head
= q
->head
;
710 qinf
->tail
= q
->tail
;
716 g_assert_not_reached();
720 if (qinf
->head
!= q
->head
||
721 qinf
->tail
!= q
->tail
||
722 qinf
->length
!= q
->length
)
723 g_print ("op: %d\n", op
);
725 g_assert (qinf
->head
== q
->head
);
726 g_assert (qinf
->tail
== q
->tail
);
727 g_assert (qinf
->length
== q
->length
);
729 for (j
= 0; j
< N_QUEUES
; ++j
)
730 check_integrity (queues
[j
].queue
);
733 for (i
= 0; i
< N_QUEUES
; ++i
)
734 g_queue_free (queues
[i
].queue
);
738 remove_item (gpointer data
, gpointer q
)
742 g_queue_remove (queue
, data
);
754 g_assert (g_queue_is_empty (q
));
755 g_queue_push_head (q
, GINT_TO_POINTER (2));
757 g_assert (g_queue_peek_head (q
) == GINT_TO_POINTER (2));
759 g_assert (!g_queue_is_empty (q
));
761 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
762 g_assert (q
->head
== q
->tail
);
763 g_queue_push_head (q
, GINT_TO_POINTER (1));
765 g_assert (q
->head
->next
== q
->tail
);
766 g_assert (q
->tail
->prev
== q
->head
);
767 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
769 g_assert (q
->tail
->data
== GINT_TO_POINTER (2));
770 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
772 g_queue_push_tail (q
, GINT_TO_POINTER (3));
773 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
774 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
775 g_assert (q
->head
->next
->data
== GINT_TO_POINTER (2));
776 g_assert (q
->head
->next
->next
== q
->tail
);
777 g_assert (q
->head
->next
== q
->tail
->prev
);
778 g_assert (q
->tail
->data
== GINT_TO_POINTER (3));
779 g_queue_push_tail (q
, GINT_TO_POINTER (4));
781 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
782 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
783 g_assert (g_queue_peek_tail (q
) == GINT_TO_POINTER (4));
784 g_queue_push_tail (q
, GINT_TO_POINTER (5));
786 g_assert_cmpint (g_list_length (q
->head
), ==, 5);
787 g_assert (g_queue_is_empty (q
) == FALSE
);
789 g_assert_cmpint (q
->length
, ==, 5);
790 g_assert (q
->head
->prev
== NULL
);
791 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
792 g_assert (q
->head
->next
->data
== GINT_TO_POINTER (2));
793 g_assert (q
->head
->next
->next
->data
== GINT_TO_POINTER (3));
794 g_assert (q
->head
->next
->next
->next
->data
== GINT_TO_POINTER (4));
795 g_assert (q
->head
->next
->next
->next
->next
->data
== GINT_TO_POINTER (5));
796 g_assert (q
->head
->next
->next
->next
->next
->next
== NULL
);
797 g_assert (q
->head
->next
->next
->next
->next
== q
->tail
);
798 g_assert (q
->tail
->data
== GINT_TO_POINTER (5));
799 g_assert (q
->tail
->prev
->data
== GINT_TO_POINTER (4));
800 g_assert (q
->tail
->prev
->prev
->data
== GINT_TO_POINTER (3));
801 g_assert (q
->tail
->prev
->prev
->prev
->data
== GINT_TO_POINTER (2));
802 g_assert (q
->tail
->prev
->prev
->prev
->prev
->data
== GINT_TO_POINTER (1));
803 g_assert (q
->tail
->prev
->prev
->prev
->prev
->prev
== NULL
);
804 g_assert (q
->tail
->prev
->prev
->prev
->prev
== q
->head
);
805 g_assert (g_queue_peek_tail (q
) == GINT_TO_POINTER (5));
806 g_assert (g_queue_peek_head (q
) == GINT_TO_POINTER (1));
807 g_assert (g_queue_pop_head (q
) == GINT_TO_POINTER (1));
809 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
810 g_assert_cmpint (q
->length
, ==, 4);
811 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (5));
813 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
815 node
= g_queue_pop_head_link (q
);
816 g_assert (node
->data
== GINT_TO_POINTER (2));
817 g_list_free_1 (node
);
820 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
821 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (4));
823 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
824 node
= g_queue_pop_head_link (q
);
825 g_assert (node
->data
== GINT_TO_POINTER (3));
826 g_list_free_1 (node
);
828 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
829 g_assert (g_queue_pop_tail (q
) == NULL
);
831 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
832 g_assert (g_queue_pop_head (q
) == NULL
);
834 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
835 g_assert (g_queue_is_empty (q
));
838 g_queue_push_head (q
, GINT_TO_POINTER (1));
840 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
841 g_assert_cmpint (q
->length
, ==, 1);
842 g_queue_push_head (q
, GINT_TO_POINTER (2));
844 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
845 g_assert_cmpint (q
->length
, ==, 2);
846 g_queue_push_head (q
, GINT_TO_POINTER (3));
848 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
849 g_assert_cmpint (q
->length
, ==, 3);
850 g_queue_push_head (q
, GINT_TO_POINTER (4));
852 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
853 g_assert_cmpint (q
->length
, ==, 4);
854 g_queue_push_head (q
, GINT_TO_POINTER (5));
856 g_assert_cmpint (g_list_length (q
->head
), ==, 5);
857 g_assert_cmpint (q
->length
, ==, 5);
858 g_assert (g_queue_pop_head (q
) == GINT_TO_POINTER (5));
860 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
862 g_assert (node
== g_queue_pop_tail_link (q
));
864 g_list_free_1 (node
);
865 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
866 data
= q
->head
->data
;
867 g_assert (data
== g_queue_pop_head (q
));
869 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
870 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (2));
872 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
873 g_assert (q
->head
== q
->tail
);
874 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (3));
876 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
877 g_assert (g_queue_pop_head (q
) == NULL
);
879 g_assert (g_queue_pop_head_link (q
) == NULL
);
881 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
882 g_assert (g_queue_pop_tail_link (q
) == NULL
);
884 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
888 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
899 q2
= g_queue_copy (q
);
901 check_integrity (q2
);
902 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
903 g_assert_cmpint (g_list_length (q2
->head
), ==, 0);
904 g_queue_sort (q
, compare_int
, NULL
);
905 check_integrity (q2
);
907 g_queue_sort (q2
, compare_int
, NULL
);
908 check_integrity (q2
);
911 for (i
= 0; i
< 200; ++i
)
913 g_queue_push_nth (q
, GINT_TO_POINTER (i
), i
);
914 g_assert (g_queue_find (q
, GINT_TO_POINTER (i
)));
916 check_integrity (q2
);
919 for (i
= 0; i
< 200; ++i
)
921 g_queue_remove (q
, GINT_TO_POINTER (i
));
923 check_integrity (q2
);
926 for (i
= 0; i
< 200; ++i
)
928 GList
*l
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
930 g_queue_push_nth_link (q
, i
, l
);
932 check_integrity (q2
);
935 check_integrity (q2
);
939 q2
= g_queue_copy (q
);
941 g_queue_foreach (q2
, remove_item
, q2
);
942 check_integrity (q2
);
950 test_off_by_one (void)
957 g_queue_push_tail (q
, GINT_TO_POINTER (1234));
959 node
= g_queue_peek_tail_link (q
);
960 g_assert (node
!= NULL
&& node
->data
== GINT_TO_POINTER (1234));
961 node
= g_queue_peek_nth_link (q
, g_queue_get_length (q
));
962 g_assert (node
== NULL
);
963 node
= g_queue_peek_nth_link (q
, g_queue_get_length (q
) - 1);
964 g_assert (node
->data
== GINT_TO_POINTER (1234));
965 node
= g_queue_pop_nth_link (q
, g_queue_get_length (q
));
966 g_assert (node
== NULL
);
967 node
= g_queue_pop_nth_link (q
, g_queue_get_length (q
) - 1);
968 g_assert (node
!= NULL
&& node
->data
== GINT_TO_POINTER (1234));
969 g_list_free_1 (node
);
975 find_custom (gconstpointer a
, gconstpointer b
)
977 return GPOINTER_TO_INT (a
) - GPOINTER_TO_INT (b
);
981 test_find_custom (void)
987 g_queue_push_tail (q
, GINT_TO_POINTER (1234));
988 g_queue_push_tail (q
, GINT_TO_POINTER (1));
989 g_queue_push_tail (q
, GINT_TO_POINTER (2));
990 node
= g_queue_find_custom (q
, GINT_TO_POINTER (1), find_custom
);
991 g_assert (node
!= NULL
);
992 node
= g_queue_find_custom (q
, GINT_TO_POINTER (2), find_custom
);
993 g_assert (node
!= NULL
);
994 node
= g_queue_find_custom (q
, GINT_TO_POINTER (3), find_custom
);
995 g_assert (node
== NULL
);
1004 GQueue q2
= G_QUEUE_INIT
;
1008 check_integrity (&q
);
1009 g_assert (g_queue_is_empty (&q
));
1011 check_integrity (&q2
);
1012 g_assert (g_queue_is_empty (&q2
));
1021 g_queue_push_tail (q
, GINT_TO_POINTER (1234));
1022 g_queue_push_tail (q
, GINT_TO_POINTER (1));
1023 g_queue_push_tail (q
, GINT_TO_POINTER (2));
1024 g_assert_cmpint (g_queue_get_length (q
), ==, 3);
1027 check_integrity (q
);
1028 g_assert (g_queue_is_empty (q
));
1040 free_func (gpointer data
)
1042 QueueItem
*item
= data
;
1052 item
= g_slice_new (QueueItem
);
1053 item
->freed
= FALSE
;
1060 test_free_full (void)
1062 QueueItem
*one
, *two
, *three
;
1063 GQueue
*queue
= NULL
;
1065 queue
= g_queue_new();
1066 g_queue_push_tail (queue
, one
= new_item (1));
1067 g_queue_push_tail (queue
, two
= new_item (2));
1068 g_queue_push_tail (queue
, three
= new_item (3));
1069 g_assert (!one
->freed
);
1070 g_assert (!two
->freed
);
1071 g_assert (!three
->freed
);
1072 g_queue_free_full (queue
, free_func
);
1073 g_assert (one
->freed
);
1074 g_assert (two
->freed
);
1075 g_assert (three
->freed
);
1076 g_slice_free (QueueItem
, one
);
1077 g_slice_free (QueueItem
, two
);
1078 g_slice_free (QueueItem
, three
);
1082 int main (int argc
, char *argv
[])
1087 g_test_init (&argc
, &argv
, NULL
);
1089 g_test_add_func ("/queue/basic", test_basic
);
1090 g_test_add_func ("/queue/copy", test_copy
);
1091 g_test_add_func ("/queue/off-by-one", test_off_by_one
);
1092 g_test_add_func ("/queue/find-custom", test_find_custom
);
1093 g_test_add_func ("/queue/static", test_static
);
1094 g_test_add_func ("/queue/clear", test_clear
);
1095 g_test_add_func ("/queue/free-full", test_free_full
);
1097 seed
= g_test_rand_int_range (0, G_MAXINT
);
1098 path
= g_strdup_printf ("/queue/random/seed:%u", seed
);
1099 g_test_add_data_func (path
, GUINT_TO_POINTER (seed
), random_test
);
1102 return g_test_run ();