1 // Copyright (c) 2012 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.
5 #include "ui/views/bubble/bubble_border.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/stringprintf.h"
9 #include "ui/views/test/views_test_base.h"
13 typedef views::ViewsTestBase BubbleBorderTest
;
15 TEST_F(BubbleBorderTest
, GetMirroredArrow
) {
16 // Horizontal mirroring.
17 EXPECT_EQ(BubbleBorder::TOP_RIGHT
,
18 BubbleBorder::horizontal_mirror(BubbleBorder::TOP_LEFT
));
19 EXPECT_EQ(BubbleBorder::TOP_LEFT
,
20 BubbleBorder::horizontal_mirror(BubbleBorder::TOP_RIGHT
));
22 EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT
,
23 BubbleBorder::horizontal_mirror(BubbleBorder::BOTTOM_LEFT
));
24 EXPECT_EQ(BubbleBorder::BOTTOM_LEFT
,
25 BubbleBorder::horizontal_mirror(BubbleBorder::BOTTOM_RIGHT
));
27 EXPECT_EQ(BubbleBorder::RIGHT_TOP
,
28 BubbleBorder::horizontal_mirror(BubbleBorder::LEFT_TOP
));
29 EXPECT_EQ(BubbleBorder::LEFT_TOP
,
30 BubbleBorder::horizontal_mirror(BubbleBorder::RIGHT_TOP
));
32 EXPECT_EQ(BubbleBorder::RIGHT_BOTTOM
,
33 BubbleBorder::horizontal_mirror(BubbleBorder::LEFT_BOTTOM
));
34 EXPECT_EQ(BubbleBorder::LEFT_BOTTOM
,
35 BubbleBorder::horizontal_mirror(BubbleBorder::RIGHT_BOTTOM
));
37 EXPECT_EQ(BubbleBorder::TOP_CENTER
,
38 BubbleBorder::horizontal_mirror(BubbleBorder::TOP_CENTER
));
39 EXPECT_EQ(BubbleBorder::BOTTOM_CENTER
,
40 BubbleBorder::horizontal_mirror(BubbleBorder::BOTTOM_CENTER
));
42 EXPECT_EQ(BubbleBorder::RIGHT_CENTER
,
43 BubbleBorder::horizontal_mirror(BubbleBorder::LEFT_CENTER
));
44 EXPECT_EQ(BubbleBorder::LEFT_CENTER
,
45 BubbleBorder::horizontal_mirror(BubbleBorder::RIGHT_CENTER
));
47 EXPECT_EQ(BubbleBorder::NONE
,
48 BubbleBorder::horizontal_mirror(BubbleBorder::NONE
));
49 EXPECT_EQ(BubbleBorder::FLOAT
,
50 BubbleBorder::horizontal_mirror(BubbleBorder::FLOAT
));
52 // Vertical mirroring.
53 EXPECT_EQ(BubbleBorder::BOTTOM_LEFT
,
54 BubbleBorder::vertical_mirror(BubbleBorder::TOP_LEFT
));
55 EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT
,
56 BubbleBorder::vertical_mirror(BubbleBorder::TOP_RIGHT
));
58 EXPECT_EQ(BubbleBorder::TOP_LEFT
,
59 BubbleBorder::vertical_mirror(BubbleBorder::BOTTOM_LEFT
));
60 EXPECT_EQ(BubbleBorder::TOP_RIGHT
,
61 BubbleBorder::vertical_mirror(BubbleBorder::BOTTOM_RIGHT
));
63 EXPECT_EQ(BubbleBorder::LEFT_BOTTOM
,
64 BubbleBorder::vertical_mirror(BubbleBorder::LEFT_TOP
));
65 EXPECT_EQ(BubbleBorder::RIGHT_BOTTOM
,
66 BubbleBorder::vertical_mirror(BubbleBorder::RIGHT_TOP
));
68 EXPECT_EQ(BubbleBorder::LEFT_TOP
,
69 BubbleBorder::vertical_mirror(BubbleBorder::LEFT_BOTTOM
));
70 EXPECT_EQ(BubbleBorder::RIGHT_TOP
,
71 BubbleBorder::vertical_mirror(BubbleBorder::RIGHT_BOTTOM
));
73 EXPECT_EQ(BubbleBorder::BOTTOM_CENTER
,
74 BubbleBorder::vertical_mirror(BubbleBorder::TOP_CENTER
));
75 EXPECT_EQ(BubbleBorder::TOP_CENTER
,
76 BubbleBorder::vertical_mirror(BubbleBorder::BOTTOM_CENTER
));
78 EXPECT_EQ(BubbleBorder::LEFT_CENTER
,
79 BubbleBorder::vertical_mirror(BubbleBorder::LEFT_CENTER
));
80 EXPECT_EQ(BubbleBorder::RIGHT_CENTER
,
81 BubbleBorder::vertical_mirror(BubbleBorder::RIGHT_CENTER
));
83 EXPECT_EQ(BubbleBorder::NONE
,
84 BubbleBorder::vertical_mirror(BubbleBorder::NONE
));
85 EXPECT_EQ(BubbleBorder::FLOAT
,
86 BubbleBorder::vertical_mirror(BubbleBorder::FLOAT
));
89 TEST_F(BubbleBorderTest
, HasArrow
) {
90 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::TOP_LEFT
));
91 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::TOP_RIGHT
));
93 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::BOTTOM_LEFT
));
94 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::BOTTOM_RIGHT
));
96 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::LEFT_TOP
));
97 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::RIGHT_TOP
));
99 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::LEFT_BOTTOM
));
100 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::RIGHT_BOTTOM
));
102 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::TOP_CENTER
));
103 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::BOTTOM_CENTER
));
105 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::LEFT_CENTER
));
106 EXPECT_TRUE(BubbleBorder::has_arrow(BubbleBorder::RIGHT_CENTER
));
108 EXPECT_FALSE(BubbleBorder::has_arrow(BubbleBorder::NONE
));
109 EXPECT_FALSE(BubbleBorder::has_arrow(BubbleBorder::FLOAT
));
112 TEST_F(BubbleBorderTest
, IsArrowOnLeft
) {
113 EXPECT_TRUE(BubbleBorder::is_arrow_on_left(BubbleBorder::TOP_LEFT
));
114 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::TOP_RIGHT
));
116 EXPECT_TRUE(BubbleBorder::is_arrow_on_left(BubbleBorder::BOTTOM_LEFT
));
117 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::BOTTOM_RIGHT
));
119 EXPECT_TRUE(BubbleBorder::is_arrow_on_left(BubbleBorder::LEFT_TOP
));
120 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::RIGHT_TOP
));
122 EXPECT_TRUE(BubbleBorder::is_arrow_on_left(BubbleBorder::LEFT_BOTTOM
));
123 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::RIGHT_BOTTOM
));
125 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::TOP_CENTER
));
126 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::BOTTOM_CENTER
));
128 EXPECT_TRUE(BubbleBorder::is_arrow_on_left(BubbleBorder::LEFT_CENTER
));
129 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::RIGHT_CENTER
));
131 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::NONE
));
132 EXPECT_FALSE(BubbleBorder::is_arrow_on_left(BubbleBorder::FLOAT
));
135 TEST_F(BubbleBorderTest
, IsArrowOnTop
) {
136 EXPECT_TRUE(BubbleBorder::is_arrow_on_top(BubbleBorder::TOP_LEFT
));
137 EXPECT_TRUE(BubbleBorder::is_arrow_on_top(BubbleBorder::TOP_RIGHT
));
139 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::BOTTOM_LEFT
));
140 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::BOTTOM_RIGHT
));
142 EXPECT_TRUE(BubbleBorder::is_arrow_on_top(BubbleBorder::LEFT_TOP
));
143 EXPECT_TRUE(BubbleBorder::is_arrow_on_top(BubbleBorder::RIGHT_TOP
));
145 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::LEFT_BOTTOM
));
146 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::RIGHT_BOTTOM
));
148 EXPECT_TRUE(BubbleBorder::is_arrow_on_top(BubbleBorder::TOP_CENTER
));
149 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::BOTTOM_CENTER
));
151 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::LEFT_CENTER
));
152 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::RIGHT_CENTER
));
154 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::NONE
));
155 EXPECT_FALSE(BubbleBorder::is_arrow_on_top(BubbleBorder::FLOAT
));
158 TEST_F(BubbleBorderTest
, IsArrowOnHorizontal
) {
159 EXPECT_TRUE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::TOP_LEFT
));
160 EXPECT_TRUE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::TOP_RIGHT
));
162 EXPECT_TRUE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::BOTTOM_LEFT
));
163 EXPECT_TRUE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::BOTTOM_RIGHT
));
165 EXPECT_FALSE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::LEFT_TOP
));
166 EXPECT_FALSE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::RIGHT_TOP
));
168 EXPECT_FALSE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::LEFT_BOTTOM
));
170 BubbleBorder::is_arrow_on_horizontal(BubbleBorder::RIGHT_BOTTOM
));
172 EXPECT_TRUE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::TOP_CENTER
));
174 BubbleBorder::is_arrow_on_horizontal(BubbleBorder::BOTTOM_CENTER
));
176 EXPECT_FALSE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::LEFT_CENTER
));
178 BubbleBorder::is_arrow_on_horizontal(BubbleBorder::RIGHT_CENTER
));
180 EXPECT_FALSE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::NONE
));
181 EXPECT_FALSE(BubbleBorder::is_arrow_on_horizontal(BubbleBorder::FLOAT
));
184 TEST_F(BubbleBorderTest
, IsArrowAtCenter
) {
185 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::TOP_LEFT
));
186 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::TOP_RIGHT
));
188 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::BOTTOM_LEFT
));
189 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::BOTTOM_RIGHT
));
191 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::LEFT_TOP
));
192 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::RIGHT_TOP
));
194 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::LEFT_BOTTOM
));
195 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::RIGHT_BOTTOM
));
197 EXPECT_TRUE(BubbleBorder::is_arrow_at_center(BubbleBorder::TOP_CENTER
));
198 EXPECT_TRUE(BubbleBorder::is_arrow_at_center(BubbleBorder::BOTTOM_CENTER
));
200 EXPECT_TRUE(BubbleBorder::is_arrow_at_center(BubbleBorder::LEFT_CENTER
));
201 EXPECT_TRUE(BubbleBorder::is_arrow_at_center(BubbleBorder::RIGHT_CENTER
));
203 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::NONE
));
204 EXPECT_FALSE(BubbleBorder::is_arrow_at_center(BubbleBorder::FLOAT
));
207 TEST_F(BubbleBorderTest
, GetSizeForContentsSizeTest
) {
208 views::BubbleBorder
border(BubbleBorder::NONE
,
209 BubbleBorder::NO_SHADOW
,
212 const views::internal::BorderImages
* kImages
= border
.GetImagesForTest();
214 // kSmallSize is smaller than the minimum allowable size and does not
215 // contribute to the resulting size.
216 const gfx::Size kSmallSize
= gfx::Size(1, 2);
217 // kMediumSize is larger than the minimum allowable size and contributes to
218 // the resulting size.
219 const gfx::Size kMediumSize
= gfx::Size(50, 60);
221 const gfx::Size
kSmallHorizArrow(
222 2 * kImages
->border_thickness
+ kImages
->top_arrow
.width(),
223 kImages
->border_thickness
+ kImages
->arrow_thickness
+
224 kImages
->border_interior_thickness
);
226 const gfx::Size
kSmallVertArrow(kSmallHorizArrow
.height(),
227 kSmallHorizArrow
.width());
229 const gfx::Size
kSmallNoArrow(2 * kImages
->border_thickness
,
230 2 * kImages
->border_thickness
);
232 const gfx::Size
kMediumHorizArrow(
233 kMediumSize
.width() + 2 * border
.GetBorderThickness(),
234 kMediumSize
.height() + border
.GetBorderThickness() +
235 kImages
->arrow_thickness
);
237 const gfx::Size
kMediumVertArrow(
238 kMediumSize
.width() + border
.GetBorderThickness() +
239 kImages
->arrow_thickness
,
240 kMediumSize
.height() + 2 * border
.GetBorderThickness());
242 const gfx::Size
kMediumNoArrow(
243 kMediumSize
.width() + 2 * border
.GetBorderThickness(),
244 kMediumSize
.height() + 2 * border
.GetBorderThickness());
247 BubbleBorder::Arrow arrow
;
249 gfx::Size expected_with_arrow
;
250 gfx::Size expected_without_arrow
;
254 // Content size: kSmallSize
255 { BubbleBorder::TOP_LEFT
, kSmallSize
, kSmallHorizArrow
, kSmallNoArrow
},
256 { BubbleBorder::TOP_CENTER
, kSmallSize
, kSmallHorizArrow
, kSmallNoArrow
},
257 { BubbleBorder::TOP_RIGHT
, kSmallSize
, kSmallHorizArrow
, kSmallNoArrow
},
258 { BubbleBorder::BOTTOM_LEFT
, kSmallSize
, kSmallHorizArrow
, kSmallNoArrow
},
259 { BubbleBorder::BOTTOM_CENTER
, kSmallSize
, kSmallHorizArrow
,
261 { BubbleBorder::BOTTOM_RIGHT
, kSmallSize
, kSmallHorizArrow
, kSmallNoArrow
},
262 { BubbleBorder::LEFT_TOP
, kSmallSize
, kSmallVertArrow
, kSmallNoArrow
},
263 { BubbleBorder::LEFT_CENTER
, kSmallSize
, kSmallVertArrow
, kSmallNoArrow
},
264 { BubbleBorder::LEFT_BOTTOM
, kSmallSize
, kSmallVertArrow
, kSmallNoArrow
},
265 { BubbleBorder::RIGHT_TOP
, kSmallSize
, kSmallVertArrow
, kSmallNoArrow
},
266 { BubbleBorder::RIGHT_CENTER
, kSmallSize
, kSmallVertArrow
, kSmallNoArrow
},
267 { BubbleBorder::RIGHT_BOTTOM
, kSmallSize
, kSmallVertArrow
, kSmallNoArrow
},
268 { BubbleBorder::NONE
, kSmallSize
, kSmallNoArrow
, kSmallNoArrow
},
269 { BubbleBorder::FLOAT
, kSmallSize
, kSmallNoArrow
, kSmallNoArrow
},
271 // Content size: kMediumSize
272 { BubbleBorder::TOP_LEFT
, kMediumSize
, kMediumHorizArrow
, kMediumNoArrow
},
273 { BubbleBorder::TOP_CENTER
, kMediumSize
, kMediumHorizArrow
,
275 { BubbleBorder::TOP_RIGHT
, kMediumSize
, kMediumHorizArrow
, kMediumNoArrow
},
276 { BubbleBorder::BOTTOM_LEFT
, kMediumSize
, kMediumHorizArrow
,
278 { BubbleBorder::BOTTOM_CENTER
, kMediumSize
, kMediumHorizArrow
,
280 { BubbleBorder::BOTTOM_RIGHT
, kMediumSize
, kMediumHorizArrow
,
282 { BubbleBorder::LEFT_TOP
, kMediumSize
, kMediumVertArrow
, kMediumNoArrow
},
283 { BubbleBorder::LEFT_CENTER
, kMediumSize
, kMediumVertArrow
,
285 { BubbleBorder::LEFT_BOTTOM
, kMediumSize
, kMediumVertArrow
,
287 { BubbleBorder::RIGHT_TOP
, kMediumSize
, kMediumVertArrow
, kMediumNoArrow
},
288 { BubbleBorder::RIGHT_CENTER
, kMediumSize
, kMediumVertArrow
,
290 { BubbleBorder::RIGHT_BOTTOM
, kMediumSize
, kMediumVertArrow
,
292 { BubbleBorder::NONE
, kMediumSize
, kMediumNoArrow
, kMediumNoArrow
},
293 { BubbleBorder::FLOAT
, kMediumSize
, kMediumNoArrow
, kMediumNoArrow
}
296 for (size_t i
= 0; i
< arraysize(cases
); ++i
) {
297 SCOPED_TRACE(base::StringPrintf("i=%d arrow=%d",
298 static_cast<int>(i
), cases
[i
].arrow
));
300 border
.set_arrow(cases
[i
].arrow
);
302 border
.set_paint_arrow(BubbleBorder::PAINT_NORMAL
);
303 EXPECT_EQ(cases
[i
].expected_with_arrow
,
304 border
.GetSizeForContentsSize(cases
[i
].content
));
306 border
.set_paint_arrow(BubbleBorder::PAINT_TRANSPARENT
);
307 EXPECT_EQ(cases
[i
].expected_with_arrow
,
308 border
.GetSizeForContentsSize(cases
[i
].content
));
310 border
.set_paint_arrow(BubbleBorder::PAINT_NONE
);
311 EXPECT_EQ(cases
[i
].expected_without_arrow
,
312 border
.GetSizeForContentsSize(cases
[i
].content
));
316 TEST_F(BubbleBorderTest
, GetBoundsOriginTest
) {
317 views::BubbleBorder
border(BubbleBorder::TOP_LEFT
,
318 BubbleBorder::NO_SHADOW
,
321 const gfx::Rect
kAnchor(100, 100, 20, 30);
322 const gfx::Size
kContentSize(50, 60);
324 const views::internal::BorderImages
* kImages
= border
.GetImagesForTest();
326 border
.set_arrow(BubbleBorder::TOP_LEFT
);
327 const gfx::Size kTotalSizeWithHorizArrow
=
328 border
.GetSizeForContentsSize(kContentSize
);
330 border
.set_arrow(BubbleBorder::RIGHT_BOTTOM
);
331 const gfx::Size kTotalSizeWithVertArrow
=
332 border
.GetSizeForContentsSize(kContentSize
);
334 border
.set_arrow(BubbleBorder::NONE
);
335 const gfx::Size kTotalSizeWithNoArrow
=
336 border
.GetSizeForContentsSize(kContentSize
);
338 const int kBorderThickness
= border
.GetBorderThickness();
340 const int kArrowOffsetForHorizCenter
= kTotalSizeWithHorizArrow
.width() / 2;
341 const int kArrowOffsetForVertCenter
= kTotalSizeWithVertArrow
.height() / 2;
342 const int kArrowOffsetForNotCenter
=
343 kImages
->border_thickness
+ (kImages
->top_arrow
.width() / 2);
345 const int kArrowSize
=
346 kImages
->arrow_interior_thickness
+ BubbleBorder::kStroke
-
347 kImages
->arrow_thickness
;
349 const int kTopHorizArrowY
= kAnchor
.y() + kAnchor
.height() + kArrowSize
;
350 const int kBottomHorizArrowY
=
351 kAnchor
.y() - kArrowSize
- kTotalSizeWithHorizArrow
.height();
353 const int kLeftVertArrowX
= kAnchor
.x() + kAnchor
.width() + kArrowSize
;
354 const int kRightVertArrowX
=
355 kAnchor
.x() - kArrowSize
- kTotalSizeWithVertArrow
.width();
358 BubbleBorder::Arrow arrow
;
359 BubbleBorder::BubbleAlignment alignment
;
365 // Horizontal arrow tests.
366 { BubbleBorder::TOP_LEFT
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
367 kAnchor
.CenterPoint().x() - kArrowOffsetForNotCenter
, kTopHorizArrowY
},
368 { BubbleBorder::TOP_LEFT
, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE
,
369 kAnchor
.x() + BubbleBorder::kStroke
- kBorderThickness
, kTopHorizArrowY
},
370 { BubbleBorder::TOP_CENTER
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
371 kAnchor
.CenterPoint().x() - kArrowOffsetForHorizCenter
, kTopHorizArrowY
},
372 { BubbleBorder::BOTTOM_RIGHT
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
373 kAnchor
.CenterPoint().x() + kArrowOffsetForNotCenter
-
374 kTotalSizeWithHorizArrow
.width(), kBottomHorizArrowY
},
375 { BubbleBorder::BOTTOM_RIGHT
, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE
,
376 kAnchor
.x() + kAnchor
.width() - kTotalSizeWithHorizArrow
.width() +
377 kBorderThickness
- BubbleBorder::kStroke
, kBottomHorizArrowY
},
379 // Vertical arrow tests.
380 { BubbleBorder::LEFT_TOP
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
381 kLeftVertArrowX
, kAnchor
.CenterPoint().y() - kArrowOffsetForNotCenter
},
382 { BubbleBorder::LEFT_TOP
, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE
,
383 kLeftVertArrowX
, kAnchor
.y() + BubbleBorder::kStroke
- kBorderThickness
},
384 { BubbleBorder::LEFT_CENTER
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
385 kLeftVertArrowX
, kAnchor
.CenterPoint().y() - kArrowOffsetForVertCenter
},
386 { BubbleBorder::RIGHT_BOTTOM
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
387 kRightVertArrowX
, kAnchor
.CenterPoint().y() + kArrowOffsetForNotCenter
-
388 kTotalSizeWithVertArrow
.height() },
389 { BubbleBorder::RIGHT_BOTTOM
, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE
,
390 kRightVertArrowX
, kAnchor
.y() + kAnchor
.height() -
391 kTotalSizeWithVertArrow
.height() + kBorderThickness
-
392 BubbleBorder::kStroke
},
395 { BubbleBorder::NONE
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
396 kAnchor
.x() + (kAnchor
.width() - kTotalSizeWithNoArrow
.width()) / 2,
397 kAnchor
.y() + kAnchor
.height() },
398 { BubbleBorder::FLOAT
, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR
,
399 kAnchor
.x() + (kAnchor
.width() - kTotalSizeWithNoArrow
.width()) / 2,
400 kAnchor
.y() + (kAnchor
.height() - kTotalSizeWithNoArrow
.height()) / 2 },
403 for (size_t i
= 0; i
< arraysize(cases
); ++i
) {
404 SCOPED_TRACE(base::StringPrintf("i=%d arrow=%d alignment=%d",
405 static_cast<int>(i
), cases
[i
].arrow
, cases
[i
].alignment
));
406 border
.set_arrow(cases
[i
].arrow
);
407 border
.set_alignment(cases
[i
].alignment
);
409 gfx::Point origin
= border
.GetBounds(kAnchor
, kContentSize
).origin();
410 EXPECT_EQ(cases
[i
].expected_x
, origin
.x());
411 EXPECT_EQ(cases
[i
].expected_y
, origin
.y());