1//===-- Utility class to test different flavors of rint ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIBC_TEST_SRC_MATH_SMOKE_RINTTEST_H
10#define LLVM_LIBC_TEST_SRC_MATH_SMOKE_RINTTEST_H
11
12#include "src/__support/FPUtil/FEnvImpl.h"
13#include "src/__support/FPUtil/FPBits.h"
14#include "test/UnitTest/FEnvSafeTest.h"
15#include "test/UnitTest/FPMatcher.h"
16#include "test/UnitTest/Test.h"
17
18#include "hdr/fenv_macros.h"
19#include "hdr/math_macros.h"
20
21using LIBC_NAMESPACE::Sign;
22
23static constexpr int ROUNDING_MODES[4] = {FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO,
24 FE_TONEAREST};
25
26template <typename T>
27class RIntTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
28public:
29 typedef T (*RIntFunc)(T);
30
31private:
32 using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
33 using StorageType = typename FPBits::StorageType;
34
35 const T inf = FPBits::inf(Sign::POS).get_val();
36 const T neg_inf = FPBits::inf(Sign::NEG).get_val();
37 const T zero = FPBits::zero(Sign::POS).get_val();
38 const T neg_zero = FPBits::zero(Sign::NEG).get_val();
39 const T nan = FPBits::quiet_nan().get_val();
40
41public:
42 void testSpecialNumbers(RIntFunc func) {
43 for (int mode : ROUNDING_MODES) {
44 LIBC_NAMESPACE::fputil::set_round(mode);
45 ASSERT_FP_EQ(inf, func(inf));
46 ASSERT_FP_EQ(neg_inf, func(neg_inf));
47 ASSERT_FP_EQ(nan, func(nan));
48 ASSERT_FP_EQ(zero, func(zero));
49 ASSERT_FP_EQ(neg_zero, func(neg_zero));
50 }
51 }
52};
53
54#define LIST_RINT_TESTS(F, func) \
55 using LlvmLibcRIntTest = RIntTestTemplate<F>; \
56 TEST_F(LlvmLibcRIntTest, specialNumbers) { testSpecialNumbers(&func); }
57
58#endif // LLVM_LIBC_TEST_SRC_MATH_SMOKE_RINTTEST_H
59

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of libc/test/src/math/smoke/RIntTest.h