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