17
17
#include " test/UnitTest/Test.h"
18
18
#include < math.h>
19
19
20
+ #define ASSERT_FP_EQ_WITH_EXCEPTION (result, expected, expected_exception ) \
21
+ ASSERT_FP_EQ (result, expected); \
22
+ ASSERT_FP_EXCEPTION (expected_exception); \
23
+ LIBC_NAMESPACE::fputil::clear_except (FE_ALL_EXCEPT)
24
+
25
+ #define ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected ) \
26
+ ASSERT_FP_EQ_WITH_EXCEPTION (result, expected, FE_INEXACT | FE_UNDERFLOW)
27
+
28
+ #define ASSERT_FP_EQ_WITH_OVERFLOW (result, expected ) \
29
+ ASSERT_FP_EQ_WITH_EXCEPTION (result, expected, FE_INEXACT | FE_OVERFLOW)
30
+
20
31
template <typename T>
21
32
class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
22
33
using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
@@ -53,23 +64,23 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
53
64
T result = func (x, T (1 ));
54
65
UIntType expected_bits = 1 ;
55
66
T expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
56
- ASSERT_FP_EQ (result, expected);
67
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
57
68
58
69
result = func (x, T (-1 ));
59
70
expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + 1 ;
60
71
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
61
- ASSERT_FP_EQ (result, expected);
72
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
62
73
63
74
x = neg_zero;
64
75
result = func (x, 1 );
65
76
expected_bits = 1 ;
66
77
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
67
- ASSERT_FP_EQ (result, expected);
78
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
68
79
69
80
result = func (x, -1 );
70
81
expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + 1 ;
71
82
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
72
- ASSERT_FP_EQ (result, expected);
83
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
73
84
74
85
// 'from' is max subnormal value.
75
86
x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_subnormal);
@@ -80,7 +91,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
80
91
result = func (x, 0 );
81
92
expected_bits = max_subnormal - 1 ;
82
93
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
83
- ASSERT_FP_EQ (result, expected);
94
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
84
95
85
96
x = -x;
86
97
@@ -93,30 +104,30 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
93
104
expected_bits =
94
105
(UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + max_subnormal - 1 ;
95
106
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
96
- ASSERT_FP_EQ (result, expected);
107
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
97
108
98
109
// 'from' is min subnormal value.
99
110
x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_subnormal);
100
111
result = func (x, 1 );
101
112
expected_bits = min_subnormal + 1 ;
102
113
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
103
- ASSERT_FP_EQ (result, expected);
104
- ASSERT_FP_EQ (func (x, 0 ), 0 );
114
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
115
+ ASSERT_FP_EQ_WITH_UNDERFLOW (func (x, 0 ), 0 );
105
116
106
117
x = -x;
107
118
result = func (x, -1 );
108
119
expected_bits =
109
120
(UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + min_subnormal + 1 ;
110
121
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
111
- ASSERT_FP_EQ (result, expected);
112
- ASSERT_FP_EQ (func (x, 0 ), T (-0.0 ));
122
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
123
+ ASSERT_FP_EQ_WITH_UNDERFLOW (func (x, 0 ), T (-0.0 ));
113
124
114
125
// 'from' is min normal.
115
126
x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_normal);
116
127
result = func (x, 0 );
117
128
expected_bits = max_subnormal;
118
129
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
119
- ASSERT_FP_EQ (result, expected);
130
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
120
131
121
132
result = func (x, inf);
122
133
expected_bits = min_normal + 1 ;
@@ -127,7 +138,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
127
138
result = func (x, 0 );
128
139
expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + max_subnormal;
129
140
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
130
- ASSERT_FP_EQ (result, expected);
141
+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
131
142
132
143
result = func (x, -inf);
133
144
expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + min_normal + 1 ;
@@ -137,10 +148,10 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
137
148
// 'from' is max normal and 'to' is infinity.
138
149
x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_normal);
139
150
result = func (x, inf);
140
- ASSERT_FP_EQ (result, inf);
151
+ ASSERT_FP_EQ_WITH_OVERFLOW (result, inf);
141
152
142
153
result = func (-x, -inf);
143
- ASSERT_FP_EQ (result, -inf);
154
+ ASSERT_FP_EQ_WITH_OVERFLOW (result, -inf);
144
155
145
156
// 'from' is infinity.
146
157
x = inf;
0 commit comments