Skip to content

Commit

Permalink
lib: Improve seq_range_array_invert() unit tests
Browse files Browse the repository at this point in the history
Try all possible combinations for seq=0..7 and seq=4294967288..4294967295
and make sure they're inverted correctly.
  • Loading branch information
sirainen committed Dec 8, 2016
1 parent 93d5beb commit 7951e22
Showing 1 changed file with 38 additions and 35 deletions.
73 changes: 38 additions & 35 deletions src/lib/test-seq-range-array.c
Expand Up @@ -164,48 +164,51 @@ static void test_seq_range_array_random(void)
array_free(&range);
}

static void test_seq_range_array_invert(void)
static void test_seq_range_array_invert_minmax(uint32_t min, uint32_t max)
{
static const unsigned int input_min = 1, input_max = 5;
static const unsigned int input[] = {
1, 2, 3, 4, 5, UINT_MAX,
2, 3, 4, UINT_MAX,
3, 4, 5, UINT_MAX,
1, 2, 4, 5, UINT_MAX,
1, 3, 5, UINT_MAX,
1, UINT_MAX,
5, UINT_MAX,
UINT_MAX
};
ARRAY_TYPE(seq_range) range = ARRAY_INIT;
unsigned int i, j, seq, start, num;
bool old_exists, success;
struct seq_range_iter iter;
unsigned int n, inverse_mask, mask_inside, mask_size = max-min+1;
uint32_t seq;

for (i = num = 0; input[i] != UINT_MAX; num++, i++) {
success = TRUE;
start = i;
for (; input[i] != UINT_MAX; i++) {
seq_range_array_add_with_init(&range, 32, input[i]);
for (j = start; j < i; j++) {
if (!seq_range_exists(&range, input[j]))
success = FALSE;
}
i_assert(mask_size <= sizeof(unsigned int)*8);
t_array_init(&range, 16);
for (unsigned int mask = 0; mask < mask_size; mask++) {
array_clear(&range);
for (unsigned int i = 0; i < mask_size; i++) {
if ((mask & (1 << i)) != 0)
seq_range_array_add(&range, min+i);
}
seq_range_array_invert(&range, min, max);

seq_range_array_invert(&range, input_min, input_max);
for (seq = input_min; seq <= input_max; seq++) {
for (j = start; input[j] != UINT_MAX; j++) {
if (input[j] == seq)
break;
}
old_exists = input[j] != UINT_MAX;
if (seq_range_exists(&range, seq) == old_exists)
success = FALSE;
inverse_mask = 0;
seq_range_array_iter_init(&iter, &range); n = 0;
while (seq_range_array_iter_nth(&iter, n++, &seq)) {
test_assert(seq >= min && seq <= max);
inverse_mask |= 1 << (seq-min);
}
test_out(t_strdup_printf("seq_range_array_invert(%u)", num),
success);
array_free(&range);
mask_inside = ((1 << mask_size)-1);
test_assert_idx((inverse_mask & ~mask_inside) == 0, mask);
test_assert_idx(inverse_mask == (mask ^ mask_inside), mask);
}
}

static void test_seq_range_array_invert(void)
{
test_begin("seq_range_array_invert()");
/* first numbers */
for (unsigned int min = 0; min <= 7; min++) {
for (unsigned int max = min; max <= 7; max++) T_BEGIN {
test_seq_range_array_invert_minmax(min, max);
} T_END;
}
/* last numbers */
for (uint64_t min = 0xffffffff-7; min <= 0xffffffff; min++) {
for (uint64_t max = min; max <= 0xffffffff; max++) T_BEGIN {
test_seq_range_array_invert_minmax(min, max);
} T_END;
}
test_end();
}

static void test_seq_range_array_invert_edges(void)
Expand Down

0 comments on commit 7951e22

Please sign in to comment.