Create system Resources explicitly.
diff --git a/src/main/java/com/xtremelabs/robolectric/RobolectricContext.java b/src/main/java/com/xtremelabs/robolectric/RobolectricContext.java
index 788e348..de0b4ce 100644
--- a/src/main/java/com/xtremelabs/robolectric/RobolectricContext.java
+++ b/src/main/java/com/xtremelabs/robolectric/RobolectricContext.java
@@ -8,7 +8,7 @@
import com.xtremelabs.robolectric.bytecode.Setup;
import com.xtremelabs.robolectric.bytecode.ShadowWrangler;
import com.xtremelabs.robolectric.internal.RobolectricTestRunnerInterface;
-import com.xtremelabs.robolectric.res.ResourceLoader;
+import com.xtremelabs.robolectric.res.AndroidResourcePathFinder;
import com.xtremelabs.robolectric.res.ResourcePath;
import org.apache.maven.repository.internal.MavenRepositorySystemSession;
import org.codehaus.plexus.DefaultPlexusContainer;
@@ -166,15 +166,24 @@
}
public List<ResourcePath> getResourcePaths() {
+ List<ResourcePath> resourcePaths = getResourcePathsWithoutSystem();
+ resourcePaths.add(getSystemResourcePath());
+ return resourcePaths;
+ }
+
+ private List<ResourcePath> getResourcePathsWithoutSystem() {
List<ResourcePath> resourcePaths = new ArrayList<ResourcePath>();
resourcePaths.add(getAppManifest().getResourcePath());
for (AndroidManifest libraryManifest : getLibraryManifests()) {
resourcePaths.add(libraryManifest.getResourcePath());
}
- resourcePaths.add(ResourceLoader.getSystemResourcePath(getAppManifest().getRealSdkVersion(), resourcePaths));
return resourcePaths;
}
+ public ResourcePath getSystemResourcePath() {
+ return AndroidResourcePathFinder.getSystemResourcePath(getAppManifest().getRealSdkVersion(), getResourcePathsWithoutSystem());
+ }
+
private Class<?> bootstrapTestClass(Class<?> testClass) {
Class<?> bootstrappedTestClass = robolectricClassLoader.bootstrap(testClass);
return bootstrappedTestClass;
diff --git a/src/main/java/com/xtremelabs/robolectric/RobolectricTestRunner.java b/src/main/java/com/xtremelabs/robolectric/RobolectricTestRunner.java
index a734fe5..ab07221 100644
--- a/src/main/java/com/xtremelabs/robolectric/RobolectricTestRunner.java
+++ b/src/main/java/com/xtremelabs/robolectric/RobolectricTestRunner.java
@@ -11,6 +11,7 @@
import com.xtremelabs.robolectric.res.ResourcePath;
import com.xtremelabs.robolectric.shadows.ShadowApplication;
import com.xtremelabs.robolectric.shadows.ShadowLog;
+import com.xtremelabs.robolectric.shadows.ShadowResources;
import com.xtremelabs.robolectric.util.DatabaseConfig;
import com.xtremelabs.robolectric.util.DatabaseConfig.DatabaseMap;
import com.xtremelabs.robolectric.util.DatabaseConfig.UsingDatabaseMap;
@@ -176,6 +177,9 @@
public void setupApplicationState(Method testMethod) {
boolean strictI18n = determineI18nStrictState(testMethod);
+ ResourceLoader systemResourceLoader = new ResourceLoader(sharedRobolectricContext.getSystemResourcePath());
+ ShadowResources.setSystemResources(systemResourceLoader);
+
ResourceLoader resourceLoader = getResourceLoader(sharedRobolectricContext.getAppManifest());
resourceLoader.setQualifiers(determineResourceQualifiers(testMethod));
resourceLoader.setStrictI18n(strictI18n);
diff --git a/src/main/java/com/xtremelabs/robolectric/res/AndroidResourcePathFinder.java b/src/main/java/com/xtremelabs/robolectric/res/AndroidResourcePathFinder.java
index 38fde8a..e2fe791 100644
--- a/src/main/java/com/xtremelabs/robolectric/res/AndroidResourcePathFinder.java
+++ b/src/main/java/com/xtremelabs/robolectric/res/AndroidResourcePathFinder.java
@@ -1,5 +1,6 @@
package com.xtremelabs.robolectric.res;
+import android.R;
import com.xtremelabs.robolectric.util.PropertiesHelper;
import java.io.BufferedReader;
@@ -14,6 +15,11 @@
private final int sdkVersion;
private final ResourcePath resourcePath;
+ public static ResourcePath getSystemResourcePath(int sdkVersion, List<ResourcePath> resourcePaths) {
+ String pathToAndroidResources = new AndroidResourcePathFinder(sdkVersion, resourcePaths).getPathToAndroidResources();
+ return new ResourcePath(R.class, new File(pathToAndroidResources), null);
+ }
+
public AndroidResourcePathFinder(int sdkVersion, List<ResourcePath> resourcePaths) {
this.resourcePath = resourcePaths == null ? new ResourcePath(null, new File("."), null) : resourcePaths.get(0);
this.sdkVersion = sdkVersion;
diff --git a/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java b/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java
index 15c41db..dcc5f8d 100644
--- a/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java
+++ b/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java
@@ -1,6 +1,5 @@
package com.xtremelabs.robolectric.res;
-import android.R;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
@@ -60,21 +59,12 @@
private final Set<Integer> ninePatchDrawableIds = new HashSet<Integer>();
private String qualifiers = "";
- public static ResourcePath getSystemResourcePath(int sdkVersion, List<ResourcePath> resourcePaths) {
- String pathToAndroidResources = new AndroidResourcePathFinder(sdkVersion, resourcePaths).getPathToAndroidResources();
- return new ResourcePath(R.class, new File(pathToAndroidResources), null);
- }
-
- public ResourceLoader(List<ResourcePath> resourcePaths) {
- this(new ResourceExtractor(resourcePaths), resourcePaths);
- }
-
- public ResourceLoader(ResourcePath... resourcePaths) throws Exception {
+ public ResourceLoader(ResourcePath... resourcePaths) {
this(asList(resourcePaths));
}
- private ResourceLoader(ResourceExtractor resourceExtractor, List<ResourcePath> resourcePaths) {
- this.resourceExtractor = resourceExtractor;
+ public ResourceLoader(List<ResourcePath> resourcePaths) {
+ this.resourceExtractor = new ResourceExtractor(resourcePaths);
this.resourcePaths = Collections.unmodifiableList(resourcePaths);
attrResourceLoader = new AttrResourceLoader();
@@ -87,10 +77,6 @@
roboLayoutInflater = new RoboLayoutInflater(resourceExtractor, viewNodes);
}
- public ResourceLoader copy() {
- return new ResourceLoader(resourceExtractor, resourcePaths);
- }
-
public void setStrictI18n(boolean strict) {
this.strictI18n = strict;
viewLoader.setStrictI18n(strict);
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowApplication.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowApplication.java
index 190d7b2..e333b12 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowApplication.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowApplication.java
@@ -110,7 +110,7 @@
ShadowApplication shadowApplication = shadowOf(application);
if (shadowApplication.resourceLoader != null) throw new RuntimeException("ResourceLoader already set!");
shadowApplication.resourceLoader = resourceLoader;
- shadowApplication.resources = ShadowResources.bind(new Resources(null, null, null), resourceLoader);
+ shadowApplication.resources = ShadowResources.bind(new Resources(null, null, null), resourceLoader);
return application;
}
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowResources.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowResources.java
index c1e6f8c..c7e3975 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowResources.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowResources.java
@@ -33,6 +33,10 @@
private static Resources system = null;
+ public static void setSystemResources(ResourceLoader systemResourceLoader) {
+ system = ShadowResources.bind(new Resources(null, null, null), systemResourceLoader);
+ }
+
static Resources bind(Resources resources, ResourceLoader resourceLoader) {
ShadowResources shadowResources = shadowOf(resources);
if (shadowResources.resourceLoader != null) throw new RuntimeException("ResourceLoader already set!");
@@ -257,14 +261,6 @@
@Implementation
public static Resources getSystem() {
- if (system == null) {
- try {
- initSystemResources();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
return system;
}
@@ -275,18 +271,4 @@
}
return instance;
}
-
-
- /**
- * Creates system resource loader from a copy of the application resource loader. Sets
- * a flag to exclude local resources on initialization.
- */
- private static void initSystemResources() throws Exception {
- ShadowApplication shadowApplication = getShadowApplication();
- if (shadowApplication == null) return; // short-circuit if we're called before an application has been created
-
- final ResourceLoader appResourceLoader = shadowApplication.getResourceLoader();
- final ResourceLoader systemResourceLoader = appResourceLoader.copy();
- system = ShadowResources.bind(new Resources(null, null, null), systemResourceLoader);
- }
}
diff --git a/src/test/java/com/xtremelabs/robolectric/AndroidManifestTest.java b/src/test/java/com/xtremelabs/robolectric/AndroidManifestTest.java
index 4ec84be..9f34447 100644
--- a/src/test/java/com/xtremelabs/robolectric/AndroidManifestTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/AndroidManifestTest.java
@@ -3,7 +3,7 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import com.xtremelabs.robolectric.res.ResourceLoader;
+import com.xtremelabs.robolectric.res.AndroidResourcePathFinder;
import com.xtremelabs.robolectric.res.ResourcePath;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -85,7 +85,7 @@
assertEquals("./src/test/resources/lib1/../lib3/res", resourcePaths.get(2).resourceBase.getPath());
assertEquals("./src/test/resources/lib2/res", resourcePaths.get(3).resourceBase.getPath());
- File resourceBase = ResourceLoader.getSystemResourcePath(appManifest.getRealSdkVersion(), resourcePaths).resourceBase;
+ File resourceBase = AndroidResourcePathFinder.getSystemResourcePath(appManifest.getRealSdkVersion(), resourcePaths).resourceBase;
assertEquals(resourceBase.getPath(), resourcePaths.get(4).resourceBase.getPath());
}
diff --git a/src/test/java/com/xtremelabs/robolectric/RobolectricTestRunnerTest.java b/src/test/java/com/xtremelabs/robolectric/RobolectricTestRunnerTest.java
index 5d9a8b2..da61162 100644
--- a/src/test/java/com/xtremelabs/robolectric/RobolectricTestRunnerTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/RobolectricTestRunnerTest.java
@@ -1,7 +1,7 @@
package com.xtremelabs.robolectric;
-import android.app.Activity;
import android.app.Application;
+import android.content.res.Resources;
import android.widget.TextView;
import com.xtremelabs.robolectric.annotation.DisableStrictI18n;
import com.xtremelabs.robolectric.annotation.EnableStrictI18n;
@@ -17,7 +17,7 @@
@RunWith(RobolectricTestRunnerTest.RunnerForTesting.class)
public class RobolectricTestRunnerTest {
-
+
@Test
public void shouldInitializeAndBindApplicationButNotCallOnCreate() throws Exception {
assertNotNull(Robolectric.application);
@@ -26,6 +26,15 @@
assertNotNull(shadowOf(Robolectric.application).getResourceLoader());
}
+ @Test public void shouldSetUpSystemResources() throws Exception {
+ assertNotNull(Resources.getSystem());
+ assertEquals(Robolectric.application.getResources().getString(android.R.string.copy),
+ Resources.getSystem().getString(android.R.string.copy));
+
+ assertNotNull(Robolectric.application.getResources().getString(R.string.howdy));
+ assertNull(Resources.getSystem().getString(R.string.howdy));
+ }
+
@Test
public void setStaticValue_shouldIgnoreFinalModifier() {
RobolectricContext.setStaticValue(android.os.Build.class, "MODEL", "expected value");
@@ -66,42 +75,42 @@
public void internalBeforeTest_doesNotSetI18nStrictModeFromSystemIfPropertyAbsent() {
assertFalse(Robolectric.getShadowApplication().getResourceLoader().getStrictI18n());
}
-
+
@Test
@EnableStrictI18n
public void methodBlock_setsI18nStrictModeForClassHandler() {
- TextView tv = new TextView(Robolectric.application);
- try {
- tv.setText("Foo");
- fail("TextView#setText(String) should produce an i18nException");
- } catch (Exception e) {
- // Compare exception name because it was loaded in the instrumented classloader
- assertEquals("com.xtremelabs.robolectric.util.I18nException", e.getClass().getName());
- }
+ TextView tv = new TextView(Robolectric.application);
+ try {
+ tv.setText("Foo");
+ fail("TextView#setText(String) should produce an i18nException");
+ } catch (Exception e) {
+ // Compare exception name because it was loaded in the instrumented classloader
+ assertEquals("com.xtremelabs.robolectric.util.I18nException", e.getClass().getName());
+ }
}
-
+
@Test
@EnableStrictI18n
public void createResourceLoader_setsI18nStrictModeForResourceLoader() {
- ResourceLoader loader = Robolectric.shadowOf(Robolectric.application).getResourceLoader();
- assertTrue(Robolectric.getShadowApplication().getResourceLoader().getStrictI18n());
- assertTrue(loader.getStrictI18n());
- try {
- loader.getRoboLayoutInflater().inflateView(Robolectric.application, R.layout.text_views, null);
- fail("ResourceLoader#inflateView should produce an i18nException");
- } catch (Exception e) {
+ ResourceLoader loader = Robolectric.shadowOf(Robolectric.application).getResourceLoader();
+ assertTrue(Robolectric.getShadowApplication().getResourceLoader().getStrictI18n());
+ assertTrue(loader.getStrictI18n());
+ try {
+ loader.getRoboLayoutInflater().inflateView(Robolectric.application, R.layout.text_views, null);
+ fail("ResourceLoader#inflateView should produce an i18nException");
+ } catch (Exception e) {
// classes may not be identical (different classloaders) but should have the same name
- assertEquals(I18nException.class.getName(), e.getClass().getName());
- }
+ assertEquals(I18nException.class.getName(), e.getClass().getName());
+ }
}
-
+
public static class RunnerForTesting extends TestRunners.WithDefaults {
- public static RunnerForTesting instance;
+ public static RunnerForTesting instance;
private final AndroidManifest androidManifest;
public RunnerForTesting(Class<?> testClass) throws InitializationError {
super(testClass);
- instance = this;
+ instance = this;
androidManifest = getRobolectricContext().getAppManifest();
}
@@ -117,9 +126,4 @@
this.onCreateWasCalled = true;
}
}
-
- public static class MyTestActivity extends Activity {
-
- }
-
}
diff --git a/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java b/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java
index b7034c1..8472361 100644
--- a/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java
@@ -32,7 +32,7 @@
@Before
public void setUp() throws Exception {
resourcePath = new ResourcePath(R.class, resourceFile("res"), resourceFile("assets"));
- systemResourcePath = ResourceLoader.getSystemResourcePath(Robolectric.DEFAULT_SDK_VERSION, asList(resourcePath));
+ systemResourcePath = AndroidResourcePathFinder.getSystemResourcePath(Robolectric.DEFAULT_SDK_VERSION, asList(resourcePath));
}
@Test
diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/ApplicationTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/ApplicationTest.java
index 124ee0c..0531871 100644
--- a/src/test/java/com/xtremelabs/robolectric/shadows/ApplicationTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/shadows/ApplicationTest.java
@@ -47,11 +47,11 @@
ResourceLoader resourceLoader1 = new ResourceLoader() {
@Override public String getStringValue(int id) { return "title from resourceLoader1"; }
};
- Application app1 = ShadowApplication.bind(new Application(), resourceLoader1);
-
ResourceLoader resourceLoader2 = new ResourceLoader() {
@Override public String getStringValue(int id) { return "title from resourceLoader2"; }
};
+
+ Application app1 = ShadowApplication.bind(new Application(), resourceLoader1);
Application app2 = ShadowApplication.bind(new Application(), resourceLoader2);
assertEquals("title from resourceLoader1", new ContextWrapper(app1).getResources().getString(R.id.title));
diff --git a/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java b/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java
index a18f358..95e3d1e 100644
--- a/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java
+++ b/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java
@@ -2,7 +2,7 @@
import com.xtremelabs.robolectric.R;
import com.xtremelabs.robolectric.AndroidManifest;
-import com.xtremelabs.robolectric.res.ResourceLoader;
+import com.xtremelabs.robolectric.res.AndroidResourcePathFinder;
import com.xtremelabs.robolectric.res.ResourcePath;
import java.io.BufferedReader;
@@ -25,7 +25,7 @@
public abstract class TestUtil {
public static final ResourcePath TEST_RESOURCE_PATH = new ResourcePath(R.class, resourceFile("res"), resourceFile("assets"));
public static final String TEST_PACKAGE = R.class.getPackage().getName();
- public static final ResourcePath SYSTEM_RESOURCE_PATH = ResourceLoader.getSystemResourcePath(DEFAULT_SDK_VERSION, asList(testResources()));
+ public static final ResourcePath SYSTEM_RESOURCE_PATH = AndroidResourcePathFinder.getSystemResourcePath(DEFAULT_SDK_VERSION, asList(testResources()));
public static final String SYSTEM_PACKAGE = android.R.class.getPackage().getName();
public static File testDirLocation;