mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 03:20:46 -05:00
cogl: Move out bitmask unit test to separate file
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2555>
This commit is contained in:
parent
9a9e7e471c
commit
d0861c8ae2
@ -36,8 +36,6 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <test-fixtures/test-unit.h>
|
|
||||||
|
|
||||||
#include "cogl-bitmask.h"
|
#include "cogl-bitmask.h"
|
||||||
#include "cogl-util.h"
|
#include "cogl-util.h"
|
||||||
#include "cogl-flags.h"
|
#include "cogl-flags.h"
|
||||||
@ -319,171 +317,3 @@ _cogl_bitmask_popcount_upto_in_array (const CoglBitmask *bitmask,
|
|||||||
return pop + _cogl_util_popcountl (top_mask & ((1UL << bit_index) - 1));
|
return pop + _cogl_util_popcountl (top_mask & ((1UL << bit_index) - 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int n_bits;
|
|
||||||
int *bits;
|
|
||||||
} CheckData;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
check_bit (int bit_num, void *user_data)
|
|
||||||
{
|
|
||||||
CheckData *data = user_data;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < data->n_bits; i++)
|
|
||||||
if (data->bits[i] == bit_num)
|
|
||||||
{
|
|
||||||
data->bits[i] = -1;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_assert_not_reached ();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
verify_bits (const CoglBitmask *bitmask,
|
|
||||||
...)
|
|
||||||
{
|
|
||||||
CheckData data;
|
|
||||||
va_list ap, ap_copy;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
va_start (ap, bitmask);
|
|
||||||
G_VA_COPY (ap_copy, ap);
|
|
||||||
|
|
||||||
for (data.n_bits = 0; va_arg (ap, int) != -1; data.n_bits++);
|
|
||||||
|
|
||||||
data.bits = alloca (data.n_bits * (sizeof (int)));
|
|
||||||
|
|
||||||
G_VA_COPY (ap, ap_copy);
|
|
||||||
|
|
||||||
for (i = 0; i < data.n_bits; i++)
|
|
||||||
data.bits[i] = va_arg (ap, int);
|
|
||||||
|
|
||||||
_cogl_bitmask_foreach (bitmask, check_bit, &data);
|
|
||||||
|
|
||||||
for (i = 0; i < data.n_bits; i++)
|
|
||||||
g_assert_cmpint (data.bits[i], ==, -1);
|
|
||||||
|
|
||||||
g_assert_cmpint (_cogl_bitmask_popcount (bitmask), ==, data.n_bits);
|
|
||||||
|
|
||||||
for (i = 0; i < 1024; i++)
|
|
||||||
{
|
|
||||||
int upto_popcount = 0;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
G_VA_COPY (ap, ap_copy);
|
|
||||||
|
|
||||||
for (j = 0; j < data.n_bits; j++)
|
|
||||||
if (va_arg (ap, int) < i)
|
|
||||||
upto_popcount++;
|
|
||||||
|
|
||||||
g_assert_cmpint (_cogl_bitmask_popcount_upto (bitmask, i),
|
|
||||||
==,
|
|
||||||
upto_popcount);
|
|
||||||
|
|
||||||
G_VA_COPY (ap, ap_copy);
|
|
||||||
|
|
||||||
for (j = 0; j < data.n_bits; j++)
|
|
||||||
if (va_arg (ap, int) == i)
|
|
||||||
break;
|
|
||||||
|
|
||||||
g_assert_cmpint (_cogl_bitmask_get (bitmask, i), ==, (j < data.n_bits));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST (check_bitmask_api,
|
|
||||||
0 /* no requirements */,
|
|
||||||
0 /* no failure cases */)
|
|
||||||
{
|
|
||||||
CoglBitmask bitmask;
|
|
||||||
CoglBitmask other_bitmask;
|
|
||||||
/* A dummy bit to make it use arrays sometimes */
|
|
||||||
int dummy_bit;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (dummy_bit = -1; dummy_bit < 256; dummy_bit += 40)
|
|
||||||
{
|
|
||||||
_cogl_bitmask_init (&bitmask);
|
|
||||||
_cogl_bitmask_init (&other_bitmask);
|
|
||||||
|
|
||||||
if (dummy_bit != -1)
|
|
||||||
_cogl_bitmask_set (&bitmask, dummy_bit, TRUE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_set (&bitmask, 1, TRUE);
|
|
||||||
_cogl_bitmask_set (&bitmask, 4, TRUE);
|
|
||||||
_cogl_bitmask_set (&bitmask, 5, TRUE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 1, 4, 5, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_set (&bitmask, 4, FALSE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 1, 5, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_clear_all (&bitmask);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, -1);
|
|
||||||
|
|
||||||
if (dummy_bit != -1)
|
|
||||||
_cogl_bitmask_set (&bitmask, dummy_bit, TRUE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_set (&bitmask, 1, TRUE);
|
|
||||||
_cogl_bitmask_set (&bitmask, 4, TRUE);
|
|
||||||
_cogl_bitmask_set (&bitmask, 5, TRUE);
|
|
||||||
_cogl_bitmask_set (&other_bitmask, 5, TRUE);
|
|
||||||
_cogl_bitmask_set (&other_bitmask, 6, TRUE);
|
|
||||||
|
|
||||||
_cogl_bitmask_set_bits (&bitmask, &other_bitmask);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 1, 4, 5, 6, dummy_bit, -1);
|
|
||||||
verify_bits (&other_bitmask, 5, 6, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_set (&bitmask, 6, FALSE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 1, 4, 5, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_xor_bits (&bitmask, &other_bitmask);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 1, 4, 6, dummy_bit, -1);
|
|
||||||
verify_bits (&other_bitmask, 5, 6, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_set_range (&bitmask, 5, TRUE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 0, 1, 2, 3, 4, 6, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_set_range (&bitmask, 4, FALSE);
|
|
||||||
|
|
||||||
verify_bits (&bitmask, 4, 6, dummy_bit, -1);
|
|
||||||
|
|
||||||
_cogl_bitmask_destroy (&other_bitmask);
|
|
||||||
_cogl_bitmask_destroy (&bitmask);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extra tests for really long bitmasks */
|
|
||||||
_cogl_bitmask_init (&bitmask);
|
|
||||||
_cogl_bitmask_set_range (&bitmask, 400, TRUE);
|
|
||||||
_cogl_bitmask_init (&other_bitmask);
|
|
||||||
_cogl_bitmask_set (&other_bitmask, 5, TRUE);
|
|
||||||
_cogl_bitmask_xor_bits (&bitmask, &other_bitmask);
|
|
||||||
|
|
||||||
for (i = 0; i < 1024; i++)
|
|
||||||
g_assert_cmpint (_cogl_bitmask_get (&bitmask, i),
|
|
||||||
==,
|
|
||||||
(i == 5 ? FALSE :
|
|
||||||
i < 400 ? TRUE :
|
|
||||||
FALSE));
|
|
||||||
|
|
||||||
_cogl_bitmask_set_range (&other_bitmask, 500, TRUE);
|
|
||||||
_cogl_bitmask_set_bits (&bitmask, &other_bitmask);
|
|
||||||
|
|
||||||
for (i = 0; i < 1024; i++)
|
|
||||||
g_assert_cmpint (_cogl_bitmask_get (&bitmask, i), ==, (i < 500));
|
|
||||||
}
|
|
||||||
|
@ -90,31 +90,31 @@ typedef struct _CoglBitmaskImaginaryType *CoglBitmask;
|
|||||||
#define _cogl_bitmask_init(bitmask) \
|
#define _cogl_bitmask_init(bitmask) \
|
||||||
G_STMT_START { *(bitmask) = _cogl_bitmask_from_bits (0); } G_STMT_END
|
G_STMT_START { *(bitmask) = _cogl_bitmask_from_bits (0); } G_STMT_END
|
||||||
|
|
||||||
gboolean
|
COGL_EXPORT_TEST gboolean
|
||||||
_cogl_bitmask_get_from_array (const CoglBitmask *bitmask,
|
_cogl_bitmask_get_from_array (const CoglBitmask *bitmask,
|
||||||
unsigned int bit_num);
|
unsigned int bit_num);
|
||||||
|
|
||||||
void
|
COGL_EXPORT_TEST void
|
||||||
_cogl_bitmask_set_in_array (CoglBitmask *bitmask,
|
_cogl_bitmask_set_in_array (CoglBitmask *bitmask,
|
||||||
unsigned int bit_num,
|
unsigned int bit_num,
|
||||||
gboolean value);
|
gboolean value);
|
||||||
|
|
||||||
void
|
COGL_EXPORT_TEST void
|
||||||
_cogl_bitmask_set_range_in_array (CoglBitmask *bitmask,
|
_cogl_bitmask_set_range_in_array (CoglBitmask *bitmask,
|
||||||
unsigned int n_bits,
|
unsigned int n_bits,
|
||||||
gboolean value);
|
gboolean value);
|
||||||
|
|
||||||
void
|
COGL_EXPORT_TEST void
|
||||||
_cogl_bitmask_clear_all_in_array (CoglBitmask *bitmask);
|
_cogl_bitmask_clear_all_in_array (CoglBitmask *bitmask);
|
||||||
|
|
||||||
void
|
void
|
||||||
_cogl_bitmask_set_flags_array (const CoglBitmask *bitmask,
|
_cogl_bitmask_set_flags_array (const CoglBitmask *bitmask,
|
||||||
unsigned long *flags);
|
unsigned long *flags);
|
||||||
|
|
||||||
int
|
COGL_EXPORT_TEST int
|
||||||
_cogl_bitmask_popcount_in_array (const CoglBitmask *bitmask);
|
_cogl_bitmask_popcount_in_array (const CoglBitmask *bitmask);
|
||||||
|
|
||||||
int
|
COGL_EXPORT_TEST int
|
||||||
_cogl_bitmask_popcount_upto_in_array (const CoglBitmask *bitmask,
|
_cogl_bitmask_popcount_upto_in_array (const CoglBitmask *bitmask,
|
||||||
int upto);
|
int upto);
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ _cogl_bitmask_popcount_upto_in_array (const CoglBitmask *bitmask,
|
|||||||
* This makes sure that all of the bits that are set in @src are also
|
* This makes sure that all of the bits that are set in @src are also
|
||||||
* set in @dst. Any unset bits in @src are left alone in @dst.
|
* set in @dst. Any unset bits in @src are left alone in @dst.
|
||||||
*/
|
*/
|
||||||
void
|
COGL_EXPORT_TEST void
|
||||||
_cogl_bitmask_set_bits (CoglBitmask *dst,
|
_cogl_bitmask_set_bits (CoglBitmask *dst,
|
||||||
const CoglBitmask *src);
|
const CoglBitmask *src);
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ _cogl_bitmask_set_bits (CoglBitmask *dst,
|
|||||||
* For every bit that is set in src, the corresponding bit in dst is
|
* For every bit that is set in src, the corresponding bit in dst is
|
||||||
* inverted.
|
* inverted.
|
||||||
*/
|
*/
|
||||||
void
|
COGL_EXPORT_TEST void
|
||||||
_cogl_bitmask_xor_bits (CoglBitmask *dst,
|
_cogl_bitmask_xor_bits (CoglBitmask *dst,
|
||||||
const CoglBitmask *src);
|
const CoglBitmask *src);
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ typedef gboolean (* CoglBitmaskForeachFunc) (int bit_num, void *user_data);
|
|||||||
*
|
*
|
||||||
* This calls @func for each bit that is set in @bitmask.
|
* This calls @func for each bit that is set in @bitmask.
|
||||||
*/
|
*/
|
||||||
void
|
COGL_EXPORT_TEST void
|
||||||
_cogl_bitmask_foreach (const CoglBitmask *bitmask,
|
_cogl_bitmask_foreach (const CoglBitmask *bitmask,
|
||||||
CoglBitmaskForeachFunc func,
|
CoglBitmaskForeachFunc func,
|
||||||
void *user_data);
|
void *user_data);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
cogl_unit_tests = [
|
cogl_unit_tests = [
|
||||||
|
'test-bitmask',
|
||||||
]
|
]
|
||||||
|
|
||||||
test_env = environment()
|
test_env = environment()
|
||||||
|
181
src/tests/cogl/unit/test-bitmask.c
Normal file
181
src/tests/cogl/unit/test-bitmask.c
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
#include "cogl-config.h"
|
||||||
|
|
||||||
|
#include "cogl/cogl-bitmask.h"
|
||||||
|
#include "tests/cogl-test-utils.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int n_bits;
|
||||||
|
int *bits;
|
||||||
|
} CheckData;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
check_bit (int bit_num, void *user_data)
|
||||||
|
{
|
||||||
|
CheckData *data = user_data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < data->n_bits; i++)
|
||||||
|
{
|
||||||
|
if (data->bits[i] == bit_num)
|
||||||
|
{
|
||||||
|
data->bits[i] = -1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
verify_bits (const CoglBitmask *bitmask,
|
||||||
|
...)
|
||||||
|
{
|
||||||
|
CheckData data;
|
||||||
|
va_list ap, ap_copy;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
va_start (ap, bitmask);
|
||||||
|
G_VA_COPY (ap_copy, ap);
|
||||||
|
|
||||||
|
for (data.n_bits = 0; va_arg (ap, int) != -1; data.n_bits++);
|
||||||
|
|
||||||
|
data.bits = alloca (data.n_bits * (sizeof (int)));
|
||||||
|
|
||||||
|
G_VA_COPY (ap, ap_copy);
|
||||||
|
|
||||||
|
for (i = 0; i < data.n_bits; i++)
|
||||||
|
data.bits[i] = va_arg (ap, int);
|
||||||
|
|
||||||
|
_cogl_bitmask_foreach (bitmask, check_bit, &data);
|
||||||
|
|
||||||
|
for (i = 0; i < data.n_bits; i++)
|
||||||
|
g_assert_cmpint (data.bits[i], ==, -1);
|
||||||
|
|
||||||
|
g_assert_cmpint (_cogl_bitmask_popcount (bitmask), ==, data.n_bits);
|
||||||
|
|
||||||
|
for (i = 0; i < 1024; i++)
|
||||||
|
{
|
||||||
|
int upto_popcount = 0;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
G_VA_COPY (ap, ap_copy);
|
||||||
|
|
||||||
|
for (j = 0; j < data.n_bits; j++)
|
||||||
|
if (va_arg (ap, int) < i)
|
||||||
|
upto_popcount++;
|
||||||
|
|
||||||
|
g_assert_cmpint (_cogl_bitmask_popcount_upto (bitmask, i),
|
||||||
|
==,
|
||||||
|
upto_popcount);
|
||||||
|
|
||||||
|
G_VA_COPY (ap, ap_copy);
|
||||||
|
|
||||||
|
for (j = 0; j < data.n_bits; j++)
|
||||||
|
{
|
||||||
|
if (va_arg (ap, int) == i)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_cmpint (_cogl_bitmask_get (bitmask, i), ==, (j < data.n_bits));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_bitmask_api (void)
|
||||||
|
{
|
||||||
|
CoglBitmask bitmask;
|
||||||
|
CoglBitmask other_bitmask;
|
||||||
|
/* A dummy bit to make it use arrays sometimes */
|
||||||
|
int dummy_bit;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (dummy_bit = -1; dummy_bit < 256; dummy_bit += 40)
|
||||||
|
{
|
||||||
|
_cogl_bitmask_init (&bitmask);
|
||||||
|
_cogl_bitmask_init (&other_bitmask);
|
||||||
|
|
||||||
|
if (dummy_bit != -1)
|
||||||
|
_cogl_bitmask_set (&bitmask, dummy_bit, TRUE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_set (&bitmask, 1, TRUE);
|
||||||
|
_cogl_bitmask_set (&bitmask, 4, TRUE);
|
||||||
|
_cogl_bitmask_set (&bitmask, 5, TRUE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 1, 4, 5, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_set (&bitmask, 4, FALSE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 1, 5, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_clear_all (&bitmask);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, -1);
|
||||||
|
|
||||||
|
if (dummy_bit != -1)
|
||||||
|
_cogl_bitmask_set (&bitmask, dummy_bit, TRUE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_set (&bitmask, 1, TRUE);
|
||||||
|
_cogl_bitmask_set (&bitmask, 4, TRUE);
|
||||||
|
_cogl_bitmask_set (&bitmask, 5, TRUE);
|
||||||
|
_cogl_bitmask_set (&other_bitmask, 5, TRUE);
|
||||||
|
_cogl_bitmask_set (&other_bitmask, 6, TRUE);
|
||||||
|
|
||||||
|
_cogl_bitmask_set_bits (&bitmask, &other_bitmask);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 1, 4, 5, 6, dummy_bit, -1);
|
||||||
|
verify_bits (&other_bitmask, 5, 6, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_set (&bitmask, 6, FALSE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 1, 4, 5, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_xor_bits (&bitmask, &other_bitmask);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 1, 4, 6, dummy_bit, -1);
|
||||||
|
verify_bits (&other_bitmask, 5, 6, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_set_range (&bitmask, 5, TRUE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 0, 1, 2, 3, 4, 6, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_set_range (&bitmask, 4, FALSE);
|
||||||
|
|
||||||
|
verify_bits (&bitmask, 4, 6, dummy_bit, -1);
|
||||||
|
|
||||||
|
_cogl_bitmask_destroy (&other_bitmask);
|
||||||
|
_cogl_bitmask_destroy (&bitmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extra tests for really long bitmasks */
|
||||||
|
_cogl_bitmask_init (&bitmask);
|
||||||
|
_cogl_bitmask_set_range (&bitmask, 400, TRUE);
|
||||||
|
_cogl_bitmask_init (&other_bitmask);
|
||||||
|
_cogl_bitmask_set (&other_bitmask, 5, TRUE);
|
||||||
|
_cogl_bitmask_xor_bits (&bitmask, &other_bitmask);
|
||||||
|
|
||||||
|
for (i = 0; i < 1024; i++)
|
||||||
|
{
|
||||||
|
g_assert_cmpint (_cogl_bitmask_get (&bitmask, i),
|
||||||
|
==,
|
||||||
|
(i == 5 ? FALSE :
|
||||||
|
i < 400 ? TRUE :
|
||||||
|
FALSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
_cogl_bitmask_set_range (&other_bitmask, 500, TRUE);
|
||||||
|
_cogl_bitmask_set_bits (&bitmask, &other_bitmask);
|
||||||
|
|
||||||
|
for (i = 0; i < 1024; i++)
|
||||||
|
g_assert_cmpint (_cogl_bitmask_get (&bitmask, i), ==, (i < 500));
|
||||||
|
}
|
||||||
|
|
||||||
|
COGL_TEST_SUITE_MINIMAL (
|
||||||
|
g_test_add_func ("/bitmask/api", check_bitmask_api);
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user