//===-- Unittests for sinf ------------------------------------------------===//
//
// 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 "hdr/errno_macros.h"
#include "hdr/math_macros.h"
#include "hdr/stdint_proxy.h"
#include "src/__support/FPUtil/FPBits.h"
#include "src/__support/macros/properties/cpu_features.h"
#include "src/__support/math/sinf_double_eval.h"
#include "src/__support/math/sinf_float_eval.h"
#include "src/math/sinf.h"
#include "test/UnitTest/FPMatcher.h"
#include "test/UnitTest/Test.h"
#include "test/src/math/sdcomp26094.h"
#include "utils/MPFRWrapper/MPFRUtils.h"

#ifdef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
#define TOLERANCE 3
#define FP_ASSERT ASSERT_MPFR_MATCH
#else
#define TOLERANCE 0
#define FP_ASSERT ASSERT_MPFR_MATCH_ALL_ROUNDING
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS

using LIBC_NAMESPACE::testing::SDCOMP26094_VALUES;

namespace mpfr = LIBC_NAMESPACE::testing::mpfr;

class LlvmLibcSinfTest : public LIBC_NAMESPACE::testing::FPTest<float> {
public:
  void test_eval_in_float_range(float (*func)(float), double tolerance,
                                bool all_rounding) {
    constexpr uint32_t COUNT = 1'231;
    constexpr uint32_t STEP = UINT32_MAX / COUNT;
    for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
      float x = FPBits(v).get_val();
      if (FPBits(v).is_nan() || FPBits(v).is_inf())
        continue;
      if (all_rounding) {
        ASSERT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Sin, x, func(x),
                                       tolerance);
      } else {
        ASSERT_MPFR_MATCH(mpfr::Operation::Sin, x, func(x), tolerance);
      }
    }
  }
};

TEST_F(LlvmLibcSinfTest, SpecialNumbers) {
  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinf(aNaN));
  EXPECT_MATH_ERRNO(0);

  EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::sinf(0.0f));
  EXPECT_MATH_ERRNO(0);

// When accuracy is not required, signed zeros might not be preserved.
#ifdef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
  EXPECT_TRUE(0.0f == LIBC_NAMESPACE::sinf(-0.0f));
#else
  EXPECT_FP_EQ(-0.0f, LIBC_NAMESPACE::sinf(-0.0f));
  EXPECT_MATH_ERRNO(0);
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS

  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinf(inf));
  EXPECT_MATH_ERRNO(EDOM);

  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinf(neg_inf));
  EXPECT_MATH_ERRNO(EDOM);
}

TEST_F(LlvmLibcSinfTest, InFloatRange) {
  constexpr uint32_t COUNT = 1'231;
  constexpr uint32_t STEP = UINT32_MAX / COUNT;
  for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
    float x = FPBits(v).get_val();
    if (FPBits(v).is_nan() || FPBits(v).is_inf())
      continue;
    FP_ASSERT(mpfr::Operation::Sin, x, LIBC_NAMESPACE::sinf(x),
              TOLERANCE + 0.5);
  }
}

TEST_F(LlvmLibcSinfTest, SpecificBitPatterns) {
  constexpr int N = 36;
  constexpr uint32_t INPUTS[N] = {
      0x3f06'0a92U, // x = pi/6
      0x3f3a'dc51U, // x = 0x1.75b8a2p-1f
      0x3f49'0fdbU, // x = pi/4
      0x3f86'0a92U, // x = pi/3
      0x3fa7'832aU, // x = 0x1.4f0654p+0f
      0x3fc9'0fdbU, // x = pi/2
      0x4017'1973U, // x = 0x1.2e32e6p+1f
      0x4049'0fdbU, // x = pi
      0x4096'cbe4U, // x = 0x1.2d97c8p+2f
      0x40c9'0fdbU, // x = 2*pi
      0x433b'7490U, // x = 0x1.76e92p+7f
      0x437c'e5f1U, // x = 0x1.f9cbe2p+7f
      0x4619'9998U, // x = 0x1.33333p+13f
      0x474d'246fU, // x = 0x1.9a48dep+15f
      0x4afd'ece4U, // x = 0x1.fbd9c8p+22f
      0x4c23'32e9U, // x = 0x1.4665d2p+25f
      0x50a3'e87fU, // x = 0x1.47d0fep+34f
      0x5239'47f6U, // x = 0x1.728fecp+37f
      0x53b1'46a6U, // x = 0x1.628d4cp+40f
      0x55ca'fb2aU, // x = 0x1.95f654p+44f
      0x588e'f060U, // x = 0x1.1de0cp+50f
      0x5c07'bcd0U, // x = 0x1.0f79ap+57f
      0x5ebc'fddeU, // x = 0x1.79fbbcp+62f
      0x5fa6'eba7U, // x = 0x1.4dd74ep+64f
      0x61a4'0b40U, // x = 0x1.48168p+68f
      0x6386'134eU, // x = 0x1.0c269cp+72f
      0x6589'8498U, // x = 0x1.13093p+76f
      0x6600'0001U, // x = 0x1.000002p+77f
      0x664e'46e4U, // x = 0x1.9c8dc8p+77f
      0x66b0'14aaU, // x = 0x1.602954p+78f
      0x67a9'242bU, // x = 0x1.524856p+80f
      0x6a19'76f1U, // x = 0x1.32ede2p+85f
      0x6c55'da58U, // x = 0x1.abb4bp+89f
      0x6f79'be45U, // x = 0x1.f37c8ap+95f
      0x7276'69d4U, // x = 0x1.ecd3a8p+101f
      0x7758'4625U, // x = 0x1.b08c4ap+111f
  };

  for (int i = 0; i < N; ++i) {
    float x = FPBits(INPUTS[i]).get_val();
    FP_ASSERT(mpfr::Operation::Sin, x, LIBC_NAMESPACE::sinf(x),
              TOLERANCE + 0.5);
    FP_ASSERT(mpfr::Operation::Sin, -x, LIBC_NAMESPACE::sinf(-x),
              TOLERANCE + 0.5);
  }
}

// For small values, sin(x) is x.
TEST_F(LlvmLibcSinfTest, SmallValues) {
  float x = FPBits(0x1780'0000U).get_val();
  FP_ASSERT(mpfr::Operation::Sin, x, LIBC_NAMESPACE::sinf(x), 0.5);

  x = FPBits(0x0040'0000U).get_val();
  FP_ASSERT(mpfr::Operation::Sin, x, LIBC_NAMESPACE::sinf(x), 0.5);
}

// SDCOMP-26094: check sinf in the cases for which the range reducer
// returns values furthest beyond its nominal upper bound of pi/4.
TEST_F(LlvmLibcSinfTest, SDCOMP_26094) {
  for (uint32_t v : SDCOMP26094_VALUES) {
    float x = FPBits((v)).get_val();
    FP_ASSERT(mpfr::Operation::Sin, x, LIBC_NAMESPACE::sinf(x),
              TOLERANCE + 0.5);
  }
}

// Exercise both implementations independently of the configured selector.
TEST_F(LlvmLibcSinfTest, DoubleEvalInFloatRange) {
  test_eval_in_float_range(&LIBC_NAMESPACE::math::double_eval::sinf,
                           TOLERANCE + 0.5,
                           /*all_rounding=*/TOLERANCE == 0);
}

#ifdef LIBC_TARGET_CPU_HAS_FMA_FLOAT
TEST_F(LlvmLibcSinfTest, FloatEvalInFloatRange) {
  test_eval_in_float_range(&LIBC_NAMESPACE::math::float_eval::sinf, 3.5,
                           /*all_rounding=*/false);
}
#endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT
