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