Improve array test coverage

This commit is contained in:
Matthias Clasen 2010-07-29 23:08:07 -04:00
parent 03be0d7237
commit 027905c27a

View File

@ -32,8 +32,8 @@
#include <string.h>
#include "glib.h"
static void
sum_up (gpointer data,
static void
sum_up (gpointer data,
gpointer user_data)
{
gint *sum = (gint *)user_data;
@ -46,6 +46,7 @@ array_append (void)
{
GArray *garray;
gint i;
gint *segment;
garray = g_array_new (FALSE, FALSE, sizeof (gint));
for (i = 0; i < 10000; i++)
@ -54,7 +55,10 @@ array_append (void)
for (i = 0; i < 10000; i++)
g_assert_cmpint (g_array_index (garray, gint, i), ==, i);
g_array_free (garray, TRUE);
segment = (gint*)g_array_free (garray, FALSE);
for (i = 0; i < 10000; i++)
g_assert_cmpint (segment[i], ==, i);
g_free (segment);
}
static void
@ -73,6 +77,102 @@ array_prepend (void)
g_array_free (garray, TRUE);
}
static void
array_remove (void)
{
GArray *garray;
gint i;
gint prev, cur;
garray = g_array_new (FALSE, FALSE, sizeof (gint));
for (i = 0; i < 100; i++)
g_array_append_val (garray, i);
g_assert_cmpint (garray->len, ==, 100);
g_array_remove_index (garray, 1);
g_array_remove_index (garray, 3);
g_array_remove_index (garray, 21);
g_array_remove_index (garray, 57);
g_assert_cmpint (garray->len, ==, 96);
prev = -1;
for (i = 0; i < garray->len; i++)
{
cur = g_array_index (garray, gint, i);
g_assert (cur != 1 && cur != 4 && cur != 23 && cur != 60);
g_assert_cmpint (prev, <, cur);
prev = cur;
}
g_array_free (garray, TRUE);
}
static void
array_remove_fast (void)
{
GArray *garray;
gint i;
gint prev, cur;
garray = g_array_new (FALSE, FALSE, sizeof (gint));
for (i = 0; i < 100; i++)
g_array_append_val (garray, i);
g_assert_cmpint (garray->len, ==, 100);
g_array_remove_index_fast (garray, 1);
g_array_remove_index_fast (garray, 3);
g_array_remove_index_fast (garray, 21);
g_array_remove_index_fast (garray, 57);
g_assert_cmpint (garray->len, ==, 96);
prev = -1;
for (i = 0; i < garray->len; i++)
{
cur = g_array_index (garray, gint, i);
g_assert (cur != 1 && cur != 3 && cur != 21 && cur != 57);
if (cur < 96)
{
g_assert_cmpint (prev, <, cur);
prev = cur;
}
}
g_array_free (garray, TRUE);
}
static void
array_remove_range (void)
{
GArray *garray;
gint i;
gint prev, cur;
garray = g_array_new (FALSE, FALSE, sizeof (gint));
for (i = 0; i < 100; i++)
g_array_append_val (garray, i);
g_assert_cmpint (garray->len, ==, 100);
g_array_remove_range (garray, 31, 4);
g_assert_cmpint (garray->len, ==, 96);
prev = -1;
for (i = 0; i < garray->len; i++)
{
cur = g_array_index (garray, gint, i);
g_assert (cur < 31 || cur > 34);
g_assert_cmpint (prev, <, cur);
prev = cur;
}
g_array_free (garray, TRUE);
}
static void
array_ref_count (void)
{
@ -136,14 +236,84 @@ array_large_size (void)
g_array_free (array, TRUE);
}
static int
int_compare (gconstpointer p1, gconstpointer p2)
{
const gint *i1 = p1;
const gint *i2 = p2;
return *i1 - *i2;
}
static int
int_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
{
const gint *i1 = p1;
const gint *i2 = p2;
return *i1 - *i2;
}
static void
array_sort (void)
{
GArray *garray;
gint i;
gint prev, cur;
garray = g_array_new (FALSE, FALSE, sizeof (gint));
for (i = 0; i < 10000; i++)
{
cur = g_random_int_range (0, 10000);
g_array_append_val (garray, cur);
}
g_array_sort (garray, int_compare);
prev = -1;
for (i = 0; i < garray->len; i++)
{
cur = g_array_index (garray, gint, i);
g_assert_cmpint (prev, <=, cur);
prev = cur;
}
g_array_free (garray, TRUE);
}
static void
array_sort_with_data (void)
{
GArray *garray;
gint i;
gint prev, cur;
garray = g_array_new (FALSE, FALSE, sizeof (gint));
for (i = 0; i < 10000; i++)
{
cur = g_random_int_range (0, 10000);
g_array_append_val (garray, cur);
}
g_array_sort_with_data (garray, int_compare_data, NULL);
prev = -1;
for (i = 0; i < garray->len; i++)
{
cur = g_array_index (garray, gint, i);
g_assert_cmpint (prev, <=, cur);
prev = cur;
}
g_array_free (garray, TRUE);
}
static void
pointer_array_add (void)
{
GPtrArray *gparray;
gint i;
gint sum = 0;
gpointer *segment;
gparray = g_ptr_array_new ();
gparray = g_ptr_array_sized_new (1000);
for (i = 0; i < 10000; i++)
g_ptr_array_add (gparray, GINT_TO_POINTER (i));
@ -153,7 +323,10 @@ pointer_array_add (void)
g_ptr_array_foreach (gparray, sum_up, &sum);
g_assert (sum == 49995000);
g_ptr_array_free (gparray, TRUE);
segment = g_ptr_array_free (gparray, FALSE);
for (i = 0; i < 10000; i++)
g_assert (segment[i] == GINT_TO_POINTER (i));
g_free (segment);
}
static void
@ -270,15 +443,117 @@ pointer_array_free_func (void)
g_assert_cmpint (num_free_func_invocations, ==, 0);
}
static gint
ptr_compare (gconstpointer p1, gconstpointer p2)
{
gpointer i1 = *(gpointer*)p1;
gpointer i2 = *(gpointer*)p2;
return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2);
}
static gint
ptr_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
{
gpointer i1 = *(gpointer*)p1;
gpointer i2 = *(gpointer*)p2;
return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2);
}
static void
pointer_array_sort (void)
{
GPtrArray *gparray;
gint i;
gint val;
gint prev, cur;
gparray = g_ptr_array_new ();
for (i = 0; i < 10000; i++)
{
val = g_random_int_range (0, 10000);
g_ptr_array_add (gparray, GINT_TO_POINTER (val));
}
g_ptr_array_sort (gparray, ptr_compare);
prev = -1;
for (i = 0; i < 10000; i++)
{
cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i));
g_assert_cmpint (prev, <=, cur);
prev = cur;
}
g_ptr_array_free (gparray, TRUE);
}
static void
pointer_array_sort_with_data (void)
{
GPtrArray *gparray;
gint i;
gint prev, cur;
gparray = g_ptr_array_new ();
for (i = 0; i < 10000; i++)
g_ptr_array_add (gparray, GINT_TO_POINTER (g_random_int_range (0, 10000)));
g_ptr_array_sort_with_data (gparray, ptr_compare_data, NULL);
prev = -1;
for (i = 0; i < 10000; i++)
{
cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i));
g_assert_cmpint (prev, <=, cur);
prev = cur;
}
g_ptr_array_free (gparray, TRUE);
}
static void
byte_array_append (void)
{
GByteArray *gbarray;
gint i;
guint8 *segment;
gbarray = g_byte_array_sized_new (1000);
for (i = 0; i < 10000; i++)
g_byte_array_append (gbarray, (guint8*) "abcd", 4);
for (i = 0; i < 10000; i++)
{
g_assert (gbarray->data[4*i] == 'a');
g_assert (gbarray->data[4*i+1] == 'b');
g_assert (gbarray->data[4*i+2] == 'c');
g_assert (gbarray->data[4*i+3] == 'd');
}
segment = g_byte_array_free (gbarray, FALSE);
for (i = 0; i < 10000; i++)
{
g_assert (segment[4*i] == 'a');
g_assert (segment[4*i+1] == 'b');
g_assert (segment[4*i+2] == 'c');
g_assert (segment[4*i+3] == 'd');
}
g_free (segment);
}
static void
byte_array_prepend (void)
{
GByteArray *gbarray;
gint i;
gbarray = g_byte_array_new ();
for (i = 0; i < 10000; i++)
g_byte_array_append (gbarray, (guint8*) "abcd", 4);
g_byte_array_prepend (gbarray, (guint8*) "abcd", 4);
for (i = 0; i < 10000; i++)
{
@ -320,6 +595,167 @@ byte_array_ref_count (void)
g_byte_array_unref (gbarray2);
}
static void
byte_array_remove (void)
{
GByteArray *gbarray;
gint i;
gbarray = g_byte_array_new ();
for (i = 0; i < 100; i++)
g_byte_array_append (gbarray, (guint8*) "abcd", 4);
g_assert_cmpint (gbarray->len, ==, 400);
g_byte_array_remove_index (gbarray, 4);
g_byte_array_remove_index (gbarray, 4);
g_byte_array_remove_index (gbarray, 4);
g_byte_array_remove_index (gbarray, 4);
g_assert_cmpint (gbarray->len, ==, 396);
for (i = 0; i < 99; i++)
{
g_assert (gbarray->data[4*i] == 'a');
g_assert (gbarray->data[4*i+1] == 'b');
g_assert (gbarray->data[4*i+2] == 'c');
g_assert (gbarray->data[4*i+3] == 'd');
}
g_byte_array_free (gbarray, TRUE);
}
static void
byte_array_remove_fast (void)
{
GByteArray *gbarray;
gint i;
gbarray = g_byte_array_new ();
for (i = 0; i < 100; i++)
g_byte_array_append (gbarray, (guint8*) "abcd", 4);
g_assert_cmpint (gbarray->len, ==, 400);
g_byte_array_remove_index_fast (gbarray, 4);
g_byte_array_remove_index_fast (gbarray, 4);
g_byte_array_remove_index_fast (gbarray, 4);
g_byte_array_remove_index_fast (gbarray, 4);
g_assert_cmpint (gbarray->len, ==, 396);
for (i = 0; i < 99; i++)
{
g_assert (gbarray->data[4*i] == 'a');
g_assert (gbarray->data[4*i+1] == 'b');
g_assert (gbarray->data[4*i+2] == 'c');
g_assert (gbarray->data[4*i+3] == 'd');
}
g_byte_array_free (gbarray, TRUE);
}
static void
byte_array_remove_range (void)
{
GByteArray *gbarray;
gint i;
gbarray = g_byte_array_new ();
for (i = 0; i < 100; i++)
g_byte_array_append (gbarray, (guint8*) "abcd", 4);
g_assert_cmpint (gbarray->len, ==, 400);
g_byte_array_remove_range (gbarray, 12, 4);
g_assert_cmpint (gbarray->len, ==, 396);
for (i = 0; i < 99; i++)
{
g_assert (gbarray->data[4*i] == 'a');
g_assert (gbarray->data[4*i+1] == 'b');
g_assert (gbarray->data[4*i+2] == 'c');
g_assert (gbarray->data[4*i+3] == 'd');
}
g_byte_array_free (gbarray, TRUE);
}
static int
byte_compare (gconstpointer p1, gconstpointer p2)
{
const guint8 *i1 = p1;
const guint8 *i2 = p2;
return *i1 - *i2;
}
static int
byte_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
{
const guint8 *i1 = p1;
const guint8 *i2 = p2;
return *i1 - *i2;
}
static void
byte_array_sort (void)
{
GByteArray *gbarray;
gint i;
guint8 val;
guint8 prev, cur;
gbarray = g_byte_array_new ();
for (i = 0; i < 100; i++)
{
val = 'a' + g_random_int_range (0, 26);
g_byte_array_append (gbarray, (guint8*) &val, 1);
}
g_byte_array_sort (gbarray, byte_compare);
prev = 'a';
for (i = 0; i < gbarray->len; i++)
{
cur = gbarray->data[i];
g_assert_cmpint (prev, <=, cur);
prev = cur;
}
g_byte_array_free (gbarray, TRUE);
}
static void
byte_array_sort_with_data (void)
{
GByteArray *gbarray;
gint i;
guint8 val;
guint8 prev, cur;
gbarray = g_byte_array_new ();
for (i = 0; i < 100; i++)
{
val = 'a' + g_random_int_range (0, 26);
g_byte_array_append (gbarray, (guint8*) &val, 1);
}
g_byte_array_sort_with_data (gbarray, byte_compare_data, NULL);
prev = 'a';
for (i = 0; i < gbarray->len; i++)
{
cur = gbarray->data[i];
g_assert_cmpint (prev, <=, cur);
prev = cur;
}
g_byte_array_free (gbarray, TRUE);
}
int
main (int argc, char *argv[])
{
@ -330,17 +766,30 @@ main (int argc, char *argv[])
/* array tests */
g_test_add_func ("/array/append", array_append);
g_test_add_func ("/array/prepend", array_prepend);
g_test_add_func ("/array/remove", array_remove);
g_test_add_func ("/array/remove-fast", array_remove_fast);
g_test_add_func ("/array/remove-range", array_remove_range);
g_test_add_func ("/array/ref-count", array_ref_count);
g_test_add_func ("/array/large-size", array_large_size);
g_test_add_func ("/array/sort", array_sort);
g_test_add_func ("/array/sort-with-data", array_sort_with_data);
/* pointer arrays */
g_test_add_func ("/pointerarray/add", pointer_array_add);
g_test_add_func ("/pointerarray/ref-count", pointer_array_ref_count);
g_test_add_func ("/pointerarray/free-func", pointer_array_free_func);
g_test_add_func ("/pointerarray/sort", pointer_array_sort);
g_test_add_func ("/pointerarray/sort-with-data", pointer_array_sort_with_data);
/* byte arrays */
g_test_add_func ("/bytearray/append", byte_array_append);
g_test_add_func ("/bytearray/prepend", byte_array_prepend);
g_test_add_func ("/bytearray/remove", byte_array_remove);
g_test_add_func ("/bytearray/remove-fast", byte_array_remove_fast);
g_test_add_func ("/bytearray/remove-range", byte_array_remove_range);
g_test_add_func ("/bytearray/ref-count", byte_array_ref_count);
g_test_add_func ("/bytearray/sort", byte_array_sort);
g_test_add_func ("/bytearray/sort-with-data", byte_array_sort_with_data);
return g_test_run ();
}