1// Copyright (c) 2010 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 "base/basictypes.h"
6#include "chrome/browser/ui/tabs/dock_info.h"
7#include "testing/gtest/include/gtest/gtest.h"
8#include "ui/gfx/point.h"
9
10namespace {
11// Distance in pixels between the hotspot and when the hint should be shown.
12const int kHotSpotDeltaX = 120;
13const int kHotSpotDeltaY = 120;
14// Size of the popup window.
15const int kPopupWidth = 70;
16const int kPopupHeight = 70;
17}  // namespace
18
19TEST(DockInfoTest, IsCloseToPoint) {
20  bool in_enable_area;
21  gfx::Point screen_loc[] = {
22    gfx::Point(0, 0),
23    gfx::Point(kPopupWidth/2 - 1, kPopupHeight/2 - 1),
24    gfx::Point(kPopupWidth/2, kPopupHeight/2),
25    gfx::Point(kHotSpotDeltaX - 1, kHotSpotDeltaY - 1),
26    gfx::Point(kHotSpotDeltaX, kHotSpotDeltaY),
27    gfx::Point(-kHotSpotDeltaX, -kHotSpotDeltaY)
28  };
29  gfx::Point hotspot[] = {
30    gfx::Point(0, 0),
31    gfx::Point(0, 0),
32    gfx::Point(kPopupWidth, kPopupHeight),
33    gfx::Point(0, 0),
34    gfx::Point(2*kHotSpotDeltaX, 2*kHotSpotDeltaY),
35    gfx::Point(0, 0)
36  };
37  bool expected_results[] = {
38    true, true, true, true, false, false
39  };
40  bool expected_in_enable_area[] = {
41    true, true, false, false, false, false
42  };
43
44  for (size_t i = 0; i < arraysize(expected_results); ++i) {
45    bool result = DockInfo::IsCloseToPoint(
46        screen_loc[i], hotspot[i].x(), hotspot[i].y(), &in_enable_area);
47    EXPECT_EQ(expected_results[i], result);
48    EXPECT_EQ(expected_in_enable_area[i], in_enable_area);
49  }
50}
51
52TEST(DockInfoTest, IsCloseToMonitorPoint) {
53  bool in_enable_area;
54  gfx::Point screen_loc[] = {
55    gfx::Point(0, 0),
56    gfx::Point(kPopupWidth - 1, kPopupHeight/2 -1),
57    gfx::Point(kPopupWidth, kPopupHeight/2 - 1),
58    gfx::Point(kPopupWidth - 1, kPopupHeight),
59    gfx::Point(2*kHotSpotDeltaX, kHotSpotDeltaY - 1),
60    gfx::Point(2*kHotSpotDeltaX - 1, kHotSpotDeltaY),
61    gfx::Point(2*kHotSpotDeltaX - 1, kHotSpotDeltaY),
62    gfx::Point(0, 0),
63    gfx::Point(kPopupWidth/2 - 1, kPopupHeight - 1),
64    gfx::Point(kPopupWidth/2 - 1, kPopupHeight),
65    gfx::Point(kPopupWidth/2, kPopupHeight - 1),
66    gfx::Point(kHotSpotDeltaX - 1, 2*kHotSpotDeltaY),
67    gfx::Point(kHotSpotDeltaX, 2*kHotSpotDeltaY - 1),
68  };
69  gfx::Point hotspot = gfx::Point(0, 0);
70  DockInfo::Type type[] = {
71    DockInfo::LEFT_HALF,
72    DockInfo::LEFT_HALF,
73    DockInfo::LEFT_HALF,
74    DockInfo::LEFT_HALF,
75    DockInfo::LEFT_HALF,
76    DockInfo::LEFT_HALF,
77    DockInfo::RIGHT_HALF,
78    DockInfo::BOTTOM_HALF,
79    DockInfo::BOTTOM_HALF,
80    DockInfo::BOTTOM_HALF,
81    DockInfo::BOTTOM_HALF,
82    DockInfo::BOTTOM_HALF,
83    DockInfo::BOTTOM_HALF,
84  };
85  bool expected_results[] = {
86    true, true, true, true, false, false, false,
87    true, true, true, true, false, false
88  };
89  bool expected_in_enable_area[] = {
90    true, true, false, false, false, false, false,
91    true, true, false, false, false, false
92  };
93
94  for (size_t i = 0; i < arraysize(expected_results); ++i) {
95    bool result = DockInfo::IsCloseToMonitorPoint(
96        screen_loc[i], hotspot.x(), hotspot.y(), type[i], &in_enable_area);
97    EXPECT_EQ(expected_results[i], result);
98    EXPECT_EQ(expected_in_enable_area[i], in_enable_area);
99  }
100}
101
102TEST(DockInfoTest, IsValidForPoint) {
103  DockInfo d;
104  EXPECT_FALSE(d.IsValidForPoint(gfx::Point(0, 0)));
105  d.set_monitor_bounds(gfx::Rect(0, 0, kPopupWidth, kPopupHeight));
106  d.set_hot_spot(gfx::Point(0, 0));
107  d.set_type(DockInfo::LEFT_HALF);
108
109  gfx::Point screen_point[] = {
110    gfx::Point(0, 0),
111    gfx::Point(kPopupWidth + 1, kPopupHeight + 1),
112    gfx::Point(2 * kHotSpotDeltaX, kHotSpotDeltaY),
113  };
114
115  bool expected_result[] = {
116    true, false, false
117  };
118
119  for (size_t i = 0; i < arraysize(expected_result); ++i) {
120    EXPECT_EQ(expected_result[i], d.IsValidForPoint(screen_point[i]));
121  }
122}
123
124TEST(DockInfoTest, equals) {
125  DockInfo d;
126  DockInfo dd;
127  EXPECT_TRUE(d.equals(dd));
128  d.set_type(DockInfo::MAXIMIZE);
129  EXPECT_FALSE(d.equals(dd));
130}
131
132TEST(DockInfoTest, CheckMonitorPoint) {
133  DockInfo d;
134  gfx::Point screen_loc[] = {
135    gfx::Point(0, 0),
136    gfx::Point(2 * kHotSpotDeltaX, kHotSpotDeltaY),
137    gfx::Point(2 * kHotSpotDeltaX, kHotSpotDeltaY),
138  };
139
140  DockInfo::Type type[] = {
141    DockInfo::LEFT_HALF,
142    DockInfo::RIGHT_HALF,
143    DockInfo::MAXIMIZE
144  };
145
146  bool expected_result[] = {
147    true, false, false
148  };
149
150  for (size_t i = 0; i < arraysize(expected_result); ++i) {
151    bool result = d.CheckMonitorPoint(screen_loc[i], 0, 0, type[i]);
152    EXPECT_EQ(result, expected_result[i]);
153    if (result == true) {
154      EXPECT_EQ(0, d.hot_spot().x());
155      EXPECT_EQ(0, d.hot_spot().y());
156      EXPECT_EQ(type[i], d.type());
157    }
158  }
159}
160
161TEST(DockInfoTest, GetPopupRect) {
162  DockInfo d;
163  d.set_hot_spot(gfx::Point(kPopupWidth, kPopupHeight));
164  DockInfo::Type type[] = {
165    DockInfo::MAXIMIZE,
166    DockInfo::LEFT_HALF,
167    DockInfo::RIGHT_HALF,
168    DockInfo::BOTTOM_HALF,
169  };
170  int expected_x[] = {
171    kPopupWidth/2,
172    kPopupWidth,
173    0,
174    kPopupWidth/2
175  };
176  int expected_y[] = {
177    kPopupHeight,
178    kPopupHeight/2,
179    kPopupHeight/2,
180    0
181  };
182
183  for (size_t i = 0; i < arraysize(type); ++i) {
184    d.set_type(type[i]);
185    gfx::Rect result = d.GetPopupRect();
186    EXPECT_EQ(expected_x[i], result.x());
187    EXPECT_EQ(expected_y[i], result.y());
188    EXPECT_EQ(kPopupWidth, result.width());
189    EXPECT_EQ(kPopupHeight, result.height());
190  }
191}
192