diff options
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 |