// Copyright 2018 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.

#ifndef ASH_MAGNIFIER_MAGNIFIER_TEST_UTILS_H_
#define ASH_MAGNIFIER_MAGNIFIER_TEST_UTILS_H_

#include "base/macros.h"
#include "ui/gfx/geometry/size.h"

namespace aura {
class Window;
}  // namespace aura

namespace gfx {
class Point;
class Rect;
}  // namespace gfx

namespace ui {
class InputMethod;
}  // namespace ui

namespace ash {

class TestFocusView;
class TestTextInputView;

// Defines a test helper for magnifiers unit tests that wants to verify their
// behaviors in response to focus change events.
class MagnifierFocusTestHelper {
 public:
  MagnifierFocusTestHelper() = default;
  ~MagnifierFocusTestHelper() = default;

  static constexpr int kButtonHeight = 20;
  static constexpr gfx::Size kTestFocusViewSize{300, 200};

  // Creates a view at |location| in the primary root window with size =
  // |kTestFocusViewSize|. The view has two buttons, the first is positioned at
  // the top of the view and the second at the bottom of the view. Both bottons
  // have width = the width of |kTestFocusViewSize|, and height =
  // |kButtonHeight|.
  void CreateAndShowFocusTestView(const gfx::Point& location);

  void FocusFirstButton();
  void FocusSecondButton();

  gfx::Rect GetFirstButtonBoundsInRoot() const;
  gfx::Rect GetSecondButtonBoundsInRoot() const;

 private:
  TestFocusView* focus_test_view_ = nullptr;

  DISALLOW_COPY_AND_ASSIGN(MagnifierFocusTestHelper);
};

// Defines a test helper for magnifiers unit tests that wants to verify their
// behaviors in response to text fields input and focus events.
class MagnifierTextInputTestHelper {
 public:
  MagnifierTextInputTestHelper() = default;
  ~MagnifierTextInputTestHelper() = default;

  // Creates a text input view in the primary root window with the given
  // |bounds|.
  void CreateAndShowTextInputView(const gfx::Rect& bounds);

  // Similar to the above, but creates the view in the given |root| window.
  void CreateAndShowTextInputViewInRoot(const gfx::Rect& bounds,
                                        aura::Window* root);

  // Returns the text input view's bounds in root window coordinates.
  gfx::Rect GetTextInputViewBounds();

  // Returns the caret bounds in root window coordinates.
  gfx::Rect GetCaretBounds();

  void FocusOnTextInputView();

 private:
  ui::InputMethod* GetInputMethod();

  TestTextInputView* text_input_view_ = nullptr;

  DISALLOW_COPY_AND_ASSIGN(MagnifierTextInputTestHelper);
};

}  // namespace ash

#endif  // ASH_MAGNIFIER_MAGNIFIER_TEST_UTILS_H_
