t_infinity.c revision 1.2
1/* $NetBSD: t_infinity.c,v 1.2 2011/05/31 20:17:36 jruoho Exp $ */
2
3/*-
4 * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Martin Husemann <martin@NetBSD.org>.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31#include <sys/cdefs.h>
32__RCSID("$NetBSD: t_infinity.c,v 1.2 2011/05/31 20:17:36 jruoho Exp $");
33
34#include <atf-c.h>
35#include <math.h>
36#include <float.h>
37
38ATF_TC(infinity_float);
39ATF_TC_HEAD(infinity_float, tc)
40{
41	atf_tc_set_md_var(tc, "descr",
42	     "check FPU generated infinite float values");
43}
44
45ATF_TC_BODY(infinity_float, tc)
46{
47	float v;
48
49	v = FLT_MAX;
50	v *= v;
51	ATF_REQUIRE(isinf(v));
52	ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
53
54	v = -FLT_MAX;
55	v *= v;
56	ATF_REQUIRE(isinf(v));
57	ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
58}
59
60ATF_TC(infinity_double);
61ATF_TC_HEAD(infinity_double, tc)
62{
63	atf_tc_set_md_var(tc, "descr",
64	     "check FPU generated infinite double values");
65}
66
67ATF_TC_BODY(infinity_double, tc)
68{
69	double v;
70
71	v = DBL_MAX;
72	v *= v;
73	ATF_REQUIRE(isinf(v));
74	ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
75
76	v = -DBL_MAX;
77	v *= v;
78	ATF_REQUIRE(isinf(v));
79	ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
80}
81
82ATF_TC(infinity_long_double);
83ATF_TC_HEAD(infinity_long_double, tc)
84{
85	atf_tc_set_md_var(tc, "descr",
86	     "check FPU generated infinite long double values");
87}
88
89ATF_TC_BODY(infinity_long_double, tc)
90{
91
92	/*
93	 * May fail under QEMU; cf. PR misc/44767.
94	 */
95	if (system("cpuctl identify 0 | grep -q QEMU") == 0)
96		atf_tc_expect_fail("PR misc/44767");
97
98
99#ifndef LDBL_MAX
100	atf_tc_skip("no long double support on this architecture");
101	return;
102#else
103	long double v;
104
105	v = LDBL_MAX;
106	v *= v;
107	ATF_REQUIRE(isinf(v));
108	ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
109
110	v = -LDBL_MAX;
111	v *= v;
112	ATF_REQUIRE(isinf(v));
113	ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
114#endif
115}
116
117ATF_TP_ADD_TCS(tp)
118{
119
120	ATF_TP_ADD_TC(tp, infinity_float);
121	ATF_TP_ADD_TC(tp, infinity_double);
122	ATF_TP_ADD_TC(tp, infinity_long_double);
123
124	return atf_no_error();
125}
126