OSDN Git Service

Fix Locale.getDisplayName for unlocalizable languages/countries/variants.
authorElliott Hughes <enh@google.com>
Wed, 21 Apr 2010 17:23:08 +0000 (10:23 -0700)
committerElliott Hughes <enh@google.com>
Wed, 21 Apr 2010 17:23:08 +0000 (10:23 -0700)
This does not address the interpretation of script identifiers, but does bring us
in line with the RI's behavior. That's why the test doesn't use the example from
the bug.

Bug: 2611311
Change-Id: I54af89aaf418cd520dc6ebdb1e27dc1ac373f70f

libcore/luni/src/main/java/java/util/Locale.java
libcore/luni/src/test/java/java/util/AllTests.java
libcore/luni/src/test/java/java/util/LocaleTest.java [new file with mode: 0644]

index 8e6354d..7d03eac 100644 (file)
@@ -242,7 +242,7 @@ public final class Locale implements Cloneable, Serializable {
         if (language == null || country == null || variant == null) {
             throw new NullPointerException();
         }
-        if(language.length() == 0 && country.length() == 0){
+        if(language.isEmpty() && country.isEmpty()){
             languageCode = "";
             countryCode = "";
             variantCode = variant;
@@ -398,25 +398,28 @@ public final class Locale implements Cloneable, Serializable {
     public String getDisplayName(Locale locale) {
         int count = 0;
         StringBuilder buffer = new StringBuilder();
-        if (languageCode.length() > 0) {
-            buffer.append(getDisplayLanguage(locale));
-            count++;
+        if (!languageCode.isEmpty()) {
+            String displayLanguage = getDisplayLanguage(locale);
+            buffer.append(displayLanguage.isEmpty() ? languageCode : displayLanguage);
+            ++count;
         }
-        if (countryCode.length() > 0) {
+        if (!countryCode.isEmpty()) {
             if (count == 1) {
                 buffer.append(" (");
             }
-            buffer.append(getDisplayCountry(locale));
-            count++;
+            String displayCountry = getDisplayCountry(locale);
+            buffer.append(displayCountry.isEmpty() ? countryCode : displayCountry);
+            ++count;
         }
-        if (variantCode.length() > 0) {
+        if (!variantCode.isEmpty()) {
             if (count == 1) {
                 buffer.append(" (");
             } else if (count == 2) {
                 buffer.append(",");
             }
-            buffer.append(getDisplayVariant(locale));
-            count++;
+            String displayVariant = getDisplayVariant(locale);
+            buffer.append(displayVariant.isEmpty() ? variantCode : displayVariant);
+            ++count;
         }
         if (count > 1) {
             buffer.append(")");
index 6539162..6680a8e 100644 (file)
@@ -26,6 +26,7 @@ public class AllTests {
         suite.addTestSuite(java.util.CurrencyTest.class);
         suite.addTestSuite(java.util.DateTest.class);
         suite.addTestSuite(java.util.FormatterTest.class);
+        suite.addTestSuite(java.util.LocaleTest.class);
         suite.addTestSuite(java.util.RandomTest.class);
         suite.addTestSuite(java.util.ServiceLoaderTest.class);
         suite.addTestSuite(java.util.TimeZoneTest.class);
diff --git a/libcore/luni/src/test/java/java/util/LocaleTest.java b/libcore/luni/src/test/java/java/util/LocaleTest.java
new file mode 100644 (file)
index 0000000..c8a24f1
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.util;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class LocaleTest extends junit.framework.TestCase {
+    public void test_getDisplayName() throws Exception {
+        // http://b/2611311; if there's no display language/country/variant, use the raw codes.
+        Locale weird = new Locale("AaBbCc", "DdEeFf", "GgHhIi");
+        assertEquals("aabbcc", weird.getLanguage());
+        assertEquals("", weird.getDisplayLanguage());
+        assertEquals("DDEEFF", weird.getCountry());
+        assertEquals("", weird.getDisplayCountry());
+        assertEquals("GgHhIi", weird.getVariant());
+        assertEquals("", weird.getDisplayVariant());
+        assertEquals("aabbcc (DDEEFF,GgHhIi)", weird.getDisplayName());
+    }
+}