1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coll.h"
12fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/localpointer.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/sortkey.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "regcoll.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "sfwdchit.h"
1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "testutil.h"
1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define ARRAY_LENGTH(array) ((int32_t)(sizeof array / sizeof array[0]))
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationRegressionTest::CollationRegressionTest()
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    en_us = (RuleBasedCollator *)Collator::createInstance(Locale::getUS(), status);
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete en_us;
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      en_us = 0;
316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Collator creation failed with %s", u_errorName(status));
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationRegressionTest::~CollationRegressionTest()
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete en_us;
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // @bug 4048446
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// CollationElementIterator.reset() doesn't work
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4048446(/* char* par */)
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString test1 = "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?";
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString test2 = "Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?";
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *i1 = en_us->createCollationElementIterator(test1);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *i2 = en_us->createCollationElementIterator(test1);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i1 == NULL|| i2 == NULL)
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Could not create CollationElementIterator's");
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete i1;
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete i2;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (i1->next(status) != CollationElementIterator::NULLORDER)
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status))
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("error calling next()");
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete i1;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete i2;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i1->reset();
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEqual(*i1, *i2);
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete i1;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete i2;
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4051866
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator -> rules -> Collator round-trip broken for expanding characters
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4051866(/* char* par */)
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    rules += "&n < o ";
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += "& oe ,o";
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += (UChar)0x3080;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += "& oe ,";
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += (UChar)0x1530;
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += " ,O";
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += "& OE ,O";
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += (UChar)0x3080;
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += "& OE ,";
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += (UChar)0x1520;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += "< p ,P";
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Build a collator containing expanding characters
104fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    LocalPointer<RuleBasedCollator> c1(new RuleBasedCollator(rules, status));
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Build another using the rules from  the first
107fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    LocalPointer<RuleBasedCollator> c2(new RuleBasedCollator(c1->getRules(), status));
108fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
109fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("RuleBasedCollator(rule string) failed - %s", u_errorName(status));
110fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure they're the same
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(c1->getRules() == c2->getRules()))
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Rules are not equal");
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4053636
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator thinks "black-bird" == "black"
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4053636(/* char* par */)
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (en_us->equals("black_bird", "black"))
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("black-bird == black");
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4054238
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// CollationElementIterator will not work correctly if the associated
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator object's mode is changed
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4054238(/* char* par */)
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar chars3[] = {0x61, 0x00FC, 0x62, 0x65, 0x63, 0x6b, 0x20, 0x47, 0x72, 0x00F6, 0x00DF, 0x65, 0x20, 0x4c, 0x00FC, 0x62, 0x63, 0x6b, 0};
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString test3(chars3);
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NOTE: The Java code uses en_us to create the CollationElementIterators
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // but I'm pretty sure that's wrong, so I've changed this to use c.
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *i1 = c->createCollationElementIterator(test3);
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete i1;
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4054734
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::IDENTICAL documented but not implemented
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4054734(/* char* par */)
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Here's the original Java:
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        String[] decomp = {
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\u0001",   "<",    "\u0002",
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\u0001",   "=",    "\u0001",
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "A\u0001",  ">",    "~\u0002",      // Ensure A and ~ are not compared bitwise
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\u00C0",   "=",    "A\u0300"       // Decomp should make these equal
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        String[] nodecomp = {
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\u00C0",   ">",    "A\u0300"       // A-grave vs. A combining-grave
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar decomp[][CollationRegressionTest::MAX_TOKEN_LEN] =
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0001, 0},      {0x3c, 0}, {0x0002, 0},
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0001, 0},      {0x3d, 0}, {0x0001, 0},
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x41, 0x0001, 0}, {0x3e, 0}, {0x7e, 0x0002, 0},
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00c0, 0},      {0x3d, 0}, {0x41, 0x0300, 0}
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::IDENTICAL);
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, decomp, ARRAY_LENGTH(decomp));
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4054736
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Full Decomposition mode not implemented
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4054736(/* char* par */)
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::SECONDARY);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0xFB4F, 0}, {0x3d, 0}, {0x05D0, 0x05DC}  // Alef-Lamed vs. Alef, Lamed
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4058613
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Collator::createInstance() causes an ArrayIndexOutofBoundsException for Korean
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4058613(/* char* par */)
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Creating a default collator doesn't work when Korean is the default
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // locale
223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale oldDefault = Locale::getDefault();
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(Locale::getKorean(), status);
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status))
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Could not set default locale to Locale::KOREAN");
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator *c = NULL;
236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = Collator::createInstance("en_US", status);
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Could not create a Korean collator");
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale::setDefault(oldDefault, status);
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Since the fix to this bug was to turn off decomposition for Korean collators,
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ensure that's what we got
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c->getAttribute(UCOL_NORMALIZATION_MODE, status) != UCOL_OFF)
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Decomposition is not set to NO_DECOMPOSITION for Korean collator");
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale::setDefault(oldDefault, status);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4059820
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator.getRules does not return the exact pattern as input
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// for expanding character sequences
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4059820(/* char* par */)
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = NULL;
269fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString rules = "&9 < a < b , c/a < d < z";
270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = new RuleBasedCollator(rules, status);
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failure building a collator.");
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( c->getRules().indexOf("c/a") == -1)
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("returned rules do not contain 'c/a'");
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4060154
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// MergeCollation::fixEntry broken for "& H < \u0131, \u0130, i, I"
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4060154(/* char* par */)
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
297fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    rules += "&f < g, G < h, H < i, I < j, J";
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules +=  " & H < ";
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += (UChar)0x0131;
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += ", ";
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += (UChar)0x0130;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules += ", i, I";
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = NULL;
305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = new RuleBasedCollator(rules, status);
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("failure building collator.");
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String[] tertiary = {
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "A",        "<",    "B",
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "H",        "<",    "\u0131",
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "H",        "<",    "I",
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\u0131",   "<",    "\u0130",
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\u0130",   "<",    "i",
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\u0130",   ">",    "H",
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tertiary[][CollationRegressionTest::MAX_TOKEN_LEN] =
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x41, 0},    {0x3c, 0}, {0x42, 0},
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x48, 0},    {0x3c, 0}, {0x0131, 0},
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x48, 0},    {0x3c, 0}, {0x49, 0},
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0131, 0}, {0x3c, 0}, {0x0130, 0},
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0130, 0}, {0x3c, 0}, {0x69, 0},
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0130, 0}, {0x3e, 0}, {0x48, 0}
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tertiary, ARRAY_LENGTH(tertiary));
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String[] secondary = {
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "H",        "<",    "I",
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\u0131",   "=",    "\u0130",
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar secondary[][CollationRegressionTest::MAX_TOKEN_LEN] =
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x48, 0},    {0x3c, 0}, {0x49, 0},
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0131, 0}, {0x3d, 0}, {0x0130, 0}
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::PRIMARY);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, secondary, ARRAY_LENGTH(secondary));
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4062418
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Secondary/Tertiary comparison incorrect in French Secondary
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4062418(/* char* par */)
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = NULL;
368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
36927f654740f2a26ad62a5c155af9199af9e69b889claireho    c = (RuleBasedCollator *) Collator::createInstance(Locale::getCanadaFrench(), status);
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
37327f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("Failed to create collator for Locale::getCanadaFrench()");
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::SECONDARY);
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String[] tests = {
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "p\u00eache",    "<",    "p\u00e9ch\u00e9",    // Comparing accents from end, p\u00e9ch\u00e9 is greater
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x70, 0x00EA, 0x63, 0x68, 0x65, 0}, {0x3c, 0}, {0x70, 0x00E9, 0x63, 0x68, 0x00E9, 0}
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4065540
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::compare() method broken if either string contains spaces
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4065540(/* char* par */)
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (en_us->compare("abcd e", "abcd f") == 0)
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("'abcd e' == 'abcd f'");
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4066189
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Unicode characters need to be recursively decomposed to get the
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// correct result. For example,
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// u1EB1 -> \u0103 + \u0300 -> a + \u0306 + \u0300.
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4066189(/* char* par */)
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar chars1[] = {0x1EB1, 0};
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar chars2[] = {0x61, 0x0306, 0x0300, 0};
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString test1(chars1);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString test2(chars2);
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NOTE: The java code used en_us to create the
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // CollationElementIterator's. I'm pretty sure that
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // was wrong, so I've change the code to use c1 and c2
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c1 = (RuleBasedCollator *) en_us->clone();
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c1->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *i1 = c1->createCollationElementIterator(test1);
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c2 = (RuleBasedCollator *) en_us->clone();
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c2->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *i2 = c2->createCollationElementIterator(test2);
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertEqual(*i1, *i2);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete i2;
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c2;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete i1;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c1;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4066696
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// French secondary collation checking at the end of compare iteration fails
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4066696(/* char* par */)
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = NULL;
448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
44927f654740f2a26ad62a5c155af9199af9e69b889claireho    c = (RuleBasedCollator *)Collator::createInstance(Locale::getCanadaFrench(), status);
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
45327f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("Failure creating collator for Locale::getCanadaFrench()");
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::SECONDARY);
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String[] tests = {
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\u00e0",   "<",     "\u01fa",       // a-grave <  A-ring-acute
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  should be:
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String[] tests = {
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\u00e0",   ">",     "\u01fa",       // a-grave <  A-ring-acute
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00E0, 0}, {0x3e, 0}, {0x01FA, 0}
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4076676
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Bad canonicalization of same-class combining characters
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4076676(/* char* par */)
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // These combining characters are all in the same class, so they should not
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // be reordered, and they should compare as unequal.
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar s1[] = {0x41, 0x0301, 0x0302, 0x0300, 0};
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar s2[] = {0x41, 0x0302, 0x0300, 0x0301, 0};
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c->compare(s1,s2) == 0)
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Same-class combining chars were reordered");
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4079231
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator::operator==(NULL) throws NullPointerException
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4079231(/* char* par */)
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // I don't think there's any way to write this test
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // in C++. The following is equivalent to the Java,
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // but doesn't compile 'cause NULL can't be converted
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to Collator&
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // if (en_us->operator==(NULL))
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //     errln("en_us->operator==(NULL) returned TRUE");
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // }
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   try {
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (en_us->equals(null)) {
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("en_us->equals(null) returned true");
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch (Exception e) {
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("en_us->equals(null) threw " + e.toString());
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4078588
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator breaks on "< a < bb" rule
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4078588(/* char *par */)
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
540fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RuleBasedCollator *rbc = new RuleBasedCollator("&9 < a < bb", status);
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rbc == NULL || U_FAILURE(status))
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create RuleBasedCollator.");
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete rbc;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator::EComparisonResult result = rbc->compare("a","bb");
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result != Collator::LESS)
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"Compare(a,bb) returned " + (int)result
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            + (UnicodeString)"; expected -1");
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete rbc;
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4081866
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Combining characters in different classes not reordered properly.
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4081866(/* char* par */)
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // These combining characters are all in different classes,
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // so they should be reordered and the strings should compare as equal.
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar s1[] = {0x41, 0x0300, 0x0316, 0x0327, 0x0315, 0};
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar s2[] = {0x41, 0x0327, 0x0316, 0x0315, 0x0300, 0};
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
574b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now that the default collators are set to NO_DECOMPOSITION
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // (as a result of fixing bug 4114077), we must set it explicitly
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // when we're testing reordering behavior.  -- lwerner, 5/5/98
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c->compare(s1,s2) != 0)
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Combining chars were not reordered");
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4087241
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// string comparison errors in Scandinavian collators
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4087241(/* char* par */)
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale da_DK("da", "DK");
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = NULL;
597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = (RuleBasedCollator *) Collator::createInstance(da_DK, status);
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create collator for da_DK locale");
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::SECONDARY);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x7a, 0},          {0x3c, 0}, {0x00E6, 0},            // z        < ae
612fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {0x61, 0x0308, 0},  {0x3c, 0}, {0x61, 0x030A, 0},      // a-umlaut < a-ring
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x59, 0},          {0x3c, 0}, {0x75, 0x0308, 0},      // Y        < u-umlaut
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4087243
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// CollationKey takes ignorable strings into account when it shouldn't
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4087243(/* char* par */)
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x31, 0x32, 0x33, 0}, {0x3d, 0}, {0x31, 0x32, 0x33, 0x0001, 0}    // 1 2 3  =  1 2 3 ctrl-A
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4092260
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Mu/micro conflict
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Micro symbol and greek lowercase letter Mu should sort identically
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4092260(/* char* par */)
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale el("el", "");
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator *c = NULL;
650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = Collator::createInstance(el, status);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create collator for el locale.");
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // These now have tertiary differences in UCA
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, status);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00B5, 0}, {0x3d, 0}, {0x03BC, 0}
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4095316
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4095316(/* char* par */)
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale el_GR("el", "GR");
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator *c = Collator::createInstance(el_GR, status);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create collator for el_GR locale");
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // These now have tertiary differences in UCA
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //c->setStrength(Collator::TERTIARY);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, status);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x03D4, 0}, {0x3d, 0}, {0x03AB, 0}
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4101940
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4101940(/* char* par */)
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = NULL;
707fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString rules = "&9 < a < b";
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString nothing = "";
709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = new RuleBasedCollator(rules, status);
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create RuleBasedCollator");
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *i = c->createCollationElementIterator(nothing);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i->reset();
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i->next(status) != CollationElementIterator::NULLORDER)
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("next did not return NULLORDER");
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete i;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4103436
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::compare not handling spaces properly
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4103436(/* char* par */)
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x66, 0x69, 0x6c, 0x65, 0}, {0x3c, 0}, {0x66, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0},
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x66, 0x69, 0x6c, 0x65, 0}, {0x3c, 0}, {0x66, 0x69, 0x6c, 0x65, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0}
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, tests, ARRAY_LENGTH(tests));
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4114076
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collation not Unicode conformant with Hangul syllables
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4114076(/* char* par */)
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // With Canonical decomposition, Hangul syllables should get decomposed
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // into Jamo, but Jamo characters should not be decomposed into
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // conjoining Jamo
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] =
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0xd4db, 0}, {0x3d, 0}, {0x1111, 0x1171, 0x11b6, 0}
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, test1, ARRAY_LENGTH(test1));
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // From UTR #15:
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // *In earlier versions of Unicode, jamo characters like ksf
776b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    //  had compatibility mappings to kf + sf. These mappings were
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //  removed in Unicode 2.1.9 to ensure that Hangul syllables are maintained.)
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // That is, the following test is obsolete as of 2.1.9
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    // With Full decomposition, it should go all the way down to
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    // conjoining Jamo characters.
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    //
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    static const UChar test2[][CollationRegressionTest::MAX_TOKEN_LEN] =
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    {
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-        {0xd4db, 0}, {0x3d, 0}, {0x1111, 0x116e, 0x1175, 0x11af, 0x11c2, 0}
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    };
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    c->setDecomposition(Normalizer::DECOMP_COMPAT);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete-    compareArray(*c, test2, ARRAY_LENGTH(test2));
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4124632
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::getCollationKey was hanging on certain character sequences
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4124632(/* char* par */)
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator *coll = NULL;
803b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = Collator::createInstance(Locale::getJapan(), status);
805b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (coll == NULL || U_FAILURE(status))
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create collator for Locale::JAPAN");
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete coll;
810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar test[] = {0x41, 0x0308, 0x62, 0x63, 0};
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationKey key;
815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll->getCollationKey(test, key, status);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (key.isBogus() || U_FAILURE(status))
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("CollationKey creation failed.");
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete coll;
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4132736
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// sort order of french words with multiple accents has errors
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4132736(/* char* par */)
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator *c = NULL;
835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
83627f654740f2a26ad62a5c155af9199af9e69b889claireho    c = Collator::createInstance(Locale::getCanadaFrench(), status);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
84127f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("Failed to create a collator for Locale::getCanadaFrench()");
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
843c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] =
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x65, 0x0300, 0x65, 0x0301, 0}, {0x3c, 0}, {0x65, 0x0301, 0x65, 0x0300, 0},
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x65, 0x0300, 0x0301, 0},       {0x3c, 0}, {0x65, 0x0301, 0x0300, 0}
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, test1, ARRAY_LENGTH(test1));
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4133509
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// The sorting using java.text.CollationKey is not in the exact order
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4133509(/* char* par */)
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] =
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0}, {0x3c, 0}, {0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0},
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0},      {0x3c, 0}, {0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0},
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0},                  {0x3c, 0}, {0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0}
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*en_us, test1, ARRAY_LENGTH(test1));
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4114077
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Collation with decomposition off doesn't work for Europe
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4114077(/* char* par */)
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Ensure that we get the same results with decomposition off
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // as we do with it on....
881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone();
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setStrength(Collator::TERTIARY);
885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] =
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00C0, 0},                     {0x3d, 0}, {0x41, 0x0300, 0},            // Should be equivalent
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x70, 0x00ea, 0x63, 0x68, 0x65, 0}, {0x3e, 0}, {0x70, 0x00e9, 0x63, 0x68, 0x00e9, 0},
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0204, 0},                     {0x3d, 0}, {0x45, 0x030F, 0},
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x01fa, 0},                     {0x3d, 0}, {0x41, 0x030a, 0x0301, 0},    // a-ring-acute -> a-ring, acute
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                //   -> a, ring, acute
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x41, 0x0300, 0x0316, 0},         {0x3c, 0}, {0x41, 0x0316, 0x0300, 0}        // No reordering --> unequal
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, test1, ARRAY_LENGTH(test1));
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar test2[][CollationRegressionTest::MAX_TOKEN_LEN] =
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x41, 0x0300, 0x0316, 0}, {0x3d, 0}, {0x41, 0x0316, 0x0300, 0}      // Reordering --> equal
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareArray(*c, test2, ARRAY_LENGTH(test2));
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4141640
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Support for Swedish gone in 1.1.6 (Can't create Swedish collator)
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4141640(/* char* par */)
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Rather than just creating a Swedish collator, we might as well
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // try to instantiate one for every locale available on the system
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // in order to prevent this sort of bug from cropping up in the future
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, localeCount;
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale *locales = Locale::getAvailableLocales(localeCount);
924b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < localeCount; i += 1)
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Collator *c = NULL;
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = Collator::createInstance(locales[i], status);
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c == NULL || U_FAILURE(status))
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString msg, localeName;
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            msg += "Could not create collator for locale ";
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            msg += locales[i].getName();
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(msg);
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete c;
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4139572
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// getCollationKey throws exception for spanish text
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Cannot reproduce this bug on 1.2, however it DOES fail on 1.1.6
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4139572(/* char* par */)
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Code pasted straight from the bug report
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // (and then translated to C++ ;-)
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // create spanish locale and collator
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale l("es", "es");
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator *col = NULL;
961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = Collator::createInstance(l, status);
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (col == NULL || U_FAILURE(status))
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create a collator for es_es locale.");
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete col;
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationKey key;
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // this spanish phrase kills it!
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col->getCollationKey("Nombre De Objeto", key, status);
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (key.isBogus() || U_FAILURE(status))
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error creating CollationKey for \"Nombre De Ojbeto\"");
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete col;
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* HSYS : RuleBasedCollator::compare() performance enhancements
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          compare() does not create CollationElementIterator() anymore.*/
985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass My4146160Collator : public RuleBasedCollator
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    My4146160Collator(RuleBasedCollator &rbc, UErrorCode &status);
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~My4146160Collator();
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *createCollationElementIterator(const UnicodeString &text) const;
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationElementIterator *createCollationElementIterator(const CharacterIterator &text) const;
995b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static int32_t count;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t My4146160Collator::count = 0;
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMy4146160Collator::My4146160Collator(RuleBasedCollator &rbc, UErrorCode &status)
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  : RuleBasedCollator(rbc.getRules(), status)
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMy4146160Collator::~My4146160Collator()
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationElementIterator *My4146160Collator::createCollationElementIterator(const UnicodeString &text) const
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count += 1;
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return RuleBasedCollator::createCollationElementIterator(text);
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationElementIterator *My4146160Collator::createCollationElementIterator(const CharacterIterator &text) const
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count += 1;
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return RuleBasedCollator::createCollationElementIterator(text);
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4146160
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator doesn't use createCollationElementIterator internally
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4146160(/* char* par */)
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Use a custom collator class whose createCollationElementIterator
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // methods increment a count....
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CollationKey key;
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    My4146160Collator::count = 0;
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    My4146160Collator *mc = NULL;
1038b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mc = new My4146160Collator(*en_us, status);
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (mc == NULL || U_FAILURE(status))
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed to create a My4146160Collator.");
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete mc;
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mc->getCollationKey("1", key, status);
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (key.isBogus() || U_FAILURE(status))
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failure to get a CollationKey from a My4146160Collator.");
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete mc;
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (My4146160Collator::count < 1)
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("My4146160Collator::createCollationElementIterator not called for getCollationKey");
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    My4146160Collator::count = 0;
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mc->compare("1", "2");
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (My4146160Collator::count < 1)
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("My4146160Collator::createtCollationElementIterator not called for compare");
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete mc;
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
107350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1074fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid CollationRegressionTest::Test4179216() {
1075fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // you can position a CollationElementIterator in the middle of
1076fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // a contracting character sequence, yielding a bogus collation
1077fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // element
1078fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    IcuTestErrorCode errorCode(*this, "Test4179216");
1079fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RuleBasedCollator coll(en_us->getRules() + " & C < ch , cH , Ch , CH < cat < crunchy", errorCode);
1080fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString testText = "church church catcatcher runcrunchynchy";
1081fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationElementIterator *iter = coll.createCollationElementIterator(testText);
1082fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1083fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // test that the "ch" combination works properly
1084fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(4, errorCode);
1085fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt4 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1086fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1087fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->reset();
1088fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt0 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1089fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1090fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(5, errorCode);
1091fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt5 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1092fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1093fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Compares and prints only 16-bit primary weights.
1094fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (elt4 != elt0 || elt5 != elt0) {
1095fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("The collation elements at positions 0 (0x%04x), "
1096fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "4 (0x%04x), and 5 (0x%04x) don't match.",
1097fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                elt0, elt4, elt5);
1098fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1099fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1100fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // test that the "cat" combination works properly
1101fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(14, errorCode);
1102fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt14 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1103fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1104fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(15, errorCode);
1105fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt15 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1106fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1107fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(16, errorCode);
1108fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt16 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1109fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1110fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(17, errorCode);
1111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt17 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1112fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1113fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(18, errorCode);
1114fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt18 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1115fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(19, errorCode);
1117fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt19 = CollationElementIterator::primaryOrder(iter->next(errorCode));
1118fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1119fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Compares and prints only 16-bit primary weights.
1120fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (elt14 != elt15 || elt14 != elt16 || elt14 != elt17
1121fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            || elt14 != elt18 || elt14 != elt19) {
1122fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("\"cat\" elements don't match: elt14 = 0x%04x, "
1123fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "elt15 = 0x%04x, elt16 = 0x%04x, elt17 = 0x%04x, "
1124fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                "elt18 = 0x%04x, elt19 = 0x%04x",
1125fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                elt14, elt15, elt16, elt17, elt18, elt19);
1126fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1127fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1128fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // now generate a complete list of the collation elements,
1129fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // first using next() and then using setOffset(), and
1130fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // make sure both interfaces return the same set of elements
1131fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->reset();
1132fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1133fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t elt = iter->next(errorCode);
1134fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t count = 0;
1135fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    while (elt != CollationElementIterator::NULLORDER) {
1136fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        ++count;
1137fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        elt = iter->next(errorCode);
1138fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1139fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1140fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    LocalArray<UnicodeString> nextElements(new UnicodeString[count]);
1141fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    LocalArray<UnicodeString> setOffsetElements(new UnicodeString[count]);
1142fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t lastPos = 0;
1143fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1144fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->reset();
1145fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    elt = iter->next(errorCode);
1146fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    count = 0;
1147fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    while (elt != CollationElementIterator::NULLORDER) {
1148fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        nextElements[count++] = testText.tempSubStringBetween(lastPos, iter->getOffset());
1149fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        lastPos = iter->getOffset();
1150fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        elt = iter->next(errorCode);
1151fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1152fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t nextElementsLength = count;
1153fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    count = 0;
1154fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (int32_t i = 0; i < testText.length(); ) {
1155fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        iter->setOffset(i, errorCode);
1156fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        lastPos = iter->getOffset();
1157fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        elt = iter->next(errorCode);
1158fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        setOffsetElements[count++] = testText.tempSubStringBetween(lastPos, iter->getOffset());
1159fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        i = iter->getOffset();
1160fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1161fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (int32_t i = 0; i < nextElementsLength; i++) {
1162fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (nextElements[i] == setOffsetElements[i]) {
1163fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            logln(nextElements[i]);
1164fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        } else {
1165fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            errln(UnicodeString("Error: next() yielded ") + nextElements[i] +
1166fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                ", but setOffset() yielded " + setOffsetElements[i]);
1167fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
1168fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1169fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete iter;
1170fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
1171fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
117250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Ticket 7189
117350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
117450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// nextSortKeyPart incorrect for EO_S1 collation
117527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t calcKeyIncremental(UCollator *coll, const UChar* text, int32_t len, uint8_t *keyBuf, int32_t /*keyBufLen*/, UErrorCode& status) {
117650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCharIterator uiter;
117750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uint32_t state[2] = { 0, 0 };
117850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t keyLen;
117950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t count = 8;
118050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
118150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uiter_setString(&uiter, text, len);
118250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    keyLen = 0;
118350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    while (TRUE) {
118450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t keyPartLen = ucol_nextSortKeyPart(coll, &uiter, state, &keyBuf[keyLen], count, &status);
118550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_FAILURE(status)) {
118650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return -1;
118750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
118850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (keyPartLen == 0) {
118950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
119050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
119150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        keyLen += keyPartLen;
119250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
119350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return keyLen;
119450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
119550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
119650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid CollationRegressionTest::TestT7189() {
119750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
119850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCollator *coll;
119950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uint32_t i;
120050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
120150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const UChar text1[][CollationRegressionTest::MAX_TOKEN_LEN] = {
120250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // "Achter De Hoven"
120350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x41, 0x63, 0x68, 0x74, 0x65, 0x72, 0x20, 0x44, 0x65, 0x20, 0x48, 0x6F, 0x76, 0x65, 0x6E, 0x00 },
120450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // "ABC"
120550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x41, 0x42, 0x43, 0x00 },
120650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // "HELLO world!"
120750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00 }
120850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
120950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
121050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const UChar text2[][CollationRegressionTest::MAX_TOKEN_LEN] = {
121150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // "Achter de Hoven"
121250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x41, 0x63, 0x68, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x20, 0x48, 0x6F, 0x76, 0x65, 0x6E, 0x00 },
121350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // "abc"
121450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x61, 0x62, 0x63, 0x00 },
121550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // "hello world!"
121650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00 }
121750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
121850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
121950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Open the collator
122050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    coll = ucol_openFromShortString("EO_S1", FALSE, NULL, &status);
122150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
122250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Failed to create a collator for short string EO_S1");
122350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
122450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
122550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
122650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for (i = 0; i < sizeof(text1) / (CollationRegressionTest::MAX_TOKEN_LEN * sizeof(UChar)); i++) {
122750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uint8_t key1[100], key2[100];
122850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t len1, len2;
122950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
123050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        len1 = calcKeyIncremental(coll, text1[i], -1, key1, sizeof(key1), status);
123150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_FAILURE(status)) {
123250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            errln(UnicodeString("Failed to get a partial collation key for ") + text1[i]);
123350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
123450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
123550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        len2 = calcKeyIncremental(coll, text2[i], -1, key2, sizeof(key2), status);
123650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_FAILURE(status)) {
123750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            errln(UnicodeString("Failed to get a partial collation key for ") + text2[i]);
123850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
123950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
124050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
124150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (len1 == len2 && uprv_memcmp(key1, key2, len1) == 0) {
124250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            errln(UnicodeString("Failed: Identical key\n") + "    text1: " + text1[i] + "\n" + "    text2: " + text2[i] + "\n" + "    key  : " + TestUtility::hex(key1, len1));
124350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
124450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            logln(UnicodeString("Keys produced -\n") + "    text1: " + text1[i] + "\n" + "    key1 : " + TestUtility::hex(key1, len1) + "\n" + "    text2: " + text2[i] + "\n" + "    key2 : "
124550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    + TestUtility::hex(key2, len2));
124650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
124750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
124850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ucol_close(coll);
124950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
125050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid CollationRegressionTest::TestCaseFirstCompression() {
1252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    RuleBasedCollator *col = (RuleBasedCollator *) en_us->clone();
1253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
1254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // default
1256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    caseFirstCompressionSub(col, "default");
1257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Upper first
1259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    col->setAttribute(UCOL_CASE_FIRST, UCOL_UPPER_FIRST, status);
1260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
1261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("Failed to set UCOL_UPPER_FIRST");
1262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
1263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    caseFirstCompressionSub(col, "upper first");
1265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Lower first
1267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    col->setAttribute(UCOL_CASE_FIRST, UCOL_LOWER_FIRST, status);
1268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
1269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("Failed to set UCOL_LOWER_FIRST");
1270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
1271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    caseFirstCompressionSub(col, "lower first");
1273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete col;
1275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid CollationRegressionTest::caseFirstCompressionSub(Collator *col, UnicodeString opt) {
1278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t maxLength = 50;
1279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar str1[maxLength];
1281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar str2[maxLength];
1282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    CollationKey key1, key2;
1284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (int32_t len = 1; len <= maxLength; len++) {
1286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t i = 0;
1287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for (; i < len - 1; i++) {
1288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            str1[i] = str2[i] = (UChar)0x61; // 'a'
1289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        str1[i] = (UChar)0x41; // 'A'
1291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        str2[i] = (UChar)0x61; // 'a'
1292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
1294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        col->getCollationKey(str1, len, key1, status);
1295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        col->getCollationKey(str2, len, key2, status);
1296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UCollationResult cmpKey = key1.compareTo(key2, status);
1298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UCollationResult cmpCol = col->compare(str1, len, str2, len, status);
1299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error in caseFirstCompressionSub");
1302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else if (cmpKey != cmpCol) {
1303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln((UnicodeString)"Inconsistent comparison(" + opt
1304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                + "): str1=" + UnicodeString(str1, len) + ", str2=" + UnicodeString(str2, len)
1305b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                + ", cmpKey=" + cmpKey + ", cmpCol=" + cmpCol);
1306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1310fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid CollationRegressionTest::TestTrailingComment() {
1311fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // ICU ticket #8070:
1312fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Check that the rule parser handles a comment without terminating end-of-line.
1313fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    IcuTestErrorCode errorCode(*this, "TestTrailingComment");
1314fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RuleBasedCollator coll(UNICODE_STRING_SIMPLE("&c<b#comment1\n<a#comment2"), errorCode);
1315fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString a((UChar)0x61), b((UChar)0x62), c((UChar)0x63);
1316fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    assertTrue("c<b", coll.compare(c, b) < 0);
1317fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    assertTrue("b<a", coll.compare(b, a) < 0);
1318fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
1319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1320fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid CollationRegressionTest::TestBeforeWithTooStrongAfter() {
1321fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // ICU ticket #9959:
1322fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Forbid rules with a before-reset followed by a stronger relation.
1323fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    IcuTestErrorCode errorCode(*this, "TestBeforeWithTooStrongAfter");
1324fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RuleBasedCollator before2(UNICODE_STRING_SIMPLE("&[before 2]x<<q<p"), errorCode);
1325fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(errorCode.isSuccess()) {
1326fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("should forbid before-2-reset followed by primary relation");
1327fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    } else {
1328fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errorCode.reset();
1329fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1330fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RuleBasedCollator before3(UNICODE_STRING_SIMPLE("&[before 3]x<<<q<<s<p"), errorCode);
1331fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(errorCode.isSuccess()) {
1332fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("should forbid before-3-reset followed by primary or secondary relation");
1333fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    } else {
1334fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errorCode.reset();
1335fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1336fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
1337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::compareArray(Collator &c,
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN],
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           int32_t testCount)
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator::EComparisonResult expectedResult = Collator::EQUAL;
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < testCount; i += 3)
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString source(tests[i]);
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString comparison(tests[i + 1]);
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString target(tests[i + 2]);
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (comparison == "<")
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedResult = Collator::LESS;
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else if (comparison == ">")
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedResult = Collator::GREATER;
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else if (comparison == "=")
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedResult = Collator::EQUAL;
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString bogus1("Bogus comparison string \"");
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString bogus2("\"");
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(bogus1 + comparison + bogus2);
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Collator::EComparisonResult compareResult = c.compare(source, target);
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CollationKey sourceKey, targetKey;
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c.getCollationKey(source, sourceKey, status);
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status))
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Couldn't get collationKey for source");
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c.getCollationKey(target, targetKey, status);
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status))
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Couldn't get collationKey for target");
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Collator::EComparisonResult keyResult = sourceKey.compareTo(targetKey);
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        reportCResult( source, target, sourceKey, targetKey, compareResult, keyResult, compareResult, expectedResult );
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::assertEqual(CollationElementIterator &i1, CollationElementIterator &i2)
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t c1, c2, count = 0;
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c1 = i1.next(status);
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c2 = i2.next(status);
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c1 != c2)
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString msg, msg1("    ");
1411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            msg += msg1 + count;
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            msg += ": strength(0x";
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            appendHex(c1, 8, msg);
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            msg += ") != strength(0x";
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            appendHex(c2, 8, msg);
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            msg += ")";
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(msg);
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 1;
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (c1 != CollationElementIterator::NULLORDER);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /* par */)
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec)
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Collation Regression Tests: ");
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1435fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(en_us == NULL) {
1436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        dataerrln("Class collator not instantiated");
1437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        name = "";
1438fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1440fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO_BEGIN;
1441fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4048446);
1442fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4051866);
1443fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4053636);
1444fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4054238);
1445fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4054734);
1446fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4054736);
1447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4058613);
1448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4059820);
1449fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4060154);
1450fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4062418);
1451fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4065540);
1452fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4066189);
1453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4066696);
1454fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4076676);
1455fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4078588);
1456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4079231);
1457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4081866);
1458fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4087241);
1459fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4087243);
1460fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4092260);
1461fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4095316);
1462fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4101940);
1463fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4103436);
1464fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4114076);
1465fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4114077);
1466fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4124632);
1467fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4132736);
1468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4133509);
1469fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4139572);
1470fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4141640);
1471fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4146160);
1472fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(Test4179216);
1473fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(TestT7189);
1474fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(TestCaseFirstCompression);
1475fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(TestTrailingComment);
1476fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO(TestBeforeWithTooStrongAfter);
1477fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE_AUTO_END;
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
1481