Add MipmapDrawableTest
Move these tests from CTS, because Mipmap is now hidden.
Also remove all the XML inflation code, because that is currently
disabled.
Original change: f445b8a7
Deletion from CTS: Ibfd1b8a5
Change-Id: I816581062778a9cbe868e32c3c6975cc9a74af5b
diff --git a/graphics/tests/graphicstests/src/android/graphics/drawable/MipmapDrawableTest.java b/graphics/tests/graphicstests/src/android/graphics/drawable/MipmapDrawableTest.java
new file mode 100644
index 0000000..5fcc3bc
--- /dev/null
+++ b/graphics/tests/graphicstests/src/android/graphics/drawable/MipmapDrawableTest.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2010 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 android.graphics.drawable;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.MipmapDrawable;
+import android.graphics.drawable.DrawableContainer.DrawableContainerState;
+import android.test.InstrumentationTestCase;
+
+public class MipmapDrawableTest extends InstrumentationTestCase {
+ private MockMipmapDrawable mMipmapDrawable;
+
+ private DrawableContainerState mDrawableContainerState;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mMipmapDrawable = new MockMipmapDrawable();
+ mDrawableContainerState = (DrawableContainerState) mMipmapDrawable.getConstantState();
+ }
+
+ public void testMipmapDrawable() {
+ new MipmapDrawable();
+ // Check the values set in the constructor
+ assertNotNull(new MipmapDrawable().getConstantState());
+ assertTrue(new MockMipmapDrawable().hasCalledOnBoundsChanged());
+ }
+
+ public void testAddDrawable() {
+ assertEquals(0, mDrawableContainerState.getChildCount());
+
+ // nothing happens if drawable is null
+ mMipmapDrawable.reset();
+ mMipmapDrawable.addDrawable(null);
+ assertEquals(0, mDrawableContainerState.getChildCount());
+ assertFalse(mMipmapDrawable.hasCalledOnBoundsChanged());
+
+ mMipmapDrawable.reset();
+ mMipmapDrawable.addDrawable(new MockDrawable());
+ assertEquals(1, mDrawableContainerState.getChildCount());
+ assertTrue(mMipmapDrawable.hasCalledOnBoundsChanged());
+
+ mMipmapDrawable.reset();
+ mMipmapDrawable.addDrawable(new MockDrawable());
+ assertEquals(2, mDrawableContainerState.getChildCount());
+ assertTrue(mMipmapDrawable.hasCalledOnBoundsChanged());
+ }
+
+ public void testSortedByHeight() {
+ Drawable small = new MockDrawable(8);
+ Drawable medium = new MockDrawable(32);
+ Drawable large = new MockDrawable(128);
+
+ mMipmapDrawable.addDrawable(medium);
+ assertSame(medium, mDrawableContainerState.getChildren()[0]);
+
+ mMipmapDrawable.addDrawable(small);
+ assertSame(small, mDrawableContainerState.getChildren()[0]);
+ assertSame(medium, mDrawableContainerState.getChildren()[1]);
+
+ mMipmapDrawable.addDrawable(large);
+ assertSame(small, mDrawableContainerState.getChildren()[0]);
+ assertSame(medium, mDrawableContainerState.getChildren()[1]);
+ assertSame(large, mDrawableContainerState.getChildren()[2]);
+
+ mMipmapDrawable.addDrawable(small);
+ assertSame(small, mDrawableContainerState.getChildren()[0]);
+ assertSame(small, mDrawableContainerState.getChildren()[1]);
+ assertSame(medium, mDrawableContainerState.getChildren()[2]);
+ assertSame(large, mDrawableContainerState.getChildren()[3]);
+
+ mMipmapDrawable.addDrawable(medium);
+ assertSame(small, mDrawableContainerState.getChildren()[0]);
+ assertSame(small, mDrawableContainerState.getChildren()[1]);
+ assertSame(medium, mDrawableContainerState.getChildren()[2]);
+ assertSame(medium, mDrawableContainerState.getChildren()[3]);
+ assertSame(large, mDrawableContainerState.getChildren()[4]);
+
+ mMipmapDrawable.addDrawable(large);
+ assertSame(small, mDrawableContainerState.getChildren()[0]);
+ assertSame(small, mDrawableContainerState.getChildren()[1]);
+ assertSame(medium, mDrawableContainerState.getChildren()[2]);
+ assertSame(medium, mDrawableContainerState.getChildren()[3]);
+ assertSame(large, mDrawableContainerState.getChildren()[4]);
+ assertSame(large, mDrawableContainerState.getChildren()[5]);
+ }
+
+ public void testSetBoundsOneItem() {
+ // the method is not called if same bounds are set
+ mMipmapDrawable.reset();
+ mMipmapDrawable.setBounds(mMipmapDrawable.getBounds());
+ assertFalse(mMipmapDrawable.hasCalledOnBoundsChanged());
+
+ // the method is called if different bounds are set, even without drawables
+ mMipmapDrawable.reset();
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, mMipmapDrawable.getBounds().height() + 1));
+ assertTrue(mMipmapDrawable.hasCalledOnBoundsChanged());
+
+ // adding an item should check bounds to see if new drawable is more appropriate
+ mMipmapDrawable.reset();
+ Drawable item = new MockDrawable(42);
+ mMipmapDrawable.addDrawable(item);
+ assertTrue(mMipmapDrawable.hasCalledOnBoundsChanged());
+
+ // the method is called if different bounds are set
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, mMipmapDrawable.getBounds().height() + 1));
+ assertTrue(mMipmapDrawable.hasCalledOnBoundsChanged());
+
+ // check that correct drawable is selected for any size.
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, item.getIntrinsicHeight() - 1));
+ assertSame(item, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, item.getIntrinsicHeight()));
+ assertSame(item, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, item.getIntrinsicHeight() + 1));
+ assertSame(item, mMipmapDrawable.getCurrent());
+ }
+
+ public void testSetBounds() {
+ Drawable small = new MockDrawable(8);
+ Drawable medium = new MockDrawable(32);
+ Drawable large = new MockDrawable(128);
+
+ mMipmapDrawable.addDrawable(large);
+ mMipmapDrawable.addDrawable(small);
+ mMipmapDrawable.addDrawable(medium);
+
+ // check that correct drawable is selected.
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, small.getIntrinsicHeight() - 1));
+ assertSame(small, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, small.getIntrinsicHeight()));
+ assertSame(small, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, small.getIntrinsicHeight() + 1));
+ assertSame(medium, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, medium.getIntrinsicHeight() - 1));
+ assertSame(medium, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, medium.getIntrinsicHeight()));
+ assertSame(medium, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, medium.getIntrinsicHeight() + 1));
+ assertSame(large, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, large.getIntrinsicHeight() - 1));
+ assertSame(large, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, large.getIntrinsicHeight()));
+ assertSame(large, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, large.getIntrinsicHeight() + 1));
+ assertSame(large, mMipmapDrawable.getCurrent());
+ }
+
+ public void testSizes() {
+ // Check default value with no mipmap defined
+ assertEquals(-1, mMipmapDrawable.getIntrinsicHeight());
+ assertEquals(-1, mMipmapDrawable.getIntrinsicWidth());
+ assertEquals(0, mMipmapDrawable.getMinimumHeight());
+ assertEquals(0, mMipmapDrawable.getMinimumWidth());
+
+ Drawable small = new MockDrawable(8, 4);
+ Drawable medium = new MockDrawable(32, 16);
+ Drawable large = new MockDrawable(128, 64);
+
+ mMipmapDrawable.addDrawable(medium);
+ assertEquals(medium.getIntrinsicHeight(), mMipmapDrawable.getIntrinsicHeight());
+ assertEquals(medium.getMinimumHeight(), mMipmapDrawable.getMinimumHeight());
+
+ mMipmapDrawable.addDrawable(large);
+ assertEquals(large.getIntrinsicHeight(), mMipmapDrawable.getIntrinsicHeight());
+ assertEquals(medium.getMinimumHeight(), mMipmapDrawable.getMinimumHeight());
+
+ mMipmapDrawable.addDrawable(small);
+ assertEquals(large.getIntrinsicHeight(), mMipmapDrawable.getIntrinsicHeight());
+ assertEquals(small.getMinimumHeight(), mMipmapDrawable.getMinimumHeight());
+ }
+
+ public void testReplacementWhenAdded() {
+ Drawable small = new MockDrawable(8);
+ Drawable medium = new MockDrawable(32);
+ Drawable large = new MockDrawable(128);
+
+ // Small bounds, so that the smallest mipmap should always be selected
+ mMipmapDrawable.setBounds(new Rect(0, 0, 0, 0));
+
+ // Providing smaller versions, that should immediately be used as current
+ mMipmapDrawable.addDrawable(large);
+ assertSame(large, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.addDrawable(medium);
+ assertSame(medium, mMipmapDrawable.getCurrent());
+
+ mMipmapDrawable.addDrawable(small);
+ assertSame(small, mMipmapDrawable.getCurrent());
+ }
+
+ private class MockMipmapDrawable extends MipmapDrawable {
+ private boolean mHasCalledOnBoundsChanged;
+
+ public boolean hasCalledOnBoundsChanged() {
+ return mHasCalledOnBoundsChanged;
+ }
+
+ public void reset() {
+ mHasCalledOnBoundsChanged = false;
+ }
+
+ @Override
+ protected void onBoundsChange(Rect bounds) {
+ super.onBoundsChange(bounds);
+ mHasCalledOnBoundsChanged = true;
+ }
+ }
+
+ private class MockDrawable extends Drawable {
+ int mIntrinsicHeight;
+ int mMinimumHeight;
+
+ public MockDrawable() {
+ this(0);
+ }
+
+ public MockDrawable(int intrinsicHeight) {
+ this(intrinsicHeight, intrinsicHeight);
+ }
+
+ public MockDrawable(int intrinsicHeight, int minimumHeight) {
+ mIntrinsicHeight = intrinsicHeight;
+ mMinimumHeight = minimumHeight;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return 0;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ }
+
+ @Override
+ public int getIntrinsicHeight() {
+ return mIntrinsicHeight;
+ }
+
+ @Override
+ public int getMinimumHeight() {
+ return mMinimumHeight;
+ }
+ }
+}