1f78a300c82748e29a3890c8f17a13726aacf33beChris Banes/*
2f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * Copyright (C) 2015 The Android Open Source Project
3f78a300c82748e29a3890c8f17a13726aacf33beChris Banes *
4f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * you may not use this file except in compliance with the License.
6f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * You may obtain a copy of the License at
7f78a300c82748e29a3890c8f17a13726aacf33beChris Banes *
8f78a300c82748e29a3890c8f17a13726aacf33beChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9f78a300c82748e29a3890c8f17a13726aacf33beChris Banes *
10f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * Unless required by applicable law or agreed to in writing, software
11f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * See the License for the specific language governing permissions and
14f78a300c82748e29a3890c8f17a13726aacf33beChris Banes * limitations under the License.
15f78a300c82748e29a3890c8f17a13726aacf33beChris Banes */
16f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
17f78a300c82748e29a3890c8f17a13726aacf33beChris Banespackage android.support.v7.graphics;
18f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
19434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport org.junit.Test;
20434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport org.junit.runner.RunWith;
21434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes
22f78a300c82748e29a3890c8f17a13726aacf33beChris Banesimport android.graphics.Color;
23434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport android.support.test.runner.AndroidJUnit4;
24434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport android.test.suitebuilder.annotation.SmallTest;
25f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
26f78a300c82748e29a3890c8f17a13726aacf33beChris Banesimport static android.support.v4.graphics.ColorUtils.HSLToColor;
27f78a300c82748e29a3890c8f17a13726aacf33beChris Banesimport static android.support.v4.graphics.ColorUtils.calculateContrast;
28434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport static android.support.v7.graphics.TestUtils.loadSampleBitmap;
29434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport static org.junit.Assert.assertEquals;
30434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport static org.junit.Assert.assertFalse;
31434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport static org.junit.Assert.assertNotNull;
32434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banesimport static org.junit.Assert.assertTrue;
33f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
34434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes@RunWith(AndroidJUnit4.class)
35434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banespublic class SwatchTests {
36f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
37f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    private static final float MIN_CONTRAST_TITLE_TEXT = 3.0f;
38f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    private static final float MIN_CONTRAST_BODY_TEXT = 4.5f;
39f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
40434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
41434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
42f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testTextColorContrasts() {
43434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes        final Palette p = Palette.from(loadSampleBitmap()).generate();
44f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
45f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        for (Palette.Swatch swatch : p.getSwatches()) {
46f78a300c82748e29a3890c8f17a13726aacf33beChris Banes            testSwatchTextColorContrasts(swatch);
47f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        }
48f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
49f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
50434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
51434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
52f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testHslNotNull() {
53434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes        final Palette p = Palette.from(loadSampleBitmap()).generate();
54f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
55f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        for (Palette.Swatch swatch : p.getSwatches()) {
56f78a300c82748e29a3890c8f17a13726aacf33beChris Banes            assertNotNull(swatch.getHsl());
57f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        }
58f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
59f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
60434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
61434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
62f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testHslIsRgb() {
63434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes        final Palette p = Palette.from(loadSampleBitmap()).generate();
64f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
65f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        for (Palette.Swatch swatch : p.getSwatches()) {
66f78a300c82748e29a3890c8f17a13726aacf33beChris Banes            assertEquals(HSLToColor(swatch.getHsl()), swatch.getRgb());
67f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        }
68f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
69f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
70f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    private void testSwatchTextColorContrasts(Palette.Swatch swatch) {
71f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        final int bodyTextColor = swatch.getBodyTextColor();
72f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        assertTrue(calculateContrast(bodyTextColor, swatch.getRgb()) >= MIN_CONTRAST_BODY_TEXT);
73f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
74f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        final int titleTextColor = swatch.getTitleTextColor();
75f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        assertTrue(calculateContrast(titleTextColor, swatch.getRgb()) >= MIN_CONTRAST_TITLE_TEXT);
76f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
77f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
78434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
79434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
80f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testEqualsWhenSame() {
81f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch1 = new Palette.Swatch(Color.WHITE, 50);
82f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch2 = new Palette.Swatch(Color.WHITE, 50);
83f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        assertEquals(swatch1, swatch2);
84f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
85f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
86434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
87434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
88f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testEqualsWhenColorDifferent() {
89f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch1 = new Palette.Swatch(Color.BLACK, 50);
90f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch2 = new Palette.Swatch(Color.WHITE, 50);
91f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        assertFalse(swatch1.equals(swatch2));
92f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
93f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
94434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
95434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
96f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testEqualsWhenPopulationDifferent() {
97f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch1 = new Palette.Swatch(Color.BLACK, 50);
98f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch2 = new Palette.Swatch(Color.BLACK, 100);
99f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        assertFalse(swatch1.equals(swatch2));
100f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
101f78a300c82748e29a3890c8f17a13726aacf33beChris Banes
102434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @Test
103434696ff29b2680bff5cb9e0ab98c7b20f5ea5b2Chris Banes    @SmallTest
104f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    public void testEqualsWhenDifferent() {
105f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch1 = new Palette.Swatch(Color.BLUE, 50);
106f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        Palette.Swatch swatch2 = new Palette.Swatch(Color.BLACK, 100);
107f78a300c82748e29a3890c8f17a13726aacf33beChris Banes        assertFalse(swatch1.equals(swatch2));
108f78a300c82748e29a3890c8f17a13726aacf33beChris Banes    }
109f78a300c82748e29a3890c8f17a13726aacf33beChris Banes}
110