/*
 *  Copyright (c) 2015 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 <limits>

#include "modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
#include "test/gtest.h"

namespace webrtc {

namespace {

void TestBadConfig(const AudioEncoderIsacFloatImpl::Config& config) {
  EXPECT_FALSE(config.IsOk());
}

void TestGoodConfig(const AudioEncoderIsacFloatImpl::Config& config) {
  EXPECT_TRUE(config.IsOk());
  AudioEncoderIsacFloatImpl aei(config);
}

// Wrap subroutine calls that test things in this, so that the error messages
// will be accompanied by stack traces that make it possible to tell which
// subroutine invocation caused the failure.
#define S(x) do { SCOPED_TRACE(#x); x; } while (0)

}  // namespace

TEST(AudioEncoderIsacTest, TestConfigBitrate) {
  AudioEncoderIsacFloatImpl::Config config;

  // The default value is some real, positive value.
  EXPECT_GT(config.bit_rate, 1);
  S(TestGoodConfig(config));

  // 0 is another way to ask for the default value.
  config.bit_rate = 0;
  S(TestGoodConfig(config));

  // Try some unreasonable values and watch them fail.
  config.bit_rate = -1;
  S(TestBadConfig(config));
  config.bit_rate = 1;
  S(TestBadConfig(config));
  config.bit_rate = std::numeric_limits<int>::max();
  S(TestBadConfig(config));
}

}  // namespace webrtc
