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