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