comparison src/lib/test-seq-range-array.c @ 21277:14209dd0b677

lib: Improve seq_range_array_invert() unit tests Try all possible combinations for seq=0..7 and seq=4294967288..4294967295 and make sure they're inverted correctly.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 08 Dec 2016 19:37:30 +0200
parents ff92e16346c9
children 2e2563132d5f
comparison
equal deleted inserted replaced
21276:6a54c168478c 21277:14209dd0b677
162 t_strdup_printf("round %u test %d failed", i, test)); 162 t_strdup_printf("round %u test %d failed", i, test));
163 } 163 }
164 array_free(&range); 164 array_free(&range);
165 } 165 }
166 166
167 static void test_seq_range_array_invert_minmax(uint32_t min, uint32_t max)
168 {
169 ARRAY_TYPE(seq_range) range = ARRAY_INIT;
170 struct seq_range_iter iter;
171 unsigned int n, inverse_mask, mask_inside, mask_size = max-min+1;
172 uint32_t seq;
173
174 i_assert(mask_size <= sizeof(unsigned int)*8);
175 t_array_init(&range, 16);
176 for (unsigned int mask = 0; mask < mask_size; mask++) {
177 array_clear(&range);
178 for (unsigned int i = 0; i < mask_size; i++) {
179 if ((mask & (1 << i)) != 0)
180 seq_range_array_add(&range, min+i);
181 }
182 seq_range_array_invert(&range, min, max);
183
184 inverse_mask = 0;
185 seq_range_array_iter_init(&iter, &range); n = 0;
186 while (seq_range_array_iter_nth(&iter, n++, &seq)) {
187 test_assert(seq >= min && seq <= max);
188 inverse_mask |= 1 << (seq-min);
189 }
190 mask_inside = ((1 << mask_size)-1);
191 test_assert_idx((inverse_mask & ~mask_inside) == 0, mask);
192 test_assert_idx(inverse_mask == (mask ^ mask_inside), mask);
193 }
194 }
195
167 static void test_seq_range_array_invert(void) 196 static void test_seq_range_array_invert(void)
168 { 197 {
169 static const unsigned int input_min = 1, input_max = 5; 198 test_begin("seq_range_array_invert()");
170 static const unsigned int input[] = { 199 /* first numbers */
171 1, 2, 3, 4, 5, UINT_MAX, 200 for (unsigned int min = 0; min <= 7; min++) {
172 2, 3, 4, UINT_MAX, 201 for (unsigned int max = min; max <= 7; max++) T_BEGIN {
173 3, 4, 5, UINT_MAX, 202 test_seq_range_array_invert_minmax(min, max);
174 1, 2, 4, 5, UINT_MAX, 203 } T_END;
175 1, 3, 5, UINT_MAX, 204 }
176 1, UINT_MAX, 205 /* last numbers */
177 5, UINT_MAX, 206 for (uint64_t min = 0xffffffff-7; min <= 0xffffffff; min++) {
178 UINT_MAX 207 for (uint64_t max = min; max <= 0xffffffff; max++) T_BEGIN {
179 }; 208 test_seq_range_array_invert_minmax(min, max);
180 ARRAY_TYPE(seq_range) range = ARRAY_INIT; 209 } T_END;
181 unsigned int i, j, seq, start, num; 210 }
182 bool old_exists, success; 211 test_end();
183
184 for (i = num = 0; input[i] != UINT_MAX; num++, i++) {
185 success = TRUE;
186 start = i;
187 for (; input[i] != UINT_MAX; i++) {
188 seq_range_array_add_with_init(&range, 32, input[i]);
189 for (j = start; j < i; j++) {
190 if (!seq_range_exists(&range, input[j]))
191 success = FALSE;
192 }
193 }
194
195 seq_range_array_invert(&range, input_min, input_max);
196 for (seq = input_min; seq <= input_max; seq++) {
197 for (j = start; input[j] != UINT_MAX; j++) {
198 if (input[j] == seq)
199 break;
200 }
201 old_exists = input[j] != UINT_MAX;
202 if (seq_range_exists(&range, seq) == old_exists)
203 success = FALSE;
204 }
205 test_out(t_strdup_printf("seq_range_array_invert(%u)", num),
206 success);
207 array_free(&range);
208 }
209 } 212 }
210 213
211 static void test_seq_range_array_invert_edges(void) 214 static void test_seq_range_array_invert_edges(void)
212 { 215 {
213 const struct { 216 const struct {