1package com.xtremelabs.robolectric.res;
2
3import android.graphics.drawable.Drawable;
4import android.graphics.drawable.LayerDrawable;
5import android.graphics.drawable.StateListDrawable;
6import com.xtremelabs.robolectric.R;
7import com.xtremelabs.robolectric.Robolectric;
8import com.xtremelabs.robolectric.WithTestDefaultsRunner;
9import com.xtremelabs.robolectric.shadows.ShadowStateListDrawable;
10import org.junit.Before;
11import org.junit.Test;
12import org.junit.runner.RunWith;
13
14import static com.xtremelabs.robolectric.util.TestUtil.getSystemResourceDir;
15import static com.xtremelabs.robolectric.util.TestUtil.resourceFile;
16import static org.hamcrest.CoreMatchers.equalTo;
17import static org.hamcrest.CoreMatchers.instanceOf;
18import static org.hamcrest.CoreMatchers.nullValue;
19import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertFalse;
21import static org.junit.Assert.assertThat;
22import static org.junit.Assert.assertTrue;
23
24/**
25 * DrawableResourceLoaderTest
26 */
27@RunWith(WithTestDefaultsRunner.class)
28public class DrawableResourceLoaderTest {
29    protected DrawableResourceLoader resourceLoader;
30
31    @Before
32    public void setup() throws Exception {
33        ResourceExtractor extractor = new ResourceExtractor();
34        extractor.addLocalRClass(R.class);
35        extractor.addSystemRClass(android.R.class);
36
37        resourceLoader = new DrawableResourceLoader(extractor, resourceFile("res"));
38        DocumentLoader documentLoader = new DocumentLoader(resourceLoader);
39
40        documentLoader.loadResourceXmlDir(resourceFile("res", "drawable"));
41        documentLoader.loadSystemResourceXmlDir(getSystemResourceDir("drawable"));
42    }
43
44    @Test
45    public void testProcessResourceXml() throws Exception {
46        assertTrue("drawable/rainbow", resourceLoader.documents.containsKey("drawable/rainbow"));
47        assertEquals("documents.size", 116, resourceLoader.documents.size());
48    }
49
50    @Test
51    public void testIsXml_rainbow() throws Exception {
52        assertTrue(resourceLoader.isXml(R.drawable.rainbow));
53    }
54
55    @Test
56    public void testIsXml_shouldWorkWithSystem() throws Exception {
57        assertTrue(resourceLoader.isXml(android.R.drawable.ic_popup_sync));
58    }
59
60    @Test
61    public void testIsXml_red() throws Exception {
62        boolean result = resourceLoader.isXml(R.drawable.l0_red);
63        assertFalse("result", result);
64    }
65
66    @Test
67    public void testGetDrawableIds() {
68        int[] expected = { R.drawable.l7_white, R.drawable.l0_red,
69                R.drawable.l1_orange, R.drawable.l2_yellow,
70                R.drawable.l3_green, R.drawable.l4_blue, R.drawable.l5_indigo,
71                R.drawable.l6_violet };
72
73        int[] result = resourceLoader.getDrawableIds(R.drawable.rainbow);
74        for (int i = 0; i < expected.length; i++) {
75            assertEquals("result[" + i + "]", expected[i], result[i]);
76        }
77    }
78
79    @Test
80    public void testGetDrawableIds_shouldWorkWithSystem() throws Exception {
81        int[] result = resourceLoader.getDrawableIds(android.R.drawable.ic_popup_sync);
82        for (int resultItem : result) {
83            assertEquals(-1, resultItem);
84        }
85    }
86
87    @Test
88    public void testNotXmlDrawable() {
89        int[] drawables = { R.drawable.l7_white, R.drawable.l0_red,
90                R.drawable.l1_orange, R.drawable.l2_yellow,
91                R.drawable.l3_green, R.drawable.l4_blue, R.drawable.l5_indigo,
92                R.drawable.l6_violet };
93
94        for (int i = 0; i < drawables.length; i++) {
95        	Drawable drawable = resourceLoader.getXmlDrawable( drawables[i] );
96        	assertThat( drawable, nullValue() );
97        }
98    }
99
100    @Test
101    public void testLayerDrawable() {
102    	Drawable drawable = resourceLoader.getXmlDrawable( R.drawable.rainbow );
103    	assertThat( drawable, instanceOf( LayerDrawable.class ) );
104    }
105
106    @Test
107    public void testStateListDrawable() {
108    	Drawable drawable = resourceLoader.getXmlDrawable( R.drawable.state_drawable );
109    	assertThat( drawable, instanceOf( StateListDrawable.class ) );
110    	ShadowStateListDrawable shDrawable = Robolectric.shadowOf( ( StateListDrawable ) drawable );
111    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_selected ), equalTo( R.drawable.l0_red ) );
112    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_pressed ), equalTo( R.drawable.l1_orange ) );
113    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_focused ), equalTo( R.drawable.l2_yellow ) );
114    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_checkable ), equalTo( R.drawable.l3_green ) );
115    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_checked ), equalTo( R.drawable.l4_blue ) );
116    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_enabled ), equalTo( R.drawable.l5_indigo ) );
117    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_window_focused ), equalTo( R.drawable.l6_violet ) );
118    	assertThat( shDrawable.getResourceIdForState( android.R.attr.state_active ), equalTo( R.drawable.l7_white ) );
119    }
120}
121