1 /* 2 * Copyright 2023 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 17 package androidx.compose.material3 18 19 import androidx.compose.material3.internal.colorUtil.Cam 20 import androidx.compose.material3.internal.colorUtil.CamUtils.lstarFromInt 21 import androidx.compose.material3.internal.colorUtil.CamUtils.yFromLstar 22 import androidx.compose.material3.internal.colorUtil.Frame 23 import androidx.compose.material3.tokens.ColorLightTokens 24 import androidx.compose.ui.graphics.Color 25 import androidx.compose.ui.graphics.toArgb 26 import androidx.test.ext.junit.runners.AndroidJUnit4 27 import androidx.test.filters.SmallTest 28 import com.google.common.truth.Truth.assertThat 29 import org.junit.Assert.assertEquals 30 import org.junit.Test 31 import org.junit.runner.RunWith 32 33 @SmallTest 34 @RunWith(AndroidJUnit4::class) 35 class ColorUtilTest { 36 @Test setLuminance0_returnsBlacknull37 fun setLuminance0_returnsBlack() { 38 assertThat(Color.Red.setLuminance(0f)).isEqualTo(Color.Black) 39 assertThat(Color.Blue.setLuminance(0f)).isEqualTo(Color.Black) 40 assertThat(Color.Green.setLuminance(0f)).isEqualTo(Color.Black) 41 assertThat(Color.Magenta.setLuminance(0f)).isEqualTo(Color.Black) 42 assertThat(Color.Cyan.setLuminance(0f)).isEqualTo(Color.Black) 43 assertThat(Color.White.setLuminance(0f)).isEqualTo(Color.Black) 44 assertThat(Color.Black.setLuminance(0f)).isEqualTo(Color.Black) 45 } 46 47 @Test setLuminance100_returnsWhitenull48 fun setLuminance100_returnsWhite() { 49 assertThat(Color.Red.setLuminance(100f)).isEqualTo(Color.White) 50 assertThat(Color.Blue.setLuminance(100f)).isEqualTo(Color.White) 51 assertThat(Color.Green.setLuminance(100f)).isEqualTo(Color.White) 52 assertThat(Color.Magenta.setLuminance(100f)).isEqualTo(Color.White) 53 assertThat(Color.Cyan.setLuminance(100f)).isEqualTo(Color.White) 54 assertThat(Color.White.setLuminance(100f)).isEqualTo(Color.White) 55 assertThat(Color.Black.setLuminance(100f)).isEqualTo(Color.White) 56 } 57 58 @Test setLuminance_fromBlacknull59 fun setLuminance_fromBlack() { 60 assertColorWithinTolerance(Color(0xff000000), Color.Black.setLuminance(0f), 1f) 61 assertColorWithinTolerance(Color(0xff010101), Color.Black.setLuminance(.25f), 1f) 62 assertColorWithinTolerance(Color(0xff020202), Color.Black.setLuminance(.5f), 1f) 63 assertColorWithinTolerance(Color(0xff030303), Color.Black.setLuminance(.75f), 1f) 64 assertColorWithinTolerance(Color(0xff040404), Color.Black.setLuminance(1f), 1f) 65 assertColorWithinTolerance(Color(0xff070707), Color.Black.setLuminance(2f), 1f) 66 assertColorWithinTolerance(Color(0xff0b0b0b), Color.Black.setLuminance(3f), 1f) 67 assertColorWithinTolerance(Color(0xff0e0e0e), Color.Black.setLuminance(4f), 1f) 68 assertColorWithinTolerance(Color(0xff111111), Color.Black.setLuminance(5f), 1f) 69 assertColorWithinTolerance(Color(0xff131313), Color.Black.setLuminance(6f), 1f) 70 assertColorWithinTolerance(Color(0xff151515), Color.Black.setLuminance(7f), 1f) 71 assertColorWithinTolerance(Color(0xff181818), Color.Black.setLuminance(8f), 1f) 72 assertColorWithinTolerance(Color(0xff191919), Color.Black.setLuminance(9f), 1f) 73 assertColorWithinTolerance(Color(0xff1b1b1b), Color.Black.setLuminance(10f), 1f) 74 assertColorWithinTolerance(Color(0xff303030), Color.Black.setLuminance(20f), 1f) 75 assertColorWithinTolerance(Color(0xff474747), Color.Black.setLuminance(30f), 1f) 76 assertColorWithinTolerance(Color(0xff5e5e5e), Color.Black.setLuminance(40f), 1f) 77 assertColorWithinTolerance(Color(0xff777777), Color.Black.setLuminance(50f), 1f) 78 assertColorWithinTolerance(Color(0xff919191), Color.Black.setLuminance(60f), 1f) 79 assertColorWithinTolerance(Color(0xffababab), Color.Black.setLuminance(70f), 1f) 80 assertColorWithinTolerance(Color(0xffc6c6c6), Color.Black.setLuminance(80f), 1f) 81 assertColorWithinTolerance(Color(0xffe2e2e2), Color.Black.setLuminance(90f), 1f) 82 assertColorWithinTolerance(Color(0xFFF9F9F9), Color.Black.setLuminance(98f), 1f) 83 assertColorWithinTolerance(Color(0xffffffff), Color.Black.setLuminance(99f), 1f) 84 assertColorWithinTolerance(Color(0xffffffff), Color.Black.setLuminance(100f), 1f) 85 } 86 87 @Test setLuminance_fromRednull88 fun setLuminance_fromRed() { 89 assertColorWithinTolerance(Color(0xffff0000), Color.Red.setLuminance(53f), 1f) 90 assertColorWithinTolerance(Color(0xFF5B0000), Color.Red.setLuminance(0f), 1f) 91 assertColorWithinTolerance(Color(0xFF5C0000), Color.Red.setLuminance(.25f), 1f) 92 assertColorWithinTolerance(Color(0xFF5C0000), Color.Red.setLuminance(.5f), 1f) 93 assertColorWithinTolerance(Color(0xFF5D0000), Color.Red.setLuminance(.75f), 1f) 94 assertColorWithinTolerance(Color(0xFF5D0000), Color.Red.setLuminance(1f), 1f) 95 assertColorWithinTolerance(Color(0xFF5F0000), Color.Red.setLuminance(2f), 1f) 96 assertColorWithinTolerance(Color(0xFF620000), Color.Red.setLuminance(3f), 1f) 97 assertColorWithinTolerance(Color(0xFF640000), Color.Red.setLuminance(4f), 1f) 98 assertColorWithinTolerance(Color(0xFF670000), Color.Red.setLuminance(5f), 1f) 99 assertColorWithinTolerance(Color(0xFF690000), Color.Red.setLuminance(6f), 1f) 100 assertColorWithinTolerance(Color(0xFF6C0000), Color.Red.setLuminance(7f), 1f) 101 assertColorWithinTolerance(Color(0xFF6E0000), Color.Red.setLuminance(8f), 1f) 102 assertColorWithinTolerance(Color(0xFF710000), Color.Red.setLuminance(9f), 1f) 103 assertColorWithinTolerance(Color(0xFF740000), Color.Red.setLuminance(10f), 1f) 104 assertColorWithinTolerance(Color(0xFF920000), Color.Red.setLuminance(20f), 1f) 105 assertColorWithinTolerance(Color(0xFFB10000), Color.Red.setLuminance(30f), 1f) 106 assertColorWithinTolerance(Color(0xFFD20000), Color.Red.setLuminance(40f), 1f) 107 assertColorWithinTolerance(Color(0xFFF40000), Color.Red.setLuminance(50f), 1f) 108 assertColorWithinTolerance(Color(0xFFFF3017), Color.Red.setLuminance(60f), 1f) 109 assertColorWithinTolerance(Color(0xFFFF5632), Color.Red.setLuminance(70f), 1f) 110 assertColorWithinTolerance(Color(0xFFFF764C), Color.Red.setLuminance(80f), 1f) 111 assertColorWithinTolerance(Color(0xFFFF9566), Color.Red.setLuminance(90f), 1f) 112 assertColorWithinTolerance(Color(0xFFFFAD7B), Color.Red.setLuminance(98f), 1f) 113 assertColorWithinTolerance(Color(0xFFFFB07D), Color.Red.setLuminance(99f), 1f) 114 assertColorWithinTolerance(Color(0xFFFFB380), Color.Red.setLuminance(100f), 1f) 115 } 116 117 @Test setLuminance_fromGreennull118 fun setLuminance_fromGreen() { 119 assertColorWithinTolerance(Color(0xFF00FC00), Color.Green.setLuminance(86f), 1f) 120 assertColorWithinTolerance(Color(0xFF002400), Color.Green.setLuminance(0f), 1f) 121 assertColorWithinTolerance(Color(0xFF002500), Color.Green.setLuminance(.25f), 1f) 122 assertColorWithinTolerance(Color(0xFF002500), Color.Green.setLuminance(.5f), 1f) 123 assertColorWithinTolerance(Color(0xFF002500), Color.Green.setLuminance(.75f), 1f) 124 assertColorWithinTolerance(Color(0xFF002500), Color.Green.setLuminance(1f), 1f) 125 assertColorWithinTolerance(Color(0xFF002700), Color.Green.setLuminance(2f), 1f) 126 assertColorWithinTolerance(Color(0xFF002800), Color.Green.setLuminance(3f), 1f) 127 assertColorWithinTolerance(Color(0xFF002900), Color.Green.setLuminance(4f), 1f) 128 assertColorWithinTolerance(Color(0xFF002A00), Color.Green.setLuminance(5f), 1f) 129 assertColorWithinTolerance(Color(0xFF002B00), Color.Green.setLuminance(6f), 1f) 130 assertColorWithinTolerance(Color(0xFF002C00), Color.Green.setLuminance(7f), 1f) 131 assertColorWithinTolerance(Color(0xFF002D00), Color.Green.setLuminance(8f), 1f) 132 assertColorWithinTolerance(Color(0xFF002E00), Color.Green.setLuminance(9f), 1f) 133 assertColorWithinTolerance(Color(0xFF003000), Color.Green.setLuminance(10f), 1f) 134 assertColorWithinTolerance(Color(0xFF004200), Color.Green.setLuminance(20f), 1f) 135 assertColorWithinTolerance(Color(0xFF005B00), Color.Green.setLuminance(30f), 1f) 136 assertColorWithinTolerance(Color(0xFF007600), Color.Green.setLuminance(40f), 1f) 137 assertColorWithinTolerance(Color(0xFF009200), Color.Green.setLuminance(50f), 1f) 138 assertColorWithinTolerance(Color(0xFF00AE00), Color.Green.setLuminance(60f), 1f) 139 assertColorWithinTolerance(Color(0xFF00CB00), Color.Green.setLuminance(70f), 1f) 140 assertColorWithinTolerance(Color(0xFF00E800), Color.Green.setLuminance(80f), 1f) 141 assertColorWithinTolerance(Color(0xFF29FF1C), Color.Green.setLuminance(90f), 1f) 142 assertColorWithinTolerance(Color(0xFF54FF3E), Color.Green.setLuminance(98f), 1f) 143 assertColorWithinTolerance(Color(0xFF58FF42), Color.Green.setLuminance(99f), 1f) 144 assertColorWithinTolerance(Color(0xFF5DFF45), Color.Green.setLuminance(100f), 1f) 145 } 146 147 @Test setLuminance_fromBluenull148 fun setLuminance_fromBlue() { 149 assertColorWithinTolerance(Color(0xFF0000FF), Color.Blue.setLuminance(32f), 1f) 150 assertColorWithinTolerance(Color(0xFF0000A2), Color.Blue.setLuminance(0f), 1f) 151 assertColorWithinTolerance(Color(0xFF0000A2), Color.Blue.setLuminance(.25f), 1f) 152 assertColorWithinTolerance(Color(0xFF0000A3), Color.Blue.setLuminance(.5f), 1f) 153 assertColorWithinTolerance(Color(0xFF0000A4), Color.Blue.setLuminance(.75f), 1f) 154 assertColorWithinTolerance(Color(0xFF0000A4), Color.Blue.setLuminance(1f), 1f) 155 assertColorWithinTolerance(Color(0xFF0000A7), Color.Blue.setLuminance(2f), 1f) 156 assertColorWithinTolerance(Color(0xFF0000AA), Color.Blue.setLuminance(3f), 1f) 157 assertColorWithinTolerance(Color(0xFF0000AD), Color.Blue.setLuminance(4f), 1f) 158 assertColorWithinTolerance(Color(0xFF0000AF), Color.Blue.setLuminance(5f), 1f) 159 assertColorWithinTolerance(Color(0xFF0000B2), Color.Blue.setLuminance(6f), 1f) 160 assertColorWithinTolerance(Color(0xFF0000B5), Color.Blue.setLuminance(7f), 1f) 161 assertColorWithinTolerance(Color(0xFF0000B8), Color.Blue.setLuminance(8f), 1f) 162 assertColorWithinTolerance(Color(0xFF0000BB), Color.Blue.setLuminance(9f), 1f) 163 assertColorWithinTolerance(Color(0xFF0000BE), Color.Blue.setLuminance(10f), 1f) 164 assertColorWithinTolerance(Color(0xFF0000DB), Color.Blue.setLuminance(20f), 1f) 165 assertColorWithinTolerance(Color(0xFF0000F8), Color.Blue.setLuminance(30f), 1f) 166 assertColorWithinTolerance(Color(0xFF4523FF), Color.Blue.setLuminance(40f), 1f) 167 assertColorWithinTolerance(Color(0xFF7041FF), Color.Blue.setLuminance(50f), 1f) 168 assertColorWithinTolerance(Color(0xFF955DFF), Color.Blue.setLuminance(60f), 1f) 169 assertColorWithinTolerance(Color(0xFFB878FF), Color.Blue.setLuminance(70f), 1f) 170 assertColorWithinTolerance(Color(0xFFD994FF), Color.Blue.setLuminance(80f), 1f) 171 assertColorWithinTolerance(Color(0xFFFAB0FF), Color.Blue.setLuminance(90f), 1f) 172 assertColorWithinTolerance(Color(0xFFFFC7FF), Color.Blue.setLuminance(98f), 1f) 173 assertColorWithinTolerance(Color(0xFFFFCAFF), Color.Blue.setLuminance(99f), 1f) 174 assertColorWithinTolerance(Color(0xFFFFCDFF), Color.Blue.setLuminance(100f), 1f) 175 } 176 177 @Test yFromMidgraynull178 fun yFromMidgray() { 179 assertEquals(18.418, yFromLstar(50.0), 0.001) 180 } 181 182 @Test yFromBlacknull183 fun yFromBlack() { 184 assertEquals(0.0, yFromLstar(0.0), 0.001) 185 } 186 187 @Test yFromWhitenull188 fun yFromWhite() { 189 assertEquals(100.0, yFromLstar(100.0), 0.001) 190 } 191 192 @Test camFromRednull193 fun camFromRed() { 194 val cam: Cam = Cam.fromInt(RED) 195 assertEquals(46.445f, cam.j, 0.001f) 196 assertEquals(113.357f, cam.chroma, 0.001f) 197 assertEquals(27.408f, cam.hue, 0.001f) 198 assertEquals(89.494f, cam.m, 0.001f) 199 assertEquals(91.889f, cam.s, 0.001f) 200 } 201 202 @Test camFromGreennull203 fun camFromGreen() { 204 val cam: Cam = Cam.fromInt(GREEN) 205 assertEquals(79.331f, cam.j, 0.001f) 206 assertEquals(108.410f, cam.chroma, 0.001f) 207 assertEquals(142.139f, cam.hue, 0.001f) 208 assertEquals(85.587f, cam.m, 0.001f) 209 assertEquals(78.604f, cam.s, 0.001f) 210 } 211 212 @Test camFromBluenull213 fun camFromBlue() { 214 val cam: Cam = Cam.fromInt(BLUE) 215 assertEquals(25.465f, cam.j, 0.001f) 216 assertEquals(87.230f, cam.chroma, 0.001f) 217 assertEquals(282.788f, cam.hue, 0.001f) 218 assertEquals(68.867f, cam.m, 0.001f) 219 assertEquals(93.674f, cam.s, 0.001f) 220 } 221 222 @Test camFromBlacknull223 fun camFromBlack() { 224 val cam: Cam = Cam.fromInt(BLACK) 225 assertEquals(0.0f, cam.j, 0.001f) 226 assertEquals(0.0f, cam.chroma, 0.001f) 227 assertEquals(0.0f, cam.hue, 0.001f) 228 assertEquals(0.0f, cam.m, 0.001f) 229 assertEquals(0.0f, cam.s, 0.001f) 230 } 231 232 @Test camFromWhitenull233 fun camFromWhite() { 234 val cam: Cam = Cam.fromInt(WHITE) 235 assertEquals(100.0f, cam.j, 0.001f) 236 assertEquals(2.869f, cam.chroma, 0.001f) 237 assertEquals(209.492f, cam.hue, 0.001f) 238 assertEquals(2.265f, cam.m, 0.001f) 239 assertEquals(12.068f, cam.s, 0.001f) 240 } 241 242 @Test redFromGamutMapnull243 fun redFromGamutMap() { 244 val cam: Cam = Cam.fromInt(RED) 245 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(RED)) 246 assertEquals(RED, color) 247 } 248 249 @Test greenFromGamutMapnull250 fun greenFromGamutMap() { 251 val cam: Cam = Cam.fromInt(GREEN) 252 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(GREEN)) 253 assertEquals(GREEN, color) 254 } 255 256 @Test blueFromGamutMapnull257 fun blueFromGamutMap() { 258 val cam: Cam = Cam.fromInt(BLUE) 259 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(BLUE)) 260 assertEquals(BLUE, color) 261 } 262 263 @Test whiteFromGamutMapnull264 fun whiteFromGamutMap() { 265 val cam: Cam = Cam.fromInt(WHITE) 266 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(WHITE)) 267 assertEquals(WHITE, color) 268 } 269 270 @Test blackFromGamutMapnull271 fun blackFromGamutMap() { 272 val cam: Cam = Cam.fromInt(BLACK) 273 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(BLACK)) 274 assertEquals(BLACK, color) 275 } 276 277 @Test midgrayFromGamutMapnull278 fun midgrayFromGamutMap() { 279 val cam: Cam = Cam.fromInt(MIDGRAY) 280 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(MIDGRAY)) 281 assertEquals(MIDGRAY, color) 282 } 283 284 @Test randomGreenFromGamutMapnull285 fun randomGreenFromGamutMap() { 286 val colorToTest = -0xff6e00 287 val cam: Cam = Cam.fromInt(colorToTest) 288 val color: Int = Cam.getInt(cam.hue, cam.chroma, lstarFromInt(colorToTest)) 289 assertEquals(colorToTest.toLong(), color.toLong()) 290 } 291 292 @Test gamutMapArbitraryHCLnull293 fun gamutMapArbitraryHCL() { 294 val color: Int = Cam.getInt(309.0f, 40.0f, 70.0f) 295 val cam: Cam = Cam.fromInt(color) 296 297 assertEquals(308.759f, cam.hue, 0.001f) 298 assertEquals(40.148f, cam.chroma, 0.001f) 299 assertEquals(70.029f, lstarFromInt(color), 0.001f) 300 } 301 302 @Test ucsCoordinatesnull303 fun ucsCoordinates() { 304 val cam: Cam = Cam.fromInt(RED) 305 306 assertEquals(59.584f, cam.jstar, 0.001f) 307 assertEquals(43.297f, cam.astar, 0.001f) 308 assertEquals(22.451f, cam.bstar, 0.001f) 309 } 310 311 @Test deltaEWhiteToBlacknull312 fun deltaEWhiteToBlack() { 313 assertEquals(25.661f, Cam.fromInt(WHITE).distance(Cam.fromInt(BLACK)), 0.001f) 314 } 315 316 @Test deltaERedToBluenull317 fun deltaERedToBlue() { 318 assertEquals(21.415f, Cam.fromInt(RED).distance(Cam.fromInt(BLUE)), 0.001f) 319 } 320 321 @Test viewingConditions_defaultnull322 fun viewingConditions_default() { 323 val vc = Frame.Default 324 325 assertEquals(0.184f, vc.n, 0.001f) 326 assertEquals(29.981f, vc.aw, 0.001f) 327 assertEquals(1.016f, vc.nbb, 0.001f) 328 assertEquals(1.021f, vc.rgbD[0], 0.001f) 329 assertEquals(0.986f, vc.rgbD[1], 0.001f) 330 assertEquals(0.933f, vc.rgbD[2], 0.001f) 331 assertEquals(0.789f, vc.flRoot, 0.001f) 332 } 333 334 @Test testHctReflexivitynull335 fun testHctReflexivity() { 336 val baseline = 337 listOf( 338 SURFACE, 339 SURFACE_CONTAINER, 340 ON_SURFACE, 341 PRIMARY, 342 ON_PRIMARY, 343 SECONDARY, 344 ON_SECONDARY, 345 TERTIARY, 346 ON_TERTIARY, 347 PRIMARY_CONTAINER, 348 ON_PRIMARY_CONTAINER, 349 SECONDARY_CONTAINER, 350 ON_SECONDARY_CONTAINER, 351 TERTIARY_CONTAINER, 352 ON_TERTIARY_CONTAINER, 353 ERROR, 354 ON_ERROR, 355 ERROR_CONTAINER, 356 ON_ERROR_CONTAINER, 357 ) 358 for (i in baseline) { 359 val color = -0x1000000 or i 360 val hct: Cam = Cam.fromInt(color) 361 val reconstructedFromHct: Int = Cam.getInt(hct.hue, hct.chroma, lstarFromInt(color)) 362 363 assertEquals( 364 "input was " + 365 Integer.toHexString(color) + 366 "; output was " + 367 Integer.toHexString(reconstructedFromHct), 368 color.toLong(), 369 reconstructedFromHct.toLong() 370 ) 371 } 372 } 373 374 companion object { 375 const val BLACK: Int = -0x1000000 376 const val WHITE: Int = -0x1 377 const val MIDGRAY: Int = -0x888889 378 379 const val RED: Int = -0x10000 380 const val GREEN: Int = -0xff0100 381 const val BLUE: Int = -0xffff01 382 383 val SURFACE: Int = ColorLightTokens.Surface.toArgb() 384 val SURFACE_CONTAINER: Int = ColorLightTokens.SurfaceContainer.toArgb() 385 val ON_SURFACE: Int = ColorLightTokens.OnSurface.toArgb() 386 val PRIMARY: Int = ColorLightTokens.Primary.toArgb() 387 val ON_PRIMARY: Int = ColorLightTokens.OnPrimary.toArgb() 388 val SECONDARY: Int = ColorLightTokens.Secondary.toArgb() 389 val ON_SECONDARY: Int = ColorLightTokens.OnSecondary.toArgb() 390 val TERTIARY: Int = ColorLightTokens.Tertiary.toArgb() 391 val ON_TERTIARY: Int = ColorLightTokens.OnTertiary.toArgb() 392 val PRIMARY_CONTAINER: Int = ColorLightTokens.PrimaryContainer.toArgb() 393 val ON_PRIMARY_CONTAINER: Int = ColorLightTokens.OnPrimaryContainer.toArgb() 394 val SECONDARY_CONTAINER: Int = ColorLightTokens.SecondaryContainer.toArgb() 395 val ON_SECONDARY_CONTAINER: Int = ColorLightTokens.OnSecondaryContainer.toArgb() 396 val TERTIARY_CONTAINER: Int = ColorLightTokens.TertiaryContainer.toArgb() 397 val ON_TERTIARY_CONTAINER: Int = ColorLightTokens.OnTertiaryContainer.toArgb() 398 val ERROR: Int = ColorLightTokens.Error.toArgb() 399 val ON_ERROR: Int = ColorLightTokens.OnError.toArgb() 400 val ERROR_CONTAINER: Int = ColorLightTokens.ErrorContainer.toArgb() 401 val ON_ERROR_CONTAINER: Int = ColorLightTokens.OnErrorContainer.toArgb() 402 } 403 assertColorWithinTolerancenull404 private fun assertColorWithinTolerance(expected: Color, actual: Color, tolerance: Float = 1f) { 405 assertThat(expected.red).isWithin(tolerance).of(actual.red) 406 assertThat(expected.green).isWithin(tolerance).of(actual.green) 407 assertThat(expected.blue).isWithin(tolerance).of(actual.blue) 408 assertThat(expected.alpha).isWithin(tolerance).of(actual.alpha) 409 } 410 } 411