/*
* Copyright 2009 Google Inc.
*
* 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 com.google.gwt.i18n.server;
import com.google.gwt.i18n.shared.GwtLocale;
import com.google.gwt.i18n.shared.GwtLocaleFactory;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.List;
/**
* Test GwtLocale.
*/
public class GwtLocaleTest extends TestCase {
private GwtLocaleFactory factory = new GwtLocaleFactoryImpl();
public void testAliases() {
GwtLocale en = factory.fromString("en");
List<GwtLocale> aliases = en.getAliases();
assertEquals(aliases.get(0), en);
GwtLocale enLatn = factory.fromString("en_Latn");
assertContainsAndGetPosition(aliases, enLatn);
assertTrue(en.usesSameScript(enLatn));
assertTrue(enLatn.inheritsFrom(en));
assertFalse(en.inheritsFrom(enLatn));
assertFalse(en.inheritsFrom(en));
GwtLocale pt = factory.fromString("pt");
aliases = pt.getAliases();
assertContainsAndGetPosition(aliases, factory.fromString("pt_BR"));
GwtLocale iw = factory.fromString("iw");
aliases = iw.getAliases();
GwtLocale he = factory.fromString("he");
assertEquals(aliases.get(0), he);
assertContainsAndGetPosition(aliases, factory.fromString("iw_Hebr"));
aliases = he.getAliases();
assertContainsAndGetPosition(aliases, factory.fromString("iw_Hebr"));
GwtLocale id = factory.fromString("id");
aliases = id.getAliases();
assertContainsAndGetPosition(aliases, factory.fromString("in"));
GwtLocale mo = factory.fromString("mo");
aliases = mo.getAliases();
assertContainsAndGetPosition(aliases, factory.fromString("ro"));
GwtLocale jv = factory.fromString("jv");
aliases = jv.getAliases();
assertContainsAndGetPosition(aliases, factory.fromString("jw"));
GwtLocale ji = factory.fromString("ji");
aliases = ji.getAliases();
assertContainsAndGetPosition(aliases, factory.fromString("yi"));
}
public void testCanonicalForm() {
GwtLocale zhCN = factory.fromString("zh_CN");
GwtLocale zhHansCN = factory.fromString("zh_Hans_CN");
GwtLocale zhHant = factory.fromString("zh_Hant");
GwtLocale zhTW = factory.fromString("zh_TW");
GwtLocale zhHantTW = factory.fromString("zh_Hant_TW");
GwtLocale zhHans = factory.fromString("zh_Hans");
assertEquals(zhCN, zhHansCN.getCanonicalForm());
assertEquals(zhTW, zhHantTW.getCanonicalForm());
assertEquals(zhCN, zhHans.getCanonicalForm());
assertEquals(zhTW, zhHant.getCanonicalForm());
GwtLocale paPK = factory.fromString("pa_PK");
GwtLocale paArabPK = factory.fromString("pa_Arab_PK");
assertEquals(paPK, paArabPK.getCanonicalForm());
}
public void testCompare() {
GwtLocale[] locales = new GwtLocale[] {
factory.fromString("en_US_POSIX"),
factory.fromString("en"),
factory.fromString("es-419"),
factory.fromString("en-gb"),
factory.fromString("en-AU-OUTBACK"),
factory.fromString("es_AR"),
factory.fromString("en_US"),
factory.fromString("en_Latn"),
factory.fromString("es-ES"),
};
Arrays.sort(locales);
assertEquals("en", locales[0].getAsString());
assertEquals("en_AU_OUTBACK", locales[1].getAsString());
assertEquals("en_GB", locales[2].getAsString());
assertEquals("en_US", locales[3].getAsString());
assertEquals("en_US_POSIX", locales[4].getAsString());
assertEquals("en_Latn", locales[5].getAsString());
assertEquals("es_419", locales[6].getAsString());
assertEquals("es_AR", locales[7].getAsString());
assertEquals("es_ES", locales[8].getAsString());
// Test equals against some non-GwtLocale class
assertFalse(locales[0].equals(factory));
}
public void testDefault() {
GwtLocale def1 = factory.getDefault();
GwtLocale def2 = factory.fromString("default");
assertSame(def1, def2);
assertTrue(def1.isDefault());
assertEquals("", def1.getLanguageNotNull());
assertEquals("", def1.getScriptNotNull());
assertEquals("", def1.getRegionNotNull());
assertEquals("", def1.getVariantNotNull());
GwtLocale def3 = factory.fromString(null);
assertSame(def1, def3);
GwtLocale def4 = factory.fromComponents("", "", "", "");
assertSame(def1, def4);
}
public void testFromComponents() {
GwtLocale test = factory.fromComponents("a", "b", "c", "d");
assertEquals("a", test.getLanguage());
assertEquals("B", test.getScript());
assertEquals("C", test.getRegion());
assertEquals("D", test.getVariant());
}
public void testFromString() {
GwtLocale ha = factory.fromString("ha_Arab_NG");
assertEquals("ha", ha.getLanguage());
assertEquals("Arab", ha.getScript());
assertEquals("NG", ha.getRegion());
assertNull(ha.getVariant());
GwtLocale us1 = factory.fromString("en-us");
GwtLocale us2 = factory.fromString("en_US");
assertSame(us1, us2);
GwtLocale us3 = factory.fromString("EN_uS");
assertSame(us1, us3);
assertEquals("en", us3.getLanguageNotNull());
assertNull(us3.getScript());
assertEquals("US", us3.getRegionNotNull());
assertNull(us3.getVariant());
GwtLocale en = factory.fromString("en-VARIANT");
assertEquals("en", en.getLanguage());
assertNull(en.getScript());
assertNull(en.getRegion());
assertEquals("VARIANT", en.getVariantNotNull());
en = factory.fromString("en_variant");
assertEquals("en", en.getLanguage());
assertNull(en.getScript());
assertNull(en.getRegion());
assertEquals("VARIANT", en.getVariant());
GwtLocale zh = factory.fromString("zh-min-nan-Hant-CN");
assertEquals("zh-min-nan", zh.getLanguage());
assertEquals("Hant", zh.getScriptNotNull());
assertEquals("CN", zh.getRegion());
assertNull(zh.getVariant());
assertFalse(ha.usesSameScript(zh));
zh = factory.fromString("zh_min_nan_Hant_CN");
assertEquals("zh-min-nan", zh.getLanguage());
GwtLocale variant4 = factory.fromString("en-1234");
assertNull(variant4.getScript());
assertEquals("1234", variant4.getVariant());
GwtLocale extLang = factory.fromString("en-ext");
assertEquals("en-ext", extLang.getLanguage());
try {
factory.fromString("english_USA");
fail("Should have thrown IllegalArgumentException on english_USA");
} catch (IllegalArgumentException expected) {
}
}
public void testInheritance() {
GwtLocale en = factory.fromString("en_Latn_US_VARIANT");
List<GwtLocale> chain = en.getInheritanceChain();
assertEquals(12, chain.size());
assertEquals(en, chain.get(0));
assertEquals(factory.fromString("en_Latn_US"), chain.get(1));
assertEquals(factory.fromString("en_Latn_021"), chain.get(2));
assertEquals(factory.fromString("en_Latn_019"), chain.get(3));
assertEquals(factory.fromString("en_Latn_001"), chain.get(4));
assertEquals(factory.fromString("en_Latn"), chain.get(5));
assertEquals(factory.fromString("en_US"), chain.get(6));
assertEquals(factory.fromString("en_021"), chain.get(7));
assertEquals(factory.fromString("en_019"), chain.get(8));
assertEquals(factory.fromString("en_001"), chain.get(9));
assertEquals(factory.fromString("en"), chain.get(10));
assertEquals(factory.getDefault(), chain.get(11));
}
public void testInstanceCache() {
GwtLocale a = factory.fromString("en_US");
GwtLocale b = factory.fromString("en_US");
assertFalse(a.isDefault());
assertSame(a, b);
assertEquals(a, b);
assertEquals(a.hashCode(), b.hashCode());
}
public void testPrivate() {
GwtLocale priv = factory.fromString("x-mylang");
assertEquals("x-mylang", priv.getLanguage());
assertNull(priv.getScript());
assertNull(priv.getRegion());
assertNull(priv.getVariant());
assertFalse(priv.isDefault());
}
public void testScriptAliases() {
GwtLocale zhCN = factory.fromString("zh_CN");
List<GwtLocale> aliases = zhCN.getAliases();
assertEquals(2, aliases.size());
assertEquals(aliases.get(0), zhCN);
assertContainsAndGetPosition(aliases, factory.fromString("zh_Hans_CN"));
GwtLocale zhHant = factory.fromString("zh_Hant");
aliases = zhHant.getAliases();
assertEquals(aliases.get(0), factory.fromString("zh_TW"));
assertContainsAndGetPosition(aliases, factory.fromString("zh_Hant_TW"));
GwtLocale zhHans = factory.fromString("zh_Hans");
aliases = zhHans.getAliases();
assertEquals(aliases.get(0), zhCN);
assertContainsAndGetPosition(aliases, factory.fromString("zh_Hans_CN"));
assertContainsAndGetPosition(aliases, zhHans);
GwtLocale paPK = factory.fromString("pa_PK");
GwtLocale paArabPK = factory.fromString("pa_Arab_PK");
aliases = paPK.getAliases();
assertContainsAndGetPosition(aliases, paArabPK);
}
public void testSearchList() {
GwtLocale nbNO = factory.fromString("nb_NO");
List<GwtLocale> searchList = nbNO.getCompleteSearchList();
int idx_nb_154 = assertContainsAndGetPosition(searchList,
factory.fromString("nb_154"));
assertContainsAndGetPosition(searchList,
factory.fromString("no_154_BOKMAL"));
int idx_no = assertContainsAndGetPosition(searchList,
factory.fromString("no_BOKMAL"));
assertTrue("nb_154 should come before no_BOKMAL", idx_nb_154 < idx_no);
int idx_default = assertContainsAndGetPosition(searchList,
factory.getDefault());
assertEquals(searchList.size() - 1, idx_default);
GwtLocale esMX = factory.fromString("es_MX");
searchList = esMX.getCompleteSearchList();
assertContainsAndGetPosition(searchList, factory.fromString("es_013"));
assertContainsAndGetPosition(searchList, factory.fromString("es_419"));
GwtLocale srCyrlBA = factory.fromString("sr_Cyrl_BA");
searchList = srCyrlBA.getCompleteSearchList();
assertContainsAndGetPosition(searchList, factory.fromString("sr_Cyrl"));
assertContainsAndGetPosition(searchList, factory.fromString("sr_BA"));
assertContainsAndGetPosition(searchList, factory.fromString("sr"));
assertContainsAndGetPosition(searchList, factory.getDefault());
GwtLocale noNynorsk = factory.fromString("no_NYNORSK");
searchList = noNynorsk.getCompleteSearchList();
assertContainsAndGetPosition(searchList, factory.fromString("nn"));
assertContainsAndGetPosition(searchList, factory.fromString("no"));
GwtLocale zhTW = factory.fromString("zh_TW");
searchList = zhTW.getCompleteSearchList();
int hantPos = assertContainsAndGetPosition(searchList,
factory.fromString("zh_Hant"));
int zhPos = assertContainsAndGetPosition(searchList,
factory.fromString("zh"));
assertNotContains(searchList, factory.fromString("zh_Hans"));
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);
GwtLocale pa = factory.fromString("pa");
GwtLocale paPK = factory.fromString("pa_PK");
GwtLocale paArab = factory.fromString("pa_Arab");
GwtLocale paGuru = factory.fromString("pa_Guru");
searchList = paPK.getCompleteSearchList();
int arabPos = assertContainsAndGetPosition(searchList, paArab);
int paPos = assertContainsAndGetPosition(searchList, pa);
assertNotContains(searchList, paGuru);
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));
}
}