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