/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <algorithm>

#include "common_audio/signal_processing/include/signal_processing_library.h"
#include "rtc_base/strings/string_builder.h"
#include "test/gtest.h"

static const size_t kVector16Size = 9;
static const int16_t vector16[kVector16Size] = {1,
                                                -15511,
                                                4323,
                                                1963,
                                                WEBRTC_SPL_WORD16_MAX,
                                                0,
                                                WEBRTC_SPL_WORD16_MIN + 5,
                                                -3333,
                                                345};

class SplTest : public ::testing::Test {
 protected:
  SplTest() { WebRtcSpl_Init(); }
  ~SplTest() override {}
};

TEST_F(SplTest, MacroTest) {
  // Macros with inputs.
  int A = 10;
  int B = 21;
  int a = -3;
  int b = WEBRTC_SPL_WORD32_MAX;

  EXPECT_EQ(10, WEBRTC_SPL_MIN(A, B));
  EXPECT_EQ(21, WEBRTC_SPL_MAX(A, B));

  EXPECT_EQ(3, WEBRTC_SPL_ABS_W16(a));
  EXPECT_EQ(3, WEBRTC_SPL_ABS_W32(a));

  EXPECT_EQ(-63, WEBRTC_SPL_MUL(a, B));
  EXPECT_EQ(2147483651u, WEBRTC_SPL_UMUL(a, b));
  b = WEBRTC_SPL_WORD16_MAX >> 1;
  EXPECT_EQ(4294918147u, WEBRTC_SPL_UMUL_32_16(a, b));
  EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_U16(a, b));

  a = b;
  b = -3;

  EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT16(a, b));
  EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT15(a, b));
  EXPECT_EQ(-3, WEBRTC_SPL_MUL_16_32_RSFT14(a, b));
  EXPECT_EQ(-24, WEBRTC_SPL_MUL_16_32_RSFT11(a, b));

  EXPECT_EQ(-12288, WEBRTC_SPL_MUL_16_16_RSFT(a, b, 2));
  EXPECT_EQ(-12287, WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, 2));

  EXPECT_EQ(21, WEBRTC_SPL_SAT(a, A, B));
  EXPECT_EQ(21, WEBRTC_SPL_SAT(a, B, A));

  // Shifting with negative numbers allowed
  int shift_amount = 1;  // Workaround compiler warning using variable here.
  // Positive means left shift
  EXPECT_EQ(32766, WEBRTC_SPL_SHIFT_W32(a, shift_amount));

  // Shifting with negative numbers not allowed
  // We cannot do casting here due to signed/unsigned problem
  EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W32(a, 1));

  EXPECT_EQ(8191u, WEBRTC_SPL_RSHIFT_U32(a, 1));

  EXPECT_EQ(1470, WEBRTC_SPL_RAND(A));

  EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_16(a, b));
  EXPECT_EQ(1073676289,
            WEBRTC_SPL_MUL_16_16(WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MAX));
  EXPECT_EQ(1073709055, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MAX,
                                                    WEBRTC_SPL_WORD32_MAX));
  EXPECT_EQ(1073741824, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
                                                    WEBRTC_SPL_WORD32_MIN));
#ifdef WEBRTC_ARCH_ARM_V7
  EXPECT_EQ(-1073741824, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
                                                     WEBRTC_SPL_WORD32_MAX));
#else
  EXPECT_EQ(-1073741823, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
                                                     WEBRTC_SPL_WORD32_MAX));
#endif
}

TEST_F(SplTest, InlineTest) {
  int16_t a16 = 121;
  int16_t b16 = -17;
  int32_t a32 = 111121;
  int32_t b32 = -1711;

  EXPECT_EQ(17, WebRtcSpl_GetSizeInBits(a32));

  EXPECT_EQ(0, WebRtcSpl_NormW32(0));
  EXPECT_EQ(31, WebRtcSpl_NormW32(-1));
  EXPECT_EQ(0, WebRtcSpl_NormW32(WEBRTC_SPL_WORD32_MIN));
  EXPECT_EQ(14, WebRtcSpl_NormW32(a32));

  EXPECT_EQ(0, WebRtcSpl_NormW16(0));
  EXPECT_EQ(15, WebRtcSpl_NormW16(-1));
  EXPECT_EQ(0, WebRtcSpl_NormW16(WEBRTC_SPL_WORD16_MIN));
  EXPECT_EQ(4, WebRtcSpl_NormW16(b32));
  for (int ii = 0; ii < 15; ++ii) {
    int16_t value = 1 << ii;
    EXPECT_EQ(14 - ii, WebRtcSpl_NormW16(value));
    EXPECT_EQ(15 - ii, WebRtcSpl_NormW16(-value));
  }

  EXPECT_EQ(0, WebRtcSpl_NormU32(0u));
  EXPECT_EQ(0, WebRtcSpl_NormU32(0xffffffff));
  EXPECT_EQ(15, WebRtcSpl_NormU32(static_cast<uint32_t>(a32)));

  EXPECT_EQ(104, WebRtcSpl_AddSatW16(a16, b16));
  EXPECT_EQ(138, WebRtcSpl_SubSatW16(a16, b16));
}

TEST_F(SplTest, AddSubSatW32) {
  static constexpr int32_t kAddSubArgs[] = {
      INT32_MIN, INT32_MIN + 1, -3,       -2, -1, 0, 1, -1, 2,
      3,         INT32_MAX - 1, INT32_MAX};
  for (int32_t a : kAddSubArgs) {
    for (int32_t b : kAddSubArgs) {
      const int64_t sum = std::max<int64_t>(
          INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) + b));
      const int64_t diff = std::max<int64_t>(
          INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) - b));
      rtc::StringBuilder ss;
      ss << a << " +/- " << b << ": sum " << sum << ", diff " << diff;
      SCOPED_TRACE(ss.str());
      EXPECT_EQ(sum, WebRtcSpl_AddSatW32(a, b));
      EXPECT_EQ(diff, WebRtcSpl_SubSatW32(a, b));
    }
  }
}

TEST_F(SplTest, CountLeadingZeros32) {
  EXPECT_EQ(32, WebRtcSpl_CountLeadingZeros32(0));
  EXPECT_EQ(32, WebRtcSpl_CountLeadingZeros32_NotBuiltin(0));
  for (int i = 0; i < 32; ++i) {
    const uint32_t single_one = uint32_t{1} << i;
    const uint32_t all_ones = 2 * single_one - 1;
    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32(single_one));
    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32_NotBuiltin(single_one));
    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32(all_ones));
    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32_NotBuiltin(all_ones));
  }
}

TEST_F(SplTest, CountLeadingZeros64) {
  EXPECT_EQ(64, WebRtcSpl_CountLeadingZeros64(0));
  EXPECT_EQ(64, WebRtcSpl_CountLeadingZeros64_NotBuiltin(0));
  for (int i = 0; i < 64; ++i) {
    const uint64_t single_one = uint64_t{1} << i;
    const uint64_t all_ones = 2 * single_one - 1;
    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64(single_one));
    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64_NotBuiltin(single_one));
    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64(all_ones));
    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64_NotBuiltin(all_ones));
  }
}

TEST_F(SplTest, MathOperationsTest) {
  int A = 1134567892;
  int32_t num = 117;
  int32_t den = -5;
  uint16_t denU = 5;
  EXPECT_EQ(33700, WebRtcSpl_Sqrt(A));
  EXPECT_EQ(33683, WebRtcSpl_SqrtFloor(A));

  EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num));
  EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (int16_t)den));
  EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (int16_t)den));
  EXPECT_EQ(23u, WebRtcSpl_DivU32U16(num, denU));
  EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256));
}

TEST_F(SplTest, BasicArrayOperationsTest) {
  const size_t kVectorSize = 4;
  int B[] = {4, 12, 133, 1100};
  int16_t b16[kVectorSize];
  int32_t b32[kVectorSize];

  int16_t bTmp16[kVectorSize];
  int32_t bTmp32[kVectorSize];

  WebRtcSpl_MemSetW16(b16, 3, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(3, b16[kk]);
  }
  WebRtcSpl_ZerosArrayW16(b16, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(0, b16[kk]);
  }
  WebRtcSpl_MemSetW32(b32, 3, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(3, b32[kk]);
  }
  WebRtcSpl_ZerosArrayW32(b32, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(0, b32[kk]);
  }
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    bTmp16[kk] = (int16_t)kk;
    bTmp32[kk] = (int32_t)kk;
  }
  WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(b16[kk], bTmp16[kk]);
  }
  //    WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, kVectorSize);
  //    for (int kk = 0; kk < kVectorSize; ++kk) {
  //        EXPECT_EQ(b32[kk], bTmp32[kk]);
  //    }
  WebRtcSpl_CopyFromEndW16(b16, kVectorSize, 2, bTmp16);
  for (size_t kk = 0; kk < 2; ++kk) {
    EXPECT_EQ(static_cast<int16_t>(kk + 2), bTmp16[kk]);
  }

  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    b32[kk] = B[kk];
    b16[kk] = (int16_t)B[kk];
  }
  WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, kVectorSize, b32, 1);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((B[kk] >> 1), bTmp16[kk]);
  }
  WebRtcSpl_VectorBitShiftW16(bTmp16, kVectorSize, b16, 1);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((B[kk] >> 1), bTmp16[kk]);
  }
  WebRtcSpl_VectorBitShiftW32(bTmp32, kVectorSize, b32, 1);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((B[kk] >> 1), bTmp32[kk]);
  }

  WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(b16[3 - kk], bTmp16[kk]);
  }
}

TEST_F(SplTest, MinMaxOperationsTest) {
  const size_t kVectorSize = 17;

  // Vectors to test the cases where minimum values have to be caught
  // outside of the unrolled loops in ARM-Neon.
  int16_t vector16[kVectorSize] = {-1,
                                   7485,
                                   0,
                                   3333,
                                   -18283,
                                   0,
                                   12334,
                                   -29871,
                                   988,
                                   -3333,
                                   345,
                                   -456,
                                   222,
                                   999,
                                   888,
                                   8774,
                                   WEBRTC_SPL_WORD16_MIN};
  int32_t vector32[kVectorSize] = {-1,
                                   0,
                                   283211,
                                   3333,
                                   8712345,
                                   0,
                                   -3333,
                                   89345,
                                   -374585456,
                                   222,
                                   999,
                                   122345334,
                                   -12389756,
                                   -987329871,
                                   888,
                                   -2,
                                   WEBRTC_SPL_WORD32_MIN};

  EXPECT_EQ(WEBRTC_SPL_WORD16_MIN,
            WebRtcSpl_MinValueW16(vector16, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD32_MIN,
            WebRtcSpl_MinValueW32(vector32, kVectorSize));
  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW16(vector16, kVectorSize));
  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW32(vector32, kVectorSize));

  // Test the cases where maximum values have to be caught
  // outside of the unrolled loops in ARM-Neon.
  vector16[kVectorSize - 1] = WEBRTC_SPL_WORD16_MAX;
  vector32[kVectorSize - 1] = WEBRTC_SPL_WORD32_MAX;

  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
            WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
            WebRtcSpl_MaxValueW16(vector16, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
            WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
            WebRtcSpl_MaxValueW32(vector32, kVectorSize));
  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize));
  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize));
  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize));

  // Test the cases where multiple maximum and minimum values are present.
  vector16[1] = WEBRTC_SPL_WORD16_MAX;
  vector16[6] = WEBRTC_SPL_WORD16_MIN;
  vector16[11] = WEBRTC_SPL_WORD16_MIN;
  vector32[1] = WEBRTC_SPL_WORD32_MAX;
  vector32[6] = WEBRTC_SPL_WORD32_MIN;
  vector32[11] = WEBRTC_SPL_WORD32_MIN;

  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
            WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
            WebRtcSpl_MaxValueW16(vector16, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD16_MIN,
            WebRtcSpl_MinValueW16(vector16, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
            WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
            WebRtcSpl_MaxValueW32(vector32, kVectorSize));
  EXPECT_EQ(WEBRTC_SPL_WORD32_MIN,
            WebRtcSpl_MinValueW32(vector32, kVectorSize));
  EXPECT_EQ(6u, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize));
  EXPECT_EQ(1u, WebRtcSpl_MaxIndexW16(vector16, kVectorSize));
  EXPECT_EQ(1u, WebRtcSpl_MaxIndexW32(vector32, kVectorSize));
  EXPECT_EQ(6u, WebRtcSpl_MinIndexW16(vector16, kVectorSize));
  EXPECT_EQ(6u, WebRtcSpl_MinIndexW32(vector32, kVectorSize));
}

TEST_F(SplTest, VectorOperationsTest) {
  const size_t kVectorSize = 4;
  int B[] = {4, 12, 133, 1100};
  int16_t a16[kVectorSize];
  int16_t b16[kVectorSize];
  int16_t bTmp16[kVectorSize];

  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    a16[kk] = B[kk];
    b16[kk] = B[kk];
  }

  WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((B[kk] * 3 + 7) >> 2, bTmp16[kk]);
  }
  WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((B[kk] * 3 + B[kk] * 2 + 2) >> 2, bTmp16[kk]);
  }

  WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(((B[kk] * 3 + B[kk] * 2 + 2) >> 2) + ((b16[kk] * 3 + 7) >> 2),
              bTmp16[kk]);
  }

  WebRtcSpl_ScaleVector(b16, bTmp16, 13, kVectorSize, 2);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((b16[kk] * 13) >> 2, bTmp16[kk]);
  }
  WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, kVectorSize, 2);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((b16[kk] * 13) >> 2, bTmp16[kk]);
  }
  WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(((a16[kk] * 13) >> 2) + ((b16[kk] * 7) >> 2), bTmp16[kk]);
  }

  WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, kVectorSize, 2);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(B[kk] >> 1, bTmp16[kk]);
  }
  WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3], kVectorSize, 2);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((a16[kk] * b16[3 - kk]) >> 2, bTmp16[kk]);
  }
  WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, kVectorSize, 6);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ((a16[kk] * b16[kk]) >> 6, bTmp16[kk]);
  }

  WebRtcSpl_SqrtOfOneMinusXSquared(b16, kVectorSize, bTmp16);
  for (size_t kk = 0; kk < kVectorSize - 1; ++kk) {
    EXPECT_EQ(32767, bTmp16[kk]);
  }
  EXPECT_EQ(32749, bTmp16[kVectorSize - 1]);

  EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, kVectorSize, 1));
}

TEST_F(SplTest, EstimatorsTest) {
  const size_t kOrder = 2;
  const int32_t unstable_filter[] = {4, 12, 133, 1100};
  const int32_t stable_filter[] = {1100, 133, 12, 4};
  int16_t lpc[kOrder + 2] = {0};
  int16_t refl[kOrder + 2] = {0};
  int16_t lpc_result[] = {4096, -497, 15, 0};
  int16_t refl_result[] = {-3962, 123, 0, 0};

  EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(unstable_filter, lpc, refl, kOrder));
  EXPECT_EQ(1, WebRtcSpl_LevinsonDurbin(stable_filter, lpc, refl, kOrder));
  for (size_t i = 0; i < kOrder + 2; ++i) {
    EXPECT_EQ(lpc_result[i], lpc[i]);
    EXPECT_EQ(refl_result[i], refl[i]);
  }
}

TEST_F(SplTest, FilterTest) {
  const size_t kVectorSize = 4;
  const size_t kFilterOrder = 3;
  int16_t A[] = {1, 2, 33, 100};
  int16_t A5[] = {1, 2, 33, 100, -5};
  int16_t B[] = {4, 12, 133, 110};
  int16_t data_in[kVectorSize];
  int16_t data_out[kVectorSize];
  int16_t bTmp16Low[kVectorSize];
  int16_t bState[kVectorSize];
  int16_t bStateLow[kVectorSize];

  WebRtcSpl_ZerosArrayW16(bState, kVectorSize);
  WebRtcSpl_ZerosArrayW16(bStateLow, kVectorSize);

  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    data_in[kk] = A[kk];
    data_out[kk] = 0;
  }

  // MA filters.
  // Note that the input data has |kFilterOrder| states before the actual
  // data (one sample).
  WebRtcSpl_FilterMAFastQ12(&data_in[kFilterOrder], data_out, B,
                            kFilterOrder + 1, 1);
  EXPECT_EQ(0, data_out[0]);
  // AR filters.
  // Note that the output data has |kFilterOrder| states before the actual
  // data (one sample).
  WebRtcSpl_FilterARFastQ12(data_in, &data_out[kFilterOrder], A,
                            kFilterOrder + 1, 1);
  EXPECT_EQ(0, data_out[kFilterOrder]);

  EXPECT_EQ(kVectorSize, WebRtcSpl_FilterAR(A5, 5, data_in, kVectorSize, bState,
                                            kVectorSize, bStateLow, kVectorSize,
                                            data_out, bTmp16Low, kVectorSize));
}

TEST_F(SplTest, RandTest) {
  const int kVectorSize = 4;
  int16_t BU[] = {3653, 12446, 8525, 30691};
  int16_t b16[kVectorSize];
  uint32_t bSeed = 100000;

  EXPECT_EQ(7086, WebRtcSpl_RandU(&bSeed));
  EXPECT_EQ(31565, WebRtcSpl_RandU(&bSeed));
  EXPECT_EQ(-9786, WebRtcSpl_RandN(&bSeed));
  EXPECT_EQ(kVectorSize, WebRtcSpl_RandUArray(b16, kVectorSize, &bSeed));
  for (int kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(BU[kk], b16[kk]);
  }
}

TEST_F(SplTest, DotProductWithScaleTest) {
  EXPECT_EQ(605362796, WebRtcSpl_DotProductWithScale(vector16, vector16,
                                                     kVector16Size, 2));
}

TEST_F(SplTest, CrossCorrelationTest) {
  // Note the function arguments relation specificed by API.
  const size_t kCrossCorrelationDimension = 3;
  const int kShift = 2;
  const int kStep = 1;
  const size_t kSeqDimension = 6;

  const int16_t kVector16[kVector16Size] = {
      1,    4323, 1963, WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MIN + 5, -3333,
      -876, 8483, 142};
  int32_t vector32[kCrossCorrelationDimension] = {0};

  WebRtcSpl_CrossCorrelation(vector32, vector16, kVector16, kSeqDimension,
                             kCrossCorrelationDimension, kShift, kStep);

  // WebRtcSpl_CrossCorrelationC() and WebRtcSpl_CrossCorrelationNeon()
  // are not bit-exact.
  const int32_t kExpected[kCrossCorrelationDimension] = {-266947903, -15579555,
                                                         -171282001};
  const int32_t* expected = kExpected;
#if !defined(MIPS32_LE)
  const int32_t kExpectedNeon[kCrossCorrelationDimension] = {
      -266947901, -15579553, -171281999};
  if (WebRtcSpl_CrossCorrelation != WebRtcSpl_CrossCorrelationC) {
    expected = kExpectedNeon;
  }
#endif
  for (size_t i = 0; i < kCrossCorrelationDimension; ++i) {
    EXPECT_EQ(expected[i], vector32[i]);
  }
}

TEST_F(SplTest, AutoCorrelationTest) {
  int scale = 0;
  int32_t vector32[kVector16Size];
  const int32_t expected[kVector16Size] = {302681398, 14223410,  -121705063,
                                           -85221647, -17104971, 61806945,
                                           6644603,   -669329,   43};

  EXPECT_EQ(kVector16Size,
            WebRtcSpl_AutoCorrelation(vector16, kVector16Size,
                                      kVector16Size - 1, vector32, &scale));
  EXPECT_EQ(3, scale);
  for (size_t i = 0; i < kVector16Size; ++i) {
    EXPECT_EQ(expected[i], vector32[i]);
  }
}

TEST_F(SplTest, SignalProcessingTest) {
  const size_t kVectorSize = 4;
  int A[] = {1, 2, 33, 100};
  const int16_t kHanning[4] = {2399, 8192, 13985, 16384};
  int16_t b16[kVectorSize];

  int16_t bTmp16[kVectorSize];

  int bScale = 0;

  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    b16[kk] = A[kk];
  }

  // TODO(bjornv): Activate the Reflection Coefficient tests when refactoring.
  //    WebRtcSpl_ReflCoefToLpc(b16, kVectorSize, bTmp16);
  ////    for (int kk = 0; kk < kVectorSize; ++kk) {
  ////        EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
  ////    }
  //    WebRtcSpl_LpcToReflCoef(bTmp16, kVectorSize, b16);
  ////    for (int kk = 0; kk < kVectorSize; ++kk) {
  ////        EXPECT_EQ(a16[kk], b16[kk]);
  ////    }
  //    WebRtcSpl_AutoCorrToReflCoef(b32, kVectorSize, bTmp16);
  ////    for (int kk = 0; kk < kVectorSize; ++kk) {
  ////        EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
  ////    }

  WebRtcSpl_GetHanningWindow(bTmp16, kVectorSize);
  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    EXPECT_EQ(kHanning[kk], bTmp16[kk]);
  }

  for (size_t kk = 0; kk < kVectorSize; ++kk) {
    b16[kk] = A[kk];
  }
  EXPECT_EQ(11094, WebRtcSpl_Energy(b16, kVectorSize, &bScale));
  EXPECT_EQ(0, bScale);
}

TEST_F(SplTest, FFTTest) {
  int16_t B[] = {1, 2, 33, 100, 2, 3, 34, 101, 3, 4, 35, 102, 4, 5, 36, 103};

  EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1));
  //    for (int kk = 0; kk < 16; ++kk) {
  //        EXPECT_EQ(A[kk], B[kk]);
  //    }
  EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1));
  //    for (int kk = 0; kk < 16; ++kk) {
  //        EXPECT_EQ(A[kk], B[kk]);
  //    }
  WebRtcSpl_ComplexBitReverse(B, 3);
  for (int kk = 0; kk < 16; ++kk) {
    //      EXPECT_EQ(A[kk], B[kk]);
  }
}

TEST_F(SplTest, Resample48WithSaturationTest) {
  // The test resamples 3*kBlockSize number of samples to 2*kBlockSize number
  // of samples.
  const size_t kBlockSize = 16;

  // Saturated input vector of 48 samples.
  const int32_t kVectorSaturated[3 * kBlockSize + 7] = {
      -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
      -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
      -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
      32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
      32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
      32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
      32767,  32767,  32767,  32767,  32767,  32767,  32767};

  // All values in |out_vector| should be |kRefValue32kHz|.
  const int32_t kRefValue32kHz1 = -1077493760;
  const int32_t kRefValue32kHz2 = 1077493645;

  // After bit shift with saturation, |out_vector_w16| is saturated.

  const int16_t kRefValue16kHz1 = -32768;
  const int16_t kRefValue16kHz2 = 32767;
  // Vector for storing output.
  int32_t out_vector[2 * kBlockSize];
  int16_t out_vector_w16[2 * kBlockSize];

  WebRtcSpl_Resample48khzTo32khz(kVectorSaturated, out_vector, kBlockSize);
  WebRtcSpl_VectorBitShiftW32ToW16(out_vector_w16, 2 * kBlockSize, out_vector,
                                   15);

  // Comparing output values against references. The values at position
  // 12-15 are skipped to account for the filter lag.
  for (size_t i = 0; i < 12; ++i) {
    EXPECT_EQ(kRefValue32kHz1, out_vector[i]);
    EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]);
  }
  for (size_t i = 16; i < 2 * kBlockSize; ++i) {
    EXPECT_EQ(kRefValue32kHz2, out_vector[i]);
    EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]);
  }
}
