1717#include " test/UnitTest/Test.h"
1818#include < math.h>
1919
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+
2031template <typename T>
2132class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
2233 using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
@@ -53,23 +64,23 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
5364 T result = func (x, T (1 ));
5465 UIntType expected_bits = 1 ;
5566 T expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
56- ASSERT_FP_EQ (result, expected);
67+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
5768
5869 result = func (x, T (-1 ));
5970 expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + 1 ;
6071 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
61- ASSERT_FP_EQ (result, expected);
72+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
6273
6374 x = neg_zero;
6475 result = func (x, 1 );
6576 expected_bits = 1 ;
6677 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
67- ASSERT_FP_EQ (result, expected);
78+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
6879
6980 result = func (x, -1 );
7081 expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + 1 ;
7182 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
72- ASSERT_FP_EQ (result, expected);
83+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
7384
7485 // 'from' is max subnormal value.
7586 x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_subnormal);
@@ -80,7 +91,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
8091 result = func (x, 0 );
8192 expected_bits = max_subnormal - 1 ;
8293 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
83- ASSERT_FP_EQ (result, expected);
94+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
8495
8596 x = -x;
8697
@@ -93,30 +104,30 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
93104 expected_bits =
94105 (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + max_subnormal - 1 ;
95106 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
96- ASSERT_FP_EQ (result, expected);
107+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
97108
98109 // 'from' is min subnormal value.
99110 x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_subnormal);
100111 result = func (x, 1 );
101112 expected_bits = min_subnormal + 1 ;
102113 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 );
105116
106117 x = -x;
107118 result = func (x, -1 );
108119 expected_bits =
109120 (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + min_subnormal + 1 ;
110121 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 ));
113124
114125 // 'from' is min normal.
115126 x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_normal);
116127 result = func (x, 0 );
117128 expected_bits = max_subnormal;
118129 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
119- ASSERT_FP_EQ (result, expected);
130+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
120131
121132 result = func (x, inf);
122133 expected_bits = min_normal + 1 ;
@@ -127,7 +138,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
127138 result = func (x, 0 );
128139 expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + max_subnormal;
129140 expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
130- ASSERT_FP_EQ (result, expected);
141+ ASSERT_FP_EQ_WITH_UNDERFLOW (result, expected);
131142
132143 result = func (x, -inf);
133144 expected_bits = (UIntType (1 ) << (BIT_WIDTH_OF_TYPE - 1 )) + min_normal + 1 ;
@@ -137,10 +148,10 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
137148 // 'from' is max normal and 'to' is infinity.
138149 x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_normal);
139150 result = func (x, inf);
140- ASSERT_FP_EQ (result, inf);
151+ ASSERT_FP_EQ_WITH_OVERFLOW (result, inf);
141152
142153 result = func (-x, -inf);
143- ASSERT_FP_EQ (result, -inf);
154+ ASSERT_FP_EQ_WITH_OVERFLOW (result, -inf);
144155
145156 // 'from' is infinity.
146157 x = inf;
0 commit comments