DrawableCompatTest.java revision c3b9589f61cbfda8c60344a47f8f87c0ded98554
189d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes/*
289d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * Copyright (C) 2016 The Android Open Source Project
389d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes *
489d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * you may not use this file except in compliance with the License.
689d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * You may obtain a copy of the License at
789d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes *
889d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
989d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes *
1089d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * Unless required by applicable law or agreed to in writing, software
1189d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
1289d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * See the License for the specific language governing permissions and
1489d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes * limitations under the License.
1589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes */
1689d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
1789d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banespackage android.support.v4.graphics;
1889d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
1989d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banesimport android.graphics.Rect;
2089d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banesimport android.graphics.drawable.Drawable;
2189d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banesimport android.graphics.drawable.GradientDrawable;
2289d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banesimport android.support.v4.graphics.drawable.DrawableCompat;
2389d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banesimport android.test.AndroidTestCase;
2489d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banesimport android.test.suitebuilder.annotation.SmallTest;
2589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
26c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banesimport static org.mockito.Mockito.*;
27c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes
2889d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banespublic class DrawableCompatTest extends AndroidTestCase {
2989d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
3089d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    @SmallTest
3189d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    public void testDrawableUnwrap() {
3289d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes        final Drawable original = new GradientDrawable();
3389d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
3489d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes        assertSame(original, DrawableCompat.unwrap(wrappedDrawable));
3589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    }
3689d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
3789d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    @SmallTest
3889d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    public void testDrawableChangeBoundsCopy() {
3989d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes        final Rect bounds = new Rect(0, 0, 10, 10);
4089d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
41be61247c92b085602d3f671be6f506e9813aba19Chris Banes        final Drawable drawable = new GradientDrawable();
42be61247c92b085602d3f671be6f506e9813aba19Chris Banes
43be61247c92b085602d3f671be6f506e9813aba19Chris Banes        final Drawable wrapper = DrawableCompat.wrap(drawable);
44be61247c92b085602d3f671be6f506e9813aba19Chris Banes        wrapper.setBounds(bounds);
4589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
46be61247c92b085602d3f671be6f506e9813aba19Chris Banes        // Assert that the bounds were given to the original drawable
47be61247c92b085602d3f671be6f506e9813aba19Chris Banes        assertEquals(bounds, drawable.getBounds());
4889d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    }
4989d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
5089d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    @SmallTest
5189d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    public void testDrawableWrapOnlyWrapsOnce() {
5289d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes        final Drawable wrappedDrawable = DrawableCompat.wrap(new GradientDrawable());
5389d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes        assertSame(wrappedDrawable, DrawableCompat.wrap(wrappedDrawable));
5489d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes    }
5589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes
564da36b0dfa8436b197314094337fa3102fcca1bcChris Banes    @SmallTest
574da36b0dfa8436b197314094337fa3102fcca1bcChris Banes    public void testWrapMutatedDrawableHasConstantState() {
584da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        // First create a Drawable, and mutated it so that it has a constant state
594da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        Drawable drawable = new GradientDrawable();
604da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        drawable = drawable.mutate();
614da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        assertNotNull(drawable.getConstantState());
624da36b0dfa8436b197314094337fa3102fcca1bcChris Banes
634da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        // Now wrap and assert that the wrapper also returns a constant state
644da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        final Drawable wrapper = DrawableCompat.wrap(drawable);
654da36b0dfa8436b197314094337fa3102fcca1bcChris Banes        assertNotNull(wrapper.getConstantState());
664da36b0dfa8436b197314094337fa3102fcca1bcChris Banes    }
674da36b0dfa8436b197314094337fa3102fcca1bcChris Banes
68c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes    @SmallTest
69c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes    public void testWrappedDrawableHasCallbackSet() {
70c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        // First create a Drawable
71c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        final Drawable drawable = new GradientDrawable();
72c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes
73c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        // Now wrap it and set a mock as the wrapper's callback
74c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        final Drawable wrapper = DrawableCompat.wrap(drawable);
75c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        final Drawable.Callback mockCallback = mock(Drawable.Callback.class);
76c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        wrapper.setCallback(mockCallback);
77c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes
78c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        // Now make the wrapped drawable invalidate itself
79c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        drawable.invalidateSelf();
80c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes
81c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        // ...and verify that the wrapper calls to be invalidated
82c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes        verify(mockCallback, times(1)).invalidateDrawable(wrapper);
83c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes    }
84c3b9589f61cbfda8c60344a47f8f87c0ded98554Chris Banes
8589d63e9cbc1daf9e04ba6261cfd141e6dd68ec63Chris Banes}