/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.setupwizardlib.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Debug; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.util.Log; import com.android.setupwizardlib.GlifPatternDrawable; import junit.framework.AssertionFailedError; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest public class GlifPatternDrawableTest { private static final String TAG = "GlifPatternDrawableTest"; @Before public void setUp() throws Exception { GlifPatternDrawable.invalidatePattern(); } @Test public void testDraw() { final Bitmap bitmap = Bitmap.createBitmap(1366, 768, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 1366, 768); drawable.draw(canvas); assertSameColor("Top left pixel should be #e61a1a", 0xffe61a1a, bitmap.getPixel(0, 0)); assertSameColor("Center pixel should be #d90d0d", 0xffd90d0d, bitmap.getPixel(683, 384)); assertSameColor("Bottom right pixel should be #d40808", 0xffd40808, bitmap.getPixel(1365, 767)); } @Test public void testDrawTwice() { // Test that the second time the drawable is drawn is also correct, to make sure caching is // done correctly. final Bitmap bitmap = Bitmap.createBitmap(1366, 768, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 1366, 768); drawable.draw(canvas); Paint paint = new Paint(); paint.setColor(Color.WHITE); canvas.drawRect(0, 0, 1366, 768, paint); // Erase the entire canvas drawable.draw(canvas); assertSameColor("Top left pixel should be #e61a1a", 0xffe61a1a, bitmap.getPixel(0, 0)); assertSameColor("Center pixel should be #d90d0d", 0xffd90d0d, bitmap.getPixel(683, 384)); assertSameColor("Bottom right pixel should be #d40808", 0xffd40808, bitmap.getPixel(1365, 767)); } @Test public void testScaleToCanvasSquare() { final Canvas canvas = new Canvas(); Matrix expected = new Matrix(canvas.getMatrix()); Bitmap mockBitmapCache = Bitmap.createBitmap(1366, 768, Bitmap.Config.ALPHA_8); final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 683, 384); // half each side of the view box drawable.scaleCanvasToBounds(canvas, mockBitmapCache, drawable.getBounds()); expected.postScale(0.5f, 0.5f); assertEquals("Matrices should match", expected, canvas.getMatrix()); } @Test public void testScaleToCanvasTall() { final Canvas canvas = new Canvas(); final Matrix expected = new Matrix(canvas.getMatrix()); Bitmap mockBitmapCache = Bitmap.createBitmap(1366, 768, Bitmap.Config.ALPHA_8); final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 683, 768); // half the width only drawable.scaleCanvasToBounds(canvas, mockBitmapCache, drawable.getBounds()); expected.postScale(1f, 1f); expected.postTranslate(-99.718f, 0f); assertEquals("Matrices should match", expected, canvas.getMatrix()); } @Test public void testScaleToCanvasWide() { final Canvas canvas = new Canvas(); final Matrix expected = new Matrix(canvas.getMatrix()); Bitmap mockBitmapCache = Bitmap.createBitmap(1366, 768, Bitmap.Config.ALPHA_8); final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 1366, 384); // half the height only drawable.scaleCanvasToBounds(canvas, mockBitmapCache, drawable.getBounds()); expected.postScale(1f, 1f); expected.postTranslate(0f, -87.552f); assertEquals("Matrices should match", expected, canvas.getMatrix()); } @SmallTest public void testScaleToCanvasMaxSize() { final Canvas canvas = new Canvas(); final Matrix expected = new Matrix(canvas.getMatrix()); Bitmap mockBitmapCache = Bitmap.createBitmap(2049, 1152, Bitmap.Config.ALPHA_8); final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 1366, 768); // original viewbox size drawable.scaleCanvasToBounds(canvas, mockBitmapCache, drawable.getBounds()); expected.postScale(1 / 1.5f, 1 / 1.5f); expected.postTranslate(0f, 0f); assertEquals("Matrices should match", expected, canvas.getMatrix()); } @Test public void testMemoryAllocation() { Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo(); Debug.getMemoryInfo(memoryInfo); final long memoryBefore = memoryInfo.getTotalPss(); // Get memory usage in KB final GlifPatternDrawable drawable = new GlifPatternDrawable(Color.RED); drawable.setBounds(0, 0, 1366, 768); drawable.createBitmapCache(2049, 1152); Debug.getMemoryInfo(memoryInfo); final long memoryAfter = memoryInfo.getTotalPss(); Log.i(TAG, "Memory allocated for bitmap cache: " + (memoryAfter - memoryBefore)); assertTrue("Memory allocation should not exceed 5MB", memoryAfter < memoryBefore + 5000); } private void assertSameColor(String message, int expected, int actual) { try { assertEquals(expected, actual); } catch (AssertionFailedError e) { throw new AssertionFailedError(message + " expected <#" + Integer.toHexString(expected) + "> but found <#" + Integer.toHexString(actual) + "> instead"); } } }