- add sources.
[platform/framework/web/crosswalk.git] / src / cc / base / region_unittest.cc
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
9 namespace cc {
10 namespace {
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
39 TEST(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
91 TEST(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
119 TEST(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
185 TEST(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
223 TEST(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
371 TEST(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
399 TEST(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
420 TEST(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
436 TEST(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