DrawableCompatTest.java revision 754cb29c50f09a83251dd4bb633ba445b2411adb
1bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper/* 202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * Copyright (C) 2016 The Android Open Source Project 302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * 402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * Licensed under the Apache License, Version 2.0 (the "License"); 502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * you may not use this file except in compliance with the License. 602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * You may obtain a copy of the License at 702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * 87f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper * http://www.apache.org/licenses/LICENSE-2.0 902be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * 1002be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * Unless required by applicable law or agreed to in writing, software 1102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * distributed under the License is distributed on an "AS IS" BASIS, 1202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * See the License for the specific language governing permissions and 1402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * limitations under the License. 1502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper */ 1602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 1702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperpackage android.support.v4.graphics; 1802be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 1902be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertEquals; 2002be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertNotNull; 2102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertNotSame; 2202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertSame; 2302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.mockito.Mockito.mock; 2402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.mockito.Mockito.times; 2502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.mockito.Mockito.verify; 2602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 2702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport android.content.res.ColorStateList; 2802be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport android.graphics.Color; 290d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarperimport android.graphics.PorterDuff; 300d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarperimport android.graphics.Rect; 317f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.graphics.drawable.Drawable; 327f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.graphics.drawable.GradientDrawable; 337f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.os.Build; 347f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.support.test.filters.SmallTest; 357f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.support.test.runner.AndroidJUnit4; 367f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.support.v4.graphics.drawable.DrawableCompat; 377f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper 387f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport org.junit.Test; 397f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport org.junit.runner.RunWith; 407f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper 417f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper@RunWith(AndroidJUnit4.class) 427f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper@SmallTest 437f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperpublic class DrawableCompatTest { 447f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper @Test 457f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper public void testDrawableWrap() { 467f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper final Drawable original = new GradientDrawable(); 477f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper final Drawable wrappedDrawable = DrawableCompat.wrap(original); 487f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper 497f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper if (Build.VERSION.SDK_INT < 23) { 507f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper assertNotSame(original, wrappedDrawable); 517f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper } else { 52bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertSame(original, wrappedDrawable); 53bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper } 540d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper } 55bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 56bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper @Test 57bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper public void testDrawableUnwrap() { 58bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper final Drawable original = new GradientDrawable(); 59bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper final Drawable wrappedDrawable = DrawableCompat.wrap(original); 60bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertSame(original, DrawableCompat.unwrap(wrappedDrawable)); 61bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper } 62bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 63bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper @Test 640d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper public void testDrawableChangeBoundsCopy() { 650d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper final Rect bounds = new Rect(0, 0, 10, 10); 660d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper 67bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper final Drawable drawable = new GradientDrawable(); 6867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper 69bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper final Drawable wrapper = DrawableCompat.wrap(drawable); 700d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper wrapper.setBounds(bounds); 71bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 72bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper // Assert that the bounds were given to the original drawable 73bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertEquals(bounds, drawable.getBounds()); 74bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper } 750d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper 7667b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper @Test 7767b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper public void testWrapCopiesDrawableState() { 7867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper final Rect bounds = new Rect(0, 0, 10, 10); 7967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper 807f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper // Create a drawable and set some bounds 817f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper final Drawable drawable = new GradientDrawable(); 8202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper drawable.setBounds(bounds); 8367b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper 84bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper // Now wrap it 85bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper final Drawable wrapper = DrawableCompat.wrap(drawable); 86bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 87bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper // Assert that the bounds were copied to the wrapper 88bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertEquals(bounds, wrapper.getBounds()); 89bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper } 90bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 91bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper @Test 92bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper public void testDrawableWrapOnlyWrapsOnce() { 93bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper final Drawable wrappedDrawable = DrawableCompat.wrap(new GradientDrawable()); 94bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertSame(wrappedDrawable, DrawableCompat.wrap(wrappedDrawable)); 95bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper } 96bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 97bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper @Test 98bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper public void testWrapMutatedDrawableHasConstantState() { 99bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper // First create a Drawable, and mutated it so that it has a constant state 100bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper Drawable drawable = new GradientDrawable(); 101bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper drawable = drawable.mutate(); 102bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertNotNull(drawable.getConstantState()); 103bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 104bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper // Now wrap and assert that the wrapper also returns a constant state 10502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper final Drawable wrapper = DrawableCompat.wrap(drawable); 106bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper assertNotNull(wrapper.getConstantState()); 10767b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper } 108bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 1097f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper @Test 1107f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper public void testWrappedDrawableHasCallbackSet() { 1117f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper // First create a Drawable 1127f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper final Drawable drawable = new GradientDrawable(); 1137f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper 1147f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper // Now wrap it and set a mock as the wrapper's callback 1157f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper final Drawable wrapper = DrawableCompat.wrap(drawable); 1167f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper final Drawable.Callback mockCallback = mock(Drawable.Callback.class); 1177f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper wrapper.setCallback(mockCallback); 1187f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper 11967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper // Now make the wrapped drawable invalidate itself 120bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper drawable.invalidateSelf(); 12102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 122bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper // ...and verify that the wrapper calls to be invalidated 12367b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper verify(mockCallback, times(1)).invalidateDrawable(wrapper); 12467b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper } 125bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper 1260d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper @Test 1270d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper public void testDoesNotWrapTintAwareDrawable() { 12867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper final TestTintAwareDrawable tintAwareDrawable = new TestTintAwareDrawable(); 12967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper final Drawable wrapped = DrawableCompat.wrap(tintAwareDrawable); 13067b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper // Assert that the tint aware drawable was not wrapped 13102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper assertSame(tintAwareDrawable, wrapped); 13267b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper } 13302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 13402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper @Test 13502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper public void testTintAwareDrawableGetsTintCallsDirectly() { 13602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper final TestTintAwareDrawable d = mock(TestTintAwareDrawable.class); 1370d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper 13867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper final ColorStateList tint = ColorStateList.valueOf(Color.BLACK); 13967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper final PorterDuff.Mode tintMode = PorterDuff.Mode.DST; 14067b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper 14167b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper // Now set the tint list and mode using DrawableCompat 14267b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper DrawableCompat.setTintList(d, tint); 14367b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper DrawableCompat.setTintMode(d, tintMode); 14402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 14567b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper // Verify that the calls were directly on to the TintAwareDrawable 14602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper verify(d).setTintList(tint); 14702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper verify(d).setTintMode(tintMode); 14802be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper } 14902be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper 1500d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper}