package roboguice.inject; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; import java.lang.reflect.Field; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.tester.android.content.TestSharedPreferences; import roboguice.RoboGuice; import roboguice.activity.RoboActivity; import roboguice.util.Strings; import com.google.inject.Inject; import com.google.inject.AbstractModule; import android.content.SharedPreferences; import android.preference.PreferenceManager; @SuppressWarnings("ResultOfMethodCallIgnored") @RunWith(RobolectricTestRunner.class) public class SharedPreferencesProviderTest { @Test public void shouldInjectDefaultSharedPrefs() throws Exception { final A a = Robolectric.buildActivity(A.class).create().get(); final Field f = TestSharedPreferences.class.getDeclaredField("filename"); f.setAccessible(true); assertTrue(Strings.notEmpty(f.get(a.prefs))); assertThat(f.get(a.prefs), equalTo(f.get(PreferenceManager.getDefaultSharedPreferences(a)))); } @Test public void shouldInjectNamedSharedPrefs() throws Exception { RoboGuice.getOrCreateBaseApplicationInjector(Robolectric.application,RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(Robolectric.application), new ModuleA() ); try { final A a = Robolectric.buildActivity(A.class).create().get(); final Field f = TestSharedPreferences.class.getDeclaredField("filename"); f.setAccessible(true); assertEquals("FOOBAR", f.get(a.prefs)); } finally { RoboGuice.Util.reset(); } } @Test public void shouldFallbackOnOldDefaultIfPresent() throws Exception { final File oldDefault = new File("shared_prefs/default.xml"); final File oldDir = new File("shared_prefs"); oldDir.mkdirs(); oldDefault.createNewFile(); try { final A a = Robolectric.buildActivity(A.class).create().get(); final Field f = TestSharedPreferences.class.getDeclaredField("filename"); f.setAccessible(true); assertTrue(Strings.notEmpty(f.get(a.prefs))); assertEquals("default.xml", f.get(a.prefs)); } finally { oldDefault.delete(); oldDir.delete(); } } @Test public void shouldNotFallbackOnOldDefaultIfNamedFileSpecified() throws Exception { RoboGuice.getOrCreateBaseApplicationInjector(Robolectric.application,RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(Robolectric.application), new ModuleA() ); final File oldDefault = new File("shared_prefs/default.xml"); final File oldDir = new File("shared_prefs"); oldDir.mkdirs(); oldDefault.createNewFile(); try { final A a = Robolectric.buildActivity(A.class).create().get(); final Field f = TestSharedPreferences.class.getDeclaredField("filename"); f.setAccessible(true); assertTrue(Strings.notEmpty(f.get(a.prefs))); assertEquals("FOOBAR", f.get(a.prefs)); } finally { RoboGuice.Util.reset(); oldDefault.delete(); oldDir.delete(); } } public static class A extends RoboActivity { @Inject SharedPreferences prefs; } public static class ModuleA extends AbstractModule { @Override protected void configure() { bindConstant().annotatedWith(SharedPreferencesName.class).to("FOOBAR"); } } }