Mercurial > dovecot > core-2.2
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 { |