/*
 *  Copyright (c) 2014 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 "testing/gtest/include/gtest/gtest.h"
#include "webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h"
#include "webrtc/modules/audio_coding/main/acm2/acm_generic_codec.h"

namespace webrtc {
namespace acm2 {

#ifdef WEBRTC_CODEC_OPUS
namespace {
const CodecInst kDefaultOpusCodecInst = {105, "opus", 48000, 960, 1, 32000};
const int kCngPt = 255;  // Not using CNG in this test.
const int kRedPt = 255;  // Not using RED in this test.
}  // namespace

class AcmGenericCodecOpusTest : public ::testing::Test {
 protected:
  AcmGenericCodecOpusTest() {
    acm_codec_params_ = {kDefaultOpusCodecInst, false, false, VADNormal};
  }

  void CreateCodec() {
    codec_wrapper_.reset(new ACMGenericCodec(
        acm_codec_params_.codec_inst, kCngPt, kCngPt, kCngPt, kCngPt,
        false /* enable RED */, kRedPt));
    ASSERT_TRUE(codec_wrapper_);
    ASSERT_EQ(0, codec_wrapper_->InitEncoder(&acm_codec_params_, true));
  }

  const AudioEncoderOpus* GetAudioEncoderOpus() {
    const AudioEncoderOpus* ptr = static_cast<const AudioEncoderOpus*>(
        codec_wrapper_->GetAudioEncoder());
    EXPECT_NE(nullptr, ptr);
    return ptr;
  }
  WebRtcACMCodecParams acm_codec_params_;
  rtc::scoped_ptr<ACMGenericCodec> codec_wrapper_;
};

TEST_F(AcmGenericCodecOpusTest, DefaultApplicationModeMono) {
  acm_codec_params_.codec_inst.channels = 1;
  CreateCodec();
  EXPECT_EQ(AudioEncoderOpus::kVoip, GetAudioEncoderOpus()->application());
}

TEST_F(AcmGenericCodecOpusTest, DefaultApplicationModeStereo) {
  acm_codec_params_.codec_inst.channels = 2;
  CreateCodec();
  EXPECT_EQ(AudioEncoderOpus::kAudio, GetAudioEncoderOpus()->application());
}

TEST_F(AcmGenericCodecOpusTest, ChangeApplicationMode) {
  // Create a stereo encoder.
  acm_codec_params_.codec_inst.channels = 2;
  CreateCodec();
  // Verify that the mode is kAudio.
  const AudioEncoderOpus* opus_ptr = GetAudioEncoderOpus();
  EXPECT_EQ(AudioEncoderOpus::kAudio, opus_ptr->application());

  // Change mode.
  EXPECT_EQ(0, codec_wrapper_->SetOpusApplication(kVoip));
  // Verify that the AudioEncoder object was changed.
  EXPECT_NE(opus_ptr, GetAudioEncoderOpus());
  EXPECT_EQ(AudioEncoderOpus::kVoip, GetAudioEncoderOpus()->application());
}

TEST_F(AcmGenericCodecOpusTest, ResetWontChangeApplicationMode) {
  // Create a stereo encoder.
  acm_codec_params_.codec_inst.channels = 2;
  CreateCodec();
  const AudioEncoderOpus* opus_ptr = GetAudioEncoderOpus();
  // Verify that the mode is kAudio.
  EXPECT_EQ(AudioEncoderOpus::kAudio, opus_ptr->application());

  // Trigger a reset.
  ASSERT_EQ(0, codec_wrapper_->InitEncoder(&acm_codec_params_, false));
  // Verify that the AudioEncoder object changed.
  EXPECT_NE(opus_ptr, GetAudioEncoderOpus());
  // Verify that the mode is still kAudio.
  EXPECT_EQ(AudioEncoderOpus::kAudio, GetAudioEncoderOpus()->application());

  // Now change to kVoip.
  EXPECT_EQ(0, codec_wrapper_->SetOpusApplication(kVoip));
  EXPECT_EQ(AudioEncoderOpus::kVoip, GetAudioEncoderOpus()->application());

  opus_ptr = GetAudioEncoderOpus();
  // Trigger a reset again.
  ASSERT_EQ(0, codec_wrapper_->InitEncoder(&acm_codec_params_, false));
  // Verify that the AudioEncoder object changed.
  EXPECT_NE(opus_ptr, GetAudioEncoderOpus());
  // Verify that the mode is still kVoip.
  EXPECT_EQ(AudioEncoderOpus::kVoip, GetAudioEncoderOpus()->application());
}
#endif  // WEBRTC_CODEC_OPUS

}  // namespace acm2
}  // namespace webrtc
