2 *******************************************************************************
\r
3 * Copyright (C) 2003-2010, 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.Arrays;
\r
10 import java.util.HashSet;
\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
23 * To change the template for this generated type comment go to
\r
24 * Window>Preferences>Java>Code Generation>Code and Comments
\r
26 public class LocaleDataTest extends TestFmwk{
\r
28 public static void main(String[] args) throws Exception{
\r
29 new LocaleDataTest().run(args);
\r
32 private ULocale[] availableLocales = null;
\r
34 public LocaleDataTest(){
\r
36 protected void init(){
\r
37 availableLocales = ICUResourceBundle.getAvailableULocales();
\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
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
61 logln("PaperSize returned the expected values for locale " + locale);
\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
70 logln("PaperSize returned the expected values for locale " + locale);
\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
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
88 errln("Did not get the expected measurement system for locale: "+ locale);
\r
91 if(ms == LocaleData.MeasurementSystem.SI){
\r
92 logln("Got the expected measurement system for locale: " + locale);
\r
94 errln("Did not get the expected measurement system for locale: "+ locale);
\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
106 private UnicodeSet set;
\r
108 ExemplarGroup(UnicodeSet s, int[] scriptCodes) {
\r
112 public int hashCode() {
\r
114 for (int i=0; i<scs.length && i<4; i++) {
\r
115 hash = (hash<<8)+scs[i];
\r
119 public boolean equals(Object other) {
\r
120 ExemplarGroup o = (ExemplarGroup)other;
\r
121 boolean r = Arrays.equals(scs, o.scs) &&
\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
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
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
168 for(int j=0; j<sets.length; j++){
\r
169 if(sets[j].contains(iter.string)){
\r
170 existsInScript = true;
\r
176 if(existsInScript == false){
\r
177 errln("ExemplarSet containment failed for locale : "+ locale);
\r
181 // This is expensive, so only do it if it will be visible
\r
183 logln(locale.toString() + " exemplar " + exemplarSets[0]);
\r
184 logln(locale.toString() + " exemplar(case-folded) " + exemplarSets[1]);
\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
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
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
210 UnicodeSet exemplarSets[] = new UnicodeSet[4];
\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
217 UnicodeSet exemplarSet = ld.getExemplarSet(option, type);
\r
218 exemplarSets[k*2+h] = exemplarSet;
\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
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
240 for(int j=0; j<sets.length; j++){
\r
241 if(sets[j].contains(iter.string)){
\r
242 existsInScript = true;
\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
255 // This is expensive, so only do it if it will be visible
\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
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
269 if (exemplarSets[3].equals(exemplarSets[1])) {
\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
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
284 ld.getNoSubstitute());
\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
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