Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: ui/gfx/rect_unittest.cc

Issue 109433013: Move geometric types to a separate, more lightweight target. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "testing/gtest/include/gtest/gtest.h"
7 #include "ui/gfx/rect.h"
8 #include "ui/gfx/rect_conversions.h"
9 #include "ui/gfx/skia_util.h"
10
11 #include <limits>
12
13 namespace gfx {
14
15 TEST(RectTest, Contains) {
16 static const struct ContainsCase {
17 int rect_x;
18 int rect_y;
19 int rect_width;
20 int rect_height;
21 int point_x;
22 int point_y;
23 bool contained;
24 } contains_cases[] = {
25 {0, 0, 10, 10, 0, 0, true},
26 {0, 0, 10, 10, 5, 5, true},
27 {0, 0, 10, 10, 9, 9, true},
28 {0, 0, 10, 10, 5, 10, false},
29 {0, 0, 10, 10, 10, 5, false},
30 {0, 0, 10, 10, -1, -1, false},
31 {0, 0, 10, 10, 50, 50, false},
32 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
33 {0, 0, -10, -10, 0, 0, false},
34 #endif
35 };
36 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(contains_cases); ++i) {
37 const ContainsCase& value = contains_cases[i];
38 Rect rect(value.rect_x, value.rect_y, value.rect_width, value.rect_height);
39 EXPECT_EQ(value.contained, rect.Contains(value.point_x, value.point_y));
40 }
41 }
42
43 TEST(RectTest, Intersects) {
44 static const struct {
45 int x1; // rect 1
46 int y1;
47 int w1;
48 int h1;
49 int x2; // rect 2
50 int y2;
51 int w2;
52 int h2;
53 bool intersects;
54 } tests[] = {
55 { 0, 0, 0, 0, 0, 0, 0, 0, false },
56 { 0, 0, 0, 0, -10, -10, 20, 20, false },
57 { -10, 0, 0, 20, 0, -10, 20, 0, false },
58 { 0, 0, 10, 10, 0, 0, 10, 10, true },
59 { 0, 0, 10, 10, 10, 10, 10, 10, false },
60 { 10, 10, 10, 10, 0, 0, 10, 10, false },
61 { 10, 10, 10, 10, 5, 5, 10, 10, true },
62 { 10, 10, 10, 10, 15, 15, 10, 10, true },
63 { 10, 10, 10, 10, 20, 15, 10, 10, false },
64 { 10, 10, 10, 10, 21, 15, 10, 10, false }
65 };
66 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
67 Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
68 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
69 EXPECT_EQ(tests[i].intersects, r1.Intersects(r2));
70 EXPECT_EQ(tests[i].intersects, r2.Intersects(r1));
71 }
72 }
73
74 TEST(RectTest, Intersect) {
75 static const struct {
76 int x1; // rect 1
77 int y1;
78 int w1;
79 int h1;
80 int x2; // rect 2
81 int y2;
82 int w2;
83 int h2;
84 int x3; // rect 3: the union of rects 1 and 2
85 int y3;
86 int w3;
87 int h3;
88 } tests[] = {
89 { 0, 0, 0, 0, // zeros
90 0, 0, 0, 0,
91 0, 0, 0, 0 },
92 { 0, 0, 4, 4, // equal
93 0, 0, 4, 4,
94 0, 0, 4, 4 },
95 { 0, 0, 4, 4, // neighboring
96 4, 4, 4, 4,
97 0, 0, 0, 0 },
98 { 0, 0, 4, 4, // overlapping corners
99 2, 2, 4, 4,
100 2, 2, 2, 2 },
101 { 0, 0, 4, 4, // T junction
102 3, 1, 4, 2,
103 3, 1, 1, 2 },
104 { 3, 0, 2, 2, // gap
105 0, 0, 2, 2,
106 0, 0, 0, 0 }
107 };
108 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
109 Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
110 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
111 Rect r3(tests[i].x3, tests[i].y3, tests[i].w3, tests[i].h3);
112 Rect ir = IntersectRects(r1, r2);
113 EXPECT_EQ(r3.x(), ir.x());
114 EXPECT_EQ(r3.y(), ir.y());
115 EXPECT_EQ(r3.width(), ir.width());
116 EXPECT_EQ(r3.height(), ir.height());
117 }
118 }
119
120 TEST(RectTest, Union) {
121 static const struct Test {
122 int x1; // rect 1
123 int y1;
124 int w1;
125 int h1;
126 int x2; // rect 2
127 int y2;
128 int w2;
129 int h2;
130 int x3; // rect 3: the union of rects 1 and 2
131 int y3;
132 int w3;
133 int h3;
134 } tests[] = {
135 { 0, 0, 0, 0,
136 0, 0, 0, 0,
137 0, 0, 0, 0 },
138 { 0, 0, 4, 4,
139 0, 0, 4, 4,
140 0, 0, 4, 4 },
141 { 0, 0, 4, 4,
142 4, 4, 4, 4,
143 0, 0, 8, 8 },
144 { 0, 0, 4, 4,
145 0, 5, 4, 4,
146 0, 0, 4, 9 },
147 { 0, 0, 2, 2,
148 3, 3, 2, 2,
149 0, 0, 5, 5 },
150 { 3, 3, 2, 2, // reverse r1 and r2 from previous test
151 0, 0, 2, 2,
152 0, 0, 5, 5 },
153 { 0, 0, 0, 0, // union with empty rect
154 2, 2, 2, 2,
155 2, 2, 2, 2 }
156 };
157 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
158 Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
159 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
160 Rect r3(tests[i].x3, tests[i].y3, tests[i].w3, tests[i].h3);
161 Rect u = UnionRects(r1, r2);
162 EXPECT_EQ(r3.x(), u.x());
163 EXPECT_EQ(r3.y(), u.y());
164 EXPECT_EQ(r3.width(), u.width());
165 EXPECT_EQ(r3.height(), u.height());
166 }
167 }
168
169 TEST(RectTest, Equals) {
170 ASSERT_TRUE(Rect(0, 0, 0, 0) == Rect(0, 0, 0, 0));
171 ASSERT_TRUE(Rect(1, 2, 3, 4) == Rect(1, 2, 3, 4));
172 ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(0, 0, 0, 1));
173 ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(0, 0, 1, 0));
174 ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(0, 1, 0, 0));
175 ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(1, 0, 0, 0));
176 }
177
178 TEST(RectTest, AdjustToFit) {
179 static const struct Test {
180 int x1; // source
181 int y1;
182 int w1;
183 int h1;
184 int x2; // target
185 int y2;
186 int w2;
187 int h2;
188 int x3; // rect 3: results of invoking AdjustToFit
189 int y3;
190 int w3;
191 int h3;
192 } tests[] = {
193 { 0, 0, 2, 2,
194 0, 0, 2, 2,
195 0, 0, 2, 2 },
196 { 2, 2, 3, 3,
197 0, 0, 4, 4,
198 1, 1, 3, 3 },
199 { -1, -1, 5, 5,
200 0, 0, 4, 4,
201 0, 0, 4, 4 },
202 { 2, 2, 4, 4,
203 0, 0, 3, 3,
204 0, 0, 3, 3 },
205 { 2, 2, 1, 1,
206 0, 0, 3, 3,
207 2, 2, 1, 1 }
208 };
209 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
210 Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
211 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
212 Rect r3(tests[i].x3, tests[i].y3, tests[i].w3, tests[i].h3);
213 Rect u = r1;
214 u.AdjustToFit(r2);
215 EXPECT_EQ(r3.x(), u.x());
216 EXPECT_EQ(r3.y(), u.y());
217 EXPECT_EQ(r3.width(), u.width());
218 EXPECT_EQ(r3.height(), u.height());
219 }
220 }
221
222 TEST(RectTest, Subtract) {
223 Rect result;
224
225 // Matching
226 result = Rect(10, 10, 20, 20);
227 result.Subtract(Rect(10, 10, 20, 20));
228 EXPECT_EQ(Rect(0, 0, 0, 0).ToString(), result.ToString());
229
230 // Contains
231 result = Rect(10, 10, 20, 20);
232 result.Subtract(Rect(5, 5, 30, 30));
233 EXPECT_EQ(Rect(0, 0, 0, 0).ToString(), result.ToString());
234
235 // No intersection
236 result = Rect(10, 10, 20, 20);
237 result.Subtract(Rect(30, 30, 30, 30));
238 EXPECT_EQ(Rect(10, 10, 20, 20).ToString(), result.ToString());
239
240 // Not a complete intersection in either direction
241 result = Rect(10, 10, 20, 20);
242 result.Subtract(Rect(15, 15, 20, 20));
243 EXPECT_EQ(Rect(10, 10, 20, 20).ToString(), result.ToString());
244
245 // Complete intersection in the x-direction, top edge is fully covered.
246 result = Rect(10, 10, 20, 20);
247 result.Subtract(Rect(10, 15, 20, 20));
248 EXPECT_EQ(Rect(10, 10, 20, 5).ToString(), result.ToString());
249
250 // Complete intersection in the x-direction, top edge is fully covered.
251 result = Rect(10, 10, 20, 20);
252 result.Subtract(Rect(5, 15, 30, 20));
253 EXPECT_EQ(Rect(10, 10, 20, 5).ToString(), result.ToString());
254
255 // Complete intersection in the x-direction, bottom edge is fully covered.
256 result = Rect(10, 10, 20, 20);
257 result.Subtract(Rect(5, 5, 30, 20));
258 EXPECT_EQ(Rect(10, 25, 20, 5).ToString(), result.ToString());
259
260 // Complete intersection in the x-direction, none of the edges is fully
261 // covered.
262 result = Rect(10, 10, 20, 20);
263 result.Subtract(Rect(5, 15, 30, 1));
264 EXPECT_EQ(Rect(10, 10, 20, 20).ToString(), result.ToString());
265
266 // Complete intersection in the y-direction, left edge is fully covered.
267 result = Rect(10, 10, 20, 20);
268 result.Subtract(Rect(10, 10, 10, 30));
269 EXPECT_EQ(Rect(20, 10, 10, 20).ToString(), result.ToString());
270
271 // Complete intersection in the y-direction, left edge is fully covered.
272 result = Rect(10, 10, 20, 20);
273 result.Subtract(Rect(5, 5, 20, 30));
274 EXPECT_EQ(Rect(25, 10, 5, 20).ToString(), result.ToString());
275
276 // Complete intersection in the y-direction, right edge is fully covered.
277 result = Rect(10, 10, 20, 20);
278 result.Subtract(Rect(20, 5, 20, 30));
279 EXPECT_EQ(Rect(10, 10, 10, 20).ToString(), result.ToString());
280
281 // Complete intersection in the y-direction, none of the edges is fully
282 // covered.
283 result = Rect(10, 10, 20, 20);
284 result.Subtract(Rect(15, 5, 1, 30));
285 EXPECT_EQ(Rect(10, 10, 20, 20).ToString(), result.ToString());
286 }
287
288 TEST(RectTest, IsEmpty) {
289 EXPECT_TRUE(Rect(0, 0, 0, 0).IsEmpty());
290 EXPECT_TRUE(Rect(0, 0, 0, 0).size().IsEmpty());
291 EXPECT_TRUE(Rect(0, 0, 10, 0).IsEmpty());
292 EXPECT_TRUE(Rect(0, 0, 10, 0).size().IsEmpty());
293 EXPECT_TRUE(Rect(0, 0, 0, 10).IsEmpty());
294 EXPECT_TRUE(Rect(0, 0, 0, 10).size().IsEmpty());
295 EXPECT_FALSE(Rect(0, 0, 10, 10).IsEmpty());
296 EXPECT_FALSE(Rect(0, 0, 10, 10).size().IsEmpty());
297 }
298
299 TEST(RectTest, SplitVertically) {
300 Rect left_half, right_half;
301
302 // Splitting when origin is (0, 0).
303 Rect(0, 0, 20, 20).SplitVertically(&left_half, &right_half);
304 EXPECT_TRUE(left_half == Rect(0, 0, 10, 20));
305 EXPECT_TRUE(right_half == Rect(10, 0, 10, 20));
306
307 // Splitting when origin is arbitrary.
308 Rect(10, 10, 20, 10).SplitVertically(&left_half, &right_half);
309 EXPECT_TRUE(left_half == Rect(10, 10, 10, 10));
310 EXPECT_TRUE(right_half == Rect(20, 10, 10, 10));
311
312 // Splitting a rectangle of zero width.
313 Rect(10, 10, 0, 10).SplitVertically(&left_half, &right_half);
314 EXPECT_TRUE(left_half == Rect(10, 10, 0, 10));
315 EXPECT_TRUE(right_half == Rect(10, 10, 0, 10));
316
317 // Splitting a rectangle of odd width.
318 Rect(10, 10, 5, 10).SplitVertically(&left_half, &right_half);
319 EXPECT_TRUE(left_half == Rect(10, 10, 2, 10));
320 EXPECT_TRUE(right_half == Rect(12, 10, 3, 10));
321 }
322
323 TEST(RectTest, CenterPoint) {
324 Point center;
325
326 // When origin is (0, 0).
327 center = Rect(0, 0, 20, 20).CenterPoint();
328 EXPECT_TRUE(center == Point(10, 10));
329
330 // When origin is even.
331 center = Rect(10, 10, 20, 20).CenterPoint();
332 EXPECT_TRUE(center == Point(20, 20));
333
334 // When origin is odd.
335 center = Rect(11, 11, 20, 20).CenterPoint();
336 EXPECT_TRUE(center == Point(21, 21));
337
338 // When 0 width or height.
339 center = Rect(10, 10, 0, 20).CenterPoint();
340 EXPECT_TRUE(center == Point(10, 20));
341 center = Rect(10, 10, 20, 0).CenterPoint();
342 EXPECT_TRUE(center == Point(20, 10));
343
344 // When an odd size.
345 center = Rect(10, 10, 21, 21).CenterPoint();
346 EXPECT_TRUE(center == Point(20, 20));
347
348 // When an odd size and position.
349 center = Rect(11, 11, 21, 21).CenterPoint();
350 EXPECT_TRUE(center == Point(21, 21));
351 }
352
353 TEST(RectTest, CenterPointF) {
354 PointF center;
355
356 // When origin is (0, 0).
357 center = RectF(0, 0, 20, 20).CenterPoint();
358 EXPECT_TRUE(center == PointF(10, 10));
359
360 // When origin is even.
361 center = RectF(10, 10, 20, 20).CenterPoint();
362 EXPECT_TRUE(center == PointF(20, 20));
363
364 // When origin is odd.
365 center = RectF(11, 11, 20, 20).CenterPoint();
366 EXPECT_TRUE(center == PointF(21, 21));
367
368 // When 0 width or height.
369 center = RectF(10, 10, 0, 20).CenterPoint();
370 EXPECT_TRUE(center == PointF(10, 20));
371 center = RectF(10, 10, 20, 0).CenterPoint();
372 EXPECT_TRUE(center == PointF(20, 10));
373
374 // When an odd size.
375 center = RectF(10, 10, 21, 21).CenterPoint();
376 EXPECT_TRUE(center == PointF(20.5f, 20.5f));
377
378 // When an odd size and position.
379 center = RectF(11, 11, 21, 21).CenterPoint();
380 EXPECT_TRUE(center == PointF(21.5f, 21.5f));
381 }
382
383 TEST(RectTest, SharesEdgeWith) {
384 Rect r(2, 3, 4, 5);
385
386 // Must be non-overlapping
387 EXPECT_FALSE(r.SharesEdgeWith(r));
388
389 Rect just_above(2, 1, 4, 2);
390 Rect just_below(2, 8, 4, 2);
391 Rect just_left(0, 3, 2, 5);
392 Rect just_right(6, 3, 2, 5);
393
394 EXPECT_TRUE(r.SharesEdgeWith(just_above));
395 EXPECT_TRUE(r.SharesEdgeWith(just_below));
396 EXPECT_TRUE(r.SharesEdgeWith(just_left));
397 EXPECT_TRUE(r.SharesEdgeWith(just_right));
398
399 // Wrong placement
400 Rect same_height_no_edge(0, 0, 1, 5);
401 Rect same_width_no_edge(0, 0, 4, 1);
402
403 EXPECT_FALSE(r.SharesEdgeWith(same_height_no_edge));
404 EXPECT_FALSE(r.SharesEdgeWith(same_width_no_edge));
405
406 Rect just_above_no_edge(2, 1, 5, 2); // too wide
407 Rect just_below_no_edge(2, 8, 3, 2); // too narrow
408 Rect just_left_no_edge(0, 3, 2, 6); // too tall
409 Rect just_right_no_edge(6, 3, 2, 4); // too short
410
411 EXPECT_FALSE(r.SharesEdgeWith(just_above_no_edge));
412 EXPECT_FALSE(r.SharesEdgeWith(just_below_no_edge));
413 EXPECT_FALSE(r.SharesEdgeWith(just_left_no_edge));
414 EXPECT_FALSE(r.SharesEdgeWith(just_right_no_edge));
415 }
416
417 TEST(RectTest, SkiaRectConversions) {
418 Rect isrc(10, 20, 30, 40);
419 RectF fsrc(10.5f, 20.5f, 30.5f, 40.5f);
420
421 SkIRect skirect = RectToSkIRect(isrc);
422 EXPECT_EQ(isrc.ToString(), SkIRectToRect(skirect).ToString());
423
424 SkRect skrect = RectToSkRect(isrc);
425 EXPECT_EQ(gfx::RectF(isrc).ToString(), SkRectToRectF(skrect).ToString());
426
427 skrect = RectFToSkRect(fsrc);
428 EXPECT_EQ(fsrc.ToString(), SkRectToRectF(skrect).ToString());
429 }
430
431 // Similar to EXPECT_FLOAT_EQ, but lets NaN equal NaN
432 #define EXPECT_FLOAT_AND_NAN_EQ(a, b) \
433 { if (a == a || b == b) { EXPECT_FLOAT_EQ(a, b); } }
434
435 TEST(RectTest, ScaleRect) {
436 static const struct Test {
437 int x1; // source
438 int y1;
439 int w1;
440 int h1;
441 float scale;
442 float x2; // target
443 float y2;
444 float w2;
445 float h2;
446 } tests[] = {
447 { 3, 3, 3, 3,
448 1.5f,
449 4.5f, 4.5f, 4.5f, 4.5f },
450 { 3, 3, 3, 3,
451 0.0f,
452 0.0f, 0.0f, 0.0f, 0.0f },
453 { 3, 3, 3, 3,
454 std::numeric_limits<float>::quiet_NaN(),
455 std::numeric_limits<float>::quiet_NaN(),
456 std::numeric_limits<float>::quiet_NaN(),
457 std::numeric_limits<float>::quiet_NaN(),
458 std::numeric_limits<float>::quiet_NaN() },
459 { 3, 3, 3, 3,
460 std::numeric_limits<float>::max(),
461 std::numeric_limits<float>::max(),
462 std::numeric_limits<float>::max(),
463 std::numeric_limits<float>::max(),
464 std::numeric_limits<float>::max() }
465 };
466
467 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
468 Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
469 RectF r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
470
471 RectF scaled = ScaleRect(r1, tests[i].scale);
472 EXPECT_FLOAT_AND_NAN_EQ(r2.x(), scaled.x());
473 EXPECT_FLOAT_AND_NAN_EQ(r2.y(), scaled.y());
474 EXPECT_FLOAT_AND_NAN_EQ(r2.width(), scaled.width());
475 EXPECT_FLOAT_AND_NAN_EQ(r2.height(), scaled.height());
476 }
477 }
478
479 TEST(RectTest, ToEnclosedRect) {
480 static const struct Test {
481 float x1; // source
482 float y1;
483 float w1;
484 float h1;
485 int x2; // target
486 int y2;
487 int w2;
488 int h2;
489 } tests [] = {
490 { 0.0f, 0.0f, 0.0f, 0.0f,
491 0, 0, 0, 0 },
492 { -1.5f, -1.5f, 3.0f, 3.0f,
493 -1, -1, 2, 2 },
494 { -1.5f, -1.5f, 3.5f, 3.5f,
495 -1, -1, 3, 3 },
496 { std::numeric_limits<float>::max(),
497 std::numeric_limits<float>::max(),
498 2.0f, 2.0f,
499 std::numeric_limits<int>::max(),
500 std::numeric_limits<int>::max(),
501 0, 0 },
502 { 0.0f, 0.0f,
503 std::numeric_limits<float>::max(),
504 std::numeric_limits<float>::max(),
505 0, 0,
506 std::numeric_limits<int>::max(),
507 std::numeric_limits<int>::max() },
508 { 20000.5f, 20000.5f, 0.5f, 0.5f,
509 20001, 20001, 0, 0 },
510 { std::numeric_limits<float>::quiet_NaN(),
511 std::numeric_limits<float>::quiet_NaN(),
512 std::numeric_limits<float>::quiet_NaN(),
513 std::numeric_limits<float>::quiet_NaN(),
514 0, 0, 0, 0 }
515 };
516
517 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
518 RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
519 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
520
521 Rect enclosed = ToEnclosedRect(r1);
522 EXPECT_FLOAT_AND_NAN_EQ(r2.x(), enclosed.x());
523 EXPECT_FLOAT_AND_NAN_EQ(r2.y(), enclosed.y());
524 EXPECT_FLOAT_AND_NAN_EQ(r2.width(), enclosed.width());
525 EXPECT_FLOAT_AND_NAN_EQ(r2.height(), enclosed.height());
526 }
527 }
528
529 TEST(RectTest, ToEnclosingRect) {
530 static const struct Test {
531 float x1; // source
532 float y1;
533 float w1;
534 float h1;
535 int x2; // target
536 int y2;
537 int w2;
538 int h2;
539 } tests [] = {
540 { 0.0f, 0.0f, 0.0f, 0.0f,
541 0, 0, 0, 0 },
542 { 5.5f, 5.5f, 0.0f, 0.0f,
543 5, 5, 0, 0 },
544 { -1.5f, -1.5f, 3.0f, 3.0f,
545 -2, -2, 4, 4 },
546 { -1.5f, -1.5f, 3.5f, 3.5f,
547 -2, -2, 4, 4 },
548 { std::numeric_limits<float>::max(),
549 std::numeric_limits<float>::max(),
550 2.0f, 2.0f,
551 std::numeric_limits<int>::max(),
552 std::numeric_limits<int>::max(),
553 0, 0 },
554 { 0.0f, 0.0f,
555 std::numeric_limits<float>::max(),
556 std::numeric_limits<float>::max(),
557 0, 0,
558 std::numeric_limits<int>::max(),
559 std::numeric_limits<int>::max() },
560 { 20000.5f, 20000.5f, 0.5f, 0.5f,
561 20000, 20000, 1, 1 },
562 { std::numeric_limits<float>::quiet_NaN(),
563 std::numeric_limits<float>::quiet_NaN(),
564 std::numeric_limits<float>::quiet_NaN(),
565 std::numeric_limits<float>::quiet_NaN(),
566 0, 0, 0, 0 }
567 };
568
569 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
570 RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
571 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
572
573 Rect enclosed = ToEnclosingRect(r1);
574 EXPECT_FLOAT_AND_NAN_EQ(r2.x(), enclosed.x());
575 EXPECT_FLOAT_AND_NAN_EQ(r2.y(), enclosed.y());
576 EXPECT_FLOAT_AND_NAN_EQ(r2.width(), enclosed.width());
577 EXPECT_FLOAT_AND_NAN_EQ(r2.height(), enclosed.height());
578 }
579 }
580
581 TEST(RectTest, ToNearestRect) {
582 Rect rect;
583 EXPECT_EQ(rect.ToString(), ToNearestRect(RectF(rect)).ToString());
584
585 rect = Rect(-1, -1, 3, 3);
586 EXPECT_EQ(rect.ToString(), ToNearestRect(RectF(rect)).ToString());
587
588 RectF rectf(-1.00001f, -0.999999f, 3.0000001f, 2.999999f);
589 EXPECT_EQ(rect.ToString(), ToNearestRect(rectf).ToString());
590 }
591
592 TEST(RectTest, ToFlooredRect) {
593 static const struct Test {
594 float x1; // source
595 float y1;
596 float w1;
597 float h1;
598 int x2; // target
599 int y2;
600 int w2;
601 int h2;
602 } tests [] = {
603 { 0.0f, 0.0f, 0.0f, 0.0f,
604 0, 0, 0, 0 },
605 { -1.5f, -1.5f, 3.0f, 3.0f,
606 -2, -2, 3, 3 },
607 { -1.5f, -1.5f, 3.5f, 3.5f,
608 -2, -2, 3, 3 },
609 { 20000.5f, 20000.5f, 0.5f, 0.5f,
610 20000, 20000, 0, 0 },
611 };
612
613 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
614 RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
615 Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
616
617 Rect floored = ToFlooredRectDeprecated(r1);
618 EXPECT_FLOAT_EQ(r2.x(), floored.x());
619 EXPECT_FLOAT_EQ(r2.y(), floored.y());
620 EXPECT_FLOAT_EQ(r2.width(), floored.width());
621 EXPECT_FLOAT_EQ(r2.height(), floored.height());
622 }
623 }
624
625 TEST(RectTest, ScaleToEnclosedRect) {
626 static const struct Test {
627 Rect input_rect;
628 float input_scale;
629 Rect expected_rect;
630 } tests[] = {
631 {
632 Rect(),
633 5.f,
634 Rect(),
635 }, {
636 Rect(1, 1, 1, 1),
637 5.f,
638 Rect(5, 5, 5, 5),
639 }, {
640 Rect(-1, -1, 0, 0),
641 5.f,
642 Rect(-5, -5, 0, 0),
643 }, {
644 Rect(1, -1, 0, 1),
645 5.f,
646 Rect(5, -5, 0, 5),
647 }, {
648 Rect(-1, 1, 1, 0),
649 5.f,
650 Rect(-5, 5, 5, 0),
651 }, {
652 Rect(1, 2, 3, 4),
653 1.5f,
654 Rect(2, 3, 4, 6),
655 }, {
656 Rect(-1, -2, 0, 0),
657 1.5f,
658 Rect(-1, -3, 0, 0),
659 }
660 };
661
662 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
663 Rect result = ScaleToEnclosedRect(tests[i].input_rect,
664 tests[i].input_scale);
665 EXPECT_EQ(tests[i].expected_rect.ToString(), result.ToString());
666 }
667 }
668
669 TEST(RectTest, ScaleToEnclosingRect) {
670 static const struct Test {
671 Rect input_rect;
672 float input_scale;
673 Rect expected_rect;
674 } tests[] = {
675 {
676 Rect(),
677 5.f,
678 Rect(),
679 }, {
680 Rect(1, 1, 1, 1),
681 5.f,
682 Rect(5, 5, 5, 5),
683 }, {
684 Rect(-1, -1, 0, 0),
685 5.f,
686 Rect(-5, -5, 0, 0),
687 }, {
688 Rect(1, -1, 0, 1),
689 5.f,
690 Rect(5, -5, 0, 5),
691 }, {
692 Rect(-1, 1, 1, 0),
693 5.f,
694 Rect(-5, 5, 5, 0),
695 }, {
696 Rect(1, 2, 3, 4),
697 1.5f,
698 Rect(1, 3, 5, 6),
699 }, {
700 Rect(-1, -2, 0, 0),
701 1.5f,
702 Rect(-2, -3, 0, 0),
703 }
704 };
705
706 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
707 Rect result = ScaleToEnclosingRect(tests[i].input_rect,
708 tests[i].input_scale);
709 EXPECT_EQ(tests[i].expected_rect.ToString(), result.ToString());
710 }
711 }
712
713 #if defined(OS_WIN)
714 TEST(RectTest, ConstructAndAssign) {
715 const RECT rect_1 = { 0, 0, 10, 10 };
716 const RECT rect_2 = { 0, 0, -10, -10 };
717 Rect test1(rect_1);
718 Rect test2(rect_2);
719 }
720 #endif
721
722 TEST(RectTest, ToRectF) {
723 // Check that implicit conversion from integer to float compiles.
724 Rect a(10, 20, 30, 40);
725 RectF b(10, 20, 30, 40);
726
727 RectF intersect = IntersectRects(a, b);
728 EXPECT_EQ(b.ToString(), intersect.ToString());
729
730 EXPECT_EQ(a, b);
731 EXPECT_EQ(b, a);
732 }
733
734 TEST(RectTest, BoundingRect) {
735 struct {
736 Point a;
737 Point b;
738 Rect expected;
739 } int_tests[] = {
740 // If point B dominates A, then A should be the origin.
741 { Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0) },
742 { Point(4, 6), Point(8, 6), Rect(4, 6, 4, 0) },
743 { Point(4, 6), Point(4, 9), Rect(4, 6, 0, 3) },
744 { Point(4, 6), Point(8, 9), Rect(4, 6, 4, 3) },
745 // If point A dominates B, then B should be the origin.
746 { Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0) },
747 { Point(8, 6), Point(4, 6), Rect(4, 6, 4, 0) },
748 { Point(4, 9), Point(4, 6), Rect(4, 6, 0, 3) },
749 { Point(8, 9), Point(4, 6), Rect(4, 6, 4, 3) },
750 // If neither point dominates, then the origin is a combination of the two.
751 { Point(4, 6), Point(6, 4), Rect(4, 4, 2, 2) },
752 { Point(-4, -6), Point(-6, -4), Rect(-6, -6, 2, 2) },
753 { Point(-4, 6), Point(6, -4), Rect(-4, -4, 10, 10) },
754 };
755
756 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(int_tests); ++i) {
757 Rect actual = BoundingRect(int_tests[i].a, int_tests[i].b);
758 EXPECT_EQ(int_tests[i].expected.ToString(), actual.ToString());
759 }
760
761 struct {
762 PointF a;
763 PointF b;
764 RectF expected;
765 } float_tests[] = {
766 // If point B dominates A, then A should be the origin.
767 { PointF(4.2f, 6.8f), PointF(4.2f, 6.8f),
768 RectF(4.2f, 6.8f, 0, 0) },
769 { PointF(4.2f, 6.8f), PointF(8.5f, 6.8f),
770 RectF(4.2f, 6.8f, 4.3f, 0) },
771 { PointF(4.2f, 6.8f), PointF(4.2f, 9.3f),
772 RectF(4.2f, 6.8f, 0, 2.5f) },
773 { PointF(4.2f, 6.8f), PointF(8.5f, 9.3f),
774 RectF(4.2f, 6.8f, 4.3f, 2.5f) },
775 // If point A dominates B, then B should be the origin.
776 { PointF(4.2f, 6.8f), PointF(4.2f, 6.8f),
777 RectF(4.2f, 6.8f, 0, 0) },
778 { PointF(8.5f, 6.8f), PointF(4.2f, 6.8f),
779 RectF(4.2f, 6.8f, 4.3f, 0) },
780 { PointF(4.2f, 9.3f), PointF(4.2f, 6.8f),
781 RectF(4.2f, 6.8f, 0, 2.5f) },
782 { PointF(8.5f, 9.3f), PointF(4.2f, 6.8f),
783 RectF(4.2f, 6.8f, 4.3f, 2.5f) },
784 // If neither point dominates, then the origin is a combination of the two.
785 { PointF(4.2f, 6.8f), PointF(6.8f, 4.2f),
786 RectF(4.2f, 4.2f, 2.6f, 2.6f) },
787 { PointF(-4.2f, -6.8f), PointF(-6.8f, -4.2f),
788 RectF(-6.8f, -6.8f, 2.6f, 2.6f) },
789 { PointF(-4.2f, 6.8f), PointF(6.8f, -4.2f),
790 RectF(-4.2f, -4.2f, 11.0f, 11.0f) }
791 };
792
793 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i) {
794 RectF actual = BoundingRect(float_tests[i].a, float_tests[i].b);
795 EXPECT_EQ(float_tests[i].expected.ToString(), actual.ToString());
796 }
797 }
798
799 TEST(RectTest, IsExpressibleAsRect) {
800 EXPECT_TRUE(RectF().IsExpressibleAsRect());
801
802 float min = std::numeric_limits<int>::min();
803 float max = std::numeric_limits<int>::max();
804 float infinity = std::numeric_limits<float>::infinity();
805
806 EXPECT_TRUE(RectF(
807 min + 200, min + 200, max - 200, max - 200).IsExpressibleAsRect());
808 EXPECT_FALSE(RectF(
809 min - 200, min + 200, max + 200, max + 200).IsExpressibleAsRect());
810 EXPECT_FALSE(RectF(
811 min + 200 , min - 200, max + 200, max + 200).IsExpressibleAsRect());
812 EXPECT_FALSE(RectF(
813 min + 200, min + 200, max + 200, max - 200).IsExpressibleAsRect());
814 EXPECT_FALSE(RectF(
815 min + 200, min + 200, max - 200, max + 200).IsExpressibleAsRect());
816
817 EXPECT_TRUE(RectF(0, 0, max - 200, max - 200).IsExpressibleAsRect());
818 EXPECT_FALSE(RectF(200, 0, max + 200, max - 200).IsExpressibleAsRect());
819 EXPECT_FALSE(RectF(0, 200, max - 200, max + 200).IsExpressibleAsRect());
820 EXPECT_FALSE(RectF(0, 0, max + 200, max - 200).IsExpressibleAsRect());
821 EXPECT_FALSE(RectF(0, 0, max - 200, max + 200).IsExpressibleAsRect());
822
823 EXPECT_FALSE(RectF(infinity, 0, 1, 1).IsExpressibleAsRect());
824 EXPECT_FALSE(RectF(0, infinity, 1, 1).IsExpressibleAsRect());
825 EXPECT_FALSE(RectF(0, 0, infinity, 1).IsExpressibleAsRect());
826 EXPECT_FALSE(RectF(0, 0, 1, infinity).IsExpressibleAsRect());
827 }
828
829 TEST(RectTest, Offset) {
830 Rect i(1, 2, 3, 4);
831
832 EXPECT_EQ(Rect(2, 1, 3, 4).ToString(), (i + Vector2d(1, -1)).ToString());
833 EXPECT_EQ(Rect(2, 1, 3, 4).ToString(), (Vector2d(1, -1) + i).ToString());
834 i += Vector2d(1, -1);
835 EXPECT_EQ(Rect(2, 1, 3, 4).ToString(), i.ToString());
836 EXPECT_EQ(Rect(1, 2, 3, 4).ToString(), (i - Vector2d(1, -1)).ToString());
837 i -= Vector2d(1, -1);
838 EXPECT_EQ(Rect(1, 2, 3, 4).ToString(), i.ToString());
839
840 RectF f(1.1f, 2.2f, 3.3f, 4.4f);
841 EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f).ToString(),
842 (f + Vector2dF(1.1f, -1.1f)).ToString());
843 EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f).ToString(),
844 (Vector2dF(1.1f, -1.1f) + f).ToString());
845 f += Vector2dF(1.1f, -1.1f);
846 EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f).ToString(), f.ToString());
847 EXPECT_EQ(RectF(1.1f, 2.2f, 3.3f, 4.4f).ToString(),
848 (f - Vector2dF(1.1f, -1.1f)).ToString());
849 f -= Vector2dF(1.1f, -1.1f);
850 EXPECT_EQ(RectF(1.1f, 2.2f, 3.3f, 4.4f).ToString(), f.ToString());
851 }
852
853 TEST(RectTest, Corners) {
854 Rect i(1, 2, 3, 4);
855 RectF f(1.1f, 2.1f, 3.1f, 4.1f);
856
857 EXPECT_EQ(Point(1, 2).ToString(), i.origin().ToString());
858 EXPECT_EQ(Point(4, 2).ToString(), i.top_right().ToString());
859 EXPECT_EQ(Point(1, 6).ToString(), i.bottom_left().ToString());
860 EXPECT_EQ(Point(4, 6).ToString(), i.bottom_right().ToString());
861
862 EXPECT_EQ(PointF(1.1f, 2.1f).ToString(), f.origin().ToString());
863 EXPECT_EQ(PointF(4.2f, 2.1f).ToString(), f.top_right().ToString());
864 EXPECT_EQ(PointF(1.1f, 6.2f).ToString(), f.bottom_left().ToString());
865 EXPECT_EQ(PointF(4.2f, 6.2f).ToString(), f.bottom_right().ToString());
866 }
867
868 TEST(RectTest, ManhattanDistanceToPoint) {
869 Rect i(1, 2, 3, 4);
870 EXPECT_EQ(0, i.ManhattanDistanceToPoint(Point(1, 2)));
871 EXPECT_EQ(0, i.ManhattanDistanceToPoint(Point(4, 6)));
872 EXPECT_EQ(0, i.ManhattanDistanceToPoint(Point(2, 4)));
873 EXPECT_EQ(3, i.ManhattanDistanceToPoint(Point(0, 0)));
874 EXPECT_EQ(2, i.ManhattanDistanceToPoint(Point(2, 0)));
875 EXPECT_EQ(3, i.ManhattanDistanceToPoint(Point(5, 0)));
876 EXPECT_EQ(1, i.ManhattanDistanceToPoint(Point(5, 4)));
877 EXPECT_EQ(3, i.ManhattanDistanceToPoint(Point(5, 8)));
878 EXPECT_EQ(2, i.ManhattanDistanceToPoint(Point(3, 8)));
879 EXPECT_EQ(2, i.ManhattanDistanceToPoint(Point(0, 7)));
880 EXPECT_EQ(1, i.ManhattanDistanceToPoint(Point(0, 3)));
881
882 RectF f(1.1f, 2.1f, 3.1f, 4.1f);
883 EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(1.1f, 2.1f)));
884 EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(4.2f, 6.f)));
885 EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(2.f, 4.f)));
886 EXPECT_FLOAT_EQ(3.2f, f.ManhattanDistanceToPoint(PointF(0.f, 0.f)));
887 EXPECT_FLOAT_EQ(2.1f, f.ManhattanDistanceToPoint(PointF(2.f, 0.f)));
888 EXPECT_FLOAT_EQ(2.9f, f.ManhattanDistanceToPoint(PointF(5.f, 0.f)));
889 EXPECT_FLOAT_EQ(.8f, f.ManhattanDistanceToPoint(PointF(5.f, 4.f)));
890 EXPECT_FLOAT_EQ(2.6f, f.ManhattanDistanceToPoint(PointF(5.f, 8.f)));
891 EXPECT_FLOAT_EQ(1.8f, f.ManhattanDistanceToPoint(PointF(3.f, 8.f)));
892 EXPECT_FLOAT_EQ(1.9f, f.ManhattanDistanceToPoint(PointF(0.f, 7.f)));
893 EXPECT_FLOAT_EQ(1.1f, f.ManhattanDistanceToPoint(PointF(0.f, 3.f)));
894 }
895
896 TEST(RectTest, ManhattanInternalDistance) {
897 Rect i(0, 0, 400, 400);
898 EXPECT_EQ(0, i.ManhattanInternalDistance(gfx::Rect(-1, 0, 2, 1)));
899 EXPECT_EQ(1, i.ManhattanInternalDistance(gfx::Rect(400, 0, 1, 400)));
900 EXPECT_EQ(2, i.ManhattanInternalDistance(gfx::Rect(-100, -100, 100, 100)));
901 EXPECT_EQ(2, i.ManhattanInternalDistance(gfx::Rect(-101, 100, 100, 100)));
902 EXPECT_EQ(4, i.ManhattanInternalDistance(gfx::Rect(-101, -101, 100, 100)));
903 EXPECT_EQ(435, i.ManhattanInternalDistance(gfx::Rect(630, 603, 100, 100)));
904
905 RectF f(0.0f, 0.0f, 400.0f, 400.0f);
906 static const float kEpsilon = std::numeric_limits<float>::epsilon();
907
908 EXPECT_FLOAT_EQ(
909 0.0f, f.ManhattanInternalDistance(gfx::RectF(-1.0f, 0.0f, 2.0f, 1.0f)));
910 EXPECT_FLOAT_EQ(
911 kEpsilon,
912 f.ManhattanInternalDistance(gfx::RectF(400.0f, 0.0f, 1.0f, 400.0f)));
913 EXPECT_FLOAT_EQ(2.0f * kEpsilon,
914 f.ManhattanInternalDistance(
915 gfx::RectF(-100.0f, -100.0f, 100.0f, 100.0f)));
916 EXPECT_FLOAT_EQ(
917 1.0f + kEpsilon,
918 f.ManhattanInternalDistance(gfx::RectF(-101.0f, 100.0f, 100.0f, 100.0f)));
919 EXPECT_FLOAT_EQ(2.0f + 2.0f * kEpsilon,
920 f.ManhattanInternalDistance(
921 gfx::RectF(-101.0f, -101.0f, 100.0f, 100.0f)));
922 EXPECT_FLOAT_EQ(
923 433.0f + 2.0f * kEpsilon,
924 f.ManhattanInternalDistance(gfx::RectF(630.0f, 603.0f, 100.0f, 100.0f)));
925
926 EXPECT_FLOAT_EQ(
927 0.0f, f.ManhattanInternalDistance(gfx::RectF(-1.0f, 0.0f, 1.1f, 1.0f)));
928 EXPECT_FLOAT_EQ(
929 0.1f + kEpsilon,
930 f.ManhattanInternalDistance(gfx::RectF(-1.5f, 0.0f, 1.4f, 1.0f)));
931 EXPECT_FLOAT_EQ(
932 kEpsilon,
933 f.ManhattanInternalDistance(gfx::RectF(-1.5f, 0.0f, 1.5f, 1.0f)));
934 }
935
936 } // namespace gfx
OLDNEW
« ui/aura/aura.gyp ('K') | « ui/gfx/rect_f.cc ('k') | ui/gfx/safe_integer_conversions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698