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

#ifndef COMPONENTS_UI_DEVTOOLS_UI_DEVTOOLS_UNITTEST_UTILS_H_
#define COMPONENTS_UI_DEVTOOLS_UI_DEVTOOLS_UNITTEST_UTILS_H_

#include <vector>

#include "components/ui_devtools/protocol.h"
#include "components/ui_devtools/ui_element.h"
#include "components/ui_devtools/ui_element_delegate.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace ui_devtools {

class FakeFrontendChannel : public protocol::FrontendChannel {
 public:
  FakeFrontendChannel();

  FakeFrontendChannel(const FakeFrontendChannel&) = delete;
  FakeFrontendChannel& operator=(const FakeFrontendChannel&) = delete;

  ~FakeFrontendChannel() override;

  int CountProtocolNotificationMessageStartsWith(const std::string& message);

  int CountProtocolNotificationMessage(const std::string& message);

  void SetAllowNotifications(bool allow_notifications) {
    allow_notifications_ = allow_notifications;
  }

  // FrontendChannel:
  void SendProtocolResponse(
      int callId,
      std::unique_ptr<protocol::Serializable> message) override {}
  void FlushProtocolNotifications() override {}
  void FallThrough(int call_id,
                   crdtp::span<uint8_t> method,
                   crdtp::span<uint8_t> message) override {}
  void SendProtocolNotification(
      std::unique_ptr<protocol::Serializable> message) override;

 private:
  std::vector<std::string> protocol_notification_messages_;
  bool allow_notifications_ = true;
};

class MockUIElementDelegate : public UIElementDelegate {
 public:
  MockUIElementDelegate();
  ~MockUIElementDelegate() override;

  MOCK_METHOD2(OnUIElementAdded, void(UIElement*, UIElement*));
  MOCK_METHOD2(OnUIElementReordered, void(UIElement*, UIElement*));
  MOCK_METHOD1(OnUIElementRemoved, void(UIElement*));
  MOCK_METHOD1(OnUIElementBoundsChanged, void(UIElement*));
};

class FakeUIElement : public UIElement {
 public:
  explicit FakeUIElement(UIElementDelegate* ui_element_delegate)
      : UIElement(UIElementType::ROOT, ui_element_delegate, nullptr) {}

  ~FakeUIElement() override = default;
  void GetBounds(gfx::Rect* bounds) const override;
  void SetBounds(const gfx::Rect& bounds) override;
  void GetVisible(bool* visible) const override;
  void SetVisible(bool visible) override;
  std::vector<std::string> GetAttributes() const override;
  std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds()
      const override;
  gfx::Rect GetNodeBoundsInScreen() const override;
  void AddSource(std::string path, int line);
  bool visible() const { return visible_; }
  gfx::Rect bounds() const { return bounds_; }

 private:
  gfx::Rect bounds_;
  bool visible_ = false;
};

}  // namespace ui_devtools

#endif  // COMPONENTS_UI_DEVTOOLS_UI_DEVTOOLS_UNITTEST_UTILS_H_
