| //===-- Unittests for the quick rounding mode checks ----------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/__support/FPUtil/rounding_mode.h" |
| #include "test/UnitTest/Test.h" |
| #include "utils/MPFRWrapper/MPFRUtils.h" |
| |
| #include "hdr/fenv_macros.h" |
| |
| using LIBC_NAMESPACE::testing::mpfr::ForceRoundingMode; |
| using LIBC_NAMESPACE::testing::mpfr::RoundingMode; |
| |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingUpTest) { |
| using LIBC_NAMESPACE::fputil::fenv_is_round_up; |
| { |
| ForceRoundingMode __r(RoundingMode::Upward); |
| if (__r.success) { |
| ASSERT_TRUE(fenv_is_round_up()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Downward); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_up()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Nearest); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_up()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::TowardZero); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_up()); |
| } |
| } |
| } |
| |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingDownTest) { |
| using LIBC_NAMESPACE::fputil::fenv_is_round_down; |
| { |
| ForceRoundingMode __r(RoundingMode::Upward); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_down()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Downward); |
| if (__r.success) { |
| ASSERT_TRUE(fenv_is_round_down()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Nearest); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_down()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::TowardZero); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_down()); |
| } |
| } |
| } |
| |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingNearestTest) { |
| using LIBC_NAMESPACE::fputil::fenv_is_round_to_nearest; |
| { |
| ForceRoundingMode __r(RoundingMode::Upward); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_to_nearest()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Downward); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_to_nearest()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Nearest); |
| if (__r.success) { |
| ASSERT_TRUE(fenv_is_round_to_nearest()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::TowardZero); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_to_nearest()); |
| } |
| } |
| } |
| |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingTowardZeroTest) { |
| using LIBC_NAMESPACE::fputil::fenv_is_round_to_zero; |
| { |
| ForceRoundingMode __r(RoundingMode::Upward); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_to_zero()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Downward); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_to_zero()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Nearest); |
| if (__r.success) { |
| ASSERT_FALSE(fenv_is_round_to_zero()); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::TowardZero); |
| if (__r.success) { |
| ASSERT_TRUE(fenv_is_round_to_zero()); |
| } |
| } |
| } |
| |
| TEST(LlvmLibcFEnvImplTest, QuickGetRoundTest) { |
| using LIBC_NAMESPACE::fputil::quick_get_round; |
| { |
| ForceRoundingMode __r(RoundingMode::Upward); |
| if (__r.success) { |
| ASSERT_EQ(quick_get_round(), FE_UPWARD); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Downward); |
| if (__r.success) { |
| ASSERT_EQ(quick_get_round(), FE_DOWNWARD); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::Nearest); |
| if (__r.success) { |
| ASSERT_EQ(quick_get_round(), FE_TONEAREST); |
| } |
| } |
| { |
| ForceRoundingMode __r(RoundingMode::TowardZero); |
| if (__r.success) { |
| ASSERT_EQ(quick_get_round(), FE_TOWARDZERO); |
| } |
| } |
| } |