1 package com.xtremelabs.robolectric.shadows; 2 3 import static org.hamcrest.CoreMatchers.equalTo; 4 import static org.hamcrest.CoreMatchers.not; 5 import static org.hamcrest.CoreMatchers.nullValue; 6 import static org.hamcrest.CoreMatchers.notNullValue; 7 import static org.hamcrest.CoreMatchers.sameInstance; 8 import static org.junit.Assert.assertThat; 9 10 import java.util.HashMap; 11 12 import org.junit.Before; 13 import org.junit.Test; 14 import org.junit.runner.RunWith; 15 16 import android.app.Activity; 17 import android.content.Context; 18 import android.content.Intent; 19 import android.preference.Preference; 20 import android.preference.Preference.OnPreferenceClickListener; 21 import android.util.AttributeSet; 22 23 import com.xtremelabs.robolectric.R; 24 import com.xtremelabs.robolectric.Robolectric; 25 import com.xtremelabs.robolectric.WithTestDefaultsRunner; 26 import com.xtremelabs.robolectric.tester.android.util.TestAttributeSet; 27 28 @RunWith(WithTestDefaultsRunner.class) 29 public class PreferenceTest { 30 31 private TestPreference preference; 32 private ShadowPreference shadow; 33 34 private Context context; 35 private TestAttributeSet attrs; 36 37 private boolean clicked = false; 38 39 @Before setup()40 public void setup() { 41 context = new Activity(); 42 attrs = new TestAttributeSet( new HashMap<String, String>() ); 43 preference = new TestPreference(context, attrs); 44 shadow = Robolectric.shadowOf( preference ); 45 } 46 47 @Test shouldConstruct()48 public void shouldConstruct() { 49 int defStyle = 7; 50 51 preference = new TestPreference(context, attrs, defStyle); 52 shadow = Robolectric.shadowOf(preference); 53 assertThat(shadow.getContext(), sameInstance(context)); 54 assertThat(shadow.getAttrs(), sameInstance((AttributeSet)attrs)); 55 assertThat(shadow.getDefStyle(), equalTo(defStyle)); 56 57 preference = new TestPreference(context, attrs); 58 shadow = Robolectric.shadowOf(preference); 59 assertThat(shadow.getContext(), sameInstance( context )); 60 assertThat(shadow.getAttrs(), sameInstance((AttributeSet)attrs)); 61 assertThat(shadow.getDefStyle(), equalTo(0)); 62 63 preference = new TestPreference(context); 64 shadow = Robolectric.shadowOf(preference); 65 assertThat(shadow.getContext(), sameInstance( context )); 66 assertThat(shadow.getAttrs(), nullValue()); 67 assertThat(shadow.getDefStyle(), equalTo(0)); 68 } 69 70 @Test shouldInitializeFromAttributes()71 public void shouldInitializeFromAttributes() { 72 String key = "key_value"; 73 HashMap<String, String> hash = new HashMap<String, String>(); 74 hash.put( "android:key", key ); 75 attrs = new TestAttributeSet( hash ); 76 77 preference = new TestPreference(context, attrs); 78 assertThat( preference.getKey(), equalTo(key) ); 79 } 80 81 @Test shouldHaveAKey()82 public void shouldHaveAKey() { 83 String key = "key_value"; 84 85 assertThat(preference.getKey(), nullValue()); 86 preference.setKey(key); 87 assertThat(preference.getKey(), equalTo(key)); 88 } 89 90 @Test shouldHaveATitle()91 public void shouldHaveATitle() { 92 CharSequence title = "Test Preference"; 93 94 assertThat(preference.getTitle(), nullValue()); 95 preference.setTitle(title); 96 assertThat(preference.getTitle(), equalTo(title)); 97 } 98 99 @Test shouldSetTitleByResourceId()100 public void shouldSetTitleByResourceId() { 101 CharSequence expected = "Hello"; 102 103 assertThat(preference.getTitle(), not(equalTo(expected))); 104 preference.setTitle(R.string.hello); 105 assertThat(preference.getTitle(), equalTo(expected)); 106 } 107 108 @Test shouldHaveASummary()109 public void shouldHaveASummary() { 110 CharSequence summary = "This is only a test."; 111 112 assertThat(preference.getSummary(), nullValue()); 113 preference.setSummary(summary); 114 assertThat(preference.getSummary(), equalTo(summary)); 115 } 116 117 @Test shouldSetSummaryByResourceId()118 public void shouldSetSummaryByResourceId() { 119 CharSequence expected = "Hello"; 120 121 assertThat(preference.getSummary(), not(equalTo(expected))); 122 preference.setSummary(R.string.hello); 123 assertThat(preference.getSummary(), equalTo(expected)); 124 } 125 126 @Test shouldRememberDefaultValue()127 public void shouldRememberDefaultValue() { 128 Object defaultValue = "Zoodles was here"; 129 130 assertThat(shadow.getDefaultValue(), nullValue()); 131 preference.setDefaultValue(defaultValue); 132 assertThat(shadow.getDefaultValue(), sameInstance(defaultValue)); 133 } 134 135 @Test shouldOrder()136 public void shouldOrder() { 137 int[] values = { 0, 1, 2, 2011 }; 138 139 for(int order : values) { 140 preference.setOrder(order); 141 assertThat(preference.getOrder(), equalTo(order)); 142 } 143 } 144 145 @Test shouldEnable()146 public void shouldEnable() { 147 assertThat(preference.isEnabled(), equalTo(true)); 148 149 preference.setEnabled(false); 150 assertThat(preference.isEnabled(), equalTo(false)); 151 152 preference.setEnabled(true); 153 assertThat(preference.isEnabled(), equalTo(true)); 154 } 155 156 @Test testPersistent()157 public void testPersistent() { 158 boolean[] values = { true, false }; 159 160 for( boolean shouldPersist : values ) { 161 shadow.setPersistent(shouldPersist); 162 assertThat(preference.shouldPersist(), equalTo(shouldPersist)); 163 assertThat(preference.isPersistent(), equalTo(shouldPersist)); 164 } 165 } 166 167 @Test shouldPersistedIn()168 public void shouldPersistedIn() { 169 int defaultValue = 727; 170 int[] values = { 0, 1, 2, 2011 }; 171 172 for(int persistedInt : values) { 173 shadow.persistInt(persistedInt); 174 175 shadow.setPersistent(false); 176 assertThat(preference.getPersistedInt(defaultValue), equalTo(defaultValue)); 177 178 shadow.setPersistent(true); 179 assertThat(preference.getPersistedInt(defaultValue), equalTo(persistedInt)); 180 } 181 } 182 183 @Test shouldRememberOnClickListener()184 public void shouldRememberOnClickListener() { 185 Preference.OnPreferenceClickListener onPreferenceClickListener = new OnPreferenceClickListener() { 186 @Override 187 public boolean onPreferenceClick(Preference preference) { 188 return true; 189 } 190 }; 191 192 preference.setOnPreferenceClickListener(onPreferenceClickListener); 193 assertThat(shadow.getOnPreferenceClickListener(), sameInstance(onPreferenceClickListener)); 194 } 195 196 @Test shouldClickThroughToClickListener()197 public void shouldClickThroughToClickListener() { 198 Preference.OnPreferenceClickListener onPreferenceClickListener = new OnPreferenceClickListener() { 199 @Override 200 public boolean onPreferenceClick(Preference preference) { 201 clicked = true; 202 return true; 203 } 204 }; 205 preference.setOnPreferenceClickListener(onPreferenceClickListener); 206 207 assertThat( clicked, equalTo(false)); 208 assertThat( shadow.click(), equalTo(true)); 209 assertThat( clicked, equalTo(true)); 210 } 211 212 @Test shouldCallChangeListener()213 public void shouldCallChangeListener() { 214 Integer[] values = { 0, 1, 2, 2011 }; 215 216 for(Integer newValue : values) { 217 assertThat(preference.callChangeListener(newValue), equalTo(true)); 218 assertThat(shadow.getCallChangeListenerValue(), sameInstance((Object)newValue)); 219 } 220 } 221 222 @Test shouldReturnIntent()223 public void shouldReturnIntent() { 224 assertThat( preference.getIntent(), nullValue() ); 225 preference.setIntent( new Intent() ); 226 assertThat( preference.getIntent(), notNullValue() ); 227 } 228 229 @Test shouldRememberDependency()230 public void shouldRememberDependency() { 231 assertThat( preference.getDependency(), nullValue() ); 232 preference.setDependency( "TEST_PREF_KEY" ); 233 assertThat( preference.getDependency(), notNullValue() ); 234 assertThat( preference.getDependency(), equalTo("TEST_PREF_KEY") ); 235 } 236 237 private static class TestPreference extends Preference { TestPreference(Context context)238 public TestPreference(Context context) { 239 super(context); 240 } 241 TestPreference(Context context, AttributeSet attrs)242 public TestPreference(Context context, AttributeSet attrs) { 243 super(context, attrs); 244 } 245 TestPreference(Context context, AttributeSet attrs, int defStyle)246 public TestPreference(Context context, AttributeSet attrs, int defStyle) { 247 super(context, attrs, defStyle); 248 } 249 shouldPersist()250 public boolean shouldPersist() { 251 return super.shouldPersist(); 252 } 253 getPersistedInt(int defaultReturnValue)254 public int getPersistedInt(int defaultReturnValue) { 255 return super.getPersistedInt(defaultReturnValue); 256 } 257 persistInt(int value)258 public boolean persistInt(int value) { 259 return super.persistInt(value); 260 } 261 callChangeListener(Object newValue)262 public boolean callChangeListener(Object newValue) { 263 return super.callChangeListener(newValue); 264 } 265 } 266 } 267