/*
 *  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.
 */

#ifndef MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_
#define MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_

#include <algorithm>

#include "modules/audio_coding/neteq/delay_manager.h"
#include "modules/audio_coding/neteq/histogram.h"
#include "test/gmock.h"

namespace webrtc {

class MockDelayManager : public DelayManager {
 public:
  MockDelayManager(size_t max_packets_in_buffer,
                   int base_min_target_delay_ms,
                   bool enable_rtx_handling,
                   DelayPeakDetector* peak_detector,
                   const TickTimer* tick_timer,
                   std::unique_ptr<Histogram> histogram)
      : DelayManager(max_packets_in_buffer,
                     base_min_target_delay_ms,
                     enable_rtx_handling,
                     peak_detector,
                     tick_timer,
                     std::move(histogram)) {}
  virtual ~MockDelayManager() { Die(); }
  MOCK_METHOD0(Die, void());
  MOCK_METHOD3(Update,
               int(uint16_t sequence_number,
                   uint32_t timestamp,
                   int sample_rate_hz));
  MOCK_METHOD2(CalculateTargetLevel, int(int iat_packets, bool reordered));
  MOCK_METHOD1(SetPacketAudioLength, int(int length_ms));
  MOCK_METHOD0(Reset, void());
  MOCK_CONST_METHOD0(PeakFound, bool());
  MOCK_METHOD1(UpdateCounters, void(int elapsed_time_ms));
  MOCK_METHOD0(ResetPacketIatCount, void());
  MOCK_CONST_METHOD2(BufferLimits, void(int* lower_limit, int* higher_limit));
  MOCK_METHOD1(SetBaseMinimumDelay, bool(int delay_ms));
  MOCK_CONST_METHOD0(GetBaseMinimumDelay, int());
  MOCK_CONST_METHOD0(TargetLevel, int());
  MOCK_METHOD0(RegisterEmptyPacket, void());
  MOCK_METHOD1(set_extra_delay_ms, void(int16_t delay));
  MOCK_CONST_METHOD0(base_target_level, int());
  MOCK_METHOD1(set_streaming_mode, void(bool value));
  MOCK_CONST_METHOD0(last_pack_cng_or_dtmf, int());
  MOCK_METHOD1(set_last_pack_cng_or_dtmf, void(int value));
};

}  // namespace webrtc
#endif  // MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_
