1package com.xtremelabs.robolectric.res;
2
3import android.view.View;
4import com.xtremelabs.robolectric.R;
5import com.xtremelabs.robolectric.WithTestDefaultsRunner;
6import com.xtremelabs.robolectric.tester.android.util.TestAttributeSet;
7import com.xtremelabs.robolectric.util.CustomView;
8import org.junit.Before;
9import org.junit.Test;
10import org.junit.runner.RunWith;
11
12import java.util.HashMap;
13
14import static com.xtremelabs.robolectric.util.TestUtil.resourceFile;
15import static junit.framework.Assert.assertEquals;
16import static org.hamcrest.CoreMatchers.equalTo;
17import static org.hamcrest.MatcherAssert.assertThat;
18
19@RunWith(WithTestDefaultsRunner.class)
20public class TestAttributeSetTest {
21    private HashMap<String, String> attributes;
22    private ResourceExtractor resourceExtractor;
23
24    @Before
25    public void setUp() throws Exception {
26        attributes = new HashMap<String, String>();
27
28        resourceExtractor = new ResourceExtractor();
29        resourceExtractor.addLocalRClass(R.class);
30        resourceExtractor.addSystemRClass(android.R.class);
31    }
32
33    @Test
34    public void getSystemAttributeResourceValue_shouldReturnTheResourceValue() throws Exception {
35        attributes.put("android:id", "@android:id/text1");
36        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
37        assertThat(testAttributeSet.getAttributeResourceValue("android", "id", 0), equalTo(android.R.id.text1));
38    }
39
40    @Test
41    public void getSystemAttributeResourceValue_shouldNotReturnTheResourceValueIfNameSpaceDoesNotMatch() throws Exception {
42        attributes.put("id", "@id/text1");
43        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
44        assertEquals(0, testAttributeSet.getAttributeResourceValue("android", "id", 0));
45    }
46
47    @Test
48    public void getSystemAttributeResourceValue_shouldReturnDefaultValueForNullResourceId() throws Exception {
49        attributes.put("id", "@null");
50        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
51        assertEquals(0, testAttributeSet.getAttributeResourceValue("com.some.namespace", "id", 0));
52    }
53
54    @Test
55    public void shouldCopeWithDefiningSystemIds() throws Exception {
56        attributes.put("android:id", "@+id/text1");
57
58        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, true);
59        assertThat(testAttributeSet.getAttributeResourceValue("android", "id", 0), equalTo(android.R.id.text1));
60    }
61
62    @Test
63    public void shouldCopeWithDefiningLocalIds() throws Exception {
64        attributes.put("android:id", "@+id/text1");
65
66        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
67        assertThat(testAttributeSet.getAttributeResourceValue("android", "id", 0), equalTo(R.id.text1));
68    }
69
70    @Test
71    public void getAttributeResourceValue_shouldReturnTheResourceValue() throws Exception {
72        attributes.put("message", "@string/howdy");
73
74        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
75        assertThat(testAttributeSet.getAttributeResourceValue("com.some.namespace", "message", 0), equalTo(R.string.howdy));
76    }
77
78    @Test
79    public void getAttributeResourceValue_withNamespace_shouldReturnTheResourceValue() throws Exception {
80        attributes.put("message", "@string/howdy");
81
82        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
83        assertThat(testAttributeSet.getAttributeResourceValue("com.some.namespace", "message", 0), equalTo(R.string.howdy));
84    }
85
86    @Test
87    public void getAttributeResourceValue_shouldReturnDefaultValueWhenNotInAttributeSet() throws Exception {
88        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, resourceExtractor, null, null, false);
89        assertThat(testAttributeSet.getAttributeResourceValue("com.some.namespace", "message", -1), equalTo(-1));
90    }
91
92    @Test
93    public void getAttributeBooleanValue_shouldGetBooleanValuesFromAttributes() throws Exception {
94        attributes.put("isSugary", "true");
95
96        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, null, null, null, false);
97        assertThat(testAttributeSet.getAttributeBooleanValue("com.some.namespace", "isSugary", false), equalTo(true));
98    }
99
100    @Test
101    public void getAttributeBooleanValue_withNamespace_shouldGetBooleanValuesFromAttributes() throws Exception {
102        attributes.put("xxx:isSugary", "true");
103
104        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, null, null, null, false);
105        assertThat(testAttributeSet.getAttributeBooleanValue("com.some.namespace", "isSugary", false), equalTo(true));
106    }
107
108    @Test
109    public void getAttributeBooleanValue_shouldReturnDefaultBooleanValueWhenNotInAttributeSet() throws Exception {
110        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, null, null, null, false);
111        assertThat(testAttributeSet.getAttributeBooleanValue("com.some.namespace", "isSugary", true), equalTo(true));
112    }
113
114    @Test
115    public void getAttributeValue_shouldReturnValueFromAttribute() throws Exception {
116        attributes.put("isSugary", "oh heck yeah");
117
118        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, null, null, null, false);
119        assertThat(testAttributeSet.getAttributeValue("com.some.namespace", "isSugary"), equalTo("oh heck yeah"));
120    }
121
122    @Test
123    public void getAttributeIntValue_shouldReturnValueFromAttribute() throws Exception {
124        attributes.put("sugarinessPercent", "100");
125
126        AttrResourceLoader resourceLoader = new AttrResourceLoader(resourceExtractor);
127        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, null, resourceLoader, View.class, false);
128        assertThat(testAttributeSet.getAttributeIntValue("some namespace", "sugarinessPercent", 0), equalTo(100));
129    }
130
131    @Test
132    public void getAttributeIntValue_shouldReturnEnumValuesForEnumAttributes() throws Exception {
133        attributes.put("itemType", "string");
134
135        AttrResourceLoader attrResourceLoader = new AttrResourceLoader(resourceExtractor);
136        new DocumentLoader(attrResourceLoader).loadResourceXmlDir(resourceFile("res", "values"));
137        TestAttributeSet testAttributeSet = new TestAttributeSet(attributes, null, attrResourceLoader, CustomView.class, false);
138        assertThat(testAttributeSet.getAttributeIntValue("some namespace", "itemType", 0), equalTo(1));
139    }
140
141    @Test
142    public void getAttributeIntValue_defaultConstructor() throws Exception {
143        TestAttributeSet testAttributeSet = new TestAttributeSet();
144        testAttributeSet.put("sugarinessPercent", "100");
145
146        assertThat(testAttributeSet.getAttributeIntValue("some namespace", "sugarinessPercent", 0), equalTo(100));
147    }
148}
149