//===-- Unittests for sincosf ---------------------------------------------===//
//
// 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 "include/errno.h"
#include "src/errno/llvmlibc_errno.h"
#include "src/math/sincosf.h"
#include "test/src/math/sdcomp26094.h"
#include "utils/CPP/Array.h"
#include "utils/FPUtil/BitPatterns.h"
#include "utils/FPUtil/ClassificationFunctions.h"
#include "utils/FPUtil/FloatOperations.h"
#include "utils/FPUtil/FloatProperties.h"
#include "utils/MPFRWrapper/MPFRUtils.h"
#include "utils/UnitTest/Test.h"
#include <math.h>

#include <stdint.h>

using __llvm_libc::fputil::isNegativeQuietNaN;
using __llvm_libc::fputil::isQuietNaN;
using __llvm_libc::fputil::valueAsBits;
using __llvm_libc::fputil::valueFromBits;

using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;

using __llvm_libc::testing::sdcomp26094Values;

namespace mpfr = __llvm_libc::testing::mpfr;

TEST(LlvmLibcSinCosfTest, SpecialNumbers) {
  llvmlibc_errno = 0;
  float sin, cos;

  __llvm_libc::sincosf(valueFromBits(BitPatterns::aQuietNaN), &sin, &cos);
  EXPECT_TRUE(isQuietNaN(cos));
  EXPECT_TRUE(isQuietNaN(sin));
  EXPECT_EQ(llvmlibc_errno, 0);

  __llvm_libc::sincosf(valueFromBits(BitPatterns::aNegativeQuietNaN), &sin,
                       &cos);
  EXPECT_TRUE(isNegativeQuietNaN(cos));
  EXPECT_TRUE(isNegativeQuietNaN(sin));
  EXPECT_EQ(llvmlibc_errno, 0);

  __llvm_libc::sincosf(valueFromBits(BitPatterns::aSignallingNaN), &sin, &cos);
  EXPECT_TRUE(isQuietNaN(cos));
  EXPECT_TRUE(isQuietNaN(sin));
  EXPECT_EQ(llvmlibc_errno, 0);

  __llvm_libc::sincosf(valueFromBits(BitPatterns::aNegativeSignallingNaN), &sin,
                       &cos);
  EXPECT_TRUE(isNegativeQuietNaN(cos));
  EXPECT_TRUE(isNegativeQuietNaN(sin));
  EXPECT_EQ(llvmlibc_errno, 0);

  __llvm_libc::sincosf(valueFromBits(BitPatterns::zero), &sin, &cos);
  EXPECT_EQ(BitPatterns::one, valueAsBits(cos));
  EXPECT_EQ(BitPatterns::zero, valueAsBits(sin));
  EXPECT_EQ(llvmlibc_errno, 0);

  __llvm_libc::sincosf(valueFromBits(BitPatterns::negZero), &sin, &cos);
  EXPECT_EQ(BitPatterns::one, valueAsBits(cos));
  EXPECT_EQ(BitPatterns::negZero, valueAsBits(sin));
  EXPECT_EQ(llvmlibc_errno, 0);

  llvmlibc_errno = 0;
  __llvm_libc::sincosf(valueFromBits(BitPatterns::inf), &sin, &cos);
  EXPECT_TRUE(isQuietNaN(cos));
  EXPECT_TRUE(isQuietNaN(sin));
  EXPECT_EQ(llvmlibc_errno, EDOM);

  llvmlibc_errno = 0;
  __llvm_libc::sincosf(valueFromBits(BitPatterns::negInf), &sin, &cos);
  EXPECT_TRUE(isQuietNaN(cos));
  EXPECT_TRUE(isQuietNaN(sin));
  EXPECT_EQ(llvmlibc_errno, EDOM);
}

TEST(LlvmLibcSinCosfTest, InFloatRange) {
  constexpr uint32_t count = 1000000;
  constexpr uint32_t step = UINT32_MAX / count;
  for (uint32_t i = 0, v = 0; i <= count; ++i, v += step) {
    float x = valueFromBits(v);
    if (isnan(x) || isinf(x))
      continue;

    float sin, cos;
    __llvm_libc::sincosf(x, &sin, &cos);
    ASSERT_MPFR_MATCH(mpfr::Operation::Cos, x, cos, 1.0);
    ASSERT_MPFR_MATCH(mpfr::Operation::Sin, x, sin, 1.0);
  }
}

// For small values, cos(x) is 1 and sin(x) is x.
TEST(LlvmLibcSinCosfTest, SmallValues) {
  uint32_t bits = 0x17800000;
  float x = valueFromBits(bits);
  float result_cos, result_sin;
  __llvm_libc::sincosf(x, &result_sin, &result_cos);
  EXPECT_MPFR_MATCH(mpfr::Operation::Cos, x, result_cos, 1.0);
  EXPECT_MPFR_MATCH(mpfr::Operation::Sin, x, result_sin, 1.0);
  EXPECT_EQ(BitPatterns::one, valueAsBits(result_cos));
  EXPECT_EQ(bits, valueAsBits(result_sin));

  bits = 0x00400000;
  x = valueFromBits(bits);
  __llvm_libc::sincosf(x, &result_sin, &result_cos);
  EXPECT_MPFR_MATCH(mpfr::Operation::Cos, x, result_cos, 1.0);
  EXPECT_MPFR_MATCH(mpfr::Operation::Sin, x, result_sin, 1.0);
  EXPECT_EQ(BitPatterns::one, valueAsBits(result_cos));
  EXPECT_EQ(bits, valueAsBits(result_sin));
}

// SDCOMP-26094: check sinf in the cases for which the range reducer
// returns values furthest beyond its nominal upper bound of pi/4.
TEST(LlvmLibcSinCosfTest, SDCOMP_26094) {
  for (uint32_t v : sdcomp26094Values) {
    float x = valueFromBits(v);
    float sin, cos;
    __llvm_libc::sincosf(x, &sin, &cos);
    EXPECT_MPFR_MATCH(mpfr::Operation::Cos, x, cos, 1.0);
    EXPECT_MPFR_MATCH(mpfr::Operation::Sin, x, sin, 1.0);
  }
}
