2 *******************************************************************************
\r
3 * Copyright (C) 2003-2009, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
8 package com.ibm.icu.dev.test.collator;
\r
10 import java.util.Arrays;
\r
11 import java.util.Collections;
\r
12 import java.util.HashMap;
\r
13 import java.util.HashSet;
\r
14 import java.util.Iterator;
\r
15 import java.util.Locale;
\r
16 import java.util.Map;
\r
17 import java.util.MissingResourceException;
\r
18 import java.util.Set;
\r
20 import com.ibm.icu.dev.test.TestFmwk;
\r
21 import com.ibm.icu.text.Collator;
\r
22 import com.ibm.icu.text.Collator.CollatorFactory;
\r
23 import com.ibm.icu.util.ULocale;
\r
25 public class CollationServiceTest extends TestFmwk {
\r
26 public static void main(String[] args) {
\r
27 new CollationServiceTest().run(args);
\r
30 public void TestRegister() {
\r
31 // register a singleton
\r
32 Collator frcol = Collator.getInstance(ULocale.FRANCE);
\r
33 Collator uscol = Collator.getInstance(ULocale.US);
\r
35 { // try override en_US collator
\r
36 Object key = Collator.registerInstance(frcol, ULocale.US);
\r
37 Collator ncol = Collator.getInstance(ULocale.US);
\r
38 if (!frcol.equals(ncol)) {
\r
39 errln("register of french collator for en_US failed");
\r
43 Collator test = Collator.getInstance(ULocale.GERMANY); // CollatorFactory.handleCreate
\r
44 if (!test.getLocale(ULocale.VALID_LOCALE).equals(ULocale.GERMANY)) {
\r
45 errln("Collation from Germany is really " + test.getLocale(ULocale.VALID_LOCALE));
\r
48 if (!Collator.unregister(key)) {
\r
49 errln("failed to unregister french collator");
\r
51 ncol = Collator.getInstance(ULocale.US);
\r
52 if (!uscol.equals(ncol)) {
\r
53 errln("collator after unregister does not match original");
\r
57 ULocale fu_FU = new ULocale("fu_FU_FOO");
\r
59 { // try create collator for new locale
\r
60 Collator fucol = Collator.getInstance(fu_FU);
\r
61 Object key = Collator.registerInstance(frcol, fu_FU);
\r
62 Collator ncol = Collator.getInstance(fu_FU);
\r
63 if (!frcol.equals(ncol)) {
\r
64 errln("register of fr collator for fu_FU failed");
\r
67 ULocale[] locales = Collator.getAvailableULocales();
\r
68 boolean found = false;
\r
69 for (int i = 0; i < locales.length; ++i) {
\r
70 if (locales[i].equals(fu_FU)) {
\r
76 errln("new locale fu_FU not reported as supported locale");
\r
79 String name = Collator.getDisplayName(fu_FU);
\r
80 if (!"fu (FU, FOO)".equals(name)) {
\r
81 errln("found " + name + " for fu_FU");
\r
83 }catch(MissingResourceException ex){
\r
84 warnln("Could not load locale data.");
\r
87 String name = Collator.getDisplayName(fu_FU, fu_FU);
\r
88 if (!"fu (FU, FOO)".equals(name)) {
\r
89 errln("found " + name + " for fu_FU");
\r
91 }catch(MissingResourceException ex){
\r
92 warnln("Could not load locale data.");
\r
95 if (!Collator.unregister(key)) {
\r
96 errln("failed to unregister french collator");
\r
98 ncol = Collator.getInstance(fu_FU);
\r
99 if (!fucol.equals(ncol)) {
\r
100 errln("collator after unregister does not match original fu_FU");
\r
105 // coverage after return to default
\r
106 ULocale[] locales = Collator.getAvailableULocales();
\r
108 for (int i = 0; i < locales.length; ++i) {
\r
109 if (locales[i].equals(fu_FU)) {
\r
110 errln("new locale fu_FU not reported as supported locale");
\r
115 Collator ncol = Collator.getInstance(ULocale.US);
\r
116 if (!ncol.getLocale(ULocale.VALID_LOCALE).equals(ULocale.US)) {
\r
117 errln("Collation from US is really " + ncol.getLocale(ULocale.VALID_LOCALE));
\r
122 public void TestRegisterFactory() {
\r
124 class CollatorInfo {
\r
127 Map displayNames; // locale -> string
\r
129 CollatorInfo(ULocale locale, Collator collator, Map displayNames) {
\r
130 this.locale = locale;
\r
131 this.collator = collator;
\r
132 this.displayNames = displayNames;
\r
135 String getDisplayName(ULocale displayLocale) {
\r
136 String name = null;
\r
137 if (displayNames != null) {
\r
138 name = (String)displayNames.get(displayLocale);
\r
140 if (name == null) {
\r
141 name = locale.getDisplayName(displayLocale);
\r
147 class TestFactory extends CollatorFactory {
\r
151 TestFactory(CollatorInfo[] info) {
\r
152 map = new HashMap();
\r
153 for (int i = 0; i < info.length; ++i) {
\r
154 CollatorInfo ci = info[i];
\r
155 map.put(ci.locale, ci);
\r
159 public Collator createCollator(ULocale loc) {
\r
160 CollatorInfo ci = (CollatorInfo)map.get(loc);
\r
162 return ci.collator;
\r
167 public String getDisplayName(ULocale objectLocale, ULocale displayLocale) {
\r
168 CollatorInfo ci = (CollatorInfo)map.get(objectLocale);
\r
170 return ci.getDisplayName(displayLocale);
\r
175 public Set getSupportedLocaleIDs() {
\r
177 HashSet set = new HashSet();
\r
178 Iterator iter = map.keySet().iterator();
\r
179 while (iter.hasNext()) {
\r
180 ULocale locale = (ULocale)iter.next();
\r
181 String id = locale.toString();
\r
184 ids = Collections.unmodifiableSet(set);
\r
190 class TestFactoryWrapper extends CollatorFactory {
\r
191 CollatorFactory delegate;
\r
193 TestFactoryWrapper(CollatorFactory delegate) {
\r
194 this.delegate = delegate;
\r
197 public Collator createCollator(ULocale loc) {
\r
198 return delegate.createCollator(loc);
\r
201 // use CollatorFactory getDisplayName(ULocale, ULocale) for coverage
\r
203 public Set getSupportedLocaleIDs() {
\r
204 return delegate.getSupportedLocaleIDs();
\r
208 ULocale fu_FU = new ULocale("fu_FU");
\r
209 ULocale fu_FU_FOO = new ULocale("fu_FU_FOO");
\r
211 Map fuFUNames = new HashMap();
\r
212 fuFUNames.put(fu_FU, "ze leetle bunny Fu-Fu");
\r
213 fuFUNames.put(fu_FU_FOO, "zee leetel bunny Foo-Foo");
\r
214 fuFUNames.put(ULocale.US, "little bunny Foo Foo");
\r
216 Collator frcol = Collator.getInstance(ULocale.FRANCE);
\r
217 /* Collator uscol = */Collator.getInstance(ULocale.US);
\r
218 Collator gecol = Collator.getInstance(ULocale.GERMANY);
\r
219 Collator jpcol = Collator.getInstance(ULocale.JAPAN);
\r
220 Collator fucol = Collator.getInstance(fu_FU);
\r
222 CollatorInfo[] info = {
\r
223 new CollatorInfo(ULocale.US, frcol, null),
\r
224 new CollatorInfo(ULocale.FRANCE, gecol, null),
\r
225 new CollatorInfo(fu_FU, jpcol, fuFUNames),
\r
227 TestFactory factory = null;
\r
229 factory = new TestFactory(info);
\r
230 }catch(MissingResourceException ex){
\r
231 warnln("Could not load locale data.");
\r
235 TestFactoryWrapper wrapper = new TestFactoryWrapper(factory); // in java, gc lets us easily multiply reference!
\r
236 Object key = Collator.registerFactory(wrapper);
\r
237 String name = null;
\r
239 name = Collator.getDisplayName(fu_FU, fu_FU_FOO);
\r
240 }catch(MissingResourceException ex){
\r
241 warnln("Could not load locale data.");
\r
243 logln("*** default name: " + name);
\r
244 Collator.unregister(key);
\r
246 ULocale bar_BAR = new ULocale("bar_BAR");
\r
247 Collator col = Collator.getInstance(bar_BAR);
\r
248 if (!col.getLocale(ULocale.VALID_LOCALE).equals(ULocale.getDefault())) {
\r
249 errln("Collation from bar_BAR is really " + col.getLocale(ULocale.VALID_LOCALE));
\r
253 int n1 = checkAvailable("before registerFactory");
\r
256 Object key = Collator.registerFactory(factory);
\r
258 int n2 = checkAvailable("after registerFactory");
\r
260 Collator ncol = Collator.getInstance(ULocale.US);
\r
261 if (!frcol.equals(ncol)) {
\r
262 errln("frcoll for en_US failed");
\r
265 ncol = Collator.getInstance(fu_FU_FOO);
\r
266 if (!jpcol.equals(ncol)) {
\r
267 errln("jpcol for fu_FU_FOO failed, got: " + ncol);
\r
270 ULocale[] locales = Collator.getAvailableULocales();
\r
271 boolean found = false;
\r
272 for (int i = 0; i < locales.length; ++i) {
\r
273 if (locales[i].equals(fu_FU)) {
\r
279 errln("new locale fu_FU not reported as supported locale");
\r
282 String name = Collator.getDisplayName(fu_FU);
\r
283 if (!"little bunny Foo Foo".equals(name)) {
\r
284 errln("found " + name + " for fu_FU");
\r
287 name = Collator.getDisplayName(fu_FU, fu_FU_FOO);
\r
288 if (!"zee leetel bunny Foo-Foo".equals(name)) {
\r
289 errln("found " + name + " for fu_FU in fu_FU_FOO");
\r
292 if (!Collator.unregister(key)) {
\r
293 errln("failed to unregister factory");
\r
296 int n3 = checkAvailable("after unregister");
\r
297 assertTrue("register increases count", n2>n1);
\r
298 assertTrue("unregister restores count", n3==n1);
\r
300 ncol = Collator.getInstance(fu_FU);
\r
301 if (!fucol.equals(ncol)) {
\r
302 errln("collator after unregister does not match original fu_FU");
\r
308 * Check the integrity of the results of Collator.getAvailableULocales().
\r
309 * Return the number of items returned.
\r
311 int checkAvailable(String msg) {
\r
312 Locale locs[] = Collator.getAvailableLocales();
\r
313 if (!assertTrue("getAvailableLocales != null", locs!=null)) return -1;
\r
314 checkArray(msg, locs, null);
\r
315 ULocale ulocs[] = Collator.getAvailableULocales();
\r
316 if (!assertTrue("getAvailableULocales != null", ulocs!=null)) return -1;
\r
317 checkArray(msg, ulocs, null);
\r
318 // This is not true because since ULocale objects with script code cannot be
\r
319 // converted to Locale objects
\r
320 //assertTrue("getAvailableLocales().length == getAvailableULocales().length", locs.length == ulocs.length);
\r
321 return locs.length;
\r
324 private static final String KW[] = {
\r
328 private static final String KWVAL[] = {
\r
333 public void TestSeparateTrees() {
\r
334 String kw[] = Collator.getKeywords();
\r
335 if (!assertTrue("getKeywords != null", kw!=null)) return;
\r
336 checkArray("getKeywords", kw, KW);
\r
338 String kwval[] = Collator.getKeywordValues(KW[0]);
\r
339 if (!assertTrue("getKeywordValues != null", kwval!=null)) return;
\r
340 checkArray("getKeywordValues", kwval, KWVAL);
\r
342 boolean isAvailable[] = new boolean[1];
\r
343 ULocale equiv = Collator.getFunctionalEquivalent(KW[0],
\r
346 if (assertTrue("getFunctionalEquivalent(fr)!=null", equiv!=null)) {
\r
347 assertEquals("getFunctionalEquivalent(fr)", "fr", equiv.toString());
\r
349 assertTrue("getFunctionalEquivalent(fr).isAvailable==true",
\r
350 isAvailable[0] == true);
\r
352 equiv = Collator.getFunctionalEquivalent(KW[0],
\r
353 new ULocale("fr_FR"),
\r
355 if (assertTrue("getFunctionalEquivalent(fr_FR)!=null", equiv!=null)) {
\r
356 assertEquals("getFunctionalEquivalent(fr_FR)", "fr", equiv.toString());
\r
358 assertTrue("getFunctionalEquivalent(fr_FR).isAvailable==true",
\r
359 isAvailable[0] == true);
\r
361 equiv = Collator.getFunctionalEquivalent(KW[0], new ULocale("zh_Hans"));
\r
362 if (assertTrue("getFunctionalEquivalent(zh_Hans)!=null", equiv!=null)) {
\r
363 assertEquals("getFunctionalEquivalent(zh_Hans)", "zh", equiv.toString());
\r
367 public void TestGetFunctionalEquivalent() {
\r
368 String kw[] = Collator.getKeywords();
\r
369 final String DATA[] = {
\r
371 "de@collation=direct", "de", "t",
\r
372 "de@collation=traditional", "de", "t",
\r
373 "de@collation=gb2312han", "de", "t",
\r
374 "de@collation=stroke", "de", "t",
\r
375 "de@collation=pinyin", "de", "t",
\r
376 "de@collation=phonebook", "de@collation=phonebook", "t",
\r
377 "de@collation=big5han", "de", "t",
\r
378 "de_AT", "de", "t",
\r
379 "de_AT@collation=direct", "de", "t",
\r
380 "de_AT@collation=traditional", "de", "t",
\r
381 "de_AT@collation=gb2312han", "de", "t",
\r
382 "de_AT@collation=stroke", "de", "t",
\r
383 "de_AT@collation=pinyin", "de", "t",
\r
384 "de_AT@collation=phonebook", "de@collation=phonebook", "t",
\r
385 "de_AT@collation=big5han", "de", "t",
\r
387 "nl@collation=direct", "root", "t",
\r
388 "nl_BE", "root", "t",
\r
389 "nl_BE@collation=direct", "root", "t",
\r
390 "nl_BE@collation=traditional", "root", "t",
\r
391 "nl_BE@collation=gb2312han", "root", "t",
\r
392 "nl_BE@collation=stroke", "root", "t",
\r
393 "nl_BE@collation=pinyin", "root", "t",
\r
394 "nl_BE@collation=big5han", "root", "t",
\r
395 "nl_BE@collation=phonebook", "root", "t",
\r
396 "en_US_VALLEYGIRL","en","f"
\r
398 final int DATA_COUNT=(DATA.length/3);
\r
400 for(int i=0;i<DATA_COUNT;i++) {
\r
401 boolean isAvailable[] = new boolean[1];
\r
402 ULocale input = new ULocale(DATA[(i*3)+0]);
\r
403 ULocale expect = new ULocale(DATA[(i*3)+1]);
\r
404 boolean expectAvailable = DATA[(i*3)+2].equals("t");
\r
405 ULocale actual = Collator.getFunctionalEquivalent(kw[0],input,isAvailable);
\r
406 if(!actual.equals(expect) || (expectAvailable!=isAvailable[0])) {
\r
407 errln("#" + i + ": Collator.getFunctionalEquivalent(" + input + ")=" + actual + ", avail " + new Boolean(isAvailable[0]) + ", " +
\r
408 "expected " + expect + " avail " + new Boolean(expectAvailable));
\r
410 logln("#" + i + ": Collator.getFunctionalEquivalent(" + input + ")=" + actual + ", avail " + new Boolean(isAvailable[0]));
\r
415 // public void PrintFunctionalEquivalentList() {
\r
416 // ULocale[] locales = Collator.getAvailableULocales();
\r
417 // String[] keywords = Collator.getKeywords();
\r
418 // logln("Collation");
\r
419 // logln("Possible keyword=values pairs:");
\r
420 // for (int i = 0; i < Collator.getKeywords().length; ++i) {
\r
421 // String[] values = Collator.getKeywordValues(keywords[i]);
\r
422 // for (int j = 0; j < values.length; ++j) {
\r
423 // System.out.println(keywords[i] + "=" + values[j]);
\r
426 // logln("Differing Collators:");
\r
427 // boolean[] isAvailable = {true};
\r
428 // for (int k = 0; k < locales.length; ++k) {
\r
429 // logln(locales[k].getDisplayName(ULocale.ENGLISH) + " [" +locales[k] + "]");
\r
430 // for (int i = 0; i < Collator.getKeywords().length; ++i) {
\r
431 // ULocale base = Collator.getFunctionalEquivalent(keywords[i],locales[k]);
\r
432 // String[] values = Collator.getKeywordValues(keywords[i]);
\r
433 // for (int j = 0; j < Collator.getKeywordValues(keywords[i]).length;++j) {
\r
434 // ULocale other = Collator.getFunctionalEquivalent(keywords[i],
\r
435 // new ULocale(locales[k] + "@" + keywords[i] + "=" + values[j]),
\r
437 // if (isAvailable[0] && !other.equals(base)) {
\r
438 // logln("\t" + keywords[i] + "=" + values[j] + ";\t" + base + ";\t" + other);
\r
445 public void TestGetKeywordValues(){
\r
446 final String[][] PREFERRED = {
\r
447 {"und", "standard"},
\r
448 {"en_US", "standard"},
\r
449 {"en_029", "standard"},
\r
450 {"de_DE", "standard", "phonebook"},
\r
451 {"de_Latn_DE", "standard", "phonebook"},
\r
452 {"zh", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan"},
\r
453 {"zh_Hans", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan"},
\r
454 {"zh_CN", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan"},
\r
455 {"zh_Hant", "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan"},
\r
456 {"zh_TW", "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan"},
\r
457 {"zh__PINYIN", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan"},
\r
458 {"es_ES", "standard", "traditional"},
\r
459 {"es__TRADITIONAL", "traditional", "standard"},
\r
460 {"und@collation=phonebook", "standard"},
\r
461 {"de_DE@collation=big5han", "standard", "phonebook"},
\r
462 {"zzz@collation=xxx", "standard"},
\r
465 for (int i = 0; i < PREFERRED.length; i++) {
\r
466 ULocale loc = new ULocale(PREFERRED[i][0]);
\r
467 String[] expected = new String[PREFERRED[i].length - 1];
\r
468 System.arraycopy(PREFERRED[i], 1, expected, 0, expected.length);
\r
470 String[] pref = Collator.getKeywordValuesForLocale("collation", loc, true);
\r
471 boolean matchPref = false;
\r
472 if (pref.length == expected.length) {
\r
474 for (int j = 0; j < pref.length; j++) {
\r
475 if (!pref[j].equals(expected[j])) {
\r
481 errln("FAIL: Preferred values for locale " + loc
\r
482 + " got:" + Arrays.toString(pref) + " expected:" + Arrays.toString(expected));
\r
485 String[] all = Collator.getKeywordValuesForLocale("collation", loc, true);
\r
487 // Collator.getKeywordValues return the same contents for both commonlyUsed
\r
489 boolean matchAll = false;
\r
490 if (pref.length == all.length) {
\r
492 for (int j = 0; j < pref.length; j++) {
\r
493 boolean foundMatch = false;
\r
494 for (int k = 0; k < all.length; k++) {
\r
495 if (pref[j].equals(all[k])) {
\r
507 errln("FAIL: All values for locale " + loc
\r
508 + " got:" + Arrays.toString(all) + " expected:" + Arrays.toString(pref));
\r