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