/*
* 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 com.google.common.collect.Sets;
import junit.framework.TestCase;
import java.util.Locale;
import java.util.Map;
@SuppressWarnings({"javadoc", "SizeReplaceableByIsEmpty"})
public class LocaleManagerTest extends TestCase {
public void testIntegrity() {
LocaleManager localeManager = LocaleManager.get();
assertSame(localeManager, LocaleManager.get());
Map<String, String> languageToCountry = LocaleManager.getLanguageToCountryMap();
Map<String, String> languageNames = LocaleManager.getLanguageNamesMap();
Map<String, String> regionNames = LocaleManager.getRegionNamesMap();
assertEquals("Make sure to update initial capacity in declaration after editing map",
176, languageToCountry.size());
assertEquals("Make sure to update initial capacity in declaration after editing map",
187, languageNames.size());
assertEquals("Make sure to update initial capacity in declaration after editing map",
249, regionNames.size());
assertTrue(Sets.difference(languageToCountry.keySet(),
languageNames.keySet()).isEmpty());
for (Map.Entry<String, String> entry : languageToCountry.entrySet()) {
assertTrue(entry.getValue(), entry.getKey().length() > 0);
assertTrue(entry.getKey(), entry.getValue().length() > 0);
}
for (Map.Entry<String, String> entry : regionNames.entrySet()) {
assertTrue(entry.getValue(), entry.getKey().length() > 0);
assertTrue(entry.getKey(), entry.getValue().length() > 0);
}
for (Map.Entry<String, String> entry : languageNames.entrySet()) {
assertTrue(entry.getValue(), entry.getKey().length() > 0);
assertTrue(entry.getKey(), entry.getValue().length() > 0);
}
for (String s : languageToCountry.keySet()) {
assertTrue(s, s.length() == 2 && s.equals(s.toLowerCase(Locale.US)));
}
for (String s : languageNames.keySet()) {
assertTrue(s, s.length() == 2 && s.equals(s.toLowerCase(Locale.US)));
}
for (String s : languageNames.values()) {
assertTrue(s, s.length() > 2 && Character.isUpperCase(s.charAt(0)));
}
for (String s : languageToCountry.values()) {
assertTrue(s, s.length() == 2 && s.equals(s.toUpperCase(Locale.US)));
}
for (String s : regionNames.keySet()) {
assertTrue(s, s.length() == 2 && s.equals(s.toUpperCase(Locale.US)));
}
for (String s : regionNames.values()) {
assertTrue(s, s.length() > 2 && Character.isUpperCase(s.charAt(0)));
}
assertNull(languageToCountry.get(""));
assertNull(languageNames.get(""));
assertTrue(Sets.difference(languageToCountry.keySet(),
languageNames.keySet()).isEmpty());
}
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"));
}
public void testGetRegionNames() {
assertEquals("United States", LocaleManager.getRegionName("US"));
assertEquals("Norway", LocaleManager.getRegionName("NO"));
assertEquals("France", LocaleManager.getRegionName("FR"));
assertEquals("India", LocaleManager.getRegionName("IN"));
}
/* 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 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);
}
}
private static String escape(String s) {
for (int i = 0, n = s.length(); i < n; i++) {
char c = s.charAt(i);
if (c >= 128) {
StringBuilder sb = new StringBuilder();
for (int j = 0, m = s.length(); j < m; j++) {
char d = s.charAt(j);
if (d < 128) {
sb.append(d);
}
else {
sb.append('\\');
sb.append('u');
sb.append(String.format("%04x", (int) d));
}
}
return sb.toString();
}
}
return s;
}
// 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$");
}
}
*/
}