Fix handling of search order where particular regions have different
default scripts than the base language, such as pa_PK and zh_TW.

Patch by: jat
Review by: pdr

Review at http://gwt-code-reviews.appspot.com/1022801


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9148 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java b/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
index 82e30ec..c3a7e04 100644
--- a/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
+++ b/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
@@ -423,7 +423,15 @@
           initialScript = DefaultLanguageScripts.getDefaultScript(language,
               region);
         }
-        List<GwtLocale> thisGroup = new ArrayList<GwtLocale>(this.getAliases());
+        List<GwtLocale> thisGroup = new ArrayList<GwtLocale>();
+        if (initialScript != null) {
+          // Make sure the default script is listed first in the search list,
+          // which ensures that zh_Hant appears before zh in the search list for
+          // zh_TW.
+          thisGroup.add(factory.fromComponents(language, initialScript, region,
+              variant));
+        }
+        thisGroup.add(this);
         seen.addAll(thisGroup);
         GwtLocale defLocale = factory.getDefault();
         seen.add(defLocale);
diff --git a/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java b/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
index 5e9d3e6..8c424e7 100644
--- a/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
+++ b/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
@@ -29,7 +29,7 @@
 public class GwtLocaleTest extends TestCase {
 
   private GwtLocaleFactory factory = new GwtLocaleFactoryImpl();
-  
+
   public void testAliases() {
     GwtLocale en = factory.fromString("en");
     List<GwtLocale> aliases = en.getAliases();
@@ -105,7 +105,7 @@
     // Test equals against some non-GwtLocale class
     assertFalse(locales[0].equals(factory));
   }
-  
+
   public void testDefault() {
     GwtLocale def1 = factory.getDefault();
     GwtLocale def2 = factory.fromString("default");
@@ -173,7 +173,7 @@
     } catch (IllegalArgumentException expected) {
     }
   }
-  
+
   public void testInheritance() {
     GwtLocale en = factory.fromString("en_Latn_US_VARIANT");
     List<GwtLocale> chain = en.getInheritanceChain();
@@ -260,9 +260,13 @@
     assertContainsAndGetPosition(searchList, factory.fromString("no"));
     GwtLocale zhTW = factory.fromString("zh_TW");
     searchList = zhTW.getCompleteSearchList();
-    assertContainsAndGetPosition(searchList, factory.fromString("zh_Hant"));
+    int hantPos = assertContainsAndGetPosition(searchList,
+        factory.fromString("zh_Hant"));
+    int zhPos = assertContainsAndGetPosition(searchList,
+        factory.fromString("zh"));
     assertNotContains(searchList, factory.fromString("zh_Hans"));
-    // TODO: explicitly verify search list for zh_TW
+    assertTrue("zh_Hant should appear before zh in zh_TW searchlist "
+        + searchList, hantPos < zhPos);
     idx_default = assertContainsAndGetPosition(searchList,
         factory.getDefault());
     assertEquals(searchList.size() - 1, idx_default);
@@ -274,19 +278,17 @@
     int arabPos = assertContainsAndGetPosition(searchList, paArab);
     int paPos = assertContainsAndGetPosition(searchList, pa);
     assertNotContains(searchList, paGuru);
-    // See TODO in {@link GwtLocaleImpl#getCompleteSearchList()} for what is
-    // needed for this test to pass (and likewise for zh_Hant appearing before
-    // zh in the search list for zh_TW).
-    // assertTrue(arabPos < paPos);
+    assertTrue("pa_Arab should appear before pa in pa_PK searchlist "
+        + searchList, arabPos < paPos);
   }
-  
+
   private <T> int assertContainsAndGetPosition(List<T> list, T value) {
     int idx = list.indexOf(value);
     assertTrue("List " + list + " should have contained " + value,
         idx >= 0);
     return idx;
   }
-  
+
   private <T> void assertNotContains(List<T> list, T value) {
     assertFalse("List " + list + " should not have contained " + value,
         list.contains(value));