1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/base/region.h"
6
7#include "testing/gtest/include/gtest/gtest.h"
8
9namespace cc {
10namespace {
11
12#define TEST_INSIDE_RECT(r, x, y, w, h)                      \
13  EXPECT_TRUE(r.Contains(gfx::Point(x, y)));                 \
14  EXPECT_TRUE(r.Contains(gfx::Point(x + w - 1, y)));         \
15  EXPECT_TRUE(r.Contains(gfx::Point(x, y + h - 1)));         \
16  EXPECT_TRUE(r.Contains(gfx::Point(x + w - 1, y + h - 1))); \
17  EXPECT_TRUE(r.Contains(gfx::Point(x, y + h / 2)));         \
18  EXPECT_TRUE(r.Contains(gfx::Point(x + w - 1, y + h / 2))); \
19  EXPECT_TRUE(r.Contains(gfx::Point(x + w / 2, y)));         \
20  EXPECT_TRUE(r.Contains(gfx::Point(x + w / 2, y + h - 1))); \
21  EXPECT_TRUE(r.Contains(gfx::Point(x + w / 2, y + h / 2))); \
22
23#define TEST_LEFT_OF_RECT(r, x, y, w, h)                  \
24  EXPECT_FALSE(r.Contains(gfx::Point(x - 1, y)));         \
25  EXPECT_FALSE(r.Contains(gfx::Point(x - 1, y + h - 1))); \
26
27#define TEST_RIGHT_OF_RECT(r, x, y, w, h)                 \
28  EXPECT_FALSE(r.Contains(gfx::Point(x + w, y)));         \
29  EXPECT_FALSE(r.Contains(gfx::Point(x + w, y + h - 1))); \
30
31#define TEST_TOP_OF_RECT(r, x, y, w, h)                   \
32  EXPECT_FALSE(r.Contains(gfx::Point(x, y - 1)));         \
33  EXPECT_FALSE(r.Contains(gfx::Point(x + w - 1, y - 1))); \
34
35#define TEST_BOTTOM_OF_RECT(r, x, y, w, h)                \
36  EXPECT_FALSE(r.Contains(gfx::Point(x, y + h)));         \
37  EXPECT_FALSE(r.Contains(gfx::Point(x + w - 1, y + h))); \
38
39TEST(RegionTest, ContainsPoint) {
40  Region r;
41
42  EXPECT_FALSE(r.Contains(gfx::Point(0, 0)));
43
44  r.Union(gfx::Rect(35, 35, 1, 1));
45  TEST_INSIDE_RECT(r, 35, 35, 1, 1);
46  TEST_LEFT_OF_RECT(r, 35, 35, 1, 1);
47  TEST_RIGHT_OF_RECT(r, 35, 35, 1, 1);
48  TEST_TOP_OF_RECT(r, 35, 35, 1, 1);
49  TEST_BOTTOM_OF_RECT(r, 35, 35, 1, 1);
50
51  r.Union(gfx::Rect(30, 30, 10, 10));
52  TEST_INSIDE_RECT(r, 30, 30, 10, 10);
53  TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
54  TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
55  TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
56  TEST_BOTTOM_OF_RECT(r, 30, 30, 10, 10);
57
58  r.Union(gfx::Rect(31, 40, 10, 10));
59  EXPECT_FALSE(r.Contains(gfx::Point(30, 40)));
60  EXPECT_TRUE(r.Contains(gfx::Point(31, 40)));
61  EXPECT_FALSE(r.Contains(gfx::Point(40, 39)));
62  EXPECT_TRUE(r.Contains(gfx::Point(40, 40)));
63
64  TEST_INSIDE_RECT(r, 30, 30, 10, 10);
65  TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
66  TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
67  TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
68  TEST_INSIDE_RECT(r, 31, 40, 10, 10);
69  TEST_LEFT_OF_RECT(r, 31, 40, 10, 10);
70  TEST_RIGHT_OF_RECT(r, 31, 40, 10, 10);
71  TEST_BOTTOM_OF_RECT(r, 31, 40, 10, 10);
72
73  r.Union(gfx::Rect(42, 40, 10, 10));
74
75  TEST_INSIDE_RECT(r, 42, 40, 10, 10);
76  TEST_LEFT_OF_RECT(r, 42, 40, 10, 10);
77  TEST_RIGHT_OF_RECT(r, 42, 40, 10, 10);
78  TEST_TOP_OF_RECT(r, 42, 40, 10, 10);
79  TEST_BOTTOM_OF_RECT(r, 42, 40, 10, 10);
80
81  TEST_INSIDE_RECT(r, 30, 30, 10, 10);
82  TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
83  TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
84  TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
85  TEST_INSIDE_RECT(r, 31, 40, 10, 10);
86  TEST_LEFT_OF_RECT(r, 31, 40, 10, 10);
87  TEST_RIGHT_OF_RECT(r, 31, 40, 10, 10);
88  TEST_BOTTOM_OF_RECT(r, 31, 40, 10, 10);
89}
90
91TEST(RegionTest, EmptySpan) {
92  Region r;
93  r.Union(gfx::Rect(5, 0, 10, 10));
94  r.Union(gfx::Rect(0, 5, 10, 10));
95  r.Subtract(gfx::Rect(7, 7, 10, 0));
96
97  for (Region::Iterator it(r); it.has_rect(); it.next())
98    EXPECT_FALSE(it.rect().IsEmpty());
99}
100
101#define TEST_NO_INTERSECT(a, b) {  \
102  Region ar = a;                   \
103  Region br = b;                   \
104  EXPECT_FALSE(ar.Intersects(br)); \
105  EXPECT_FALSE(br.Intersects(ar)); \
106  EXPECT_FALSE(ar.Intersects(b));  \
107  EXPECT_FALSE(br.Intersects(a));  \
108}
109
110#define TEST_INTERSECT(a, b) {    \
111  Region ar = a;                  \
112  Region br = b;                  \
113  EXPECT_TRUE(ar.Intersects(br)); \
114  EXPECT_TRUE(br.Intersects(ar)); \
115  EXPECT_TRUE(ar.Intersects(b));  \
116  EXPECT_TRUE(br.Intersects(a));  \
117}
118
119TEST(RegionTest, IntersectsRegion) {
120  Region r;
121
122  TEST_NO_INTERSECT(gfx::Rect(), gfx::Rect());
123  TEST_NO_INTERSECT(gfx::Rect(), gfx::Rect(0, 0, 1, 1));
124  TEST_NO_INTERSECT(gfx::Rect(), gfx::Rect(1, 1, 1, 1));
125
126  TEST_NO_INTERSECT(gfx::Rect(-1, -1, 2, 2), gfx::Rect());
127
128  r.Union(gfx::Rect(0, 0, 1, 1));
129  TEST_NO_INTERSECT(r, gfx::Rect());
130  TEST_INTERSECT(r, gfx::Rect(0, 0, 1, 1));
131  TEST_INTERSECT(r, gfx::Rect(0, 0, 2, 2));
132  TEST_INTERSECT(r, gfx::Rect(-1, 0, 2, 2));
133  TEST_INTERSECT(r, gfx::Rect(-1, -1, 2, 2));
134  TEST_INTERSECT(r, gfx::Rect(0, -1, 2, 2));
135  TEST_INTERSECT(r, gfx::Rect(-1, -1, 3, 3));
136
137  r.Union(gfx::Rect(0, 0, 3, 3));
138  r.Union(gfx::Rect(10, 0, 3, 3));
139  r.Union(gfx::Rect(0, 10, 13, 3));
140  TEST_NO_INTERSECT(r, gfx::Rect());
141  TEST_INTERSECT(r, gfx::Rect(1, 1, 1, 1));
142  TEST_INTERSECT(r, gfx::Rect(0, 0, 2, 2));
143  TEST_INTERSECT(r, gfx::Rect(1, 0, 2, 2));
144  TEST_INTERSECT(r, gfx::Rect(1, 1, 2, 2));
145  TEST_INTERSECT(r, gfx::Rect(0, 1, 2, 2));
146  TEST_INTERSECT(r, gfx::Rect(0, 0, 3, 3));
147  TEST_INTERSECT(r, gfx::Rect(-1, -1, 2, 2));
148  TEST_INTERSECT(r, gfx::Rect(2, -1, 2, 2));
149  TEST_INTERSECT(r, gfx::Rect(2, 2, 2, 2));
150  TEST_INTERSECT(r, gfx::Rect(-1, 2, 2, 2));
151
152  TEST_INTERSECT(r, gfx::Rect(11, 1, 1, 1));
153  TEST_INTERSECT(r, gfx::Rect(10, 0, 2, 2));
154  TEST_INTERSECT(r, gfx::Rect(11, 0, 2, 2));
155  TEST_INTERSECT(r, gfx::Rect(11, 1, 2, 2));
156  TEST_INTERSECT(r, gfx::Rect(10, 1, 2, 2));
157  TEST_INTERSECT(r, gfx::Rect(10, 0, 3, 3));
158  TEST_INTERSECT(r, gfx::Rect(9, -1, 2, 2));
159  TEST_INTERSECT(r, gfx::Rect(12, -1, 2, 2));
160  TEST_INTERSECT(r, gfx::Rect(12, 2, 2, 2));
161  TEST_INTERSECT(r, gfx::Rect(9, 2, 2, 2));
162
163  TEST_INTERSECT(r, gfx::Rect(0, -1, 13, 5));
164  TEST_INTERSECT(r, gfx::Rect(1, -1, 11, 5));
165  TEST_INTERSECT(r, gfx::Rect(2, -1, 9, 5));
166  TEST_INTERSECT(r, gfx::Rect(2, -1, 8, 5));
167  TEST_INTERSECT(r, gfx::Rect(3, -1, 8, 5));
168  TEST_NO_INTERSECT(r, gfx::Rect(3, -1, 7, 5));
169
170  TEST_INTERSECT(r, gfx::Rect(0, 1, 13, 1));
171  TEST_INTERSECT(r, gfx::Rect(1, 1, 11, 1));
172  TEST_INTERSECT(r, gfx::Rect(2, 1, 9, 1));
173  TEST_INTERSECT(r, gfx::Rect(2, 1, 8, 1));
174  TEST_INTERSECT(r, gfx::Rect(3, 1, 8, 1));
175  TEST_NO_INTERSECT(r, gfx::Rect(3, 1, 7, 1));
176
177  TEST_INTERSECT(r, gfx::Rect(0, 0, 13, 13));
178  TEST_INTERSECT(r, gfx::Rect(0, 1, 13, 11));
179  TEST_INTERSECT(r, gfx::Rect(0, 2, 13, 9));
180  TEST_INTERSECT(r, gfx::Rect(0, 2, 13, 8));
181  TEST_INTERSECT(r, gfx::Rect(0, 3, 13, 8));
182  TEST_NO_INTERSECT(r, gfx::Rect(0, 3, 13, 7));
183}
184
185TEST(RegionTest, ReadPastFullSpanVectorInIntersectsTest) {
186  Region r;
187
188  // This region has enough spans to fill its allocated Vector exactly.
189  r.Union(gfx::Rect(400, 300, 1, 800));
190  r.Union(gfx::Rect(785, 585, 1, 1));
191  r.Union(gfx::Rect(787, 585, 1, 1));
192  r.Union(gfx::Rect(0, 587, 16, 162));
193  r.Union(gfx::Rect(26, 590, 300, 150));
194  r.Union(gfx::Rect(196, 750, 1, 1));
195  r.Union(gfx::Rect(0, 766, 1, 1));
196  r.Union(gfx::Rect(0, 782, 1, 1));
197  r.Union(gfx::Rect(745, 798, 1, 1));
198  r.Union(gfx::Rect(795, 882, 10, 585));
199  r.Union(gfx::Rect(100, 1499, 586, 1));
200  r.Union(gfx::Rect(100, 1500, 585, 784));
201  // This query rect goes past the bottom of the Region, causing the
202  // test to reach the last span and try go past it. It should not read
203  // memory off the end of the span Vector.
204  TEST_NO_INTERSECT(r, gfx::Rect(0, 2184, 1, 150));
205}
206
207#define TEST_NO_CONTAINS(a, b)                  \
208  {                                             \
209    Region ar = a;                              \
210    Region br = b;                              \
211    EXPECT_FALSE(ar.Contains(br));              \
212    EXPECT_FALSE(ar.Contains(b));               \
213  }
214
215#define TEST_CONTAINS(a, b)                     \
216  {                                             \
217    Region ar = a;                              \
218    Region br = b;                              \
219    EXPECT_TRUE(ar.Contains(br));               \
220    EXPECT_TRUE(ar.Contains(b));                \
221  }
222
223TEST(RegionTest, ContainsRegion) {
224  TEST_CONTAINS(gfx::Rect(), gfx::Rect());
225  TEST_CONTAINS(gfx::Rect(0, 0, 1, 1), gfx::Rect());
226  TEST_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect());
227
228  TEST_NO_CONTAINS(gfx::Rect(), gfx::Rect(0, 0, 1, 1));
229  TEST_NO_CONTAINS(gfx::Rect(), gfx::Rect(1, 1, 1, 1));
230
231  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(11, 10, 1, 1));
232  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 11, 1, 1));
233  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 10, 1, 1));
234  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 9, 1, 1));
235  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 9, 2, 2));
236  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 9, 2, 2));
237  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 10, 2, 2));
238  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(10, 10, 2, 2));
239  TEST_NO_CONTAINS(gfx::Rect(10, 10, 1, 1), gfx::Rect(9, 9, 3, 3));
240
241  Region h_lines;
242  for (int i = 10; i < 20; i += 2)
243    h_lines.Union(gfx::Rect(i, 10, 1, 10));
244
245  TEST_CONTAINS(gfx::Rect(10, 10, 9, 10), h_lines);
246  TEST_NO_CONTAINS(gfx::Rect(10, 10, 9, 9), h_lines);
247  TEST_NO_CONTAINS(gfx::Rect(10, 11, 9, 9), h_lines);
248  TEST_NO_CONTAINS(gfx::Rect(10, 10, 8, 10), h_lines);
249  TEST_NO_CONTAINS(gfx::Rect(11, 10, 8, 10), h_lines);
250
251  Region v_lines;
252  for (int i = 10; i < 20; i += 2)
253    v_lines.Union(gfx::Rect(10, i, 10, 1));
254
255  TEST_CONTAINS(gfx::Rect(10, 10, 10, 9), v_lines);
256  TEST_NO_CONTAINS(gfx::Rect(10, 10, 9, 9), v_lines);
257  TEST_NO_CONTAINS(gfx::Rect(11, 10, 9, 9), v_lines);
258  TEST_NO_CONTAINS(gfx::Rect(10, 10, 10, 8), v_lines);
259  TEST_NO_CONTAINS(gfx::Rect(10, 11, 10, 8), v_lines);
260
261  Region grid;
262  for (int i = 10; i < 20; i += 2)
263    for (int j = 10; j < 20; j += 2)
264      grid.Union(gfx::Rect(i, j, 1, 1));
265
266  TEST_CONTAINS(gfx::Rect(10, 10, 9, 9), grid);
267  TEST_NO_CONTAINS(gfx::Rect(10, 10, 9, 8), grid);
268  TEST_NO_CONTAINS(gfx::Rect(10, 11, 9, 8), grid);
269  TEST_NO_CONTAINS(gfx::Rect(10, 10, 8, 9), grid);
270  TEST_NO_CONTAINS(gfx::Rect(11, 10, 8, 9), grid);
271
272  TEST_CONTAINS(h_lines, h_lines);
273  TEST_CONTAINS(v_lines, v_lines);
274  TEST_NO_CONTAINS(v_lines, h_lines);
275  TEST_NO_CONTAINS(h_lines, v_lines);
276  TEST_CONTAINS(grid, grid);
277  TEST_CONTAINS(h_lines, grid);
278  TEST_CONTAINS(v_lines, grid);
279  TEST_NO_CONTAINS(grid, h_lines);
280  TEST_NO_CONTAINS(grid, v_lines);
281
282  for (int i = 10; i < 20; i += 2)
283    TEST_CONTAINS(h_lines, gfx::Rect(i, 10, 1, 10));
284
285  for (int i = 10; i < 20; i += 2)
286    TEST_CONTAINS(v_lines, gfx::Rect(10, i, 10, 1));
287
288  for (int i = 10; i < 20; i += 2)
289    for (int j = 10; j < 20; j += 2)
290      TEST_CONTAINS(grid, gfx::Rect(i, j, 1, 1));
291
292  Region container;
293  container.Union(gfx::Rect(0, 0, 40, 20));
294  container.Union(gfx::Rect(0, 20, 41, 20));
295  TEST_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
296
297  container.Clear();
298  container.Union(gfx::Rect(0, 0, 10, 10));
299  container.Union(gfx::Rect(0, 30, 10, 10));
300  container.Union(gfx::Rect(30, 30, 10, 10));
301  container.Union(gfx::Rect(30, 0, 10, 10));
302  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
303
304  container.Clear();
305  container.Union(gfx::Rect(0, 0, 10, 10));
306  container.Union(gfx::Rect(0, 30, 10, 10));
307  container.Union(gfx::Rect(30, 0, 10, 40));
308  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
309
310  container.Clear();
311  container.Union(gfx::Rect(30, 0, 10, 10));
312  container.Union(gfx::Rect(30, 30, 10, 10));
313  container.Union(gfx::Rect(0, 0, 10, 40));
314  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
315
316  container.Clear();
317  container.Union(gfx::Rect(0, 0, 10, 40));
318  container.Union(gfx::Rect(30, 0, 10, 40));
319  TEST_NO_CONTAINS(container, gfx::Rect(5, 5, 30, 30));
320
321  container.Clear();
322  container.Union(gfx::Rect(0, 0, 40, 40));
323  TEST_NO_CONTAINS(container, gfx::Rect(10, -1, 20, 10));
324
325  container.Clear();
326  container.Union(gfx::Rect(0, 0, 40, 40));
327  TEST_NO_CONTAINS(container, gfx::Rect(10, 31, 20, 10));
328
329  container.Clear();
330  container.Union(gfx::Rect(0, 0, 40, 20));
331  container.Union(gfx::Rect(0, 20, 41, 20));
332  TEST_NO_CONTAINS(container, gfx::Rect(-1, 10, 10, 20));
333
334  container.Clear();
335  container.Union(gfx::Rect(0, 0, 40, 20));
336  container.Union(gfx::Rect(0, 20, 41, 20));
337  TEST_NO_CONTAINS(container, gfx::Rect(31, 10, 10, 20));
338
339  container.Clear();
340  container.Union(gfx::Rect(0, 0, 40, 40));
341  container.Subtract(gfx::Rect(0, 20, 60, 0));
342  TEST_NO_CONTAINS(container, gfx::Rect(31, 10, 10, 20));
343
344  container.Clear();
345  container.Union(gfx::Rect(0, 0, 60, 20));
346  container.Union(gfx::Rect(30, 20, 10, 20));
347  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 39));
348  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 40));
349  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 41));
350  TEST_NO_CONTAINS(container, gfx::Rect(29, 0, 10, 39));
351  TEST_CONTAINS(container, gfx::Rect(30, 0, 10, 40));
352  TEST_NO_CONTAINS(container, gfx::Rect(31, 0, 10, 41));
353  TEST_NO_CONTAINS(container, gfx::Rect(49, 0, 10, 39));
354  TEST_NO_CONTAINS(container, gfx::Rect(50, 0, 10, 40));
355  TEST_NO_CONTAINS(container, gfx::Rect(51, 0, 10, 41));
356
357  container.Clear();
358  container.Union(gfx::Rect(30, 0, 10, 20));
359  container.Union(gfx::Rect(0, 20, 60, 20));
360  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 39));
361  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 40));
362  TEST_NO_CONTAINS(container, gfx::Rect(0, 0, 10, 41));
363  TEST_NO_CONTAINS(container, gfx::Rect(29, 0, 10, 39));
364  TEST_CONTAINS(container, gfx::Rect(30, 0, 10, 40));
365  TEST_NO_CONTAINS(container, gfx::Rect(31, 0, 10, 41));
366  TEST_NO_CONTAINS(container, gfx::Rect(49, 0, 10, 39));
367  TEST_NO_CONTAINS(container, gfx::Rect(50, 0, 10, 40));
368  TEST_NO_CONTAINS(container, gfx::Rect(51, 0, 10, 41));
369}
370
371TEST(RegionTest, Union) {
372  Region r;
373  Region r2;
374
375  // A rect uniting a contained rect does not change the region.
376  r2 = r = gfx::Rect(0, 0, 50, 50);
377  r2.Union(gfx::Rect(20, 20, 10, 10));
378  EXPECT_EQ(r, r2);
379
380  // A rect uniting a containing rect gives back the containing rect.
381  r = gfx::Rect(0, 0, 50, 50);
382  r.Union(gfx::Rect(0, 0, 100, 100));
383  EXPECT_EQ(Region(gfx::Rect(0, 0, 100, 100)), r);
384
385  // A complex region uniting a contained rect does not change the region.
386  r = gfx::Rect(0, 0, 50, 50);
387  r.Union(gfx::Rect(100, 0, 50, 50));
388  r2 = r;
389  r2.Union(gfx::Rect(20, 20, 10, 10));
390  EXPECT_EQ(r, r2);
391
392  // A complex region uniting a containing rect gives back the containing rect.
393  r = gfx::Rect(0, 0, 50, 50);
394  r.Union(gfx::Rect(100, 0, 50, 50));
395  r.Union(gfx::Rect(0, 0, 500, 500));
396  EXPECT_EQ(Region(gfx::Rect(0, 0, 500, 500)), r);
397}
398
399TEST(RegionTest, IsEmpty) {
400  EXPECT_TRUE(Region().IsEmpty());
401  EXPECT_TRUE(Region(gfx::Rect()).IsEmpty());
402  EXPECT_TRUE(Region(Region()).IsEmpty());
403  EXPECT_TRUE(Region(gfx::Rect(10, 10, 10, 0)).IsEmpty());
404  EXPECT_TRUE(Region(gfx::Rect(10, 10, 0, 10)).IsEmpty());
405  EXPECT_TRUE(Region(gfx::Rect(-10, 10, 10, 0)).IsEmpty());
406  EXPECT_TRUE(Region(gfx::Rect(-10, 10, 0, 10)).IsEmpty());
407  EXPECT_FALSE(Region(gfx::Rect(-1, -1, 1, 1)).IsEmpty());
408  EXPECT_FALSE(Region(gfx::Rect(0, 0, 1, 1)).IsEmpty());
409  EXPECT_FALSE(Region(gfx::Rect(0, 0, 2, 2)).IsEmpty());
410
411  EXPECT_TRUE(SkIRect::MakeXYWH(10, 10, 10, 0).isEmpty());
412  EXPECT_TRUE(SkIRect::MakeXYWH(10, 10, 0, 10).isEmpty());
413  EXPECT_TRUE(SkIRect::MakeXYWH(-10, 10, 10, 0).isEmpty());
414  EXPECT_TRUE(SkIRect::MakeXYWH(-10, 10, 0, 10).isEmpty());
415  EXPECT_FALSE(SkIRect::MakeXYWH(-1, -1, 1, 1).isEmpty());
416  EXPECT_FALSE(SkIRect::MakeXYWH(0, 0, 1, 1).isEmpty());
417  EXPECT_FALSE(SkIRect::MakeXYWH(0, 0, 2, 2).isEmpty());
418}
419
420TEST(RegionTest, Clear) {
421  Region r;
422
423  r = gfx::Rect(0, 0, 50, 50);
424  EXPECT_FALSE(r.IsEmpty());
425  r.Clear();
426  EXPECT_TRUE(r.IsEmpty());
427
428  r = gfx::Rect(0, 0, 50, 50);
429  r.Union(gfx::Rect(100, 0, 50, 50));
430  r.Union(gfx::Rect(0, 0, 500, 500));
431  EXPECT_FALSE(r.IsEmpty());
432  r.Clear();
433  EXPECT_TRUE(r.IsEmpty());
434}
435
436TEST(RegionSwap, Swap) {
437  Region r1, r2, r3;
438
439  r1 = gfx::Rect(0, 0, 50, 50);
440  r1.Swap(&r2);
441  EXPECT_TRUE(r1.IsEmpty());
442  EXPECT_EQ(r2.ToString(), Region(gfx::Rect(0, 0, 50, 50)).ToString());
443
444  r1 = gfx::Rect(0, 0, 50, 50);
445  r1.Union(gfx::Rect(100, 0, 50, 50));
446  r1.Union(gfx::Rect(0, 0, 500, 500));
447  r3 = r1;
448  r1.Swap(&r2);
449  EXPECT_EQ(r1.ToString(), Region(gfx::Rect(0, 0, 50, 50)).ToString());
450  EXPECT_EQ(r2.ToString(), r3.ToString());
451}
452
453}  // namespace
454}  // namespace cc
455