15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2012 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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/region.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_INSIDE_RECT(r, x, y, w, h)                      \
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x, y)));                 \
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x + w - 1, y)));         \
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x, y + h - 1)));         \
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x + w - 1, y + h - 1))); \
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x, y + h / 2)));         \
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x + w - 1, y + h / 2))); \
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x + w / 2, y)));         \
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x + w / 2, y + h - 1))); \
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(x + w / 2, y + h / 2))); \
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_LEFT_OF_RECT(r, x, y, w, h)                  \
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x - 1, y)));         \
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x - 1, y + h - 1))); \
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_RIGHT_OF_RECT(r, x, y, w, h)                 \
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x + w, y)));         \
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x + w, y + h - 1))); \
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_TOP_OF_RECT(r, x, y, w, h)                   \
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x, y - 1)));         \
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x + w - 1, y - 1))); \
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_BOTTOM_OF_RECT(r, x, y, w, h)                \
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x, y + h)));         \
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(x + w - 1, y + h))); \
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, ContainsPoint) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(0, 0)));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(35, 35, 1, 1));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 35, 35, 1, 1);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 35, 35, 1, 1);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 35, 35, 1, 1);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_TOP_OF_RECT(r, 35, 35, 1, 1);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_BOTTOM_OF_RECT(r, 35, 35, 1, 1);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(30, 30, 10, 10));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 30, 30, 10, 10);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_BOTTOM_OF_RECT(r, 30, 30, 10, 10);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(31, 40, 10, 10));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(30, 40)));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(31, 40)));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(40, 39)));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(40, 40)));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 30, 30, 10, 10);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 31, 40, 10, 10);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 31, 40, 10, 10);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 31, 40, 10, 10);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_BOTTOM_OF_RECT(r, 31, 40, 10, 10);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(42, 40, 10, 10));
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 42, 40, 10, 10);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 42, 40, 10, 10);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 42, 40, 10, 10);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_TOP_OF_RECT(r, 42, 40, 10, 10);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_BOTTOM_OF_RECT(r, 42, 40, 10, 10);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 30, 30, 10, 10);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INSIDE_RECT(r, 31, 40, 10, 10);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_LEFT_OF_RECT(r, 31, 40, 10, 10);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_RIGHT_OF_RECT(r, 31, 40, 10, 10);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_BOTTOM_OF_RECT(r, 31, 40, 10, 10);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, EmptySpan) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(5, 0, 10, 10));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 5, 10, 10));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Subtract(gfx::Rect(7, 7, 10, 0));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (Region::Iterator it(r); it.has_rect(); it.next())
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(it.rect().IsEmpty());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_NO_INTERSECT(a, b) {  \
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region ar = a;                   \
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region br = b;                   \
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ar.Intersects(br)); \
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(br.Intersects(ar)); \
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ar.Intersects(b));  \
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(br.Intersects(a));  \
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_INTERSECT(a, b) {    \
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region ar = a;                  \
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region br = b;                  \
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ar.Intersects(br)); \
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(br.Intersects(ar)); \
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ar.Intersects(b));  \
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(br.Intersects(a));  \
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, IntersectsRegion) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(gfx::Rect(), gfx::Rect());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(gfx::Rect(), gfx::Rect(0, 0, 1, 1));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(gfx::Rect(), gfx::Rect(1, 1, 1, 1));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(gfx::Rect(-1, -1, 2, 2), gfx::Rect());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 0, 1, 1));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(r, gfx::Rect());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 0, 1, 1));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 0, 2, 2));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(-1, 0, 2, 2));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(-1, -1, 2, 2));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, -1, 2, 2));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(-1, -1, 3, 3));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 0, 3, 3));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(10, 0, 3, 3));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 10, 13, 3));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(r, gfx::Rect());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(1, 1, 1, 1));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 0, 2, 2));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(1, 0, 2, 2));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(1, 1, 2, 2));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 1, 2, 2));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 0, 3, 3));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(-1, -1, 2, 2));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(2, -1, 2, 2));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(2, 2, 2, 2));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(-1, 2, 2, 2));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(11, 1, 1, 1));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(10, 0, 2, 2));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(11, 0, 2, 2));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(11, 1, 2, 2));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(10, 1, 2, 2));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(10, 0, 3, 3));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(9, -1, 2, 2));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(12, -1, 2, 2));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(12, 2, 2, 2));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(9, 2, 2, 2));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, -1, 13, 5));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(1, -1, 11, 5));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(2, -1, 9, 5));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(2, -1, 8, 5));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(3, -1, 8, 5));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(r, gfx::Rect(3, -1, 7, 5));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 1, 13, 1));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(1, 1, 11, 1));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(2, 1, 9, 1));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(2, 1, 8, 1));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(3, 1, 8, 1));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(r, gfx::Rect(3, 1, 7, 1));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 0, 13, 13));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 1, 13, 11));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 2, 13, 9));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 2, 13, 8));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_INTERSECT(r, gfx::Rect(0, 3, 13, 8));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(r, gfx::Rect(0, 3, 13, 7));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, ReadPastFullSpanVectorInIntersectsTest) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This region has enough spans to fill its allocated Vector exactly.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(400, 300, 1, 800));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(785, 585, 1, 1));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(787, 585, 1, 1));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 587, 16, 162));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(26, 590, 300, 150));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(196, 750, 1, 1));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 766, 1, 1));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 782, 1, 1));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(745, 798, 1, 1));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(795, 882, 10, 585));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(100, 1499, 586, 1));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(100, 1500, 585, 784));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This query rect goes past the bottom of the Region, causing the
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test to reach the last span and try go past it. It should not read
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // memory off the end of the span Vector.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_INTERSECT(r, gfx::Rect(0, 2184, 1, 150));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_NO_CONTAINS(a, b)                  \
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {                                             \
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Region ar = a;                              \
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Region br = b;                              \
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ar.Contains(br));              \
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ar.Contains(b));               \
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_CONTAINS(a, b)                     \
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {                                             \
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Region ar = a;                              \
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Region br = b;                              \
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ar.Contains(br));               \
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ar.Contains(b));                \
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, ContainsRegion) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(gfx::Rect(), gfx::Rect());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(gfx::Rect(0, 0, 1, 1), gfx::Rect());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(), gfx::Rect(0, 0, 1, 1));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(), gfx::Rect(1, 1, 1, 1));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(11, 10, 1, 1));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 11, 1, 1));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 10, 1, 1));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 9, 1, 1));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 9, 2, 2));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 9, 2, 2));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 10, 2, 2));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 10, 2, 2));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 9, 3, 3));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Region h_lines;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 10; i < 20; i += 2)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    h_lines.Union(gfx::Rect(i, 10, 1, 10));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_CONTAINS(gfx::Rect(10, 10, 9, 10), h_lines);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 9, 9), h_lines);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 11, 9, 9), h_lines);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 8, 10), h_lines);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(11, 10, 8, 10), h_lines);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Region v_lines;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 10; i < 20; i += 2)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    v_lines.Union(gfx::Rect(10, i, 10, 1));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_CONTAINS(gfx::Rect(10, 10, 10, 9), v_lines);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 9, 9), v_lines);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(11, 10, 9, 9), v_lines);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 10, 8), v_lines);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 11, 10, 8), v_lines);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region grid;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 10; i < 20; i += 2)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 10; j < 20; j += 2)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      grid.Union(gfx::Rect(i, j, 1, 1));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(gfx::Rect(10, 10, 9, 9), grid);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 9, 8), grid);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 11, 9, 8), grid);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(10, 10, 8, 9), grid);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(gfx::Rect(11, 10, 8, 9), grid);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_CONTAINS(h_lines, h_lines);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_CONTAINS(v_lines, v_lines);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(v_lines, h_lines);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(h_lines, v_lines);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(grid, grid);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_CONTAINS(h_lines, grid);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_CONTAINS(v_lines, grid);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(grid, h_lines);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TEST_NO_CONTAINS(grid, v_lines);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 10; i < 20; i += 2)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TEST_CONTAINS(h_lines, gfx::Rect(i, 10, 1, 10));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 10; i < 20; i += 2)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TEST_CONTAINS(v_lines, gfx::Rect(10, i, 10, 1));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 10; i < 20; i += 2)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 10; j < 20; j += 2)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TEST_CONTAINS(grid, gfx::Rect(i, j, 1, 1));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region container;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 40, 20));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 20, 41, 20));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 10, 10));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 30, 10, 10));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 30, 10, 10));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 0, 10, 10));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 10, 10));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 30, 10, 10));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 0, 10, 40));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 0, 10, 10));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 30, 10, 10));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 10, 40));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 10, 40));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 0, 10, 40));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 40, 40));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(10, -1, 20, 10));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 40, 40));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(10, 31, 20, 10));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 40, 20));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 20, 41, 20));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(-1, 10, 10, 20));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 40, 20));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 20, 41, 20));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(31, 10, 10, 20));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 40, 40));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Subtract(gfx::Rect(0, 20, 60, 0));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(31, 10, 10, 20));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 0, 60, 20));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 20, 10, 20));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 39));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 40));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 41));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(29, 0, 10, 39));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(container, gfx::Rect(30, 0, 10, 40));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(31, 0, 10, 41));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(49, 0, 10, 39));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(50, 0, 10, 40));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(51, 0, 10, 41));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Clear();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(30, 0, 10, 20));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container.Union(gfx::Rect(0, 20, 60, 20));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 39));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 40));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 41));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(29, 0, 10, 39));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_CONTAINS(container, gfx::Rect(30, 0, 10, 40));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(31, 0, 10, 41));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(49, 0, 10, 39));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(50, 0, 10, 40));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEST_NO_CONTAINS(container, gfx::Rect(51, 0, 10, 41));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, Union) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r2;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A rect uniting a contained rect does not change the region.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r2 = r = gfx::Rect(0, 0, 50, 50);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r2.Union(gfx::Rect(20, 20, 10, 10));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r, r2);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A rect uniting a containing rect gives back the containing rect.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r = gfx::Rect(0, 0, 50, 50);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 0, 100, 100));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Region(gfx::Rect(0, 0, 100, 100)), r);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A complex region uniting a contained rect does not change the region.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r = gfx::Rect(0, 0, 50, 50);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(100, 0, 50, 50));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r2 = r;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r2.Union(gfx::Rect(20, 20, 10, 10));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r, r2);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A complex region uniting a containing rect gives back the containing rect.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r = gfx::Rect(0, 0, 50, 50);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(100, 0, 50, 50));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 0, 500, 500));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Region(gfx::Rect(0, 0, 500, 500)), r);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, IsEmpty) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region().IsEmpty());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region(gfx::Rect()).IsEmpty());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region(Region()).IsEmpty());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region(gfx::Rect(10, 10, 10, 0)).IsEmpty());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region(gfx::Rect(10, 10, 0, 10)).IsEmpty());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region(gfx::Rect(-10, 10, 10, 0)).IsEmpty());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Region(gfx::Rect(-10, 10, 0, 10)).IsEmpty());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Region(gfx::Rect(-1, -1, 1, 1)).IsEmpty());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Region(gfx::Rect(0, 0, 1, 1)).IsEmpty());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Region(gfx::Rect(0, 0, 2, 2)).IsEmpty());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SkIRect::MakeXYWH(10, 10, 10, 0).isEmpty());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SkIRect::MakeXYWH(10, 10, 0, 10).isEmpty());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SkIRect::MakeXYWH(-10, 10, 10, 0).isEmpty());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SkIRect::MakeXYWH(-10, 10, 0, 10).isEmpty());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SkIRect::MakeXYWH(-1, -1, 1, 1).isEmpty());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SkIRect::MakeXYWH(0, 0, 1, 1).isEmpty());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SkIRect::MakeXYWH(0, 0, 2, 2).isEmpty());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionTest, Clear) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r = gfx::Rect(0, 0, 50, 50);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.IsEmpty());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Clear();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.IsEmpty());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r = gfx::Rect(0, 0, 50, 50);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(100, 0, 50, 50));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Union(gfx::Rect(0, 0, 500, 500));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(r.IsEmpty());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Clear();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.IsEmpty());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RegionSwap, Swap) {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Region r1, r2, r3;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1 = gfx::Rect(0, 0, 50, 50);
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  r1.Swap(&r2);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r1.IsEmpty());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r2.ToString(), Region(gfx::Rect(0, 0, 50, 50)).ToString());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1 = gfx::Rect(0, 0, 50, 50);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1.Union(gfx::Rect(100, 0, 50, 50));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1.Union(gfx::Rect(0, 0, 500, 500));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r3 = r1;
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  r1.Swap(&r2);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r1.ToString(), Region(gfx::Rect(0, 0, 50, 50)).ToString());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r2.ToString(), r3.ToString());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace cc
455