xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/TotalOrderTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test different flavors of totalorder ---*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERTEST_H
10*71db0c75SAndroid Build Coastguard Worker #define LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERTEST_H
11*71db0c75SAndroid Build Coastguard Worker 
12*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FEnvSafeTest.h"
13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h"
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
15*71db0c75SAndroid Build Coastguard Worker 
16*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::Sign;
17*71db0c75SAndroid Build Coastguard Worker 
18*71db0c75SAndroid Build Coastguard Worker template <typename T>
19*71db0c75SAndroid Build Coastguard Worker class TotalOrderTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker   DECLARE_SPECIAL_CONSTANTS(T)
22*71db0c75SAndroid Build Coastguard Worker 
23*71db0c75SAndroid Build Coastguard Worker public:
24*71db0c75SAndroid Build Coastguard Worker   typedef int (*TotalOrderFunc)(const T *, const T *);
25*71db0c75SAndroid Build Coastguard Worker 
funcWrapper(TotalOrderFunc func,T x,T y)26*71db0c75SAndroid Build Coastguard Worker   bool funcWrapper(TotalOrderFunc func, T x, T y) { return func(&x, &y) != 0; }
27*71db0c75SAndroid Build Coastguard Worker 
testXLesserThanY(TotalOrderFunc func)28*71db0c75SAndroid Build Coastguard Worker   void testXLesserThanY(TotalOrderFunc func) {
29*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_inf, inf));
30*71db0c75SAndroid Build Coastguard Worker 
31*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(0.1)));
32*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(123.38)));
33*71db0c75SAndroid Build Coastguard Worker 
34*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.1), T(0.0)));
35*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-123.38), T(0.0)));
36*71db0c75SAndroid Build Coastguard Worker 
37*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.1), T(0.1)));
38*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-123.38), T(123.38)));
39*71db0c75SAndroid Build Coastguard Worker   }
40*71db0c75SAndroid Build Coastguard Worker 
testXGreaterThanY(TotalOrderFunc func)41*71db0c75SAndroid Build Coastguard Worker   void testXGreaterThanY(TotalOrderFunc func) {
42*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, inf, neg_inf));
43*71db0c75SAndroid Build Coastguard Worker 
44*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.0), T(-0.1)));
45*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.0), T(-123.38)));
46*71db0c75SAndroid Build Coastguard Worker 
47*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.1), T(0.0)));
48*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(123.38), T(0.0)));
49*71db0c75SAndroid Build Coastguard Worker 
50*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.1), T(-0.1)));
51*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(123.38), T(-123.38)));
52*71db0c75SAndroid Build Coastguard Worker   }
53*71db0c75SAndroid Build Coastguard Worker 
testXEqualToY(TotalOrderFunc func)54*71db0c75SAndroid Build Coastguard Worker   void testXEqualToY(TotalOrderFunc func) {
55*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, inf, inf));
56*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_inf, neg_inf));
57*71db0c75SAndroid Build Coastguard Worker 
58*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.0), T(0.0)));
59*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.0), T(-0.0)));
60*71db0c75SAndroid Build Coastguard Worker 
61*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(0.0)));
62*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.0), T(-0.0)));
63*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.1), T(0.1)));
64*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.1), T(-0.1)));
65*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(123.38), T(123.38)));
66*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-123.38), T(-123.38)));
67*71db0c75SAndroid Build Coastguard Worker   }
68*71db0c75SAndroid Build Coastguard Worker 
testSingleNaN(TotalOrderFunc func)69*71db0c75SAndroid Build Coastguard Worker   void testSingleNaN(TotalOrderFunc func) {
70*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, T(0.0)));
71*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, T(0.1)));
72*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, T(123.38)));
73*71db0c75SAndroid Build Coastguard Worker 
74*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.0), neg_aNaN));
75*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.1), neg_aNaN));
76*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(123.38), neg_aNaN));
77*71db0c75SAndroid Build Coastguard Worker 
78*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), aNaN));
79*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.1), aNaN));
80*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(123.38), aNaN));
81*71db0c75SAndroid Build Coastguard Worker 
82*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, T(0.0)));
83*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, T(0.1)));
84*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, T(123.38)));
85*71db0c75SAndroid Build Coastguard Worker   }
86*71db0c75SAndroid Build Coastguard Worker 
testNaNSigns(TotalOrderFunc func)87*71db0c75SAndroid Build Coastguard Worker   void testNaNSigns(TotalOrderFunc func) {
88*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, aNaN));
89*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, sNaN));
90*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, aNaN));
91*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, sNaN));
92*71db0c75SAndroid Build Coastguard Worker 
93*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, neg_aNaN));
94*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, neg_sNaN));
95*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, sNaN, neg_aNaN));
96*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, sNaN, neg_sNaN));
97*71db0c75SAndroid Build Coastguard Worker   }
98*71db0c75SAndroid Build Coastguard Worker 
testQuietVsSignalingNaN(TotalOrderFunc func)99*71db0c75SAndroid Build Coastguard Worker   void testQuietVsSignalingNaN(TotalOrderFunc func) {
100*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_sNaN));
101*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_aNaN));
102*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, sNaN, aNaN));
103*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, sNaN));
104*71db0c75SAndroid Build Coastguard Worker   }
105*71db0c75SAndroid Build Coastguard Worker 
testNaNPayloads(TotalOrderFunc func)106*71db0c75SAndroid Build Coastguard Worker   void testNaNPayloads(TotalOrderFunc func) {
107*71db0c75SAndroid Build Coastguard Worker     T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();
108*71db0c75SAndroid Build Coastguard Worker     T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();
109*71db0c75SAndroid Build Coastguard Worker     T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
110*71db0c75SAndroid Build Coastguard Worker     T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();
111*71db0c75SAndroid Build Coastguard Worker 
112*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, aNaN, aNaN));
113*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, sNaN, sNaN));
114*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42));
115*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42));
116*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN));
117*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN));
118*71db0c75SAndroid Build Coastguard Worker 
119*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN));
120*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN));
121*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x42));
122*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x42));
123*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_qnan_0x42, neg_aNaN));
124*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_snan_0x42, neg_sNaN));
125*71db0c75SAndroid Build Coastguard Worker   }
126*71db0c75SAndroid Build Coastguard Worker };
127*71db0c75SAndroid Build Coastguard Worker 
128*71db0c75SAndroid Build Coastguard Worker #define LIST_TOTALORDER_TESTS(T, func)                                         \
129*71db0c75SAndroid Build Coastguard Worker   using LlvmLibcTotalOrderTest = TotalOrderTestTemplate<T>;                    \
130*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, XLesserThanY) { testXLesserThanY(&func); }    \
131*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, XGreaterThanY) { testXGreaterThanY(&func); }  \
132*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, XEqualToY) { testXEqualToY(&func); }          \
133*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, SingleNaN) { testSingleNaN(&func); }          \
134*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, NaNSigns) { testNaNSigns(&func); }            \
135*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, QuietVsSignalingNaN) {                        \
136*71db0c75SAndroid Build Coastguard Worker     testQuietVsSignalingNaN(&func);                                            \
137*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
138*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderTest, NaNPayloads) { testNaNPayloads(&func); }
139*71db0c75SAndroid Build Coastguard Worker 
140*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERTEST_H
141