xref: /freebsd/lib/libc/tests/stdlib/bsearch_b_test.c (revision d59c7ea2701fe7b73b32eef49a7c712ef38de5a0)
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