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