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