| 1 | #include "math/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DECLARE(sort); |
| 4 | |
| 5 | static int cmp_int(const void *a, const void *b) { |
| 6 | int va = *(const int *) a; |
| 7 | int vb = *(const int *) b; |
| 8 | return (va > vb) - (va < vb); |
| 9 | } |
| 10 | |
| 11 | TEST_DECLARE_UNIT(sort, heapsort_and_bsearch) { |
| 12 | int arr[] = {42, 17, 93, 1, 56, 8, 23, 74, 31, 65}; |
| 13 | size_t n = sizeof(arr) / sizeof(arr[0]); |
| 14 | |
| 15 | int res = heapsort(vbase: arr, nmemb: n, size: sizeof(int), compar: cmp_int); |
| 16 | TEST_ASSERT_EQ(res, 0); |
| 17 | |
| 18 | for (size_t i = 1; i < n; i++) { |
| 19 | TEST_ASSERT_LE_S(arr[i - 1], arr[i]); |
| 20 | } |
| 21 | |
| 22 | for (size_t i = 0; i < n; i++) { |
| 23 | int key = arr[i]; |
| 24 | int *found = bsearch(key: &key, base: arr, nmemb: n, size: sizeof(int), compar: cmp_int); |
| 25 | TEST_ASSERT_NONNULL(found); |
| 26 | TEST_ASSERT_EQ(*found, key); |
| 27 | TEST_ASSERT_EQ(found, &arr[i]); |
| 28 | } |
| 29 | |
| 30 | int missing_low = 0; |
| 31 | int missing_mid = 50; |
| 32 | int missing_high = 1000; |
| 33 | TEST_ASSERT_NULL(bsearch(&missing_low, arr, n, sizeof(int), cmp_int)); |
| 34 | TEST_ASSERT_NULL(bsearch(&missing_mid, arr, n, sizeof(int), cmp_int)); |
| 35 | TEST_ASSERT_NULL(bsearch(&missing_high, arr, n, sizeof(int), cmp_int)); |
| 36 | |
| 37 | return TEST_SUCCESS; |
| 38 | } |
| 39 | |