1#include "math/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(sort);
4
5static 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
11TEST_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