/*
 *  Copyright (c) 2013 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_processing/transient/dyadic_decimator.h"

#include "test/gtest.h"

namespace webrtc {

static const size_t kEvenBufferLength = 6;
static const size_t kOddBufferLength = 5;
static const size_t kOutBufferLength = 3;

int16_t const test_buffer_even_len[] = {0, 1, 2, 3, 4, 5};
int16_t const test_buffer_odd_len[] = {0, 1, 2, 3, 4};
int16_t test_buffer_out[kOutBufferLength];

TEST(DyadicDecimatorTest, GetOutLengthToDyadicDecimate) {
  EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, false));
  EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, true));
  EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(5, false));
  EXPECT_EQ(2u, GetOutLengthToDyadicDecimate(5, true));
}

TEST(DyadicDecimatorTest, DyadicDecimateErrorValues) {
  size_t out_samples = 0;

  out_samples = DyadicDecimate(static_cast<int16_t*>(NULL), kEvenBufferLength,
                               false,  // Even sequence.
                               test_buffer_out, kOutBufferLength);
  EXPECT_EQ(0u, out_samples);

  out_samples = DyadicDecimate(test_buffer_even_len, kEvenBufferLength,
                               false,  // Even sequence.
                               static_cast<int16_t*>(NULL), kOutBufferLength);
  EXPECT_EQ(0u, out_samples);

  // Less than required |out_length|.
  out_samples = DyadicDecimate(test_buffer_even_len, kEvenBufferLength,
                               false,  // Even sequence.
                               test_buffer_out, 2);
  EXPECT_EQ(0u, out_samples);
}

TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthEvenSequence) {
  size_t expected_out_samples =
      GetOutLengthToDyadicDecimate(kEvenBufferLength, false);

  size_t out_samples = DyadicDecimate(test_buffer_even_len, kEvenBufferLength,
                                      false,  // Even sequence.
                                      test_buffer_out, kOutBufferLength);

  EXPECT_EQ(expected_out_samples, out_samples);

  EXPECT_EQ(0, test_buffer_out[0]);
  EXPECT_EQ(2, test_buffer_out[1]);
  EXPECT_EQ(4, test_buffer_out[2]);
}

TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthOddSequence) {
  size_t expected_out_samples =
      GetOutLengthToDyadicDecimate(kEvenBufferLength, true);

  size_t out_samples = DyadicDecimate(test_buffer_even_len, kEvenBufferLength,
                                      true,  // Odd sequence.
                                      test_buffer_out, kOutBufferLength);

  EXPECT_EQ(expected_out_samples, out_samples);

  EXPECT_EQ(1, test_buffer_out[0]);
  EXPECT_EQ(3, test_buffer_out[1]);
  EXPECT_EQ(5, test_buffer_out[2]);
}

TEST(DyadicDecimatorTest, DyadicDecimateOddLengthEvenSequence) {
  size_t expected_out_samples =
      GetOutLengthToDyadicDecimate(kOddBufferLength, false);

  size_t out_samples = DyadicDecimate(test_buffer_odd_len, kOddBufferLength,
                                      false,  // Even sequence.
                                      test_buffer_out, kOutBufferLength);

  EXPECT_EQ(expected_out_samples, out_samples);

  EXPECT_EQ(0, test_buffer_out[0]);
  EXPECT_EQ(2, test_buffer_out[1]);
  EXPECT_EQ(4, test_buffer_out[2]);
}

TEST(DyadicDecimatorTest, DyadicDecimateOddLengthOddSequence) {
  size_t expected_out_samples =
      GetOutLengthToDyadicDecimate(kOddBufferLength, true);

  size_t out_samples = DyadicDecimate(test_buffer_odd_len, kOddBufferLength,
                                      true,  // Odd sequence.
                                      test_buffer_out, kOutBufferLength);

  EXPECT_EQ(expected_out_samples, out_samples);

  EXPECT_EQ(1, test_buffer_out[0]);
  EXPECT_EQ(3, test_buffer_out[1]);
}

}  // namespace webrtc
