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.Matrix
20import android.graphics.Point
21import android.graphics.PointF
22import android.graphics.Rect
23import android.graphics.RectF
24import org.junit.Assert.assertEquals
25import org.junit.Assert.assertFalse
26import org.junit.Assert.assertTrue
27import org.junit.Test
28
29class RectTest {
30    @Test fun destructuringInt() {
31        val (l, t, r, b) = Rect(4, 8, 16, 24)
32        assertEquals(4, l)
33        assertEquals(8, t)
34        assertEquals(16, r)
35        assertEquals(24, b)
36    }
37
38    @Test fun destructuringFloat() {
39        val (l, t, r, b) = RectF(4.0f, 8.0f, 16.0f, 24.0f)
40        assertEquals(4.0f, l)
41        assertEquals(8.0f, t)
42        assertEquals(16.0f, r)
43        assertEquals(24.0f, b)
44    }
45
46    @Test fun unionInt() {
47        val (l, t, r, b) = Rect(0, 0, 4, 4) + Rect(-1, -1, 6, 6)
48        assertEquals(-1, l)
49        assertEquals(-1, t)
50        assertEquals(6, r)
51        assertEquals(6, b)
52    }
53
54    @Test fun unionAsAndInt() {
55        val (l, t, r, b) = Rect(0, 0, 4, 4) and Rect(-1, -1, 6, 6)
56        assertEquals(-1, l)
57        assertEquals(-1, t)
58        assertEquals(6, r)
59        assertEquals(6, b)
60    }
61
62    @Test fun unionFloat() {
63        val (l, t, r, b) = RectF(0.0f, 0.0f, 4.0f, 4.0f) + RectF(-1.0f, -1.0f, 6.0f, 6.0f)
64        assertEquals(-1.0f, l)
65        assertEquals(-1.0f, t)
66        assertEquals(6.0f, r)
67        assertEquals(6.0f, b)
68    }
69
70    @Test fun unionAsAndFloat() {
71        val (l, t, r, b) = RectF(0.0f, 0.0f, 4.0f, 4.0f) and RectF(-1.0f, -1.0f, 6.0f, 6.0f)
72        assertEquals(-1.0f, l)
73        assertEquals(-1.0f, t)
74        assertEquals(6.0f, r)
75        assertEquals(6.0f, b)
76    }
77
78    @Test fun differenceInt() {
79        val r = Rect(0, 0, 4, 4) - Rect(-1, 2, 6, 6)
80        assertEquals(Rect(0, 0, 4, 2), r.bounds)
81    }
82
83    @Test fun differenceFloat() {
84        val r = RectF(0.0f, 0.0f, 4.0f, 4.0f) - RectF(-1.0f, 2.0f, 6.0f, 6.0f)
85        assertEquals(Rect(0, 0, 4, 2), r.bounds)
86    }
87
88    @Test fun intersectionAsOrInt() {
89        val (l, t, r, b) = Rect(0, 0, 4, 4) or Rect(2, 2, 6, 6)
90        assertEquals(2, l)
91        assertEquals(2, t)
92        assertEquals(4, r)
93        assertEquals(4, b)
94    }
95
96    @Test fun intersectionAsOrFloat() {
97        val (l, t, r, b) = RectF(0.0f, 0.0f, 4.0f, 4.0f) or RectF(2.0f, 2.0f, 6.0f, 6.0f)
98        assertEquals(2.0f, l)
99        assertEquals(2.0f, t)
100        assertEquals(4.0f, r)
101        assertEquals(4.0f, b)
102    }
103
104    @Test fun xorInt() {
105        val r = Rect(0, 0, 4, 4) xor Rect(2, 2, 6, 6)
106        assertEquals(Rect(0, 0, 4, 4) and Rect(2, 2, 6, 6), r.bounds)
107        assertFalse(r.contains(3, 3))
108    }
109
110    @Test fun xorFloat() {
111        val r = RectF(0.0f, 0.0f, 4.0f, 4.0f) xor RectF(2.0f, 2.0f, 6.0f, 6.0f)
112        assertEquals(Rect(0, 0, 4, 4) and Rect(2, 2, 6, 6), r.bounds)
113        assertFalse(r.contains(3, 3))
114    }
115
116    @Test fun offsetInt() {
117        val (l, t, r, b) = Rect(0, 0, 2, 2) + 2
118        assertEquals(l, 2)
119        assertEquals(t, 2)
120        assertEquals(r, 4)
121        assertEquals(b, 4)
122    }
123
124    @Test fun offsetPoint() {
125        val (l, t, r, b) = Rect(0, 0, 2, 2) + Point(1, 2)
126        assertEquals(l, 1)
127        assertEquals(t, 2)
128        assertEquals(r, 3)
129        assertEquals(b, 4)
130    }
131
132    @Test fun offsetFloat() {
133        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) + 2.0f
134        assertEquals(l, 2.0f)
135        assertEquals(t, 2.0f)
136        assertEquals(r, 4.0f)
137        assertEquals(b, 4.0f)
138    }
139
140    @Test fun offsetPointF() {
141        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) + PointF(1.0f, 2.0f)
142        assertEquals(l, 1.0f)
143        assertEquals(t, 2.0f)
144        assertEquals(r, 3.0f)
145        assertEquals(b, 4.0f)
146    }
147
148    @Test fun negativeOffsetInt() {
149        val (l, t, r, b) = Rect(0, 0, 2, 2) - 2
150        assertEquals(l, -2)
151        assertEquals(t, -2)
152        assertEquals(r, 0)
153        assertEquals(b, 0)
154    }
155
156    @Test fun negativeOffsetPoint() {
157        val (l, t, r, b) = Rect(0, 0, 2, 2) - Point(1, 2)
158        assertEquals(l, -1)
159        assertEquals(t, -2)
160        assertEquals(r, 1)
161        assertEquals(b, 0)
162    }
163
164    @Test fun negativeOffsetFloat() {
165        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) - 2.0f
166        assertEquals(l, -2.0f)
167        assertEquals(t, -2.0f)
168        assertEquals(r, 0.0f)
169        assertEquals(b, 0.0f)
170    }
171
172    @Test fun negativeOffsetPointF() {
173        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) - PointF(1.0f, 2.0f)
174        assertEquals(l, -1.0f)
175        assertEquals(t, -2.0f)
176        assertEquals(r, 1.0f)
177        assertEquals(b, 0.0f)
178    }
179
180    @Test fun pointInside() {
181        assertTrue(Point(1, 1) in Rect(0, 0, 2, 2))
182        assertTrue(PointF(1.0f, 1.0f) in RectF(0.0f, 0.0f, 2.0f, 2.0f))
183    }
184
185    @Test fun toRect() {
186        assertEquals(
187            Rect(0, 1, 2, 3),
188            RectF(0f, 1f, 2f, 3f).toRect())
189
190        assertEquals(
191            Rect(0, 1, 2, 3),
192            RectF(0.1f, 1.1f, 1.9f, 2.9f).toRect())
193    }
194
195    @Test fun toRectF() {
196        val rectF = Rect(0, 1, 2, 3).toRectF()
197        assertEquals(0f, rectF.left, 0f)
198        assertEquals(1f, rectF.top, 0f)
199        assertEquals(2f, rectF.right, 0f)
200        assertEquals(3f, rectF.bottom, 0f)
201    }
202
203    @Test fun toRegionInt() {
204        assertEquals(Rect(1, 1, 5, 5), Rect(1, 1, 5, 5).toRegion().bounds)
205    }
206
207    @Test fun toRegionFloat() {
208        assertEquals(Rect(1, 1, 5, 5), RectF(1.1f, 1.1f, 4.8f, 4.8f).toRegion().bounds)
209    }
210
211    @Test fun transformRectToRect() {
212        val m = Matrix()
213        m.setScale(2.0f, 2.0f)
214
215        val r = RectF(2.0f, 2.0f, 5.0f, 7.0f).transform(m)
216        assertEquals(4f, r.left, 0f)
217        assertEquals(4f, r.top, 0f)
218        assertEquals(10f, r.right, 0f)
219        assertEquals(14f, r.bottom, 0f)
220    }
221
222    @Test fun transformRectNotPreserved() {
223        val m = Matrix()
224        m.setRotate(45.0f)
225
226        val (l, t, r, b) = RectF(-1.0f, -1.0f, 1.0f, 1.0f).transform(m)
227        assertEquals(-1.414f, l, 1e-3f)
228        assertEquals(-1.414f, t, 1e-3f)
229        assertEquals( 1.414f, r, 1e-3f)
230        assertEquals( 1.414f, b, 1e-3f)
231    }
232}
233