1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/*
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2003-2014, International Business Machines Corporation and    *
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.                                                *
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.collator;
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Arrays;
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Collections;
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.HashMap;
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.HashSet;
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Iterator;
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Map;
20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.MissingResourceException;
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Set;
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
23f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test;
24f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk;
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Collator;
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Collator.CollatorFactory;
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.ULocale;
29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class CollationServiceTest extends TestFmwk {
31f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestRegister() {
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // register a singleton
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator frcol = Collator.getInstance(ULocale.FRANCE);
35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator uscol = Collator.getInstance(ULocale.US);
36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        { // try override en_US collator
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Object key = Collator.registerInstance(frcol, ULocale.US);
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator ncol = Collator.getInstance(ULocale.US);
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!frcol.equals(ncol)) {
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("register of french collator for en_US failed");
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // coverage
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator test = Collator.getInstance(ULocale.GERMANY); // CollatorFactory.handleCreate
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!test.getLocale(ULocale.VALID_LOCALE).equals(ULocale.GERMAN)) {
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Collation from Germany is really " + test.getLocale(ULocale.VALID_LOCALE));
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!Collator.unregister(key)) {
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("failed to unregister french collator");
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ncol = Collator.getInstance(ULocale.US);
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!uscol.equals(ncol)) {
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("collator after unregister does not match original");
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale fu_FU = new ULocale("fu_FU_FOO");
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        { // try create collator for new locale
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator fucol = Collator.getInstance(fu_FU);
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Object key = Collator.registerInstance(frcol, fu_FU);
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator ncol = Collator.getInstance(fu_FU);
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!frcol.equals(ncol)) {
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("register of fr collator for fu_FU failed");
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale[] locales = Collator.getAvailableULocales();
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            boolean found = false;
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < locales.length; ++i) {
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (locales[i].equals(fu_FU)) {
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    found = true;
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    break;
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!found) {
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("new locale fu_FU not reported as supported locale");
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try{
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String name = Collator.getDisplayName(fu_FU);
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!"fu (FU, FOO)".equals(name)
83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        && !"fu_FU_FOO".equals(name) /* no LocaleDisplayNamesImpl */) {
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("found " + name + " for fu_FU");
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }catch(MissingResourceException ex){
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                warnln("Could not load locale data.");
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try{
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String name = Collator.getDisplayName(fu_FU, fu_FU);
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!"fu (FU, FOO)".equals(name)
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        && !"fu_FU_FOO".equals(name) /* no LocaleDisplayNamesImpl */) {
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("found " + name + " for fu_FU");
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }catch(MissingResourceException ex){
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                warnln("Could not load locale data.");
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!Collator.unregister(key)) {
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("failed to unregister french collator");
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ncol = Collator.getInstance(fu_FU);
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!fucol.equals(ncol)) {
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("collator after unregister does not match original fu_FU");
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // coverage after return to default
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale[] locales = Collator.getAvailableULocales();
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < locales.length; ++i) {
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (locales[i].equals(fu_FU)) {
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("new locale fu_FU not reported as supported locale");
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    break;
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator ncol = Collator.getInstance(ULocale.US);
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!ncol.getLocale(ULocale.VALID_LOCALE).equals(ULocale.US)) {
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Collation from US is really " + ncol.getLocale(ULocale.VALID_LOCALE));
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
126f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestRegisterFactory() {
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class CollatorInfo {
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale locale;
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator collator;
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Map displayNames; // locale -> string
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            CollatorInfo(ULocale locale, Collator collator, Map displayNames) {
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                this.locale = locale;
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                this.collator = collator;
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                this.displayNames = displayNames;
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String getDisplayName(ULocale displayLocale) {
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String name = null;
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (displayNames != null) {
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    name = (String)displayNames.get(displayLocale);
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (name == null) {
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    name = locale.getDisplayName(displayLocale);
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return name;
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class TestFactory extends CollatorFactory {
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private Map map;
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private Set ids;
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            TestFactory(CollatorInfo[] info) {
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                map = new HashMap();
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int i = 0; i < info.length; ++i) {
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    CollatorInfo ci = info[i];
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    map.put(ci.locale, ci);
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public Collator createCollator(ULocale loc) {
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                CollatorInfo ci = (CollatorInfo)map.get(loc);
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (ci != null) {
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return ci.collator;
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return null;
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public String getDisplayName(ULocale objectLocale, ULocale displayLocale) {
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                CollatorInfo ci = (CollatorInfo)map.get(objectLocale);
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (ci != null) {
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return ci.getDisplayName(displayLocale);
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return null;
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public Set getSupportedLocaleIDs() {
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (ids == null) {
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    HashSet set = new HashSet();
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    Iterator iter = map.keySet().iterator();
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    while (iter.hasNext()) {
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        ULocale locale = (ULocale)iter.next();
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        String id = locale.toString();
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        set.add(id);
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    ids = Collections.unmodifiableSet(set);
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return ids;
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class TestFactoryWrapper extends CollatorFactory {
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            CollatorFactory delegate;
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            TestFactoryWrapper(CollatorFactory delegate) {
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                this.delegate = delegate;
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public Collator createCollator(ULocale loc) {
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return delegate.createCollator(loc);
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // use CollatorFactory getDisplayName(ULocale, ULocale) for coverage
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public Set getSupportedLocaleIDs() {
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return delegate.getSupportedLocaleIDs();
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale fu_FU = new ULocale("fu_FU");
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale fu_FU_FOO = new ULocale("fu_FU_FOO");
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Map fuFUNames = new HashMap();
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        fuFUNames.put(fu_FU, "ze leetle bunny Fu-Fu");
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        fuFUNames.put(fu_FU_FOO, "zee leetel bunny Foo-Foo");
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        fuFUNames.put(ULocale.US, "little bunny Foo Foo");
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator frcol = Collator.getInstance(ULocale.FRANCE);
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin       /* Collator uscol = */Collator.getInstance(ULocale.US);
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator gecol = Collator.getInstance(ULocale.GERMANY);
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator jpcol = Collator.getInstance(ULocale.JAPAN);
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator fucol = Collator.getInstance(fu_FU);
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollatorInfo[] info = {
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new CollatorInfo(ULocale.US, frcol, null),
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new CollatorInfo(ULocale.FRANCE, gecol, null),
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new CollatorInfo(fu_FU, jpcol, fuFUNames),
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        TestFactory factory = null;
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try{
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            factory = new TestFactory(info);
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }catch(MissingResourceException ex){
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            warnln("Could not load locale data.");
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // coverage
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            TestFactoryWrapper wrapper = new TestFactoryWrapper(factory); // in java, gc lets us easily multiply reference!
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Object key = Collator.registerFactory(wrapper);
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String name = null;
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try{
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                name = Collator.getDisplayName(fu_FU, fu_FU_FOO);
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }catch(MissingResourceException ex){
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                warnln("Could not load locale data.");
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("*** default name: " + name);
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator.unregister(key);
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale bar_BAR = new ULocale("bar_BAR");
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator col = Collator.getInstance(bar_BAR);
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale valid = col.getLocale(ULocale.VALID_LOCALE);
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String validName = valid.getName();
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if(validName.length() != 0 && !validName.equals("root")) {
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Collation from bar_BAR is really \"" + validName + "\" but should be root");
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int n1 = checkAvailable("before registerFactory");
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Object key = Collator.registerFactory(factory);
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int n2 = checkAvailable("after registerFactory");
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator ncol = Collator.getInstance(ULocale.US);
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!frcol.equals(ncol)) {
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("frcoll for en_US failed");
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ncol = Collator.getInstance(fu_FU_FOO);
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!jpcol.equals(ncol)) {
274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("jpcol for fu_FU_FOO failed, got: " + ncol);
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale[] locales = Collator.getAvailableULocales();
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            boolean found = false;
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < locales.length; ++i) {
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (locales[i].equals(fu_FU)) {
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    found = true;
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    break;
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!found) {
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("new locale fu_FU not reported as supported locale");
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String name = Collator.getDisplayName(fu_FU);
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!"little bunny Foo Foo".equals(name)) {
291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("found " + name + " for fu_FU");
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            name = Collator.getDisplayName(fu_FU, fu_FU_FOO);
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!"zee leetel bunny Foo-Foo".equals(name)) {
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("found " + name + " for fu_FU in fu_FU_FOO");
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!Collator.unregister(key)) {
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("failed to unregister factory");
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int n3 = checkAvailable("after unregister");
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertTrue("register increases count", n2>n1);
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertTrue("unregister restores count", n3==n1);
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ncol = Collator.getInstance(fu_FU);
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!fucol.equals(ncol)) {
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("collator after unregister does not match original fu_FU");
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Check the integrity of the results of Collator.getAvailableULocales().
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Return the number of items returned.
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    int checkAvailable(String msg) {
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale locs[] = Collator.getAvailableLocales();
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertTrue("getAvailableLocales != null", locs!=null)) return -1;
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkArray(msg, locs, null);
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale ulocs[] = Collator.getAvailableULocales();
323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertTrue("getAvailableULocales != null", ulocs!=null)) return -1;
324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkArray(msg, ulocs, null);
325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // This is not true because since ULocale objects with script code cannot be
326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // converted to Locale objects
327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //assertTrue("getAvailableLocales().length == getAvailableULocales().length", locs.length == ulocs.length);
328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return locs.length;
329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final String KW[] = {
332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "collation"
333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final String KWVAL[] = {
336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "phonebook",
337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "stroke"
338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
340f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSeparateTrees() {
342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String kw[] = Collator.getKeywords();
343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertTrue("getKeywords != null", kw!=null)) return;
344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkArray("getKeywords", kw, KW);
345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String kwval[] = Collator.getKeywordValues(KW[0]);
347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertTrue("getKeywordValues != null", kwval!=null)) return;
348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkArray("getKeywordValues", kwval, KWVAL);
349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean isAvailable[] = new boolean[1];
351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale equiv = Collator.getFunctionalEquivalent(KW[0],
352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                         new ULocale("de"),
353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                         isAvailable);
354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (assertTrue("getFunctionalEquivalent(de)!=null", equiv!=null)) {
355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getFunctionalEquivalent(de)", "root", equiv.toString());
356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertTrue("getFunctionalEquivalent(de).isAvailable==true",
358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                   isAvailable[0] == true);
359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        equiv = Collator.getFunctionalEquivalent(KW[0],
361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                 new ULocale("de_DE"),
362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                 isAvailable);
363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (assertTrue("getFunctionalEquivalent(de_DE)!=null", equiv!=null)) {
364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getFunctionalEquivalent(de_DE)", "root", equiv.toString());
365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertTrue("getFunctionalEquivalent(de_DE).isAvailable==false",
367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                   isAvailable[0] == false);
368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        equiv = Collator.getFunctionalEquivalent(KW[0], new ULocale("zh_Hans"));
370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (assertTrue("getFunctionalEquivalent(zh_Hans)!=null", equiv!=null)) {
371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getFunctionalEquivalent(zh_Hans)", "zh", equiv.toString());
372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
375f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetFunctionalEquivalent() {
377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String kw[] = Collator.getKeywords();
378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String DATA[] = {
379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv", "sv", "t",
380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=direct", "sv", "t",
381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=traditional", "sv", "t",
382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=gb2312han", "sv", "t",
383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=stroke", "sv", "t",
384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=pinyin", "sv", "t",
385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=standard", "sv@collation=standard", "t",
386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=reformed", "sv", "t",
387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv@collation=big5han", "sv", "t",
388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI", "sv", "f",
389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=direct", "sv", "f",
390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=traditional", "sv", "f",
391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=gb2312han", "sv", "f",
392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=stroke", "sv", "f",
393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=pinyin", "sv", "f",
394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=standard", "sv@collation=standard", "f",
395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=reformed", "sv", "f",
396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "sv_FI@collation=big5han", "sv", "f",
397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl", "root", "t",
398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl@collation=direct", "root", "t",
399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE", "root", "f",
400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=direct", "root", "f",
401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=traditional", "root", "f",
402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=gb2312han", "root", "f",
403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=stroke", "root", "f",
404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=pinyin", "root", "f",
405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=big5han", "root", "f",
406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "nl_BE@collation=phonebook", "root", "f",
407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          "en_US_VALLEYGIRL","root","f"
408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        };
409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final int DATA_COUNT=(DATA.length/3);
410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for(int i=0;i<DATA_COUNT;i++) {
412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            boolean isAvailable[] = new boolean[1];
413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale input = new ULocale(DATA[(i*3)+0]);
414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale expect = new ULocale(DATA[(i*3)+1]);
415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            boolean expectAvailable = DATA[(i*3)+2].equals("t");
416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale actual = Collator.getFunctionalEquivalent(kw[0],input,isAvailable);
417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if(!actual.equals(expect) || (expectAvailable!=isAvailable[0])) {
418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("#" + i + ": Collator.getFunctionalEquivalent(" + input + ")=" + actual + ", avail " + new Boolean(isAvailable[0]) + ", " +
419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        "expected " + expect + " avail " + new Boolean(expectAvailable));
420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                logln("#" + i + ": Collator.getFunctionalEquivalent(" + input + ")=" + actual + ", avail " + new Boolean(isAvailable[0]));
422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//    public void PrintFunctionalEquivalentList() {
427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        ULocale[] locales = Collator.getAvailableULocales();
428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        String[] keywords = Collator.getKeywords();
429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        logln("Collation");
430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        logln("Possible keyword=values pairs:");
431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        for (int i = 0; i < Collator.getKeywords().length; ++i) {
432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                String[] values = Collator.getKeywordValues(keywords[i]);
433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                for (int j = 0; j < values.length; ++j) {
434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                        System.out.println(keywords[i] + "=" + values[j]);
435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                }
436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        }
437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        logln("Differing Collators:");
438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        boolean[] isAvailable = {true};
439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        for (int k = 0; k < locales.length; ++k) {
440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                logln(locales[k].getDisplayName(ULocale.ENGLISH) + " [" +locales[k] + "]");
441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                for (int i = 0; i < Collator.getKeywords().length; ++i) {
442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                        ULocale base = Collator.getFunctionalEquivalent(keywords[i],locales[k]);
443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                        String[] values = Collator.getKeywordValues(keywords[i]);
444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                        for (int j = 0; j < Collator.getKeywordValues(keywords[i]).length;++j) {
445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                                ULocale other = Collator.getFunctionalEquivalent(keywords[i],
446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                                        new ULocale(locales[k] + "@" + keywords[i] + "=" + values[j]),
447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                                        isAvailable);
448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                                if (isAvailable[0] && !other.equals(base)) {
449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                                        logln("\t" + keywords[i] + "=" + values[j] + ";\t" + base + ";\t" + other);
450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                                }
451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                        }
452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//                }
453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        }
454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//    }
455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static boolean arrayContains(String[] array, String s) {
457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < array.length; ++i) {
458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (s.equals(array[i])) {
459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return true;
460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return false;
463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
465f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetKeywordValues(){
467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String[][] PREFERRED = {
468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"und",             "standard", "eor", "search"},
469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"en_US",           "standard", "eor", "search"},
470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"en_029",          "standard", "eor", "search"},
471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"de_DE",           "standard", "phonebook", "search", "eor"},
472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"de_Latn_DE",      "standard", "phonebook", "search", "eor"},
473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zh",              "pinyin", "stroke", "eor", "search", "standard"},
474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zh_Hans",         "pinyin", "stroke", "eor", "search", "standard"},
475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zh_CN",           "pinyin", "stroke", "eor", "search", "standard"},
476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zh_Hant",         "stroke", "pinyin", "eor", "search", "standard"},
477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zh_TW",           "stroke", "pinyin", "eor", "search", "standard"},
478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zh__PINYIN",      "pinyin", "stroke", "eor", "search", "standard"},
479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"es_ES",           "standard", "search", "traditional", "eor"},
480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"es__TRADITIONAL", "traditional", "search", "standard", "eor"},
481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"und@collation=phonebook",     "standard", "eor", "search"},
482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"de_DE@collation=big5han",     "standard", "phonebook", "search", "eor"},
483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {"zzz@collation=xxx",           "standard", "eor", "search"},
484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < PREFERRED.length; i++) {
487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String locale = PREFERRED[i][0];
488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale loc = new ULocale(locale);
489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String[] expected = PREFERRED[i];
490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String[] pref = Collator.getKeywordValuesForLocale("collation", loc, true);
491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int j = 1; j < expected.length; ++j) {
492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!arrayContains(pref, expected[j])) {
493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Keyword value " + expected[j] + " missing for locale: " + locale);
494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // Collator.getKeywordValues return the same contents for both commonlyUsed
498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // true and false.
499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String[] all = Collator.getKeywordValuesForLocale("collation", loc, false);
500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            boolean matchAll = false;
501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (pref.length == all.length) {
502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                matchAll = true;
503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int j = 0; j < pref.length; j++) {
504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    boolean foundMatch = false;
505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    for (int k = 0; k < all.length; k++) {
506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if (pref[j].equals(all[k])) {
507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            foundMatch = true;
508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            break;
509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (!foundMatch) {
512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        matchAll = false;
513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        break;
514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!matchAll) {
518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("FAIL: All values for locale " + loc
519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + " got:" + Arrays.toString(all) + " expected:" + Arrays.toString(pref));
520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
524