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
);
532 g_queue_insert_before (q
, NULL
, x
);
534 qinf
->head
= q
->head
;
535 qinf
->tail
= q
->tail
;
536 qinf
->length
= q
->length
;
539 if (!g_queue_is_empty (q
))
541 gpointer x
= GINT_TO_POINTER (g_random_int_range (0, 386538));
543 g_queue_insert_after (q
, qinf
->tail
, x
);
544 g_queue_insert_after (q
, qinf
->head
, x
);
545 g_queue_insert_after (q
, g_queue_find (q
, x
), x
);
546 g_queue_insert_after (q
, NULL
, x
);
548 qinf
->head
= q
->head
;
549 qinf
->tail
= q
->tail
;
550 qinf
->length
= q
->length
;
554 int max
= find_max (q
);
555 int min
= find_min (q
);
557 if (g_queue_is_empty (q
))
563 g_queue_sort (q
, compare_int
, NULL
);
565 g_queue_insert_sorted (q
, GINT_TO_POINTER (max
+ 1), compare_int
, NULL
);
567 g_assert (GPOINTER_TO_INT (q
->tail
->data
) == max
+ 1);
568 g_queue_insert_sorted (q
, GINT_TO_POINTER (min
- 1), compare_int
, NULL
);
570 g_assert (GPOINTER_TO_INT (q
->head
->data
) == min
- 1);
571 qinf
->head
= q
->head
;
572 qinf
->tail
= q
->tail
;
573 qinf
->length
= q
->length
;
578 GList
*link
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
579 g_queue_push_head_link (q
, link
);
588 GList
*link
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
589 g_queue_push_tail_link (q
, link
);
598 GList
*link
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
599 gint n
= get_random_position (q
, TRUE
);
600 g_queue_push_nth_link (q
, n
, link
);
602 if (qinf
->head
&& qinf
->head
->prev
)
603 qinf
->head
= qinf
->head
->prev
;
605 qinf
->head
= q
->head
;
606 if (qinf
->tail
&& qinf
->tail
->next
)
607 qinf
->tail
= qinf
->tail
->next
;
609 qinf
->tail
= g_list_last (qinf
->head
);
614 if (!g_queue_is_empty (q
))
616 qinf
->head
= qinf
->head
->next
;
620 g_list_free (g_queue_pop_head_link (q
));
624 if (!g_queue_is_empty (q
))
626 qinf
->tail
= qinf
->tail
->prev
;
630 g_list_free (g_queue_pop_tail_link (q
));
634 if (g_queue_is_empty (q
))
635 g_assert (g_queue_pop_nth_link (q
, 200) == NULL
);
638 int n
= get_random_position (q
, FALSE
);
640 if (n
== g_queue_get_length (q
) - 1)
641 qinf
->tail
= qinf
->tail
->prev
;
644 qinf
->head
= qinf
->head
->next
;
648 g_list_free (g_queue_pop_nth_link (q
, n
));
652 if (g_queue_is_empty (q
))
653 g_assert (g_queue_peek_head_link (q
) == NULL
);
655 g_assert (g_queue_peek_head_link (q
) == qinf
->head
);
658 if (g_queue_is_empty (q
))
659 g_assert (g_queue_peek_tail_link (q
) == NULL
);
661 g_assert (g_queue_peek_tail_link (q
) == qinf
->tail
);
664 if (g_queue_is_empty(q
))
665 g_assert (g_queue_peek_nth_link (q
, 1000) == NULL
);
668 gint n
= get_random_position (q
, FALSE
);
672 for (j
= 0; j
< n
; ++j
)
675 g_assert (g_queue_peek_nth_link (q
, n
) == link
);
679 if (!g_queue_is_empty (q
))
681 gint n
= g_random_int_range (0, g_queue_get_length (q
));
685 for (j
= 0; j
< n
; ++j
)
688 g_queue_unlink (q
, link
);
693 qinf
->head
= q
->head
;
694 qinf
->tail
= q
->tail
;
699 if (!g_queue_is_empty (q
))
701 gint n
= g_random_int_range (0, g_queue_get_length (q
));
705 for (j
= 0; j
< n
; ++j
)
708 g_queue_delete_link (q
, link
);
711 qinf
->head
= q
->head
;
712 qinf
->tail
= q
->tail
;
718 g_assert_not_reached();
722 if (qinf
->head
!= q
->head
||
723 qinf
->tail
!= q
->tail
||
724 qinf
->length
!= q
->length
)
725 g_printerr ("op: %d\n", op
);
727 g_assert (qinf
->head
== q
->head
);
728 g_assert (qinf
->tail
== q
->tail
);
729 g_assert (qinf
->length
== q
->length
);
731 for (j
= 0; j
< N_QUEUES
; ++j
)
732 check_integrity (queues
[j
].queue
);
735 for (i
= 0; i
< N_QUEUES
; ++i
)
736 g_queue_free (queues
[i
].queue
);
740 remove_item (gpointer data
, gpointer q
)
744 g_queue_remove (queue
, data
);
756 g_assert (g_queue_is_empty (q
));
757 g_queue_push_head (q
, GINT_TO_POINTER (2));
759 g_assert (g_queue_peek_head (q
) == GINT_TO_POINTER (2));
761 g_assert (!g_queue_is_empty (q
));
763 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
764 g_assert (q
->head
== q
->tail
);
765 g_queue_push_head (q
, GINT_TO_POINTER (1));
767 g_assert (q
->head
->next
== q
->tail
);
768 g_assert (q
->tail
->prev
== q
->head
);
769 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
771 g_assert (q
->tail
->data
== GINT_TO_POINTER (2));
772 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
774 g_queue_push_tail (q
, GINT_TO_POINTER (3));
775 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
776 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
777 g_assert (q
->head
->next
->data
== GINT_TO_POINTER (2));
778 g_assert (q
->head
->next
->next
== q
->tail
);
779 g_assert (q
->head
->next
== q
->tail
->prev
);
780 g_assert (q
->tail
->data
== GINT_TO_POINTER (3));
781 g_queue_push_tail (q
, GINT_TO_POINTER (4));
783 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
784 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
785 g_assert (g_queue_peek_tail (q
) == GINT_TO_POINTER (4));
786 g_queue_push_tail (q
, GINT_TO_POINTER (5));
788 g_assert_cmpint (g_list_length (q
->head
), ==, 5);
789 g_assert (g_queue_is_empty (q
) == FALSE
);
791 g_assert_cmpint (q
->length
, ==, 5);
792 g_assert (q
->head
->prev
== NULL
);
793 g_assert (q
->head
->data
== GINT_TO_POINTER (1));
794 g_assert (q
->head
->next
->data
== GINT_TO_POINTER (2));
795 g_assert (q
->head
->next
->next
->data
== GINT_TO_POINTER (3));
796 g_assert (q
->head
->next
->next
->next
->data
== GINT_TO_POINTER (4));
797 g_assert (q
->head
->next
->next
->next
->next
->data
== GINT_TO_POINTER (5));
798 g_assert (q
->head
->next
->next
->next
->next
->next
== NULL
);
799 g_assert (q
->head
->next
->next
->next
->next
== q
->tail
);
800 g_assert (q
->tail
->data
== GINT_TO_POINTER (5));
801 g_assert (q
->tail
->prev
->data
== GINT_TO_POINTER (4));
802 g_assert (q
->tail
->prev
->prev
->data
== GINT_TO_POINTER (3));
803 g_assert (q
->tail
->prev
->prev
->prev
->data
== GINT_TO_POINTER (2));
804 g_assert (q
->tail
->prev
->prev
->prev
->prev
->data
== GINT_TO_POINTER (1));
805 g_assert (q
->tail
->prev
->prev
->prev
->prev
->prev
== NULL
);
806 g_assert (q
->tail
->prev
->prev
->prev
->prev
== q
->head
);
807 g_assert (g_queue_peek_tail (q
) == GINT_TO_POINTER (5));
808 g_assert (g_queue_peek_head (q
) == GINT_TO_POINTER (1));
809 g_assert (g_queue_pop_head (q
) == GINT_TO_POINTER (1));
811 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
812 g_assert_cmpint (q
->length
, ==, 4);
813 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (5));
815 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
817 node
= g_queue_pop_head_link (q
);
818 g_assert (node
->data
== GINT_TO_POINTER (2));
819 g_list_free_1 (node
);
822 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
823 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (4));
825 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
826 node
= g_queue_pop_head_link (q
);
827 g_assert (node
->data
== GINT_TO_POINTER (3));
828 g_list_free_1 (node
);
830 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
831 g_assert (g_queue_pop_tail (q
) == NULL
);
833 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
834 g_assert (g_queue_pop_head (q
) == NULL
);
836 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
837 g_assert (g_queue_is_empty (q
));
840 g_queue_push_head (q
, GINT_TO_POINTER (1));
842 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
843 g_assert_cmpint (q
->length
, ==, 1);
844 g_queue_push_head (q
, GINT_TO_POINTER (2));
846 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
847 g_assert_cmpint (q
->length
, ==, 2);
848 g_queue_push_head (q
, GINT_TO_POINTER (3));
850 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
851 g_assert_cmpint (q
->length
, ==, 3);
852 g_queue_push_head (q
, GINT_TO_POINTER (4));
854 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
855 g_assert_cmpint (q
->length
, ==, 4);
856 g_queue_push_head (q
, GINT_TO_POINTER (5));
858 g_assert_cmpint (g_list_length (q
->head
), ==, 5);
859 g_assert_cmpint (q
->length
, ==, 5);
860 g_assert (g_queue_pop_head (q
) == GINT_TO_POINTER (5));
862 g_assert_cmpint (g_list_length (q
->head
), ==, 4);
864 g_assert (node
== g_queue_pop_tail_link (q
));
866 g_list_free_1 (node
);
867 g_assert_cmpint (g_list_length (q
->head
), ==, 3);
868 data
= q
->head
->data
;
869 g_assert (data
== g_queue_pop_head (q
));
871 g_assert_cmpint (g_list_length (q
->head
), ==, 2);
872 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (2));
874 g_assert_cmpint (g_list_length (q
->head
), ==, 1);
875 g_assert (q
->head
== q
->tail
);
876 g_assert (g_queue_pop_tail (q
) == GINT_TO_POINTER (3));
878 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
879 g_assert (g_queue_pop_head (q
) == NULL
);
881 g_assert (g_queue_pop_head_link (q
) == NULL
);
883 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
884 g_assert (g_queue_pop_tail_link (q
) == NULL
);
886 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
890 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
901 q2
= g_queue_copy (q
);
903 check_integrity (q2
);
904 g_assert_cmpint (g_list_length (q
->head
), ==, 0);
905 g_assert_cmpint (g_list_length (q2
->head
), ==, 0);
906 g_queue_sort (q
, compare_int
, NULL
);
907 check_integrity (q2
);
909 g_queue_sort (q2
, compare_int
, NULL
);
910 check_integrity (q2
);
913 for (i
= 0; i
< 200; ++i
)
915 g_queue_push_nth (q
, GINT_TO_POINTER (i
), i
);
916 g_assert (g_queue_find (q
, GINT_TO_POINTER (i
)));
918 check_integrity (q2
);
921 for (i
= 0; i
< 200; ++i
)
923 g_queue_remove (q
, GINT_TO_POINTER (i
));
925 check_integrity (q2
);
928 for (i
= 0; i
< 200; ++i
)
930 GList
*l
= g_list_prepend (NULL
, GINT_TO_POINTER (i
));
932 g_queue_push_nth_link (q
, i
, l
);
934 check_integrity (q2
);
937 check_integrity (q2
);
941 q2
= g_queue_copy (q
);
943 g_queue_foreach (q2
, remove_item
, q2
);
944 check_integrity (q2
);
952 test_off_by_one (void)
959 g_queue_push_tail (q
, GINT_TO_POINTER (1234));
961 node
= g_queue_peek_tail_link (q
);
962 g_assert (node
!= NULL
&& node
->data
== GINT_TO_POINTER (1234));
963 node
= g_queue_peek_nth_link (q
, g_queue_get_length (q
));
964 g_assert (node
== NULL
);
965 node
= g_queue_peek_nth_link (q
, g_queue_get_length (q
) - 1);
966 g_assert (node
->data
== GINT_TO_POINTER (1234));
967 node
= g_queue_pop_nth_link (q
, g_queue_get_length (q
));
968 g_assert (node
== NULL
);
969 node
= g_queue_pop_nth_link (q
, g_queue_get_length (q
) - 1);
970 g_assert (node
!= NULL
&& node
->data
== GINT_TO_POINTER (1234));
971 g_list_free_1 (node
);
977 find_custom (gconstpointer a
, gconstpointer b
)
979 return GPOINTER_TO_INT (a
) - GPOINTER_TO_INT (b
);
983 test_find_custom (void)
989 g_queue_push_tail (q
, GINT_TO_POINTER (1234));
990 g_queue_push_tail (q
, GINT_TO_POINTER (1));
991 g_queue_push_tail (q
, GINT_TO_POINTER (2));
992 node
= g_queue_find_custom (q
, GINT_TO_POINTER (1), find_custom
);
993 g_assert (node
!= NULL
);
994 node
= g_queue_find_custom (q
, GINT_TO_POINTER (2), find_custom
);
995 g_assert (node
!= NULL
);
996 node
= g_queue_find_custom (q
, GINT_TO_POINTER (3), find_custom
);
997 g_assert (node
== NULL
);
1006 GQueue q2
= G_QUEUE_INIT
;
1010 check_integrity (&q
);
1011 g_assert (g_queue_is_empty (&q
));
1013 check_integrity (&q2
);
1014 g_assert (g_queue_is_empty (&q2
));
1023 g_queue_push_tail (q
, GINT_TO_POINTER (1234));
1024 g_queue_push_tail (q
, GINT_TO_POINTER (1));
1025 g_queue_push_tail (q
, GINT_TO_POINTER (2));
1026 g_assert_cmpint (g_queue_get_length (q
), ==, 3);
1029 check_integrity (q
);
1030 g_assert (g_queue_is_empty (q
));
1042 free_func (gpointer data
)
1044 QueueItem
*item
= data
;
1054 item
= g_slice_new (QueueItem
);
1055 item
->freed
= FALSE
;
1062 test_free_full (void)
1064 QueueItem
*one
, *two
, *three
;
1065 GQueue
*queue
= NULL
;
1067 queue
= g_queue_new();
1068 g_queue_push_tail (queue
, one
= new_item (1));
1069 g_queue_push_tail (queue
, two
= new_item (2));
1070 g_queue_push_tail (queue
, three
= new_item (3));
1071 g_assert (!one
->freed
);
1072 g_assert (!two
->freed
);
1073 g_assert (!three
->freed
);
1074 g_queue_free_full (queue
, free_func
);
1075 g_assert (one
->freed
);
1076 g_assert (two
->freed
);
1077 g_assert (three
->freed
);
1078 g_slice_free (QueueItem
, one
);
1079 g_slice_free (QueueItem
, two
);
1080 g_slice_free (QueueItem
, three
);
1084 int main (int argc
, char *argv
[])
1089 g_test_init (&argc
, &argv
, NULL
);
1091 g_test_add_func ("/queue/basic", test_basic
);
1092 g_test_add_func ("/queue/copy", test_copy
);
1093 g_test_add_func ("/queue/off-by-one", test_off_by_one
);
1094 g_test_add_func ("/queue/find-custom", test_find_custom
);
1095 g_test_add_func ("/queue/static", test_static
);
1096 g_test_add_func ("/queue/clear", test_clear
);
1097 g_test_add_func ("/queue/free-full", test_free_full
);
1099 seed
= g_test_rand_int_range (0, G_MAXINT
);
1100 path
= g_strdup_printf ("/queue/random/seed:%u", seed
);
1101 g_test_add_data_func (path
, GUINT_TO_POINTER (seed
), random_test
);
1104 return g_test_run ();