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