15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <limits> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/rect.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/rect_conversions.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/test/gfx_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <windows.h> 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Contains) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct ContainsCase { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rect_x; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rect_y; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rect_width; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rect_height; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int point_x; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int point_y; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool contained; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } contains_cases[] = { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, 0, 0, true}, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, 5, 5, true}, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, 9, 9, true}, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, 5, 10, false}, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, 10, 5, false}, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, -1, -1, false}, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, 10, 10, 50, 50, false}, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0, 0, -10, -10, 0, 0, false}, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(contains_cases); ++i) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContainsCase& value = contains_cases[i]; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect rect(value.rect_x, value.rect_y, value.rect_width, value.rect_height); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.contained, rect.Contains(value.point_x, value.point_y)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Intersects) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x1; // rect 1 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y1; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w1; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h1; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // rect 2 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intersects; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0, 0, 0, 0, false }, 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) { 0, 0, 0, 0, -10, -10, 20, 20, false }, 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) { -10, 0, 0, 20, 0, -10, 20, 0, false }, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 10, 10, 0, 0, 10, 10, true }, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 10, 10, 10, 10, 10, 10, false }, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10, 10, 10, 0, 0, 10, 10, false }, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10, 10, 10, 5, 5, 10, 10, true }, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10, 10, 10, 15, 15, 10, 10, true }, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10, 10, 10, 20, 15, 10, 10, false }, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10, 10, 10, 21, 15, 10, 10, false } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].intersects, r1.Intersects(r2)); 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(tests[i].intersects, r2.Intersects(r1)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Intersect) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x1; // rect 1 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y1; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w1; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h1; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // rect 2 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x3; // rect 3: the union of rects 1 and 2 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y3; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w3; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h3; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, // zeros 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 }, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, // equal 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4 }, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, // neighboring 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, 4, 4, 4, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 }, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, // overlapping corners 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, 4, 4, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, 2, 2 }, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, // T junction 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 1, 4, 2, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 1, 1, 2 }, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 0, 2, 2, // gap 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 2, 2, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r3(tests[i].x3, tests[i].y3, tests[i].w3, tests[i].h3); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect ir = IntersectRects(r1, r2); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.x(), ir.x()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.y(), ir.y()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.width(), ir.width()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.height(), ir.height()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Union) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct Test { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x1; // rect 1 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y1; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w1; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h1; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // rect 2 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x3; // rect 3: the union of rects 1 and 2 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y3; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w3; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h3; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 }, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4 }, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, 4, 4, 4, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 8, 8 }, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 4, 4, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 5, 4, 4, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 9 }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 2, 2, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 3, 2, 2, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 5, 5 }, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 3, 2, 2, // reverse r1 and r2 from previous test 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 2, 2, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 5, 5 }, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, // union with empty rect 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, 2, 2, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, 2, 2 } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r3(tests[i].x3, tests[i].y3, tests[i].w3, tests[i].h3); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect u = UnionRects(r1, r2); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.x(), u.x()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.y(), u.y()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.width(), u.width()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.height(), u.height()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Equals) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Rect(0, 0, 0, 0) == Rect(0, 0, 0, 0)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Rect(1, 2, 3, 4) == Rect(1, 2, 3, 4)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(0, 0, 0, 1)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(0, 0, 1, 0)); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(0, 1, 0, 0)); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(Rect(0, 0, 0, 0) == Rect(1, 0, 0, 0)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, AdjustToFit) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct Test { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x1; // source 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y1; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w1; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h1; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // target 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x3; // rect 3: results of invoking AdjustToFit 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y3; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w3; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h3; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 2, 2, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 2, 2, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 2, 2 }, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 2, 3, 3, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 1, 3, 3 }, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, 5, 5, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4, 4 }, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 2, 4, 4, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 3, 3, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 3, 3 }, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 2, 1, 1, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 3, 3, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, 1, 1 } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r3(tests[i].x3, tests[i].y3, tests[i].w3, tests[i].h3); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect u = r1; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u.AdjustToFit(r2); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.x(), u.x()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.y(), u.y()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.width(), u.width()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r3.height(), u.height()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Subtract) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect result; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Matching 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(10, 10, 20, 20)); 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(0, 0, 0, 0), result); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Contains 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(5, 5, 30, 30)); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(0, 0, 0, 0), result); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No intersection 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(30, 30, 30, 30)); 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 20, 20), result); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not a complete intersection in either direction 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(15, 15, 20, 20)); 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 20, 20), result); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the x-direction, top edge is fully covered. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(10, 15, 20, 20)); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 20, 5), result); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the x-direction, top edge is fully covered. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(5, 15, 30, 20)); 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 20, 5), result); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the x-direction, bottom edge is fully covered. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(5, 5, 30, 20)); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 25, 20, 5), result); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the x-direction, none of the edges is fully 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // covered. 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result = Rect(10, 10, 20, 20); 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.Subtract(Rect(5, 15, 30, 1)); 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 20, 20), result); 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the y-direction, left edge is fully covered. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(10, 10, 10, 30)); 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(20, 10, 10, 20), result); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the y-direction, left edge is fully covered. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = Rect(10, 10, 20, 20); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Subtract(Rect(5, 5, 20, 30)); 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(25, 10, 5, 20), result); 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the y-direction, right edge is fully covered. 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result = Rect(10, 10, 20, 20); 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.Subtract(Rect(20, 5, 20, 30)); 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 10, 20), result); 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Complete intersection in the y-direction, none of the edges is fully 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // covered. 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result = Rect(10, 10, 20, 20); 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.Subtract(Rect(15, 5, 1, 30)); 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(10, 10, 20, 20), result); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, IsEmpty) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Rect(0, 0, 0, 0).IsEmpty()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Rect(0, 0, 0, 0).size().IsEmpty()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Rect(0, 0, 10, 0).IsEmpty()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Rect(0, 0, 10, 0).size().IsEmpty()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Rect(0, 0, 0, 10).IsEmpty()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Rect(0, 0, 0, 10).size().IsEmpty()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Rect(0, 0, 10, 10).IsEmpty()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Rect(0, 0, 10, 10).size().IsEmpty()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, SplitVertically) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect left_half, right_half; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Splitting when origin is (0, 0). 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect(0, 0, 20, 20).SplitVertically(&left_half, &right_half); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(left_half == Rect(0, 0, 10, 20)); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(right_half == Rect(10, 0, 10, 20)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Splitting when origin is arbitrary. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect(10, 10, 20, 10).SplitVertically(&left_half, &right_half); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(left_half == Rect(10, 10, 10, 10)); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(right_half == Rect(20, 10, 10, 10)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Splitting a rectangle of zero width. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect(10, 10, 0, 10).SplitVertically(&left_half, &right_half); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(left_half == Rect(10, 10, 0, 10)); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(right_half == Rect(10, 10, 0, 10)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Splitting a rectangle of odd width. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect(10, 10, 5, 10).SplitVertically(&left_half, &right_half); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(left_half == Rect(10, 10, 2, 10)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(right_half == Rect(12, 10, 3, 10)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, CenterPoint) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Point center; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When origin is (0, 0). 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(0, 0, 20, 20).CenterPoint(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(10, 10)); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When origin is even. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(10, 10, 20, 20).CenterPoint(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(20, 20)); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When origin is odd. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(11, 11, 20, 20).CenterPoint(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(21, 21)); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When 0 width or height. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(10, 10, 0, 20).CenterPoint(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(10, 20)); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(10, 10, 20, 0).CenterPoint(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(20, 10)); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When an odd size. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(10, 10, 21, 21).CenterPoint(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(20, 20)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When an odd size and position. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = Rect(11, 11, 21, 21).CenterPoint(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == Point(21, 21)); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, CenterPointF) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PointF center; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When origin is (0, 0). 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(0, 0, 20, 20).CenterPoint(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(10, 10)); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When origin is even. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(10, 10, 20, 20).CenterPoint(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(20, 20)); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When origin is odd. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(11, 11, 20, 20).CenterPoint(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(21, 21)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When 0 width or height. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(10, 10, 0, 20).CenterPoint(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(10, 20)); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(10, 10, 20, 0).CenterPoint(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(20, 10)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When an odd size. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(10, 10, 21, 21).CenterPoint(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(20.5f, 20.5f)); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When an odd size and position. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) center = RectF(11, 11, 21, 21).CenterPoint(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(center == PointF(21.5f, 21.5f)); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, SharesEdgeWith) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r(2, 3, 4, 5); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be non-overlapping 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(r)); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_above(2, 1, 4, 2); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_below(2, 8, 4, 2); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_left(0, 3, 2, 5); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_right(6, 3, 2, 5); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.SharesEdgeWith(just_above)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.SharesEdgeWith(just_below)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.SharesEdgeWith(just_left)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.SharesEdgeWith(just_right)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrong placement 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect same_height_no_edge(0, 0, 1, 5); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect same_width_no_edge(0, 0, 4, 1); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(same_height_no_edge)); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(same_width_no_edge)); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_above_no_edge(2, 1, 5, 2); // too wide 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_below_no_edge(2, 8, 3, 2); // too narrow 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_left_no_edge(0, 3, 2, 6); // too tall 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect just_right_no_edge(6, 3, 2, 4); // too short 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(just_above_no_edge)); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(just_below_no_edge)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(just_left_no_edge)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.SharesEdgeWith(just_right_no_edge)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Similar to EXPECT_FLOAT_EQ, but lets NaN equal NaN 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EXPECT_FLOAT_AND_NAN_EQ(a, b) \ 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { if (a == a || b == b) { EXPECT_FLOAT_EQ(a, b); } } 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, ScaleRect) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct Test { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x1; // source 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y1; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w1; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h1; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x2; // target 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float y2; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float w2; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float h2; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 3, 3, 3, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.5f, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4.5f, 4.5f, 4.5f, 4.5f }, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 3, 3, 3, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.0f, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.0f, 0.0f, 0.0f, 0.0f }, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 3, 3, 3, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN() }, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 3, 3, 3, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::numeric_limits<float>::max() } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF scaled = ScaleRect(r1, tests[i].scale); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.x(), scaled.x()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.y(), scaled.y()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.width(), scaled.width()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.height(), scaled.height()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, ToEnclosedRect) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct Test { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x1; // source 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float y1; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float w1; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float h1; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // target 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests [] = { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0.0f, 0.0f, 0.0f, 0.0f, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 }, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1.5f, -1.5f, 3.0f, 3.0f, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, -1, 2, 2 }, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1.5f, -1.5f, 3.5f, 3.5f, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, -1, 3, 3 }, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { std::numeric_limits<float>::max(), 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2.0f, 2.0f, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max(), 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max(), 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0 }, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0.0f, 0.0f, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max(), 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max() }, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20000.5f, 20000.5f, 0.5f, 0.5f, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20001, 20001, 0, 0 }, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { std::numeric_limits<float>::quiet_NaN(), 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 } 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect enclosed = ToEnclosedRect(r1); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.x(), enclosed.x()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.y(), enclosed.y()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.width(), enclosed.width()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.height(), enclosed.height()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, ToEnclosingRect) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct Test { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x1; // source 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float y1; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float w1; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float h1; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // target 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests [] = { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0.0f, 0.0f, 0.0f, 0.0f, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 }, 53290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 5.5f, 5.5f, 0.0f, 0.0f, 53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5, 5, 0, 0 }, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1.5f, -1.5f, 3.0f, 3.0f, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -2, -2, 4, 4 }, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1.5f, -1.5f, 3.5f, 3.5f, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -2, -2, 4, 4 }, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { std::numeric_limits<float>::max(), 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2.0f, 2.0f, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max(), 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max(), 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0 }, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0.0f, 0.0f, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::max(), 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max(), 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<int>::max() }, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20000.5f, 20000.5f, 0.5f, 0.5f, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20000, 20000, 1, 1 }, 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { std::numeric_limits<float>::quiet_NaN(), 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<float>::quiet_NaN(), 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect enclosed = ToEnclosingRect(r1); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.x(), enclosed.x()); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.y(), enclosed.y()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.width(), enclosed.width()); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_AND_NAN_EQ(r2.height(), enclosed.height()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RectTest, ToNearestRect) { 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Rect rect; 573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(rect, ToNearestRect(RectF(rect))); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect = Rect(-1, -1, 3, 3); 576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(rect, ToNearestRect(RectF(rect))); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RectF rectf(-1.00001f, -0.999999f, 3.0000001f, 2.999999f); 579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(rect, ToNearestRect(rectf)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, ToFlooredRect) { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct Test { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x1; // source 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float y1; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float w1; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float h1; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x2; // target 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y2; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w2; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int h2; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests [] = { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0.0f, 0.0f, 0.0f, 0.0f, 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0 }, 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1.5f, -1.5f, 3.0f, 3.0f, 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -2, -2, 3, 3 }, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1.5f, -1.5f, 3.5f, 3.5f, 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -2, -2, 3, 3 }, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20000.5f, 20000.5f, 0.5f, 0.5f, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20000, 20000, 0, 0 }, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect floored = ToFlooredRectDeprecated(r1); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(r2.x(), floored.x()); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(r2.y(), floored.y()); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(r2.width(), floored.width()); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(r2.height(), floored.height()); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(RectTest, ScaleToEnclosedRect) { 61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static const struct Test { 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect input_rect; 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) float input_scale; 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect expected_rect; 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } tests[] = { 62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(), 62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(), 62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, 1, 1, 1), 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(5, 5, 5, 5), 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, -1, 0, 0), 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-5, -5, 0, 0), 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, -1, 0, 1), 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(5, -5, 0, 5), 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, 1, 1, 0), 63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-5, 5, 5, 0), 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, 2, 3, 4), 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1.5f, 64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(2, 3, 4, 6), 64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, -2, 0, 0), 64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1.5f, 64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, -3, 0, 0), 64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect result = ScaleToEnclosedRect(tests[i].input_rect, 65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tests[i].input_scale); 655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(tests[i].expected_rect, result); 65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 65890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(RectTest, ScaleToEnclosingRect) { 66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static const struct Test { 66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect input_rect; 66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) float input_scale; 66390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect expected_rect; 66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } tests[] = { 66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(), 66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(), 66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, 1, 1, 1), 67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(5, 5, 5, 5), 67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, -1, 0, 0), 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-5, -5, 0, 0), 67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, -1, 0, 1), 67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(5, -5, 0, 5), 68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, 1, 1, 0), 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5.f, 68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-5, 5, 5, 0), 68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, 2, 3, 4), 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1.5f, 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(1, 3, 5, 6), 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, { 69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-1, -2, 0, 0), 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1.5f, 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect(-2, -3, 0, 0), 69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rect result = ScaleToEnclosingRect(tests[i].input_rect, 69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tests[i].input_scale); 699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(tests[i].expected_rect, result); 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, ConstructAndAssign) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RECT rect_1 = { 0, 0, 10, 10 }; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RECT rect_2 = { 0, 0, -10, -10 }; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect test1(rect_1); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect test2(rect_2); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, ToRectF) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that implicit conversion from integer to float compiles. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect a(10, 20, 30, 40); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF b(10, 20, 30, 40); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF intersect = IntersectRects(a, b); 718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(b, intersect); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(a, b); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(b, a); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, BoundingRect) { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Point a; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Point b; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect expected; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } int_tests[] = { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If point B dominates A, then A should be the origin. 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0) }, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 6), Point(8, 6), Rect(4, 6, 4, 0) }, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 6), Point(4, 9), Rect(4, 6, 0, 3) }, 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 6), Point(8, 9), Rect(4, 6, 4, 3) }, 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If point A dominates B, then B should be the origin. 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0) }, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(8, 6), Point(4, 6), Rect(4, 6, 4, 0) }, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 9), Point(4, 6), Rect(4, 6, 0, 3) }, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(8, 9), Point(4, 6), Rect(4, 6, 4, 3) }, 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If neither point dominates, then the origin is a combination of the two. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(4, 6), Point(6, 4), Rect(4, 4, 2, 2) }, 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(-4, -6), Point(-6, -4), Rect(-6, -6, 2, 2) }, 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Point(-4, 6), Point(6, -4), Rect(-4, -4, 10, 10) }, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(int_tests); ++i) { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect actual = BoundingRect(int_tests[i].a, int_tests[i].b); 748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(int_tests[i].expected, actual); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PointF a; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PointF b; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF expected; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } float_tests[] = { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If point B dominates A, then A should be the origin. 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 6.8f), PointF(4.2f, 6.8f), 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 0, 0) }, 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 6.8f), PointF(8.5f, 6.8f), 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 4.3f, 0) }, 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 6.8f), PointF(4.2f, 9.3f), 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 0, 2.5f) }, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 6.8f), PointF(8.5f, 9.3f), 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 4.3f, 2.5f) }, 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If point A dominates B, then B should be the origin. 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 6.8f), PointF(4.2f, 6.8f), 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 0, 0) }, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(8.5f, 6.8f), PointF(4.2f, 6.8f), 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 4.3f, 0) }, 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 9.3f), PointF(4.2f, 6.8f), 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 0, 2.5f) }, 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(8.5f, 9.3f), PointF(4.2f, 6.8f), 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 6.8f, 4.3f, 2.5f) }, 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If neither point dominates, then the origin is a combination of the two. 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(4.2f, 6.8f), PointF(6.8f, 4.2f), 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(4.2f, 4.2f, 2.6f, 2.6f) }, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(-4.2f, -6.8f), PointF(-6.8f, -4.2f), 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(-6.8f, -6.8f, 2.6f, 2.6f) }, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PointF(-4.2f, 6.8f), PointF(6.8f, -4.2f), 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF(-4.2f, -4.2f, 11.0f, 11.0f) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i) { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF actual = BoundingRect(float_tests[i].a, float_tests[i].b); 785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_RECTF_EQ(float_tests[i].expected, actual); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, IsExpressibleAsRect) { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RectF().IsExpressibleAsRect()); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float min = std::numeric_limits<int>::min(); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float max = std::numeric_limits<int>::max(); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float infinity = std::numeric_limits<float>::infinity(); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RectF( 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min + 200, min + 200, max - 200, max - 200).IsExpressibleAsRect()); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min - 200, min + 200, max + 200, max + 200).IsExpressibleAsRect()); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF( 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min + 200 , min - 200, max + 200, max + 200).IsExpressibleAsRect()); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF( 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min + 200, min + 200, max + 200, max - 200).IsExpressibleAsRect()); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF( 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min + 200, min + 200, max - 200, max + 200).IsExpressibleAsRect()); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(RectF(0, 0, max - 200, max - 200).IsExpressibleAsRect()); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(200, 0, max + 200, max - 200).IsExpressibleAsRect()); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(0, 200, max - 200, max + 200).IsExpressibleAsRect()); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(0, 0, max + 200, max - 200).IsExpressibleAsRect()); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(0, 0, max - 200, max + 200).IsExpressibleAsRect()); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(infinity, 0, 1, 1).IsExpressibleAsRect()); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(0, infinity, 1, 1).IsExpressibleAsRect()); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(0, 0, infinity, 1).IsExpressibleAsRect()); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(RectF(0, 0, 1, infinity).IsExpressibleAsRect()); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RectTest, Offset) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rect i(1, 2, 3, 4); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(2, 1, 3, 4), (i + Vector2d(1, -1))); 823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(2, 1, 3, 4), (Vector2d(1, -1) + i)); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += Vector2d(1, -1); 825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(2, 1, 3, 4), i); 826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(1, 2, 3, 4), (i - Vector2d(1, -1))); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i -= Vector2d(1, -1); 828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Rect(1, 2, 3, 4), i); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RectF f(1.1f, 2.2f, 3.3f, 4.4f); 831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f), (f + Vector2dF(1.1f, -1.1f))); 832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f), (Vector2dF(1.1f, -1.1f) + f)); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f += Vector2dF(1.1f, -1.1f); 834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(RectF(2.2f, 1.1f, 3.3f, 4.4f), f); 835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(RectF(1.1f, 2.2f, 3.3f, 4.4f), (f - Vector2dF(1.1f, -1.1f))); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f -= Vector2dF(1.1f, -1.1f); 837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(RectF(1.1f, 2.2f, 3.3f, 4.4f), f); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RectTest, Corners) { 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Rect i(1, 2, 3, 4); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RectF f(1.1f, 2.1f, 3.1f, 4.1f); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Point(1, 2), i.origin()); 845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Point(4, 2), i.top_right()); 846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Point(1, 6), i.bottom_left()); 847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(Point(4, 6), i.bottom_right()); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(PointF(1.1f, 2.1f), f.origin()); 850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(PointF(4.2f, 2.1f), f.top_right()); 851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(PointF(1.1f, 6.2f), f.bottom_left()); 852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(PointF(4.2f, 6.2f), f.bottom_right()); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST(RectTest, ManhattanDistanceToPoint) { 85668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Rect i(1, 2, 3, 4); 85768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0, i.ManhattanDistanceToPoint(Point(1, 2))); 85868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0, i.ManhattanDistanceToPoint(Point(4, 6))); 85968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0, i.ManhattanDistanceToPoint(Point(2, 4))); 86068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(3, i.ManhattanDistanceToPoint(Point(0, 0))); 86168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(2, i.ManhattanDistanceToPoint(Point(2, 0))); 86268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(3, i.ManhattanDistanceToPoint(Point(5, 0))); 86368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1, i.ManhattanDistanceToPoint(Point(5, 4))); 86468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(3, i.ManhattanDistanceToPoint(Point(5, 8))); 86568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(2, i.ManhattanDistanceToPoint(Point(3, 8))); 86668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(2, i.ManhattanDistanceToPoint(Point(0, 7))); 86768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1, i.ManhattanDistanceToPoint(Point(0, 3))); 86868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 86968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RectF f(1.1f, 2.1f, 3.1f, 4.1f); 87068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(1.1f, 2.1f))); 87168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(4.2f, 6.f))); 87268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(0.f, f.ManhattanDistanceToPoint(PointF(2.f, 4.f))); 87368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(3.2f, f.ManhattanDistanceToPoint(PointF(0.f, 0.f))); 87468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(2.1f, f.ManhattanDistanceToPoint(PointF(2.f, 0.f))); 87568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(2.9f, f.ManhattanDistanceToPoint(PointF(5.f, 0.f))); 87668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(.8f, f.ManhattanDistanceToPoint(PointF(5.f, 4.f))); 87768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(2.6f, f.ManhattanDistanceToPoint(PointF(5.f, 8.f))); 87868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(1.8f, f.ManhattanDistanceToPoint(PointF(3.f, 8.f))); 87968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(1.9f, f.ManhattanDistanceToPoint(PointF(0.f, 7.f))); 88068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FLOAT_EQ(1.1f, f.ManhattanDistanceToPoint(PointF(0.f, 3.f))); 88168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 88268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST(RectTest, ManhattanInternalDistance) { 884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Rect i(0, 0, 400, 400); 885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, i.ManhattanInternalDistance(gfx::Rect(-1, 0, 2, 1))); 886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1, i.ManhattanInternalDistance(gfx::Rect(400, 0, 1, 400))); 887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(2, i.ManhattanInternalDistance(gfx::Rect(-100, -100, 100, 100))); 888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(2, i.ManhattanInternalDistance(gfx::Rect(-101, 100, 100, 100))); 889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(4, i.ManhattanInternalDistance(gfx::Rect(-101, -101, 100, 100))); 890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(435, i.ManhattanInternalDistance(gfx::Rect(630, 603, 100, 100))); 891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RectF f(0.0f, 0.0f, 400.0f, 400.0f); 893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static const float kEpsilon = std::numeric_limits<float>::epsilon(); 894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0.0f, f.ManhattanInternalDistance(gfx::RectF(-1.0f, 0.0f, 2.0f, 1.0f))); 897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kEpsilon, 899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance(gfx::RectF(400.0f, 0.0f, 1.0f, 400.0f))); 900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ(2.0f * kEpsilon, 901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance( 902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::RectF(-100.0f, -100.0f, 100.0f, 100.0f))); 903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 904a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1.0f + kEpsilon, 905a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance(gfx::RectF(-101.0f, 100.0f, 100.0f, 100.0f))); 906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ(2.0f + 2.0f * kEpsilon, 907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance( 908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::RectF(-101.0f, -101.0f, 100.0f, 100.0f))); 909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 433.0f + 2.0f * kEpsilon, 911a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance(gfx::RectF(630.0f, 603.0f, 100.0f, 100.0f))); 912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0.0f, f.ManhattanInternalDistance(gfx::RectF(-1.0f, 0.0f, 1.1f, 1.0f))); 915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0.1f + kEpsilon, 917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance(gfx::RectF(-1.5f, 0.0f, 1.4f, 1.0f))); 918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FLOAT_EQ( 919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kEpsilon, 920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) f.ManhattanInternalDistance(gfx::RectF(-1.5f, 0.0f, 1.5f, 1.0f))); 921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gfx 924