aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--resources/src/main/java/org/robolectric/res/android/ConfigDescription.java5
-rw-r--r--resources/src/main/java/org/robolectric/res/android/ResTable_config.java33
-rw-r--r--robolectric/src/test/java/org/robolectric/QualifiersTest.java29
-rw-r--r--robolectric/src/test/java/org/robolectric/android/ResourceLoaderTest.java17
-rw-r--r--robolectric/src/test/resources/res/values-b+sr+Latn/values.xml5
5 files changed, 56 insertions, 33 deletions
diff --git a/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java b/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java
index 45aeee039..72f4f3a9a 100644
--- a/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java
+++ b/resources/src/main/java/org/robolectric/res/android/ConfigDescription.java
@@ -93,10 +93,10 @@ public class ConfigDescription {
int initFromParts(PeekingIterator<String> iter) {
String part = iter.peek();
- if (part.indexOf(0) == 'b' && part.indexOf(1) == '+') {
+ if (part.startsWith("b+")) {
// This is a "modified" BCP 47 language tag. Same semantics as BCP 47 tags,
// except that the separator is "+" and not "-".
- String[] subtags = part.toLowerCase().split("\\+");
+ String[] subtags = part.substring(2).toLowerCase().split("\\+");
if (subtags.length == 1) {
set_language(subtags[0]);
} else if (subtags.length == 2) {
@@ -689,6 +689,7 @@ public class ConfigDescription {
return true;
}
+ // check that we have 'dpi' after the last digit.
Matcher matcher = DENSITY_PATTERN.matcher(name);
if (matcher.matches()) {
out.density = Integer.parseInt(matcher.group(1));
diff --git a/resources/src/main/java/org/robolectric/res/android/ResTable_config.java b/resources/src/main/java/org/robolectric/res/android/ResTable_config.java
index 91ea4fa10..d949cee7a 100644
--- a/resources/src/main/java/org/robolectric/res/android/ResTable_config.java
+++ b/resources/src/main/java/org/robolectric/res/android/ResTable_config.java
@@ -615,37 +615,30 @@ public class ResTable_config {
return new String(value, US_ASCII);
}
- /* static */ void packLanguageOrRegion(final byte[] in, final byte base,
- final byte out[]) {
- if (in.length < 3 || in[2] == 0 || in[2] == '-') {
- out[0] = in[0];
- out[1] = in[1];
+ /* static */ void packLanguageOrRegion(final String in, final byte base,
+ final byte[] out) {
+ if (in == null) {
+ out[0] = 0;
+ out[1] = 0;
+ } else if (in.length() < 3 || in.charAt(2) == 0 || in.charAt(2) == '-') {
+ out[0] = (byte) in.charAt(0);
+ out[1] = (byte) in.charAt(1);
} else {
- byte first = (byte) ((in[0] - base) & 0x007f);
- byte second = (byte) ((in[1] - base) & 0x007f);
- byte third = (byte) ((in[2] - base) & 0x007f);
+ byte first = (byte) ((in.charAt(0) - base) & 0x007f);
+ byte second = (byte) ((in.charAt(1) - base) & 0x007f);
+ byte third = (byte) ((in.charAt(2) - base) & 0x007f);
out[0] = (byte) (0x80 | (third << 2) | (second >> 3));
out[1] = (byte) ((second << 5) | first);
}
}
- void packLanguage(final byte[] language) {
- packLanguageOrRegion(language, (byte) 'a', this.language);
- }
-
void packLanguage(final String language) {
- byte[] bytes = language == null ? new byte[2] : language.getBytes();
- packLanguageOrRegion(bytes, (byte) 'a', this.language);
- }
-
- void packRegion(final byte[] region) {
- packLanguageOrRegion(region, (byte) '0', this.country);
+ packLanguageOrRegion(language, (byte) 'a', this.language);
}
void packRegion(final String region) {
- byte[] bytes = region == null ? new byte[2] : region.getBytes();
- packLanguageOrRegion(bytes, (byte) '0', this.country);
+ packLanguageOrRegion(region, (byte) '0', this.country);
}
private String unpackLanguage() {
diff --git a/robolectric/src/test/java/org/robolectric/QualifiersTest.java b/robolectric/src/test/java/org/robolectric/QualifiersTest.java
index c90db03f9..e1437ddaf 100644
--- a/robolectric/src/test/java/org/robolectric/QualifiersTest.java
+++ b/robolectric/src/test/java/org/robolectric/QualifiersTest.java
@@ -4,8 +4,10 @@ import static org.assertj.core.api.Assertions.assertThat;
import android.app.Activity;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.view.View;
import android.widget.TextView;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
@@ -14,6 +16,13 @@ import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
public class QualifiersTest {
+ private Resources resources;
+
+ @Before
+ public void setUp() throws Exception {
+ resources = RuntimeEnvironment.application.getResources();
+ }
+
@Test
@Config(sdk = 26)
public void testDefaultQualifiers() throws Exception {
@@ -39,30 +48,36 @@ public class QualifiersTest {
@Test @Config(qualifiers = "de")
public void getQuantityString() throws Exception {
- assertThat(RuntimeEnvironment.application.getResources().getQuantityString(R.plurals.minute, 2)).isEqualTo(RuntimeEnvironment.application.getResources().getString(R.string.minute_plural));
+ assertThat(resources.getQuantityString(R.plurals.minute, 2)).isEqualTo(
+ resources.getString(R.string.minute_plural));
}
@Test
public void inflateLayout_defaultsTo_sw320dp() throws Exception {
View view = Robolectric.setupActivity(Activity.class).getLayoutInflater().inflate(R.layout.layout_smallest_width, null);
- TextView textView = (TextView) view.findViewById(R.id.text1);
+ TextView textView = view.findViewById(R.id.text1);
assertThat(textView.getText()).isEqualTo("320");
- assertThat(RuntimeEnvironment.application.getResources().getConfiguration().smallestScreenWidthDp).isEqualTo(320);
+ assertThat(resources.getConfiguration().smallestScreenWidthDp).isEqualTo(320);
}
@Test @Config(qualifiers = "sw720dp")
public void inflateLayout_overridesTo_sw720dp() throws Exception {
View view = Robolectric.setupActivity(Activity.class).getLayoutInflater().inflate(R.layout.layout_smallest_width, null);
- TextView textView = (TextView) view.findViewById(R.id.text1);
+ TextView textView = view.findViewById(R.id.text1);
assertThat(textView.getText()).isEqualTo("720");
- assertThat(RuntimeEnvironment.application.getResources().getConfiguration().smallestScreenWidthDp).isEqualTo(720);
+ assertThat(resources.getConfiguration().smallestScreenWidthDp).isEqualTo(720);
+ }
+
+ @Test @Config(qualifiers = "b+sr+Latn")
+ public void supportsBcp47() throws Exception {
+ assertThat(resources.getString(R.string.hello)).isEqualTo("Zdravo");
}
@Test
public void defaultScreenWidth() {
- assertThat(RuntimeEnvironment.application.getResources().getBoolean(R.bool.value_only_present_in_w320dp)).isTrue();
- assertThat(RuntimeEnvironment.application.getResources().getConfiguration().screenWidthDp).isEqualTo(320);
+ assertThat(resources.getBoolean(R.bool.value_only_present_in_w320dp)).isTrue();
+ assertThat(resources.getConfiguration().screenWidthDp).isEqualTo(320);
}
}
diff --git a/robolectric/src/test/java/org/robolectric/android/ResourceLoaderTest.java b/robolectric/src/test/java/org/robolectric/android/ResourceLoaderTest.java
index f5c5b31ee..eb5af9173 100644
--- a/robolectric/src/test/java/org/robolectric/android/ResourceLoaderTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/ResourceLoaderTest.java
@@ -2,15 +2,18 @@ package org.robolectric.android;
import static org.assertj.core.api.Assertions.assertThat;
+import android.content.res.Configuration;
+import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
+import java.util.Locale;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.R;
import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.res.ResName;
import org.robolectric.res.ResourceTable;
@@ -22,7 +25,7 @@ public class ResourceLoaderTest {
@Config(qualifiers = "doesnotexist-land-xlarge")
public void testChoosesLayoutBasedOnSearchPath_respectsOrderOfPath() throws Exception {
View view = LayoutInflater.from(RuntimeEnvironment.application).inflate(R.layout.different_screen_sizes, null);
- TextView textView = (TextView) view.findViewById(android.R.id.text1);
+ TextView textView = view.findViewById(android.R.id.text1);
assertThat(textView.getText().toString()).isEqualTo("land");
}
@@ -49,10 +52,16 @@ public class ResourceLoaderTest {
}
private void checkForPollutionHelper() {
+ assertThat(RuntimeEnvironment.getQualifiers()).isEqualTo("");
+
View view = LayoutInflater.from(RuntimeEnvironment.application).inflate(R.layout.different_screen_sizes, null);
- TextView textView = (TextView) view.findViewById(android.R.id.text1);
+ TextView textView = view.findViewById(android.R.id.text1);
assertThat(textView.getText().toString()).isEqualTo("default");
- RuntimeEnvironment.setQualifiers("land"); // testing if this pollutes the other test
+ RuntimeEnvironment.setQualifiers("fr-land"); // testing if this pollutes the other test
+ Configuration configuration = Resources.getSystem().getConfiguration();
+ configuration.setLocale(new Locale("fr", "FR"));
+ configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
+ Resources.getSystem().updateConfiguration(configuration, null);
}
@Test
diff --git a/robolectric/src/test/resources/res/values-b+sr+Latn/values.xml b/robolectric/src/test/resources/res/values-b+sr+Latn/values.xml
new file mode 100644
index 000000000..f8b057e25
--- /dev/null
+++ b/robolectric/src/test/resources/res/values-b+sr+Latn/values.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="howdy">Kako si</string>
+ <string name="hello">Zdravo</string>
+</resources> \ No newline at end of file