Merge branch 'array-test-fixes' into 'master'

Small array test fixes

See merge request GNOME/glib!996
This commit is contained in:
Emmanuele Bassi 2019-07-26 08:59:17 +00:00
commit b482a5c1a9
2 changed files with 63 additions and 22 deletions

View File

@ -845,18 +845,20 @@ g_array_binary_search (GArray *array,
while (left <= right) while (left <= right)
{ {
middle = (left + right) / 2; middle = left + (right - left) / 2;
val = compare_func (_array->data + (_array->elt_size * middle), target); val = compare_func (_array->data + (_array->elt_size * middle), target);
if (val < 0) if (val == 0)
left = middle + 1;
else if (val > 0)
right = middle - 1;
else
{ {
result = TRUE; result = TRUE;
break; break;
} }
else if (val < 0)
left = middle + 1;
else if (/* val > 0 && */ middle > 0)
right = middle - 1;
else
break; /* element not found */
} }
} }
@ -1020,6 +1022,9 @@ g_ptr_array_new (void)
* If @func is %NULL, then only the pointers (and not what they are * If @func is %NULL, then only the pointers (and not what they are
* pointing to) are copied to the new #GPtrArray. * pointing to) are copied to the new #GPtrArray.
* *
* The copy of @array will have the same #GDestroyNotify for its elements as
* @array.
*
* Returns: (transfer full): a deep copy of the initial #GPtrArray. * Returns: (transfer full): a deep copy of the initial #GPtrArray.
* *
* Since: 2.62 * Since: 2.62
@ -1035,6 +1040,8 @@ g_ptr_array_copy (GPtrArray *array,
g_return_val_if_fail (array != NULL, NULL); g_return_val_if_fail (array != NULL, NULL);
new_array = g_ptr_array_sized_new (array->len); new_array = g_ptr_array_sized_new (array->len);
g_ptr_array_set_free_func (new_array, ((GRealPtrArray *) array)->element_free_func);
if (func != NULL) if (func != NULL)
{ {
for (i = 0; i < array->len; i++) for (i = 0; i < array->len; i++)
@ -1046,6 +1053,8 @@ g_ptr_array_copy (GPtrArray *array,
array->len * sizeof (*array->pdata)); array->len * sizeof (*array->pdata));
} }
new_array->len = array->len;
return new_array; return new_array;
} }

View File

@ -508,8 +508,9 @@ array_copy (gconstpointer test_data)
/* Check internal parameters ('clear' flag) */ /* Check internal parameters ('clear' flag) */
if (config->clear_) if (config->clear_)
{ {
g_array_set_size (array_copy, array_copy->len + 5); guint old_length = array_copy->len;
for (i = array_copy->len; i < array_copy->len + 5; i++) g_array_set_size (array_copy, old_length + 5);
for (i = old_length; i < old_length + 5; i++)
g_assert_cmpint (g_array_index (array_copy, gint, i), ==, 0); g_assert_cmpint (g_array_index (array_copy, gint, i), ==, 0);
} }
@ -676,6 +677,9 @@ test_array_binary_search (void)
g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL));
i = 0;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
i = 2; i = 2;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
@ -683,26 +687,32 @@ test_array_binary_search (void)
/* Testing array of size 2 */ /* Testing array of size 2 */
garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 2); garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 2);
for (i = 0; i < 2; i++) for (i = 1; i < 3; i++)
g_array_append_val (garray, i); g_array_append_val (garray, i);
for (i = 0; i < 2; i++) for (i = 1; i < 3; i++)
g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL));
i = 3; i = 0;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
i = 4;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
g_array_free (garray, TRUE); g_array_free (garray, TRUE);
/* Testing array of size 3 */ /* Testing array of size 3 */
garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 3); garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 3);
for (i = 0; i < 3; i++) for (i = 1; i < 4; i++)
g_array_append_val (garray, i); g_array_append_val (garray, i);
for (i = 0; i < 3; i++) for (i = 1; i < 4; i++)
g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL));
i = 4; i = 0;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
i = 5;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
g_array_free (garray, TRUE); g_array_free (garray, TRUE);
@ -710,23 +720,43 @@ test_array_binary_search (void)
/* Testing array of size 10000 */ /* Testing array of size 10000 */
garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 10000); garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 10000);
for (i = 0; i < 10000; i++) for (i = 1; i < 10001; i++)
g_array_append_val (garray, i); g_array_append_val (garray, i);
for (i = 0; i < 10000; i++) for (i = 1; i < 10001; i++)
g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_true (g_array_binary_search (garray, &i, cmpint, NULL));
for (i = 0; i < 10000; i++) for (i = 1; i < 10001; i++)
{ {
g_assert_true (g_array_binary_search (garray, &i, cmpint, &matched_index)); g_assert_true (g_array_binary_search (garray, &i, cmpint, &matched_index));
g_assert_cmpint (i, ==, matched_index); g_assert_cmpint (i, ==, matched_index + 1);
} }
/* Testing negative result */ /* Testing negative result */
i = 10001; i = 0;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL)); g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
g_assert_false (g_array_binary_search (garray, &i, cmpint, &matched_index)); g_assert_false (g_array_binary_search (garray, &i, cmpint, &matched_index));
i = 10002;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
g_assert_false (g_array_binary_search (garray, &i, cmpint, &matched_index));
g_array_free (garray, TRUE);
/* Test for a not-found element in the middle of the array. */
garray = g_array_sized_new (FALSE, FALSE, sizeof (guint), 3);
for (i = 1; i < 10; i += 2)
g_array_append_val (garray, i);
i = 0;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
i = 2;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
i = 10;
g_assert_false (g_array_binary_search (garray, &i, cmpint, NULL));
g_array_free (garray, TRUE); g_array_free (garray, TRUE);
} }
@ -938,6 +968,8 @@ pointer_array_copy (void)
ptr_array = g_ptr_array_sized_new (0); ptr_array = g_ptr_array_sized_new (0);
ptr_array2 = g_ptr_array_copy (ptr_array, NULL, NULL); ptr_array2 = g_ptr_array_copy (ptr_array, NULL, NULL);
g_assert_cmpuint (ptr_array2->len, ==, ptr_array->len);
g_ptr_array_unref (ptr_array); g_ptr_array_unref (ptr_array);
g_ptr_array_unref (ptr_array2); g_ptr_array_unref (ptr_array2);
@ -949,6 +981,7 @@ pointer_array_copy (void)
ptr_array2 = g_ptr_array_copy (ptr_array, NULL, NULL); ptr_array2 = g_ptr_array_copy (ptr_array, NULL, NULL);
g_assert_cmpuint (ptr_array2->len, ==, ptr_array->len);
for (i = 0; i < array_size; i++) for (i = 0; i < array_size; i++)
g_assert_cmpuint (*((gsize *) g_ptr_array_index (ptr_array2, i)), ==, i); g_assert_cmpuint (*((gsize *) g_ptr_array_index (ptr_array2, i)), ==, i);
@ -960,7 +993,9 @@ pointer_array_copy (void)
/* Test copy through GCopyFunc */ /* Test copy through GCopyFunc */
ptr_array2 = g_ptr_array_copy (ptr_array, ptr_array_copy_func, NULL); ptr_array2 = g_ptr_array_copy (ptr_array, ptr_array_copy_func, NULL);
g_ptr_array_set_free_func (ptr_array2, g_free);
g_assert_cmpuint (ptr_array2->len, ==, ptr_array->len);
for (i = 0; i < array_size; i++) for (i = 0; i < array_size; i++)
g_assert_cmpuint (*((gsize *) g_ptr_array_index (ptr_array2, i)), ==, i); g_assert_cmpuint (*((gsize *) g_ptr_array_index (ptr_array2, i)), ==, i);
@ -968,9 +1003,6 @@ pointer_array_copy (void)
g_assert_cmpuint ((gsize) g_ptr_array_index (ptr_array, i), !=, g_assert_cmpuint ((gsize) g_ptr_array_index (ptr_array, i), !=,
(gsize) g_ptr_array_index (ptr_array2, i)); (gsize) g_ptr_array_index (ptr_array2, i));
for (i = 0; i < array_size; i++)
free(ptr_array2->pdata[i]);
g_ptr_array_free (ptr_array2, TRUE); g_ptr_array_free (ptr_array2, TRUE);
/* Final cleanup */ /* Final cleanup */