Home | History | Annotate | Download | only in testclasses
      1 /*
      2 * Copyright (C) 2014 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/LICENSE2.0
      9 *
     10 * Unless required by applicable law or agreed to in riting, 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 package android.uirendering.cts.testclasses;
     17 
     18 import android.graphics.Bitmap;
     19 import android.graphics.Canvas;
     20 import android.graphics.Color;
     21 import android.graphics.LinearGradient;
     22 import android.graphics.Paint;
     23 import android.graphics.Rect;
     24 import android.graphics.Shader;
     25 import android.support.test.filters.LargeTest;
     26 import android.support.test.runner.AndroidJUnit4;
     27 import android.uirendering.cts.bitmapcomparers.BitmapComparer;
     28 import android.uirendering.cts.bitmapcomparers.MSSIMComparer;
     29 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
     30 import android.uirendering.cts.testinfrastructure.CanvasClient;
     31 import android.uirendering.cts.testinfrastructure.DisplayModifier;
     32 import android.uirendering.cts.testinfrastructure.ResourceModifier;
     33 
     34 import org.junit.Test;
     35 import org.junit.runner.RunWith;
     36 
     37 /**
     38  * Test cases of all combination of resource modifications.
     39  */
     40 @LargeTest
     41 @RunWith(AndroidJUnit4.class)
     42 public class SweepTests extends ActivityTestBase {
     43     private final static DisplayModifier COLOR_FILTER_GRADIENT_MODIFIER = new DisplayModifier() {
     44         private final Rect mBounds = new Rect(30, 30, 150, 150);
     45         private final int[] mColors = new int[] {
     46                 Color.RED, Color.GREEN, Color.BLUE
     47         };
     48 
     49         private final Bitmap mBitmap = createGradient();
     50 
     51         @Override
     52         public void modifyDrawing(Paint paint, Canvas canvas) {
     53             canvas.drawBitmap(mBitmap, 0, 0, paint);
     54         }
     55 
     56         private Bitmap createGradient() {
     57             LinearGradient gradient = new LinearGradient(15, 45, 75, 45, mColors, null,
     58                     Shader.TileMode.REPEAT);
     59             Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
     60             Paint p = new Paint();
     61             p.setShader(gradient);
     62             Canvas c = new Canvas(bitmap);
     63             c.drawRect(mBounds, p);
     64             return bitmap;
     65         }
     66     };
     67 
     68     public static final DisplayModifier mCircleDrawModifier = new DisplayModifier() {
     69         @Override
     70         public void modifyDrawing(Paint paint, Canvas canvas) {
     71             canvas.drawCircle(TEST_WIDTH / 2, TEST_HEIGHT / 2, TEST_HEIGHT / 2, paint);
     72         }
     73     };
     74 
     75     /**
     76      * 0.5 defines minimum similarity as 50%
     77      */
     78     private static final float HIGH_THRESHOLD = 0.5f;
     79 
     80     private static final BitmapComparer[] DEFAULT_MSSIM_COMPARER = new BitmapComparer[] {
     81             new MSSIMComparer(HIGH_THRESHOLD)
     82     };
     83 
     84     @Test
     85     public void testBasicDraws() {
     86         sweepModifiersForMask(DisplayModifier.Accessor.SHAPES_MASK, null, DEFAULT_MSSIM_COMPARER);
     87     }
     88 
     89     @Test
     90     public void testBasicShaders() {
     91         sweepModifiersForMask(DisplayModifier.Accessor.SHADER_MASK, mCircleDrawModifier,
     92                 DEFAULT_MSSIM_COMPARER);
     93     }
     94 
     95     @Test
     96     public void testColorFilterUsingGradient() {
     97         sweepModifiersForMask(DisplayModifier.Accessor.COLOR_FILTER_MASK,
     98                 COLOR_FILTER_GRADIENT_MODIFIER, DEFAULT_MSSIM_COMPARER);
     99     }
    100 
    101     protected void sweepModifiersForMask(int mask, final DisplayModifier drawOp,
    102                 BitmapComparer[] bitmapComparers) {
    103         if ((mask & DisplayModifier.Accessor.ALL_OPTIONS_MASK) == 0) {
    104             throw new IllegalArgumentException("Attempt to test with a mask that is invalid");
    105         }
    106         // Get the accessor of all the different modifications possible
    107         final DisplayModifier.Accessor modifierAccessor = new DisplayModifier.Accessor(mask);
    108         // Initialize the resources that we will need to access
    109         ResourceModifier.init(getActivity().getResources());
    110         // For each modification combination, we will get the CanvasClient associated with it and
    111         // from there execute a normal canvas test with that.
    112         CanvasClient canvasClient = (canvas, width, height) -> {
    113             Paint paint = new Paint();
    114             modifierAccessor.modifyDrawing(canvas, paint);
    115             if (drawOp != null) {
    116                 drawOp.modifyDrawing(paint, canvas);
    117             }
    118         };
    119 
    120         int index = 0;
    121         // Create the test cases with each combination
    122         do {
    123             int arrIndex = Math.min(index, bitmapComparers.length - 1);
    124             TestCaseBuilder builder = createTest();
    125             String debugString = modifierAccessor.getDebugString();
    126             if (debugString.contains("bitmapMesh")) {
    127                 builder.addCanvasClient(debugString, canvasClient);
    128             } else {
    129                 builder.addCanvasClient(debugString, canvasClient);
    130             }
    131             builder.runWithComparer(bitmapComparers[arrIndex]);
    132             index++;
    133         } while (modifierAccessor.step());
    134     }
    135 }
    136