blob: f7df9954c22f203807d25de902ef89a7fb7c39f0 [file] [log] [blame]
/*
* Copyright (C) 2013 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 com.android.ide.common.resources;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
@SuppressWarnings({"javadoc", "SizeReplaceableByIsEmpty"})
public class LocaleManagerTest extends TestCase {
/** Enable to see the languages with multiple relevant regions */
private static final boolean DUMP_INFERRED_REGIONS = false;
public void testIntegrity() {
// Make sure we get a name for every single region and language
// and that (with the exception of the aliases) they are all unique
// Make sure all the languages codes are lowercase, and that all the
// region codes are upper case, and that nothing is empty
// Make sure the region names have been capitalized
List<String> languages = LocaleManager.getLanguageCodes(true);
List<String> regions = LocaleManager.getRegionCodes(true);
for (String language : languages) {
assertFalse(language.isEmpty());
assertTrue(language.length() == 2 || language.length() == 3);
assertEquals(language.toLowerCase(Locale.US), language);
String name = LocaleManager.getLanguageName(language);
assertNotNull(name);
assertFalse(name.isEmpty());
assertTrue(name, name.length() >= 2 && Character.isUpperCase(name.charAt(0)));
}
for (String region : regions) {
assertFalse(region.isEmpty());
assertTrue(region.length() == 2 || region.length() == 3);
assertEquals(region.toUpperCase(Locale.US), region);
String name = LocaleManager.getRegionName(region);
assertNotNull(name);
assertFalse(name.isEmpty());
assertTrue(name, name.length() > 2 && Character.isUpperCase(name.charAt(0)));
}
}
public void testGetLanguageNames() throws Exception {
assertEquals("English", LocaleManager.getLanguageName("en"));
assertEquals("Norwegian Bokm\u00e5l", LocaleManager.getLanguageName("nb"));
assertEquals("Norwegian", LocaleManager.getLanguageName("no"));
assertEquals("French", LocaleManager.getLanguageName("fr"));
assertEquals("German", LocaleManager.getLanguageName("de"));
assertEquals("Hindi", LocaleManager.getLanguageName("hi"));
// Check deprecated codes
assertEquals("Indonesian", LocaleManager.getLanguageName("id"));
assertEquals("Indonesian", LocaleManager.getLanguageName("in"));
assertEquals("Indonesian", LocaleManager.getLanguageName("ind"));
assertEquals("Hebrew", LocaleManager.getLanguageName("he"));
assertEquals("Hebrew", LocaleManager.getLanguageName("iw"));
assertEquals("Hebrew", LocaleManager.getLanguageName("heb"));
assertEquals("Yiddish", LocaleManager.getLanguageName("yi"));
assertEquals("Yiddish", LocaleManager.getLanguageName("ji"));
assertEquals("Yiddish", LocaleManager.getLanguageName("yid"));
// 3 letter language lookup
assertEquals("English", LocaleManager.getLanguageName("eng"));
assertEquals("Norwegian", LocaleManager.getLanguageName("nor"));
assertEquals("French", LocaleManager.getLanguageName("fra"));
}
public void testGetRegionNames() {
assertEquals("United States", LocaleManager.getRegionName("US"));
assertEquals("Norway", LocaleManager.getRegionName("NO"));
assertEquals("France", LocaleManager.getRegionName("FR"));
assertEquals("India", LocaleManager.getRegionName("IN"));
// 3 letter region lookup
assertEquals("United States", LocaleManager.getRegionName("USA"));
assertEquals("Norway", LocaleManager.getRegionName("NOR"));
assertEquals("France", LocaleManager.getRegionName("FRA"));
}
public void testGetLanguageCodes() {
for (String code : LocaleManager.getLanguageCodes(false)) {
assertEquals(2, code.length());
}
for (String code : LocaleManager.getRegionCodes(false)) {
assertEquals(2, code.length());
}
// Check languages including 3 letters: make sure we find both
boolean found2 = false;
boolean found3 = false;
for (String code : LocaleManager.getLanguageCodes(true)) {
int length = code.length();
if (length == 3) {
found3 = true;
}
if (length == 2) {
found2 = true;
}
assertTrue(length == 2 || length == 3);
}
assertTrue(found2);
assertTrue(found3);
/* Turns out we don't have 3-letter regions imported yet
found2 = false;
found3 = false;
for (String code : LocaleManager.getRegionCodes(true)) {
int length = code.length();
if (length == 3) {
found3 = true;
}
if (length == 2) {
found2 = true;
}
assertTrue(length == 2 || length == 3);
if (found3) {
System.out.println(code + " : " + LocaleManager.getRegionName(code));
}
}
assertTrue(found2);
assertTrue(found3);
*/
}
@SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
public void testGetRelevantRegions() {
assertEquals(Arrays.asList("NO"), LocaleManager.getRelevantRegions("no"));
assertEquals(Arrays.asList("NO", "SJ"), LocaleManager.getRelevantRegions("nb"));
assertEquals(Arrays.asList("DK","GL"), LocaleManager.getRelevantRegions("da"));
assertTrue(LocaleManager.getRelevantRegions("en").contains("US"));
assertTrue(LocaleManager.getRelevantRegions("en").contains("GB"));
// 3 letter lookup
assertTrue(LocaleManager.getRelevantRegions("eng").contains("US"));
}
public void testGetTimeZoneRegion() {
assertEquals("PT", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("Europe/Lisbon")));
assertEquals("PT", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("Atlantic/Azores")));
assertEquals("PT", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("Atlantic/Azores")));
assertEquals("BR", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("America/Araguaina")));
assertEquals("US", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("America/Adak")));
assertEquals("US", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("America/Anchorage")));
assertEquals("US", LocaleManager.getTimeZoneRegionAlpha2(TimeZone.getTimeZone("PST")));
// Test JDK variations
assertEquals("LY", LocaleManager.getTimeZoneRegionAlpha2(
TimeZone.getTimeZone("Africa/Tripoli")));
assertEquals("LY", LocaleManager.getTimeZoneRegionAlpha2(
new SimpleTimeZone(3600000, "Africa/Tripoli")));
assertEquals("LY", LocaleManager.getTimeZoneRegionAlpha2(
new SimpleTimeZone(7200000, "Africa/Tripoli"))); // changed in jdk8
assertNull(LocaleManager.getTimeZoneRegionAlpha2(new SimpleTimeZone(-42, "Africa/Tripoli"))); // wrong
}
public void testAlpha23Conversions() {
assertEquals("nob", LocaleManager.getLanguageAlpha3("nb"));
assertEquals("nb", LocaleManager.getLanguageAlpha2("nob"));
assertEquals("NOR", LocaleManager.getRegionAlpha3("NO"));
assertEquals("NO", LocaleManager.getRegionAlpha2("NOR"));
// Check deprecated codes
assertEquals("in", LocaleManager.getLanguageAlpha2("ind"));
assertEquals("ind", LocaleManager.getLanguageAlpha3("in"));
assertEquals("ind", LocaleManager.getLanguageAlpha3("id"));
assertEquals("iw", LocaleManager.getLanguageAlpha2("heb"));
assertEquals("heb", LocaleManager.getLanguageAlpha3("he"));
assertEquals("heb", LocaleManager.getLanguageAlpha3("iw"));
assertEquals("ji", LocaleManager.getLanguageAlpha2("yid"));
assertEquals("yid", LocaleManager.getLanguageAlpha3("yi"));
assertEquals("yid", LocaleManager.getLanguageAlpha3("ji"));
}
@SuppressWarnings("ConstantConditions")
public void testGetLanguageRegion() {
Locale prevLocale = Locale.getDefault();
TimeZone prevTimeZone = TimeZone.getDefault();
try {
assertFalse("The envvar $STUDIO_LOCALES should not be set during unit test runs",
System.getenv("STUDIO_LOCALES") != null);
assertNull(System.getProperty("studio.locales"), System.getProperty("studio.locales"));
Locale.setDefault(Locale.US);
// Pick English=>GU based on options
System.setProperty("studio.locales", "es_US, en_GU");
assertEquals("GU", LocaleManager.getLanguageRegion("en"));
System.setProperty("studio.locales", "es-rUS, en-rGU"); // alternate supported syntax
assertEquals("GU", LocaleManager.getLanguageRegion("en"));
System.setProperty("studio.locales", "");
// Pick English=>GB based on timezone
Locale.setDefault(Locale.ITALY);
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
assertEquals("GB", LocaleManager.getLanguageRegion("en"));
// Pick English=>CA based on system locale country
Locale.setDefault(Locale.CANADA);
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Oslo"));
assertEquals("CA", LocaleManager.getLanguageRegion("en"));
// Swedish should map to Sweden even though FI is a relevant region for sv
// Regression test for issue 136001
Locale.setDefault(Locale.FRANCE); // unrelated locale to this test
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Helsinki"));
assertEquals("SE", LocaleManager.getLanguageRegion("sv"));
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
assertEquals("GB", LocaleManager.getLanguageRegion("en"));
TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
assertEquals("US", LocaleManager.getLanguageRegion("en"));
assertEquals("ES", LocaleManager.getLanguageRegion("es"));
TimeZone.setDefault(TimeZone.getTimeZone("America/Manaus"));
assertEquals("BR", LocaleManager.getLanguageRegion("pt"));
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Lisbon"));
assertEquals("PT", LocaleManager.getLanguageRegion("pt"));
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Oslo"));
assertEquals("PT", LocaleManager.getLanguageRegion("pt"));
} finally {
Locale.setDefault(prevLocale);
TimeZone.setDefault(prevTimeZone);
}
}
public void testGetTimeZoneRegionAll() {
for (String id : TimeZone.getAvailableIDs()) {
TimeZone zone = TimeZone.getTimeZone(id);
assertNotNull(id, zone);
String region = LocaleManager.getTimeZoneRegionAlpha2(zone);
assertNotNull(region, zone.getID());
region = LocaleManager.getTimeZoneRegionAlpha3(zone);
assertNotNull(region, zone.getID());
}
}
/* Utility useful for identifying strings which must be using \\u in the string names
* to ensure that they are handled properly during the build (outside of Studio/Eclipse,
* where this source file is marked as using UTF-8.
public void testPrintable() {
Set<String> languageCodes = LocaleManager.getLanguageCodes();
for (String code : languageCodes) {
String name = LocaleManager.getLanguageName(code);
assertNotNull(name);
checkEncoding(name);
}
Set<String> regionCodes = LocaleManager.getRegionCodes();
for (String code : regionCodes) {
String name = LocaleManager.getRegionName(code);
assertNotNull(name);
checkEncoding(name);
}
}
private static void checkEncoding(String s) {
String encoded = escape(s);
if (!encoded.equals(s)) {
System.out.println("Need unicode encoding for '" + s + "'");
System.out.println(" Replacement=" + encoded);
}
}
// Generates source code for region list sorted by region
public void sortRegions() {
final Map<String, String> map = LocaleManager.getRegionNamesMap();
List<String> sorted = new ArrayList<String>(map.keySet());
Collections.sort(sorted, new Comparator<String>() {
@Override
public int compare(String code1, String code2) {
String region1 = map.get(code1);
String region2 = map.get(code2);
return region1.compareTo(region2);
}
});
for (String code : sorted) {
String region = map.get(code);
String line = " sRegionNames.put(\"" + code + "\", \"" + escape(region)
+ "\");";
System.out.print(line);
for (int column = line.length(); column < 86; column++) {
System.out.print(' ');
}
System.out.println("//$NON-NLS-1$");
}
}
*/
}