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

#ifndef CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_TEST_UTILS_H_
#define CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_TEST_UTILS_H_

#include "chrome/browser/device_notifications/device_connection_tracker.h"
#include "chrome/browser/device_notifications/device_system_tray_icon.h"
#include "testing/gmock/include/gmock/gmock.h"

class MockDeviceSystemTrayIcon : public DeviceSystemTrayIcon {
 public:
  MockDeviceSystemTrayIcon();
  ~MockDeviceSystemTrayIcon() override;

  MOCK_METHOD(void, StageProfile, (Profile*), (override));
  MOCK_METHOD(void, UnstageProfile, (Profile*, bool), (override));
  MOCK_METHOD(void, ProfileAdded, (Profile*), (override));
  MOCK_METHOD(void, ProfileRemoved, (Profile*), (override));
  MOCK_METHOD(void, NotifyConnectionCountUpdated, (Profile*), (override));
  MOCK_METHOD(gfx::ImageSkia, GetIcon, (), (override));
  MOCK_METHOD(std::u16string, GetTitleLabel, (size_t, size_t), (override));
  MOCK_METHOD(std::u16string, GetContentSettingsLabel, (), (override));
  MOCK_METHOD(DeviceConnectionTracker*,
              GetConnectionTracker,
              (base::WeakPtr<Profile>),
              (override));
};

class MockDeviceConnectionTracker : public DeviceConnectionTracker {
 public:
  explicit MockDeviceConnectionTracker(Profile* profile);
  ~MockDeviceConnectionTracker() override;
  MOCK_METHOD(void, ShowContentSettingsExceptions, (), (override));
  MOCK_METHOD(void, ShowSiteSettings, (const url::Origin&), (override));
  MOCK_METHOD(DeviceSystemTrayIcon*, GetSystemTrayIcon, (), (override));
};

#endif  // CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_TEST_UTILS_H_
