/*
 *  Copyright (c) 2016 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/echo_detector/circular_buffer.h"
#include "webrtc/test/gtest.h"

namespace webrtc {

TEST(CircularBufferTests, LessThanMaxTest) {
  CircularBuffer test_buffer(3);
  test_buffer.Push(1.f);
  test_buffer.Push(2.f);
  EXPECT_EQ(rtc::Optional<float>(1.f), test_buffer.Pop());
  EXPECT_EQ(rtc::Optional<float>(2.f), test_buffer.Pop());
}

TEST(CircularBufferTests, FillTest) {
  CircularBuffer test_buffer(3);
  test_buffer.Push(1.f);
  test_buffer.Push(2.f);
  test_buffer.Push(3.f);
  EXPECT_EQ(rtc::Optional<float>(1.f), test_buffer.Pop());
  EXPECT_EQ(rtc::Optional<float>(2.f), test_buffer.Pop());
  EXPECT_EQ(rtc::Optional<float>(3.f), test_buffer.Pop());
}

TEST(CircularBufferTests, OverflowTest) {
  CircularBuffer test_buffer(3);
  test_buffer.Push(1.f);
  test_buffer.Push(2.f);
  test_buffer.Push(3.f);
  test_buffer.Push(4.f);
  // Because the circular buffer has a size of 3, the first insert should have
  // been forgotten.
  EXPECT_EQ(rtc::Optional<float>(2.f), test_buffer.Pop());
  EXPECT_EQ(rtc::Optional<float>(3.f), test_buffer.Pop());
  EXPECT_EQ(rtc::Optional<float>(4.f), test_buffer.Pop());
}

TEST(CircularBufferTests, ReadFromEmpty) {
  CircularBuffer test_buffer(3);
  EXPECT_EQ(rtc::Optional<float>(), test_buffer.Pop());
}

}  // namespace webrtc
