16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2011, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * IntlTestCollator is the medium level test class for everything in the directory "collate". 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*********************************************************************** 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification history 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 02/14/2001 synwee Compare with cintltst and commented away tests 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* that are not run. 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org***********************************************************************/ 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/localpointer.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "dadrcoll.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "encoll.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "frcoll.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "decoll.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "escoll.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ficoll.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "jacoll.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "trcoll.h" 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "allcoll.h" 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "g7coll.h" 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "mnkytst.h" 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "apicoll.h" 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "regcoll.h" 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "currcoll.h" 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "itercoll.h" 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "tstnorm.h" 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "normconf.h" 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "thcoll.h" 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "srchtest.h" 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ssearch.h" 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cntabcol.h" 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "lcukocol.h" 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucaconf.h" 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "svccoll.h" 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "alphaindextst.h" 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//#include "rndmcoll.h" 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Set to 1 to test offsets in backAndForth() 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_OFFSETS 0 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TESTCLASS(n,classname) \ 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case n: \ 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = #classname; \ 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { \ 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(#classname "---"); \ 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(""); \ 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org classname t; \ 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org callTest(t, par); \ 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid IntlTestCollator::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("TestSuite Collator: "); 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (index) { 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(0, CollationEnglishTest); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(1, CollationFrenchTest); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(2, CollationGermanTest); 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(3, CollationSpanishTest); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(4, CollationKanaTest); 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(5, CollationTurkishTest); 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(6, CollationDummyTest); 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(7, G7CollationTest); 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(8, CollationMonkeyTest); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(9, CollationAPITest); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(10, CollationRegressionTest); 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(11, CollationCurrencyTest); 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(12, CollationIteratorTest); 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(13, CollationThaiTest); 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(14, LotusCollationKoreanTest); 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(15, StringSearchTest); 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(16, ContractionTableTest); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(17, DataDrivenCollatorTest); 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(18, UCAConformanceTest); 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(19, CollationServiceTest); 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(20, CollationFinnishTest); // removed by weiv - we have changed Finnish collation 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //TESTCLASS(21, RandomCollatorTest); // See ticket 5747 about reenabling this test. 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(21, SSearchTest); 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCLASS(22, AlphabeticIndexTest); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: name = ""; break; 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCollationResult 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::compareUsingPartials(UCollator *coll, const UChar source[], int32_t sLen, const UChar target[], int32_t tLen, int32_t pieceSize, UErrorCode &status) { 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t partialSKResult = 0; 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t sBuf[512], tBuf[512]; 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharIterator sIter, tIter; 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t sState[2], tState[2]; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sSize = pieceSize, tSize = pieceSize; 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sState[0] = 0; sState[1] = 0; 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tState[0] = 0; tState[1] = 0; 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(sSize == pieceSize && tSize == pieceSize && partialSKResult == 0) { 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setString(&sIter, source, sLen); 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setString(&tIter, target, tLen); 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sSize = ucol_nextSortKeyPart(coll, &sIter, sState, sBuf, pieceSize, &status); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tSize = ucol_nextSortKeyPart(coll, &tIter, tState, tBuf, pieceSize, &status); 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sState[0] != 0 || tState[0] != 0) { 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("State != 0 : %08X %08X\n", sState[0], tState[0]); 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("%i ", i++); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org partialSKResult = memcmp(sBuf, tBuf, pieceSize); 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(partialSKResult < 0) { 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UCOL_LESS; 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(partialSKResult > 0) { 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UCOL_GREATER; 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UCOL_EQUAL; 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::doTestVariant(Collator* col, const UnicodeString &source, const UnicodeString &target, Collator::EComparisonResult result) 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *myCollation = (UCollator *)((RuleBasedCollator *)col)->getUCollator(); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator::EComparisonResult compareResult = col->compare(source, target); 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CollationKey srckey, tgtkey; 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org col->getCollationKey(source, srckey, status); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org col->getCollationKey(target, tgtkey, status); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Creation of collation keys failed\n"); 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator::EComparisonResult keyResult = srckey.compareTo(tgtkey); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reportCResult(source, target, srckey, tgtkey, compareResult, keyResult, result, result); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColAttributeValue norm = ucol_getAttribute(myCollation, UCOL_NORMALIZATION_MODE, &status); 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sLen = source.length(), tLen = target.length(); 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* src = source.getBuffer(); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* trg = target.getBuffer(); 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationResult compareResultIter = (UCollationResult)result; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharIterator sIter, tIter; 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setString(&sIter, src, sLen); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setString(&tIter, trg, tLen); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org compareResultIter = ucol_strcollIter(myCollation, &sIter, &tIter, &status); 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(compareResultIter != (UCollationResult)result) { 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Different result for iterative comparison "+source+" "+target); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* convert the strings to UTF-8 and do try comparing with char iterator */ 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!quick) { /*!QUICK*/ 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char utf8Source[256], utf8Target[256]; 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t utf8SourceLen = 0, utf8TargetLen = 0; 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strToUTF8(utf8Source, 256, &utf8SourceLen, src, sLen, &status); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { /* probably buffer is not big enough */ 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("Src UTF-8 buffer too small! Will not compare!\n"); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strToUTF8(utf8Target, 256, &utf8TargetLen, trg, tLen, &status); 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { /* probably buffer is not big enough */ 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationResult compareResultUTF8 = (UCollationResult)result, compareResultUTF8Norm = (UCollationResult)result; 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharIterator sIter, tIter; 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*log_verbose("Strings converted to UTF-8:%s, %s\n", aescstrdup(source,-1), aescstrdup(target,-1));*/ 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setUTF8(&sIter, utf8Source, utf8SourceLen); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setUTF8(&tIter, utf8Target, utf8TargetLen); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*uiter_setString(&sIter, source, sLen); 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setString(&tIter, target, tLen);*/ 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org compareResultUTF8 = ucol_strcollIter(myCollation, &sIter, &tIter, &status); 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sIter.move(&sIter, 0, UITER_START); 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tIter.move(&tIter, 0, UITER_START); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org compareResultUTF8Norm = ucol_strcollIter(myCollation, &sIter, &tIter, &status); 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, norm, &status); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(compareResultUTF8 != compareResultIter) { 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("different results in iterative comparison for UTF-16 and UTF-8 encoded strings. "+source+", "+target); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(compareResultUTF8 != compareResultUTF8Norm) { 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("different results in iterative when normalization is turned on with UTF-8 strings. "+source+", "+target); 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("Target UTF-8 buffer too small! Did not compare!\n"); 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("UTF-8 strcoll failed! Ignoring result\n"); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing the partial sortkeys */ 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /*!QUICK*/ 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t partialSizes[] = { 3, 1, 2, 4, 8, 20, 80 }; /* just size 3 in the quick mode */ 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t partialSizesSize = 1; 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!quick) { 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org partialSizesSize = 7; 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("partial sortkey test piecesize="); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i = 0; i < partialSizesSize; i++) { 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationResult partialSKResult = (UCollationResult)result, partialNormalizedSKResult = (UCollationResult)result; 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("%i ", partialSizes[i]); 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org partialSKResult = compareUsingPartials(myCollation, src, sLen, trg, tLen, partialSizes[i], status); 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(partialSKResult != (UCollationResult)result) { 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Partial sortkey comparison returned wrong result: "+source+", "+target+" (size "+partialSizes[i]+")"); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(norm != UCOL_ON && !quick) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("N "); 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org partialNormalizedSKResult = compareUsingPartials(myCollation, src, sLen, trg, tLen, partialSizes[i], status); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, norm, &status); 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(partialSKResult != partialNormalizedSKResult) { 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Partial sortkey comparison gets different result when normalization is on: "+source+", "+target+" (size "+partialSizes[i]+")"); 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("\n"); 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (compareResult != result) { 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("String comparison failed in variant test\n"); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (keyResult != result) { 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Collation key comparison failed in variant test\n"); 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::doTest(Collator* col, const UChar *source, const UChar *target, Collator::EComparisonResult result) { 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTest(col, UnicodeString(source), UnicodeString(target), result); 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::doTest(Collator* col, const UnicodeString &source, const UnicodeString &target, Collator::EComparisonResult result) 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(col) { 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTestVariant(col, source, target, result); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result == Collator::LESS) { 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTestVariant(col, target, source, Collator::GREATER); 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (result == Collator::GREATER) { 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTestVariant(col, target, source, Collator::LESS); 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<CollationElementIterator> c(((RuleBasedCollator *)col)->createCollationElementIterator(source)); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Testing iterating source: "+source); 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(*c); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c->setText(target, status); 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Testing iterating target: "+target); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(*c); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// used for collation result reporting, defined here for convenience 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// (maybe moved later) 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::reportCResult( const UnicodeString &source, const UnicodeString &target, 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CollationKey &sourceKey, CollationKey &targetKey, 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator::EComparisonResult compareResult, 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator::EComparisonResult keyResult, 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator::EComparisonResult incResult, 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator::EComparisonResult expectedResult ) 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (expectedResult < -1 || expectedResult > 1) 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("***** invalid call to reportCResult ****"); 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool ok1 = (compareResult == expectedResult); 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool ok2 = (keyResult == expectedResult); 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool ok3 = (incResult == expectedResult); 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ok1 && ok2 && ok3 && !verbose) { 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Keep non-verbose, passing tests fast 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString msg1(ok1 ? "Ok: compare(" : "FAIL: compare("); 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString msg2(", "), msg3(") returned "), msg4("; expected "); 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString prettySource, prettyTarget, sExpect, sResult; 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IntlTest::prettify(source, prettySource); 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IntlTest::prettify(target, prettyTarget); 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendCompareResult(compareResult, sResult); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendCompareResult(expectedResult, sExpect); 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ok1) { 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult); 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult + msg4 + sExpect); 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg1 = UnicodeString(ok2 ? "Ok: key(" : "FAIL: key("); 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg2 = ").compareTo(key("; 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg3 = ")) returned "; 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendCompareResult(keyResult, sResult); 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ok2) { 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult); 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult + msg4 + sExpect); 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg1 = " "; 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg2 = " vs. "; 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prettify(sourceKey, prettySource); 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prettify(targetKey, prettyTarget); 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(msg1 + prettySource + msg2 + prettyTarget); 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg1 = UnicodeString (ok3 ? "Ok: incCompare(" : "FAIL: incCompare("); 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg2 = ", "; 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org msg3 = ") returned "; 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendCompareResult(incResult, sResult); 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ok3) { 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult); 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(msg1 + prettySource + msg2 + prettyTarget + msg3 + sResult + msg4 + sExpect); 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::appendCompareResult(Collator::EComparisonResult result, 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& target) 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == Collator::LESS) 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "LESS"; 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (result == Collator::EQUAL) 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "EQUAL"; 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (result == Collator::GREATER) 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "GREATER"; 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString huh = "?"; 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += (huh + (int32_t)result); 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return target; 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Produce a printable representation of a CollationKey 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString &IntlTestCollator::prettify(const CollationKey &source, UnicodeString &target) 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, byteCount; 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint8_t *bytes = source.getByteArray(byteCount); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target.remove(); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "["; 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < byteCount; i += 1) 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i != 0) { 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += " "; 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendHex(bytes[i], 2, target); 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "]"; 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return target; 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid IntlTestCollator::backAndForth(CollationElementIterator &iter) 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Run through the iterator forwards and stick it into an array 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t orderLength = 0; 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalArray<Order> orders(getOrders(iter, orderLength)); 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Now go through it backwards and make sure we get the same values 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t index = orderLength; 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t o; 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // reset the iterator 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter.reset(); 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((o = iter.previous(status)) != CollationElementIterator::NULLORDER) 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*int32_t offset = */iter.getOffset(); 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (index == 0) { 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(o == 0) { 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { // this is an error, orders exhausted but there are non-ignorable CEs from 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // going backwards 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Backward iteration returned a non ignorable after orders are exhausted"); 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org index -= 1; 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (o != orders[index].order) { 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (o == 0) 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org index += 1; 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (index > 0 && orders[--index].order == 0) { 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // nothing... 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (o != orders[index].order) { 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Mismatched order at index %d: 0x%0:8X vs. 0x%0:8X", index, 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders[index].order, o); 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //break; 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if TEST_OFFSETS 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (offset != orders[index].offset) { 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Mismatched offset at index %d: %d vs. %d", index, 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders[index].offset, offset); 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //break; 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (index != 0 && orders[index - 1].order == 0) 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org index --; 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (index != 0) 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString msg("Didn't get back to beginning - index is "); 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(msg + index); 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter.reset(); 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org err("next: "); 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((o = iter.next(status)) != CollationElementIterator::NULLORDER) 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString hexString("0x"); 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendHex(o, 8, hexString); 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hexString += " "; 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org err(hexString); 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(""); 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org err("prev: "); 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((o = iter.previous(status)) != CollationElementIterator::NULLORDER) 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString hexString("0x"); 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendHex(o, 8, hexString); 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hexString += " "; 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org err(hexString); 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(""); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Return an integer array containing all of the collation orders 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * returned by calls to next on the specified iterator 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestCollator::Order *IntlTestCollator::getOrders(CollationElementIterator &iter, int32_t &orderLength) 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t maxSize = 100; 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size = 0; 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalArray<Order> orders(new Order[maxSize]); 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset = iter.getOffset(); 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t order; 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((order = iter.next(status)) != CollationElementIterator::NULLORDER) 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (size == maxSize) 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org maxSize *= 2; 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Order *temp = new Order[maxSize]; 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(temp, orders.getAlias(), size * sizeof(Order)); 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders.adoptInstead(temp); 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders[size].order = order; 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders[size].offset = offset; 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = iter.getOffset(); 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size += 1; 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (maxSize > size) 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Order *temp = new Order[size]; 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(temp, orders.getAlias(), size * sizeof(Order)); 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders.adoptInstead(temp); 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orderLength = size; 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return orders.orphan(); 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_COLLATION */ 541