1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-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/** 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTestCollator is the medium level test class for everything in the directory "collate". 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*********************************************************************** 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification history 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 02/14/2001 synwee Compare with cintltst and commented away tests 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* that are not run. 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru***********************************************************************/ 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/localpointer.h" 23fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/sortkey.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "encoll.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "frcoll.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "decoll.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "escoll.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ficoll.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "jacoll.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "trcoll.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "allcoll.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "g7coll.h" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "mnkytst.h" 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "apicoll.h" 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "regcoll.h" 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "currcoll.h" 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itercoll.h" 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tstnorm.h" 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "normconf.h" 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "thcoll.h" 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "srchtest.h" 45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "ssearch.h" 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "lcukocol.h" 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucaconf.h" 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "svccoll.h" 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "alphaindextst.h" 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// Set to 1 to test offsets in backAndForth() 53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define TEST_OFFSETS 0 54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 55fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusextern IntlTest *createCollationTest(); 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestCollator::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) { 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("TestSuite Collator: "); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 63fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_BEGIN; 64fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationEnglishTest); 65fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationFrenchTest); 66fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationGermanTest); 67fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationSpanishTest); 68fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationKanaTest); 69fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationTurkishTest); 70fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationDummyTest); 71fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(G7CollationTest); 72fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationMonkeyTest); 73fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationAPITest); 74fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationRegressionTest); 75fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationCurrencyTest); 76fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationIteratorTest); 77fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationThaiTest); 78fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(LotusCollationKoreanTest); 79fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(StringSearchTest); 80fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(UCAConformanceTest); 81fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationServiceTest); 82fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(CollationFinnishTest); // removed by weiv - we have changed Finnish collation 83fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(SSearchTest); 84fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_NORMALIZATION 85fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CLASS(AlphabeticIndexTest); 8683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif 87fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_CREATE_CLASS(CollationTest); 88fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TESTCASE_AUTO_END; 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCollationResult 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestCollator::compareUsingPartials(UCollator *coll, const UChar source[], int32_t sLen, const UChar target[], int32_t tLen, int32_t pieceSize, UErrorCode &status) { 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t partialSKResult = 0; 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t sBuf[512], tBuf[512]; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator sIter, tIter; 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t sState[2], tState[2]; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sSize = pieceSize, tSize = pieceSize; 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sState[0] = 0; sState[1] = 0; 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tState[0] = 0; tState[1] = 0; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(sSize == pieceSize && tSize == pieceSize && partialSKResult == 0) { 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&sIter, source, sLen); 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&tIter, target, tLen); 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sSize = ucol_nextSortKeyPart(coll, &sIter, sState, sBuf, pieceSize, &status); 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tSize = ucol_nextSortKeyPart(coll, &tIter, tState, tBuf, pieceSize, &status); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sState[0] != 0 || tState[0] != 0) { 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("State != 0 : %08X %08X\n", sState[0], tState[0]); 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("%i ", i++); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru partialSKResult = memcmp(sBuf, tBuf, pieceSize); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(partialSKResult < 0) { 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_LESS; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(partialSKResult > 0) { 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_GREATER; 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_EQUAL; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestCollator::doTestVariant(Collator* col, const UnicodeString &source, const UnicodeString &target, Collator::EComparisonResult result) 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 130fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius UCollator *myCollation = col->toUCollator(); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult compareResult = col->compare(source, target); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationKey srckey, tgtkey; 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col->getCollationKey(source, srckey, status); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col->getCollationKey(target, tgtkey, status); 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)){ 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Creation of collation keys failed\n"); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult keyResult = srckey.compareTo(tgtkey); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportCResult(source, target, srckey, tgtkey, compareResult, keyResult, result, result); 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue norm = ucol_getAttribute(myCollation, UCOL_NORMALIZATION_MODE, &status); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sLen = source.length(), tLen = target.length(); 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* src = source.getBuffer(); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* trg = target.getBuffer(); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult compareResultIter = (UCollationResult)result; 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator sIter, tIter; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&sIter, src, sLen); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&tIter, trg, tLen); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareResultIter = ucol_strcollIter(myCollation, &sIter, &tIter, &status); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(compareResultIter != (UCollationResult)result) { 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Different result for iterative comparison "+source+" "+target); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* convert the strings to UTF-8 and do try comparing with char iterator */ 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!quick) { /*!QUICK*/ 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char utf8Source[256], utf8Target[256]; 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t utf8SourceLen = 0, utf8TargetLen = 0; 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(utf8Source, 256, &utf8SourceLen, src, sLen, &status); 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { /* probably buffer is not big enough */ 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("Src UTF-8 buffer too small! Will not compare!\n"); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(utf8Target, 256, &utf8TargetLen, trg, tLen, &status); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { /* probably buffer is not big enough */ 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult compareResultUTF8 = (UCollationResult)result, compareResultUTF8Norm = (UCollationResult)result; 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator sIter, tIter; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("Strings converted to UTF-8:%s, %s\n", aescstrdup(source,-1), aescstrdup(target,-1));*/ 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&sIter, utf8Source, utf8SourceLen); 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&tIter, utf8Target, utf8TargetLen); 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*uiter_setString(&sIter, source, sLen); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&tIter, target, tLen);*/ 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareResultUTF8 = ucol_strcollIter(myCollation, &sIter, &tIter, &status); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sIter.move(&sIter, 0, UITER_START); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tIter.move(&tIter, 0, UITER_START); 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru compareResultUTF8Norm = ucol_strcollIter(myCollation, &sIter, &tIter, &status); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, norm, &status); 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(compareResultUTF8 != compareResultIter) { 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("different results in iterative comparison for UTF-16 and UTF-8 encoded strings. "+source+", "+target); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(compareResultUTF8 != compareResultUTF8Norm) { 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("different results in iterative when normalization is turned on with UTF-8 strings. "+source+", "+target); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("Target UTF-8 buffer too small! Did not compare!\n"); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("UTF-8 strcoll failed! Ignoring result\n"); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* testing the partial sortkeys */ 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /*!QUICK*/ 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t partialSizes[] = { 3, 1, 2, 4, 8, 20, 80 }; /* just size 3 in the quick mode */ 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t partialSizesSize = 1; 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!quick) { 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru partialSizesSize = 7; 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("partial sortkey test piecesize="); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < partialSizesSize; i++) { 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult partialSKResult = (UCollationResult)result, partialNormalizedSKResult = (UCollationResult)result; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("%i ", partialSizes[i]); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru partialSKResult = compareUsingPartials(myCollation, src, sLen, trg, tLen, partialSizes[i], status); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(partialSKResult != (UCollationResult)result) { 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Partial sortkey comparison returned wrong result: "+source+", "+target+" (size "+partialSizes[i]+")"); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(norm != UCOL_ON && !quick) { 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("N "); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru partialNormalizedSKResult = compareUsingPartials(myCollation, src, sLen, trg, tLen, partialSizes[i], status); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, norm, &status); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(partialSKResult != partialNormalizedSKResult) { 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Partial sortkey comparison gets different result when normalization is on: "+source+", "+target+" (size "+partialSizes[i]+")"); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("\n"); 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (compareResult != result) { 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("String comparison failed in variant test\n"); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (keyResult != result) { 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Collation key comparison failed in variant test\n"); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestCollator::doTest(Collator* col, const UChar *source, const UChar *target, Collator::EComparisonResult result) { 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, UnicodeString(source), UnicodeString(target), result); 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestCollator::doTest(Collator* col, const UnicodeString &source, const UnicodeString &target, Collator::EComparisonResult result) 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(col) { 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTestVariant(col, source, target, result); 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result == Collator::LESS) { 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTestVariant(col, target, source, Collator::GREATER); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (result == Collator::GREATER) { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTestVariant(col, target, source, Collator::LESS); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalPointer<CollationElementIterator> c(((RuleBasedCollator *)col)->createCollationElementIterator(source)); 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing iterating source: "+source); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backAndForth(*c); 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->setText(target, status); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing iterating target: "+target); 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backAndForth(*c); 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// used for collation result reporting, defined here for convenience 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// (maybe moved later) 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestCollator::reportCResult( const UnicodeString &source, const UnicodeString &target, 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationKey &sourceKey, CollationKey &targetKey, 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult compareResult, 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult keyResult, 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult incResult, 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult expectedResult ) 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (expectedResult < -1 || expectedResult > 1) 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("***** invalid call to reportCResult ****"); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool ok1 = (compareResult == expectedResult); 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool ok2 = (keyResult == expectedResult); 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool ok3 = (incResult == expectedResult); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok1 && ok2 && ok3 && !verbose) { 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Keep non-verbose, passing tests fast 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg1(ok1 ? "Ok: compare(" : "FAIL: compare("); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg2(", "), msg3(") returned "), msg4("; expected "); 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString prettySource, prettyTarget, sExpect, sResult; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::prettify(source, prettySource); 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::prettify(target, prettyTarget); 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendCompareResult(compareResult, sResult); 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendCompareResult(expectedResult, sExpect); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok1) { 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult); 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult + msg4 + sExpect); 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg1 = UnicodeString(ok2 ? "Ok: key(" : "FAIL: key("); 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg2 = ").compareTo(key("; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg3 = ")) returned "; 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendCompareResult(keyResult, sResult); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok2) { 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult); 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult + msg4 + sExpect); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg1 = " "; 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg2 = " vs. "; 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prettify(sourceKey, prettySource); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prettify(targetKey, prettyTarget); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg1 + prettySource + msg2 + prettyTarget); 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg1 = UnicodeString (ok3 ? "Ok: incCompare(" : "FAIL: incCompare("); 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg2 = ", "; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg3 = ") returned "; 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendCompareResult(incResult, sResult); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok3) { 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult + msg4 + sExpect); 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestCollator::appendCompareResult(Collator::EComparisonResult result, 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& target) 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result == Collator::LESS) 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "LESS"; 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (result == Collator::EQUAL) 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "EQUAL"; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (result == Collator::GREATER) 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "GREATER"; 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString huh = "?"; 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += (huh + (int32_t)result); 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return target; 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Produce a printable representation of a CollationKey 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString &IntlTestCollator::prettify(const CollationKey &source, UnicodeString &target) 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, byteCount; 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint8_t *bytes = source.getByteArray(byteCount); 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.remove(); 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "["; 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < byteCount; i += 1) 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 37550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (i != 0) { 37650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho target += " "; 37750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(bytes[i], 2, target); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "]"; 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return target; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestCollator::backAndForth(CollationElementIterator &iter) 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Run through the iterator forwards and stick it into an array 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t orderLength = 0; 39050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalArray<Order> orders(getOrders(iter, orderLength)); 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Now go through it backwards and make sure we get the same values 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t index = orderLength; 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t o; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // reset the iterator 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.reset(); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((o = iter.previous(status)) != CollationElementIterator::NULLORDER) 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*int32_t offset = */iter.getOffset(); 403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (index == 0) { 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(o == 0) { 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { // this is an error, orders exhausted but there are non-ignorable CEs from 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // going backwards 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Backward iteration returned a non ignorable after orders are exhausted"); 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru index -= 1; 415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (o != orders[index].order) { 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (o == 0) 417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru index += 1; 418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru while (index > 0 && orders[--index].order == 0) { 420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // nothing... 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (o != orders[index].order) { 424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("Mismatched order at index %d: 0x%0:8X vs. 0x%0:8X", index, 425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru orders[index].order, o); 426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru //break; 42750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if TEST_OFFSETS 433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (offset != orders[index].offset) { 434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("Mismatched offset at index %d: %d vs. %d", index, 435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru orders[index].offset, offset); 436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru //break; 43750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru while (index != 0 && orders[index - 1].order == 0) 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index --; 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (index != 0) 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg("Didn't get back to beginning - index is "); 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg + index); 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.reset(); 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err("next: "); 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((o = iter.next(status)) != CollationElementIterator::NULLORDER) 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString hexString("0x"); 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(o, 8, hexString); 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hexString += " "; 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err(hexString); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(""); 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err("prev: "); 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((o = iter.previous(status)) != CollationElementIterator::NULLORDER) 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString hexString("0x"); 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(o, 8, hexString); 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hexString += " "; 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err(hexString); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(""); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return an integer array containing all of the collation orders 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * returned by calls to next on the specified iterator 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruIntlTestCollator::Order *IntlTestCollator::getOrders(CollationElementIterator &iter, int32_t &orderLength) 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxSize = 100; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t size = 0; 48750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalArray<Order> orders(new Order[maxSize]); 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t offset = iter.getOffset(); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t order; 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((order = iter.next(status)) != CollationElementIterator::NULLORDER) 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (size == maxSize) 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxSize *= 2; 497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Order *temp = new Order[maxSize]; 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_memcpy(temp, orders.getAlias(), size * sizeof(Order)); 50050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho orders.adoptInstead(temp); 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru orders[size].order = order; 504c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru orders[size].offset = offset; 505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru offset = iter.getOffset(); 507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru size += 1; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (U_FAILURE(status)) { 510fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius errln("CollationElementIterator.next() failed - %s", 511fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius u_errorName(status)); 512fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxSize > size) 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 516c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Order *temp = new Order[size]; 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_memcpy(temp, orders.getAlias(), size * sizeof(Order)); 51950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho orders.adoptInstead(temp); 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru orderLength = size; 52350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return orders.orphan(); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 527