From 041787ac82cf950f6ca12a7455cf86d47a0b2395 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 29 Sep 2009 09:06:13 +0200 Subject: [PATCH] check: New unit test for GstQueueArray --- tests/check/Makefile.am | 1 + tests/check/libs/queuearray.c | 246 ++++++++++++++++++++++++++++++++++ 2 files changed, 247 insertions(+) create mode 100644 tests/check/libs/queuearray.c diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index cbee2fab75..3124aa1ceb 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -94,6 +94,7 @@ REGISTRY_CHECKS = \ libs/basesrc \ libs/basesink \ libs/controller \ + libs/queuearray \ libs/typefindhelper \ pipelines/seek \ pipelines/stress \ diff --git a/tests/check/libs/queuearray.c b/tests/check/libs/queuearray.c new file mode 100644 index 0000000000..3f21f3c7c3 --- /dev/null +++ b/tests/check/libs/queuearray.c @@ -0,0 +1,246 @@ +/* GStreamer + * + * unit test for GstQueueArray + * + * Copyright (C) <2009> Edward Hervey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +/* Simplest test + * Initial size : 10 + * Add 10, Remove 10 + */ +GST_START_TEST (test_array_1) +{ + GstQueueArray *array; + guint i; + + /* Create an array of initial size 10 */ + array = gst_queue_array_new (10); + + /* push 5 values in */ + for (i = 0; i < 5; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + fail_unless_equals_int (array->length, 5); + + /* pull 5 values out */ + for (i = 0; i < 5; i++) { + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + fail_unless_equals_int (array->length, 0); + + gst_queue_array_free (array); +} + +GST_END_TEST; + +GST_START_TEST (test_array_grow) +{ + GstQueueArray *array; + guint i; + + /* Create an array of initial size 10 */ + array = gst_queue_array_new (10); + fail_unless_equals_int (array->size, 10); + + /* push 10 values in */ + for (i = 0; i < 10; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + fail_unless_equals_int (array->length, 10); + /* It did not grow beyond initial size */ + fail_unless_equals_int (array->size, 10); + /* The head is still at the beginning */ + fail_unless_equals_int (array->head, 0); + /* The tail wrapped around to the head */ + fail_unless_equals_int (array->tail, 0); + + + /* If we add one value, it will grow */ + gst_queue_array_push_tail (array, GINT_TO_POINTER (10)); + + fail_unless_equals_int (array->length, 11); + /* It did grow beyond initial size */ + fail_unless_equals_int (array->size, 15); + /* The head remains the same */ + fail_unless_equals_int (array->head, 0); + /* The tail was brought to position 11 */ + fail_unless_equals_int (array->tail, 11); + + /* pull the 11 values out */ + for (i = 0; i < 11; i++) { + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + fail_unless_equals_int (array->length, 0); + gst_queue_array_free (array); +} + +GST_END_TEST; + +GST_START_TEST (test_array_grow_multiple) +{ + GstQueueArray *array; + guint i; + + /* Create an array of initial size 10 */ + array = gst_queue_array_new (10); + fail_unless_equals_int (array->size, 10); + + /* push 11 values in */ + for (i = 0; i < 11; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + /* With 11 values, it should have grown once (15) */ + fail_unless_equals_int (array->length, 11); + fail_unless_equals_int (array->size, 15); + + for (i = 11; i < 20; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + /* With 20 total values, it should have grown another time (3 * 15) / 2 = 22) */ + fail_unless_equals_int (array->length, 20); + /* It did grow beyond initial size */ + fail_unless_equals_int (array->size, 22); + + /* pull the 20 values out */ + for (i = 0; i < 20; i++) { + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + fail_unless_equals_int (array->length, 0); + gst_queue_array_free (array); +} + +GST_END_TEST; + +GST_START_TEST (test_array_grow_middle) +{ + GstQueueArray *array; + guint i; + + /* Create an array of initial size 10 */ + array = gst_queue_array_new (10); + fail_unless_equals_int (array->size, 10); + + /* push/pull 5 values to end up in the middle */ + for (i = 0; i < 5; i++) { + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + /* push 10 values in */ + for (i = 0; i < 10; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + fail_unless_equals_int (array->length, 10); + /* It did not grow beyond initial size */ + fail_unless_equals_int (array->size, 10); + + /* If we add one value, it will grow */ + gst_queue_array_push_tail (array, GINT_TO_POINTER (10)); + fail_unless_equals_int (array->length, 11); + /* It did grow beyond initial size */ + fail_unless_equals_int (array->size, 15); + + /* pull the 11 values out */ + for (i = 0; i < 11; i++) { + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + fail_unless_equals_int (array->length, 0); + gst_queue_array_free (array); +} + +GST_END_TEST; + +GST_START_TEST (test_array_grow_end) +{ + GstQueueArray *array; + guint i; + + /* Create an array of initial size 10 */ + array = gst_queue_array_new (10); + fail_unless_equals_int (array->size, 10); + + /* push/pull 9 values to end up at the last position */ + for (i = 0; i < 9; i++) { + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + /* push 10 values in */ + for (i = 0; i < 10; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + fail_unless_equals_int (array->length, 10); + /* It did not grow beyond initial size */ + fail_unless_equals_int (array->size, 10); + + /* If we add one value, it will grow */ + gst_queue_array_push_tail (array, GINT_TO_POINTER (10)); + fail_unless_equals_int (array->length, 11); + /* It did grow beyond initial size */ + fail_unless_equals_int (array->size, 15); + + /* pull the 11 values out */ + for (i = 0; i < 11; i++) { + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_pop_head (array)), + i); + } + + fail_unless_equals_int (array->length, 0); + gst_queue_array_free (array); +} + +GST_END_TEST; + +static Suite * +gst_queue_array_suite (void) +{ + Suite *s = suite_create ("GstQueueArray"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + + tcase_add_test (tc_chain, test_array_1); + tcase_add_test (tc_chain, test_array_grow); + tcase_add_test (tc_chain, test_array_grow_multiple); + tcase_add_test (tc_chain, test_array_grow_middle); + tcase_add_test (tc_chain, test_array_grow_end); + + return s; +} + + +GST_CHECK_MAIN (gst_queue_array);