1/*
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @library /java/text/testlib
27 * @summary test Collation API
28 * @modules jdk.localedata
29 */
30/*
31(C) Copyright Taligent, Inc. 1996 - All Rights Reserved
32(C) Copyright IBM Corp. 1996 - All Rights Reserved
33
34  The original version of this source code and documentation is copyrighted and
35owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These materials are
36provided under terms of a License Agreement between Taligent and Sun. This
37technology is protected by multiple US and International patents. This notice and
38attribution to Taligent may not be removed.
39  Taligent is a registered trademark of Taligent, Inc.
40*/
41
42import java.util.Locale;
43import java.text.Collator;
44import java.text.RuleBasedCollator;
45import java.text.CollationKey;
46import java.text.CollationElementIterator;
47
48public class APITest extends CollatorTest {
49
50    public static void main(String[] args) throws Exception {
51        new APITest().run(args);
52    }
53
54    final void doAssert(boolean condition, String message)
55    {
56        if (!condition) {
57            err("ERROR: ");
58            errln(message);
59        }
60    }
61
62    public final void TestProperty( )
63    {
64        Collator col = null;
65        try {
66            col = Collator.getInstance(Locale.ROOT);
67            logln("The property tests begin : ");
68            logln("Test ctors : ");
69            doAssert(col.compare("ab", "abc") < 0, "ab < abc comparison failed");
70            doAssert(col.compare("ab", "AB") < 0, "ab < AB comparison failed");
71            doAssert(col.compare("black-bird", "blackbird") > 0, "black-bird > blackbird comparison failed");
72            doAssert(col.compare("black bird", "black-bird") < 0, "black bird < black-bird comparison failed");
73            doAssert(col.compare("Hello", "hello") > 0, "Hello > hello comparison failed");
74
75            logln("Test ctors ends.");
76            logln("testing Collator.getStrength() method ...");
77            doAssert(col.getStrength() == Collator.TERTIARY, "collation object has the wrong strength");
78            doAssert(col.getStrength() != Collator.PRIMARY, "collation object's strength is primary difference");
79
80            logln("testing Collator.setStrength() method ...");
81            col.setStrength(Collator.SECONDARY);
82            doAssert(col.getStrength() != Collator.TERTIARY, "collation object's strength is secondary difference");
83            doAssert(col.getStrength() != Collator.PRIMARY, "collation object's strength is primary difference");
84            doAssert(col.getStrength() == Collator.SECONDARY, "collation object has the wrong strength");
85
86            logln("testing Collator.setDecomposition() method ...");
87            col.setDecomposition(Collator.NO_DECOMPOSITION);
88            doAssert(col.getDecomposition() != Collator.FULL_DECOMPOSITION, "collation object's strength is secondary difference");
89            doAssert(col.getDecomposition() != Collator.CANONICAL_DECOMPOSITION, "collation object's strength is primary difference");
90            doAssert(col.getDecomposition() == Collator.NO_DECOMPOSITION, "collation object has the wrong strength");
91        } catch (Exception foo) {
92            errln("Error : " + foo.getMessage());
93            errln("Default Collator creation failed.");
94        }
95        logln("Default collation property test ended.");
96        logln("Collator.getRules() testing ...");
97        doAssert(((RuleBasedCollator)col).getRules().length() != 0, "getRules() result incorrect" );
98        logln("getRules tests end.");
99        try {
100            col = Collator.getInstance(Locale.FRENCH);
101            col.setStrength(Collator.PRIMARY);
102            logln("testing Collator.getStrength() method again ...");
103            doAssert(col.getStrength() != Collator.TERTIARY, "collation object has the wrong strength");
104            doAssert(col.getStrength() == Collator.PRIMARY, "collation object's strength is not primary difference");
105
106            logln("testing French Collator.setStrength() method ...");
107            col.setStrength(Collator.TERTIARY);
108            doAssert(col.getStrength() == Collator.TERTIARY, "collation object's strength is not tertiary difference");
109            doAssert(col.getStrength() != Collator.PRIMARY, "collation object's strength is primary difference");
110            doAssert(col.getStrength() != Collator.SECONDARY, "collation object's strength is secondary difference");
111
112        } catch (Exception bar) {
113            errln("Error :  " + bar.getMessage());
114            errln("Creating French collation failed.");
115        }
116
117        logln("Create junk collation: ");
118        Locale abcd = new Locale("ab", "CD", "");
119        Collator junk = null;
120        try {
121            junk = Collator.getInstance(abcd);
122        } catch (Exception err) {
123            errln("Error : " + err.getMessage());
124            errln("Junk collation creation failed, should at least return the collator for the base bundle.");
125        }
126        try {
127            col = Collator.getInstance(Locale.ROOT);
128            doAssert(col.equals(junk), "The base bundle's collation should be returned.");
129        } catch (Exception exc) {
130            errln("Error : " + exc.getMessage());
131            errln("Default collation comparison, caching not working.");
132        }
133
134        logln("Collator property test ended.");
135    }
136
137    public final void TestHashCode( )
138    {
139        logln("hashCode tests begin.");
140        Collator col1 = null;
141        try {
142            col1 = Collator.getInstance(Locale.ROOT);
143        } catch (Exception foo) {
144            errln("Error : " + foo.getMessage());
145            errln("Default collation creation failed.");
146        }
147        Collator col2 = null;
148        Locale dk = new Locale("da", "DK", "");
149        try {
150            col2 = Collator.getInstance(dk);
151        } catch (Exception bar) {
152            errln("Error : " + bar.getMessage());
153            errln("Danish collation creation failed.");
154            return;
155        }
156        Collator col3 = null;
157        try {
158            col3 = Collator.getInstance(Locale.ROOT);
159        } catch (Exception err) {
160            errln("Error : " + err.getMessage());
161            errln("2nd default collation creation failed.");
162        }
163        logln("Collator.hashCode() testing ...");
164
165        if (col1 != null) {
166            doAssert(col1.hashCode() != col2.hashCode(), "Hash test1 result incorrect");
167            if (col3 != null) {
168                doAssert(col1.hashCode() == col3.hashCode(), "Hash result not equal");
169            }
170        }
171
172        logln("hashCode tests end.");
173    }
174
175    //----------------------------------------------------------------------------
176    // ctor -- Tests the constructor methods
177    //
178    public final void TestCollationKey( )
179    {
180        logln("testing CollationKey begins...");
181        Collator col = null;
182        try {
183            col = Collator.getInstance(Locale.ROOT);
184        } catch (Exception foo) {
185            errln("Error : " + foo.getMessage());
186            errln("Default collation creation failed.");
187        }
188        if (col == null) {
189            return;
190        }
191
192        String test1 = "Abcda", test2 = "abcda";
193        logln("Use tertiary comparison level testing ....");
194        CollationKey sortk1 = col.getCollationKey(test1);
195        CollationKey sortk2 = col.getCollationKey(test2);
196        doAssert(sortk1.compareTo(sortk2) > 0,
197                    "Result should be \"Abcda\" >>> \"abcda\"");
198        CollationKey sortk3 = sortk2;
199        CollationKey sortkNew = sortk1;
200        doAssert(sortk1 != sortk2, "The sort keys should be different");
201        doAssert(sortk1.hashCode() != sortk2.hashCode(), "sort key hashCode() failed");
202        doAssert(sortk2.compareTo(sortk3) == 0, "The sort keys should be the same");
203        doAssert(sortk1 == sortkNew, "The sort keys assignment failed");
204        doAssert(sortk1.hashCode() == sortkNew.hashCode(), "sort key hashCode() failed");
205        doAssert(sortkNew != sortk3, "The sort keys should be different");
206        doAssert(sortk1.compareTo(sortk3) > 0, "Result should be \"Abcda\" >>> \"abcda\"");
207        doAssert(sortk2.compareTo(sortk3) == 0, "Result should be \"abcda\" == \"abcda\"");
208        long    cnt1, cnt2;
209        byte byteArray1[] = sortk1.toByteArray();
210        byte byteArray2[] = sortk2.toByteArray();
211        doAssert(byteArray1 != null && byteArray2 != null, "CollationKey.toByteArray failed.");
212        logln("testing sortkey ends...");
213    }
214    //----------------------------------------------------------------------------
215    // ctor -- Tests the constructor methods
216    //
217    public final void TestElemIter( )
218    {
219        logln("testing sortkey begins...");
220        Collator col = null;
221        try {
222            col = Collator.getInstance();
223        } catch (Exception foo) {
224            errln("Error : " + foo.getMessage());
225            errln("Default collation creation failed.");
226        }
227        RuleBasedCollator rbCol;
228        if (col instanceof RuleBasedCollator) {
229            rbCol = (RuleBasedCollator) col;
230        } else {
231            return;
232        }
233        String testString1 = "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?";
234        String testString2 = "Xf ile What subset of all possible test cases has the lowest probability of detecting the least errors?";
235        logln("Constructors and comparison testing....");
236        CollationElementIterator iterator1 = rbCol.getCollationElementIterator(testString1);
237        CollationElementIterator iterator2 = rbCol.getCollationElementIterator(testString1);
238        CollationElementIterator iterator3 = rbCol.getCollationElementIterator(testString2);
239        int order1, order2, order3;
240        order1 = iterator1.next();
241        order2 = iterator2.next();
242        doAssert(order1 == order2, "The order result should be the same");
243
244        order3 = iterator3.next();
245        doAssert(CollationElementIterator.primaryOrder(order1)
246                     == CollationElementIterator.primaryOrder(order3),
247                 "The primary orders should be the same");
248        doAssert(CollationElementIterator.secondaryOrder(order1)
249                     == CollationElementIterator.secondaryOrder(order3),
250                 "The secondary orders should be the same");
251        doAssert(CollationElementIterator.tertiaryOrder(order1)
252                     == CollationElementIterator.tertiaryOrder(order3),
253                 "The tertiary orders should be the same");
254
255        order1 = iterator1.next();
256        order3 = iterator3.next();
257        doAssert(CollationElementIterator.primaryOrder(order1)
258                     == CollationElementIterator.primaryOrder(order3),
259                 "The primary orders should be identical");
260        doAssert(CollationElementIterator.tertiaryOrder(order1)
261                     != CollationElementIterator.tertiaryOrder(order3),
262                 "The tertiary orders should be different");
263
264        order1 = iterator1.next();
265        order3 = iterator3.next();
266        doAssert(CollationElementIterator.secondaryOrder(order1)
267                     != CollationElementIterator.secondaryOrder(order3),
268                 "The secondary orders should be different");
269        doAssert(order1 != CollationElementIterator.NULLORDER,
270                 "Unexpected end of iterator reached");
271
272        iterator1.reset();
273        iterator2.reset();
274        iterator3.reset();
275        order1 = iterator1.next();
276        order2 = iterator2.next();
277        doAssert(order1 == order2, "The order result should be the same");
278
279        order3 = iterator3.next();
280        doAssert(CollationElementIterator.primaryOrder(order1)
281                     == CollationElementIterator.primaryOrder(order3),
282                 "The orders should be the same");
283        doAssert(CollationElementIterator.secondaryOrder(order1)
284                     == CollationElementIterator.secondaryOrder(order3),
285                 "The orders should be the same");
286        doAssert(CollationElementIterator.tertiaryOrder(order1)
287                     == CollationElementIterator.tertiaryOrder(order3),
288                 "The orders should be the same");
289
290        order1 = iterator1.next();
291        order2 = iterator2.next();
292        order3 = iterator3.next();
293        doAssert(CollationElementIterator.primaryOrder(order1)
294                     == CollationElementIterator.primaryOrder(order3),
295                 "The primary orders should be identical");
296        doAssert(CollationElementIterator.tertiaryOrder(order1)
297                     != CollationElementIterator.tertiaryOrder(order3),
298                 "The tertiary orders should be different");
299
300        order1 = iterator1.next();
301        order3 = iterator3.next();
302        doAssert(CollationElementIterator.secondaryOrder(order1)
303                     != CollationElementIterator.secondaryOrder(order3),
304                 "The secondary orders should be different");
305        doAssert(order1 != CollationElementIterator.NULLORDER, "Unexpected end of iterator reached");
306        logln("testing CollationElementIterator ends...");
307    }
308
309    public final void TestGetAll()
310    {
311        Locale[] list = Collator.getAvailableLocales();
312        for (int i = 0; i < list.length; ++i) {
313            log("Locale name: ");
314            log(list[i].toString());
315            log(" , the display name is : ");
316            logln(list[i].getDisplayName());
317        }
318    }
319}
320