73TEST(RectTest, RectSimpleLTRB) {
77 EXPECT_EQ(rect.GetLeft(), 5.125f);
78 EXPECT_EQ(rect.GetTop(), 10.25f);
79 EXPECT_EQ(rect.GetRight(), 20.625f);
80 EXPECT_EQ(rect.GetBottom(), 25.375f);
81 EXPECT_EQ(rect.GetX(), 5.125f);
82 EXPECT_EQ(rect.GetY(), 10.25f);
83 EXPECT_EQ(rect.GetWidth(), 15.5f);
84 EXPECT_EQ(rect.GetHeight(), 15.125f);
85 EXPECT_FALSE(rect.IsEmpty());
103TEST(RectTest, RectSimpleXYWH) {
107 EXPECT_EQ(rect.GetLeft(), 5.125f);
108 EXPECT_EQ(rect.GetTop(), 10.25f);
109 EXPECT_EQ(rect.GetRight(), 20.625f);
110 EXPECT_EQ(rect.GetBottom(), 25.375f);
111 EXPECT_EQ(rect.GetX(), 5.125f);
112 EXPECT_EQ(rect.GetY(), 10.25f);
113 EXPECT_EQ(rect.GetWidth(), 15.5f);
114 EXPECT_EQ(rect.GetHeight(), 15.125f);
115 EXPECT_FALSE(rect.IsEmpty());
133TEST(RectTest, RectOverflowXYWH) {
134 auto min = std::numeric_limits<Scalar>::lowest();
135 auto max = std::numeric_limits<Scalar>::max();
136 auto inf = std::numeric_limits<Scalar>::infinity();
154 EXPECT_EQ(rect.GetLeft(), 5.0f);
155 EXPECT_EQ(rect.GetTop(), 10.0f);
156 EXPECT_EQ(rect.GetRight(),
max);
157 EXPECT_EQ(rect.GetBottom(), 25.0f);
158 EXPECT_EQ(rect.GetX(), 5.0f);
159 EXPECT_EQ(rect.GetY(), 10.0f);
160 EXPECT_EQ(rect.GetWidth(),
max);
161 EXPECT_EQ(rect.GetHeight(), 15.0f);
162 EXPECT_FALSE(rect.IsEmpty());
169 EXPECT_EQ(rect.GetLeft(),
max);
170 EXPECT_EQ(rect.GetTop(), 10.0f);
171 EXPECT_EQ(rect.GetRight(), inf);
172 EXPECT_EQ(rect.GetBottom(), 25.0f);
173 EXPECT_EQ(rect.GetX(),
max);
174 EXPECT_EQ(rect.GetY(), 10.0f);
175 EXPECT_EQ(rect.GetWidth(), inf);
176 EXPECT_EQ(rect.GetHeight(), 15.0f);
177 EXPECT_FALSE(rect.IsEmpty());
178 EXPECT_FALSE(rect.IsFinite());
184 EXPECT_EQ(rect.GetLeft(), 5.0f);
185 EXPECT_EQ(rect.GetTop(), 10.0f);
186 EXPECT_EQ(rect.GetRight(), 25.0f);
187 EXPECT_EQ(rect.GetBottom(),
max);
188 EXPECT_EQ(rect.GetX(), 5.0f);
189 EXPECT_EQ(rect.GetY(), 10.0f);
190 EXPECT_EQ(rect.GetWidth(), 20.0f);
191 EXPECT_EQ(rect.GetHeight(),
max);
192 EXPECT_FALSE(rect.IsEmpty());
199 EXPECT_EQ(rect.GetLeft(), 5.0f);
200 EXPECT_EQ(rect.GetTop(),
max);
201 EXPECT_EQ(rect.GetRight(), 25.0f);
202 EXPECT_EQ(rect.GetBottom(), inf);
203 EXPECT_EQ(rect.GetX(), 5.0f);
204 EXPECT_EQ(rect.GetY(),
max);
205 EXPECT_EQ(rect.GetWidth(), 20.0f);
206 EXPECT_EQ(rect.GetHeight(), inf);
207 EXPECT_FALSE(rect.IsEmpty());
208 EXPECT_FALSE(rect.IsFinite());
214 EXPECT_EQ(rect.GetLeft(), 5.0f);
215 EXPECT_EQ(rect.GetTop(), 10.0f);
216 EXPECT_EQ(rect.GetRight(),
min);
217 EXPECT_EQ(rect.GetBottom(), 25.0f);
218 EXPECT_EQ(rect.GetX(), 5.0f);
219 EXPECT_EQ(rect.GetY(), 10.0f);
220 EXPECT_EQ(rect.GetWidth(),
min);
221 EXPECT_EQ(rect.GetHeight(), 15.0f);
229 EXPECT_EQ(rect.GetLeft(),
min);
230 EXPECT_EQ(rect.GetTop(), 10.0f);
231 EXPECT_EQ(rect.GetRight(), -inf);
232 EXPECT_EQ(rect.GetBottom(), 25.0f);
233 EXPECT_EQ(rect.GetX(),
min);
234 EXPECT_EQ(rect.GetY(), 10.0f);
235 EXPECT_EQ(rect.GetWidth(), -inf);
236 EXPECT_EQ(rect.GetHeight(), 15.0f);
238 EXPECT_FALSE(rect.IsFinite());
244 EXPECT_EQ(rect.GetLeft(), 5.0f);
245 EXPECT_EQ(rect.GetTop(), 10.0f);
246 EXPECT_EQ(rect.GetRight(), 25.0f);
247 EXPECT_EQ(rect.GetBottom(),
min);
248 EXPECT_EQ(rect.GetX(), 5.0f);
249 EXPECT_EQ(rect.GetY(), 10.0f);
250 EXPECT_EQ(rect.GetWidth(), 20.0f);
251 EXPECT_EQ(rect.GetHeight(),
min);
259 EXPECT_EQ(rect.GetLeft(), 5.0f);
260 EXPECT_EQ(rect.GetTop(),
min);
261 EXPECT_EQ(rect.GetRight(), 25.0f);
262 EXPECT_EQ(rect.GetBottom(), -inf);
263 EXPECT_EQ(rect.GetX(), 5.0f);
264 EXPECT_EQ(rect.GetY(),
min);
265 EXPECT_EQ(rect.GetWidth(), 20.0f);
266 EXPECT_EQ(rect.GetHeight(), -inf);
268 EXPECT_FALSE(rect.IsFinite());
272TEST(RectTest, IRectOverflowXYWH) {
273 auto min = std::numeric_limits<int64_t>::min();
274 auto max = std::numeric_limits<int64_t>::max();
285 EXPECT_EQ(rect.GetLeft(),
max - 5);
286 EXPECT_EQ(rect.GetTop(), 10);
287 EXPECT_EQ(rect.GetRight(),
max);
288 EXPECT_EQ(rect.GetBottom(), 26);
289 EXPECT_EQ(rect.GetX(),
max - 5);
290 EXPECT_EQ(rect.GetY(), 10);
291 EXPECT_EQ(rect.GetWidth(), 5);
292 EXPECT_EQ(rect.GetHeight(), 16);
293 EXPECT_FALSE(rect.IsEmpty());
299 EXPECT_EQ(rect.GetLeft(),
min + 5);
300 EXPECT_EQ(rect.GetTop(), 10);
301 EXPECT_EQ(rect.GetRight(),
min);
302 EXPECT_EQ(rect.GetBottom(), 26);
303 EXPECT_EQ(rect.GetX(),
min + 5);
304 EXPECT_EQ(rect.GetY(), 10);
305 EXPECT_EQ(rect.GetWidth(), -5);
306 EXPECT_EQ(rect.GetHeight(), 16);
313 EXPECT_EQ(rect.GetLeft(), 5);
314 EXPECT_EQ(rect.GetTop(),
max - 10);
315 EXPECT_EQ(rect.GetRight(), 15);
316 EXPECT_EQ(rect.GetBottom(),
max);
317 EXPECT_EQ(rect.GetX(), 5);
318 EXPECT_EQ(rect.GetY(),
max - 10);
319 EXPECT_EQ(rect.GetWidth(), 10);
320 EXPECT_EQ(rect.GetHeight(), 10);
321 EXPECT_FALSE(rect.IsEmpty());
327 EXPECT_EQ(rect.GetLeft(), 5);
328 EXPECT_EQ(rect.GetTop(),
min + 10);
329 EXPECT_EQ(rect.GetRight(), 15);
330 EXPECT_EQ(rect.GetBottom(),
min);
331 EXPECT_EQ(rect.GetX(), 5);
332 EXPECT_EQ(rect.GetY(),
min + 10);
333 EXPECT_EQ(rect.GetWidth(), 10);
334 EXPECT_EQ(rect.GetHeight(), -10);
339TEST(RectTest, RectOverflowLTRB) {
340 auto min = std::numeric_limits<Scalar>::lowest();
341 auto max = std::numeric_limits<Scalar>::max();
342 auto inf = std::numeric_limits<Scalar>::infinity();
360 EXPECT_EQ(rect.GetLeft(), -5.0f);
361 EXPECT_EQ(rect.GetTop(), 10.0f);
362 EXPECT_EQ(rect.GetRight(),
max);
363 EXPECT_EQ(rect.GetBottom(), 25.0f);
364 EXPECT_EQ(rect.GetX(), -5.0f);
365 EXPECT_EQ(rect.GetY(), 10.0f);
366 EXPECT_EQ(rect.GetWidth(),
max);
367 EXPECT_EQ(rect.GetHeight(), 15.0f);
368 EXPECT_FALSE(rect.IsEmpty());
375 EXPECT_EQ(rect.GetLeft(),
min + 5.0f);
376 EXPECT_EQ(rect.GetTop(), 10.0f);
377 EXPECT_EQ(rect.GetRight(),
max - 5.0f);
378 EXPECT_EQ(rect.GetBottom(), 25.0f);
379 EXPECT_EQ(rect.GetX(),
min + 5.0f);
380 EXPECT_EQ(rect.GetY(), 10.0f);
381 EXPECT_EQ(rect.GetWidth(), inf);
382 EXPECT_EQ(rect.GetHeight(), 15.0f);
383 EXPECT_FALSE(rect.IsEmpty());
390 EXPECT_EQ(rect.GetLeft(), 5.0f);
391 EXPECT_EQ(rect.GetTop(), -10.0f);
392 EXPECT_EQ(rect.GetRight(), 20.0f);
393 EXPECT_EQ(rect.GetBottom(),
max);
394 EXPECT_EQ(rect.GetX(), 5.0f);
395 EXPECT_EQ(rect.GetY(), -10.0f);
396 EXPECT_EQ(rect.GetWidth(), 15.0f);
397 EXPECT_EQ(rect.GetHeight(),
max);
398 EXPECT_FALSE(rect.IsEmpty());
405 EXPECT_EQ(rect.GetLeft(), 5.0f);
406 EXPECT_EQ(rect.GetTop(),
min + 10.0f);
407 EXPECT_EQ(rect.GetRight(), 20.0f);
408 EXPECT_EQ(rect.GetBottom(),
max - 15.0f);
409 EXPECT_EQ(rect.GetX(), 5.0f);
410 EXPECT_EQ(rect.GetY(),
min + 10.0f);
411 EXPECT_EQ(rect.GetWidth(), 15.0f);
412 EXPECT_EQ(rect.GetHeight(), inf);
413 EXPECT_FALSE(rect.IsEmpty());
420 EXPECT_EQ(rect.GetLeft(), 5.0f);
421 EXPECT_EQ(rect.GetTop(), 10.0f);
422 EXPECT_EQ(rect.GetRight(),
min);
423 EXPECT_EQ(rect.GetBottom(), 25.0f);
424 EXPECT_EQ(rect.GetX(), 5.0f);
425 EXPECT_EQ(rect.GetY(), 10.0f);
426 EXPECT_EQ(rect.GetWidth(),
min);
427 EXPECT_EQ(rect.GetHeight(), 15.0f);
435 EXPECT_EQ(rect.GetLeft(),
max - 5.0f);
436 EXPECT_EQ(rect.GetTop(), 10.0f);
437 EXPECT_EQ(rect.GetRight(),
min + 10.0f);
438 EXPECT_EQ(rect.GetBottom(), 25.0f);
439 EXPECT_EQ(rect.GetX(),
max - 5.0f);
440 EXPECT_EQ(rect.GetY(), 10.0f);
441 EXPECT_EQ(rect.GetWidth(), -inf);
442 EXPECT_EQ(rect.GetHeight(), 15.0f);
450 EXPECT_EQ(rect.GetLeft(), 5.0f);
451 EXPECT_EQ(rect.GetTop(), 10.0f);
452 EXPECT_EQ(rect.GetRight(), 20.0f);
453 EXPECT_EQ(rect.GetBottom(),
min);
454 EXPECT_EQ(rect.GetX(), 5.0f);
455 EXPECT_EQ(rect.GetY(), 10.0f);
456 EXPECT_EQ(rect.GetWidth(), 15.0f);
457 EXPECT_EQ(rect.GetHeight(),
min);
465 EXPECT_EQ(rect.GetLeft(), 5.0f);
466 EXPECT_EQ(rect.GetTop(),
max - 5.0f);
467 EXPECT_EQ(rect.GetRight(), 20.0f);
468 EXPECT_EQ(rect.GetBottom(),
min + 10.0f);
469 EXPECT_EQ(rect.GetX(), 5.0f);
470 EXPECT_EQ(rect.GetY(),
max - 5.0f);
471 EXPECT_EQ(rect.GetWidth(), 15.0f);
472 EXPECT_EQ(rect.GetHeight(), -inf);
478TEST(RectTest, IRectOverflowLTRB) {
479 auto min = std::numeric_limits<int64_t>::min();
480 auto max = std::numeric_limits<int64_t>::max();
491 EXPECT_EQ(rect.GetLeft(), -10);
492 EXPECT_EQ(rect.GetTop(), 10);
493 EXPECT_EQ(rect.GetRight(),
max - 5);
494 EXPECT_EQ(rect.GetBottom(), 26);
495 EXPECT_EQ(rect.GetX(), -10);
496 EXPECT_EQ(rect.GetY(), 10);
497 EXPECT_EQ(rect.GetWidth(),
max);
498 EXPECT_EQ(rect.GetHeight(), 16);
499 EXPECT_FALSE(rect.IsEmpty());
505 EXPECT_EQ(rect.GetLeft(), 10);
506 EXPECT_EQ(rect.GetTop(), 10);
507 EXPECT_EQ(rect.GetRight(),
min + 5);
508 EXPECT_EQ(rect.GetBottom(), 26);
509 EXPECT_EQ(rect.GetX(), 10);
510 EXPECT_EQ(rect.GetY(), 10);
511 EXPECT_EQ(rect.GetWidth(),
min);
512 EXPECT_EQ(rect.GetHeight(), 16);
519 EXPECT_EQ(rect.GetLeft(), 5);
520 EXPECT_EQ(rect.GetTop(), -10);
521 EXPECT_EQ(rect.GetRight(), 15);
522 EXPECT_EQ(rect.GetBottom(),
max - 5);
523 EXPECT_EQ(rect.GetX(), 5);
524 EXPECT_EQ(rect.GetY(), -10);
525 EXPECT_EQ(rect.GetWidth(), 10);
526 EXPECT_EQ(rect.GetHeight(),
max);
527 EXPECT_FALSE(rect.IsEmpty());
533 EXPECT_EQ(rect.GetLeft(), 5);
534 EXPECT_EQ(rect.GetTop(), 10);
535 EXPECT_EQ(rect.GetRight(), 15);
536 EXPECT_EQ(rect.GetBottom(),
min + 5);
537 EXPECT_EQ(rect.GetX(), 5);
538 EXPECT_EQ(rect.GetY(), 10);
539 EXPECT_EQ(rect.GetWidth(), 10);
540 EXPECT_EQ(rect.GetHeight(),
min);
888 rect.GetWidth() *
scale,
889 rect.GetHeight() *
scale);
892 << rect <<
" * " <<
scale;
894 << rect <<
" * " <<
scale;
896 << rect <<
" * " <<
scale;
898 << rect <<
" * " <<
scale;
903 rect.GetY() * scale_y,
904 rect.GetWidth() * scale_x,
905 rect.GetHeight() * scale_y);
908 << rect <<
" * " << scale_x <<
", " << scale_y;
910 << rect <<
" * " << scale_x <<
", " << scale_y;
912 << rect <<
" * " << scale_x <<
", " << scale_y;
914 test1(rect, scale_x);
915 test1(rect, scale_y);
933 rect.GetWidth() *
scale,
934 rect.GetHeight() *
scale);
936 EXPECT_EQ(rect.Scale(
scale), expected)
937 << rect <<
" * " <<
scale;
939 << rect <<
" * " <<
scale;
941 << rect <<
" * " <<
scale;
943 << rect <<
" * " <<
scale;
946 auto test2 = [&
test1](
IRect rect, int64_t scale_x, int64_t scale_y) {
948 rect.GetY() * scale_y,
949 rect.GetWidth() * scale_x,
950 rect.GetHeight() * scale_y);
952 EXPECT_EQ(rect.Scale(scale_x, scale_y), expected)
953 << rect <<
" * " << scale_x <<
", " << scale_y;
954 EXPECT_EQ(rect.Scale(
IPoint(scale_x, scale_y)), expected)
955 << rect <<
" * " << scale_x <<
", " << scale_y;
956 EXPECT_EQ(rect.Scale(
ISize(scale_x, scale_y)), expected)
957 << rect <<
" * " << scale_x <<
", " << scale_y;
959 test1(rect, scale_x);
960 test1(rect, scale_y);
989TEST(RectTest, RectGetNormalizingTransform) {
995 EXPECT_EQ(r.GetNormalizingTransform(),
1004 auto m = r.GetNormalizingTransform();
1013 EXPECT_EQ(m *
Point(350, 600),
Point(0.5, 0.5));
1016 EXPECT_EQ(m *
Point(200, 300),
Point(-1, -1));
1017 EXPECT_EQ(m *
Point(500, 300),
Point(2, -1));
1019 EXPECT_EQ(m *
Point(200, 900),
Point(-1, 2));
1028 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 0, 10).GetNormalizingTransform(), zero);
1029 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 10, 0).GetNormalizingTransform(), zero);
1030 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 0, 0).GetNormalizingTransform(), zero);
1033 EXPECT_EQ(
Rect::MakeXYWH(10, 10, -1, 10).GetNormalizingTransform(), zero);
1034 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 10, -1).GetNormalizingTransform(), zero);
1035 EXPECT_EQ(
Rect::MakeXYWH(10, 10, -1, -1).GetNormalizingTransform(), zero);
1042 auto nan = std::numeric_limits<Scalar>::quiet_NaN();
1043 auto inf = std::numeric_limits<Scalar>::infinity();
1046 EXPECT_EQ(
Rect::MakeXYWH(10, 10, nan, 10).GetNormalizingTransform(), z);
1047 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 10, nan).GetNormalizingTransform(), z);
1048 EXPECT_EQ(
Rect::MakeXYWH(10, 10, nan, nan).GetNormalizingTransform(), z);
1051 EXPECT_EQ(
Rect::MakeXYWH(10, 10, inf, 10).GetNormalizingTransform(), z);
1052 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 10, inf).GetNormalizingTransform(), z);
1053 EXPECT_EQ(
Rect::MakeXYWH(10, 10, inf, inf).GetNormalizingTransform(), z);
1056 EXPECT_EQ(
Rect::MakeXYWH(10, 10, -inf, 10).GetNormalizingTransform(), z);
1057 EXPECT_EQ(
Rect::MakeXYWH(10, 10, 10, -inf).GetNormalizingTransform(), z);
1058 EXPECT_EQ(
Rect::MakeXYWH(10, 10, -inf, -inf).GetNormalizingTransform(), z);
1061 EXPECT_EQ(
Rect::MakeXYWH(nan, 10, 10, 10).GetNormalizingTransform(), z);
1062 EXPECT_EQ(
Rect::MakeXYWH(10, nan, 10, 10).GetNormalizingTransform(), z);
1063 EXPECT_EQ(
Rect::MakeXYWH(nan, nan, 10, 10).GetNormalizingTransform(), z);
1066 EXPECT_EQ(
Rect::MakeXYWH(inf, 10, 10, 10).GetNormalizingTransform(), z);
1067 EXPECT_EQ(
Rect::MakeXYWH(10, inf, 10, 10).GetNormalizingTransform(), z);
1068 EXPECT_EQ(
Rect::MakeXYWH(inf, inf, 10, 10).GetNormalizingTransform(), z);
1071 EXPECT_EQ(
Rect::MakeXYWH(-inf, 10, 10, 10).GetNormalizingTransform(), z);
1072 EXPECT_EQ(
Rect::MakeXYWH(10, -inf, 10, 10).GetNormalizingTransform(), z);
1073 EXPECT_EQ(
Rect::MakeXYWH(-inf, -inf, 10, 10).GetNormalizingTransform(), z);
1077TEST(RectTest, IRectGetNormalizingTransform) {
1083 EXPECT_EQ(r.GetNormalizingTransform(),
1092 auto m = r.GetNormalizingTransform();
1101 EXPECT_EQ(m *
Point(350, 600),
Point(0.5, 0.5));
1104 EXPECT_EQ(m *
Point(200, 300),
Point(-1, -1));
1105 EXPECT_EQ(m *
Point(500, 300),
Point(2, -1));
1107 EXPECT_EQ(m *
Point(200, 900),
Point(-1, 2));
1116 EXPECT_EQ(
IRect::MakeXYWH(10, 10, 0, 10).GetNormalizingTransform(), zero);
1117 EXPECT_EQ(
IRect::MakeXYWH(10, 10, 10, 0).GetNormalizingTransform(), zero);
1118 EXPECT_EQ(
IRect::MakeXYWH(10, 10, 0, 0).GetNormalizingTransform(), zero);
1121 EXPECT_EQ(
IRect::MakeXYWH(10, 10, -1, 10).GetNormalizingTransform(), zero);
1122 EXPECT_EQ(
IRect::MakeXYWH(10, 10, 10, -1).GetNormalizingTransform(), zero);
1123 EXPECT_EQ(
IRect::MakeXYWH(10, 10, -1, -1).GetNormalizingTransform(), zero);
1128 auto nan = std::numeric_limits<Scalar>::quiet_NaN();
1213 EXPECT_EQ(rect.Expand(10, 10),
Rect::MakeLTRB(90, 90, 210, 210));
1214 EXPECT_EQ(rect.Expand(10, -10),
Rect::MakeLTRB(90, 110, 210, 190));
1215 EXPECT_EQ(rect.Expand(-10, 10),
Rect::MakeLTRB(110, 90, 190, 210));
1216 EXPECT_EQ(rect.Expand(-10, -10),
Rect::MakeLTRB(110, 110, 190, 190));
1219 EXPECT_EQ(rect.Expand(10, 20, 30, 40),
Rect::MakeLTRB(90, 80, 230, 240));
1220 EXPECT_EQ(rect.Expand(-10, 20, 30, 40),
Rect::MakeLTRB(110, 80, 230, 240));
1221 EXPECT_EQ(rect.Expand(10, -20, 30, 40),
Rect::MakeLTRB(90, 120, 230, 240));
1222 EXPECT_EQ(rect.Expand(10, 20, -30, 40),
Rect::MakeLTRB(90, 80, 170, 240));
1223 EXPECT_EQ(rect.Expand(10, 20, 30, -40),
Rect::MakeLTRB(90, 80, 230, 160));
1249 EXPECT_EQ(rect.Expand(-10, -10),
IRect::MakeLTRB(110, 110, 190, 190));
1252 EXPECT_EQ(rect.Expand(10, 20, 30, 40),
IRect::MakeLTRB(90, 80, 230, 240));
1253 EXPECT_EQ(rect.Expand(-10, 20, 30, 40),
IRect::MakeLTRB(110, 80, 230, 240));
1254 EXPECT_EQ(rect.Expand(10, -20, 30, 40),
IRect::MakeLTRB(90, 120, 230, 240));
1255 EXPECT_EQ(rect.Expand(10, 20, -30, 40),
IRect::MakeLTRB(90, 80, 170, 240));
1256 EXPECT_EQ(rect.Expand(10, 20, 30, -40),
IRect::MakeLTRB(90, 80, 230, 160));
2108 auto check_nans = [](
const Rect& rect,
const Point& point,
2109 const std::string& label) {
2110 ASSERT_TRUE(rect.IsFinite()) << label;
2111 ASSERT_TRUE(point.IsFinite()) << label;
2113 for (
int i = 1; i < 16; i++) {
2114 EXPECT_FALSE(
swap_nan(rect, i).Contains(point))
2115 << label <<
", index = " << i;
2116 for (
int j = 1; j < 4; j++) {
2118 << label <<
", indices = " << i <<
", " << j;
2123 auto check_empty_flips = [](
const Rect& rect,
const Point& point,
2124 const std::string& label) {
2125 ASSERT_FALSE(rect.IsEmpty());
2127 EXPECT_FALSE(
flip_lr(rect).Contains(point)) << label;
2128 EXPECT_FALSE(
flip_tb(rect).Contains(point)) << label;
2129 EXPECT_FALSE(
flip_lrtb(rect).Contains(point)) << label;
2132 auto test_inside = [&check_nans, &check_empty_flips](
const Rect& rect,
2133 const Point& point) {
2134 ASSERT_FALSE(rect.IsEmpty()) << rect;
2136 std::stringstream stream;
2137 stream << rect <<
" contains " << point;
2138 auto label = stream.str();
2141 check_empty_flips(rect, point, label);
2142 check_nans(rect, point, label);
2145 auto test_outside = [&check_nans, &check_empty_flips](
const Rect& rect,
2146 const Point& point) {
2147 ASSERT_FALSE(rect.IsEmpty()) << rect;
2149 std::stringstream stream;
2150 stream << rect <<
" contains " << point;
2151 auto label = stream.str();
2153 EXPECT_FALSE(rect.Contains(point)) << label;
2154 check_empty_flips(rect, point, label);
2155 check_nans(rect, point, label);
2161 auto p =
Point(100, 100);
2168 auto p =
Point(200, 200);
2174 auto p =
Point(99, 99);
2180 auto p =
Point(199, 199);
2187 auto p =
Point(199, 199);
2193TEST(RectTest, IRectContainsIPoint) {
2194 auto check_empty_flips = [](
const IRect& rect,
const IPoint& point,
2195 const std::string& label) {
2196 ASSERT_FALSE(rect.IsEmpty());
2198 EXPECT_FALSE(
flip_lr(rect).Contains(point)) << label;
2199 EXPECT_FALSE(
flip_tb(rect).Contains(point)) << label;
2200 EXPECT_FALSE(
flip_lrtb(rect).Contains(point)) << label;
2203 auto test_inside = [&check_empty_flips](
const IRect& rect,
2205 ASSERT_FALSE(rect.IsEmpty()) << rect;
2207 std::stringstream stream;
2208 stream << rect <<
" contains " << point;
2209 auto label = stream.str();
2212 check_empty_flips(rect, point, label);
2215 auto test_outside = [&check_empty_flips](
const IRect& rect,
2217 ASSERT_FALSE(rect.IsEmpty()) << rect;
2219 std::stringstream stream;
2220 stream << rect <<
" contains " << point;
2221 auto label = stream.str();
2223 EXPECT_FALSE(rect.Contains(point)) << label;
2224 check_empty_flips(rect, point, label);
2230 auto p =
IPoint(100, 100);
2237 auto p =
IPoint(200, 200);
2249 auto p =
IPoint(199, 199);
2256 auto p =
IPoint(199, 199);
2473 auto check_nans = [&cull_rect](
const Rect& diff_rect,
2474 const std::string& label) {
2478 for (
int i = 1; i < 16; i++) {
2480 EXPECT_FALSE(
swap_nan(cull_rect, i).Cutout(diff_rect).has_value())
2481 << label <<
", index " << i;
2482 EXPECT_EQ(
swap_nan(cull_rect, i).CutoutOrEmpty(diff_rect),
Rect())
2483 << label <<
", index " << i;
2487 << label <<
", index " << i;
2489 << label <<
", index " << i;
2491 for (
int j = 1; j < 16; j++) {
2495 << label <<
", indices " << i <<
", " << j;
2498 << label <<
", indices " << i <<
", " << j;
2503 auto check_empty_flips = [&cull_rect](
const Rect& diff_rect,
2504 const std::string& label) {
2505 EXPECT_FALSE(cull_rect.
IsEmpty()) << label;
2506 EXPECT_FALSE(diff_rect.
IsEmpty()) << label;
2511 EXPECT_EQ(cull_rect.
Cutout(
flip_lr(diff_rect)), cull_rect) << label;
2513 EXPECT_EQ(cull_rect.
Cutout(
flip_tb(diff_rect)), cull_rect) << label;
2515 EXPECT_EQ(cull_rect.
Cutout(
flip_lrtb(diff_rect)), cull_rect) << label;
2519 EXPECT_FALSE(
flip_lr(cull_rect).Cutout(diff_rect).has_value()) << label;
2520 EXPECT_EQ(
flip_lr(cull_rect).CutoutOrEmpty(diff_rect),
Rect()) << label;
2521 EXPECT_FALSE(
flip_tb(cull_rect).Cutout(diff_rect).has_value()) << label;
2522 EXPECT_EQ(
flip_tb(cull_rect).CutoutOrEmpty(diff_rect),
Rect()) << label;
2523 EXPECT_FALSE(
flip_lrtb(cull_rect).Cutout(diff_rect).has_value()) << label;
2524 EXPECT_EQ(
flip_lrtb(cull_rect).CutoutOrEmpty(diff_rect),
Rect()) << label;
2528 EXPECT_FALSE(
flip_lr(cull_rect).Cutout(
flip_lr(diff_rect)).has_value())
2532 EXPECT_FALSE(
flip_tb(cull_rect).Cutout(
flip_tb(diff_rect)).has_value())
2542 auto non_reducing = [&cull_rect, &check_empty_flips, &check_nans](
2543 const Rect& diff_rect,
const std::string& label) {
2544 EXPECT_EQ(cull_rect.
Cutout(diff_rect), cull_rect) << label;
2545 EXPECT_EQ(cull_rect.
CutoutOrEmpty(diff_rect), cull_rect) << label;
2546 check_empty_flips(diff_rect, label);
2547 check_nans(diff_rect, label);
2550 auto reducing = [&cull_rect, &check_empty_flips, &check_nans](
2551 const Rect& diff_rect,
const Rect& result_rect,
2552 const std::string& label) {
2554 EXPECT_EQ(cull_rect.
Cutout(diff_rect), result_rect) << label;
2555 EXPECT_EQ(cull_rect.
CutoutOrEmpty(diff_rect), result_rect) << label;
2556 check_empty_flips(diff_rect, label);
2557 check_nans(diff_rect, label);
2560 auto emptying = [&cull_rect, &check_empty_flips, &check_nans](
2561 const Rect& diff_rect,
const std::string& label) {
2562 EXPECT_FALSE(cull_rect.
Cutout(diff_rect).has_value()) << label;
2564 check_empty_flips(diff_rect, label);
2565 check_nans(diff_rect, label);
2569 non_reducing(
Rect::MakeLTRB(10, 10, 20, 20),
"outside UL corner");
2571 non_reducing(
Rect::MakeLTRB(40, 10, 50, 20),
"outside UR corner");
2573 non_reducing(
Rect::MakeLTRB(40, 40, 50, 50),
"outside LR corner");
2575 non_reducing(
Rect::MakeLTRB(10, 40, 20, 50),
"outside LR corner");
2579 non_reducing(
Rect::MakeLTRB(15, 15, 25, 25),
"covering UL corner");
2580 non_reducing(
Rect::MakeLTRB(35, 15, 45, 25),
"covering UR corner");
2581 non_reducing(
Rect::MakeLTRB(35, 35, 45, 45),
"covering LR corner");
2582 non_reducing(
Rect::MakeLTRB(15, 35, 25, 45),
"covering LL corner");
2585 non_reducing(
Rect::MakeLTRB(20, 15, 39, 25),
"Top edge left-biased");
2586 non_reducing(
Rect::MakeLTRB(21, 15, 40, 25),
"Top edge, right biased");
2587 non_reducing(
Rect::MakeLTRB(35, 20, 45, 39),
"Right edge, top-biased");
2588 non_reducing(
Rect::MakeLTRB(35, 21, 45, 40),
"Right edge, bottom-biased");
2589 non_reducing(
Rect::MakeLTRB(20, 35, 39, 45),
"Bottom edge, left-biased");
2590 non_reducing(
Rect::MakeLTRB(21, 35, 40, 45),
"Bottom edge, right-biased");
2591 non_reducing(
Rect::MakeLTRB(15, 20, 25, 39),
"Left edge, top-biased");
2592 non_reducing(
Rect::MakeLTRB(15, 21, 25, 40),
"Left edge, bottom-biased");
2595 non_reducing(
Rect::MakeLTRB(25, 15, 35, 45),
"Vertical interior slice");
2596 non_reducing(
Rect::MakeLTRB(15, 25, 45, 35),
"Horizontal interior slice");
2607 "Slice off bottom");
2613 non_reducing(
Rect::MakeLTRB(21, 21, 39, 39),
"Contained, non-covering");
2616 emptying(cull_rect,
"Perfectly covering");
2625 auto check_empty_flips = [&cull_rect](
const IRect& diff_rect,
2626 const std::string& label) {
2627 EXPECT_FALSE(diff_rect.
IsEmpty());
2628 EXPECT_FALSE(cull_rect.
IsEmpty());
2633 EXPECT_EQ(cull_rect.
Cutout(
flip_lr(diff_rect)), cull_rect) << label;
2635 EXPECT_EQ(cull_rect.
Cutout(
flip_tb(diff_rect)), cull_rect) << label;
2637 EXPECT_EQ(cull_rect.
Cutout(
flip_lrtb(diff_rect)), cull_rect) << label;
2641 EXPECT_FALSE(
flip_lr(cull_rect).Cutout(diff_rect).has_value()) << label;
2642 EXPECT_EQ(
flip_lr(cull_rect).CutoutOrEmpty(diff_rect),
IRect()) << label;
2643 EXPECT_FALSE(
flip_tb(cull_rect).Cutout(diff_rect).has_value()) << label;
2644 EXPECT_EQ(
flip_tb(cull_rect).CutoutOrEmpty(diff_rect),
IRect()) << label;
2645 EXPECT_FALSE(
flip_lrtb(cull_rect).Cutout(diff_rect).has_value()) << label;
2646 EXPECT_EQ(
flip_lrtb(cull_rect).CutoutOrEmpty(diff_rect),
IRect()) << label;
2650 EXPECT_FALSE(
flip_lr(cull_rect).Cutout(
flip_lr(diff_rect)).has_value())
2654 EXPECT_FALSE(
flip_tb(cull_rect).Cutout(
flip_tb(diff_rect)).has_value())
2664 auto non_reducing = [&cull_rect, &check_empty_flips](
2665 const IRect& diff_rect,
const std::string& label) {
2666 EXPECT_EQ(cull_rect.
Cutout(diff_rect), cull_rect) << label;
2667 EXPECT_EQ(cull_rect.
CutoutOrEmpty(diff_rect), cull_rect) << label;
2668 check_empty_flips(diff_rect, label);
2671 auto reducing = [&cull_rect, &check_empty_flips](
const IRect& diff_rect,
2672 const IRect& result_rect,
2673 const std::string& label) {
2675 EXPECT_EQ(cull_rect.
Cutout(diff_rect), result_rect) << label;
2676 EXPECT_EQ(cull_rect.
CutoutOrEmpty(diff_rect), result_rect) << label;
2677 check_empty_flips(diff_rect, label);
2680 auto emptying = [&cull_rect, &check_empty_flips](
const IRect& diff_rect,
2681 const std::string& label) {
2682 EXPECT_FALSE(cull_rect.
Cutout(diff_rect).has_value()) << label;
2684 check_empty_flips(diff_rect, label);
2704 non_reducing(
IRect::MakeLTRB(20, 15, 39, 25),
"Top edge left-biased");
2705 non_reducing(
IRect::MakeLTRB(21, 15, 40, 25),
"Top edge, right biased");
2706 non_reducing(
IRect::MakeLTRB(35, 20, 45, 39),
"Right edge, top-biased");
2707 non_reducing(
IRect::MakeLTRB(35, 21, 45, 40),
"Right edge, bottom-biased");
2708 non_reducing(
IRect::MakeLTRB(20, 35, 39, 45),
"Bottom edge, left-biased");
2709 non_reducing(
IRect::MakeLTRB(21, 35, 40, 45),
"Bottom edge, right-biased");
2710 non_reducing(
IRect::MakeLTRB(15, 20, 25, 39),
"Left edge, top-biased");
2711 non_reducing(
IRect::MakeLTRB(15, 21, 25, 40),
"Left edge, bottom-biased");
2714 non_reducing(
IRect::MakeLTRB(25, 15, 35, 45),
"Vertical interior slice");
2715 non_reducing(
IRect::MakeLTRB(15, 25, 45, 35),
"Horizontal interior slice");
2726 "Slice off bottom");
2732 non_reducing(
IRect::MakeLTRB(21, 21, 39, 39),
"Contained, non-covering");
2735 emptying(cull_rect,
"Perfectly covering");
2898TEST(RectTest, TransformAndClipBounds) {
2903 2.0f, 0.0f, 0.0f, 0.0f,
2904 0.0f, 4.0f, 0.0f, 0.0f,
2905 0.0f, 0.0f, 1.0f, 0.0f,
2906 0.0f, 0.0f, 0.0f, 8.0f
2911 EXPECT_EQ(matrix.TransformHomogenous(src.GetLeftTop()),
2912 Vector3(200.0f, 400.0f, 8.0f));
2913 EXPECT_EQ(matrix.TransformHomogenous(src.GetRightTop()),
2914 Vector3(400.0f, 400.0f, 8.0f));
2915 EXPECT_EQ(matrix.TransformHomogenous(src.GetLeftBottom()),
2916 Vector3(200.0f, 800.0f, 8.0f));
2917 EXPECT_EQ(matrix.TransformHomogenous(src.GetRightBottom()),
2918 Vector3(400.0f, 800.0f, 8.0f));
2921 EXPECT_FALSE(src.TransformAndClipBounds(matrix).IsEmpty());
2922 EXPECT_EQ(src.TransformAndClipBounds(matrix), expect);
2929 2.0f, 0.0f, 0.0f, -0.01f,
2930 0.0f, 2.0f, 0.0f, -0.006f,
2931 0.0f, 0.0f, 1.0f, 0.0f,
2932 0.0f, 0.0f, 0.0f, 3.0f
2938 Vector3(200.0f, 200.0f, 1.4f));
2940 Vector3(400.0f, 200.0f, 0.4f));
2942 Vector3(200.0f, 400.0f, 0.8f));
2944 Vector3(400.0f, 400.0f, -0.2f));
2947 EXPECT_FALSE(src.TransformAndClipBounds(matrix).IsEmpty());
2955 2.0f, 0.0f, 0.0f, -.015f,
2956 0.0f, 2.0f, 0.0f, -.006f,
2957 0.0f, 0.0f, 1.0f, 0.0f,
2958 0.0f, 0.0f, 0.0f, 3.0f
2964 Vector3(200.0f, 200.0f, 0.9f));
2966 Vector3(400.0f, 200.0f, -0.6f));
2968 Vector3(200.0f, 400.0f, 0.3f));
2970 Vector3(400.0f, 400.0f, -1.2f));
2973 EXPECT_FALSE(src.TransformAndClipBounds(matrix).IsEmpty());
2981 2.0f, 0.0f, 0.0f, -.02f,
2982 0.0f, 2.0f, 0.0f, -.006f,
2983 0.0f, 0.0f, 1.0f, 0.0f,
2984 0.0f, 0.0f, 0.0f, 3.0f
2990 Vector3(200.0f, 200.0f, 0.4f));
2992 Vector3(400.0f, 200.0f, -1.6f));
2994 Vector3(200.0f, 400.0f, -0.2f));
2996 Vector3(400.0f, 400.0f, -2.2f));
2999 EXPECT_FALSE(src.TransformAndClipBounds(matrix).IsEmpty());
3007 2.0f, 0.0f, 0.0f, -.025f,
3008 0.0f, 2.0f, 0.0f, -.006f,
3009 0.0f, 0.0f, 1.0f, 0.0f,
3010 0.0f, 0.0f, 0.0f, 3.0f
3016 Vector3(200.0f, 200.0f, -0.1f));
3018 Vector3(400.0f, 200.0f, -2.6f));
3020 Vector3(200.0f, 400.0f, -0.7f));
3022 Vector3(400.0f, 400.0f, -3.2f));
3024 EXPECT_TRUE(src.TransformAndClipBounds(matrix).IsEmpty());