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