| /* |
| * 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$"); |
| } |
| } |
| */ |
| } |