blob: 28050f0940cd491531dce025695ca7f9b406db2b [file] [log] [blame]
/*
* Copyright (C) 2016 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 androidx.core.graphics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.core.graphics.drawable.DrawableCompat;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DrawableCompatTest {
@Test
public void testDrawableWrap() {
final Drawable original = new GradientDrawable();
final Drawable wrappedDrawable = DrawableCompat.wrap(original);
if (Build.VERSION.SDK_INT < 23) {
assertNotSame(original, wrappedDrawable);
} else {
assertSame(original, wrappedDrawable);
}
}
@Test
public void testDrawableUnwrap() {
final Drawable original = new GradientDrawable();
final Drawable wrappedDrawable = DrawableCompat.wrap(original);
assertSame(original, DrawableCompat.unwrap(wrappedDrawable));
}
@Test
public void testDrawableChangeBoundsCopy() {
final Rect bounds = new Rect(0, 0, 10, 10);
final Drawable drawable = new GradientDrawable();
final Drawable wrapper = DrawableCompat.wrap(drawable);
wrapper.setBounds(bounds);
// Assert that the bounds were given to the original drawable
assertEquals(bounds, drawable.getBounds());
}
@Test
public void testWrapCopiesDrawableState() {
final Rect bounds = new Rect(0, 0, 10, 10);
// Create a drawable and set some bounds
final Drawable drawable = new GradientDrawable();
drawable.setBounds(bounds);
// Now wrap it
final Drawable wrapper = DrawableCompat.wrap(drawable);
// Assert that the bounds were copied to the wrapper
assertEquals(bounds, wrapper.getBounds());
}
@Test
public void testDrawableWrapOnlyWrapsOnce() {
final Drawable wrappedDrawable = DrawableCompat.wrap(new GradientDrawable());
assertSame(wrappedDrawable, DrawableCompat.wrap(wrappedDrawable));
}
@Test
public void testWrapMutatedDrawableHasConstantState() {
// First create a Drawable, and mutated it so that it has a constant state
Drawable drawable = new GradientDrawable();
drawable = drawable.mutate();
assertNotNull(drawable.getConstantState());
// Now wrap and assert that the wrapper also returns a constant state
final Drawable wrapper = DrawableCompat.wrap(drawable);
assertNotNull(wrapper.getConstantState());
}
@Test
public void testWrappedDrawableHasCallbackSet() {
// First create a Drawable
final Drawable drawable = new GradientDrawable();
// Now wrap it and set a mock as the wrapper's callback
final Drawable wrapper = DrawableCompat.wrap(drawable);
final Drawable.Callback mockCallback = mock(Drawable.Callback.class);
wrapper.setCallback(mockCallback);
// Now make the wrapped drawable invalidate itself
drawable.invalidateSelf();
// ...and verify that the wrapper calls to be invalidated
verify(mockCallback, times(1)).invalidateDrawable(wrapper);
}
@Test
public void testDoesNotWrapTintAwareDrawable() {
final TestTintAwareDrawable tintAwareDrawable = new TestTintAwareDrawable();
final Drawable wrapped = DrawableCompat.wrap(tintAwareDrawable);
// Assert that the tint aware drawable was not wrapped
assertSame(tintAwareDrawable, wrapped);
}
@Test
public void testTintAwareDrawableGetsTintCallsDirectly() {
final TestTintAwareDrawable d = mock(TestTintAwareDrawable.class);
final ColorStateList tint = ColorStateList.valueOf(Color.BLACK);
final PorterDuff.Mode tintMode = PorterDuff.Mode.DST;
// Now set the tint list and mode using DrawableCompat
DrawableCompat.setTintList(d, tint);
DrawableCompat.setTintMode(d, tintMode);
// Verify that the calls were directly on to the TintAwareDrawable
verify(d).setTintList(tint);
verify(d).setTintMode(tintMode);
}
}