/*
 *  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 "modules/audio_coding/codecs/isac/fix/source/codec.h"
#include "system_wrappers/include/cpu_features_wrapper.h"
#include "test/gtest.h"
#include "typedefs.h"  // NOLINT(build/include)

class FiltersTest : public testing::Test {
 protected:
  // Pass a function pointer to the Tester function.
  void FiltersTester(AutocorrFix WebRtcIsacfix_AutocorrFixFunction) {
    const int kOrder = 12;
    const int kBuffer = 40;
    int16_t scale = 0;
    int32_t r_buffer[kOrder + 2] = {0};

    // Test an overflow case.
    const int16_t x_buffer_0[kBuffer] = {
        0,      0,      3010,  22351,  21106, 16969,  -2095, -664,
        3513,   -30980, 32767, -23839, 13335, 20289,  -6831, 339,
        -17207, 32767,  4959,  6177,   32767, 16599,  -4747, 20504,
        3513,   -30980, 32767, -23839, 13335, 20289,  0,     -16969,
        -2095,  -664,   3513,  31981,  32767, -13839, 23336, 30281};
    const int32_t r_expected_0[kOrder + 2] = {
        1872498461, -224288754, 203789985, 483400487,  -208272635,
        2436500,    137785322,  266600814, -208486262, 329510080,
        137949184,  -161738972, -26894267, 237630192};

    WebRtcIsacfix_AutocorrFixFunction(r_buffer, x_buffer_0, kBuffer, kOrder + 1,
                                      &scale);
    for (int i = 0; i < kOrder + 2; i++) {
      EXPECT_EQ(r_expected_0[i], r_buffer[i]);
    }
    EXPECT_EQ(3, scale);

    // Test a no-overflow case.
    const int16_t x_buffer_1[kBuffer] = {
        0,   0,     300,   21,   206,   169,  -295, -664, 3513, -300,
        327, -29,   15,    289,  -6831, 339,  -107, 37,   59,   6177,
        327, 169,   -4747, 204,  313,   -980, 767,  -9,   135,  289,
        0,   -6969, -2095, -664, 0,     1,    7,    -39,  236,  281};
    const int32_t r_expected_1[kOrder + 2] = {
        176253864, 8126617,   1983287,   -26196788, -3487363,
        -42839676, -24644043, 3469813,   30559879,  31905045,
        5101567,   29328896,  -55787438, -13163978};

    WebRtcIsacfix_AutocorrFixFunction(r_buffer, x_buffer_1, kBuffer, kOrder + 1,
                                      &scale);
    for (int i = 0; i < kOrder + 2; i++) {
      EXPECT_EQ(r_expected_1[i], r_buffer[i]);
    }
    EXPECT_EQ(0, scale);
  }
};

TEST_F(FiltersTest, AutocorrFixTest) {
  FiltersTester(WebRtcIsacfix_AutocorrC);
#if defined(WEBRTC_HAS_NEON)
  FiltersTester(WebRtcIsacfix_AutocorrNeon);
#endif
}
