/*
 *  Copyright (c) 2012 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.
 */

// Unit tests for DecisionLogic class and derived classes.

#include "modules/audio_coding/neteq/decision_logic.h"
#include "modules/audio_coding/neteq/buffer_level_filter.h"
#include "modules/audio_coding/neteq/decoder_database.h"
#include "modules/audio_coding/neteq/delay_manager.h"
#include "modules/audio_coding/neteq/delay_peak_detector.h"
#include "modules/audio_coding/neteq/packet_buffer.h"
#include "modules/audio_coding/neteq/tick_timer.h"
#include "test/field_trial.h"
#include "test/gtest.h"
#include "test/mock_audio_decoder_factory.h"

namespace webrtc {

TEST(DecisionLogic, CreateAndDestroy) {
  int fs_hz = 8000;
  int output_size_samples = fs_hz / 100;  // Samples per 10 ms.
  DecoderDatabase decoder_database(
      new rtc::RefCountedObject<MockAudioDecoderFactory>, absl::nullopt);
  TickTimer tick_timer;
  PacketBuffer packet_buffer(10, &tick_timer);
  DelayPeakDetector delay_peak_detector(&tick_timer, false);
  DelayManager delay_manager(240, 0, false, &delay_peak_detector, &tick_timer);
  BufferLevelFilter buffer_level_filter;
  DecisionLogic* logic = DecisionLogic::Create(
      fs_hz, output_size_samples, false, &decoder_database, packet_buffer,
      &delay_manager, &buffer_level_filter, &tick_timer);
  delete logic;
}

TEST(DecisionLogic, PostponeDecodingAfterExpansionSettings) {
  constexpr int kDefaultPostponeDecodingLevel = 50;
  constexpr int kFsHz = 8000;
  constexpr int kOutputSizeSamples = kFsHz / 100;  // Samples per 10 ms.
  DecoderDatabase decoder_database(
      new rtc::RefCountedObject<MockAudioDecoderFactory>, absl::nullopt);
  TickTimer tick_timer;
  PacketBuffer packet_buffer(10, &tick_timer);
  DelayPeakDetector delay_peak_detector(&tick_timer, false);
  DelayManager delay_manager(240, 0, false, &delay_peak_detector, &tick_timer);
  BufferLevelFilter buffer_level_filter;
  {
    test::ScopedFieldTrials field_trial(
        "WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled/");
    DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
                        packet_buffer, &delay_manager, &buffer_level_filter,
                        &tick_timer);
    EXPECT_EQ(kDefaultPostponeDecodingLevel,
              logic.postpone_decoding_level_for_test());
  }
  {
    test::ScopedFieldTrials field_trial(
        "WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled-65/");
    DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
                        packet_buffer, &delay_manager, &buffer_level_filter,
                        &tick_timer);
    EXPECT_EQ(65, logic.postpone_decoding_level_for_test());
  }
  {
    test::ScopedFieldTrials field_trial(
        "WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Disabled/");
    DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
                        packet_buffer, &delay_manager, &buffer_level_filter,
                        &tick_timer);
    EXPECT_EQ(0, logic.postpone_decoding_level_for_test());
  }
  {
    test::ScopedFieldTrials field_trial(
        "WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled--1/");
    DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
                        packet_buffer, &delay_manager, &buffer_level_filter,
                        &tick_timer);
    EXPECT_EQ(kDefaultPostponeDecodingLevel,
              logic.postpone_decoding_level_for_test());
  }
  {
    test::ScopedFieldTrials field_trial(
        "WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled-101/");
    DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
                        packet_buffer, &delay_manager, &buffer_level_filter,
                        &tick_timer);
    EXPECT_EQ(kDefaultPostponeDecodingLevel,
              logic.postpone_decoding_level_for_test());
  }
}

// TODO(hlundin): Write more tests.

}  // namespace webrtc
