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}