// 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 <memory>

#include "base/bind.h"
#include "base/macros.h"
#include "media/base/overlay_info.h"
#include "media/base/renderer_factory_selector.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace media {

class RendererFactorySelectorTest : public testing::Test {
 public:
  class FakeFactory : public RendererFactory {
   public:
    explicit FakeFactory(RendererType type) : type_(type) {}

    std::unique_ptr<Renderer> CreateRenderer(
        const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
        const scoped_refptr<base::TaskRunner>& worker_task_runner,
        AudioRendererSink* audio_renderer_sink,
        VideoRendererSink* video_renderer_sink,
        RequestOverlayInfoCB request_overlay_info_cb,
        const gfx::ColorSpace& target_color_space) override {
      return nullptr;
    }

    RendererType factory_type() { return type_; }

   private:
    RendererType type_;
  };

  RendererFactorySelectorTest() = default;

  void AddBaseFactory(RendererType type) {
    selector_.AddBaseFactory(type, std::make_unique<FakeFactory>(type));
  }

  void AddFactory(RendererType type) {
    selector_.AddFactory(type, std::make_unique<FakeFactory>(type));
  }

  void AddConditionalFactory(RendererType type) {
    condition_met_map_[type] = false;
    selector_.AddConditionalFactory(
        type, std::make_unique<FakeFactory>(type),
        base::BindRepeating(&RendererFactorySelectorTest::IsConditionMet,
                            base::Unretained(this), type));
  }

  RendererType GetCurrentlySelectedRendererType() {
    return reinterpret_cast<FakeFactory*>(selector_.GetCurrentFactory())
        ->factory_type();
  }

  bool IsConditionMet(RendererType type) {
    DCHECK(condition_met_map_.count(type));
    return condition_met_map_[type];
  }

 protected:
  RendererFactorySelector selector_;
  std::map<RendererType, bool> condition_met_map_;

  DISALLOW_COPY_AND_ASSIGN(RendererFactorySelectorTest);
};

TEST_F(RendererFactorySelectorTest, SingleFactory) {
  AddBaseFactory(RendererType::kDefault);
  EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType());
}

TEST_F(RendererFactorySelectorTest, MultipleFactory) {
  AddBaseFactory(RendererType::kDefault);
  AddFactory(RendererType::kMojo);

  EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType());

  selector_.SetBaseRendererType(RendererType::kMojo);
  EXPECT_EQ(RendererType::kMojo, GetCurrentlySelectedRendererType());
}

TEST_F(RendererFactorySelectorTest, ConditionalFactory) {
  AddBaseFactory(RendererType::kDefault);
  AddFactory(RendererType::kMojo);
  AddConditionalFactory(RendererType::kCourier);

  EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType());

  condition_met_map_[RendererType::kCourier] = true;
  EXPECT_EQ(RendererType::kCourier, GetCurrentlySelectedRendererType());

  selector_.SetBaseRendererType(RendererType::kMojo);
  EXPECT_EQ(RendererType::kCourier, GetCurrentlySelectedRendererType());

  condition_met_map_[RendererType::kCourier] = false;
  EXPECT_EQ(RendererType::kMojo, GetCurrentlySelectedRendererType());
}

TEST_F(RendererFactorySelectorTest, MultipleConditionalFactories) {
  AddBaseFactory(RendererType::kDefault);
  AddConditionalFactory(RendererType::kFlinging);
  AddConditionalFactory(RendererType::kCourier);

  EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType());

  condition_met_map_[RendererType::kFlinging] = false;
  condition_met_map_[RendererType::kCourier] = true;
  EXPECT_EQ(RendererType::kCourier, GetCurrentlySelectedRendererType());

  condition_met_map_[RendererType::kFlinging] = true;
  condition_met_map_[RendererType::kCourier] = false;
  EXPECT_EQ(RendererType::kFlinging, GetCurrentlySelectedRendererType());

  // It's up to the implementation detail to decide which one to use.
  condition_met_map_[RendererType::kFlinging] = true;
  condition_met_map_[RendererType::kCourier] = true;
  EXPECT_TRUE(GetCurrentlySelectedRendererType() == RendererType::kFlinging ||
              GetCurrentlySelectedRendererType() == RendererType::kCourier);
}

}  // namespace media
