]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/util/DisplayNameTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / util / DisplayNameTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2008, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.util;\r
8 \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
18 \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
27 \r
28 public class DisplayNameTest extends TestFmwk {\r
29     static final boolean SHOW_ALL = false;\r
30     \r
31     public static void main(String[] args) throws Exception {\r
32         new DisplayNameTest().run(args);\r
33     }\r
34         \r
35     interface DisplayNameGetter {\r
36         public String get(ULocale locale, String code, Object context);\r
37     }\r
38 \r
39     Map[] codeToName = new Map[10];\r
40     {\r
41         for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap();\r
42     }\r
43     \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
48     \r
49     static final Date JAN1;\r
50     static final Date JULY1;\r
51 \r
52     static {\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
57     }\r
58 \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
66 \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
71         }\r
72     }\r
73 \r
74     /**\r
75      * @return\r
76      */\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
81     }\r
82 \r
83     public void TestEnglish() {\r
84         checkLocale(ULocale.ENGLISH);\r
85     }\r
86 \r
87     public void TestFrench() {\r
88         checkLocale(ULocale.FRENCH);\r
89     }\r
90 \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
96             }\r
97         });\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
102             }\r
103         });\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
108             }\r
109         });\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
114             }\r
115         });\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
118 \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
123             }\r
124         });\r
125 \r
126     }\r
127     \r
128     Map zoneData = new HashMap();\r
129     \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
147                     list.add(entry);\r
148                 }\r
149                 data.put(key, list.toArray(new String[list.size()]));\r
150             }\r
151             zoneData.put(locale, data);\r
152         }\r
153         String[] strings = (String[]) data.get(olsonID);\r
154         if (strings == null || item >= strings.length) return olsonID;\r
155         return strings[item];\r
156     }\r
157     \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
207         {"Cuba", "Cuba"},\r
208         {"EST", "EST"},\r
209         {"EST5EDT", "EST5EDT"},\r
210         {"Egypt", "Egypt"},\r
211         {"Eire", "Eire"},\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
220         {"GB", "GB"},\r
221         {"GB-Eire", "GB-Eire"},\r
222         {"GMT", "GMT"},\r
223         {"GMT+0", "GMT+0"},\r
224         {"GMT-0", "GMT-0"},\r
225         {"GMT0", "GMT0"},\r
226         {"Greenwich", "Greenwich"},\r
227         {"HST", "HST"},\r
228         {"Hongkong", "Hongkong"},\r
229         {"Iceland", "Iceland"},\r
230         {"Iran", "Iran"},\r
231         {"Israel", "Israel"},\r
232         {"Jamaica", "Jamaica"},\r
233         {"Japan", "Japan"},\r
234         {"Kwajalein", "Kwajalein"},\r
235         {"Libya", "Libya"},\r
236         {"MST", "MST"},\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
244         {"NZ", "NZ"},\r
245         {"NZ-CHAT", "NZ-CHAT"},\r
246         {"Navajo", "Navajo"},\r
247         {"PRC", "PRC"},\r
248         {"PST8PDT", "PST8PDT"},\r
249         {"Pacific/Samoa", "Pacific/Samoa"},\r
250         {"Poland", "Poland"},\r
251         {"Portugal", "Portugal"},\r
252         {"ROC", "ROC"},\r
253         {"ROK", "ROK"},\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
269         {"UCT", "UCT"},\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
283         {"UTC", "UTC"},\r
284         {"Universal", "Universal"},\r
285         {"W-SU", "W-SU"},\r
286         {"Zulu", "Zulu"},\r
287         {"ACT", "ACT"},\r
288         {"AET", "AET"},\r
289         {"AGT", "AGT"},\r
290         {"ART", "ART"},\r
291         {"AST", "AST"},\r
292         {"BET", "BET"},\r
293         {"BST", "BST"},\r
294         {"CAT", "CAT"},\r
295         {"CNT", "CNT"},\r
296         {"CST", "CST"},\r
297         {"CTT", "CTT"},\r
298         {"EAT", "EAT"},\r
299         {"ECT", "ECT"},\r
300         {"IET", "IET"},\r
301         {"IST", "IST"},\r
302         {"JST", "JST"},\r
303         {"MIT", "MIT"},\r
304         {"NET", "NET"},\r
305         {"NST", "NST"},\r
306         {"PLT", "PLT"},\r
307         {"PNT", "PNT"},\r
308         {"PRT", "PRT"},\r
309         {"PST", "PST"},\r
310         {"SST", "SST"},\r
311         {"VST", "VST"},\r
312     };\r
313 \r
314     /**\r
315      * Hack to get code list\r
316      * @return\r
317      */\r
318     private static String[] getCodes(ULocale locale, String tableName) {\r
319         // TODO remove Ugly Hack\r
320         // get stuff\r
321         ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale);\r
322         ICUResourceBundle table = bundle.getWithFallback(tableName);\r
323         // copy into array\r
324         ArrayList stuff = new ArrayList();\r
325         for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) {\r
326             stuff.add(keys.nextElement());\r
327         }\r
328         String[] result = new String[stuff.size()];\r
329         return (String[]) stuff.toArray(result);\r
330         //return new String[] {"Latn", "Cyrl"};\r
331     }\r
332 \r
333     /**\r
334      * Add two unknown strings, just to make sure they get passed through without colliding\r
335      * @param strings\r
336      * @return\r
337      */\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
343         return result;\r
344     }\r
345     \r
346     Map bogusZones = null;\r
347     \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
353             }\r
354         }\r
355         return bogusZones;\r
356     }\r
357 \r
358 \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
369                     errln(\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
374                     );\r
375                     continue;            \r
376                 }\r
377                 String otherCode = (String) codeToName[k].get(name);\r
378                 if (otherCode != null) {\r
379                     errln(\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
384                         + "\t=> " + name\r
385                     );\r
386                 } else {\r
387                     codeToName[k].put(name, code);\r
388                     if (SHOW_ALL) logln(\r
389                         type \r
390                         + " (" + ((context != null) ? context : "") + ")"\r
391                         + "\t" + locale + " [" + locale.getDisplayName(ULocale.ENGLISH) + "]"\r
392                         + "\t" + code + "[" + getter.get(ULocale.ENGLISH, code, context) + "]"\r
393                         + "\t=> " + name \r
394                     );\r
395                 }\r
396             }\r
397         }\r
398     }\r
399 }\r