package fr.prcaen.externalresources; import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; import android.os.Build; import fr.prcaen.externalresources.converter.JsonConverter; import fr.prcaen.externalresources.exception.ExternalResourceException; import fr.prcaen.externalresources.exception.NotFoundException; import fr.prcaen.externalresources.listener.OnExternalResourcesChangeListener; import fr.prcaen.externalresources.listener.OnExternalResourcesLoadFailedListener; import fr.prcaen.externalresources.model.Resources; import fr.prcaen.externalresources.url.DefaultUrl; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @SuppressWarnings("ConstantConditions") @RunWith(RobolectricTestRunner.class) @Config(manifest = "src/main/AndroidManifest.xml", sdk = Build.VERSION_CODES.JELLY_BEAN) public class ExternalResourcesTest { @Mock private Context context; private ExternalResources externalResources; private Resources resources; @Before public void setUp() throws Exception { initMocks(this); when(context.getApplicationContext()).thenReturn(RuntimeEnvironment.application); resources = Resources.fromJson(IOUtils.toString(getClass().getResourceAsStream("/test.json"), "UTF-8")); externalResources = new ExternalResources.Builder(context, new DefaultUrl("/")).defaultResources(resources) .build(); } @Test public void testOnConfigurationChanged() throws Exception { externalResources.onConfigurationChanged( RuntimeEnvironment.application.getResources().getConfiguration()); assertFalse(externalResources.getBoolean("adjust_view_bounds")); } @Test public void testOnConfigurationChangedShouldChange() throws Exception { Configuration configuration = RuntimeEnvironment.application.getResources().getConfiguration(); configuration.fontScale = 12; externalResources.onConfigurationChanged(configuration); assertEquals(externalResources.getString("hello"), "Hello!"); } @Test public void testGetBoolean() throws Exception { assertTrue(externalResources.getBoolean("screen_small")); assertTrue(externalResources.getBoolean(R.bool.is_enabled)); assertTrue(externalResources.getBoolean("is_enabled")); } @Test(expected = NotFoundException.class) public void testGetBooleanNotFound() throws Exception { externalResources.getBoolean("unknown"); } @Test(expected = NotFoundException.class) public void testGetResBooleanNotFound() throws Exception { externalResources.getBoolean(0); } @Test public void testGetColor() throws Exception { assertEquals(Color.parseColor("#80ff0000"), externalResources.getColor("translucent_red")); assertEquals(Color.parseColor("#FF0000"), externalResources.getColor(R.color.red)); assertEquals(Color.parseColor("#FF0000"), externalResources.getColor("red")); } @Test(expected = NotFoundException.class) public void testGetColorNotFound() throws Exception { externalResources.getColor("unknown"); } @Test(expected = NotFoundException.class) public void testGetResColorNotFound() throws Exception { externalResources.getColor(0); } @Test public void testGetDimension() throws Exception { assertEquals(25f, externalResources.getDimension("textview_height")); assertEquals(13559.055f, externalResources.getDimension(R.dimen.standard_gauge)); assertEquals(13559.055f, externalResources.getDimension("standard_gauge")); } @Test(expected = NotFoundException.class) public void testGetDimensionNotFound() throws Exception { externalResources.getDimension("unknown"); } @Test(expected = NotFoundException.class) public void testWrongDimension() throws Exception { externalResources.getDimension("wrong_dimension"); } @Test public void testGetString() throws Exception { assertEquals(externalResources.getString("hello"), "Hello!"); assertEquals(externalResources.getString("hello_world"), "Hello world!"); assertEquals(externalResources.getString(R.string.hello_world), "Hello world!"); } @SuppressWarnings("ResourceType") @Test(expected = NotFoundException.class) public void testGetStringNotFound() throws Exception { externalResources.getString("unknown"); } @SuppressWarnings("ResourceType") @Test(expected = NotFoundException.class) public void testGetResStringNotFound() throws Exception { externalResources.getString(0); } @Test public void testGetStringWithArguments() throws Exception { assertEquals("Hello Peter!", externalResources.getString("string_with_args", "Peter")); assertEquals("Hello world Peter!", externalResources.getString("hello_world_with_args", "Peter")); assertEquals("Hello world Peter!", externalResources.getString(R.string.hello_world_with_args, "Peter")); } @Test(expected = NotFoundException.class) public void testGetStringWithArgumentsNotFound() throws Exception { externalResources.getString("unknown", "bar"); } @Test(expected = NotFoundException.class) public void testGetResStringWithArgumentsNotFound() throws Exception { externalResources.getString(0, "bar"); } @Test public void testGetStringArray() throws Exception { assertEquals(4, externalResources.getStringArray("planets_array").length); assertEquals(2, externalResources.getStringArray("gender").length); assertEquals(2, externalResources.getStringArray(R.array.gender).length); } @Test(expected = NotFoundException.class) public void testGetStringArrayNotFound() throws Exception { externalResources.getStringArray("unknown"); } @Test(expected = NotFoundException.class) public void testGetResStringArrayNotFound() throws Exception { externalResources.getStringArray(0); } @Test public void testGetInteger() throws Exception { assertEquals(75, externalResources.getInteger("max_speed")); assertEquals(5000, externalResources.getInteger("network_connection_speed")); assertEquals(5000, externalResources.getInteger(R.integer.network_connection_speed)); } @Test(expected = NotFoundException.class) public void testGetIntegerNotFound() throws Exception { externalResources.getInteger("unknown"); } @Test(expected = NotFoundException.class) public void testGetResIntegerNotFound() throws Exception { externalResources.getInteger(0); } @Test public void testGetIntArray() throws Exception { assertEquals(4, externalResources.getIntArray("bits").length); assertEquals(5, externalResources.getIntArray("prime_number").length); assertEquals(5, externalResources.getIntArray(R.array.prime_number).length); } @Test(expected = NotFoundException.class) public void testGetIntArrayNotFound() throws Exception { externalResources.getIntArray("unknown"); } @Test(expected = NotFoundException.class) public void testGetResIntArrayNotFound() throws Exception { externalResources.getIntArray(0); } @Test public void testRegister() throws Exception { assertEquals(externalResources.listeners.size(), 0); externalResources.register(new OnExternalResourcesChangeListener() { @Override public void onExternalResourcesChange(ExternalResources externalResources) { } }); assertEquals(externalResources.listeners.size(), 1); } @Test public void testUnRegister() throws Exception { OnExternalResourcesChangeListener listener = new OnExternalResourcesChangeListener() { @Override public void onExternalResourcesChange(ExternalResources externalResources) { } }; externalResources.register(listener); assertEquals(externalResources.listeners.size(), 1); externalResources.unregister(listener); assertEquals(externalResources.listeners.size(), 0); } @Test(expected = IllegalArgumentException.class) public void testGetInstanceWoInitialize() throws Exception { ExternalResources.singleton = null; ExternalResources.getInstance(); } @Test(expected = IllegalArgumentException.class) public void testInitializeWithExternalResourcesWithNull() { ExternalResources.singleton = null; ExternalResources.initialize(null); } @Test(expected = IllegalStateException.class) public void testInitializeWithExternalResourcesAlreadyInitialize() { ExternalResources.singleton = null; ExternalResources.initialize(externalResources); ExternalResources.initialize(externalResources); } @Test public void testGetInstance() throws Exception { ExternalResources.singleton = null; ExternalResources.initialize(externalResources); assertNotNull(ExternalResources.getInstance()); } @Test public void testInitializeWithPath() throws Exception { ExternalResources.singleton = null; assertNotNull(ExternalResources.initialize(context, "/")); } @Test(expected = IllegalArgumentException.class) public void testInitializeWithPathWoContext() throws Exception { ExternalResources.singleton = null; assertNotNull(ExternalResources.initialize(null, "/")); } @Test(expected = IllegalArgumentException.class) public void testInitializeWithPathWoPath() throws Exception { ExternalResources.singleton = null; assertNotNull(ExternalResources.initialize(context, (String) null)); } @Test(expected = IllegalStateException.class) public void testInitializeWitPathAlreadyInitialize() { ExternalResources.singleton = null; ExternalResources.initialize(context, "/"); ExternalResources.initialize(context, "/"); } @Test public void testInitializeWithUrl() throws Exception { ExternalResources.singleton = null; assertNotNull(ExternalResources.initialize(context, new DefaultUrl("/"))); } @Test(expected = IllegalArgumentException.class) public void testInitializeWithUrlWoContext() throws Exception { ExternalResources.singleton = null; assertNotNull(ExternalResources.initialize(null, new DefaultUrl("/"))); } @Test(expected = IllegalArgumentException.class) public void testInitializeWithUrlWoPath() throws Exception { ExternalResources.singleton = null; assertNotNull(ExternalResources.initialize(context, (DefaultUrl) null)); } @Test(expected = IllegalStateException.class) public void testInitializeWitUrlAlreadyInitialize() { ExternalResources.singleton = null; ExternalResources.initialize(context, new DefaultUrl("/")); ExternalResources.initialize(context, new DefaultUrl("/")); } @Test(expected = IllegalArgumentException.class) public void testBuildWithContextNull() throws Exception { new ExternalResources.Builder(null, new DefaultUrl("/")); } @Test(expected = IllegalArgumentException.class) public void testBuildWithUrlNull() throws Exception { new ExternalResources.Builder(context, null); } @Test public void testBuilderCachePolicy() throws Exception { assertNotNull( new ExternalResources.Builder(context, new DefaultUrl("/")).cachePolicy(Cache.POLICY_NONE)); } @Test public void testBuilderLogLevel() throws Exception { assertNotNull( new ExternalResources.Builder(context, new DefaultUrl("/")).logLevel(Logger.LEVEL_DEBUG)); } @Test public void testBuilderDefaultResources() throws Exception { assertNotNull( new ExternalResources.Builder(context, new DefaultUrl("/")).defaultResources(resources)); } @Test(expected = IllegalArgumentException.class) public void testBuilderDefaultResourcesWithNull() throws Exception { new ExternalResources.Builder(context, new DefaultUrl("/")).defaultResources(null); } @Test(expected = IllegalStateException.class) public void testBuilderDefaultResourcesAlreadyDefined() throws Exception { ExternalResources.Builder builder = new ExternalResources.Builder(context, new DefaultUrl("/")).defaultResources(resources); builder.defaultResources(resources); } @Test public void testBuilderListener() throws Exception { assertNotNull(new ExternalResources.Builder(context, new DefaultUrl("/")).failListener( new OnExternalResourcesLoadFailedListener() { @Override public void onExternalResourcesLoadFailed(ExternalResourceException exception) { } })); } @Test(expected = IllegalArgumentException.class) public void testBuilderListenerWithNull() throws Exception { new ExternalResources.Builder(context, new DefaultUrl("/")).failListener(null); } @Test(expected = IllegalStateException.class) public void testBuilderListenerAlreadyDefined() throws Exception { ExternalResources.Builder builder = new ExternalResources.Builder(context, new DefaultUrl("/")).failListener( new OnExternalResourcesLoadFailedListener() { @Override public void onExternalResourcesLoadFailed(ExternalResourceException exception) { } }); builder.failListener(new OnExternalResourcesLoadFailedListener() { @Override public void onExternalResourcesLoadFailed(ExternalResourceException exception) { } }); } @Test public void testBuilderOptions() throws Exception { assertNotNull(new ExternalResources.Builder(context, new DefaultUrl("/")).options( Options.createDefault())); } @Test(expected = IllegalArgumentException.class) public void testBuilderOptionsWithNull() throws Exception { new ExternalResources.Builder(context, new DefaultUrl("/")).options(null); } @Test(expected = IllegalStateException.class) public void testBuilderOptionsAlreadyDefined() throws Exception { ExternalResources.Builder builder = new ExternalResources.Builder(context, new DefaultUrl("/")).options( Options.createDefault()); builder.options(Options.createDefault()); } @Test public void testBuilderConverter() throws Exception { assertNotNull( new ExternalResources.Builder(context, new DefaultUrl("/")).converter(new JsonConverter())); } @Test(expected = IllegalArgumentException.class) public void testBuilderConverterWithNull() throws Exception { new ExternalResources.Builder(context, new DefaultUrl("/")).converter(null); } @Test(expected = IllegalStateException.class) public void testBuilderConverterAlreadyDefined() throws Exception { ExternalResources.Builder builder = new ExternalResources.Builder(context, new DefaultUrl("/")).converter(new JsonConverter()); builder.converter(new JsonConverter()); } @Test(expected = IllegalStateException.class) public void testGetResWithUseApplicationResourcesToFalse() { ExternalResources.Builder builder = new ExternalResources.Builder(context, new DefaultUrl("/")).useApplicationResources(false); builder.build().getString(R.string.hello_world); } @Test(expected = NotFoundException.class) public void testGetWithUseApplicationResourcesToFalse() { ExternalResources.Builder builder = new ExternalResources.Builder(context, new DefaultUrl("/")).useApplicationResources(false); builder.build().getString("hello_world"); } }