xref: /llvm-project/libc/test/src/math/TruncTest.h (revision 65310f34d7edf7924ca4cbe7df836770669f70dc)
180e166f8SSiva Chandra Reddy //===-- Utility class to test trunc[f|l] ------------------------*- C++ -*-===//
280e166f8SSiva Chandra Reddy //
380e166f8SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
480e166f8SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
580e166f8SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
680e166f8SSiva Chandra Reddy //
780e166f8SSiva Chandra Reddy //===----------------------------------------------------------------------===//
880e166f8SSiva Chandra Reddy 
9330793c9SNick Desaulniers #ifndef LLVM_LIBC_TEST_SRC_MATH_TRUNCTEST_H
10330793c9SNick Desaulniers #define LLVM_LIBC_TEST_SRC_MATH_TRUNCTEST_H
11330793c9SNick Desaulniers 
12*65310f34SOverMighty #include "src/__support/CPP/algorithm.h"
13837dab96SRoland McGrath #include "test/UnitTest/FEnvSafeTest.h"
14af1315c2SSiva Chandra Reddy #include "test/UnitTest/FPMatcher.h"
15af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
1680e166f8SSiva Chandra Reddy #include "utils/MPFRWrapper/MPFRUtils.h"
1780e166f8SSiva Chandra Reddy 
185748ad84Slntue #include "hdr/math_macros.h"
1980e166f8SSiva Chandra Reddy 
20b6bc9d72SGuillaume Chatelet namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
2180e166f8SSiva Chandra Reddy 
22837dab96SRoland McGrath template <typename T>
23837dab96SRoland McGrath class TruncTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
2480e166f8SSiva Chandra Reddy 
2580e166f8SSiva Chandra Reddy   DECLARE_SPECIAL_CONSTANTS(T)
2680e166f8SSiva Chandra Reddy 
2780e166f8SSiva Chandra Reddy public:
2880e166f8SSiva Chandra Reddy   typedef T (*TruncFunc)(T);
2980e166f8SSiva Chandra Reddy 
testSpecialNumbers(TruncFunc func)3080e166f8SSiva Chandra Reddy   void testSpecialNumbers(TruncFunc func) {
3180e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(zero, func(zero));
321c92911eSMichael Jones     EXPECT_FP_EQ(neg_zero, func(neg_zero));
3380e166f8SSiva Chandra Reddy 
3480e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(inf, func(inf));
351c92911eSMichael Jones     EXPECT_FP_EQ(neg_inf, func(neg_inf));
3680e166f8SSiva Chandra Reddy 
3780e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(aNaN, func(aNaN));
3880e166f8SSiva Chandra Reddy   }
3980e166f8SSiva Chandra Reddy 
testRoundedNumbers(TruncFunc func)4080e166f8SSiva Chandra Reddy   void testRoundedNumbers(TruncFunc func) {
4180e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(1.0), func(T(1.0)));
4280e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-1.0), func(T(-1.0)));
4380e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(10.0), func(T(10.0)));
4480e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-10.0), func(T(-10.0)));
4580e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(1234.0), func(T(1234.0)));
4680e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0)));
4780e166f8SSiva Chandra Reddy   }
4880e166f8SSiva Chandra Reddy 
testFractions(TruncFunc func)4980e166f8SSiva Chandra Reddy   void testFractions(TruncFunc func) {
5080e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(0.0), func(T(0.5)));
5180e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-0.0), func(T(-0.5)));
5280e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(0.0), func(T(0.115)));
5380e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-0.0), func(T(-0.115)));
5480e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(0.0), func(T(0.715)));
5580e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-0.0), func(T(-0.715)));
5680e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(1.0), func(T(1.3)));
5780e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-1.0), func(T(-1.3)));
5880e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(1.0), func(T(1.5)));
5980e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-1.0), func(T(-1.5)));
6080e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(1.0), func(T(1.75)));
6180e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-1.0), func(T(-1.75)));
6280e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(10.0), func(T(10.32)));
6380e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-10.0), func(T(-10.32)));
6480e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(10.0), func(T(10.65)));
6580e166f8SSiva Chandra Reddy     EXPECT_FP_EQ(T(-10.0), func(T(-10.65)));
66*65310f34SOverMighty     EXPECT_FP_EQ(T(123.0), func(T(123.38)));
67*65310f34SOverMighty     EXPECT_FP_EQ(T(-123.0), func(T(-123.38)));
68*65310f34SOverMighty     EXPECT_FP_EQ(T(123.0), func(T(123.96)));
69*65310f34SOverMighty     EXPECT_FP_EQ(T(-123.0), func(T(-123.96)));
7080e166f8SSiva Chandra Reddy   }
7180e166f8SSiva Chandra Reddy 
testRange(TruncFunc func)7280e166f8SSiva Chandra Reddy   void testRange(TruncFunc func) {
73*65310f34SOverMighty     constexpr int COUNT = 100'000;
74*65310f34SOverMighty     constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
75*65310f34SOverMighty         static_cast<StorageType>(STORAGE_MAX / COUNT), StorageType(1));
76*65310f34SOverMighty     StorageType v = 0;
77*65310f34SOverMighty     for (int i = 0; i <= COUNT; ++i, v += STEP) {
78*65310f34SOverMighty       FPBits xbits(v);
79*65310f34SOverMighty       T x = xbits.get_val();
80*65310f34SOverMighty       if (xbits.is_inf_or_nan())
8180e166f8SSiva Chandra Reddy         continue;
8280e166f8SSiva Chandra Reddy 
8380e166f8SSiva Chandra Reddy       ASSERT_MPFR_MATCH(mpfr::Operation::Trunc, x, func(x), 0.0);
8480e166f8SSiva Chandra Reddy     }
8580e166f8SSiva Chandra Reddy   }
8680e166f8SSiva Chandra Reddy };
8780e166f8SSiva Chandra Reddy 
8880e166f8SSiva Chandra Reddy #define LIST_TRUNC_TESTS(T, func)                                              \
8980e166f8SSiva Chandra Reddy   using LlvmLibcTruncTest = TruncTest<T>;                                      \
9080e166f8SSiva Chandra Reddy   TEST_F(LlvmLibcTruncTest, SpecialNumbers) { testSpecialNumbers(&func); }     \
9180e166f8SSiva Chandra Reddy   TEST_F(LlvmLibcTruncTest, RoundedNubmers) { testRoundedNumbers(&func); }     \
9280e166f8SSiva Chandra Reddy   TEST_F(LlvmLibcTruncTest, Fractions) { testFractions(&func); }               \
9380e166f8SSiva Chandra Reddy   TEST_F(LlvmLibcTruncTest, Range) { testRange(&func); }
94330793c9SNick Desaulniers 
95330793c9SNick Desaulniers #endif // LLVM_LIBC_TEST_SRC_MATH_TRUNCTEST_H
96