/*
 *  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 "webrtc/modules/audio_processing/transient/dyadic_decimator.h"

#include "webrtc/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
