xref: /netbsd-src/tests/lib/libc/stdlib/t_abs.c (revision 06f1efeb342ae3ea906fb8fe86c1ee8786a26225)
1*06f1efebSjruoho /* $NetBSD: t_abs.c,v 1.1 2012/03/29 06:16:56 jruoho Exp $ */
2*06f1efebSjruoho 
3*06f1efebSjruoho /*-
4*06f1efebSjruoho  * Copyright (c) 2012 The NetBSD Foundation, Inc.
5*06f1efebSjruoho  * All rights reserved.
6*06f1efebSjruoho  *
7*06f1efebSjruoho  * This code is derived from software contributed to The NetBSD Foundation
8*06f1efebSjruoho  * by Jukka Ruohonen.
9*06f1efebSjruoho  *
10*06f1efebSjruoho  * Redistribution and use in source and binary forms, with or without
11*06f1efebSjruoho  * modification, are permitted provided that the following conditions
12*06f1efebSjruoho  * are met:
13*06f1efebSjruoho  * 1. Redistributions of source code must retain the above copyright
14*06f1efebSjruoho  *    notice, this list of conditions and the following disclaimer.
15*06f1efebSjruoho  * 2. Redistributions in binary form must reproduce the above copyright
16*06f1efebSjruoho  *    notice, this list of conditions and the following disclaimer in the
17*06f1efebSjruoho  *    documentation and/or other materials provided with the distribution.
18*06f1efebSjruoho  *
19*06f1efebSjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*06f1efebSjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*06f1efebSjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*06f1efebSjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*06f1efebSjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*06f1efebSjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*06f1efebSjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*06f1efebSjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*06f1efebSjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*06f1efebSjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*06f1efebSjruoho  * POSSIBILITY OF SUCH DAMAGE.
30*06f1efebSjruoho  */
31*06f1efebSjruoho #include <sys/cdefs.h>
32*06f1efebSjruoho __RCSID("$NetBSD: t_abs.c,v 1.1 2012/03/29 06:16:56 jruoho Exp $");
33*06f1efebSjruoho 
34*06f1efebSjruoho #include <atf-c.h>
35*06f1efebSjruoho #include <inttypes.h>
36*06f1efebSjruoho #include <limits.h>
37*06f1efebSjruoho #include <stdlib.h>
38*06f1efebSjruoho 
39*06f1efebSjruoho struct test {
40*06f1efebSjruoho 	int64_t val;
41*06f1efebSjruoho 	int64_t res;
42*06f1efebSjruoho };
43*06f1efebSjruoho 
44*06f1efebSjruoho ATF_TC(abs_basic);
45*06f1efebSjruoho ATF_TC_HEAD(abs_basic, tc)
46*06f1efebSjruoho {
47*06f1efebSjruoho 	atf_tc_set_md_var(tc, "descr", "Test that abs(3) works");
48*06f1efebSjruoho }
49*06f1efebSjruoho 
50*06f1efebSjruoho ATF_TC_BODY(abs_basic, tc)
51*06f1efebSjruoho {
52*06f1efebSjruoho 	static const struct test table[] = {
53*06f1efebSjruoho 		{ 0,		0		},
54*06f1efebSjruoho 		{ +0,		0		},
55*06f1efebSjruoho 		{ -0,		0		},
56*06f1efebSjruoho 		{ -0x1010,	0x1010		},
57*06f1efebSjruoho 		{ INT_MAX,	INT_MAX		},
58*06f1efebSjruoho 		{ -INT_MAX,	INT_MAX		},
59*06f1efebSjruoho 	};
60*06f1efebSjruoho 
61*06f1efebSjruoho 	for (size_t i = 0; i < __arraycount(table); i++)
62*06f1efebSjruoho 		ATF_CHECK(abs(table[i].val) == (int)table[i].res);
63*06f1efebSjruoho }
64*06f1efebSjruoho 
65*06f1efebSjruoho ATF_TC(imaxabs_basic);
66*06f1efebSjruoho ATF_TC_HEAD(imaxabs_basic, tc)
67*06f1efebSjruoho {
68*06f1efebSjruoho 	atf_tc_set_md_var(tc, "descr", "Test that imaxabs(3) works");
69*06f1efebSjruoho }
70*06f1efebSjruoho 
71*06f1efebSjruoho ATF_TC_BODY(imaxabs_basic, tc)
72*06f1efebSjruoho {
73*06f1efebSjruoho 	static const struct test table[] = {
74*06f1efebSjruoho 		{ 0,		0		},
75*06f1efebSjruoho 		{ INT_MAX,	INT_MAX		},
76*06f1efebSjruoho 		{ -INT_MAX,	INT_MAX		},
77*06f1efebSjruoho 	};
78*06f1efebSjruoho 
79*06f1efebSjruoho 	for (size_t i = 0; i < __arraycount(table); i++)
80*06f1efebSjruoho 		ATF_CHECK(imaxabs(table[i].val) == (intmax_t)table[i].res);
81*06f1efebSjruoho }
82*06f1efebSjruoho 
83*06f1efebSjruoho ATF_TC(labs_basic);
84*06f1efebSjruoho ATF_TC_HEAD(labs_basic, tc)
85*06f1efebSjruoho {
86*06f1efebSjruoho 	atf_tc_set_md_var(tc, "descr", "Test that labs(3) works");
87*06f1efebSjruoho }
88*06f1efebSjruoho 
89*06f1efebSjruoho ATF_TC_BODY(labs_basic, tc)
90*06f1efebSjruoho {
91*06f1efebSjruoho 	static const struct test table[] = {
92*06f1efebSjruoho 		{ 0,		0		},
93*06f1efebSjruoho 		{ +0,		0		},
94*06f1efebSjruoho 		{ -0,		0		},
95*06f1efebSjruoho 		{ -1,		1		},
96*06f1efebSjruoho 		{ LONG_MAX,	LONG_MAX	},
97*06f1efebSjruoho 		{ -LONG_MAX,	LONG_MAX	},
98*06f1efebSjruoho 		{ -0x100000000,	0x100000000	},
99*06f1efebSjruoho 	};
100*06f1efebSjruoho 
101*06f1efebSjruoho 	for (size_t i = 0; i < __arraycount(table); i++)
102*06f1efebSjruoho 		ATF_CHECK(labs(table[i].val) == (long int)table[i].res);
103*06f1efebSjruoho }
104*06f1efebSjruoho 
105*06f1efebSjruoho ATF_TC(llabs_basic);
106*06f1efebSjruoho ATF_TC_HEAD(llabs_basic, tc)
107*06f1efebSjruoho {
108*06f1efebSjruoho 	atf_tc_set_md_var(tc, "descr", "Test that llabs(3) works");
109*06f1efebSjruoho }
110*06f1efebSjruoho 
111*06f1efebSjruoho ATF_TC_BODY(llabs_basic, tc)
112*06f1efebSjruoho {
113*06f1efebSjruoho 	static const struct test table[] = {
114*06f1efebSjruoho 		{ 0,		0		},
115*06f1efebSjruoho 		{ +0,		0		},
116*06f1efebSjruoho 		{ -0,		0		},
117*06f1efebSjruoho 		{ -1,		1		},
118*06f1efebSjruoho 		{ LLONG_MAX,	LLONG_MAX	},
119*06f1efebSjruoho 		{ -LLONG_MAX,	LLONG_MAX	},
120*06f1efebSjruoho 		{ -0x100000000,	0x100000000	},
121*06f1efebSjruoho 	};
122*06f1efebSjruoho 
123*06f1efebSjruoho 	for (size_t i = 0; i < __arraycount(table); i++)
124*06f1efebSjruoho 		ATF_CHECK(llabs(table[i].val) == (long long int)table[i].res);
125*06f1efebSjruoho }
126*06f1efebSjruoho 
127*06f1efebSjruoho ATF_TP_ADD_TCS(tp)
128*06f1efebSjruoho {
129*06f1efebSjruoho 
130*06f1efebSjruoho 	ATF_TP_ADD_TC(tp, abs_basic);
131*06f1efebSjruoho 	ATF_TP_ADD_TC(tp, imaxabs_basic);
132*06f1efebSjruoho 	ATF_TP_ADD_TC(tp, labs_basic);
133*06f1efebSjruoho 	ATF_TP_ADD_TC(tp, llabs_basic);
134*06f1efebSjruoho 
135*06f1efebSjruoho 	return atf_no_error();
136*06f1efebSjruoho }
137