1package com.xtremelabs.robolectric.shadows;
2
3import static org.hamcrest.CoreMatchers.equalTo;
4import static org.hamcrest.CoreMatchers.instanceOf;
5import static org.hamcrest.CoreMatchers.sameInstance;
6import static org.junit.Assert.assertThat;
7
8import java.util.HashMap;
9
10import org.junit.Before;
11import org.junit.Test;
12import org.junit.runner.RunWith;
13
14import android.app.Activity;
15import android.content.Context;
16import android.preference.Preference;
17import android.preference.PreferenceGroup;
18import android.util.AttributeSet;
19
20import com.xtremelabs.robolectric.Robolectric;
21import com.xtremelabs.robolectric.WithTestDefaultsRunner;
22import com.xtremelabs.robolectric.tester.android.util.TestAttributeSet;
23
24@RunWith(WithTestDefaultsRunner.class)
25public class PreferenceGroupTest {
26
27	private TestPreferenceGroup group;
28	private ShadowPreferenceGroup shadow;
29	private Context context;
30	private TestAttributeSet attrs;
31	private Preference pref1, pref2;
32
33    @Before
34    public void setUp() throws Exception {
35    	context = new Activity();
36    	attrs = new TestAttributeSet( new HashMap<String, String>() );
37
38    	group = new TestPreferenceGroup(context, attrs);
39    	shadow = Robolectric.shadowOf(group);
40
41		pref1 = new Preference(context);
42		pref1.setKey("pref1");
43
44		pref2 = new Preference(context);
45		pref2.setKey("pref2");
46    }
47
48	@Test
49	public void shouldInheritFromPreference() {
50		assertThat(shadow, instanceOf(ShadowPreference.class));
51	}
52
53	@Test
54	public void shouldAddPreferences() {
55		assertThat( group.getPreferenceCount(), equalTo(0));
56
57		// First add succeeds
58		assertThat( group.addPreference(pref1), equalTo(true));
59		assertThat( group.getPreferenceCount(), equalTo(1));
60
61		// Dupe add fails silently
62		assertThat( group.addPreference(pref1), equalTo(true));
63		assertThat( group.getPreferenceCount(), equalTo(1));
64
65		// Second add succeeds
66		assertThat( group.addPreference(pref2), equalTo(true));
67		assertThat( group.getPreferenceCount(), equalTo(2));
68	}
69
70	@Test
71	public void shouldAddItemFromInflater() {
72		assertThat( group.getPreferenceCount(), equalTo(0));
73
74		// First add succeeds
75		group.addItemFromInflater(pref1);
76		assertThat( group.getPreferenceCount(), equalTo(1));
77
78		// Dupe add fails silently
79		group.addItemFromInflater(pref1);
80		assertThat( group.getPreferenceCount(), equalTo(1));
81
82		// Second add succeeds
83		group.addItemFromInflater(pref2);
84		assertThat( group.getPreferenceCount(), equalTo(2));
85	}
86
87	@Test
88	public void shouldGetPreference() {
89		group.addPreference(pref1);
90		group.addPreference(pref2);
91
92		assertThat( group.getPreference(0), sameInstance(pref1));
93		assertThat( group.getPreference(1), sameInstance(pref2));
94	}
95
96	@Test
97	public void shouldGetPreferenceCount() {
98		assertThat( group.getPreferenceCount(), equalTo(0));
99		group.addPreference(pref1);
100		assertThat( group.getPreferenceCount(), equalTo(1));
101		group.addPreference(pref2);
102		assertThat( group.getPreferenceCount(), equalTo(2));
103	}
104
105	@Test
106	public void shouldRemovePreference() {
107		group.addPreference(pref1);
108		group.addPreference(pref2);
109		assertThat( group.getPreferenceCount(), equalTo(2));
110
111		// First remove succeeds
112		assertThat( group.removePreference(pref1), equalTo(true));
113		assertThat( group.getPreferenceCount(), equalTo(1));
114
115		// Dupe remove fails
116		assertThat( group.removePreference(pref1), equalTo(false));
117		assertThat( group.getPreferenceCount(), equalTo(1));
118
119		// Second remove succeeds
120		assertThat( group.removePreference(pref2), equalTo(true));
121		assertThat( group.getPreferenceCount(), equalTo(0));
122	}
123
124	@Test
125	public void shouldRemoveAll() {
126		group.addPreference(pref1);
127		group.addPreference(pref2);
128		assertThat( group.getPreferenceCount(), equalTo(2));
129
130		group.removeAll();
131		assertThat( group.getPreferenceCount(), equalTo(0));
132	}
133
134	@Test
135	public void shouldFindPreference() {
136		group.addPreference(pref1);
137		group.addPreference(pref2);
138
139		assertThat( group.findPreference(pref1.getKey()), sameInstance(pref1));
140		assertThat( group.findPreference(pref2.getKey()), sameInstance(pref2));
141	}
142
143	@Test
144	public void shouldFindPreferenceRecursively() {
145		TestPreferenceGroup group2 = new TestPreferenceGroup(context, attrs);
146		group2.addPreference(pref2);
147
148		group.addPreference(pref1);
149		group.addPreference(group2);
150
151		assertThat( group.findPreference(pref2.getKey()), sameInstance(pref2));
152	}
153
154	@Test
155	public void shouldSetEnabledRecursively() {
156		boolean[] values = { false, true };
157
158		TestPreferenceGroup group2 = new TestPreferenceGroup(context, attrs);
159		group2.addPreference(pref2);
160
161		group.addPreference(pref1);
162		group.addPreference(group2);
163
164		for( boolean enabled : values ) {
165			group.setEnabled(enabled);
166
167			assertThat(group.isEnabled(), equalTo(enabled));
168			assertThat(group2.isEnabled(), equalTo(enabled));
169			assertThat(pref1.isEnabled(), equalTo(enabled));
170			assertThat(pref2.isEnabled(), equalTo(enabled));
171		}
172	}
173
174	private static class TestPreferenceGroup extends PreferenceGroup {
175		public TestPreferenceGroup(Context context, AttributeSet attrs) {
176			super(context, attrs);
177		}
178	}
179}
180