1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *       http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package androidx.core.graphics
18
19import android.graphics.Point
20import android.graphics.Rect
21import android.graphics.Region
22import androidx.testutils.assertThrows
23import org.junit.Assert.assertEquals
24import org.junit.Assert.assertFalse
25import org.junit.Assert.assertNotSame
26import org.junit.Assert.assertTrue
27import org.junit.Test
28
29class RegionTest {
30    @Test fun containsPoint() {
31        assertFalse(Point(1, 1) in Region())
32        assertTrue(Point(1, 1) in Region(0, 0, 2, 2))
33    }
34
35    @Test fun unionRect() {
36        val r = Region(0, 0, 2, 2) + Rect(4, 4, 6, 6)
37        assertFalse(Point(3, 3) in r)
38        assertTrue(Point(1, 1) in r)
39        assertTrue(Point(5, 5) in r)
40    }
41
42    @Test fun unionRegion() {
43        val r = Region(0, 0, 2, 2) + Region(4, 4, 6, 6)
44        assertFalse(Point(3, 3) in r)
45        assertTrue(Point(1, 1) in r)
46        assertTrue(Point(5, 5) in r)
47    }
48
49    @Test fun unionAsAndRect() {
50        val r = Region(0, 0, 2, 2) and Rect(4, 4, 6, 6)
51        assertFalse(Point(3, 3) in r)
52        assertTrue(Point(1, 1) in r)
53        assertTrue(Point(5, 5) in r)
54    }
55
56    @Test fun unionAsAndRegion() {
57        val r = Region(0, 0, 2, 2) and Region(4, 4, 6, 6)
58        assertFalse(Point(3, 3) in r)
59        assertTrue(Point(1, 1) in r)
60        assertTrue(Point(5, 5) in r)
61    }
62
63    @Test fun differenceRect() {
64        val r = Region(0, 0, 4, 4) - Rect(2, 2, 6, 6)
65        assertFalse(Point(3, 3) in r)
66        assertTrue(Point(1, 1) in r)
67        assertFalse(Point(5, 5) in r)
68    }
69
70    @Test fun differenceRegion() {
71        val r = Region(0, 0, 4, 4) - Region(2, 2, 6, 6)
72        assertFalse(Point(3, 3) in r)
73        assertTrue(Point(1, 1) in r)
74        assertFalse(Point(5, 5) in r)
75    }
76
77    @Test fun unaryMinus() {
78        val r = Rect(0, 0, 10, 10) - Rect(4, 4, 6, 6)
79        assertTrue(Point(1, 1) in r)
80        assertFalse(Point(5, 5) in r)
81
82        val i = -r
83        assertFalse(Point(1, 1) in i)
84        assertTrue(Point(5, 5) in i)
85    }
86
87    @Test fun not() {
88        val r = Rect(0, 0, 10, 10) - Rect(4, 4, 6, 6)
89        assertTrue(Point(1, 1) in r)
90        assertFalse(Point(5, 5) in r)
91
92        val i = !r
93        assertFalse(Point(1, 1) in i)
94        assertTrue(Point(5, 5) in i)
95    }
96
97    @Test fun orRect() {
98        val r = Region(0, 0, 4, 4) or Rect(2, 2, 6, 6)
99        assertFalse(Point(1, 1) in r)
100        assertTrue(Point(3, 3) in r)
101    }
102
103    @Test fun orRegion() {
104        val r = Region(0, 0, 4, 4) or Region(2, 2, 6, 6)
105        assertFalse(Point(1, 1) in r)
106        assertTrue(Point(3, 3) in r)
107    }
108
109    @Test fun xorRect() {
110        val r = Region(0, 0, 4, 4) xor Rect(2, 2, 6, 6)
111        assertFalse(Point(3, 3) in r)
112        assertTrue(Point(1, 1) in r)
113    }
114
115    @Test fun xorRegion() {
116        val r = Region(0, 0, 4, 4) xor Region(2, 2, 6, 6)
117        assertFalse(Point(3, 3) in r)
118        assertTrue(Point(1, 1) in r)
119    }
120
121    @Test fun iteratorForLoop() {
122        val region = Region(0, 0, 4, 4) -
123                Rect(2, 2, 6, 6)
124        var count = 0
125        var r = Rect()
126        for (rect in region) {
127            count++
128            assertNotSame(r, rect)
129            r = rect
130        }
131        assertEquals(2, count)
132    }
133
134    @Test fun iteratorOutOfBounds() {
135        val region = Region(0, 0, 4, 4) -
136                Rect(2, 2, 6, 6)
137        val it = region.iterator()
138        it.next()
139        it.next()
140        assertThrows<IndexOutOfBoundsException> {
141            it.next()
142        }
143    }
144
145    @Test fun iteratorForEach() {
146        val region = Region(0, 0, 4, 4) -
147                Rect(2, 2, 6, 6)
148        var count = 0
149        var r = Rect()
150        region.forEach {
151            count++
152            assertNotSame(r, it)
153            r = it
154        }
155        assertEquals(2, count)
156    }
157}
158