test-array.c revision 4f3374cf603147d6e3d60c9dd6e1cfe1c1926c1a
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2007-2014 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int a, b, c;
6fe91298731abf0b70dfd796ecc30d3be81fa5d1Timo Sirainenstatic void test_array_foreach(void)
73a552a9ed06cd6017ad4ee4b252a8b38c8ac42dTimo Sirainen unsigned int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < 10; i++) {
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic void test_array_reverse(void)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen int input[] = { -1234567890, -272585721, 272485922, 824725652 };
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen unsigned int i, j;
6fe91298731abf0b70dfd796ecc30d3be81fa5d1Timo Sirainen output = i == 0 ? NULL : array_idx(&intarr, 0);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen for (j = 0; j < i; j++)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic int test_compare_ushort(const unsigned short *c1, const unsigned short *c2)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic int test_compare_ushort_fuzz(const unsigned short *c1, const unsigned short *c2, const int *pfuzz)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic void test_array_cmp(void)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen static const unsigned short deltas[] = {
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen -32768, -16384, -512, -256, -128, -64, -2, -1,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < NELEMS; i++) {
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert(array_equal_fn(&arr1, &arr2, test_compare_ushort) == 1);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 1);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen for (i = 0; i < 256; i++) {
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen unsigned short repl = tmp + deltas[rand() % N_ELEMENTS(deltas)];
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert_idx(array_cmp(&arr1, &arr2) == (tmp == repl), i);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_ushort) == (tmp == repl), i);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 1, i);
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 0, i);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert_idx(array_cmp(&arr1, &arr2) == TRUE, i);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_ushort) == 1, i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 1, i);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert(array_equal_fn(&arr1, &arr2, test_compare_ushort) == 0);
f7ad1162969feff6b08f0e640a928db1783daae9Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 0, i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic int test_compare_string(const char *const *c1, const char *const *c2)
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainenstatic void test_array_cmp_str(void)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen for (i = 0; i < NELEMS; i++) {
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen elemstrs[i] = t_strdup_printf("%x", rand()); /* never 0-length */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert(array_cmp(&arr1, &arr2) == 1); /* pointers shared, so identical */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert(array_equal_fn(&arr1, &arr2, test_compare_string) == 1); /* therefore value same */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen for (i = 0; i < 2560; i++) {
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen buf[rc] = rand() % (CHAR_MAX + 1 - CHAR_MIN) + CHAR_MIN;
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen test_assert(array_cmp(&arr1, &arr2) == 0); /* pointers now differ */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_string)
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen == (strcmp(ostr, buf) == 0), i); /* sometimes still the same */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_string)
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert(array_cmp(&arr1, &arr2) == 1); /* pointers now same again */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_string) == 1, i); /* duh! */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen /* length differences being detected are tested in other tests */
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen static const void *useless_ptr; /* persuade gcc to not optimise the tests */
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen /* allocation big enough, but memory not initialised */
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen /* actual out of range address requested */
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen /* Forces the compiler to check the value of useless_ptr, so that it
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen must call array_idx (which is marked as pure, and gcc was desperate
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen to optimise out. Of course, gcc is unaware stage is never -1.*/