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) 2002-2014, International Business Machines Corporation and
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Port From:   ICU4C v2.1 : collate/CollationRegressionTest
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Source File: $ICU4CRoot/source/test/intltest/regcoll.cpp
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin **/
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.collator;
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.text.ParseException;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.ArrayList;
20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.List;
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
23f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test;
24f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk;
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.CollationElementIterator;
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.CollationKey;
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Collator;
29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.RuleBasedCollator;
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class CollationRegressionTest extends TestFmwk {
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4048446
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // CollationElementIterator.reset() doesn't work
35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
36f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4048446() {
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String test1 = "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?";
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //final String test2 = "Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?";
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator i1 = en_us.getCollationElementIterator(test1);
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator i2 = en_us.getCollationElementIterator(test1);
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (i1 == null || i2 == null) {
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Could not create CollationElementIterator's");
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (i1.next() != CollationElementIterator.NULLORDER) {
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            //
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i1.reset();
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEqual(i1, i2);
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    void assertEqual(CollationElementIterator i1, CollationElementIterator i2) {
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int c1, c2, count = 0;
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        do {
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c1 = i1.next();
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c2 = i2.next();
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (c1 != c2) {
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String msg = "";
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String msg1 = "    ";
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg += msg1 + count;
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg += ": strength(0x" + Integer.toHexString(c1);
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg += ") != strength(0x" + Integer.toHexString(c2);
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg += ")";
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(msg);
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                break;
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            count += 1;
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } while (c1 != CollationElementIterator.NULLORDER);
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4051866
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator -> rules -> Collator round-trip broken for expanding characters
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
83f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4051866() {
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin       String rules = "&n < o & oe ,o\u3080& oe ,\u1530 ,O& OE ,O\u3080& OE ,\u1520< p ,P";
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Build a collator containing expanding characters
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c1 = null;
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c1 = new RuleBasedCollator(rules);
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Fail to create RuleBasedCollator with rules:" + rules);
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Build another using the rules from  the first
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c2 = null;
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c2 = new RuleBasedCollator(c1.getRules());
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Fail to create RuleBasedCollator with rules:" + rules);
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Make sure they're the same
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!(c1.getRules().equals(c2.getRules())))
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Rules are not equal");
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4053636
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator thinks "black-bird" == "black"
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
117f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4053636() {
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (en_us.equals("black_bird", "black")) {
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("black-bird == black");
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4054238
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // CollationElementIterator will not work correctly if the associated
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator object's mode is changed
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
130f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4054238(/* char* par */) {
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final char[] chars3 = {0x61, 0x00FC, 0x62, 0x65, 0x63, 0x6b, 0x20, 0x47, 0x72, 0x00F6, 0x00DF, 0x65, 0x20, 0x4c, 0x00FC, 0x62, 0x63, 0x6b, 0};
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String test3 = new String(chars3);
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // NOTE: The Java code uses en_us to create the CollationElementIterators
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // but I'm pretty sure that's wrong, so I've changed this to use c.
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.NO_DECOMPOSITION);
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator i1 = c.getCollationElementIterator(test3);
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("Offset:" + i1.getOffset());
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4054734
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator::IDENTICAL documented but not implemented
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
147f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4054734(/* char* par */) {
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            //Here's the original Java:
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String[] decomp = {
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\u0001",   "<",    "\u0002",
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\u0001",   "=",    "\u0001",
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "A\u0001",  ">",    "~\u0002",      // Ensure A and ~ are not compared bitwise
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\u00C0",   "=",    "A\u0300",      // Decomp should make these equal
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            };
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.IDENTICAL);
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, decomp);
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    void compareArray(Collator c, String[] tests) {
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int expectedResult = 0;
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < tests.length; i += 3) {
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String source = tests[i];
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String comparison = tests[i + 1];
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String target = tests[i + 2];
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (comparison.equals("<")) {
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                expectedResult = -1;
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (comparison.equals(">")) {
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                expectedResult = 1;
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (comparison.equals("=")) {
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                expectedResult = 0;
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Bogus comparison string \"" + comparison + "\"");
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int compareResult = 0;
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("i = " + i);
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(source);
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(target);
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                compareResult = c.compare(source, target);
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(e.toString());
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            CollationKey sourceKey = null, targetKey = null;
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                sourceKey = c.getCollationKey(source);
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Couldn't get collationKey for source");
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                continue;
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                targetKey = c.getCollationKey(target);
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Couldn't get collationKey for target");
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                continue;
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int keyResult = sourceKey.compareTo(targetKey);
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            reportCResult( source, target, sourceKey, targetKey, compareResult, keyResult, compareResult, expectedResult );
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    void reportCResult( String source, String target, CollationKey sourceKey, CollationKey targetKey,
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                int compareResult, int keyResult, int incResult, int expectedResult ){
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (expectedResult < -1 || expectedResult > 1)
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("***** invalid call to reportCResult ****");
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean ok1 = (compareResult == expectedResult);
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean ok2 = (keyResult == expectedResult);
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean ok3 = (incResult == expectedResult);
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (ok1 && ok2 && ok3 && !isVerbose()){
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }else{
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String msg1 = ok1? "Ok: compare(\"" : "FAIL: compare(\"";
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String msg2 = "\", \"";
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String msg3 = "\") returned ";
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String msg4 = "; expected ";
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String sExpect = new String("");
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String sResult = new String("");
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sResult = CollationTest.appendCompareResult(compareResult, sResult);
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sExpect = CollationTest.appendCompareResult(expectedResult, sExpect);
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (ok1) {
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                logln(msg1 + source + msg2 + target + msg3 + sResult);
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            msg1 = ok2 ? "Ok: key(\"" : "FAIL: key(\"";
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            msg2 = "\").compareTo(key(\"";
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            msg3 = "\")) returned ";
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sResult = CollationTest.appendCompareResult(keyResult, sResult);
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (ok2) {
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                logln(msg1 + source + msg2 + target + msg3 + sResult);
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg1 = "  ";
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg2 = " vs. ";
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(msg1 + CollationTest.prettify(sourceKey) + msg2 + CollationTest.prettify(targetKey));
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            msg1 = ok3 ? "Ok: incCompare(\"" : "FAIL: incCompare(\"";
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            msg2 = "\", \"";
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            msg3 = "\") returned ";
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sResult = CollationTest.appendCompareResult(incResult, sResult);
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (ok3) {
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                logln(msg1 + source + msg2 + target + msg3 + sResult);
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4054736
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Full Decomposition mode not implemented
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
276f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4054736(/* char* par */) {
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.SECONDARY);
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.NO_DECOMPOSITION);
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String[] tests = { "\uFB4F", "\u003d", "\u05D0\u05DC" };  // Alef-Lamed vs. Alef, Lamed
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4058613
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator::createInstance() causes an ArrayIndexOutofBoundsException for Korean
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
291f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4058613(/* char* par */) {
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Creating a default collator doesn't work when Korean is the default
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // locale
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale oldDefault = Locale.getDefault();
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale.setDefault(new Locale("ko", ""));
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator c = null;
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c = Collator.getInstance(new Locale("en", "US"));
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (c == null) {
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Could not create a Korean collator");
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Locale.setDefault(oldDefault);
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Since the fix to this bug was to turn off decomposition for Korean collators,
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // ensure that's what we got
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (c.getDecomposition() != Collator.NO_DECOMPOSITION) {
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin          errln("Decomposition is not set to NO_DECOMPOSITION for Korean collator");
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale.setDefault(oldDefault);
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4059820
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // RuleBasedCollator.getRules does not return the exact pattern as input
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // for expanding character sequences
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
323f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4059820(/* char* par */) {
325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = null;
326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = "&9 < a < b , c/a < d < z";
327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = new RuleBasedCollator(rules);
329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failure building a collator.");
331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if ( c.getRules().indexOf("c/a") == -1)
335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("returned rules do not contain 'c/a'");
337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4060154
341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // MergeCollation::fixEntry broken for "& H < \u0131, \u0130, i, I"
343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
344f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4060154(/* char* par */) {
346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules ="&f < g, G < h, H < i, I < j, J & H < \u0131, \u0130, i, I";
347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = null;
349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = new RuleBasedCollator(rules);
351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            //System.out.println(e);
353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("failure building collator:" + e);
354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.NO_DECOMPOSITION);
358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] tertiary = {
360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "A",        "<",    "B",
361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "H",        "<",    "\u0131",
362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "H",        "<",    "I",
363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0131",   "<",    "\u0130",
364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0130",   "<",    "i",
365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0130",   ">",    "H",
366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tertiary);
370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] secondary = {
372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "H",        "<",    "I",
373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0131",   "=",    "\u0130",
374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.PRIMARY);
377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, secondary);
378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4062418
381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Secondary/Tertiary comparison incorrect in French Secondary
383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
384f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4062418(/* char* par */) {
386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = null;
387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = (RuleBasedCollator) Collator.getInstance(Locale.CANADA_FRENCH);
389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create collator for Locale.CANADA_FRENCH");
391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.SECONDARY);
394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] tests = {
396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "p\u00eache",    "<",    "p\u00e9ch\u00e9",    // Comparing accents from end, p\u00e9ch\u00e9 is greater
397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4065540
403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator::compare() method broken if either string contains spaces
405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
406f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4065540(/* char* par */) {
408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (en_us.compare("abcd e", "abcd f") == 0) {
410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("'abcd e' == 'abcd f'");
411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4066189
415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Unicode characters need to be recursively decomposed to get the
417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // correct result. For example,
418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // u1EB1 -> \u0103 + \u0300 -> a + \u0306 + \u0300.
419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
420f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4066189(/* char* par */) {
422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final  String test1 = "\u1EB1";
423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final  String test2 = "\u0061\u0306\u0300";
424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // NOTE: The java code used en_us to create the
426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // CollationElementIterator's. I'm pretty sure that
427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // was wrong, so I've change the code to use c1 and c2
428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c1 = (RuleBasedCollator) Collator.getInstance(Locale.US);
429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c1.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator i1 = c1.getCollationElementIterator(test1);
431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c2 = (RuleBasedCollator) Collator.getInstance(Locale.US);
433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c2.setDecomposition(Collator.NO_DECOMPOSITION);
434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator i2 = c2.getCollationElementIterator(test2);
435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEqual(i1, i2);
437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4066696
440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // French secondary collation checking at the end of compare iteration fails
442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
443f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4066696(/* char* par */) {
445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = null;
446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = (RuleBasedCollator)Collator.getInstance(Locale.CANADA_FRENCH);
448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch(Exception e) {
449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failure creating collator for Locale.CANADA_FRENCH");
450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.SECONDARY);
453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] tests = {
455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00e0",   ">",     "\u01fa",       // a-grave <  A-ring-acute
456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4076676
461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Bad canonicalization of same-class combining characters
463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
464f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4076676(/* char* par */) {
466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // These combining characters are all in the same class, so they should not
467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // be reordered, and they should compare as unequal.
468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String s1 = "\u0041\u0301\u0302\u0300";
469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String s2 = "\u0041\u0302\u0300\u0301";
470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (c.compare(s1,s2) == 0) {
475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Same-class combining chars were reordered");
476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4078588
480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // RuleBasedCollator breaks on "< a < bb" rule
482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
483f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4078588(/* char *par */) {
485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator rbc = null;
486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            rbc = new RuleBasedCollator("&9 < a < bb");
488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create RuleBasedCollator.");
490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int result = rbc.compare("a","bb");
494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (result >= 0) {
496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Compare(a,bb) returned " + result + "; expected -1");
497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4079231
501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // RuleBasedCollator::operator==(NULL) throws NullPointerException
503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
504f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4079231(/* char* par */) {
506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (en_us.equals(null)) {
509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("en_us.equals(null) returned true");
510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("en_us.equals(null) threw " + e.toString());
513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4081866
517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Combining characters in different classes not reordered properly.
519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
520f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4081866(/* char* par */) {
522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // These combining characters are all in different classes,
523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // so they should be reordered and the strings should compare as equal.
524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String s1 = "\u0041\u0300\u0316\u0327\u0315";
525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String s2 = "\u0041\u0327\u0316\u0315\u0300";
526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Now that the default collators are set to NO_DECOMPOSITION
531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // (as a result of fixing bug 4114077), we must set it explicitly
532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // when we're testing reordering behavior.  -- lwerner, 5/5/98
533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (c.compare(s1,s2) != 0) {
535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Combining chars were not reordered");
536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4087241
540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // string comparison errors in Scandinavian collators
542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
543f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4087241(/* char* par */) {
545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale da_DK = new Locale("da", "DK");
546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = null;
547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = (RuleBasedCollator) Collator.getInstance(da_DK);
549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create collator for da_DK locale");
551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.SECONDARY);
554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String tests[] = {
555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u007a",       "\u003c", "\u00E6",            // z        < ae
556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0061\u0308", "\u003c", "\u0061\u030A",      // a-umlaut < a-ring
557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0059",       "\u003c", "\u0075\u0308",      // Y        < u-umlaut
558aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4087243
563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // CollationKey takes ignorable strings into account when it shouldn't
565aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
566f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4087243(/* char* par */) {
568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String tests[] = {
571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0031\u0032\u0033", "\u003d", "\u0031\u0032\u0033\u0001"    // 1 2 3  =  1 2 3 ctrl-A
572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4092260
577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Mu/micro conflict
579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Micro symbol and greek lowercase letter Mu should sort identically
580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
581f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4092260(/* char* par */) {
583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale el = new Locale("el", "");
584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator c = null;
585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = Collator.getInstance(el);
587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create collator for el locale.");
589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // These now have tertiary differences in UCA
592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.SECONDARY);
593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String tests[] = {
594aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00B5", "\u003d", "\u03BC",
595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4095316
600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
601f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4095316(/* char* par */) {
603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale el_GR = new Locale("el", "GR");
604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator c = null;
605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = Collator.getInstance(el_GR);
607aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create collator for el_GR locale");
609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // These now have tertiary differences in UCA
612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //c->setStrength(Collator::TERTIARY);
613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //c->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, status);
614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.SECONDARY);
615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String tests[] = {
616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u03D4", "\u003d", "\u03AB",
617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4101940
622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
623f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4101940(/* char* par */) {
625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = null;
626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = "&9 < a < b";
627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String nothing = "";
628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = new RuleBasedCollator(rules);
630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create RuleBasedCollator");
632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator i = c.getCollationElementIterator(nothing);
635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i.reset();
636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (i.next() != CollationElementIterator.NULLORDER) {
637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("next did not return NULLORDER");
638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4103436
642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator::compare not handling spaces properly
644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
645f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4103436(/* char* par */) {
647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
649aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] tests = {
650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0066\u0069\u006c\u0065", "\u003c", "\u0066\u0069\u006c\u0065\u0020\u0061\u0063\u0063\u0065\u0073\u0073",
651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0066\u0069\u006c\u0065", "\u003c", "\u0066\u0069\u006c\u0065\u0061\u0063\u0063\u0065\u0073\u0073",
652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, tests);
654aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
655aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
656aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4114076
657aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
658aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collation not Unicode conformant with Hangul syllables
659aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
660f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
661aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4114076(/* char* par */) {
662aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
663aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
664aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
665aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
666aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // With Canonical decomposition, Hangul syllables should get decomposed
667aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // into Jamo, but Jamo characters should not be decomposed into
668aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // conjoining Jamo
669aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
670aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String test1[] = {
671aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\ud4db", "\u003d", "\u1111\u1171\u11b6"
672aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
673aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
674aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
675aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, test1);
676aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
677aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // From UTR #15:
678aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // *In earlier versions of Unicode, jamo characters like ksf
679aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //  had compatibility mappings to kf + sf. These mappings were
680aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //  removed in Unicode 2.1.9 to ensure that Hangul syllables are maintained.)
681aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // That is, the following test is obsolete as of 2.1.9
682aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
683aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    // With Full decomposition, it should go all the way down to
684aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    // conjoining Jamo characters.
685aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    //
686aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    static const UChar test2[][CollationRegressionTest::MAX_TOKEN_LEN] =
687aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    {
688aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-        {0xd4db, 0}, {0x3d, 0}, {0x1111, 0x116e, 0x1175, 0x11af, 0x11c2, 0}
689aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    };
690aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-
691aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    c->setDecomposition(Normalizer::DECOMP_COMPAT);
692aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //obsolete-    compareArray(*c, test2, ARRAY_LENGTH(test2));
693aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
694aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
695aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4114077
696aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
697aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collation with decomposition off doesn't work for Europe
698aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
699f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
700aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4114077(/* char* par */) {
701aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Ensure that we get the same results with decomposition off
702aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // as we do with it on....
703aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator c = (RuleBasedCollator) Collator.getInstance(Locale.US);
704aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setStrength(Collator.TERTIARY);
705aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String test1[] = {
706aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00C0",                         "\u003d", "\u0041\u0300",            // Should be equivalent
707aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0070\u00ea\u0063\u0068\u0065", "\u003e", "\u0070\u00e9\u0063\u0068\u00e9",
708aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0204",                         "\u003d", "\u0045\u030F",
709aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01fa",                         "\u003d", "\u0041\u030a\u0301",    // a-ring-acute -> a-ring, acute
710aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                    //   -> a, ring, acute
711aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0041\u0300\u0316",             "\u003c", "\u0041\u0316\u0300"        // No reordering --> unequal
712aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
713aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
714aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.NO_DECOMPOSITION);
715aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, test1);
716aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
717aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String test2[] = {
718aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0041\u0300\u0316", "\u003d", "\u0041\u0316\u0300"      // Reordering --> equal
719aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
720aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
721aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        c.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
722aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, test2);
723aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
724aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
725aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4124632
726aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
727aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Collator::getCollationKey was hanging on certain character sequences
728aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
729f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
730aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4124632(/* char* par */) {
731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator coll = null;
732aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
733aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            coll = Collator.getInstance(Locale.JAPAN);
734aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
735aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create collator for Locale::JAPAN");
736aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
737aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
738aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String test = "\u0041\u0308\u0062\u0063";
739aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationKey key;
740aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
741aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            key = coll.getCollationKey(test);
742aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(key.getSourceString());
743aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
744aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("CollationKey creation failed.");
745aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
746aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
747aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
748aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4132736
749aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
750aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // sort order of french words with multiple accents has errors
751aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
752f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
753aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4132736(/* char* par */) {
754aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator c = null;
755aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
756aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c = Collator.getInstance(Locale.CANADA_FRENCH);
757aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            c.setStrength(Collator.TERTIARY);
758aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
759aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create a collator for Locale.CANADA_FRENCH");
760aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
761aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
762aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String test1[] = {
763aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0065\u0300\u0065\u0301", "\u003c", "\u0065\u0301\u0065\u0300",
764aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0065\u0300\u0301",       "\u003c", "\u0065\u0301\u0300",
765aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
766aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(c, test1);
767aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
768aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
769aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4133509
770aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
771aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // The sorting using java.text.CollationKey is not in the exact order
772aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
773f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
774aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4133509(/* char* par */) {
775aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
776aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String test1[] = {
777aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e", "\u003c", "\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0049\u006e\u0049\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0065\u0072\u0045\u0072\u0072\u006f\u0072",
778aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0047\u0072\u0061\u0070\u0068\u0069\u0063\u0073",       "\u003c", "\u0047\u0072\u0061\u0070\u0068\u0069\u0063\u0073\u0045\u006e\u0076\u0069\u0072\u006f\u006e\u006d\u0065\u006e\u0074",
779aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0053\u0074\u0072\u0069\u006e\u0067",                   "\u003c", "\u0053\u0074\u0072\u0069\u006e\u0067\u0042\u0075\u0066\u0066\u0065\u0072",
780aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
781aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
782aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(en_us, test1);
783aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
784aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
785aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4139572
786aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
787aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // getCollationKey throws exception for spanish text
788aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Cannot reproduce this bug on 1.2, however it DOES fail on 1.1.6
789aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
790f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
791aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4139572(/* char* par */) {
792aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
793aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Code pasted straight from the bug report
794aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // (and then translated to C++ ;-)
795aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
796aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // create spanish locale and collator
797aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale l = new Locale("es", "es");
798aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator col = null;
799aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
800aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            col = Collator.getInstance(l);
801aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
802aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create a collator for es_es locale.");
803aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
804aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
805aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationKey key = null;
806aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // this spanish phrase kills it!
807aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
808aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            key = col.getCollationKey("Nombre De Objeto");
809aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("source:" + key.getSourceString());
810aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
811aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error creating CollationKey for \"Nombre De Ojbeto\"");
812aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
813aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
814aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
815aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // @bug 4141640
816aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
817aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Support for Swedish gone in 1.1.6 (Can't create Swedish collator)
818aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
819f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
820aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4141640(/* char* par */) {
821aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
822aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Rather than just creating a Swedish collator, we might as well
823aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // try to instantiate one for every locale available on the system
824aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // in order to prevent this sort of bug from cropping up in the future
825aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
826aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale locales[] = Collator.getAvailableLocales();
827aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
828aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < locales.length; i += 1)
829aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
830aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Collator c = null;
831aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
832aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                c = Collator.getInstance(locales[i]);
833aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                logln("source: " + c.getStrength());
834aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
835aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String msg = "";
836aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg += "Could not create collator for locale ";
837aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                msg += locales[i].getDisplayName();
838aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln(msg);
839aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
840aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
841aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
842aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
843aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private void checkListOrder(String[] sortedList, Collator c) {
844aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // this function uses the specified Collator to make sure the
845aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // passed-in list is already sorted into ascending order
846aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < sortedList.length - 1; i++) {
847aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (c.compare(sortedList[i], sortedList[i + 1]) >= 0) {
848aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("List out of order at element #" + i + ": "
849aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + sortedList[i] + " >= "
850aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + sortedList[i + 1]);
851aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
852aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
853aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
854aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
855f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
856aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4171974() {
857aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // test French accent ordering more thoroughly
858aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*String[] frenchList = {
859aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u0075",     // u u
860aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u0075",     // u-umlaut u
861aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u0075",     // u-umlaut-macron u
862aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u0075",     // u-macron u
863aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u0075",     // u-macron-umlaut u
864aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u00fc",     // u u-umlaut
865aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u00fc",     // u-umlaut u-umlaut
866aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u00fc",     // u-umlaut-macron u-umlaut
867aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u00fc",     // u-macron u-umlaut
868aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u00fc",     // u-macron-umlaut u-umlaut
869aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u01d6",     // u u-umlaut-macron
870aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u01d6",     // u-umlaut u-umlaut-macron
871aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u01d6",     // u-umlaut-macron u-umlaut-macron
872aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u01d6",     // u-macron u-umlaut-macron
873aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u01d6",     // u-macron-umlaut u-umlaut-macron
874aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u016b",     // u u-macron
875aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u016b",     // u-umlaut u-macron
876aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u016b",     // u-umlaut-macron u-macron
877aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u016b",     // u-macron u-macron
878aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u016b",     // u-macron-umlaut u-macron
879aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u1e7b",     // u u-macron-umlaut
880aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u1e7b",     // u-umlaut u-macron-umlaut
881aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u1e7b",     // u-umlaut-macron u-macron-umlaut
882aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u1e7b",     // u-macron u-macron-umlaut
883aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u1e7b"      // u-macron-umlaut u-macron-umlaut
884aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
885aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator french = Collator.getInstance(Locale.FRENCH);
886aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
887aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("Testing French order...");
888aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkListOrder(frenchList, french);
889aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
890aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("Testing French order without decomposition...");
891aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        french.setDecomposition(Collator.NO_DECOMPOSITION);
892aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkListOrder(frenchList, french);*/
893aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
894aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] englishList = {
895aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u0075",     // u u
896aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u00fc",     // u u-umlaut
897aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u01d6",     // u u-umlaut-macron
898aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u016b",     // u u-macron
899aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u0075\u1e7b",     // u u-macron-umlaut
900aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u0075",     // u-umlaut u
901aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u00fc",     // u-umlaut u-umlaut
902aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u01d6",     // u-umlaut u-umlaut-macron
903aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u016b",     // u-umlaut u-macron
904aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00fc\u1e7b",     // u-umlaut u-macron-umlaut
905aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u0075",     // u-umlaut-macron u
906aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u00fc",     // u-umlaut-macron u-umlaut
907aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u01d6",     // u-umlaut-macron u-umlaut-macron
908aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u016b",     // u-umlaut-macron u-macron
909aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u01d6\u1e7b",     // u-umlaut-macron u-macron-umlaut
910aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u0075",     // u-macron u
911aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u00fc",     // u-macron u-umlaut
912aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u01d6",     // u-macron u-umlaut-macron
913aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u016b",     // u-macron u-macron
914aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u016b\u1e7b",     // u-macron u-macron-umlaut
915aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u0075",     // u-macron-umlaut u
916aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u00fc",     // u-macron-umlaut u-umlaut
917aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u01d6",     // u-macron-umlaut u-umlaut-macron
918aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u016b",     // u-macron-umlaut u-macron
919aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u1e7b\u1e7b"      // u-macron-umlaut u-macron-umlaut
920aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
921aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator english = Collator.getInstance(Locale.ENGLISH);
922aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
923aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("Testing English order...");
924aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkListOrder(englishList, english);
925aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
926aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("Testing English order without decomposition...");
927aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        english.setDecomposition(Collator.NO_DECOMPOSITION);
928aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        checkListOrder(englishList, english);
929aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
930aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
931f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
932aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4179216() throws Exception {
933aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // you can position a CollationElementIterator in the middle of
934aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // a contracting character sequence, yielding a bogus collation
935aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // element
936aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator coll = (RuleBasedCollator)Collator.getInstance(Locale.US);
937aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        coll = new RuleBasedCollator(coll.getRules()
938aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + " & C < ch , cH , Ch , CH < cat < crunchy");
939aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String testText = "church church catcatcher runcrunchynchy";
940aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator iter = coll.getCollationElementIterator(
941aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                testText);
942aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
943aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // test that the "ch" combination works properly
944aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(4);
945aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt4 = CollationElementIterator.primaryOrder(iter.next());
946aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
947aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.reset();
948aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt0 = CollationElementIterator.primaryOrder(iter.next());
949aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
950aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(5);
951aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt5 = CollationElementIterator.primaryOrder(iter.next());
952aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
953aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Compares and prints only 16-bit primary weights.
954aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (elt4 != elt0 || elt5 != elt0) {
955aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln(String.format("The collation elements at positions 0 (0x%04x), " +
956aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "4 (0x%04x), and 5 (0x%04x) don't match.",
957aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    elt0, elt4, elt5));
958aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
959aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
960aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // test that the "cat" combination works properly
961aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(14);
962aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt14 = CollationElementIterator.primaryOrder(iter.next());
963aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
964aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(15);
965aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt15 = CollationElementIterator.primaryOrder(iter.next());
966aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
967aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(16);
968aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt16 = CollationElementIterator.primaryOrder(iter.next());
969aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
970aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(17);
971aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt17 = CollationElementIterator.primaryOrder(iter.next());
972aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
973aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(18);
974aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt18 = CollationElementIterator.primaryOrder(iter.next());
975aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
976aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.setOffset(19);
977aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt19 = CollationElementIterator.primaryOrder(iter.next());
978aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
979aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Compares and prints only 16-bit primary weights.
980aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (elt14 != elt15 || elt14 != elt16 || elt14 != elt17
981aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                || elt14 != elt18 || elt14 != elt19) {
982aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln(String.format("\"cat\" elements don't match: elt14 = 0x%04x, " +
983aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "elt15 = 0x%04x, elt16 = 0x%04x, elt17 = 0x%04x, " +
984aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "elt18 = 0x%04x, elt19 = 0x%04x",
985aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    elt14, elt15, elt16, elt17, elt18, elt19));
986aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
987aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
988aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // now generate a complete list of the collation elements,
989aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // first using next() and then using setOffset(), and
990aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // make sure both interfaces return the same set of elements
991aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.reset();
992aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
993aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elt = iter.next();
994aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count = 0;
995aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (elt != CollationElementIterator.NULLORDER) {
996aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ++count;
997aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            elt = iter.next();
998aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
999aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1000aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] nextElements = new String[count];
1001aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] setOffsetElements = new String[count];
1002aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int lastPos = 0;
1003aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1004aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.reset();
1005aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        elt = iter.next();
1006aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        count = 0;
1007aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (elt != CollationElementIterator.NULLORDER) {
1008aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            nextElements[count++] = testText.substring(lastPos, iter.getOffset());
1009aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            lastPos = iter.getOffset();
1010aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            elt = iter.next();
1011aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1012aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        count = 0;
1013aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < testText.length(); ) {
1014aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            iter.setOffset(i);
1015aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            lastPos = iter.getOffset();
1016aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            elt = iter.next();
1017aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            setOffsetElements[count++] = testText.substring(lastPos, iter.getOffset());
1018aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            i = iter.getOffset();
1019aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1020aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < nextElements.length; i++) {
1021aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (nextElements[i].equals(setOffsetElements[i])) {
1022aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                logln(nextElements[i]);
1023aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
1024aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error: next() yielded " + nextElements[i] + ", but setOffset() yielded "
1025aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    + setOffsetElements[i]);
1026aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1027aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1028aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1029aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1030f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1031aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4216006() throws Exception {
1032aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // rule parser barfs on "<\u00e0=a\u0300", and on other cases
1033aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // where the same token (after normalization) appears twice in a row
1034aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean caughtException = false;
1035aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1036aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new RuleBasedCollator("\u00e0<a\u0300");
1037aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1038aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (ParseException e) {
1039aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            caughtException = true;
1040aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1041aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!caughtException) {
1042aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            throw new Exception("\"a<a\" collation sequence didn't cause parse error!");
1043aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1044aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1045aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator collator = new RuleBasedCollator("&a<\u00e0=a\u0300");
1046aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //commented by Kevin 2003/10/21
1047aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //for "FULL_DECOMPOSITION is not supported here." in ICU4J DOC
1048aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //collator.setDecomposition(Collator.FULL_DECOMPOSITION);
1049aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(Collator.IDENTICAL);
1050aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1051aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] tests = {
1052aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "a\u0300", "=", "\u00e0",
1053aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "\u00e0",  "=", "a\u0300"
1054aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1055aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1056aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        compareArray(collator, tests);
1057aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1058aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1059aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // CollationElementIterator.previous broken for expanding char sequences
1060aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
1061f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1062aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4179686() throws Exception {
1063aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
1064aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Create a collator with a few expanding character sequences in it....
1065aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator coll = new RuleBasedCollator(en_us.getRules()
1066aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                    + " & ae ; \u00e4 & AE ; \u00c4"
1067aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                    + " & oe ; \u00f6 & OE ; \u00d6"
1068aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                    + " & ue ; \u00fc & UE ; \u00dc");
1069aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1070aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = "T\u00f6ne"; // o-umlaut
1071aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1072aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator iter = coll.getCollationElementIterator(text);
1073aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        List elements = new ArrayList();
1074aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int elem;
1075aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1076aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Iterate forward and collect all of the elements into a Vector
1077aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while ((elem = iter.next()) != CollationElementIterator.NULLORDER) {
1078aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            elements.add(new Integer(elem));
1079aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1080aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1081aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Now iterate backward and make sure they're the same
1082aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        iter.reset();
1083aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int index = elements.size() - 1;
1084aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while ((elem = iter.previous()) != CollationElementIterator.NULLORDER) {
1085aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int expect = ((Integer)elements.get(index)).intValue();
1086aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1087aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (elem != expect) {
1088aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Mismatch at index " + index
1089aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      + ": got " + Integer.toString(elem,16)
1090aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      + ", expected " + Integer.toString(expect,16));
1091aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1092aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            index--;
1093aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1094aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1095aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1096f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1097aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4244884() throws Exception {
1098aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator coll = (RuleBasedCollator)Collator.getInstance(Locale.US);
1099aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        coll = new RuleBasedCollator(coll.getRules()
1100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + " & C < ch , cH , Ch , CH < cat < crunchy");
1101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] testStrings = new String[] {
1103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "car",
1104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "cave",
1105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "clamp",
1106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "cramp",
1107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "czar",
1108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "church",
1109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "catalogue",
1110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "crunchy",
1111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "dog"
1112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 1; i < testStrings.length; i++) {
1115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (coll.compare(testStrings[i - 1], testStrings[i]) >= 0) {
1116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("error: \"" + testStrings[i - 1]
1117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    + "\" is greater than or equal to \"" + testStrings[i]
1118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    + "\".");
1119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //  CollationElementIterator set doesn't work propertly with next/prev
1124f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4663220() {
1126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator collator = (RuleBasedCollator)Collator.getInstance(Locale.US);
1127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        java.text.StringCharacterIterator stringIter = new java.text.StringCharacterIterator("fox");
1128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationElementIterator iter = collator.getCollationElementIterator(stringIter);
1129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] elements_next = new int[3];
1131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("calling next:");
1132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < 3; ++i) {
1133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("[" + i + "] " + (elements_next[i] = iter.next()));
1134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] elements_fwd = new int[3];
1137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("calling set/next:");
1138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < 3; ++i) {
1139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            iter.setOffset(i);
1140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("[" + i + "] " + (elements_fwd[i] = iter.next()));
1141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < 3; ++i) {
1144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (elements_next[i] != elements_fwd[i]) {
1145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("mismatch at position " + i +
1146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ": " + elements_next[i] +
1147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                " != " + elements_fwd[i]);
1148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Fixing the infinite loop for surrogates
1153f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test8484()
1155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    {
1156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String s = "\u9FE1\uCEF3\u2798\uAAB6\uDA7C";
1157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator coll = Collator.getInstance();
1158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationKey collKey = coll.getCollationKey(s);
1159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("Pass: " + collKey.toString() + " generated OK.");
1160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1162f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public  void TestBengaliSortKey() throws Exception {
1164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        char rules[] = { 0x26, 0x9fa, 0x3c, 0x98c, 0x3c, 0x9e1, 0x3c, 0x98f, 0x3c, 0x990, 0x3c, 0x993,
1165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                0x3c, 0x994, 0x3c, 0x9bc, 0x3c, 0x982, 0x3c, 0x983, 0x3c, 0x981, 0x3c, 0x9b0, 0x3c,
1166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                0x9b8, 0x3c, 0x9b9, 0x3c, 0x9bd, 0x3c, 0x9be, 0x3c, 0x9bf, 0x3c, 0x9c8, 0x3c, 0x9cb,
1167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                0x3d, 0x9cb };
1168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator col = new RuleBasedCollator(String.copyValueOf(rules));
1170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String str1 = "\u09be";
1172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String str2 = "\u0b70";
1173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int result = col.compare(str1, str2);
1175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        System.out.flush();
1176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(result >= 0 ) {
1178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("\nERROR: result is " + result + " , wanted negative.");
1179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln(printKey(col, str1).toString());
1180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln(printKey(col, str2).toString());
1181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else {
1182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("Pass: result is OK.");
1183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static StringBuilder printKey(Collator col, String str1) {
1187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringBuilder sb = new StringBuilder();
1188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationKey sortk1 = col.getCollationKey(str1);
1189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        byte[] bytes = sortk1.toByteArray();
1190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for(int i=0;i<str1.length();i++) {
1191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sb.append("\\u"+Integer.toHexString(str1.charAt(i)));
1192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        System.out.print(": ");
1194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for(int i=0;i<bytes.length;i++) {
1195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sb.append(" 0x"+Integer.toHexString(((int)bytes[i])&0xff));
1196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        sb.append("\n");
1198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return sb;
1199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*
1202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Test case for ticket#8624
1203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Bad collation key with upper first option.
1204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1205f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCaseFirstCompression() {
1207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator col = (RuleBasedCollator)Collator.getInstance(Locale.US);
1208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Default
1210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        caseFirstCompressionSub(col, "default");
1211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Upper first
1213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        col.setUpperCaseFirst(true);
1214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        caseFirstCompressionSub(col, "upper first");
1215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Lower first
1217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        col.setLowerCaseFirst(true);
1218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        caseFirstCompressionSub(col, "lower first");
1219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1221f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestTrailingComment() throws Exception {
1223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // ICU ticket #8070:
1224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Check that the rule parser handles a comment without terminating end-of-line.
1225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator coll = new RuleBasedCollator("&c<b#comment1\n<a#comment2");
1226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertTrue("c<b", coll.compare("c", "b") < 0);
1227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertTrue("b<a", coll.compare("b", "a") < 0);
1228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1230f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestBeforeWithTooStrongAfter() {
1232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // ICU ticket #9959:
1233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Forbid rules with a before-reset followed by a stronger relation.
1234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new RuleBasedCollator("&[before 2]x<<q<p");
1236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("should forbid before-2-reset followed by primary relation");
1237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch(Exception expected) {
1238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new RuleBasedCollator("&[before 3]x<<<q<<s<p");
1241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("should forbid before-3-reset followed by primary or secondary relation");
1242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch(Exception expected) {
1243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*
1247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Compare two strings - "aaa...A" and "aaa...a" with
1248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Collation#compare and CollationKey#compareTo, called from
1249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * TestCaseFirstCompression.
1250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private void caseFirstCompressionSub(RuleBasedCollator col, String opt) {
1252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final int maxLength = 50;
1253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringBuilder buf1 = new StringBuilder();
1255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringBuilder buf2 = new StringBuilder();
1256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String str1, str2;
1257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int n = 1; n <= maxLength; n++) {
1259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            buf1.setLength(0);
1260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            buf2.setLength(0);
1261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < n - 1; i++) {
1263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                buf1.append('a');
1264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                buf2.append('a');
1265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            buf1.append('A');
1267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            buf2.append('a');
1268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            str1 = buf1.toString();
1270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            str2 = buf2.toString();
1271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            CollationKey key1 = col.getCollationKey(str1);
1273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            CollationKey key2 = col.getCollationKey(str2);
1274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int cmpKey = key1.compareTo(key2);
1276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int cmpCol = col.compare(str1, str2);
1277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if ((cmpKey < 0 && cmpCol >= 0) || (cmpKey > 0 && cmpCol <= 0) || (cmpKey == 0 && cmpCol != 0)) {
1279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Inconsistent comparison(" + opt + "): str1=" + str1 + ", str2=" + str2 + ", cmpKey=" + cmpKey + " , cmpCol=" + cmpCol);
1280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /* RuleBasedCollator not subclassable
1285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * @bug 4146160
1286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
1287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // RuleBasedCollator doesn't use createCollationElementIterator internally
1288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //
1289f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void Test4146160() {
1291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
1292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Use a custom collator class whose createCollationElementIterator
1293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // methods increment a count....
1294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //
1295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator en_us = (RuleBasedCollator) Collator.getInstance(Locale.US);
1296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        My4146160Collator.count = 0;
1297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        My4146160Collator mc = null;
1298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            mc = new My4146160Collator(en_us);
1300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failed to create a My4146160Collator.");
1302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        CollationKey key = null;
1306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            key = mc.getCollationKey("1");
1308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Failure to get a CollationKey from a My4146160Collator.");
1310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (My4146160Collator.count < 1) {
1314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("My4146160Collator.getCollationElementIterator not called for getCollationKey");
1315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        My4146160Collator.count = 0;
1318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        mc.compare("1", "2");
1319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (My4146160Collator.count < 1) {
1321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("My4146160Collator.getCollationElementIterator not called for compare");
1322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }*/
1324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
1325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* RuleBasedCollator not subclassable
1327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * class My4146160Collator extends RuleBasedCollator {
1328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static int count = 0;
1329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public My4146160Collator(RuleBasedCollator rbc) throws Exception {
1331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        super(rbc.getRules());
1332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public CollationElementIterator getCollationElementIterator(String text) {
1335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        count += 1;
1336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return super.getCollationElementIterator(text);
1337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public CollationElementIterator getCollationElementIterator(java.text.CharacterIterator text) {
1340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        count += 1;
1341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return super.getCollationElementIterator(text);
1342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
1344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*/
1345