// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/audio/audio_system_impl.h"
#include "base/message_loop/message_loop.h"
#include "media/audio/audio_system_test_util.h"
#include "media/audio/audio_thread_impl.h"
#include "media/audio/mock_audio_manager.h"
#include "media/audio/test_audio_thread.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace media {

// TODO(olka): These are the only tests for AudioSystemHelper. Make sure that
// AudioSystemHelper is tested if AudioSystemImpl goes away.

// Typed tests cannot be parametrized, so using template parameter instead of
// inheriting from TestWithParams<>
template <bool use_audio_thread>
class AudioSystemImplTestBase : public testing::Test {
 public:
  AudioSystemImplTestBase() = default;

  ~AudioSystemImplTestBase() override = default;

  void SetUp() override {
    audio_manager_ = std::make_unique<MockAudioManager>(
        std::make_unique<TestAudioThread>(use_audio_thread));
    audio_system_ = std::make_unique<AudioSystemImpl>(audio_manager_.get());
  }
  void TearDown() override { audio_manager_->Shutdown(); }

 protected:
  MockAudioManager* audio_manager() { return audio_manager_.get(); }
  AudioSystem* audio_system() { return audio_system_.get(); }

  base::MessageLoop message_loop_;
  std::unique_ptr<MockAudioManager> audio_manager_;
  std::unique_ptr<AudioSystem> audio_system_;
  // AudioSystemTester tester_;
};

using AudioSystemTestBaseVariations =
    testing::Types<AudioSystemImplTestBase<false>,
                   AudioSystemImplTestBase<true>>;

INSTANTIATE_TYPED_TEST_CASE_P(AudioSystemImpl,
                              AudioSystemTestTemplate,
                              AudioSystemTestBaseVariations);

}  // namespace media
