14896e241a506661acc8de574508636c14ba99805Romain Guy/*
24896e241a506661acc8de574508636c14ba99805Romain Guy * Copyright (C) 2017 The Android Open Source Project
34896e241a506661acc8de574508636c14ba99805Romain Guy *
44896e241a506661acc8de574508636c14ba99805Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54896e241a506661acc8de574508636c14ba99805Romain Guy * you may not use this file except in compliance with the License.
64896e241a506661acc8de574508636c14ba99805Romain Guy * You may obtain a copy of the License at
74896e241a506661acc8de574508636c14ba99805Romain Guy *
84896e241a506661acc8de574508636c14ba99805Romain Guy *       http://www.apache.org/licenses/LICENSE-2.0
94896e241a506661acc8de574508636c14ba99805Romain Guy *
104896e241a506661acc8de574508636c14ba99805Romain Guy * Unless required by applicable law or agreed to in writing, software
114896e241a506661acc8de574508636c14ba99805Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124896e241a506661acc8de574508636c14ba99805Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134896e241a506661acc8de574508636c14ba99805Romain Guy * See the License for the specific language governing permissions and
144896e241a506661acc8de574508636c14ba99805Romain Guy * limitations under the License.
154896e241a506661acc8de574508636c14ba99805Romain Guy */
164896e241a506661acc8de574508636c14ba99805Romain Guy
179c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonpackage androidx.core.graphics
184896e241a506661acc8de574508636c14ba99805Romain Guy
194896e241a506661acc8de574508636c14ba99805Romain Guyimport android.graphics.Point
204896e241a506661acc8de574508636c14ba99805Romain Guyimport android.graphics.Rect
214896e241a506661acc8de574508636c14ba99805Romain Guyimport android.graphics.Region
229c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonimport androidx.testutils.assertThrows
23ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guyimport org.junit.Assert.assertEquals
244896e241a506661acc8de574508636c14ba99805Romain Guyimport org.junit.Assert.assertFalse
25ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guyimport org.junit.Assert.assertNotSame
264896e241a506661acc8de574508636c14ba99805Romain Guyimport org.junit.Assert.assertTrue
274896e241a506661acc8de574508636c14ba99805Romain Guyimport org.junit.Test
284896e241a506661acc8de574508636c14ba99805Romain Guy
294896e241a506661acc8de574508636c14ba99805Romain Guyclass RegionTest {
304896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun containsPoint() {
314896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(1, 1) in Region())
324896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in Region(0, 0, 2, 2))
334896e241a506661acc8de574508636c14ba99805Romain Guy    }
344896e241a506661acc8de574508636c14ba99805Romain Guy
354896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun unionRect() {
364896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 2, 2) + Rect(4, 4, 6, 6)
374896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
384896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
394896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(5, 5) in r)
404896e241a506661acc8de574508636c14ba99805Romain Guy    }
414896e241a506661acc8de574508636c14ba99805Romain Guy
424896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun unionRegion() {
434896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 2, 2) + Region(4, 4, 6, 6)
444896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
454896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
464896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(5, 5) in r)
474896e241a506661acc8de574508636c14ba99805Romain Guy    }
484896e241a506661acc8de574508636c14ba99805Romain Guy
494896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun unionAsAndRect() {
504896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 2, 2) and Rect(4, 4, 6, 6)
514896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
524896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
534896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(5, 5) in r)
544896e241a506661acc8de574508636c14ba99805Romain Guy    }
554896e241a506661acc8de574508636c14ba99805Romain Guy
564896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun unionAsAndRegion() {
574896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 2, 2) and Region(4, 4, 6, 6)
584896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
594896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
604896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(5, 5) in r)
614896e241a506661acc8de574508636c14ba99805Romain Guy    }
624896e241a506661acc8de574508636c14ba99805Romain Guy
634896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun differenceRect() {
644896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 4, 4) - Rect(2, 2, 6, 6)
654896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
664896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
674896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(5, 5) in r)
684896e241a506661acc8de574508636c14ba99805Romain Guy    }
694896e241a506661acc8de574508636c14ba99805Romain Guy
704896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun differenceRegion() {
714896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 4, 4) - Region(2, 2, 6, 6)
724896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
734896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
744896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(5, 5) in r)
754896e241a506661acc8de574508636c14ba99805Romain Guy    }
764896e241a506661acc8de574508636c14ba99805Romain Guy
774896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun unaryMinus() {
784896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Rect(0, 0, 10, 10) - Rect(4, 4, 6, 6)
794896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
804896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(5, 5) in r)
814896e241a506661acc8de574508636c14ba99805Romain Guy
824896e241a506661acc8de574508636c14ba99805Romain Guy        val i = -r
834896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(1, 1) in i)
844896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(5, 5) in i)
854896e241a506661acc8de574508636c14ba99805Romain Guy    }
864896e241a506661acc8de574508636c14ba99805Romain Guy
874896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun not() {
884896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Rect(0, 0, 10, 10) - Rect(4, 4, 6, 6)
894896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
904896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(5, 5) in r)
914896e241a506661acc8de574508636c14ba99805Romain Guy
924896e241a506661acc8de574508636c14ba99805Romain Guy        val i = !r
934896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(1, 1) in i)
944896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(5, 5) in i)
954896e241a506661acc8de574508636c14ba99805Romain Guy    }
964896e241a506661acc8de574508636c14ba99805Romain Guy
974896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun orRect() {
984896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 4, 4) or Rect(2, 2, 6, 6)
994896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(1, 1) in r)
1004896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(3, 3) in r)
1014896e241a506661acc8de574508636c14ba99805Romain Guy    }
1024896e241a506661acc8de574508636c14ba99805Romain Guy
1034896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun orRegion() {
1044896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 4, 4) or Region(2, 2, 6, 6)
1054896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(1, 1) in r)
1064896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(3, 3) in r)
1074896e241a506661acc8de574508636c14ba99805Romain Guy    }
1084896e241a506661acc8de574508636c14ba99805Romain Guy
1094896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun xorRect() {
1104896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 4, 4) xor Rect(2, 2, 6, 6)
1114896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
1124896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
1134896e241a506661acc8de574508636c14ba99805Romain Guy    }
1144896e241a506661acc8de574508636c14ba99805Romain Guy
1154896e241a506661acc8de574508636c14ba99805Romain Guy    @Test fun xorRegion() {
1164896e241a506661acc8de574508636c14ba99805Romain Guy        val r = Region(0, 0, 4, 4) xor Region(2, 2, 6, 6)
1174896e241a506661acc8de574508636c14ba99805Romain Guy        assertFalse(Point(3, 3) in r)
1184896e241a506661acc8de574508636c14ba99805Romain Guy        assertTrue(Point(1, 1) in r)
1194896e241a506661acc8de574508636c14ba99805Romain Guy    }
120ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy
121ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy    @Test fun iteratorForLoop() {
122ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        val region = Region(0, 0, 4, 4) -
123ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy                Rect(2, 2, 6, 6)
124ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        var count = 0
125ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        var r = Rect()
126ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        for (rect in region) {
127ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy            count++
128ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy            assertNotSame(r, rect)
129ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy            r = rect
130ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        }
131ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        assertEquals(2, count)
132ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy    }
133ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy
13404028515fbbdc3e80a28813a2f7ed1e21ac26e53Romain Guy    @Test fun iteratorOutOfBounds() {
135ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        val region = Region(0, 0, 4, 4) -
136ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy                Rect(2, 2, 6, 6)
137ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        val it = region.iterator()
138ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        it.next()
139ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        it.next()
14004028515fbbdc3e80a28813a2f7ed1e21ac26e53Romain Guy        assertThrows<IndexOutOfBoundsException> {
14104028515fbbdc3e80a28813a2f7ed1e21ac26e53Romain Guy            it.next()
14204028515fbbdc3e80a28813a2f7ed1e21ac26e53Romain Guy        }
143ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy    }
144ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy
145ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy    @Test fun iteratorForEach() {
146ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        val region = Region(0, 0, 4, 4) -
147ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy                Rect(2, 2, 6, 6)
148ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        var count = 0
149ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        var r = Rect()
150ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        region.forEach {
151ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy            count++
152ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy            assertNotSame(r, it)
153ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy            r = it
154ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        }
155ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy        assertEquals(2, count)
156ad1ffc7bf89782ca4d987cb215ce048522db2149Romain Guy    }
1574896e241a506661acc8de574508636c14ba99805Romain Guy}
158