TestUtils.java revision 24391daa4e5831395924e2f48df86e19294cc211
1244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov/*
2244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project
3244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *
4244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
5244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * you may not use this file except in compliance with the License.
6244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * You may obtain a copy of the License at
7244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *
8244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
9244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *
10244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
11244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
12244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * See the License for the specific language governing permissions and
14244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * limitations under the License.
15244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov */
16244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
17244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
18244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovpackage android.support.v7.testutils;
19244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
2024391daa4e5831395924e2f48df86e19294cc211Chris Banesimport junit.framework.Assert;
2124391daa4e5831395924e2f48df86e19294cc211Chris Banes
22244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.graphics.Bitmap;
23244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.graphics.Canvas;
24244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.graphics.Color;
25244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.graphics.drawable.Drawable;
2624391daa4e5831395924e2f48df86e19294cc211Chris Banesimport android.os.SystemClock;
27244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.support.annotation.ColorInt;
28244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.support.annotation.NonNull;
29244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
30244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovpublic class TestUtils {
31244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov    /**
32244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * Checks whether all the pixels in the specified drawable are of the same specified color.
33244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     *
34244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * In case there is a color mismatch, the behavior of this method depends on the
35244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
36244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
37244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * <code>Assert.fail</code> with detailed description of the mismatch.
38244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     */
39244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
40ee9519c17254b5e992164ff278173c4b2c7c5fceKirill Grouchnikov            int drawableWidth, int drawableHeight, boolean callSetBounds, @ColorInt int color,
411b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov            int allowedComponentVariance, boolean throwExceptionIfFails) {
42244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        // Create a bitmap
43244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight, Bitmap.Config.ARGB_8888);
44244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        // Create a canvas that wraps the bitmap
45244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        Canvas canvas = new Canvas(bitmap);
46ee9519c17254b5e992164ff278173c4b2c7c5fceKirill Grouchnikov        if (callSetBounds) {
47ee9519c17254b5e992164ff278173c4b2c7c5fceKirill Grouchnikov            // Configure the drawable to have bounds that match the passed size
48ee9519c17254b5e992164ff278173c4b2c7c5fceKirill Grouchnikov            drawable.setBounds(0, 0, drawableWidth, drawableHeight);
49ee9519c17254b5e992164ff278173c4b2c7c5fceKirill Grouchnikov        }
50244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        // And ask the drawable to draw itself to the canvas / bitmap
51244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        drawable.draw(canvas);
52244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
53244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        try {
54244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            int[] rowPixels = new int[drawableWidth];
55244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            for (int row = 0; row < drawableHeight; row++) {
56244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                bitmap.getPixels(rowPixels, 0, drawableWidth, 0, row, drawableWidth, 1);
57244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                for (int column = 0; column < drawableWidth; column++) {
581b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int sourceAlpha = Color.alpha(rowPixels[column]);
591b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int sourceRed = Color.red(rowPixels[column]);
601b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int sourceGreen = Color.green(rowPixels[column]);
611b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int sourceBlue = Color.blue(rowPixels[column]);
621b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov
631b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int expectedAlpha = Color.alpha(color);
641b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int expectedRed = Color.red(color);
651b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int expectedGreen = Color.green(color);
661b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int expectedBlue = Color.blue(color);
671b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov
681b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int varianceAlpha = Math.abs(sourceAlpha - expectedAlpha);
691b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int varianceRed = Math.abs(sourceRed - expectedRed);
701b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int varianceGreen = Math.abs(sourceGreen - expectedGreen);
711b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    int varianceBlue = Math.abs(sourceBlue - expectedBlue);
721b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov
731b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    boolean isColorMatch = (varianceAlpha <= allowedComponentVariance)
741b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                            && (varianceRed <= allowedComponentVariance)
751b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                            && (varianceGreen <= allowedComponentVariance)
761b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                            && (varianceBlue <= allowedComponentVariance);
771b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov
781b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                    if (!isColorMatch) {
79244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                        String mismatchDescription = failMessagePrefix
80244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                                + ": expected all drawable colors to be ["
811b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                                + expectedAlpha + "," + expectedRed + ","
821b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                                + expectedGreen + "," + expectedBlue
83244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                                + "] but at position (" + row + "," + column + ") found ["
841b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                                + sourceAlpha + "," + sourceRed + ","
851b81f288853d60e25e870fd522c927fd72f2efb5Kirill Grouchnikov                                + sourceGreen + "," + sourceBlue + "]";
86244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                        if (throwExceptionIfFails) {
87244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                            throw new RuntimeException(mismatchDescription);
88244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                        } else {
89244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                            Assert.fail(mismatchDescription);
90244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                        }
91244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    }
92244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                }
93244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            }
94244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        } finally {
95244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            bitmap.recycle();
96244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        }
97244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov    }
9824391daa4e5831395924e2f48df86e19294cc211Chris Banes
9924391daa4e5831395924e2f48df86e19294cc211Chris Banes    public static void waitForActivityDestroyed(BaseTestActivity activity) {
10024391daa4e5831395924e2f48df86e19294cc211Chris Banes        while (!activity.isDestroyed()) {
10124391daa4e5831395924e2f48df86e19294cc211Chris Banes            SystemClock.sleep(30);
10224391daa4e5831395924e2f48df86e19294cc211Chris Banes        }
10324391daa4e5831395924e2f48df86e19294cc211Chris Banes    }
104244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov}