1package com.xtremelabs.robolectric.shadows;
2
3import android.content.res.Resources;
4import android.graphics.Canvas;
5import android.graphics.ColorMatrix;
6import android.graphics.ColorMatrixColorFilter;
7import android.graphics.Shader;
8import android.graphics.drawable.BitmapDrawable;
9import android.graphics.drawable.Drawable;
10import com.xtremelabs.robolectric.R;
11import com.xtremelabs.robolectric.Robolectric;
12import com.xtremelabs.robolectric.WithTestDefaultsRunner;
13import org.junit.Before;
14import org.junit.Test;
15import org.junit.runner.RunWith;
16
17import java.io.ByteArrayInputStream;
18import java.io.InputStream;
19
20import static com.xtremelabs.robolectric.Robolectric.shadowOf;
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertFalse;
23
24@RunWith(WithTestDefaultsRunner.class)
25public class BitmapDrawableTest {
26    private Resources resources;
27
28    @Before
29    public void setUp() throws Exception {
30        resources = Robolectric.application.getResources();
31    }
32
33    @Test
34    public void getBitmap_shouldReturnBitmapUsedToDraw() throws Exception {
35        BitmapDrawable drawable = (BitmapDrawable) resources.getDrawable(R.drawable.an_image);
36        assertEquals("Bitmap for resource:drawable/an_image", shadowOf(drawable.getBitmap()).getDescription());
37    }
38
39    @Test
40    public void draw_shouldCopyDescriptionToCanvas() throws Exception {
41        BitmapDrawable drawable = (BitmapDrawable) resources.getDrawable(R.drawable.an_image);
42        Canvas canvas = new Canvas();
43        drawable.draw(canvas);
44
45        assertEquals("Bitmap for resource:drawable/an_image", shadowOf(canvas).getDescription());
46    }
47
48    @Test
49    public void shouldInheritSourceStringFromDrawableDotCreateFromStream() throws Exception {
50        InputStream emptyInputStream = new ByteArrayInputStream("".getBytes());
51        BitmapDrawable drawable = (BitmapDrawable) Drawable.createFromStream(emptyInputStream, "source string value");
52        assertEquals("source string value", shadowOf(drawable).getSource());
53    }
54
55    @Test
56    public void withColorFilterSet_draw_shouldCopyDescriptionToCanvas() throws Exception {
57        BitmapDrawable drawable = (BitmapDrawable) resources.getDrawable(R.drawable.an_image);
58        drawable.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix()));
59        Canvas canvas = new Canvas();
60        drawable.draw(canvas);
61
62        assertEquals("Bitmap for resource:drawable/an_image with ColorMatrixColorFilter<1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0>",
63                shadowOf(canvas).getDescription());
64    }
65
66    @Test
67    public void equals_shouldTestResourceId() throws Exception {
68        Drawable drawable1a = resources.getDrawable(R.drawable.an_image);
69        Drawable drawable1b = resources.getDrawable(R.drawable.an_image);
70        Drawable drawable2 = resources.getDrawable(R.drawable.an_other_image);
71
72        assertEquals(drawable1a, drawable1b);
73        assertFalse(drawable1a.equals(drawable2));
74    }
75
76    @Test
77    public void equals_shouldTestBounds() throws Exception {
78        Drawable drawable1a = resources.getDrawable(R.drawable.an_image);
79        Drawable drawable1b = resources.getDrawable(R.drawable.an_image);
80
81        drawable1a.setBounds(1, 2, 3, 4);
82        drawable1b.setBounds(1, 2, 3, 4);
83
84        assertEquals(drawable1a, drawable1b);
85
86        drawable1b.setBounds(1, 2, 3, 5);
87        assertFalse(drawable1a.equals(drawable1b));
88    }
89
90    @Test
91    public void shouldStillHaveShadow() throws Exception {
92        Drawable drawable = resources.getDrawable(R.drawable.an_image);
93        assertEquals(R.drawable.an_image, ((ShadowBitmapDrawable) Robolectric.shadowOf(drawable)).getLoadedFromResourceId());
94    }
95
96    @Test
97    public void shouldSetTileModeXY() throws Exception {
98        BitmapDrawable drawable = (BitmapDrawable) resources.getDrawable(R.drawable.an_image);
99        drawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.MIRROR);
100        assertEquals(Shader.TileMode.REPEAT, drawable.getTileModeX());
101        assertEquals(Shader.TileMode.MIRROR, drawable.getTileModeY());
102    }
103}
104