//===-- 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 "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 <errno.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) {
  errno = 0;
  float sin, cos;

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

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

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

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

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

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

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

  errno = 0;
  __llvm_libc::sincosf(valueFromBits(BitPatterns::negInf), &sin, &cos);
  EXPECT_TRUE(isQuietNaN(cos));
  EXPECT_TRUE(isQuietNaN(sin));
  EXPECT_EQ(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);
  }
}
