mirror_window_controller_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ash/display/mirror_window_controller.h"
6
7#include "ash/display/display_manager.h"
8#include "ash/shell.h"
9#include "ash/test/ash_test_base.h"
10#include "ash/test/mirror_window_test_api.h"
11#include "ui/aura/root_window.h"
12#include "ui/aura/test/event_generator.h"
13#include "ui/aura/test/test_window_delegate.h"
14#include "ui/aura/test/test_windows.h"
15#include "ui/aura/window.h"
16#include "ui/base/hit_test.h"
17
18namespace ash {
19namespace internal {
20
21typedef test::AshTestBase MirrorWindowControllerTest;
22
23#if defined(OS_WIN)
24// Software mirroring does not work on win.
25#define MAYBE_MirrorCursorBasic DISABLED_MirrorCursorBasic
26#define MAYBE_MirrorCursorLocations DISABLED_MirrorCursorLocations
27#else
28#define MAYBE_MirrorCursorBasic MirrorCursorBasic
29#define MAYBE_MirrorCursorLocations MirrorCursorLocations
30#endif
31
32TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorBasic) {
33  test::MirrorWindowTestApi test_api;
34  aura::test::TestWindowDelegate test_window_delegate;
35  test_window_delegate.set_window_component(HTTOP);
36
37  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
38  display_manager->SetSoftwareMirroring(true);
39  UpdateDisplay("400x400,400x400");
40  aura::RootWindow* root = Shell::GetInstance()->GetPrimaryRootWindow();
41  scoped_ptr<aura::Window> window(aura::test::CreateTestWindowWithDelegate(
42      &test_window_delegate,
43      0,
44      gfx::Rect(50, 50, 100, 100),
45      root));
46  window->Show();
47  window->SetName("foo");
48
49  EXPECT_TRUE(test_api.GetCursorWindow());
50  EXPECT_EQ("50,50 100x100", window->bounds().ToString());
51
52  aura::test::EventGenerator generator(root);
53  generator.MoveMouseTo(10, 10);
54
55  // Test if cursor movement is propertly reflected in mirror window.
56  gfx::Point hot_point = test_api.GetCursorHotPoint();
57  gfx::Point cursor_window_origin =
58      test_api.GetCursorWindow()->bounds().origin();
59  EXPECT_EQ("4,4", hot_point.ToString());
60  EXPECT_EQ(10 - hot_point.x(), cursor_window_origin.x());
61  EXPECT_EQ(10 - hot_point.y(), cursor_window_origin.y());
62  EXPECT_EQ(ui::kCursorNull, test_api.GetCurrentCursorType());
63  EXPECT_TRUE(test_api.GetCursorWindow()->IsVisible());
64
65  // Test if cursor type change is propertly reflected in mirror window.
66  generator.MoveMouseTo(100, 100);
67  hot_point = test_api.GetCursorHotPoint();
68  cursor_window_origin = test_api.GetCursorWindow()->bounds().origin();
69  EXPECT_EQ(100 - hot_point.x(), cursor_window_origin.x());
70  EXPECT_EQ(100 - hot_point.y(), cursor_window_origin.y());
71  EXPECT_EQ(ui::kCursorNorthResize, test_api.GetCurrentCursorType());
72
73  // Test if visibility change is propertly reflected in mirror window.
74  // A key event hides cursor.
75  generator.PressKey(ui::VKEY_A, 0);
76  generator.ReleaseKey(ui::VKEY_A, 0);
77  EXPECT_FALSE(test_api.GetCursorWindow()->IsVisible());
78
79  // Mouse event makes it visible again.
80  generator.MoveMouseTo(300, 300);
81  hot_point = test_api.GetCursorHotPoint();
82  cursor_window_origin = test_api.GetCursorWindow()->bounds().origin();
83  EXPECT_EQ(300 - hot_point.x(), cursor_window_origin.x());
84  EXPECT_EQ(300 - hot_point.y(), cursor_window_origin.y());
85  EXPECT_EQ(ui::kCursorNull, test_api.GetCurrentCursorType());
86  EXPECT_TRUE(test_api.GetCursorWindow()->IsVisible());
87}
88
89// Make sure that the mirror cursor's location is same as
90// the source display's host location in the mirror root window's
91// coordinates.
92TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorLocations) {
93  test::MirrorWindowTestApi test_api;
94  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
95  display_manager->SetSoftwareMirroring(true);
96
97  // Test with device scale factor.
98  UpdateDisplay("400x600*2,400x600");
99
100  aura::RootWindow* root = Shell::GetInstance()->GetPrimaryRootWindow();
101  aura::test::EventGenerator generator(root);
102  generator.MoveMouseToInHost(10, 20);
103
104  gfx::Point hot_point = test_api.GetCursorHotPoint();
105  EXPECT_EQ("8,9", hot_point.ToString());
106  gfx::Point cursor_window_origin =
107      test_api.GetCursorWindow()->bounds().origin();
108  EXPECT_EQ(10 - hot_point.x(), cursor_window_origin.x());
109  EXPECT_EQ(20 - hot_point.y(), cursor_window_origin.y());
110
111  // Test with ui scale
112  UpdateDisplay("400x600*0.5,400x600");
113  generator.MoveMouseToInHost(20, 30);
114
115  hot_point = test_api.GetCursorHotPoint();
116  EXPECT_EQ("4,4", hot_point.ToString());
117  cursor_window_origin = test_api.GetCursorWindow()->bounds().origin();
118  EXPECT_EQ(20 - hot_point.x(), cursor_window_origin.x());
119  EXPECT_EQ(30 - hot_point.y(), cursor_window_origin.y());
120
121  // Test with rotation
122  UpdateDisplay("400x600/r,400x600");
123  generator.MoveMouseToInHost(30, 40);
124
125  hot_point = test_api.GetCursorHotPoint();
126  EXPECT_EQ("4,4", hot_point.ToString());
127  cursor_window_origin = test_api.GetCursorWindow()->bounds().origin();
128  EXPECT_EQ(30 - hot_point.x(), cursor_window_origin.x());
129  EXPECT_EQ(40 - hot_point.y(), cursor_window_origin.y());
130}
131
132}  // namsspace internal
133}  // namespace ash
134