/* ******************************************************************************* * Copyright (C) 1996-2008, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.test.util; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.impl.ICUResourceBundle; import com.ibm.icu.util.Calendar; import com.ibm.icu.util.Currency; import com.ibm.icu.util.GregorianCalendar; import com.ibm.icu.util.TimeZone; import com.ibm.icu.util.ULocale; import com.ibm.icu.util.UResourceBundle; public class DisplayNameTest extends TestFmwk { static final boolean SHOW_ALL = false; public static void main(String[] args) throws Exception { new DisplayNameTest().run(args); } interface DisplayNameGetter { public String get(ULocale locale, String code, Object context); } Map[] codeToName = new Map[10]; { for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap(); } static final Object[] zoneFormats = {new Integer(0), new Integer(1), new Integer(2), new Integer(3), new Integer(4), new Integer(5), new Integer(6), new Integer(7)}; static final Object[] currencyFormats = {new Integer(Currency.SYMBOL_NAME), new Integer(Currency.LONG_NAME)}; static final Object[] NO_CONTEXT = {null}; static final Date JAN1; static final Date JULY1; static { Calendar cal = new GregorianCalendar(2004, Calendar.JANUARY, 1); JAN1 = cal.getTime(); cal.set(Calendar.MONTH, Calendar.JULY); JULY1 = cal.getTime(); } String[] countries = addUnknown(ULocale.getISOCountries(),2); String[] languages = addUnknown(ULocale.getISOLanguages(),2); String[] zones = addUnknown(getRealZoneIDs(),5); String[] scripts = addUnknown(getCodes(new ULocale("en","US",""), "Scripts"),4); // TODO fix once there is a way to get a list of all script codes String[] currencies = addUnknown(getCodes(new ULocale("en","",""), "Currencies"),3); // TODO fix once there is a way to get a list of all currency codes public void TestLocales() { ULocale[] locales = ULocale.getAvailableLocales(); for (int i = 0; i < locales.length; ++i) { checkLocale(locales[i]); } } /** * @return */ private String[] getRealZoneIDs() { Set temp = new TreeSet(Arrays.asList(TimeZone.getAvailableIDs())); temp.removeAll(getAliasMap().keySet()); return (String[])temp.toArray(new String[temp.size()]); } public void TestEnglish() { checkLocale(ULocale.ENGLISH); } public void TestFrench() { checkLocale(ULocale.FRENCH); } private void checkLocale(ULocale locale) { logln("Checking " + locale); check("Language", locale, languages, null, new DisplayNameGetter() { public String get(ULocale loc, String code, Object context) { return ULocale.getDisplayLanguage(code, loc); } }); check("Script", locale, scripts, null, new DisplayNameGetter() { public String get(ULocale loc, String code, Object context) { // TODO This is kinda a hack; ought to be direct way. return ULocale.getDisplayScript("en_"+code, loc); } }); check("Country", locale, countries, null, new DisplayNameGetter() { public String get(ULocale loc, String code, Object context) { // TODO This is kinda a hack; ought to be direct way. return ULocale.getDisplayCountry("en_"+code, loc); } }); check("Currencies", locale, currencies, currencyFormats, new DisplayNameGetter() { public String get(ULocale loc, String code, Object context) { Currency s = Currency.getInstance(code); return s.getName(loc, ((Integer)context).intValue(), new boolean[1]); } }); // comment this out, because the zone string information is lost // we'd have to access the resources directly to test them check("Zones", locale, zones, zoneFormats, new DisplayNameGetter() { // TODO replace once we have real API public String get(ULocale loc, String code, Object context) { return getZoneString(loc, code, ((Integer)context).intValue()); } }); } Map zoneData = new HashMap(); private String getZoneString(ULocale locale, String olsonID, int item) { Map data = (Map)zoneData.get(locale); if (data == null) { data = new HashMap(); if (SHOW_ALL) System.out.println(); if (SHOW_ALL) System.out.println("zones for " + locale); ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale); ICUResourceBundle table = bundle.getWithFallback("zoneStrings"); for (int i = 0; i < table.getSize(); ++i) { UResourceBundle stringSet = table.get(i); //ICUResourceBundle stringSet = table.getWithFallback(String.valueOf(i)); String key = stringSet.getString(0); if (SHOW_ALL) System.out.println("key: " + key); ArrayList list = new ArrayList(); for (int j = 1; j < stringSet.getSize(); ++j) { String entry = stringSet.getString(j); if (SHOW_ALL) System.out.println(" entry: " + entry); list.add(entry); } data.put(key, list.toArray(new String[list.size()])); } zoneData.put(locale, data); } String[] strings = (String[]) data.get(olsonID); if (strings == null || item >= strings.length) return olsonID; return strings[item]; } static String[][] zonesAliases = { {"America/Atka", "America/Atka"}, {"America/Ensenada", "America/Ensenada"}, {"America/Fort_Wayne", "America/Fort_Wayne"}, {"America/Indiana/Indianapolis", "America/Indiana/Indianapolis"}, {"America/Kentucky/Louisville", "America/Kentucky/Louisville"}, {"America/Knox_IN", "America/Knox_IN"}, {"America/Porto_Acre", "America/Porto_Acre"}, {"America/Rosario", "America/Rosario"}, {"America/Shiprock", "America/Shiprock"}, {"America/Virgin", "America/Virgin"}, {"Antarctica/South_Pole", "Antarctica/South_Pole"}, {"Arctic/Longyearbyen", "Arctic/Longyearbyen"}, {"Asia/Ashkhabad", "Asia/Ashkhabad"}, {"Asia/Chungking", "Asia/Chungking"}, {"Asia/Dacca", "Asia/Dacca"}, {"Asia/Istanbul", "Asia/Istanbul"}, {"Asia/Macao", "Asia/Macao"}, {"Asia/Tel_Aviv", "Asia/Tel_Aviv"}, {"Asia/Thimbu", "Asia/Thimbu"}, {"Asia/Ujung_Pandang", "Asia/Ujung_Pandang"}, {"Asia/Ulan_Bator", "Asia/Ulan_Bator"}, {"Australia/ACT", "Australia/ACT"}, {"Australia/Canberra", "Australia/Canberra"}, {"Australia/LHI", "Australia/LHI"}, {"Australia/NSW", "Australia/NSW"}, {"Australia/North", "Australia/North"}, {"Australia/Queensland", "Australia/Queensland"}, {"Australia/South", "Australia/South"}, {"Australia/Tasmania", "Australia/Tasmania"}, {"Australia/Victoria", "Australia/Victoria"}, {"Australia/West", "Australia/West"}, {"Australia/Yancowinna", "Australia/Yancowinna"}, {"Brazil/Acre", "Brazil/Acre"}, {"Brazil/DeNoronha", "Brazil/DeNoronha"}, {"Brazil/East", "Brazil/East"}, {"Brazil/West", "Brazil/West"}, {"CST6CDT", "CST6CDT"}, {"Canada/Atlantic", "Canada/Atlantic"}, {"Canada/Central", "Canada/Central"}, {"Canada/East-Saskatchewan", "Canada/East-Saskatchewan"}, {"Canada/Eastern", "Canada/Eastern"}, {"Canada/Mountain", "Canada/Mountain"}, {"Canada/Newfoundland", "Canada/Newfoundland"}, {"Canada/Pacific", "Canada/Pacific"}, {"Canada/Saskatchewan", "Canada/Saskatchewan"}, {"Canada/Yukon", "Canada/Yukon"}, {"Chile/Continental", "Chile/Continental"}, {"Chile/EasterIsland", "Chile/EasterIsland"}, {"Cuba", "Cuba"}, {"EST", "EST"}, {"EST5EDT", "EST5EDT"}, {"Egypt", "Egypt"}, {"Eire", "Eire"}, {"Etc/GMT+0", "Etc/GMT+0"}, {"Etc/GMT-0", "Etc/GMT-0"}, {"Etc/GMT0", "Etc/GMT0"}, {"Etc/Greenwich", "Etc/Greenwich"}, {"Etc/Universal", "Etc/Universal"}, {"Etc/Zulu", "Etc/Zulu"}, {"Europe/Nicosia", "Europe/Nicosia"}, {"Europe/Tiraspol", "Europe/Tiraspol"}, {"GB", "GB"}, {"GB-Eire", "GB-Eire"}, {"GMT", "GMT"}, {"GMT+0", "GMT+0"}, {"GMT-0", "GMT-0"}, {"GMT0", "GMT0"}, {"Greenwich", "Greenwich"}, {"HST", "HST"}, {"Hongkong", "Hongkong"}, {"Iceland", "Iceland"}, {"Iran", "Iran"}, {"Israel", "Israel"}, {"Jamaica", "Jamaica"}, {"Japan", "Japan"}, {"Kwajalein", "Kwajalein"}, {"Libya", "Libya"}, {"MST", "MST"}, {"MST7MDT", "MST7MDT"}, {"Mexico/BajaNorte", "Mexico/BajaNorte"}, {"Mexico/BajaSur", "Mexico/BajaSur"}, {"Mexico/General", "Mexico/General"}, {"Mideast/Riyadh87", "Mideast/Riyadh87"}, {"Mideast/Riyadh88", "Mideast/Riyadh88"}, {"Mideast/Riyadh89", "Mideast/Riyadh89"}, {"NZ", "NZ"}, {"NZ-CHAT", "NZ-CHAT"}, {"Navajo", "Navajo"}, {"PRC", "PRC"}, {"PST8PDT", "PST8PDT"}, {"Pacific/Samoa", "Pacific/Samoa"}, {"Poland", "Poland"}, {"Portugal", "Portugal"}, {"ROC", "ROC"}, {"ROK", "ROK"}, {"Singapore", "Singapore"}, {"SystemV/AST4", "SystemV/AST4"}, {"SystemV/AST4ADT", "SystemV/AST4ADT"}, {"SystemV/CST6", "SystemV/CST6"}, {"SystemV/CST6CDT", "SystemV/CST6CDT"}, {"SystemV/EST5", "SystemV/EST5"}, {"SystemV/EST5EDT", "SystemV/EST5EDT"}, {"SystemV/HST10", "SystemV/HST10"}, {"SystemV/MST7", "SystemV/MST7"}, {"SystemV/MST7MDT", "SystemV/MST7MDT"}, {"SystemV/PST8", "SystemV/PST8"}, {"SystemV/PST8PDT", "SystemV/PST8PDT"}, {"SystemV/YST9", "SystemV/YST9"}, {"SystemV/YST9YDT", "SystemV/YST9YDT"}, {"Turkey", "Turkey"}, {"UCT", "UCT"}, {"US/Alaska", "US/Alaska"}, {"US/Aleutian", "US/Aleutian"}, {"US/Arizona", "US/Arizona"}, {"US/Central", "US/Central"}, {"US/East-Indiana", "US/East-Indiana"}, {"US/Eastern", "US/Eastern"}, {"US/Hawaii", "US/Hawaii"}, {"US/Indiana-Starke", "US/Indiana-Starke"}, {"US/Michigan", "US/Michigan"}, {"US/Mountain", "US/Mountain"}, {"US/Pacific", "US/Pacific"}, {"US/Pacific-New", "US/Pacific-New"}, {"US/Samoa", "US/Samoa"}, {"UTC", "UTC"}, {"Universal", "Universal"}, {"W-SU", "W-SU"}, {"Zulu", "Zulu"}, {"ACT", "ACT"}, {"AET", "AET"}, {"AGT", "AGT"}, {"ART", "ART"}, {"AST", "AST"}, {"BET", "BET"}, {"BST", "BST"}, {"CAT", "CAT"}, {"CNT", "CNT"}, {"CST", "CST"}, {"CTT", "CTT"}, {"EAT", "EAT"}, {"ECT", "ECT"}, {"IET", "IET"}, {"IST", "IST"}, {"JST", "JST"}, {"MIT", "MIT"}, {"NET", "NET"}, {"NST", "NST"}, {"PLT", "PLT"}, {"PNT", "PNT"}, {"PRT", "PRT"}, {"PST", "PST"}, {"SST", "SST"}, {"VST", "VST"}, }; /** * Hack to get code list * @return */ private static String[] getCodes(ULocale locale, String tableName) { // TODO remove Ugly Hack // get stuff ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale); ICUResourceBundle table = bundle.getWithFallback(tableName); // copy into array ArrayList stuff = new ArrayList(); for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) { stuff.add(keys.nextElement()); } String[] result = new String[stuff.size()]; return (String[]) stuff.toArray(result); //return new String[] {"Latn", "Cyrl"}; } /** * Add two unknown strings, just to make sure they get passed through without colliding * @param strings * @return */ private String[] addUnknown(String[] strings, int len) { String[] result = new String[strings.length + 2]; result[0] = "x1unknown".substring(0,len); result[1] = "y1nknown".substring(0,len); System.arraycopy(strings,0,result,2,strings.length); return result; } Map bogusZones = null; private Map getAliasMap() { if (bogusZones == null) { bogusZones = new TreeMap(); for (int i = 0; i < zonesAliases.length; ++i) { bogusZones.put(zonesAliases[i][0], zonesAliases[i][1]); } } return bogusZones; } private void check(String type, ULocale locale, String[] codes, Object[] contextList, DisplayNameGetter getter) { if (contextList == null) contextList = NO_CONTEXT; for (int k = 0; k < contextList.length; ++k) codeToName[k].clear(); for (int j = 0; j < codes.length; ++j) { String code = codes[j]; for (int k = 0; k < contextList.length; ++k) { Object context = contextList[k]; String name = getter.get(locale, code, context); if (name == null || name.length() == 0) { errln( "Null or Zero-Length Display Name\t" + type + "\t(" + ((context != null) ? context : "") + ")" + ":\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]" + "\t" + code + " [" + getter.get(ULocale.ENGLISH, code, context) + "]" ); continue; } String otherCode = (String) codeToName[k].get(name); if (otherCode != null) { errln( "Display Names collide for\t" + type + "\t(" + ((context != null) ? context : "") + ")" + ":\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]" + "\t" + code + " [" + getter.get(ULocale.ENGLISH, code, context) + "]" + "\t& " + otherCode + " [" + getter.get(ULocale.ENGLISH, otherCode, context) + "]" + "\t=> " + name ); } else { codeToName[k].put(name, code); if (SHOW_ALL) logln( type + " (" + ((context != null) ? context : "") + ")" + "\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]" + "\t" + code + "[" + getter.get(ULocale.ENGLISH, code, context) + "]" + "\t=> " + name ); } } } } }