1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * COPYRIGHT: 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, 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" 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/sortkey.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "regcoll.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "sfwdchit.h" 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "testutil.h" 1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define ARRAY_LENGTH(array) ((int32_t)(sizeof array / sizeof array[0])) 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationRegressionTest::CollationRegressionTest() 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru en_us = (RuleBasedCollator *)Collator::createInstance(Locale::getUS(), status); 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete en_us; 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru en_us = 0; 306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Collator creation failed with %s", u_errorName(status)); 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationRegressionTest::~CollationRegressionTest() 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete en_us; 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // @bug 4048446 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// CollationElementIterator.reset() doesn't work 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4048446(/* char* par */) 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString test1 = "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?"; 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString test2 = "Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?"; 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *i1 = en_us->createCollationElementIterator(test1); 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *i2 = en_us->createCollationElementIterator(test1); 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i1 == NULL|| i2 == NULL) 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Could not create CollationElementIterator's"); 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i1; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i2; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (i1->next(status) != CollationElementIterator::NULLORDER) 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error calling next()"); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i1; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i2; 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i1->reset(); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertEqual(*i1, *i2); 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i1; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i2; 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4051866 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator -> rules -> Collator round-trip broken for expanding characters 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4051866(/* char* par */) 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator c1 = new RuleBasedCollator("< o " 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"& oe ,o\u3080" 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"& oe ,\u1530 ,O" 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"& OE ,O\u3080" 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"& OE ,\u1520" 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"< p ,P"); 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "< o "; 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "& oe ,o"; 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += (UChar)0x3080; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "& oe ,"; 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += (UChar)0x1530; 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += " ,O"; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "& OE ,O"; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += (UChar)0x3080; 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "& OE ,"; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += (UChar)0x1520; 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "< p ,P"; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Build a collator containing expanding characters 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c1 = new RuleBasedCollator(rules, status); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Build another using the rules from the first 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c2 = new RuleBasedCollator(c1->getRules(), status); 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure they're the same 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(c1->getRules() == c2->getRules())) 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Rules are not equal"); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c2; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c1; 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4053636 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator thinks "black-bird" == "black" 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4053636(/* char* par */) 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (en_us->equals("black_bird", "black")) 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("black-bird == black"); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4054238 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// CollationElementIterator will not work correctly if the associated 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator object's mode is changed 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4054238(/* char* par */) 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar chars3[] = {0x61, 0x00FC, 0x62, 0x65, 0x63, 0x6b, 0x20, 0x47, 0x72, 0x00F6, 0x00DF, 0x65, 0x20, 0x4c, 0x00FC, 0x62, 0x63, 0x6b, 0}; 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString test3(chars3); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NOTE: The Java code uses en_us to create the CollationElementIterators 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // but I'm pretty sure that's wrong, so I've changed this to use c. 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *i1 = c->createCollationElementIterator(test3); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i1; 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4054734 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::IDENTICAL documented but not implemented 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4054734(/* char* par */) 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Here's the original Java: 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] decomp = { 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u0001", "<", "\u0002", 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u0001", "=", "\u0001", 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "A\u0001", ">", "~\u0002", // Ensure A and ~ are not compared bitwise 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u00C0", "=", "A\u0300" // Decomp should make these equal 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] nodecomp = { 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u00C0", ">", "A\u0300" // A-grave vs. A combining-grave 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar decomp[][CollationRegressionTest::MAX_TOKEN_LEN] = 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0001, 0}, {0x3c, 0}, {0x0002, 0}, 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0001, 0}, {0x3d, 0}, {0x0001, 0}, 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x41, 0x0001, 0}, {0x3e, 0}, {0x7e, 0x0002, 0}, 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00c0, 0}, {0x3d, 0}, {0x41, 0x0300, 0} 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::IDENTICAL); 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, decomp, ARRAY_LENGTH(decomp)); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4054736 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Full Decomposition mode not implemented 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4054736(/* char* par */) 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::SECONDARY); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0xFB4F, 0}, {0x3d, 0}, {0x05D0, 0x05DC} // Alef-Lamed vs. Alef, Lamed 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4058613 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Collator::createInstance() causes an ArrayIndexOutofBoundsException for Korean 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4058613(/* char* par */) 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Creating a default collator doesn't work when Korean is the default 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // locale 230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale oldDefault = Locale::getDefault(); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale::setDefault(Locale::getKorean(), status); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Could not set default locale to Locale::KOREAN"); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *c = NULL; 243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = Collator::createInstance("en_US", status); 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Could not create a Korean collator"); 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale::setDefault(oldDefault, status); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Since the fix to this bug was to turn off decomposition for Korean collators, 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ensure that's what we got 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c->getAttribute(UCOL_NORMALIZATION_MODE, status) != UCOL_OFF) 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Decomposition is not set to NO_DECOMPOSITION for Korean collator"); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale::setDefault(oldDefault, status); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4059820 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator.getRules does not return the exact pattern as input 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// for expanding character sequences 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4059820(/* char* par */) 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = NULL; 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules = "< a < b , c/a < d < z"; 277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = new RuleBasedCollator(rules, status); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failure building a collator."); 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( c->getRules().indexOf("c/a") == -1) 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("returned rules do not contain 'c/a'"); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4060154 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// MergeCollation::fixEntry broken for "& H < \u0131, \u0130, i, I" 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4060154(/* char* par */) 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules; 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += "< g, G < h, H < i, I < j, J"; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += " & H < "; 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += (UChar)0x0131; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += ", "; 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += (UChar)0x0130; 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules += ", i, I"; 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = NULL; 312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = new RuleBasedCollator(rules, status); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("failure building collator."); 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] tertiary = { 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "A", "<", "B", 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "H", "<", "\u0131", 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "H", "<", "I", 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u0131", "<", "\u0130", 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u0130", "<", "i", 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u0130", ">", "H", 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tertiary[][CollationRegressionTest::MAX_TOKEN_LEN] = 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x41, 0}, {0x3c, 0}, {0x42, 0}, 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x48, 0}, {0x3c, 0}, {0x0131, 0}, 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x48, 0}, {0x3c, 0}, {0x49, 0}, 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0131, 0}, {0x3c, 0}, {0x0130, 0}, 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0130, 0}, {0x3c, 0}, {0x69, 0}, 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0130, 0}, {0x3e, 0}, {0x48, 0} 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tertiary, ARRAY_LENGTH(tertiary)); 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] secondary = { 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "H", "<", "I", 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u0131", "=", "\u0130", 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar secondary[][CollationRegressionTest::MAX_TOKEN_LEN] = 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x48, 0}, {0x3c, 0}, {0x49, 0}, 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0131, 0}, {0x3d, 0}, {0x0130, 0} 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::PRIMARY); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, secondary, ARRAY_LENGTH(secondary)); 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4062418 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Secondary/Tertiary comparison incorrect in French Secondary 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4062418(/* char* par */) 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = NULL; 375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 37627f654740f2a26ad62a5c155af9199af9e69b889claireho c = (RuleBasedCollator *) Collator::createInstance(Locale::getCanadaFrench(), status); 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 38027f654740f2a26ad62a5c155af9199af9e69b889claireho errln("Failed to create collator for Locale::getCanadaFrench()"); 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::SECONDARY); 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] tests = { 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "p\u00eache", "<", "p\u00e9ch\u00e9", // Comparing accents from end, p\u00e9ch\u00e9 is greater 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x70, 0x00EA, 0x63, 0x68, 0x65, 0}, {0x3c, 0}, {0x70, 0x00E9, 0x63, 0x68, 0x00E9, 0} 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4065540 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::compare() method broken if either string contains spaces 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4065540(/* char* par */) 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (en_us->compare("abcd e", "abcd f") == 0) 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("'abcd e' == 'abcd f'"); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4066189 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Unicode characters need to be recursively decomposed to get the 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// correct result. For example, 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// u1EB1 -> \u0103 + \u0300 -> a + \u0306 + \u0300. 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4066189(/* char* par */) 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar chars1[] = {0x1EB1, 0}; 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar chars2[] = {0x61, 0x0306, 0x0300, 0}; 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString test1(chars1); 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString test2(chars2); 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NOTE: The java code used en_us to create the 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // CollationElementIterator's. I'm pretty sure that 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // was wrong, so I've change the code to use c1 and c2 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c1 = (RuleBasedCollator *) en_us->clone(); 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *i1 = c1->createCollationElementIterator(test1); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c2 = (RuleBasedCollator *) en_us->clone(); 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status); 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *i2 = c2->createCollationElementIterator(test2); 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertEqual(*i1, *i2); 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i2; 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c2; 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i1; 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c1; 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4066696 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// French secondary collation checking at the end of compare iteration fails 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4066696(/* char* par */) 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = NULL; 455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 45627f654740f2a26ad62a5c155af9199af9e69b889claireho c = (RuleBasedCollator *)Collator::createInstance(Locale::getCanadaFrench(), status); 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 46027f654740f2a26ad62a5c155af9199af9e69b889claireho errln("Failure creating collator for Locale::getCanadaFrench()"); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::SECONDARY); 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] tests = { 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u00e0", "<", "\u01fa", // a-grave < A-ring-acute 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru should be: 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String[] tests = { 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\u00e0", ">", "\u01fa", // a-grave < A-ring-acute 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00E0, 0}, {0x3e, 0}, {0x01FA, 0} 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4076676 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Bad canonicalization of same-class combining characters 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4076676(/* char* par */) 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // These combining characters are all in the same class, so they should not 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // be reordered, and they should compare as unequal. 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar s1[] = {0x41, 0x0301, 0x0302, 0x0300, 0}; 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar s2[] = {0x41, 0x0302, 0x0300, 0x0301, 0}; 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c->compare(s1,s2) == 0) 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Same-class combining chars were reordered"); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4079231 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator::operator==(NULL) throws NullPointerException 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4079231(/* char* par */) 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // I don't think there's any way to write this test 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // in C++. The following is equivalent to the Java, 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // but doesn't compile 'cause NULL can't be converted 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to Collator& 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // if (en_us->operator==(NULL)) 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // { 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // errln("en_us->operator==(NULL) returned TRUE"); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // } 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru try { 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (en_us->equals(null)) { 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("en_us->equals(null) returned true"); 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru catch (Exception e) { 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("en_us->equals(null) threw " + e.toString()); 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4078588 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator breaks on "< a < bb" rule 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4078588(/* char *par */) 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *rbc = new RuleBasedCollator((UnicodeString)"< a < bb", status); 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rbc == NULL || U_FAILURE(status)) 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create RuleBasedCollator."); 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete rbc; 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult result = rbc->compare("a","bb"); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != Collator::LESS) 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"Compare(a,bb) returned " + (int)result 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + (UnicodeString)"; expected -1"); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete rbc; 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4081866 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Combining characters in different classes not reordered properly. 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4081866(/* char* par */) 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // These combining characters are all in different classes, 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // so they should be reordered and the strings should compare as equal. 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar s1[] = {0x41, 0x0300, 0x0316, 0x0327, 0x0315, 0}; 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar s2[] = {0x41, 0x0327, 0x0316, 0x0315, 0x0300, 0}; 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 581b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Now that the default collators are set to NO_DECOMPOSITION 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (as a result of fixing bug 4114077), we must set it explicitly 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // when we're testing reordering behavior. -- lwerner, 5/5/98 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c->compare(s1,s2) != 0) 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Combining chars were not reordered"); 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4087241 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// string comparison errors in Scandinavian collators 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4087241(/* char* par */) 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale da_DK("da", "DK"); 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = NULL; 604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (RuleBasedCollator *) Collator::createInstance(da_DK, status); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create collator for da_DK locale"); 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::SECONDARY); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x7a, 0}, {0x3c, 0}, {0x00E6, 0}, // z < ae 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x61, 0x0308, 0}, {0x3c, 0}, {0x61, 0x030A, 0}, // a-unlaut < a-ring 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x59, 0}, {0x3c, 0}, {0x75, 0x0308, 0}, // Y < u-umlaut 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4087243 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// CollationKey takes ignorable strings into account when it shouldn't 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4087243(/* char* par */) 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x31, 0x32, 0x33, 0}, {0x3d, 0}, {0x31, 0x32, 0x33, 0x0001, 0} // 1 2 3 = 1 2 3 ctrl-A 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4092260 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Mu/micro conflict 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Micro symbol and greek lowercase letter Mu should sort identically 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4092260(/* char* par */) 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale el("el", ""); 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *c = NULL; 657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = Collator::createInstance(el, status); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create collator for el locale."); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // These now have tertiary differences in UCA 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, status); 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00B5, 0}, {0x3d, 0}, {0x03BC, 0} 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4095316 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4095316(/* char* par */) 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale el_GR("el", "GR"); 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *c = Collator::createInstance(el_GR, status); 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create collator for el_GR locale"); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // These now have tertiary differences in UCA 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //c->setStrength(Collator::TERTIARY); 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, status); 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x03D4, 0}, {0x3d, 0}, {0x03AB, 0} 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4101940 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4101940(/* char* par */) 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = NULL; 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules = "< a < b"; 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString nothing = ""; 716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = new RuleBasedCollator(rules, status); 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create RuleBasedCollator"); 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *i = c->createCollationElementIterator(nothing); 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i->reset(); 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i->next(status) != CollationElementIterator::NULLORDER) 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("next did not return NULLORDER"); 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete i; 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4103436 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::compare not handling spaces properly 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4103436(/* char* par */) 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] = 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x66, 0x69, 0x6c, 0x65, 0}, {0x3c, 0}, {0x66, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0}, 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x66, 0x69, 0x6c, 0x65, 0}, {0x3c, 0}, {0x66, 0x69, 0x6c, 0x65, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0} 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, tests, ARRAY_LENGTH(tests)); 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4114076 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collation not Unicode conformant with Hangul syllables 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4114076(/* char* par */) 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // With Canonical decomposition, Hangul syllables should get decomposed 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // into Jamo, but Jamo characters should not be decomposed into 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // conjoining Jamo 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] = 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0xd4db, 0}, {0x3d, 0}, {0x1111, 0x1171, 0x11b6, 0} 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, test1, ARRAY_LENGTH(test1)); 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // From UTR #15: 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // *In earlier versions of Unicode, jamo characters like ksf 783b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // had compatibility mappings to kf + sf. These mappings were 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // removed in Unicode 2.1.9 to ensure that Hangul syllables are maintained.) 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // That is, the following test is obsolete as of 2.1.9 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- // With Full decomposition, it should go all the way down to 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- // conjoining Jamo characters. 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- // 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- static const UChar test2[][CollationRegressionTest::MAX_TOKEN_LEN] = 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- { 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- {0xd4db, 0}, {0x3d, 0}, {0x1111, 0x116e, 0x1175, 0x11af, 0x11c2, 0} 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- }; 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- c->setDecomposition(Normalizer::DECOMP_COMPAT); 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//obsolete- compareArray(*c, test2, ARRAY_LENGTH(test2)); 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4124632 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator::getCollationKey was hanging on certain character sequences 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4124632(/* char* par */) 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *coll = NULL; 810b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = Collator::createInstance(Locale::getJapan(), status); 812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (coll == NULL || U_FAILURE(status)) 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create collator for Locale::JAPAN"); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete coll; 817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar test[] = {0x41, 0x0308, 0x62, 0x63, 0}; 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationKey key; 822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll->getCollationKey(test, key, status); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (key.isBogus() || U_FAILURE(status)) 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("CollationKey creation failed."); 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete coll; 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4132736 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// sort order of french words with multiple accents has errors 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4132736(/* char* par */) 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *c = NULL; 842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 84327f654740f2a26ad62a5c155af9199af9e69b889claireho c = Collator::createInstance(Locale::getCanadaFrench(), status); 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 84827f654740f2a26ad62a5c155af9199af9e69b889claireho errln("Failed to create a collator for Locale::getCanadaFrench()"); 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 850c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] = 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x65, 0x0300, 0x65, 0x0301, 0}, {0x3c, 0}, {0x65, 0x0301, 0x65, 0x0300, 0}, 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x65, 0x0300, 0x0301, 0}, {0x3c, 0}, {0x65, 0x0301, 0x0300, 0} 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, test1, ARRAY_LENGTH(test1)); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4133509 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// The sorting using java.text.CollationKey is not in the exact order 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4133509(/* char* par */) 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] = 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 872b13da9df870a61b11249bf741347908dbea0edd8Jean-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}, 873b13da9df870a61b11249bf741347908dbea0edd8Jean-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}, 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0}, {0x3c, 0}, {0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0} 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*en_us, test1, ARRAY_LENGTH(test1)); 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4114077 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Collation with decomposition off doesn't work for Europe 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4114077(/* char* par */) 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ensure that we get the same results with decomposition off 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as we do with it on.... 888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator *c = (RuleBasedCollator *) en_us->clone(); 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setStrength(Collator::TERTIARY); 892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar test1[][CollationRegressionTest::MAX_TOKEN_LEN] = 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00C0, 0}, {0x3d, 0}, {0x41, 0x0300, 0}, // Should be equivalent 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x70, 0x00ea, 0x63, 0x68, 0x65, 0}, {0x3e, 0}, {0x70, 0x00e9, 0x63, 0x68, 0x00e9, 0}, 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0204, 0}, {0x3d, 0}, {0x45, 0x030F, 0}, 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x01fa, 0}, {0x3d, 0}, {0x41, 0x030a, 0x0301, 0}, // a-ring-acute -> a-ring, acute 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // -> a, ring, acute 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x41, 0x0300, 0x0316, 0}, {0x3c, 0}, {0x41, 0x0316, 0x0300, 0} // No reordering --> unequal 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status); 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, test1, ARRAY_LENGTH(test1)); 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar test2[][CollationRegressionTest::MAX_TOKEN_LEN] = 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x41, 0x0300, 0x0316, 0}, {0x3d, 0}, {0x41, 0x0316, 0x0300, 0} // Reordering --> equal 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareArray(*c, test2, ARRAY_LENGTH(test2)); 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4141640 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Support for Swedish gone in 1.1.6 (Can't create Swedish collator) 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4141640(/* char* par */) 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Rather than just creating a Swedish collator, we might as well 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try to instantiate one for every locale available on the system 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // in order to prevent this sort of bug from cropping up in the future 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, localeCount; 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale *locales = Locale::getAvailableLocales(localeCount); 931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < localeCount; i += 1) 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *c = NULL; 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = Collator::createInstance(locales[i], status); 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == NULL || U_FAILURE(status)) 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg, localeName; 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg += "Could not create collator for locale "; 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg += locales[i].getName(); 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4139572 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// getCollationKey throws exception for spanish text 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Cannot reproduce this bug on 1.2, however it DOES fail on 1.1.6 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4139572(/* char* par */) 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Code pasted straight from the bug report 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (and then translated to C++ ;-) 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // create spanish locale and collator 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale l("es", "es"); 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *col = NULL; 968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = Collator::createInstance(l, status); 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (col == NULL || U_FAILURE(status)) 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create a collator for es_es locale."); 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete col; 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationKey key; 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // this spanish phrase kills it! 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col->getCollationKey("Nombre De Objeto", key, status); 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (key.isBogus() || U_FAILURE(status)) 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Error creating CollationKey for \"Nombre De Ojbeto\""); 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete col; 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* HSYS : RuleBasedCollator::compare() performance enhancements 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compare() does not create CollationElementIterator() anymore.*/ 992b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass My4146160Collator : public RuleBasedCollator 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru My4146160Collator(RuleBasedCollator &rbc, UErrorCode &status); 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ~My4146160Collator(); 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *createCollationElementIterator(const UnicodeString &text) const; 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationElementIterator *createCollationElementIterator(const CharacterIterator &text) const; 1002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static int32_t count; 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t My4146160Collator::count = 0; 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMy4146160Collator::My4146160Collator(RuleBasedCollator &rbc, UErrorCode &status) 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : RuleBasedCollator(rbc.getRules(), status) 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMy4146160Collator::~My4146160Collator() 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationElementIterator *My4146160Collator::createCollationElementIterator(const UnicodeString &text) const 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count += 1; 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return RuleBasedCollator::createCollationElementIterator(text); 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollationElementIterator *My4146160Collator::createCollationElementIterator(const CharacterIterator &text) const 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count += 1; 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return RuleBasedCollator::createCollationElementIterator(text); 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// @bug 4146160 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RuleBasedCollator doesn't use createCollationElementIterator internally 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::Test4146160(/* char* par */) 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use a custom collator class whose createCollationElementIterator 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // methods increment a count.... 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationKey key; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru My4146160Collator::count = 0; 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru My4146160Collator *mc = NULL; 1045b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mc = new My4146160Collator(*en_us, status); 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (mc == NULL || U_FAILURE(status)) 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to create a My4146160Collator."); 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete mc; 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mc->getCollationKey("1", key, status); 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (key.isBogus() || U_FAILURE(status)) 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failure to get a CollationKey from a My4146160Collator."); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete mc; 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (My4146160Collator::count < 1) 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("My4146160Collator::createCollationElementIterator not called for getCollationKey"); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru My4146160Collator::count = 0; 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mc->compare("1", "2"); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (My4146160Collator::count < 1) 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("My4146160Collator::createtCollationElementIterator not called for compare"); 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete mc; 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 108050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 108150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Ticket 7189 108250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 108350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// nextSortKeyPart incorrect for EO_S1 collation 108427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t calcKeyIncremental(UCollator *coll, const UChar* text, int32_t len, uint8_t *keyBuf, int32_t /*keyBufLen*/, UErrorCode& status) { 108550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UCharIterator uiter; 108650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uint32_t state[2] = { 0, 0 }; 108750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t keyLen; 108850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t count = 8; 108950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 109050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uiter_setString(&uiter, text, len); 109150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho keyLen = 0; 109250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho while (TRUE) { 109350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t keyPartLen = ucol_nextSortKeyPart(coll, &uiter, state, &keyBuf[keyLen], count, &status); 109450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 109550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return -1; 109650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 109750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (keyPartLen == 0) { 109850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 109950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 110050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho keyLen += keyPartLen; 110150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 110250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return keyLen; 110350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 110450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 110550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid CollationRegressionTest::TestT7189() { 110650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 110750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UCollator *coll; 110850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uint32_t i; 110950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 111050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar text1[][CollationRegressionTest::MAX_TOKEN_LEN] = { 111150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // "Achter De Hoven" 111250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x41, 0x63, 0x68, 0x74, 0x65, 0x72, 0x20, 0x44, 0x65, 0x20, 0x48, 0x6F, 0x76, 0x65, 0x6E, 0x00 }, 111350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // "ABC" 111450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x41, 0x42, 0x43, 0x00 }, 111550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // "HELLO world!" 111650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00 } 111750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 111850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 111950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar text2[][CollationRegressionTest::MAX_TOKEN_LEN] = { 112050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // "Achter de Hoven" 112150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x41, 0x63, 0x68, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x20, 0x48, 0x6F, 0x76, 0x65, 0x6E, 0x00 }, 112250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // "abc" 112350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x61, 0x62, 0x63, 0x00 }, 112450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // "hello world!" 112550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00 } 112650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 112750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 112850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Open the collator 112950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho coll = ucol_openFromShortString("EO_S1", FALSE, NULL, &status); 113050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 113150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("Failed to create a collator for short string EO_S1"); 113250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 113350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 113450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 113550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i = 0; i < sizeof(text1) / (CollationRegressionTest::MAX_TOKEN_LEN * sizeof(UChar)); i++) { 113650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uint8_t key1[100], key2[100]; 113750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t len1, len2; 113850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 113950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho len1 = calcKeyIncremental(coll, text1[i], -1, key1, sizeof(key1), status); 114050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 114150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln(UnicodeString("Failed to get a partial collation key for ") + text1[i]); 114250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 114350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 114450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho len2 = calcKeyIncremental(coll, text2[i], -1, key2, sizeof(key2), status); 114550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 114650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln(UnicodeString("Failed to get a partial collation key for ") + text2[i]); 114750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 114850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 114950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 115050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (len1 == len2 && uprv_memcmp(key1, key2, len1) == 0) { 115150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln(UnicodeString("Failed: Identical key\n") + " text1: " + text1[i] + "\n" + " text2: " + text2[i] + "\n" + " key : " + TestUtility::hex(key1, len1)); 115250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 115350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho logln(UnicodeString("Keys produced -\n") + " text1: " + text1[i] + "\n" + " key1 : " + TestUtility::hex(key1, len1) + "\n" + " text2: " + text2[i] + "\n" + " key2 : " 115450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho + TestUtility::hex(key2, len2)); 115550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 115650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 115750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucol_close(coll); 115850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 115950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid CollationRegressionTest::TestCaseFirstCompression() { 1161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho RuleBasedCollator *col = (RuleBasedCollator *) en_us->clone(); 1162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 1163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // default 1165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho caseFirstCompressionSub(col, "default"); 1166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Upper first 1168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho col->setAttribute(UCOL_CASE_FIRST, UCOL_UPPER_FIRST, status); 1169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 1170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Failed to set UCOL_UPPER_FIRST"); 1171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho caseFirstCompressionSub(col, "upper first"); 1174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Lower first 1176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho col->setAttribute(UCOL_CASE_FIRST, UCOL_LOWER_FIRST, status); 1177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 1178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Failed to set UCOL_LOWER_FIRST"); 1179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho caseFirstCompressionSub(col, "lower first"); 1182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete col; 1184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid CollationRegressionTest::caseFirstCompressionSub(Collator *col, UnicodeString opt) { 1187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const int32_t maxLength = 50; 1188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar str1[maxLength]; 1190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar str2[maxLength]; 1191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho CollationKey key1, key2; 1193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int32_t len = 1; len <= maxLength; len++) { 1195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t i = 0; 1196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (; i < len - 1; i++) { 1197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho str1[i] = str2[i] = (UChar)0x61; // 'a' 1198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho str1[i] = (UChar)0x41; // 'A' 1200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho str2[i] = (UChar)0x61; // 'a' 1201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 1203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho col->getCollationKey(str1, len, key1, status); 1204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho col->getCollationKey(str2, len, key2, status); 1205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollationResult cmpKey = key1.compareTo(key2, status); 1207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollationResult cmpCol = col->compare(str1, len, str2, len, status); 1208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 1210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Error in caseFirstCompressionSub"); 1211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (cmpKey != cmpCol) { 1212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln((UnicodeString)"Inconsistent comparison(" + opt 1213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho + "): str1=" + UnicodeString(str1, len) + ", str2=" + UnicodeString(str2, len) 1214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho + ", cmpKey=" + cmpKey + ", cmpCol=" + cmpCol); 1215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::compareArray(Collator &c, 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN], 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t testCount) 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult expectedResult = Collator::EQUAL; 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < testCount; i += 3) 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source(tests[i]); 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString comparison(tests[i + 1]); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target(tests[i + 2]); 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (comparison == "<") 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedResult = Collator::LESS; 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (comparison == ">") 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedResult = Collator::GREATER; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (comparison == "=") 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedResult = Collator::EQUAL; 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString bogus1("Bogus comparison string \""); 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString bogus2("\""); 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(bogus1 + comparison + bogus2); 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult compareResult = c.compare(source, target); 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationKey sourceKey, targetKey; 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c.getCollationKey(source, sourceKey, status); 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Couldn't get collationKey for source"); 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c.getCollationKey(target, targetKey, status); 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Couldn't get collationKey for target"); 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult keyResult = sourceKey.compareTo(targetKey); 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportCResult( source, target, sourceKey, targetKey, compareResult, keyResult, compareResult, expectedResult ); 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::assertEqual(CollationElementIterator &i1, CollationElementIterator &i2) 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t c1, c2, count = 0; 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1 = i1.next(status); 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2 = i2.next(status); 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c1 != c2) 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg, msg1(" "); 1294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg += msg1 + count; 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg += ": strength(0x"; 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(c1, 8, msg); 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg += ") != strength(0x"; 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(c2, 8, msg); 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg += ")"; 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count += 1; 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (c1 != CollationElementIterator::NULLORDER); 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CollationRegressionTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /* par */) 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Collation Regression Tests: "); 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(en_us) { 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: name = "Test4048446"; if (exec) Test4048446(/* par */); break; 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: name = "Test4051866"; if (exec) Test4051866(/* par */); break; 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 2: name = "Test4053636"; if (exec) Test4053636(/* par */); break; 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 3: name = "Test4054238"; if (exec) Test4054238(/* par */); break; 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 4: name = "Test4054734"; if (exec) Test4054734(/* par */); break; 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 5: name = "Test4054736"; if (exec) Test4054736(/* par */); break; 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 6: name = "Test4058613"; if (exec) Test4058613(/* par */); break; 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 7: name = "Test4059820"; if (exec) Test4059820(/* par */); break; 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 8: name = "Test4060154"; if (exec) Test4060154(/* par */); break; 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 9: name = "Test4062418"; if (exec) Test4062418(/* par */); break; 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 10: name = "Test4065540"; if (exec) Test4065540(/* par */); break; 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 11: name = "Test4066189"; if (exec) Test4066189(/* par */); break; 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 12: name = "Test4066696"; if (exec) Test4066696(/* par */); break; 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 13: name = "Test4076676"; if (exec) Test4076676(/* par */); break; 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 14: name = "Test4078588"; if (exec) Test4078588(/* par */); break; 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 15: name = "Test4079231"; if (exec) Test4079231(/* par */); break; 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 16: name = "Test4081866"; if (exec) Test4081866(/* par */); break; 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 17: name = "Test4087241"; if (exec) Test4087241(/* par */); break; 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 18: name = "Test4087243"; if (exec) Test4087243(/* par */); break; 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 19: name = "Test4092260"; if (exec) Test4092260(/* par */); break; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 20: name = "Test4095316"; if (exec) Test4095316(/* par */); break; 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 21: name = "Test4101940"; if (exec) Test4101940(/* par */); break; 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 22: name = "Test4103436"; if (exec) Test4103436(/* par */); break; 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 23: name = "Test4114076"; if (exec) Test4114076(/* par */); break; 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 24: name = "Test4114077"; if (exec) Test4114077(/* par */); break; 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 25: name = "Test4124632"; if (exec) Test4124632(/* par */); break; 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 26: name = "Test4132736"; if (exec) Test4132736(/* par */); break; 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 27: name = "Test4133509"; if (exec) Test4133509(/* par */); break; 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 28: name = "Test4139572"; if (exec) Test4139572(/* par */); break; 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 29: name = "Test4141640"; if (exec) Test4141640(/* par */); break; 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 30: name = "Test4146160"; if (exec) Test4146160(/* par */); break; 1352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho case 31: name = "TestT7189"; if (exec) TestT7189(); break; 1353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho case 32: name = "TestCaseFirstCompression"; if (exec) TestCaseFirstCompression(); break; 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 13576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Class collator not instantiated"); 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = ""; 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 1363