2 *******************************************************************************
\r
3 * Copyright (C) 2001-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.text.Collator;
\r
10 import java.util.Arrays;
\r
11 import java.util.Collections;
\r
12 import java.util.Comparator;
\r
13 import java.util.EventListener;
\r
14 import java.util.HashMap;
\r
15 import java.util.HashSet;
\r
16 import java.util.Iterator;
\r
17 import java.util.List;
\r
18 import java.util.Map;
\r
19 import java.util.Set;
\r
20 import java.util.SortedMap;
\r
21 import java.util.Map.Entry;
\r
23 import com.ibm.icu.dev.test.TestFmwk;
\r
24 import com.ibm.icu.impl.ICULocaleService;
\r
25 import com.ibm.icu.impl.ICUNotifier;
\r
26 import com.ibm.icu.impl.ICURWLock;
\r
27 import com.ibm.icu.impl.ICUResourceBundle;
\r
28 import com.ibm.icu.impl.ICUService;
\r
29 import com.ibm.icu.impl.LocaleUtility;
\r
30 import com.ibm.icu.impl.ICULocaleService.ICUResourceBundleFactory;
\r
31 import com.ibm.icu.impl.ICULocaleService.LocaleKey;
\r
32 import com.ibm.icu.impl.ICULocaleService.LocaleKeyFactory;
\r
33 import com.ibm.icu.impl.ICUService.Factory;
\r
34 import com.ibm.icu.impl.ICUService.Key;
\r
35 import com.ibm.icu.impl.ICUService.ServiceListener;
\r
36 import com.ibm.icu.impl.ICUService.SimpleFactory;
\r
37 import com.ibm.icu.util.ULocale;
\r
39 public class ICUServiceTest extends TestFmwk
\r
41 public static void main(String[] args) throws Exception {
\r
42 ICUServiceTest test = new ICUServiceTest();
\r
46 private String lrmsg(String message, Object lhs, Object rhs) {
\r
47 return message + " lhs: " + lhs + " rhs: " + rhs;
\r
50 public void confirmBoolean(String message, boolean val) {
\r
51 msg(message, val ? LOG : ERR, !val, true);
\r
54 public void confirmEqual(String message, Object lhs, Object rhs) {
\r
55 msg(lrmsg(message, lhs, rhs), (lhs == null ? rhs == null : lhs.equals(rhs)) ? LOG : ERR, true, true);
\r
58 public void confirmIdentical(String message, Object lhs, Object rhs) {
\r
59 msg(lrmsg(message, lhs, rhs), lhs == rhs ? LOG : ERR, true, true);
\r
62 public void confirmIdentical(String message, int lhs, int rhs) {
\r
63 msg(message + " lhs: " + lhs + " rhs: " + rhs, lhs == rhs ? LOG : ERR, true, true);
\r
67 * Convenience override of getDisplayNames(ULocale, Comparator, String) that
\r
68 * uses the current default ULocale as the locale, the default collator for
\r
69 * the locale as the comparator to sort the display names, and null for
\r
72 public SortedMap getDisplayNames(ICUService service) {
\r
73 ULocale locale = ULocale.getDefault();
\r
74 Collator col = Collator.getInstance(locale.toLocale());
\r
75 return service.getDisplayNames(locale, col, null);
\r
79 * Convenience override of getDisplayNames(ULocale, Comparator, String) that
\r
80 * uses the default collator for the locale as the comparator to
\r
81 * sort the display names, and null for the matchID.
\r
83 public SortedMap getDisplayNames(ICUService service, ULocale locale) {
\r
84 Collator col = Collator.getInstance(locale.toLocale());
\r
85 return service.getDisplayNames(locale, col, null);
\r
88 * Convenience override of getDisplayNames(ULocale, Comparator, String) that
\r
89 * uses the default collator for the locale as the comparator to
\r
90 * sort the display names.
\r
92 public SortedMap getDisplayNames(ICUService service, ULocale locale, String matchID) {
\r
93 Collator col = Collator.getInstance(locale.toLocale());
\r
94 return service.getDisplayNames(locale, col, matchID);
\r
98 static final class TestService extends ICUService {
\r
99 public TestService() {
\r
100 super("Test Service");
\r
103 public Key createKey(String id) {
\r
104 return LocaleKey.createWithCanonicalFallback(id, null); // no fallback locale
\r
108 public void TestAPI() {
\r
109 // create a service using locale keys,
\r
110 ICUService service = new TestService();
\r
112 logln("service name:" + service.getName());
\r
114 // register an object with one locale,
\r
115 // search for an object with a more specific locale
\r
116 // should return the original object
\r
117 Integer singleton0 = new Integer(0);
\r
118 service.registerObject(singleton0, "en_US");
\r
119 Object result = service.get("en_US_FOO");
\r
120 confirmIdentical("1) en_US_FOO -> en_US", result, singleton0);
\r
122 // register a new object with the more specific locale
\r
123 // search for an object with that locale
\r
124 // should return the new object
\r
125 Integer singleton1 = new Integer(1);
\r
126 service.registerObject(singleton1, "en_US_FOO");
\r
127 result = service.get("en_US_FOO");
\r
128 confirmIdentical("2) en_US_FOO -> en_US_FOO", result, singleton1);
\r
130 // search for an object that falls back to the first registered locale
\r
131 result = service.get("en_US_BAR");
\r
132 confirmIdentical("3) en_US_BAR -> en_US", result, singleton0);
\r
134 // get a list of the factories, should be two
\r
135 List factories = service.factories();
\r
136 confirmIdentical("4) factory size", factories.size(), 2);
\r
138 // register a new object with yet another locale
\r
139 // original factory list is unchanged
\r
140 Integer singleton2 = new Integer(2);
\r
141 service.registerObject(singleton2, "en");
\r
142 confirmIdentical("5) factory size", factories.size(), 2);
\r
144 // search for an object with the new locale
\r
145 // stack of factories is now en, en_US_FOO, en_US
\r
146 // search for en_US should still find en_US object
\r
147 result = service.get("en_US_BAR");
\r
148 confirmIdentical("6) en_US_BAR -> en_US", result, singleton0);
\r
150 // register a new object with an old id, should hide earlier factory using this id, but leave it there
\r
151 Integer singleton3 = new Integer(3);
\r
152 service.registerObject(singleton3, "en_US");
\r
153 factories = service.factories();
\r
154 confirmIdentical("9) factory size", factories.size(), 4);
\r
156 // should get data from that new factory
\r
157 result = service.get("en_US_BAR");
\r
158 confirmIdentical("10) en_US_BAR -> (3)", result, singleton3);
\r
160 // remove new factory
\r
161 // should have fewer factories again
\r
162 service.unregisterFactory((Factory)factories.get(0));
\r
163 factories = service.factories();
\r
164 confirmIdentical("11) factory size", factories.size(), 3);
\r
166 // should get original data again after remove factory
\r
167 result = service.get("en_US_BAR");
\r
168 confirmIdentical("12) en_US_BAR -> 0", result, singleton0);
\r
170 // shouldn't find unregistered ids
\r
171 result = service.get("foo");
\r
172 confirmIdentical("13) foo -> null", result, null);
\r
174 // should find non-canonical strings
\r
175 String[] resultID = new String[1];
\r
176 result = service.get("EN_us_fOo", resultID);
\r
177 confirmEqual("14) find non-canonical", resultID[0], "en_US_FOO");
\r
179 // should be able to register non-canonical strings and get them canonicalized
\r
180 service.registerObject(singleton3, "eN_ca_dUde");
\r
181 result = service.get("En_Ca_DuDe", resultID);
\r
182 confirmEqual("15) register non-canonical", resultID[0], "en_CA_DUDE");
\r
184 // should be able to register invisible factories, these will not
\r
185 // be visible by default, but if you know the secret password you
\r
186 // can still access these services...
\r
187 Integer singleton4 = new Integer(4);
\r
188 service.registerObject(singleton4, "en_US_BAR", false);
\r
189 result = service.get("en_US_BAR");
\r
190 confirmIdentical("17) get invisible", result, singleton4);
\r
192 // should not be able to locate invisible services
\r
193 Set ids = service.getVisibleIDs();
\r
194 confirmBoolean("18) find invisible", !ids.contains("en_US_BAR"));
\r
197 // an anonymous factory than handles all ids
\r
199 Factory factory = new Factory() {
\r
200 public Object create(Key key, ICUService unusedService) {
\r
201 return new ULocale(key.currentID());
\r
204 public void updateVisibleIDs(Map unusedResult) {
\r
207 public String getDisplayName(String id, ULocale l) {
\r
211 service.registerFactory(factory);
\r
213 // anonymous factory will still handle the id
\r
214 result = service.get(ULocale.US.toString());
\r
215 confirmEqual("21) locale", result, ULocale.US);
\r
217 // still normalizes id
\r
218 result = service.get("EN_US_BAR");
\r
219 confirmEqual("22) locale", result, new ULocale("en_US_BAR"));
\r
221 // we can override for particular ids
\r
222 service.registerObject(singleton3, "en_US_BAR");
\r
223 result = service.get("en_US_BAR");
\r
224 confirmIdentical("23) override super", result, singleton3);
\r
228 // empty service should not recognize anything
\r
230 result = service.get("en_US");
\r
231 confirmIdentical("24) empty", result, null);
\r
233 // create a custom multiple key factory
\r
235 String[] xids = { "en_US_VALLEY_GIRL",
\r
236 "en_US_VALLEY_BOY",
\r
237 "en_US_SURFER_GAL",
\r
238 "en_US_SURFER_DUDE"
\r
240 service.registerFactory(new TestLocaleKeyFactory(xids, "Later"));
\r
243 // iterate over the visual ids returned by the multiple factory
\r
245 Set vids = service.getVisibleIDs();
\r
246 Iterator iter = vids.iterator();
\r
248 while (iter.hasNext()) {
\r
250 String id = (String)iter.next();
\r
251 logln(" " + id + " --> " + service.get(id));
\r
253 // four visible ids
\r
254 confirmIdentical("25) visible ids", count, 4);
\r
257 // iterate over the display names
\r
259 Map dids = getDisplayNames(service, ULocale.GERMANY);
\r
260 Iterator iter = dids.entrySet().iterator();
\r
262 while (iter.hasNext()) {
\r
264 Entry e = (Entry)iter.next();
\r
265 logln(" " + e.getKey() + " -- > " + e.getValue());
\r
267 // four display names, in german
\r
268 confirmIdentical("26) display names", count, 4);
\r
271 // no valid display name
\r
272 confirmIdentical("27) get display name", service.getDisplayName("en_US_VALLEY_GEEK"), null);
\r
275 String name = service.getDisplayName("en_US_SURFER_DUDE", ULocale.US);
\r
276 confirmEqual("28) get display name", name, "English (United States, SURFER_DUDE)");
\r
279 // register another multiple factory
\r
282 "en_US_SURFER", "en_US_SURFER_GAL", "en_US_SILICON", "en_US_SILICON_GEEK"
\r
284 service.registerFactory(new TestLocaleKeyFactory(xids, "Rad dude"));
\r
287 // this time, we have seven display names
\r
288 // Rad dude's surfer gal 'replaces' later's surfer gal
\r
290 Map dids = getDisplayNames(service);
\r
291 Iterator iter = dids.entrySet().iterator();
\r
293 while (iter.hasNext()) {
\r
295 Entry e = (Entry)iter.next();
\r
296 logln(" " + e.getKey() + " --> " + e.getValue());
\r
298 // seven display names, in spanish
\r
299 confirmIdentical("29) display names", count, 7);
\r
302 // we should get the display name corresponding to the actual id
\r
303 // returned by the id we used.
\r
305 String[] actualID = new String[1];
\r
306 String id = "en_us_surfer_gal";
\r
307 String gal = (String)service.get(id, actualID);
\r
309 logln("actual id: " + actualID[0]);
\r
310 String displayName = service.getDisplayName(actualID[0], ULocale.US);
\r
311 logln("found actual: " + gal + " with display name: " + displayName);
\r
312 confirmBoolean("30) found display name for actual", displayName != null);
\r
314 displayName = service.getDisplayName(id, ULocale.US);
\r
315 logln("found query: " + gal + " with display name: " + displayName);
\r
316 // this is no longer a bug, we want to return display names for anything
\r
317 // that a factory handles. since we handle it, we should return a display
\r
318 // name. see jb3549
\r
319 // confirmBoolean("31) found display name for query", displayName == null);
\r
321 errln("30) service could not find entry for " + id);
\r
324 // this should be handled by the 'dude' factory, since it overrides en_US_SURFER.
\r
325 id = "en_US_SURFER_BOZO";
\r
326 String bozo = (String)service.get(id, actualID);
\r
327 if (bozo != null) {
\r
328 String displayName = service.getDisplayName(actualID[0], ULocale.US);
\r
329 logln("found actual: " + bozo + " with display name: " + displayName);
\r
330 confirmBoolean("32) found display name for actual", displayName != null);
\r
332 displayName = service.getDisplayName(id, ULocale.US);
\r
333 logln("found actual: " + bozo + " with display name: " + displayName);
\r
334 // see above and jb3549
\r
335 // confirmBoolean("33) found display name for query", displayName == null);
\r
337 errln("32) service could not find entry for " + id);
\r
340 confirmBoolean("34) is default ", !service.isDefault());
\r
344 // disallow hiding for now
\r
346 // hiding factory should obscure 'sublocales'
\r
349 "en_US_VALLEY", "en_US_SILICON"
\r
351 service.registerFactory(new TestHidingFactory(xids, "hiding"));
\r
355 Map dids = service.getDisplayNames();
\r
356 Iterator iter = dids.entrySet().iterator();
\r
358 while (iter.hasNext()) {
\r
360 Entry e = (Entry)iter.next();
\r
361 logln(" " + e.getKey() + " -- > " + e.getValue());
\r
363 confirmIdentical("35) hiding factory", count, 5);
\r
368 Set xids = service.getVisibleIDs();
\r
369 Iterator iter = xids.iterator();
\r
370 while (iter.hasNext()) {
\r
371 String xid = (String)iter.next();
\r
372 logln(xid + "? " + service.get(xid));
\r
375 logln("valleygirl? " + service.get("en_US_VALLEY_GIRL"));
\r
376 logln("valleyboy? " + service.get("en_US_VALLEY_BOY"));
\r
377 logln("valleydude? " + service.get("en_US_VALLEY_DUDE"));
\r
378 logln("surfergirl? " + service.get("en_US_SURFER_GIRL"));
\r
381 // resource bundle factory.
\r
383 service.registerFactory(new ICUResourceBundleFactory());
\r
385 // list all of the resources
\r
387 logln("all visible ids: " + service.getVisibleIDs());
\r
389 Set xids = service.getVisibleIDs();
\r
390 StringBuffer buf = new StringBuffer("{");
\r
391 boolean notfirst = false;
\r
392 Iterator iter = xids.iterator();
\r
393 while (iter.hasNext()) {
\r
394 String xid = (String)iter.next();
\r
403 logln(buf.toString());
\r
407 // list only the resources for es, default locale
\r
408 // since we're using the default Key, only "es" is matched
\r
410 logln("visible ids for es locale: " + service.getVisibleIDs("es"));
\r
413 // list only the spanish display names for es, spanish collation order
\r
414 // since we're using the default Key, only "es" is matched
\r
416 logln("display names: " + getDisplayNames(service, new ULocale("es"), "es"));
\r
419 // list the display names in reverse order
\r
421 logln("display names in reverse order: " +
\r
422 service.getDisplayNames(ULocale.US, new Comparator() {
\r
423 public int compare(Object lhs, Object rhs) {
\r
424 return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs);
\r
429 // get all the display names of these resources
\r
430 // this should be fast since the display names were cached.
\r
432 logln("service display names for de_DE");
\r
433 Map names = getDisplayNames(service, new ULocale("de_DE"));
\r
434 StringBuffer buf = new StringBuffer("{");
\r
435 Iterator iter = names.entrySet().iterator();
\r
436 while (iter.hasNext()) {
\r
437 Entry e = (Entry)iter.next();
\r
438 String name = (String)e.getKey();
\r
439 String id = (String)e.getValue();
\r
440 buf.append("\n " + name + " --> " + id);
\r
443 logln(buf.toString());
\r
446 CalifornioLanguageFactory califactory = new CalifornioLanguageFactory();
\r
447 service.registerFactory(califactory);
\r
448 // get all the display names of these resources
\r
450 logln("californio language factory");
\r
451 StringBuffer buf = new StringBuffer("{");
\r
452 String[] idNames = {
\r
453 CalifornioLanguageFactory.californio,
\r
454 CalifornioLanguageFactory.valley,
\r
455 CalifornioLanguageFactory.surfer,
\r
456 CalifornioLanguageFactory.geek
\r
458 for (int i = 0; i < idNames.length; ++i) {
\r
459 String idName = idNames[i];
\r
460 buf.append("\n --- " + idName + " ---");
\r
461 Map names = getDisplayNames(service, new ULocale(idName));
\r
462 Iterator iter = names.entrySet().iterator();
\r
463 while (iter.hasNext()) {
\r
464 Entry e = (Entry)iter.next();
\r
465 String name = (String)e.getKey();
\r
466 String id = (String)e.getValue();
\r
467 buf.append("\n " + name + " --> " + id);
\r
471 logln(buf.toString());
\r
474 // test notification
\r
475 // simple registration
\r
477 logln("simple registration notification");
\r
478 ICULocaleService ls = new ICULocaleService();
\r
479 ServiceListener l1 = new ServiceListener() {
\r
481 public void serviceChanged(ICUService s) {
\r
482 logln("listener 1 report " + n++ + " service changed: " + s);
\r
485 ls.addListener(l1);
\r
486 ServiceListener l2 = new ServiceListener() {
\r
488 public void serviceChanged(ICUService s) {
\r
489 logln("listener 2 report " + n++ + " service changed: " + s);
\r
492 ls.addListener(l2);
\r
493 logln("registering foo... ");
\r
494 ls.registerObject("Foo", "en_FOO");
\r
495 logln("registering bar... ");
\r
496 ls.registerObject("Bar", "en_BAR");
\r
497 logln("getting foo...");
\r
498 logln((String)ls.get("en_FOO"));
\r
499 logln("removing listener 2...");
\r
500 ls.removeListener(l2);
\r
501 logln("registering baz...");
\r
502 ls.registerObject("Baz", "en_BAZ");
\r
503 logln("removing listener 1");
\r
504 ls.removeListener(l1);
\r
505 logln("registering burp...");
\r
506 ls.registerObject("Burp", "en_BURP");
\r
508 // should only get one notification even if register multiple times
\r
509 logln("... trying multiple registration");
\r
510 ls.addListener(l1);
\r
511 ls.addListener(l1);
\r
512 ls.addListener(l1);
\r
513 ls.addListener(l2);
\r
514 ls.registerObject("Foo", "en_FOO");
\r
515 logln("... registered foo");
\r
517 // since in a separate thread, we can callback and not deadlock
\r
518 ServiceListener l3 = new ServiceListener() {
\r
520 public void serviceChanged(ICUService s) {
\r
521 logln("listener 3 report " + n++ + " service changed...");
\r
522 if (s.get("en_BOINK") == null) { // don't recurse on ourselves!!!
\r
523 logln("registering boink...");
\r
524 s.registerObject("boink", "en_BOINK");
\r
528 ls.addListener(l3);
\r
529 logln("registering boo...");
\r
530 ls.registerObject("Boo", "en_BOO");
\r
536 catch (InterruptedException e) {
\r
541 static class TestLocaleKeyFactory extends LocaleKeyFactory {
\r
542 protected final Set ids;
\r
543 protected final String factoryID;
\r
545 public TestLocaleKeyFactory(String[] ids, String factoryID) {
\r
546 super(VISIBLE, factoryID);
\r
548 this.ids = Collections.unmodifiableSet(new HashSet(Arrays.asList(ids)));
\r
549 this.factoryID = factoryID + ": ";
\r
552 protected Object handleCreate(ULocale loc, int kind, ICUService service) {
\r
553 return factoryID + loc.toString();
\r
556 protected Set getSupportedIDs() {
\r
562 // Disallow hiding for now since it causes gnarly problems, like
\r
563 // how do you localize the hidden (but still exported) names.
\r
565 static class TestHidingFactory implements ICUService.Factory {
\r
566 protected final String[] ids;
\r
567 protected final String factoryID;
\r
569 public TestHidingFactory(String[] ids) {
\r
570 this(ids, "Hiding");
\r
573 public TestHidingFactory(String[] ids, String factoryID) {
\r
574 this.ids = (String[])ids.clone();
\r
576 if (factoryID == null || factoryID.length() == 0) {
\r
577 this.factoryID = "";
\r
579 this.factoryID = factoryID + ": ";
\r
583 public Object create(Key key, ICUService service) {
\r
584 for (int i = 0; i < ids.length; ++i) {
\r
585 if (LocaleUtility.isFallbackOf(ids[i], key.currentID())) {
\r
586 return factoryID + key.canonicalID();
\r
592 public void updateVisibleIDs(Map result) {
\r
593 for (int i = 0; i < ids.length; ++i) {
\r
594 String id = ids[i];
\r
595 Iterator iter = result.keySet().iterator();
\r
596 while (iter.hasNext()) {
\r
597 if (LocaleUtility.isFallbackOf(id, (String)iter.next())) {
\r
601 result.put(id, this);
\r
605 public String getDisplayName(String id, ULocale locale) {
\r
606 return factoryID + new ULocale(id).getDisplayName(locale);
\r
611 static class CalifornioLanguageFactory extends ICUResourceBundleFactory {
\r
612 public static String californio = "en_US_CA";
\r
613 public static String valley = californio + "_VALLEY";
\r
614 public static String surfer = californio + "_SURFER";
\r
615 public static String geek = californio + "_GEEK";
\r
616 public static Set supportedIDs;
\r
618 HashSet result = new HashSet();
\r
619 result.addAll(ICUResourceBundle.getAvailableLocaleNameSet());
\r
620 result.add(californio);
\r
621 result.add(valley);
\r
622 result.add(surfer);
\r
624 supportedIDs = Collections.unmodifiableSet(result);
\r
627 public Set getSupportedIDs() {
\r
628 return supportedIDs;
\r
631 public String getDisplayName(String id, ULocale locale) {
\r
632 String prefix = "";
\r
633 String suffix = "";
\r
634 String ls = locale.toString();
\r
635 if (LocaleUtility.isFallbackOf(californio, ls)) {
\r
636 if (ls.equalsIgnoreCase(valley)) {
\r
637 prefix = "Like, you know, it's so totally ";
\r
638 } else if (ls.equalsIgnoreCase(surfer)) {
\r
639 prefix = "Dude, its ";
\r
640 } else if (ls.equalsIgnoreCase(geek)) {
\r
641 prefix = "I'd estimate it's approximately ";
\r
643 prefix = "Huh? Maybe ";
\r
646 if (LocaleUtility.isFallbackOf(californio, id)) {
\r
647 if (id.equalsIgnoreCase(valley)) {
\r
648 suffix = "like the Valley, you know? Let's go to the mall!";
\r
649 } else if (id.equalsIgnoreCase(surfer)) {
\r
650 suffix = "time to hit those gnarly waves, Dude!!!";
\r
651 } else if (id.equalsIgnoreCase(geek)) {
\r
652 suffix = "all systems go. T-Minus 9, 8, 7...";
\r
654 suffix = "No Habla Englais";
\r
657 suffix = super.getDisplayName(id, locale);
\r
660 return prefix + suffix;
\r
664 public void TestLocale() {
\r
665 ICULocaleService service = new ICULocaleService("test locale");
\r
666 service.registerObject("root", ULocale.ROOT);
\r
667 service.registerObject("german", "de");
\r
668 service.registerObject("german_Germany", ULocale.GERMANY);
\r
669 service.registerObject("japanese", "ja");
\r
670 service.registerObject("japanese_Japan", ULocale.JAPAN);
\r
672 Object target = service.get("de_US");
\r
673 confirmEqual("test de_US", "german", target);
\r
675 ULocale de = new ULocale("de");
\r
676 ULocale de_US = new ULocale("de_US");
\r
678 target = service.get(de_US);
\r
679 confirmEqual("test de_US 2", "german", target);
\r
681 target = service.get(de_US, LocaleKey.KIND_ANY);
\r
682 confirmEqual("test de_US 3", "german", target);
\r
684 target = service.get(de_US, 1234);
\r
685 confirmEqual("test de_US 4", "german", target);
\r
687 ULocale[] actualReturn = new ULocale[1];
\r
688 target = service.get(de_US, actualReturn);
\r
689 confirmEqual("test de_US 5", "german", target);
\r
690 confirmEqual("test de_US 6", actualReturn[0], de);
\r
692 actualReturn[0] = null;
\r
693 target = service.get(de_US, LocaleKey.KIND_ANY, actualReturn);
\r
694 confirmEqual("test de_US 7", actualReturn[0], de);
\r
696 actualReturn[0] = null;
\r
697 target = service.get(de_US, 1234, actualReturn);
\r
698 confirmEqual("test de_US 8", "german", target);
\r
699 confirmEqual("test de_US 9", actualReturn[0], de);
\r
701 service.registerObject("one/de_US", de_US, 1);
\r
702 service.registerObject("two/de_US", de_US, 2);
\r
704 target = service.get(de_US, 1);
\r
705 confirmEqual("test de_US kind 1", "one/de_US", target);
\r
707 target = service.get(de_US, 2);
\r
708 confirmEqual("test de_US kind 2", "two/de_US", target);
\r
710 target = service.get(de_US);
\r
711 confirmEqual("test de_US kind 3", "german", target);
\r
713 LocaleKey lkey = LocaleKey.createWithCanonicalFallback("en", null, 1234);
\r
714 logln("lkey prefix: " + lkey.prefix());
\r
715 logln("lkey descriptor: " + lkey.currentDescriptor());
\r
716 logln("lkey current locale: " + lkey.currentLocale());
\r
719 logln("lkey descriptor 2: " + lkey.currentDescriptor());
\r
722 logln("lkey descriptor 3: " + lkey.currentDescriptor());
\r
724 target = service.get("za_PPP");
\r
725 confirmEqual("test zappp", "root", target);
\r
727 ULocale loc = ULocale.getDefault();
\r
728 ULocale.setDefault(ULocale.JAPANESE);
\r
729 target = service.get("za_PPP");
\r
730 confirmEqual("test with ja locale", "japanese", target);
\r
732 Set ids = service.getVisibleIDs();
\r
733 for (Iterator iter = ids.iterator(); iter.hasNext();) {
\r
734 logln("id: " + iter.next());
\r
737 ULocale.setDefault(loc);
\r
738 ids = service.getVisibleIDs();
\r
739 for (Iterator iter = ids.iterator(); iter.hasNext();) {
\r
740 logln("id: " + iter.next());
\r
743 target = service.get("za_PPP");
\r
744 confirmEqual("test with en locale", "root", target);
\r
746 ULocale[] locales = service.getAvailableULocales();
\r
747 confirmIdentical("test available locales", locales.length, 6);
\r
748 logln("locales: ");
\r
749 for (int i = 0; i < locales.length; ++i) {
\r
750 log("\n [" + i + "] " + locales[i]);
\r
754 service.registerFactory(new ICUResourceBundleFactory());
\r
755 target = service.get(ULocale.JAPAN);
\r
759 List factories = service.factories();
\r
760 Iterator iter = factories.iterator();
\r
761 while (iter.hasNext()) {
\r
762 logln("[" + n++ + "] " + iter.next());
\r
766 // list only the english display names for es, in reverse order
\r
767 // since we're using locale keys, we should get all and only the es locales
\r
768 // hmmm, the default toString function doesn't print in sorted order for TreeMap
\r
770 SortedMap map = service.getDisplayNames(ULocale.US,
\r
772 public int compare(Object lhs, Object rhs) {
\r
773 return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs);
\r
778 logln("es display names in reverse order " + map);
\r
782 public void TestWrapFactory() {
\r
783 final String greeting = "Hello There";
\r
784 final String greetingID = "greeting";
\r
786 ICUService service = new ICUService("wrap");
\r
787 service.registerObject(greeting, greetingID);
\r
789 logln("test one: " + service.get(greetingID));
\r
791 class WrapFactory implements Factory {
\r
792 public Object create(Key key, ICUService serviceArg) {
\r
793 if (key.currentID().equals(greetingID)) {
\r
794 Object previous = serviceArg.getKey(key, null, this);
\r
795 return "A different greeting: \"" + previous + "\"";
\r
800 public void updateVisibleIDs(Map result) {
\r
801 result.put("greeting", this);
\r
804 public String getDisplayName(String id, ULocale locale) {
\r
805 return "wrap '" + id + "'";
\r
808 service.registerFactory(new WrapFactory());
\r
810 confirmEqual("wrap test: ", service.get(greetingID), "A different greeting: \"" + greeting + "\"");
\r
813 // misc coverage tests
\r
814 public void TestCoverage() {
\r
816 Key key = new Key("foobar");
\r
817 logln("ID: " + key.id());
\r
818 logln("canonicalID: " + key.canonicalID());
\r
819 logln("currentID: " + key.currentID());
\r
820 logln("has fallback: " + key.fallback());
\r
823 Object obj = new Object();
\r
824 SimpleFactory sf = new SimpleFactory(obj, "object");
\r
826 sf = new SimpleFactory(null, null);
\r
827 errln("didn't throw exception");
\r
829 catch (IllegalArgumentException e) {
\r
830 logln("OK: " + e.getMessage());
\r
832 catch (Exception e) {
\r
833 errln("threw wrong exception" + e);
\r
835 logln(sf.getDisplayName("object", null));
\r
838 ICUService service = new ICUService();
\r
839 service.registerFactory(sf);
\r
842 service.get(null, null);
\r
843 errln("didn't throw exception");
\r
845 catch (NullPointerException e) {
\r
846 logln("OK: " + e.getMessage());
\r
849 catch (Exception e) {
\r
850 errln("threw wrong exception" + e);
\r
854 service.registerFactory(null);
\r
855 errln("didn't throw exception");
\r
857 catch (NullPointerException e) {
\r
858 logln("OK: " + e.getMessage());
\r
860 catch (Exception e) {
\r
861 errln("threw wrong exception" + e);
\r
865 service.unregisterFactory(null);
\r
866 errln("didn't throw exception");
\r
868 catch (NullPointerException e) {
\r
869 logln("OK: " + e.getMessage());
\r
871 catch (Exception e) {
\r
872 errln("threw wrong exception" + e);
\r
875 logln("object is: " + service.get("object"));
\r
877 logln("stats: " + service.stats());
\r
881 ICURWLock rwlock = new ICURWLock();
\r
882 rwlock.acquireRead();
\r
883 rwlock.releaseRead();
\r
885 rwlock.acquireWrite();
\r
886 rwlock.releaseWrite();
\r
887 logln("stats: " + rwlock.getStats());
\r
888 logln("stats: " + rwlock.clearStats());
\r
889 rwlock.acquireRead();
\r
890 rwlock.releaseRead();
\r
891 rwlock.acquireWrite();
\r
892 rwlock.releaseWrite();
\r
893 logln("stats: " + rwlock.getStats());
\r
896 rwlock.releaseRead();
\r
897 errln("no error thrown");
\r
899 catch (IllegalStateException e) {
\r
900 logln("OK: " + e.getMessage());
\r
904 rwlock.releaseWrite();
\r
905 errln("no error thrown");
\r
907 catch (IllegalStateException e) {
\r
908 logln("OK: " + e.getMessage());
\r
911 // ICULocaleService
\r
915 // LocaleKey lkey = LocaleKey.create("en_US", "ja_JP");
\r
916 // lkey = LocaleKey.create(null, null);
\r
917 LocaleKey lkey = LocaleKey.createWithCanonicalFallback("en_US", "ja_JP");
\r
918 logln("lkey: " + lkey);
\r
920 lkey = LocaleKey.createWithCanonicalFallback(null, null);
\r
921 logln("lkey from null,null: " + lkey);
\r
923 // LocaleKeyFactory
\r
924 LocaleKeyFactory lkf = new LKFSubclass(false);
\r
925 logln("lkf: " + lkf);
\r
926 logln("obj: " + lkf.create(lkey, null));
\r
927 logln(lkf.getDisplayName("foo", null));
\r
928 logln(lkf.getDisplayName("bar", null));
\r
929 lkf.updateVisibleIDs(new HashMap());
\r
931 LocaleKeyFactory invisibleLKF = new LKFSubclass(false);
\r
932 logln("obj: " + invisibleLKF.create(lkey, null));
\r
933 logln(invisibleLKF.getDisplayName("foo", null));
\r
934 logln(invisibleLKF.getDisplayName("bar", null));
\r
935 invisibleLKF.updateVisibleIDs(new HashMap());
\r
937 // ResourceBundleFactory
\r
938 ICUResourceBundleFactory rbf = new ICUResourceBundleFactory();
\r
939 logln("RB: " + rbf.create(lkey, null));
\r
942 ICUNotifier nf = new ICUNSubclass();
\r
944 nf.addListener(null);
\r
945 errln("added null listener");
\r
947 catch (NullPointerException e) {
\r
948 logln(e.getMessage());
\r
950 catch (Exception e) {
\r
951 errln("got wrong exception");
\r
955 nf.addListener(new WrongListener());
\r
956 errln("added wrong listener");
\r
958 catch (IllegalStateException e) {
\r
959 logln(e.getMessage());
\r
961 catch (Exception e) {
\r
962 errln("got wrong exception");
\r
966 nf.removeListener(null);
\r
967 errln("removed null listener");
\r
969 catch (NullPointerException e) {
\r
970 logln(e.getMessage());
\r
972 catch (Exception e) {
\r
973 errln("got wrong exception");
\r
976 nf.removeListener(new MyListener());
\r
977 nf.notifyChanged();
\r
978 nf.addListener(new MyListener());
\r
979 nf.removeListener(new MyListener());
\r
982 static class MyListener implements EventListener {
\r
985 static class WrongListener implements EventListener {
\r
988 static class ICUNSubclass extends ICUNotifier {
\r
989 public boolean acceptsListener(EventListener l) {
\r
990 return l instanceof MyListener;
\r
993 // not used, just needed to implement abstract base
\r
994 public void notifyListener(EventListener l) {
\r
998 static class LKFSubclass extends LocaleKeyFactory {
\r
999 LKFSubclass(boolean visible) {
\r
1000 super(visible ? VISIBLE : INVISIBLE);
\r
1003 protected Set getSupportedIDs() {
\r
1004 return Collections.EMPTY_SET;
\r