1package com.xtremelabs.robolectric.res;
2
3import static com.xtremelabs.robolectric.util.TestUtil.resourceFile;
4
5import org.junit.Before;
6import org.junit.Test;
7import org.junit.runner.RunWith;
8
9import android.app.Activity;
10import android.preference.CheckBoxPreference;
11import android.preference.EditTextPreference;
12import android.preference.ListPreference;
13import android.preference.Preference;
14import android.preference.PreferenceCategory;
15import android.preference.PreferenceScreen;
16import android.preference.RingtonePreference;
17
18import com.xtremelabs.robolectric.R;
19import com.xtremelabs.robolectric.Robolectric;
20import com.xtremelabs.robolectric.WithTestDefaultsRunner;
21import com.xtremelabs.robolectric.util.I18nException;
22
23import static org.hamcrest.CoreMatchers.equalTo;
24import static org.hamcrest.CoreMatchers.instanceOf;
25import static org.junit.Assert.assertThat;
26
27@RunWith(WithTestDefaultsRunner.class)
28public class PreferenceLoaderTest {
29	private PreferenceLoader prefLoader;
30
31    @Before
32    public void setUp() throws Exception {
33        Robolectric.bindDefaultShadowClasses();
34
35        ResourceExtractor resourceExtractor = new ResourceExtractor();
36        resourceExtractor.addLocalRClass(R.class);
37        StringResourceLoader stringResourceLoader = new StringResourceLoader(resourceExtractor);
38        new DocumentLoader(stringResourceLoader).loadResourceXmlDir(resourceFile("res", "values"));
39        prefLoader = new PreferenceLoader(resourceExtractor);
40        new DocumentLoader(prefLoader).loadResourceXmlDir(resourceFile("res", "xml"));
41    }
42
43    @Test
44    public void shouldCreateCorrectClasses() {
45    	PreferenceScreen screen = prefLoader.inflatePreferences(new Activity(), "xml/preferences");
46    	assertThatScreenMatchesExpected(screen);
47    }
48
49    @Test
50    public void shouldLoadByResourceId() {
51       	PreferenceScreen screen = prefLoader.inflatePreferences(new Activity(), R.xml.preferences);
52       	assertThatScreenMatchesExpected(screen);
53    }
54
55    @Test(expected=I18nException.class)
56    public void shouldThrowI18nExceptionOnPrefsWithBareStrings() throws Exception {
57        ResourceExtractor resourceExtractor = new ResourceExtractor();
58        resourceExtractor.addLocalRClass(R.class);
59        StringResourceLoader stringResourceLoader = new StringResourceLoader(resourceExtractor);
60        new DocumentLoader(stringResourceLoader).loadResourceXmlDir(resourceFile("res", "values"));
61        prefLoader = new PreferenceLoader(resourceExtractor);
62        prefLoader.setStrictI18n(true);
63        new DocumentLoader(prefLoader).loadResourceXmlDir(resourceFile("res", "xml"));
64
65        prefLoader.inflatePreferences(Robolectric.application, R.xml.preferences);
66    }
67
68    protected void assertThatScreenMatchesExpected(PreferenceScreen screen) {
69    	assertThat(screen.getPreferenceCount(), equalTo(6));
70
71    	assertThat(screen.getPreference(0), instanceOf(PreferenceCategory.class));
72    	assertThat(((PreferenceCategory)screen.getPreference(0)).getPreference(0), instanceOf(Preference.class));
73
74    	assertThat(screen.getPreference(1), instanceOf(CheckBoxPreference.class));
75    	assertThat(screen.getPreference(2), instanceOf(EditTextPreference.class));
76    	assertThat(screen.getPreference(3), instanceOf(ListPreference.class));
77    	assertThat(screen.getPreference(4), instanceOf(Preference.class));
78    	assertThat(screen.getPreference(5), instanceOf(RingtonePreference.class));
79    }
80}
81