1be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moorepackage com.xtremelabs.robolectric.shadows;
2be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore
322d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppyimport android.graphics.BitmapFactory;
401c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richardimport android.graphics.Canvas;
501c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richardimport android.graphics.ColorFilter;
6255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevatoimport android.graphics.Rect;
701c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richardimport android.graphics.drawable.Drawable;
822d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
9be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Mooreimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
1022d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
11be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Mooreimport org.junit.Test;
12be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Mooreimport org.junit.runner.RunWith;
13be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore
14be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Mooreimport java.io.ByteArrayInputStream;
151258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richardimport java.io.InputStream;
16be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore
17be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Mooreimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
18be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Mooreimport static junit.framework.Assert.assertFalse;
191258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richardimport static org.hamcrest.CoreMatchers.equalTo;
20255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevatoimport static org.hamcrest.CoreMatchers.is;
2101c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richardimport static org.junit.Assert.*;
22be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore
23be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore@RunWith(WithTestDefaultsRunner.class)
24be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moorepublic class DrawableTest {
25be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    @Test
26be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    public void createFromStream__shouldReturnNullWhenAskedToCreateADrawableFromACorruptedSourceStream() throws Exception {
27be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        String corruptedStreamSource = "http://foo.com/image.jpg";
28be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        ShadowDrawable.addCorruptStreamSource(corruptedStreamSource);
29be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        assertNull(ShadowDrawable.createFromStream(new ByteArrayInputStream(new byte[0]), corruptedStreamSource));
30be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    }
31be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore
32be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    @Test
33be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    public void createFromStream__shouldReturnDrawableWithSpecificSource() throws Exception {
34be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        Drawable drawable = ShadowDrawable.createFromStream(new ByteArrayInputStream(new byte[0]), "my_source");
35be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        assertNotNull(drawable);
36be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        assertEquals("my_source", ((ShadowBitmapDrawable) shadowOf(drawable)).getSource());
37be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    }
38be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore
39be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    @Test
40be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    public void reset__shouldClearStaticState() throws Exception {
41be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        String src = "source1";
42be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        ShadowDrawable.addCorruptStreamSource(src);
43be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        assertTrue(ShadowDrawable.corruptStreamSources.contains(src));
44be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        ShadowDrawable.reset();
45be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore        assertFalse(ShadowDrawable.corruptStreamSources.contains(src));
46be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore    }
471258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard
481258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard    @Test
491258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard    public void testCreateFromStream_shouldSetTheInputStreamOnTheReturnedDrawable() throws Exception {
501258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(new byte[0]);
511258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard        Drawable drawable = Drawable.createFromStream(byteInputStream, "src name");
521258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard        assertThat(shadowOf(drawable).getInputStream(), equalTo((InputStream) byteInputStream));
531258bd4f817130a401a5a234354b95fe3bf7e4eeDavid Farber & Ryan Richard    }
54877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz
55255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato    @Test
56255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato    public void copyBoundsWithPassedRect() {
57255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        Drawable drawable = ShadowDrawable.createFromStream(new ByteArrayInputStream(new byte[0]), "my_source");
58255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        drawable.setBounds(1, 2, 3, 4);
59255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        Rect r = new Rect();
60255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        drawable.copyBounds(r);
61877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.left, is(1));
62877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.top, is(2));
63877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.right, is(3));
64877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.bottom, is(4));
65255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato    }
66255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato
67255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato    @Test
68255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato    public void copyBoundsToReturnedRect() {
69255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        Drawable drawable = ShadowDrawable.createFromStream(new ByteArrayInputStream(new byte[0]), "my_source");
70255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        drawable.setBounds(1, 2, 3, 4);
71255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato        Rect r = drawable.copyBounds();
72877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.left, is(1));
73877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.top, is(2));
74877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.right, is(3));
75877e4c834fc5505b6f6cbd8411cdc2f7c6e5c4ddJoe Moore and Tyler Schultz        assertThat(r.bottom, is(4));
76255260f69e0844322b3a24a47a33bb06c5a49d0cTony Allevato    }
773eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry
783eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry    @Test
793eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry    public void createFromPath__shouldReturnDrawableWithSpecificPath() throws Exception {
803eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry        Drawable drawable = ShadowDrawable.createFromPath("/foo");
813eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry        assertNotNull(drawable);
823eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry        assertEquals("/foo", ((ShadowBitmapDrawable) shadowOf(drawable)).getPath());
833eeaacd94b8bf41d08dfc7d93cbebb5936842020Chris Perry    }
8401c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard
8501c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    @Test
8601c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    public void testGetLoadedFromResourceId_shouldDefaultToNegativeOne() throws Exception {
8701c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        Drawable drawable = new TestDrawable();
8801c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        assertThat(shadowOf(drawable).getLoadedFromResourceId(), is(-1));
8901c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    }
9001c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard
9101c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    @Test
9201c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    public void testSetLoadedFromResourceId() throws Exception {
9301c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        Drawable drawable = new TestDrawable();
9401c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        ShadowDrawable shadowDrawable = shadowOf(drawable);
9501c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        shadowDrawable.setLoadedFromResourceId(99);
9601c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        assertThat(shadowDrawable.getLoadedFromResourceId(), is(99));
9701c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    }
9801c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard
99e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard    @Test
100e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard    public void testCreateFromResourceId_shouldSetTheId() throws Exception {
101e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard        Drawable drawable = ShadowDrawable.createFromResourceId(34758);
102e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard        ShadowDrawable shadowDrawable = shadowOf(drawable);
103e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard        assertThat(shadowDrawable.getLoadedFromResourceId(), is(34758));
104e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard    }
105e429b89e0edf6b77099f40e7e3af40b0cc1e7fc4Amrit Thakur & Ryan Richard
106be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry    @Test
107be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry    public void testWasSelfInvalidated() throws Exception {
108be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry        Drawable drawable = ShadowDrawable.createFromResourceId(34758);
109be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry        ShadowDrawable shadowDrawable = shadowOf(drawable);
110be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry        assertFalse(shadowDrawable.wasInvalidated());
111be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry        drawable.invalidateSelf();
112be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry        assertTrue(shadowDrawable.wasInvalidated());
113be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry    }
11422d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
11522d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    @Test
11622d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    public void createFromResourceStream__shouldReturnNullWhenAskedToCreateADrawableFromACorruptedSourceStream() throws Exception {
11722d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        String corruptedStreamSource = "http://foo.com/image.jpg";
11822d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        ShadowDrawable.addCorruptStreamSource(corruptedStreamSource);
11922d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertNull(ShadowDrawable.createFromResourceStream(null, null, new ByteArrayInputStream(new byte[0]), corruptedStreamSource));
12022d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    }
12122d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
12222d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    @Test
12322d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    public void createFromResourceStream__shouldReturnDrawableWithSpecificSource() throws Exception {
12422d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        Drawable drawable = ShadowDrawable.createFromResourceStream(null, null, new ByteArrayInputStream(new byte[0]), "my_source");
12522d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertNotNull(drawable);
12622d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertEquals("my_source", ((ShadowBitmapDrawable) shadowOf(drawable)).getSource());
12722d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    }
12822d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
12922d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    @Test
13022d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    public void testCreateFromResourceStream_shouldSetTheInputStreamOnTheReturnedDrawable() throws Exception {
13122d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(new byte[0]);
13222d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        Drawable drawable = Drawable.createFromResourceStream(null, null, byteInputStream, "src name");
13322d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertThat(shadowOf(drawable).getInputStream(), equalTo((InputStream) byteInputStream));
13422d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    }
13522d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
13622d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    @Test
13722d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    public void createFromResourceStreamWithOptions__shouldReturnNullWhenAskedToCreateADrawableFromACorruptedSourceStream() throws Exception {
13822d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        String corruptedStreamSource = "http://foo.com/image.jpg";
13922d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        ShadowDrawable.addCorruptStreamSource(corruptedStreamSource);
14022d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertNull(ShadowDrawable.createFromResourceStream(null, null, new ByteArrayInputStream(new byte[0]), corruptedStreamSource, new BitmapFactory.Options()));
14122d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    }
14222d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
14322d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    @Test
14422d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    public void createFromResourceStreamWithOptions__shouldReturnDrawableWithSpecificSource() throws Exception {
14522d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        Drawable drawable = ShadowDrawable.createFromResourceStream(null, null, new ByteArrayInputStream(new byte[0]), "my_source", new BitmapFactory.Options());
14622d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertNotNull(drawable);
14722d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertEquals("my_source", ((ShadowBitmapDrawable) shadowOf(drawable)).getSource());
14822d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    }
14922d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy
15022d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    @Test
15122d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    public void testCreateFromResourceStreamWithOptions_shouldSetTheInputStreamOnTheReturnedDrawable() throws Exception {
15222d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(new byte[0]);
15322d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        Drawable drawable = Drawable.createFromResourceStream(null, null, byteInputStream, "src name", new BitmapFactory.Options());
15422d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy        assertThat(shadowOf(drawable).getInputStream(), equalTo((InputStream) byteInputStream));
15522d17eb1febbe07fdb6785467273e48c0ab1ed4fJohn Stuppy    }
156be2bfccace90099e150bae69ddfef42f501e997cAaron VonderHaar & Chris Perry
15701c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    private static class TestDrawable extends Drawable {
15801c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        @Override
15901c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        public void draw(Canvas canvas) {
16001c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        }
16101c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard
16201c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        @Override
16301c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        public void setAlpha(int alpha) {
16401c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        }
16501c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard
16601c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        @Override
16701c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        public void setColorFilter(ColorFilter cf) {
16801c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        }
16901c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard
17001c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        @Override
17101c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        public int getOpacity() {
17201c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard            return 0;
17301c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard        }
17401c59a01c55d6cfd4b3da34a5036ba9a1c314dc2Aaron VonderHaar & Ryan Richard    }
175be87a589a85b713d1755c36b2eca8462177f91f3David Farber & Joe Moore}
176