blob: 5d62bc8c9ae93167755d86afaf467710d7c5b1ff [file] [log] [blame]
//===-- 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);
}
}
}