1*d59c7ea2SFaraz Vahedi /*
2*d59c7ea2SFaraz Vahedi * Copyright (c) 2026 Faraz Vahedi <kfv@FreeBSD.org>
3*d59c7ea2SFaraz Vahedi *
4*d59c7ea2SFaraz Vahedi * SPDX-License-Identifier: BSD-2-Clause
5*d59c7ea2SFaraz Vahedi */
6*d59c7ea2SFaraz Vahedi
7*d59c7ea2SFaraz Vahedi /*
8*d59c7ea2SFaraz Vahedi * Test for bsearch_b() routine.
9*d59c7ea2SFaraz Vahedi */
10*d59c7ea2SFaraz Vahedi
11*d59c7ea2SFaraz Vahedi #include <stdlib.h>
12*d59c7ea2SFaraz Vahedi
13*d59c7ea2SFaraz Vahedi #include "test-search.h"
14*d59c7ea2SFaraz Vahedi
15*d59c7ea2SFaraz Vahedi #define THUNK 42
16*d59c7ea2SFaraz Vahedi
17*d59c7ea2SFaraz Vahedi static void *
do_bsearch_b(const int * key,const int * base,size_t n,void * ctx)18*d59c7ea2SFaraz Vahedi do_bsearch_b(const int *key, const int *base, size_t n, void *ctx)
19*d59c7ea2SFaraz Vahedi {
20*d59c7ea2SFaraz Vahedi int thunk = *(int *)ctx;
21*d59c7ea2SFaraz Vahedi
22*d59c7ea2SFaraz Vahedi return (bsearch_b(key, base, n, sizeof(int),
23*d59c7ea2SFaraz Vahedi ^(const void *a, const void *b) {
24*d59c7ea2SFaraz Vahedi ATF_REQUIRE_EQ(thunk, THUNK);
25*d59c7ea2SFaraz Vahedi return (searchhelp(a, b));
26*d59c7ea2SFaraz Vahedi }));
27*d59c7ea2SFaraz Vahedi }
28*d59c7ea2SFaraz Vahedi
29*d59c7ea2SFaraz Vahedi ATF_TC_WITHOUT_HEAD(bsearch_b_test);
ATF_TC_BODY(bsearch_b_test,tc)30*d59c7ea2SFaraz Vahedi ATF_TC_BODY(bsearch_b_test, tc)
31*d59c7ea2SFaraz Vahedi {
32*d59c7ea2SFaraz Vahedi int testvector[SVEC_LEN];
33*d59c7ea2SFaraz Vahedi int thunk = THUNK;
34*d59c7ea2SFaraz Vahedi int key, j;
35*d59c7ea2SFaraz Vahedi
36*d59c7ea2SFaraz Vahedi for (j = 0; j <= SVEC_LEN; j++) {
37*d59c7ea2SFaraz Vahedi if (j == 0) {
38*d59c7ea2SFaraz Vahedi key = 0;
39*d59c7ea2SFaraz Vahedi ATF_CHECK(bsearch_b(&key, testvector, 0,
40*d59c7ea2SFaraz Vahedi sizeof(testvector[0]),
41*d59c7ea2SFaraz Vahedi ^(const void *a __unused, const void *b __unused) {
42*d59c7ea2SFaraz Vahedi atf_tc_fail(
43*d59c7ea2SFaraz Vahedi "comparison block invoked unexpectedly");
44*d59c7ea2SFaraz Vahedi return (0);
45*d59c7ea2SFaraz Vahedi }) == NULL);
46*d59c7ea2SFaraz Vahedi continue;
47*d59c7ea2SFaraz Vahedi }
48*d59c7ea2SFaraz Vahedi check_sorted_search(do_bsearch_b, &thunk, testvector,
49*d59c7ea2SFaraz Vahedi (size_t)j);
50*d59c7ea2SFaraz Vahedi }
51*d59c7ea2SFaraz Vahedi }
52*d59c7ea2SFaraz Vahedi
ATF_TP_ADD_TCS(tp)53*d59c7ea2SFaraz Vahedi ATF_TP_ADD_TCS(tp)
54*d59c7ea2SFaraz Vahedi {
55*d59c7ea2SFaraz Vahedi ATF_TP_ADD_TC(tp, bsearch_b_test);
56*d59c7ea2SFaraz Vahedi
57*d59c7ea2SFaraz Vahedi return (atf_no_error());
58*d59c7ea2SFaraz Vahedi }
59