]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/util/LocaleDataTest.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / util / LocaleDataTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2003-2009, 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 com.ibm.icu.dev.test.TestFmwk;\r
10 import com.ibm.icu.impl.ICUResourceBundle;\r
11 import com.ibm.icu.lang.UScript;\r
12 import com.ibm.icu.text.UnicodeSet;\r
13 import com.ibm.icu.text.UnicodeSetIterator;\r
14 import com.ibm.icu.util.LocaleData;\r
15 import com.ibm.icu.util.ULocale;\r
16 import java.util.HashSet;\r
17 import java.util.Arrays;\r
18 \r
19 /**\r
20  * @author ram\r
21  *\r
22  * To change the template for this generated type comment go to\r
23  * Window>Preferences>Java>Code Generation>Code and Comments\r
24  */\r
25 public class LocaleDataTest extends TestFmwk{\r
26 \r
27     public static void main(String[] args) throws Exception{\r
28         new LocaleDataTest().run(args);\r
29     }\r
30     \r
31     private ULocale[] availableLocales = null;\r
32     \r
33     public LocaleDataTest(){\r
34     }\r
35     protected void init(){\r
36         availableLocales = ICUResourceBundle.getAvailableULocales(ICUResourceBundle.ICU_BASE_NAME);\r
37     }\r
38     public void TestPaperSize(){\r
39         for(int i = 0; i < availableLocales.length; i++){\r
40             ULocale locale = availableLocales[i];\r
41             LocaleData.PaperSize paperSize = LocaleData.getPaperSize(locale);\r
42             // skip testing of "in" .. deprecated code for Indonesian\r
43             String lang = locale.getLanguage();\r
44             if(lang.equals("in")){\r
45                 continue;\r
46             }\r
47             if(locale.toString().indexOf("_US") >= 0 || locale.toString().indexOf("_CA") >= 0 ||\r
48                locale.toString().indexOf("_PH") >= 0 || locale.toString().indexOf("_CL") >= 0 ||\r
49                locale.toString().indexOf("_PR") >= 0 || locale.toString().indexOf("_VE") >= 0 ||\r
50                locale.toString().indexOf("_CO") >= 0 || locale.toString().indexOf("_MX") >= 0 ){\r
51                 if(paperSize.getHeight()!= 279 || paperSize.getWidth() != 216 ){\r
52                     errln("PaperSize did not return the expected value for locale "+ locale+\r
53                           " Expected height: 279 width: 216."+\r
54                           " Got height: "+paperSize.getHeight()+" width: "+paperSize.getWidth()\r
55                            );\r
56                 }else{\r
57                     logln("PaperSize returned the expected values for locale " + locale);\r
58                 }\r
59             }else{\r
60                 if(paperSize.getHeight()!= 297 || paperSize.getWidth() != 210 ){\r
61                     errln("PaperSize did not return the expected value for locale "+ locale +\r
62                           " Expected height: 297 width: 210."+\r
63                           " Got height: "+paperSize.getHeight() +" width: "+paperSize.getWidth() \r
64                            );\r
65                 }else{\r
66                     logln("PaperSize returned the expected values for locale " + locale);\r
67                 }\r
68             }\r
69         }\r
70     }\r
71     public void TestMeasurementSystem(){\r
72         for(int i=0; i<availableLocales.length; i++){\r
73             ULocale locale = availableLocales[i];\r
74             LocaleData.MeasurementSystem ms = LocaleData.getMeasurementSystem(locale);\r
75             // skip testing of "in" .. deprecated code for Indonesian\r
76             String lang = locale.getLanguage();\r
77             if(lang.equals("in")){\r
78                 continue;\r
79             }           \r
80             if(locale.toString().indexOf("_US") >= 0){\r
81                 if(ms == LocaleData.MeasurementSystem.US){\r
82                     logln("Got the expected measurement system for locale: " + locale);\r
83                 }else{\r
84                     errln("Did not get the expected measurement system for locale: "+ locale);\r
85                 }\r
86             }else{\r
87                 if(ms == LocaleData.MeasurementSystem.SI){\r
88                     logln("Got the expected measurement system for locale: " + locale);\r
89                 }else{\r
90                     errln("Did not get the expected measurement system for locale: "+ locale);\r
91                 } \r
92             }\r
93         }\r
94     }\r
95     \r
96     // Bundle together a UnicodeSet (of expemplars) and ScriptCode combination.\r
97     //   We keep a set of combinations that have already been tested, to\r
98     //   avoid repeated (time consuming) retesting of the same data.\r
99     //   Instances of this class must be well behaved as members of a set.\r
100     static class ExemplarGroup {\r
101         private int[] scs;\r
102         private UnicodeSet set;\r
103         \r
104         ExemplarGroup(UnicodeSet s, int[] scriptCodes) {\r
105             set = s;\r
106             scs = scriptCodes;\r
107         }\r
108         public int hashCode() {\r
109             int hash = 0;\r
110             for (int i=0; i<scs.length && i<4; i++) {\r
111                 hash = (hash<<8)+scs[i];\r
112             }\r
113             return hash;\r
114         }        \r
115         public boolean equals(Object other) {\r
116             ExemplarGroup o = (ExemplarGroup)other;\r
117             boolean r = Arrays.equals(scs, o.scs) &&\r
118                          set.equals(o.set);\r
119             return r;\r
120         }\r
121     }\r
122     \r
123     public void TestExemplarSet(){\r
124         HashSet  testedExemplars = new HashSet();\r
125         int equalCount = 0;\r
126         for(int i=0; i<availableLocales.length; i++){\r
127             ULocale locale = availableLocales[i];\r
128             int[] scriptCodes = UScript.getCode(locale);\r
129             if (scriptCodes==null) {\r
130                 // I hate the JDK's solution for deprecated language codes.\r
131                 // Why does the Locale constructor change the string I passed to it ?\r
132                 // such a broken hack !!!!!\r
133                 // so in effect I can never test the script code for Indonesian :(\r
134                 if(locale.toString().indexOf(("in"))<0){\r
135                     errln("UScript.getCode returned null for locale: " + locale); \r
136                 }\r
137                 continue;\r
138             }\r
139             UnicodeSet exemplarSets[] = new UnicodeSet[2];\r
140             for (int k=0; k<2; ++k) {   // for casing option in (normal, caseInsensitive)\r
141                 int option = (k==0) ? 0 : UnicodeSet.CASE;\r
142                 UnicodeSet exemplarSet = LocaleData.getExemplarSet(locale, option);\r
143                 exemplarSets[k] = exemplarSet;\r
144                 ExemplarGroup exGrp = new ExemplarGroup(exemplarSet, scriptCodes);\r
145                 if (!testedExemplars.contains(exGrp)) {\r
146                     testedExemplars.add(exGrp);\r
147                     UnicodeSet[] sets = new UnicodeSet[scriptCodes.length];\r
148                     // create the UnicodeSets for the script\r
149                     for(int j=0; j < scriptCodes.length; j++){\r
150                         sets[j] = new UnicodeSet("[:" + UScript.getShortName(scriptCodes[j]) + ":]");\r
151                     }\r
152                     boolean existsInScript = false;\r
153                     UnicodeSetIterator iter = new UnicodeSetIterator(exemplarSet);\r
154                     // iterate over the \r
155                     while (!existsInScript && iter.nextRange()) {\r
156                         if (iter.codepoint != UnicodeSetIterator.IS_STRING) {\r
157                             for(int j=0; j<sets.length; j++){\r
158                                 if(sets[j].contains(iter.codepoint, iter.codepointEnd)){\r
159                                     existsInScript = true;\r
160                                     break;\r
161                                 }\r
162                             }\r
163                         } else {\r
164                             for(int j=0; j<sets.length; j++){\r
165                                 if(sets[j].contains(iter.string)){\r
166                                     existsInScript = true;\r
167                                     break;\r
168                                 }\r
169                             }\r
170                         }\r
171                     }\r
172                     if(existsInScript == false){\r
173                         errln("ExemplarSet containment failed for locale : "+ locale);\r
174                     }\r
175                 }\r
176             }\r
177             // This is expensive, so only do it if it will be visible\r
178             if (isVerbose()) {\r
179                 logln(locale.toString() + " exemplar " + exemplarSets[0]);\r
180                 logln(locale.toString() + " exemplar(case-folded) " + exemplarSets[1]);\r
181             }\r
182             assertTrue(locale.toString() + " case-folded is a superset",\r
183                     exemplarSets[1].containsAll(exemplarSets[0]));\r
184             if (exemplarSets[1].equals(exemplarSets[0])) {\r
185                 ++equalCount;\r
186             }\r
187         }\r
188         // Note: The case-folded set should sometimes be a strict superset\r
189         // and sometimes be equal.\r
190         assertTrue("case-folded is sometimes a strict superset, and sometimes equal",\r
191                    equalCount > 0 && equalCount < availableLocales.length);\r
192     }\r
193     public void TestExemplarSet2(){\r
194         int equalCount = 0;\r
195         HashSet  testedExemplars = new HashSet();\r
196         for(int i=0; i<availableLocales.length; i++){\r
197             ULocale locale = availableLocales[i];\r
198             LocaleData ld = LocaleData.getInstance(locale);\r
199             int[] scriptCodes = UScript.getCode(locale);\r
200             if (scriptCodes==null) {\r
201                 if(locale.toString().indexOf(("in"))<0){\r
202                     errln("UScript.getCode returned null for locale: "+ locale); \r
203                 }\r
204                 continue;\r
205             }\r
206             UnicodeSet exemplarSets[] = new UnicodeSet[4];\r
207 \r
208             for (int k=0; k<2; ++k) {  // for casing option in (normal, uncased)\r
209                 int option = (k==0) ? 0 : UnicodeSet.CASE;\r
210                 for(int h=0; h<2; ++h){  \r
211                     int type = (h==0) ? LocaleData.ES_STANDARD : LocaleData.ES_AUXILIARY;\r
212 \r
213                     UnicodeSet exemplarSet = ld.getExemplarSet(option, type);\r
214                     exemplarSets[k*2+h] = exemplarSet;\r
215 \r
216                     ExemplarGroup exGrp = new ExemplarGroup(exemplarSet, scriptCodes);\r
217                     if (!testedExemplars.contains(exGrp)) {\r
218                         testedExemplars.add(exGrp);\r
219                         UnicodeSet[] sets = new UnicodeSet[scriptCodes.length];\r
220                         // create the UnicodeSets for the script\r
221                         for(int j=0; j < scriptCodes.length; j++){\r
222                             sets[j] = new UnicodeSet("[:" + UScript.getShortName(scriptCodes[j]) + ":]");\r
223                         }\r
224                         boolean existsInScript = false;\r
225                         UnicodeSetIterator iter = new UnicodeSetIterator(exemplarSet);\r
226                         // iterate over the \r
227                         while (!existsInScript && iter.nextRange()) {\r
228                             if (iter.codepoint != UnicodeSetIterator.IS_STRING) {\r
229                                 for(int j=0; j<sets.length; j++){\r
230                                     if(sets[j].contains(iter.codepoint, iter.codepointEnd)){\r
231                                         existsInScript = true;\r
232                                         break;\r
233                                     }\r
234                                 }\r
235                             } else {\r
236                                 for(int j=0; j<sets.length; j++){\r
237                                     if(sets[j].contains(iter.string)){\r
238                                         existsInScript = true;\r
239                                         break;\r
240                                     }\r
241                                 }\r
242                             }\r
243                         }\r
244                         // TODO: How to verify LocaleData.ES_AUXILIARY ???\r
245                         if(existsInScript == false && h == 0){\r
246                             errln("ExemplarSet containment failed for locale,option,type : "+ locale + ", " + option + ", " + type);\r
247                         }\r
248                     }\r
249                 }\r
250             }\r
251             // This is expensive, so only do it if it will be visible\r
252             if (isVerbose()) {\r
253                 logln(locale.toString() + " exemplar(ES_STANDARD)" + exemplarSets[0]);\r
254                 logln(locale.toString() + " exemplar(ES_AUXILIARY) " + exemplarSets[1]);\r
255                 logln(locale.toString() + " exemplar(case-folded,ES_STANDARD) " + exemplarSets[2]);\r
256                 logln(locale.toString() + " exemplar(case-folded,ES_AUXILIARY) " + exemplarSets[3]);\r
257             }\r
258             assertTrue(locale.toString() + " case-folded is a superset",\r
259                     exemplarSets[2].containsAll(exemplarSets[0]));\r
260             assertTrue(locale.toString() + " case-folded is a superset",\r
261                     exemplarSets[3].containsAll(exemplarSets[1]));\r
262             if (exemplarSets[2].equals(exemplarSets[0])) {\r
263                 ++equalCount;\r
264             }\r
265             if (exemplarSets[3].equals(exemplarSets[1])) {\r
266                 ++equalCount;\r
267             }\r
268         }\r
269         // Note: The case-folded set should sometimes be a strict superset\r
270         // and sometimes be equal.\r
271         assertTrue("case-folded is sometimes a strict superset, and sometimes equal",\r
272                 equalCount > 0 && equalCount < availableLocales.length * 2);\r
273     }\r
274     public void TestCoverage(){\r
275         LocaleData ld = LocaleData.getInstance();\r
276         boolean t = ld.getNoSubstitute();\r
277         ld.setNoSubstitute(t);\r
278         assertEquals("LocaleData get/set NoSubstitute",\r
279                 t,\r
280                 ld.getNoSubstitute());\r
281     \r
282         logln(ld.getDelimiter(LocaleData.QUOTATION_START));\r
283         logln(ld.getDelimiter(LocaleData.QUOTATION_END));\r
284         logln(ld.getDelimiter(LocaleData.ALT_QUOTATION_START));\r
285         logln(ld.getDelimiter(LocaleData.ALT_QUOTATION_END));\r
286     }\r
287 \r
288     public void TestLocaleDisplayPattern(){\r
289         LocaleData ld = LocaleData.getInstance();\r
290         logln("Default locale "+ " LocaleDisplayPattern:" + ld.getLocaleDisplayPattern());\r
291         logln("Default locale "+ " LocaleSeparator:" + ld.getLocaleSeparator());\r
292         for(int i = 0; i < availableLocales.length; i++){\r
293           ULocale locale = availableLocales[i];\r
294           ld = LocaleData.getInstance(locale);\r
295           logln(locale.toString() + " LocaleDisplayPattern:" + ld.getLocaleDisplayPattern());\r
296           logln(locale.toString() + " LocaleSeparator:" + ld.getLocaleSeparator());\r
297         }\r
298     }\r
299 }\r