OLD | NEW |
| (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 | |
OLD | NEW |