2 *******************************************************************************
\r
3 * Copyright (C) 1996-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.util;
\r
9 import java.util.ArrayList;
\r
10 import java.util.Arrays;
\r
11 import java.util.Date;
\r
12 import java.util.Enumeration;
\r
13 import java.util.HashMap;
\r
14 import java.util.Map;
\r
15 import java.util.Set;
\r
16 import java.util.TreeMap;
\r
17 import java.util.TreeSet;
\r
19 import com.ibm.icu.dev.test.TestFmwk;
\r
20 import com.ibm.icu.impl.ICUResourceBundle;
\r
21 import com.ibm.icu.util.Calendar;
\r
22 import com.ibm.icu.util.Currency;
\r
23 import com.ibm.icu.util.GregorianCalendar;
\r
24 import com.ibm.icu.util.TimeZone;
\r
25 import com.ibm.icu.util.ULocale;
\r
26 import com.ibm.icu.util.UResourceBundle;
\r
28 public class DisplayNameTest extends TestFmwk {
\r
29 static final boolean SHOW_ALL = false;
\r
31 public static void main(String[] args) throws Exception {
\r
32 new DisplayNameTest().run(args);
\r
35 interface DisplayNameGetter {
\r
36 public String get(ULocale locale, String code, Object context);
\r
39 Map[] codeToName = new Map[10];
\r
41 for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap();
\r
44 static final Object[] zoneFormats = {new Integer(0), new Integer(1), new Integer(2),
\r
45 new Integer(3), new Integer(4), new Integer(5), new Integer(6), new Integer(7)};
\r
46 static final Object[] currencyFormats = {new Integer(Currency.SYMBOL_NAME), new Integer(Currency.LONG_NAME)};
\r
47 static final Object[] NO_CONTEXT = {null};
\r
49 static final Date JAN1;
\r
50 static final Date JULY1;
\r
53 Calendar cal = new GregorianCalendar(2004, Calendar.JANUARY, 1);
\r
54 JAN1 = cal.getTime();
\r
55 cal.set(Calendar.MONTH, Calendar.JULY);
\r
56 JULY1 = cal.getTime();
\r
59 String[] countries = addUnknown(ULocale.getISOCountries(),2);
\r
60 String[] languages = addUnknown(ULocale.getISOLanguages(),2);
\r
61 String[] zones = addUnknown(getRealZoneIDs(),5);
\r
62 String[] scripts = addUnknown(getCodes(new ULocale("en","US",""), "Scripts"),4);
\r
63 // TODO fix once there is a way to get a list of all script codes
\r
64 String[] currencies = addUnknown(getCodes(new ULocale("en","",""), "Currencies"),3);
\r
65 // TODO fix once there is a way to get a list of all currency codes
\r
67 public void TestLocales() {
\r
68 ULocale[] locales = ULocale.getAvailableLocales();
\r
69 for (int i = 0; i < locales.length; ++i) {
\r
70 checkLocale(locales[i]);
\r
77 private String[] getRealZoneIDs() {
\r
78 Set temp = new TreeSet(Arrays.asList(TimeZone.getAvailableIDs()));
\r
79 temp.removeAll(getAliasMap().keySet());
\r
80 return (String[])temp.toArray(new String[temp.size()]);
\r
83 public void TestEnglish() {
\r
84 checkLocale(ULocale.ENGLISH);
\r
87 public void TestFrench() {
\r
88 checkLocale(ULocale.FRENCH);
\r
91 private void checkLocale(ULocale locale) {
\r
92 logln("Checking " + locale);
\r
93 check("Language", locale, languages, null, new DisplayNameGetter() {
\r
94 public String get(ULocale loc, String code, Object context) {
\r
95 return ULocale.getDisplayLanguage(code, loc);
\r
98 check("Script", locale, scripts, null, new DisplayNameGetter() {
\r
99 public String get(ULocale loc, String code, Object context) {
\r
100 // TODO This is kinda a hack; ought to be direct way.
\r
101 return ULocale.getDisplayScript("en_"+code, loc);
\r
104 check("Country", locale, countries, null, new DisplayNameGetter() {
\r
105 public String get(ULocale loc, String code, Object context) {
\r
106 // TODO This is kinda a hack; ought to be direct way.
\r
107 return ULocale.getDisplayCountry("en_"+code, loc);
\r
110 check("Currencies", locale, currencies, currencyFormats, new DisplayNameGetter() {
\r
111 public String get(ULocale loc, String code, Object context) {
\r
112 Currency s = Currency.getInstance(code);
\r
113 return s.getName(loc, ((Integer)context).intValue(), new boolean[1]);
\r
116 // comment this out, because the zone string information is lost
\r
117 // we'd have to access the resources directly to test them
\r
119 check("Zones", locale, zones, zoneFormats, new DisplayNameGetter() {
\r
120 // TODO replace once we have real API
\r
121 public String get(ULocale loc, String code, Object context) {
\r
122 return getZoneString(loc, code, ((Integer)context).intValue());
\r
128 Map zoneData = new HashMap();
\r
130 private String getZoneString(ULocale locale, String olsonID, int item) {
\r
131 Map data = (Map)zoneData.get(locale);
\r
132 if (data == null) {
\r
133 data = new HashMap();
\r
134 if (SHOW_ALL) System.out.println();
\r
135 if (SHOW_ALL) System.out.println("zones for " + locale);
\r
136 ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale);
\r
137 ICUResourceBundle table = bundle.getWithFallback("zoneStrings");
\r
138 for (int i = 0; i < table.getSize(); ++i) {
\r
139 UResourceBundle stringSet = table.get(i);
\r
140 //ICUResourceBundle stringSet = table.getWithFallback(String.valueOf(i));
\r
141 String key = stringSet.getString(0);
\r
142 if (SHOW_ALL) System.out.println("key: " + key);
\r
143 ArrayList list = new ArrayList();
\r
144 for (int j = 1; j < stringSet.getSize(); ++j) {
\r
145 String entry = stringSet.getString(j);
\r
146 if (SHOW_ALL) System.out.println(" entry: " + entry);
\r
149 data.put(key, list.toArray(new String[list.size()]));
\r
151 zoneData.put(locale, data);
\r
153 String[] strings = (String[]) data.get(olsonID);
\r
154 if (strings == null || item >= strings.length) return olsonID;
\r
155 return strings[item];
\r
158 static String[][] zonesAliases = {
\r
159 {"America/Atka", "America/Atka"},
\r
160 {"America/Ensenada", "America/Ensenada"},
\r
161 {"America/Fort_Wayne", "America/Fort_Wayne"},
\r
162 {"America/Indiana/Indianapolis", "America/Indiana/Indianapolis"},
\r
163 {"America/Kentucky/Louisville", "America/Kentucky/Louisville"},
\r
164 {"America/Knox_IN", "America/Knox_IN"},
\r
165 {"America/Porto_Acre", "America/Porto_Acre"},
\r
166 {"America/Rosario", "America/Rosario"},
\r
167 {"America/Shiprock", "America/Shiprock"},
\r
168 {"America/Virgin", "America/Virgin"},
\r
169 {"Antarctica/South_Pole", "Antarctica/South_Pole"},
\r
170 {"Arctic/Longyearbyen", "Arctic/Longyearbyen"},
\r
171 {"Asia/Ashkhabad", "Asia/Ashkhabad"},
\r
172 {"Asia/Chungking", "Asia/Chungking"},
\r
173 {"Asia/Dacca", "Asia/Dacca"},
\r
174 {"Asia/Istanbul", "Asia/Istanbul"},
\r
175 {"Asia/Macao", "Asia/Macao"},
\r
176 {"Asia/Tel_Aviv", "Asia/Tel_Aviv"},
\r
177 {"Asia/Thimbu", "Asia/Thimbu"},
\r
178 {"Asia/Ujung_Pandang", "Asia/Ujung_Pandang"},
\r
179 {"Asia/Ulan_Bator", "Asia/Ulan_Bator"},
\r
180 {"Australia/ACT", "Australia/ACT"},
\r
181 {"Australia/Canberra", "Australia/Canberra"},
\r
182 {"Australia/LHI", "Australia/LHI"},
\r
183 {"Australia/NSW", "Australia/NSW"},
\r
184 {"Australia/North", "Australia/North"},
\r
185 {"Australia/Queensland", "Australia/Queensland"},
\r
186 {"Australia/South", "Australia/South"},
\r
187 {"Australia/Tasmania", "Australia/Tasmania"},
\r
188 {"Australia/Victoria", "Australia/Victoria"},
\r
189 {"Australia/West", "Australia/West"},
\r
190 {"Australia/Yancowinna", "Australia/Yancowinna"},
\r
191 {"Brazil/Acre", "Brazil/Acre"},
\r
192 {"Brazil/DeNoronha", "Brazil/DeNoronha"},
\r
193 {"Brazil/East", "Brazil/East"},
\r
194 {"Brazil/West", "Brazil/West"},
\r
195 {"CST6CDT", "CST6CDT"},
\r
196 {"Canada/Atlantic", "Canada/Atlantic"},
\r
197 {"Canada/Central", "Canada/Central"},
\r
198 {"Canada/East-Saskatchewan", "Canada/East-Saskatchewan"},
\r
199 {"Canada/Eastern", "Canada/Eastern"},
\r
200 {"Canada/Mountain", "Canada/Mountain"},
\r
201 {"Canada/Newfoundland", "Canada/Newfoundland"},
\r
202 {"Canada/Pacific", "Canada/Pacific"},
\r
203 {"Canada/Saskatchewan", "Canada/Saskatchewan"},
\r
204 {"Canada/Yukon", "Canada/Yukon"},
\r
205 {"Chile/Continental", "Chile/Continental"},
\r
206 {"Chile/EasterIsland", "Chile/EasterIsland"},
\r
209 {"EST5EDT", "EST5EDT"},
\r
210 {"Egypt", "Egypt"},
\r
212 {"Etc/GMT+0", "Etc/GMT+0"},
\r
213 {"Etc/GMT-0", "Etc/GMT-0"},
\r
214 {"Etc/GMT0", "Etc/GMT0"},
\r
215 {"Etc/Greenwich", "Etc/Greenwich"},
\r
216 {"Etc/Universal", "Etc/Universal"},
\r
217 {"Etc/Zulu", "Etc/Zulu"},
\r
218 {"Europe/Nicosia", "Europe/Nicosia"},
\r
219 {"Europe/Tiraspol", "Europe/Tiraspol"},
\r
221 {"GB-Eire", "GB-Eire"},
\r
223 {"GMT+0", "GMT+0"},
\r
224 {"GMT-0", "GMT-0"},
\r
226 {"Greenwich", "Greenwich"},
\r
228 {"Hongkong", "Hongkong"},
\r
229 {"Iceland", "Iceland"},
\r
231 {"Israel", "Israel"},
\r
232 {"Jamaica", "Jamaica"},
\r
233 {"Japan", "Japan"},
\r
234 {"Kwajalein", "Kwajalein"},
\r
235 {"Libya", "Libya"},
\r
237 {"MST7MDT", "MST7MDT"},
\r
238 {"Mexico/BajaNorte", "Mexico/BajaNorte"},
\r
239 {"Mexico/BajaSur", "Mexico/BajaSur"},
\r
240 {"Mexico/General", "Mexico/General"},
\r
241 {"Mideast/Riyadh87", "Mideast/Riyadh87"},
\r
242 {"Mideast/Riyadh88", "Mideast/Riyadh88"},
\r
243 {"Mideast/Riyadh89", "Mideast/Riyadh89"},
\r
245 {"NZ-CHAT", "NZ-CHAT"},
\r
246 {"Navajo", "Navajo"},
\r
248 {"PST8PDT", "PST8PDT"},
\r
249 {"Pacific/Samoa", "Pacific/Samoa"},
\r
250 {"Poland", "Poland"},
\r
251 {"Portugal", "Portugal"},
\r
254 {"Singapore", "Singapore"},
\r
255 {"SystemV/AST4", "SystemV/AST4"},
\r
256 {"SystemV/AST4ADT", "SystemV/AST4ADT"},
\r
257 {"SystemV/CST6", "SystemV/CST6"},
\r
258 {"SystemV/CST6CDT", "SystemV/CST6CDT"},
\r
259 {"SystemV/EST5", "SystemV/EST5"},
\r
260 {"SystemV/EST5EDT", "SystemV/EST5EDT"},
\r
261 {"SystemV/HST10", "SystemV/HST10"},
\r
262 {"SystemV/MST7", "SystemV/MST7"},
\r
263 {"SystemV/MST7MDT", "SystemV/MST7MDT"},
\r
264 {"SystemV/PST8", "SystemV/PST8"},
\r
265 {"SystemV/PST8PDT", "SystemV/PST8PDT"},
\r
266 {"SystemV/YST9", "SystemV/YST9"},
\r
267 {"SystemV/YST9YDT", "SystemV/YST9YDT"},
\r
268 {"Turkey", "Turkey"},
\r
270 {"US/Alaska", "US/Alaska"},
\r
271 {"US/Aleutian", "US/Aleutian"},
\r
272 {"US/Arizona", "US/Arizona"},
\r
273 {"US/Central", "US/Central"},
\r
274 {"US/East-Indiana", "US/East-Indiana"},
\r
275 {"US/Eastern", "US/Eastern"},
\r
276 {"US/Hawaii", "US/Hawaii"},
\r
277 {"US/Indiana-Starke", "US/Indiana-Starke"},
\r
278 {"US/Michigan", "US/Michigan"},
\r
279 {"US/Mountain", "US/Mountain"},
\r
280 {"US/Pacific", "US/Pacific"},
\r
281 {"US/Pacific-New", "US/Pacific-New"},
\r
282 {"US/Samoa", "US/Samoa"},
\r
284 {"Universal", "Universal"},
\r
315 * Hack to get code list
\r
318 private static String[] getCodes(ULocale locale, String tableName) {
\r
319 // TODO remove Ugly Hack
\r
321 ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale);
\r
322 ICUResourceBundle table = bundle.getWithFallback(tableName);
\r
324 ArrayList stuff = new ArrayList();
\r
325 for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) {
\r
326 stuff.add(keys.nextElement());
\r
328 String[] result = new String[stuff.size()];
\r
329 return (String[]) stuff.toArray(result);
\r
330 //return new String[] {"Latn", "Cyrl"};
\r
334 * Add two unknown strings, just to make sure they get passed through without colliding
\r
338 private String[] addUnknown(String[] strings, int len) {
\r
339 String[] result = new String[strings.length + 2];
\r
340 result[0] = "x1unknown".substring(0,len);
\r
341 result[1] = "y1nknown".substring(0,len);
\r
342 System.arraycopy(strings,0,result,2,strings.length);
\r
346 Map bogusZones = null;
\r
348 private Map getAliasMap() {
\r
349 if (bogusZones == null) {
\r
350 bogusZones = new TreeMap();
\r
351 for (int i = 0; i < zonesAliases.length; ++i) {
\r
352 bogusZones.put(zonesAliases[i][0], zonesAliases[i][1]);
\r
359 private void check(String type, ULocale locale,
\r
360 String[] codes, Object[] contextList, DisplayNameGetter getter) {
\r
361 if (contextList == null) contextList = NO_CONTEXT;
\r
362 for (int k = 0; k < contextList.length; ++k) codeToName[k].clear();
\r
363 for (int j = 0; j < codes.length; ++j) {
\r
364 String code = codes[j];
\r
365 for (int k = 0; k < contextList.length; ++k) {
\r
366 Object context = contextList[k];
\r
367 String name = getter.get(locale, code, context);
\r
368 if (name == null || name.length() == 0) {
\r
370 "Null or Zero-Length Display Name\t" + type
\r
371 + "\t(" + ((context != null) ? context : "") + ")"
\r
372 + ":\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]"
\r
373 + "\t" + code + " [" + getter.get(ULocale.ENGLISH, code, context) + "]"
\r
377 String otherCode = (String) codeToName[k].get(name);
\r
378 if (otherCode != null) {
\r
380 "Display Names collide for\t" + type + "\t(" + ((context != null) ? context : "") + ")"
\r
381 + ":\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]"
\r
382 + "\t" + code + " [" + getter.get(ULocale.ENGLISH, code, context) + "]"
\r
383 + "\t& " + otherCode + " [" + getter.get(ULocale.ENGLISH, otherCode, context) + "]"
\r
387 codeToName[k].put(name, code);
\r
388 if (SHOW_ALL) logln(
\r
390 + " (" + ((context != null) ? context : "") + ")"
\r
391 + "\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]"
\r
392 + "\t" + code + "[" + getter.get(ULocale.ENGLISH, code, context) + "]"
\r