103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/base/simple_enclosed_region.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <algorithm>
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <vector>
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/logging.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/base/region.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace cc {
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ExpectRegionEq(const gfx::Rect& rect, const SimpleEnclosedRegion& region) {
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<gfx::Rect> actual_rects;
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<gfx::Rect> expected_rects;
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!rect.IsEmpty())
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    expected_rects.push_back(rect);
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < region.GetRegionComplexity(); ++i)
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    actual_rects.push_back(region.GetRect(i));
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (rect.IsEmpty() != region.IsEmpty()) {
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LOG(ERROR) << "Expected: " << rect.IsEmpty()
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               << " Actual: " << region.IsEmpty();
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return false;
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (expected_rects.size() != actual_rects.size()) {
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LOG(ERROR) << "Expected: " << expected_rects.size()
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               << " Actual: " << actual_rects.size();
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return false;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::sort(actual_rects.begin(), actual_rects.end());
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::sort(expected_rects.begin(), expected_rects.end());
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < expected_rects.size(); ++i) {
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected_rects[i] != actual_rects[i]) {
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      LOG(ERROR) << "Expected: " << expected_rects[i].ToString()
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                 << " Actual: " << actual_rects[i].ToString();
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return false;
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return true;
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Create) {
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r1;
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r1.IsEmpty());
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(), r1));
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r2(gfx::Rect(2, 3, 4, 5));
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 4, 5), r2));
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r3(2, 3, 4, 5);
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 4, 5), r3));
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r4(4, 5);
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(4, 5), r4));
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r5(Region(gfx::Rect(2, 3, 4, 5)));
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 4, 5), r5));
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r6(r5);
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 4, 5), r6));
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Assign) {
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r;
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.IsEmpty());
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(2, 3, 4, 5);
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 4, 5), r));
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = SimpleEnclosedRegion(3, 4, 5, 6);
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(3, 4, 5, 6), r));
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Clear) {
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r(1, 2, 3, 4);
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.IsEmpty());
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Clear();
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.IsEmpty());
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, GetRegionComplexity) {
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion empty;
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(0u, empty.GetRegionComplexity());
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion stuff;
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  stuff.Union(gfx::Rect(1, 2, 3, 4));
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(1u, stuff.GetRegionComplexity());
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The SimpleEnclosedRegion only holds up to 1 rect.
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  stuff.Union(gfx::Rect(5, 6, 7, 8));
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(1u, stuff.GetRegionComplexity());
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Contains) {
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r(1, 2, 5, 6);
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(0, 2)));
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(1, 1)));
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(1, 2)));
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(6, 2)));
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(5, 1)));
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(5, 2)));
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(0, 7)));
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(1, 8)));
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(1, 7)));
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(6, 7)));
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Point(5, 8)));
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Point(5, 7)));
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(0, 2, 1, 1)));
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(1, 1, 1, 1)));
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Rect(1, 2, 1, 1)));
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(0, 1, 2, 2)));
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(6, 2, 1, 1)));
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(5, 1, 1, 1)));
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Rect(5, 2, 1, 1)));
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(5, 1, 2, 2)));
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(0, 7, 1, 1)));
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(1, 8, 1, 1)));
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Rect(1, 7, 1, 1)));
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(0, 7, 2, 2)));
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(6, 7, 1, 1)));
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(5, 8, 1, 1)));
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(gfx::Rect(5, 7, 1, 1)));
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(gfx::Rect(5, 7, 2, 2)));
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Rect q(1, 2, 5, 6);
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(q)) << q.ToString();
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 0, 0, 0);
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(q)) << q.ToString();
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, -1, 0, 0);
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(q)) << q.ToString();
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 1, -1, 0);
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(q)) << q.ToString();
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, 1, -1);
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(q)) << q.ToString();
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, 0, 0, 1);
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(q)) << q.ToString();
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 1, 0, 0);
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(q)) << q.ToString();
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, -1, 1, 0);
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(q)) << q.ToString();
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, -1, 1);
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(q)) << q.ToString();
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(0, 2, 1, 1)));
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(1, 1, 1, 1)));
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(1, 2, 1, 1)));
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(0, 1, 2, 2)));
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(6, 2, 1, 1)));
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(5, 1, 1, 1)));
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(5, 2, 1, 1)));
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(5, 1, 2, 2)));
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(0, 7, 1, 1)));
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(1, 8, 1, 1)));
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(1, 7, 1, 1)));
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(0, 7, 2, 2)));
17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(6, 7, 1, 1)));
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(5, 8, 1, 1)));
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(5, 7, 1, 1)));
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(5, 7, 2, 2)));
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q = gfx::Rect(1, 2, 5, 6);
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 0, 0, 0);
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, -1, 0, 0);
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 1, -1, 0);
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, 1, -1);
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, 0, 0, 1);
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 1, 0, 0);
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, -1, 1, 0);
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, -1, 1);
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Contains(SimpleEnclosedRegion(q))) << q.ToString();
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Intersects) {
20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r(1, 2, 5, 6);
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(0, 2, 1, 1)));
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(1, 1, 1, 1)));
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(1, 2, 1, 1)));
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(0, 1, 2, 2)));
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(6, 2, 1, 1)));
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(5, 1, 1, 1)));
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(5, 2, 1, 1)));
21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(5, 1, 2, 2)));
21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(0, 7, 1, 1)));
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(1, 8, 1, 1)));
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(1, 7, 1, 1)));
22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(0, 7, 2, 2)));
22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(6, 7, 1, 1)));
22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(gfx::Rect(5, 8, 1, 1)));
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(5, 7, 1, 1)));
22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(gfx::Rect(5, 7, 2, 2)));
22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Rect q(1, 2, 5, 6);
22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 0, 0, 0);
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, -1, 0, 0);
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 1, -1, 0);
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, 1, -1);
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, 0, 0, 1);
24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 1, 0, 0);
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, -1, 1, 0);
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, -1, 1);
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(q)) << q.ToString();
24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(0, 2, 1, 1)));
24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(1, 1, 1, 1)));
25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(1, 2, 1, 1)));
25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(0, 1, 2, 2)));
25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(6, 2, 1, 1)));
25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(5, 1, 1, 1)));
25503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(5, 2, 1, 1)));
25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(5, 1, 2, 2)));
25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(0, 7, 1, 1)));
25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(1, 8, 1, 1)));
26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(1, 7, 1, 1)));
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(0, 7, 2, 2)));
26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(6, 7, 1, 1)));
26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Intersects(SimpleEnclosedRegion(5, 8, 1, 1)));
26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(5, 7, 1, 1)));
26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(5, 7, 2, 2)));
26703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
26803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q = gfx::Rect(1, 2, 5, 6);
26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 0, 0, 0);
27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
27203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, -1, 0, 0);
27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
27403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 1, -1, 0);
27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
27603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, 1, -1);
27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(1, 0, 0, 1);
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(-1, 1, 0, 0);
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, -1, 1, 0);
28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  q.Inset(0, 0, -1, 1);
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Intersects(SimpleEnclosedRegion(q))) << q.ToString();
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Equals) {
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r(1, 2, 3, 4);
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.Equals(SimpleEnclosedRegion(1, 2, 3, 4)));
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Equals(SimpleEnclosedRegion(2, 2, 3, 4)));
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Equals(SimpleEnclosedRegion(1, 3, 3, 4)));
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Equals(SimpleEnclosedRegion(1, 2, 4, 4)));
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Equals(SimpleEnclosedRegion(1, 2, 3, 5)));
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Equals(SimpleEnclosedRegion(2, 2, 2, 4)));
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(r.Equals(SimpleEnclosedRegion(1, 3, 3, 3)));
29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Bounds) {
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r;
30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(), r.bounds());
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(3, 4, 5, 6);
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(3, 4, 5, 6), r.bounds());
30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(1, 2, 12, 13));
30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(1, 2, 12, 13), r.bounds());
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, GetRect) {
31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r(3, 4, 5, 6);
31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(3, 4, 5, 6), r.GetRect(0));
31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(1, 2, 12, 13));
31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(1, 2, 12, 13), r.GetRect(0));
31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Union) {
31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r;
31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(), r));
31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Empty Union anything = anything.
32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(4, 5, 6, 7));
32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(4, 5, 6, 7), r));
32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Anything Union empty = anything.
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect());
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(4, 5, 6, 7), r));
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Anything Union contained rect = Anything.
32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(5, 6, 4, 5));
33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(4, 5, 6, 7), r));
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Anything Union containing rect = containing rect.
33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(2, 3, 8, 9));
33403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 8, 9), r));
33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(2, 3, 9, 10));
33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 9, 10), r));
33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Union with a smaller disjoint rect is ignored.
33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(20, 21, 9, 9));
34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 9, 10), r));
34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Union with a smaller overlapping rect is ignored.
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(3, 4, 9, 9));
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(2, 3, 9, 10), r));
34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Union with an equal sized rect can be either one.
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(4, 4, 9, 10));
34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(1u, r.GetRegionComplexity());
34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(r.bounds() == gfx::Rect(2, 3, 9, 10) ||
35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              r.bounds() == gfx::Rect(4, 4, 9, 10));
35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Union with a larger disjoint rect is taken.
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(20, 21, 12, 13));
35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(20, 21, 12, 13), r));
35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Union with a larger overlapping rect is taken.
35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(19, 19, 12, 14));
35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(19, 19, 12, 14), r));
35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
36003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // True also when the rect covers one edge of the existing region.
36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
36203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(12, 7, 9, 16));
36303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(12, 7, 9, 16), r));
36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
36503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
36603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(9, 7, 9, 16));
36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(9, 7, 9, 16), r));
36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(7, 12, 16, 9));
37103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(7, 12, 16, 9), r));
37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
37303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
37403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(7, 9, 16, 9));
37503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(7, 9, 16, 9), r));
37603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
37703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // But if the existing region can be expanded to make a larger rect, then it
37803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // will. Union area is 9*12 = 108. By merging, we make a rect with an area of
37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // 10*11 = 110. The resulting rect is expanded as far as possible while
38003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // remaining enclosed in the Union.
38103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
38203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(12, 9, 9, 12));
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 11, 10), r));
38403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
38603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(9, 9, 9, 12));
38703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(9, 10, 11, 10), r));
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(9, 12, 12, 9));
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 11), r));
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(9, 9, 12, 9));
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 9, 10, 11), r));
39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(12, 9, 9, 12);
39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(10, 10, 10, 10));
39903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 11, 10), r));
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(9, 9, 9, 12);
40203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(10, 10, 10, 10));
40303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(9, 10, 11, 10), r));
40403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(9, 12, 12, 9);
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(10, 10, 10, 10));
40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 11), r));
40803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
40903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(9, 9, 12, 9);
41003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Union(gfx::Rect(10, 10, 10, 10));
41103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 9, 10, 11), r));
41203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
41303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
41403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SimpleEnclosedRegionTest, Subtract) {
41503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SimpleEnclosedRegion r;
41603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(), r));
41703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
41803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Empty Subtract anything = empty.
41903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(4, 5, 6, 7));
42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(), r));
42103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
42203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Subtracting an enclosing rect = empty.
42303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
42403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 10, 10, 10));
42503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(), r));
42603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
42703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
42803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(9, 9, 12, 12));
42903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(), r));
43003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
43103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Subtracting a rect that covers one side of the region will shrink that
43203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // side.
43303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
43403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(18, 10, 10, 10));
43503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 8, 10), r));
43603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
43703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
43803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(18, 8, 10, 14));
43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 8, 10), r));
44003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
44103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
44203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 18, 10, 10));
44303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 8), r));
44403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
44503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
44603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(8, 18, 14, 10));
44703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 8), r));
44803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
44903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
45003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(2, 10, 10, 10));
45103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(12, 10, 8, 10), r));
45203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
45303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
45403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(2, 8, 10, 14));
45503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(12, 10, 8, 10), r));
45603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 2, 10, 10));
45903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 12, 10, 8), r));
46003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
46103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
46203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(8, 2, 14, 10));
46303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 12, 10, 8), r));
46403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
46503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Subtracting a rect that does not cover a full side will still shrink that
46603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // side.
46703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
46803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(18, 12, 10, 8));
46903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 8, 10), r));
47003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
47103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
47203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(18, 12, 10, 10));
47303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 8, 10), r));
47403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
47503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
47603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 18, 8, 10));
47703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 8), r));
47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
47903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
48003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 18, 10, 10));
48103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 8), r));
48203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
48303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
48403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(2, 12, 10, 8));
48503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(12, 10, 8, 10), r));
48603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
48703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
48803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(2, 12, 10, 10));
48903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(12, 10, 8, 10), r));
49003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
49103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
49203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 2, 8, 10));
49303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 12, 10, 8), r));
49403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
49503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
49603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 2, 10, 10));
49703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 12, 10, 8), r));
49803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
49903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Subtracting a rect inside the region will make it choose the larger result.
50003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
50103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(11, 11, 7, 8));
50203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(18, 10, 2, 10), r));
50303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
50403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
50503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(11, 11, 8, 7));
50603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 18, 10, 2), r));
50703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
50803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
50903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 11, 7, 8));
51003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 2, 10), r));
51103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
51203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
51303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(11, 12, 8, 7));
51403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 2), r));
51503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
51603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Subtracting a rect that cuts the region in two will choose the larger side.
51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Here it's the top side.
51803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
51903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 14, 10, 3));
52003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
52103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
52203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
52303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(0, 14, 30, 3));
52403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
52503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
52603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
52703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 14, 8, 3));
52803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
52903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
53003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
53103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(0, 14, 18, 3));
53203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
53303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
53403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
53503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 14, 18, 3));
53603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
53703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
53803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Here it's the bottom side.
53903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
54003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 13, 10, 3));
54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 16, 10, 4), r));
54203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
54303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
54403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(0, 13, 30, 3));
54503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 16, 10, 4), r));
54603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
54703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
54803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 13, 8, 3));
54903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 16, 10, 4), r));
55003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
55103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
55203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(0, 13, 18, 3));
55303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 16, 10, 4), r));
55403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
55503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
55603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(12, 13, 18, 3));
55703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 16, 10, 4), r));
55803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Here it's the left side.
56003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
56103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 10));
56203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
56303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
56403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
56503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 10));
56603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
56803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
56903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 10));
57003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
57103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
57203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
57303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 10));
57403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
57503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
57603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
57703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 10));
57803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
57903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
58003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Here it's the right side.
58103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
58203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(13, 10, 3, 10));
58303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(16, 10, 4, 10), r));
58403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
58503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
58603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(13, 10, 3, 10));
58703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(16, 10, 4, 10), r));
58803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
58903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
59003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(13, 10, 3, 10));
59103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(16, 10, 4, 10), r));
59203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
59303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
59403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(13, 10, 3, 10));
59503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(16, 10, 4, 10), r));
59603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
59703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
59803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(13, 10, 3, 10));
59903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(16, 10, 4, 10), r));
60003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
60103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Subtracting a rect that leaves three possible choices will choose the
60203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // larger.
60303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
60403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 14, 7, 3));
60503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
60603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
60703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
60803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(10, 14, 5, 3));
60903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(15, 10, 5, 10), r));
61003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
61103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
61203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(13, 14, 7, 3));
61303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 4), r));
61403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
61503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
61603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(15, 14, 5, 3));
61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 5, 10), r));
61803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
62003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 7));
62103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
62203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
62303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
62403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 10, 3, 5));
62503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 15, 10, 5), r));
62603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
62703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
62803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 13, 3, 7));
62903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 4, 10), r));
63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
63103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r = gfx::Rect(10, 10, 10, 10);
63203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  r.Subtract(gfx::Rect(14, 15, 3, 5));
63303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(ExpectRegionEq(gfx::Rect(10, 10, 10, 5), r));
63403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
63503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
63603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
63703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace cc
638