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

#ifndef UI_BASE_COCOA_NSWINDOW_TEST_UTIL_H_
#define UI_BASE_COCOA_NSWINDOW_TEST_UTIL_H_

#include <memory>

#include "base/component_export.h"
#include "base/run_loop.h"
#include "ui/gfx/native_ui_types.h"

namespace ui {

class COMPONENT_EXPORT(UI_BASE) NSWindowFullscreenNotificationWaiter {
 public:
  explicit NSWindowFullscreenNotificationWaiter(gfx::NativeWindow window);
  ~NSWindowFullscreenNotificationWaiter();

  void WaitForEnterAndExitCount(int target_enter_count, int target_exit_count);
  int enter_count() const { return enter_count_; }
  int exit_count() const { return exit_count_; }

  static void NotifyFullscreenTransitionComplete(gfx::NativeWindow window,
                                                 bool fullscreen);

 private:
  void NotifyFullscreenTransitionComplete(bool fullscreen);

  std::unique_ptr<base::RunLoop> run_loop_;
  const gfx::NativeWindow window_;

  int enter_count_ = 0;
  int exit_count_ = 0;
  int target_enter_count_ = 0;
  int target_exit_count_ = 0;

  static NSWindowFullscreenNotificationWaiter* instance_;
};

class COMPONENT_EXPORT(UI_BASE) NSWindowFakedForTesting {
 public:
  // This is set by tests that are not written robustly to asynchronous
  // transitions to fullscreen (e.g, by using ScopedFakeNSWindowFullscreen on
  // macOS).
  static void SetEnabled(bool);
  static bool IsEnabled();

 private:
  static bool enabled_;
};

// static void SetFullscreenFakedForTesting(bool);
// static bool IsFullscreenFakedForTesting();

}  // namespace ui

#endif  // UI_BASE_COCOA_NSWINDOW_TEST_UTIL_H_
