1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
227f654740f2a26ad62a5c155af9199af9e69b889claireho * Copyright (c) 1997-2010 International Business Machines
385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Corporation and others. All Rights Reserved.
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*****************************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File CAPITEST.C
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*        Name                     Description
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*     Madhu Katragadda             Ported for C API
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*     Brian Rower                  Added TestOpenVsOpenRules
1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*//* C API TEST For COLLATOR */
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h>
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uloc.h"
2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ulocdata.h"
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ures.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucoleitr.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "capitst.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ccolltst.h"
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "putilimp.h"
3227f654740f2a26ad62a5c155af9199af9e69b889claireho#include "cmemory.h"
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cstring.h"
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestAttribute(void);
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestDefault(void);
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestDefaultKeyword(void);
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int TestBufferSize();    /* defined in "colutil.c" */
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* next two function is modified from "i18n/ucol.cpp" to avoid include "ucol_imp.h" */
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void uprv_appendByteToHexString(char *dst, uint8_t val) {
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  uint32_t len = (uint32_t)strlen(dst);
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  sprintf(dst+len, "%02X", val);
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char* U_EXPORT2 ucol_sortKeyToString(const UCollator *coll, const uint8_t *sortkey, char *buffer, uint32_t *len) {
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  int32_t strength = UCOL_PRIMARY;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  uint32_t res_size = 0;
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UBool doneCase = FALSE;
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  char *current = buffer;
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  const uint8_t *currentSk = sortkey;
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UErrorCode error_code = U_ZERO_ERROR;
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  strcpy(current, "[");
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  while(strength <= UCOL_QUATERNARY && strength <= ucol_getAttribute(coll,UCOL_STRENGTH, &error_code)) {
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(error_code)) {
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code));
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strength > UCOL_PRIMARY) {
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      strcat(current, " . ");
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(*currentSk != 0x01 && *currentSk != 0x00) { /* print a level */
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      uprv_appendByteToHexString(current, *currentSk++);
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      strcat(current, " ");
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(ucol_getAttribute(coll,UCOL_CASE_LEVEL, &error_code) == UCOL_ON && strength == UCOL_SECONDARY && doneCase == FALSE) {
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doneCase = TRUE;
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else if(ucol_getAttribute(coll,UCOL_CASE_LEVEL, &error_code) == UCOL_OFF || doneCase == TRUE || strength != UCOL_SECONDARY) {
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      strength ++;
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(error_code)) {
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code));
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_appendByteToHexString(current, *currentSk++); /* This should print '01' */
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strength == UCOL_QUATERNARY && ucol_getAttribute(coll,UCOL_ALTERNATE_HANDLING, &error_code) == UCOL_NON_IGNORABLE) {
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      break;
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(ucol_getAttribute(coll,UCOL_STRENGTH, &error_code) == UCOL_IDENTICAL) {
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    strcat(current, " . ");
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(*currentSk != 0) {
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      uprv_appendByteToHexString(current, *currentSk++);
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      strcat(current, " ");
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_appendByteToHexString(current, *currentSk++);
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(U_FAILURE(error_code)) {
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code));
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  strcat(current, "]");
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(res_size > *len) {
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return NULL;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  return buffer;
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* end of  avoid include "ucol_imp.h" */
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addCollAPITest(TestNode** root)
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* WEIVTODO: return tests here */
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestProperty,      "tscoll/capitst/TestProperty");
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestRuleBasedColl, "tscoll/capitst/TestRuleBasedColl");
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestCompare,       "tscoll/capitst/TestCompare");
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestSortKey,       "tscoll/capitst/TestSortKey");
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestHashCode,      "tscoll/capitst/TestHashCode");
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestElemIter,      "tscoll/capitst/TestElemIter");
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestGetAll,        "tscoll/capitst/TestGetAll");
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*addTest(root, &TestGetDefaultRules, "tscoll/capitst/TestGetDefaultRules");*/
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestDecomposition, "tscoll/capitst/TestDecomposition");
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestSafeClone, "tscoll/capitst/TestSafeClone");
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestCloneBinary, "tscoll/capitst/TestCloneBinary");
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestGetSetAttr, "tscoll/capitst/TestGetSetAttr");
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestBounds, "tscoll/capitst/TestBounds");
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestGetLocale, "tscoll/capitst/TestGetLocale");
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestSortKeyBufferOverrun, "tscoll/capitst/TestSortKeyBufferOverrun");
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestAttribute, "tscoll/capitst/TestAttribute");
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestGetTailoredSet, "tscoll/capitst/TestGetTailoredSet");
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestMergeSortKeys, "tscoll/capitst/TestMergeSortKeys");
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestShortString, "tscoll/capitst/TestShortString");
131ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* BEGIN android-removed
132ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       To save space, Android does not include the collation tailoring rules.
133ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       We skip the tailing tests for collations. */
134ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* addTest(root, &TestGetContractionsAndUnsafes, "tscoll/capitst/TestGetContractionsAndUnsafes"); */
135ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* END android-removed */
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestOpenBinary, "tscoll/capitst/TestOpenBinary");
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestDefault, "tscoll/capitst/TestDefault");
13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    addTest(root, &TestDefaultKeyword, "tscoll/capitst/TestDefaultKeyword");
139ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* BEGIN android-removed
140ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       To save space, Android does not build full collation tables and tailing rules.
141ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       We skip the related tests. */
142ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* addTest(root, &TestOpenVsOpenRules, "tscoll/capitst/TestOpenVsOpenRules"); */
143ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* addTest(root, &TestGetKeywordValuesForLocale, "tscoll/capitst/TestGetKeywordValuesForLocale"); */
144ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* END android-removed */
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestGetSetAttr(void) {
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UCollator *coll = ucol_open(NULL, &status);
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  struct attrTest {
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UColAttribute att;
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UColAttributeValue val[5];
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t valueSize;
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UColAttributeValue nonValue;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  } attrs[] = {
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_FRENCH_COLLATION, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_ALTERNATE_HANDLING, {UCOL_NON_IGNORABLE, UCOL_SHIFTED}, 2, UCOL_OFF},/* attribute for handling variable elements*/
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_CASE_FIRST, {UCOL_OFF, UCOL_LOWER_FIRST, UCOL_UPPER_FIRST}, 3, UCOL_SHIFTED},/* who goes first, lower case or uppercase */
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_CASE_LEVEL, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* do we have an extra case level */
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_NORMALIZATION_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* attribute for normalization */
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_DECOMPOSITION_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_STRENGTH,         {UCOL_PRIMARY, UCOL_SECONDARY, UCOL_TERTIARY, UCOL_QUATERNARY, UCOL_IDENTICAL}, 5, UCOL_SHIFTED},/* attribute for strength */
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {UCOL_HIRAGANA_QUATERNARY_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* when turned on, this attribute */
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UColAttribute currAttr;
16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  UColAttributeValue value;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  uint32_t i = 0, j = 0;
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  if (coll == NULL) {
17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_err_status(status, "Unable to open collator. %s\n", u_errorName(status));
17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return;
17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  }
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  for(i = 0; i<sizeof(attrs)/sizeof(attrs[0]); i++) {
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    currAttr = attrs[i].att;
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, currAttr, UCOL_DEFAULT, &status);
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "ucol_setAttribute with the default value returned error: %s\n", u_errorName(status));
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      break;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    value = ucol_getAttribute(coll, currAttr, &status);
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("ucol_getAttribute returned error: %s\n", u_errorName(status));
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      break;
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(j = 0; j<attrs[i].valueSize; j++) {
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_setAttribute(coll, currAttr, attrs[i].val[j], &status);
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(status)) {
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucol_setAttribute with the value %i returned error: %s\n", attrs[i].val[j], u_errorName(status));
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        break;
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, currAttr, attrs[i].nonValue, &status);
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status)) {
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("ucol_setAttribute with the bad value didn't return an error\n");
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      break;
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, currAttr, value, &status);
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("ucol_setAttribute with the default valuereturned error: %s\n", u_errorName(status));
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      break;
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  status = U_ZERO_ERROR;
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  value = ucol_getAttribute(coll, UCOL_ATTRIBUTE_COUNT, &status);
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(U_SUCCESS(status)) {
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("ucol_getAttribute for UCOL_ATTRIBUTE_COUNT didn't return an error\n");
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  status = U_ZERO_ERROR;
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_ATTRIBUTE_COUNT, UCOL_DEFAULT, &status);
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(U_SUCCESS(status)) {
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("ucol_setAttribute for UCOL_ATTRIBUTE_COUNT didn't return an error\n");
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  status = U_ZERO_ERROR;
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ucol_close(coll);
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void doAssert(int condition, const char *message)
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (condition==0) {
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR :  %s\n", message);
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* We don't have default rules, at least not in the previous sense */
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestGetDefaultRules(){
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t size=0;
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll=NULL;
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t len1 = 0, len2=0;
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *binColData = NULL;
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UResourceBundle *res = NULL;
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UResourceBundle *binColl = NULL;
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *binResult = NULL;
24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
24185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar * defaultRulesArray=ucol_getDefaultRulesArray(&size);
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Test the function ucol_getDefaultRulesArray()\n");
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_openRules(defaultRulesArray, size, UCOL_ON, UCOL_PRIMARY, &status);
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status) && coll !=NULL) {
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        binColData = (uint8_t*)ucol_cloneRuleData(coll, &len1, &status);
24885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status=U_ZERO_ERROR;
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    res=ures_open(NULL, "root", &status);
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: Failed to get resource for \"root Locale\" with %s", myErrorName(status));
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    binColl=ures_getByKey(res, "%%Collation", binColl, &status);
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status)){
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        binResult=(uint8_t*)ures_getBinary(binColl,  &len2, &status);
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(status)){
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: ures_getBinary() failed\n");
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }else{
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: ures_getByKey(locale(default), %%Collation) failed");
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(len1 != len2){
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error: ucol_getDefaultRulesArray() failed to return the correct length.\n");
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(memcmp(binColData, binResult, len1) != 0){
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error: ucol_getDefaultRulesArray() failed\n");
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(binColData);
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ures_close(binColl);
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ures_close(res);
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
28085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Collator Properties
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_open, ucol_strcoll,  getStrength/setStrength
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru getDecomposition/setDecomposition, getDisplayName*/
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestProperty()
28885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *col, *ruled;
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *disName;
29127f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t len = 0;
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *source, *target;
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t tempLength;
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
29585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /*
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Expected version of the English collator.
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Currently, the major/minor version numbers change when the builder code
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * changes,
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * number 2 is from the tailoring data version and
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * number 3 is the UCA version.
30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * This changes with every UCA version change, and the expected value
30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * needs to be adjusted.
30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Same in intltest/apicoll.cpp.
30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
30527f654740f2a26ad62a5c155af9199af9e69b889claireho    UVersionInfo currVersionArray = {0x31, 0xC0, 0x05, 0x2A};  /* from ICU 4.4/UCA 5.2 */
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UVersionInfo versionArray = {0, 0, 0, 0};
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UVersionInfo versionUCAArray = {0, 0, 0, 0};
30827f654740f2a26ad62a5c155af9199af9e69b889claireho    UVersionInfo versionUCDArray = {0, 0, 0, 0};
30985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("The property tests begin : \n");
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Test ucol_strcoll : \n");
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col = ucol_open("en_US", &status);
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
31485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Default Collator creation failed.: %s\n", myErrorName(status));
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getVersion(col, versionArray);
31927f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Check for a version greater than some value rather than equality
32027f654740f2a26ad62a5c155af9199af9e69b889claireho     * so that we need not update the expected version each time. */
32127f654740f2a26ad62a5c155af9199af9e69b889claireho    if (uprv_memcmp(versionArray, currVersionArray, 4)<0) {
32227f654740f2a26ad62a5c155af9199af9e69b889claireho      log_err("Testing ucol_getVersion() - unexpected result: %02x.%02x.%02x.%02x\n",
32327f654740f2a26ad62a5c155af9199af9e69b889claireho              versionArray[0], versionArray[1], versionArray[2], versionArray[3]);
32427f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
32527f654740f2a26ad62a5c155af9199af9e69b889claireho      log_verbose("ucol_getVersion() result: %02x.%02x.%02x.%02x\n",
32627f654740f2a26ad62a5c155af9199af9e69b889claireho                  versionArray[0], versionArray[1], versionArray[2], versionArray[3]);
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
32927f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Assume that the UCD and UCA versions are the same,
33027f654740f2a26ad62a5c155af9199af9e69b889claireho     * rather than hardcoding (and updating each time) a particular UCA version. */
33127f654740f2a26ad62a5c155af9199af9e69b889claireho    u_getUnicodeVersion(versionUCDArray);
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getUCAVersion(col, versionUCAArray);
33327f654740f2a26ad62a5c155af9199af9e69b889claireho    if (0!=uprv_memcmp(versionUCAArray, versionUCDArray, 4)) {
33427f654740f2a26ad62a5c155af9199af9e69b889claireho      log_err("Testing ucol_getUCAVersion() - unexpected result: %hu.%hu.%hu.%hu\n",
33527f654740f2a26ad62a5c155af9199af9e69b889claireho              versionUCAArray[0], versionUCAArray[1], versionUCAArray[2], versionUCAArray[3]);
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(UChar*)malloc(sizeof(UChar) * 12);
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    target=(UChar*)malloc(sizeof(UChar) * 12);
34085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "ab");
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(target, "abc");
34485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), "ab < abc comparison failed");
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "ab");
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(target, "AB");
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), "ab < AB comparison failed");
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    u_uastrcpy(source, "black-bird");
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(target, "blackbird"); */
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(target, "black-bird");
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "blackbird");
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_GREATER),
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "black-bird > blackbird comparison failed");
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "black bird");
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(target, "black-bird");
36085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS),
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "black bird < black-bird comparison failed");
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "Hello");
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(target, "hello");
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_GREATER),
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "Hello > hello comparison failed");
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(source);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(target);
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Test ucol_strcoll ends.\n");
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing ucol_getStrength() method ...\n");
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_TERTIARY), "collation object has the wrong strength");
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference");
37485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing ucol_setStrength() method ...\n");
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setStrength(col, UCOL_SECONDARY);
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_TERTIARY), "collation object's strength is secondary difference");
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference");
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_SECONDARY), "collation object has the wrong strength");
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
38185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Get display name for the default collation in German : \n");
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    len=ucol_getDisplayName("en_US", "de_DE", NULL, 0,  &status);
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status=U_ZERO_ERROR;
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        disName=(UChar*)malloc(sizeof(UChar) * (len+1));
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_getDisplayName("en_US", "de_DE", disName, len+1,  &status);
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("the display name for default collation in german: %s\n", austrdup(disName) );
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(disName);
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in getDisplayName: %s\n", myErrorName(status));
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Default collation getDisplayName ended.\n");
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
39827f654740f2a26ad62a5c155af9199af9e69b889claireho
399ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* BEGIN android-removed
400ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       To save space, Android does not include the collation tailoring rules.
401ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       Skip the related tests.
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ruled = ucol_open("da_DK", &status);
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("ucol_getRules() testing ...\n");
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getRules(ruled, &tempLength);
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( tempLength != 0, "getRules() result incorrect" );
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("getRules tests end.\n");
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar *buffer = (UChar *)malloc(200000*sizeof(UChar));
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t bufLen = 200000;
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        buffer[0] = '\0';
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("ucol_getRulesEx() testing ...\n");
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tempLength = ucol_getRulesEx(col,UCOL_TAILORING_ONLY,buffer,bufLen );
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doAssert( tempLength == 0x0a, "getRulesEx() result incorrect" );
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("getRules tests end.\n");
41585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("ucol_getRulesEx() testing ...\n");
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tempLength=ucol_getRulesEx(col,UCOL_FULL_RULES,buffer,bufLen );
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doAssert( tempLength != 0, "getRulesEx() result incorrect" );
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("getRules tests end.\n");
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(buffer);
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(ruled);
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
42485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
425ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    END android-removed */
426ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("open an collator for french locale");
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col = ucol_open("fr_FR", &status);
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       log_err("ERROR: Creating French collation failed.: %s\n", myErrorName(status));
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setStrength(col, UCOL_PRIMARY);
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing ucol_getStrength() method again ...\n");
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_TERTIARY), "collation object has the wrong strength");
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_PRIMARY), "collation object's strength is not primary difference");
43785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing French ucol_setStrength() method ...\n");
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setStrength(col, UCOL_TERTIARY);
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_TERTIARY), "collation object's strength is not tertiary difference");
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference");
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_SECONDARY), "collation object's strength is secondary difference");
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
44485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Get display name for the french collation in english : \n");
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    len=ucol_getDisplayName("fr_FR", "en_US", NULL, 0,  &status);
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status=U_ZERO_ERROR;
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        disName=(UChar*)malloc(sizeof(UChar) * (len+1));
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_getDisplayName("fr_FR", "en_US", disName, len+1,  &status);
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("the display name for french collation in english: %s\n", austrdup(disName) );
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(disName);
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in getDisplayName: %s\n", myErrorName(status));
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Default collation getDisplayName ended.\n");
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Test RuleBasedCollator and getRules*/
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestRuleBasedColl()
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *col1, *col2, *col3, *col4;
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter1, *iter2;
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar ruleset1[60];
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar ruleset2[50];
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar teststr[10];
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar teststr2[10];
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *rule1, *rule2, *rule3, *rule4;
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t tempLength;
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(ruleset1, "&9 < a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E");
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(ruleset2, "&9 < a, A < b, B < c, C < d, D, e, E");
47685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL,&status);
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
48085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "RuleBased Collator creation failed.: %s\n", myErrorName(status));
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("PASS: RuleBased Collator creation passed\n");
48585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col2 = ucol_openRules(ruleset2, u_strlen(ruleset2),  UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("PASS: RuleBased Collator creation passed\n");
49485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
49585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col3= ucol_open(NULL, &status);
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Default Collator creation failed.: %s\n", myErrorName(status));
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("PASS: Default Collator creation passed\n");
50485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    rule1 = ucol_getRules(col1, &tempLength);
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    rule2 = ucol_getRules(col2, &tempLength);
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    rule3 = ucol_getRules(col3, &tempLength);
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((u_strcmp(rule1, rule2) != 0), "Default collator getRules failed");
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((u_strcmp(rule2, rule3) != 0), "Default collator getRules failed");
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((u_strcmp(rule1, rule3) != 0), "Default collator getRules failed");
51285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col4=ucol_openRules(rule2, u_strlen(rule2), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    rule4= ucol_getRules(col4, &tempLength);
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((u_strcmp(rule2, rule4) == 0), "Default collator getRules failed");
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col1);
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col2);
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col3);
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col4);
52585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* tests that modifier ! is always ignored */
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(ruleset1, "!&a<b");
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    teststr[0] = 0x0e40;
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    teststr[1] = 0x0e01;
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    teststr[2] = 0x0e2d;
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col2 = ucol_open("en_US", &status);
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("en_US Collator creation failed.: %s\n", myErrorName(status));
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter1 = ucol_openElements(col1, teststr, 3, &status);
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter2 = ucol_openElements(col2, teststr, 3, &status);
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status));
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (TRUE) {
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* testing with en since thai has its own tailoring */
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uint32_t ce = ucol_next(iter1, &status);
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uint32_t ce2 = ucol_next(iter2, &status);
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(status)) {
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status));
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (ce2 != ce) {
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             log_err("! modifier test failed");
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (ce == UCOL_NULLORDER) {
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter1);
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter2);
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col1);
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col2);
566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test that we can start a rule without a & or < */
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(ruleset1, "< z < a");
568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(teststr, "z");
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(teststr2, "a");
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_greaterOrEqual(col1, teststr, 1, teststr2, 1)) {
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Rule \"z < a\" fails");
57785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col1);
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestCompare()
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *col;
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* test1;
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* test2;
58785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("The compare tests begin : \n");
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status=U_ZERO_ERROR;
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col = ucol_open("en_US", &status);
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
59285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ucal_open() collation creation failed.: %s\n", myErrorName(status));
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1=(UChar*)malloc(sizeof(UChar) * 6);
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test2=(UChar*)malloc(sizeof(UChar) * 6);
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "Abcda");
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
59985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Use tertiary comparison level testing ....\n");
60185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (!ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" != \"abcda\" ");
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" >>> \"abcda\" ");
60485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" >>> \"abcda\"");
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setStrength(col, UCOL_SECONDARY);
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Use secondary comparison level testing ....\n");
60885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2) )), "Result should be \"Abcda\" == \"abcda\"");
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (!ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
61185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2) )), "Result should be \"Abcda\" == \"abcda\"");
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setStrength(col, UCOL_PRIMARY);
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Use primary comparison level testing ....\n");
61585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (!ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
61885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
61985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("The compare tests end.\n");
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test1);
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test2);
62585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru---------------------------------------------
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru tests decomposition setting
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestDecomposition() {
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *en_US, *el_GR, *vi_VN;
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    en_US = ucol_open("en_US", &status);
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    el_GR = ucol_open("el_GR", &status);
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    vi_VN = ucol_open("vi_VN", &status);
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
63985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: collation creation failed.: %s\n", myErrorName(status));
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(vi_VN, UCOL_NORMALIZATION_MODE, &status) != UCOL_ON ||
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(status))
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: vi_VN collation did not have cannonical decomposition for normalization!\n");
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(el_GR, UCOL_NORMALIZATION_MODE, &status) != UCOL_ON ||
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(status))
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: el_GR collation did not have cannonical decomposition for normalization!\n");
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(en_US, UCOL_NORMALIZATION_MODE, &status) != UCOL_OFF ||
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(status))
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: en_US collation had cannonical decomposition for normalization!\n");
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_US);
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(el_GR);
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(vi_VN);
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CLONETEST_COLLATOR_COUNT 4
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestSafeClone() {
67185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test1[6];
67285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test2[6];
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar umlautUStr[] = {0x00DC, 0};
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar oeStr[] = {0x0055, 0x0045, 0};
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator * someCollators [CLONETEST_COLLATOR_COUNT];
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator * someClonedCollators [CLONETEST_COLLATOR_COUNT];
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator * col;
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
67985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int8_t index = 6;    /* Leave this here to test buffer alingment in memory*/
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t buffer [CLONETEST_COLLATOR_COUNT] [U_COL_SAFECLONE_BUFFERSIZE];
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char sampleRuleChars[] = "&Z < CH";
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar sampleRule[sizeof(sampleRuleChars)];
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (TestBufferSize()) {
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("U_COL_SAFECLONE_BUFFERSIZE should be larger than sizeof(UCollator)\n");
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "abCda");
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(sampleRule, sampleRuleChars);
69385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* one default collator & two complex ones */
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    someCollators[0] = ucol_open("en_US", &err);
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    someCollators[1] = ucol_open("ko", &err);
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    someCollators[2] = ucol_open("ja_JP", &err);
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    someCollators[3] = ucol_openRules(sampleRule, -1, UCOL_ON, UCOL_TERTIARY, NULL, &err);
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
70085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++) {
70185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_close(someCollators[index]);
70285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Couldn't open one or more collators\n");
704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Check the various error & informational states: */
708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Null status - just returns NULL */
710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, 0))
711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null status\n");
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* error status - should return 0 & keep error the same */
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_MEMORY_ALLOCATION_ERROR;
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err) || err != U_MEMORY_ALLOCATION_ERROR)
717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with incoming error status\n");
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/
723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], 0, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null bufferSize pointer\n");
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
72885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* buffer size pointer is 0 - fill in pbufferSize with a size */
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    bufferSize = 0;
731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err) || U_FAILURE(err) || bufferSize <= 0)
732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed a sizing request ('preflighting')\n");
734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Verify our define is large enough  */
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_COL_SAFECLONE_BUFFERSIZE < bufferSize)
737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Pre-calculated buffer size is too small\n");
739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Verify we can use this run-time calculated size */
741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 == (col = ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err)) || U_FAILURE(err))
742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Collator can't be cloned with run-time size\n");
744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (col) ucol_close(col);
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* size one byte too small - should allocate & let us know */
747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    --bufferSize;
748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 == (col = ucol_safeClone(someCollators[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING)
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with too-small buffer size\n");
751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (col) ucol_close(col);
753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Null buffer pointer - return Collator & set error to U_SAFECLONE_ALLOCATED_ERROR */
758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 == (col = ucol_safeClone(someCollators[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING)
759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null buffer pointer\n");
761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (col) ucol_close(col);
763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Null Collator - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (0 != ucol_safeClone(0, buffer[0], &bufferSize, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null Collator pointer\n");
769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test that a cloned collator doesn't accidentally use UCA. */
774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col=ucol_open("de@collation=phonebook", &err);
775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    someClonedCollators[0] = ucol_safeClone(col, buffer[0], &bufferSize, &err);
777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_greater(col, umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Original German phonebook collation sorts differently than expected");
778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (ucol_greater(someClonedCollators[0], umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Cloned German phonebook collation sorts differently than expected");
779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!ucol_equals(someClonedCollators[0], col)) {
780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Cloned German phonebook collator is not equal to original.\n");
781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(someClonedCollators[0]);
784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* change orig & clone & make sure they are independent */
788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++)
790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setStrength(someCollators[index], UCOL_IDENTICAL);
792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        bufferSize = 1;
793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        err = U_ZERO_ERROR;
794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(ucol_safeClone(someCollators[index], buffer[index], &bufferSize, &err));
795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (err != U_SAFECLONE_ALLOCATED_WARNING) {
796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("FAIL: collator number %d was not allocated.\n", index);
79785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("FAIL: status of Collator[%d] is %d  (hex: %x).\n", index, err, err);
798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        err = U_ZERO_ERROR;
802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        someClonedCollators[index] = ucol_safeClone(someCollators[index], buffer[index], &bufferSize, &err);
803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (someClonedCollators[index] == NULL
804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            || someClonedCollators[index] < (UCollator *)buffer[index]
805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            || someClonedCollators[index] > (UCollator *)(buffer[index]+(U_COL_SAFECLONE_BUFFERSIZE-1)))
806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("FAIL: Cloned collator didn't use provided buffer.\n");
808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (!ucol_equals(someClonedCollators[index], someCollators[index])) {
811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("FAIL: Cloned collator is not equal to original at index = %d.\n", index);
812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Check the usability */
815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setStrength(someCollators[index], UCOL_PRIMARY);
816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(someCollators[index], UCOL_CASE_LEVEL, UCOL_OFF, &err);
81785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doAssert( (ucol_equal(someCollators[index], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abcda\" == \"abCda\"");
81985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Close the original to make sure that the clone is usable. */
821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(someCollators[index]);
822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setStrength(someClonedCollators[index], UCOL_TERTIARY);
824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(someClonedCollators[index], UCOL_CASE_LEVEL, UCOL_OFF, &err);
825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doAssert( (ucol_greater(someClonedCollators[index], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abCda\" >>> \"abcda\" ");
826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(someClonedCollators[index]);
828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestCloneBinary(){
832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator * col = ucol_open("en_US", &err);
834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator * c;
835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t size;
836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t * buffer;
837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(err)) {
839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Couldn't open collator. Error: %s\n", u_errorName(err));
840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    size = ucol_cloneBinary(col, NULL, 0, &err);
844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(size==0 || err!=U_BUFFER_OVERFLOW_ERROR) {
845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucol_cloneBinary - couldn't check size. Error: %s\n", u_errorName(err));
846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buffer = (uint8_t *) malloc(size);
851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_cloneBinary(col, buffer, size, &err);
852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucol_cloneBinary - couldn't clone.. Error: %s\n", u_errorName(err));
854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(buffer);
855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* how to check binary result ? */
859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c = ucol_openBinary(buffer, size, col, &err);
861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucol_openBinary failed. Error: %s\n", u_errorName(err));
863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar t[] = {0x41, 0x42, 0x43, 0};  /* ABC */
865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uint8_t  *k1, *k2;
866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int l1, l2;
867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        l1 = ucol_getSortKey(col, t, -1, NULL,0);
868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        l2 = ucol_getSortKey(c, t, -1, NULL,0);
869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        k1 = (uint8_t *) malloc(sizeof(uint8_t) * l1);
870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        k2 = (uint8_t *) malloc(sizeof(uint8_t) * l2);
871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_getSortKey(col, t, -1, k1, l1);
872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_getSortKey(col, t, -1, k2, l2);
873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (strcmp((char *)k1,(char *)k2) != 0){
874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ucol_openBinary - new collator should equal to old one\n");
875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(k1);
877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(k2);
878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(buffer);
880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(c);
881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
88485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TestOpenVsOpenRules ensures that collators from ucol_open and ucol_openRules
88585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    will generate identical sort keys
88685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/
88785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid TestOpenVsOpenRules(){
88885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
88985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* create an array of all the locales */
89085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t numLocales = uloc_countAvailable();
89185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t sizeOfStdSet;
89285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t adder;
89385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar str[41]; /* create an array of UChar of size maximum strSize + 1 */
89485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    USet *stdSet;
89585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char* curLoc;
89685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator * c1;
89785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator * c2;
89885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UChar* rules;
89985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t rulesLength;
90085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t sortKeyLen1, sortKeyLen2;
90185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint8_t *sortKey1 = NULL, *sortKey2 = NULL;
90285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ULocaleData *uld;
90350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t x, y, z;
90485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    USet *eSet;
90585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t eSize;
90685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int strSize;
90785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
90885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode err = U_ZERO_ERROR;
90985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
91085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* create a set of standard characters that aren't very interesting...
91185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    and then we can find some interesting ones later */
91285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
91385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    stdSet = uset_open(0x61, 0x7A);
91485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uset_addRange(stdSet, 0x41, 0x5A);
91585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uset_addRange(stdSet, 0x30, 0x39);
91685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    sizeOfStdSet = uset_size(stdSet);
91785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
91885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    adder = 1;
91927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(getTestOption(QUICK_OPTION))
92085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {
92185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        adder = 10;
92285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
92385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
92485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(x = 0; x < numLocales; x+=adder){
92585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        curLoc = (char *)uloc_getAvailable(x);
92685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("Processing %s\n", curLoc);
92785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
92885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* create a collator the normal API way */
92985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        c1 = ucol_open(curLoc, &err);
93085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (U_FAILURE(err)) {
93185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("ERROR: Normal collation creation failed with locale: %s : %s\n", curLoc, myErrorName(err));
93285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return;
93385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
93485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
93585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* grab the rules */
93685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        rules = ucol_getRules(c1, &rulesLength);
93785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
93885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* use those rules to create a collator from rules */
93985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        c2 = ucol_openRules(rules, rulesLength, UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &err);
94085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (U_FAILURE(err)) {
94185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("ERROR: Creating collator from rules failed with locale: %s : %s\n", curLoc, myErrorName(err));
94285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return;
94385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
94485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
94585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uld = ulocdata_open(curLoc, &err);
94685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
94785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*now that we have some collators, we get several strings */
94885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
94985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(y = 0; y < 5; y++){
95085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
95185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* get a set of ALL the characters in this locale */
95285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            eSet =  ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &err);
95385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            eSize = uset_size(eSet);
95485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
95585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* make a string with these characters in it */
95685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            strSize = (rand()%40) + 1;
95785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
95885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            for(z = 0; z < strSize; z++){
95985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                str[z] = uset_charAt(eSet, rand()%eSize);
96085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
96185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
96285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* change the set to only include 'abnormal' characters (not A-Z, a-z, 0-9 */
96385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            uset_removeAll(eSet, stdSet);
96485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            eSize = uset_size(eSet);
96585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
96685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* if there are some non-normal characters left, put a few into the string, just to make sure we have some */
96785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(eSize > 0){
96885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                str[2%strSize] = uset_charAt(eSet, rand()%eSize);
96985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                str[3%strSize] = uset_charAt(eSet, rand()%eSize);
97085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                str[5%strSize] = uset_charAt(eSet, rand()%eSize);
97185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                str[10%strSize] = uset_charAt(eSet, rand()%eSize);
97285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                str[13%strSize] = uset_charAt(eSet, rand()%eSize);
97385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
97485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* terminate the string */
97585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            str[strSize-1] = '\0';
97685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_verbose("String used: %S\n", str);
97785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
97885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* get sort keys for both of them, and check that the keys are identicle */
97985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            sortKeyLen1 = ucol_getSortKey(c1, str, u_strlen(str),  NULL, 0);
98085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            sortKey1 = (uint8_t*)malloc(sizeof(uint8_t) * (sortKeyLen1 + 1));
98185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /*memset(sortKey1, 0xFE, sortKeyLen1);*/
98285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_getSortKey(c1, str, u_strlen(str), sortKey1, sortKeyLen1 + 1);
98385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
98485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            sortKeyLen2 = ucol_getSortKey(c2, str, u_strlen(str),  NULL, 0);
98585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            sortKey2 = (uint8_t*)malloc(sizeof(uint8_t) * (sortKeyLen2 + 1));
98685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /*memset(sortKey2, 0xFE, sortKeyLen2);*/
98785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_getSortKey(c2, str, u_strlen(str), sortKey2, sortKeyLen2 + 1);
98885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
98985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* Check that the lengths are the same */
99085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            doAssert((sortKeyLen1 == sortKeyLen2), "Sort key lengths do not match.");
99185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
99285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* check that the keys are the same */
99385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            doAssert((memcmp(sortKey1, sortKey2, sortKeyLen1) == 0), "Keys are not equivalent");
99485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
99585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* clean up after each string */
99685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            free(sortKey1);
99785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            free(sortKey2);
99885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            uset_close(eSet);
99985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
100085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* clean up after each locale */
100185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ulocdata_close(uld);
100285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(c1);
100385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(c2);
100485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
100585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* final clean up */
100685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uset_close(stdSet);
100785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
100885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
1009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru----------------------------------------------------------------------------
1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ctor -- Tests the getSortKey
1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestSortKey()
101385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
1014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *sortk1 = NULL, *sortk2 = NULL, *sortk3 = NULL, *sortkEmpty = NULL;
1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t sortklen, osortklen;
1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t toStringLen=0;
1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *col;
1018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *test1, *test2, *test3;
1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char toStringBuffer[256], *resultP;
1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t s1[] = { 0x9f, 0x00 };
1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t s2[] = { 0x61, 0x00 };
1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int  strcmpResult;
1026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    strcmpResult = strcmp((const char *)s1, (const char *)s2);
1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("strcmp(0x9f..., 0x61...) = %d\n", strcmpResult);
102985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmpResult <= 0) {
1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("ERR: expected strcmp(\"9f 00\", \"61 00\") to be >=0 (GREATER).. got %d. Calling strcmp() for sortkeys may not work! \n",
1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              strcmpResult);
1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing SortKey begins...\n");
103785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* this is supposed to open default date format, but later on it treats it like it is "en_US"
1038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
1039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* col = ucol_open(NULL, &status); */
1040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col = ucol_open("en_US", &status);
1041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
104285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status));
1043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(ucol_getStrength(col) != UCOL_DEFAULT_STRENGTH)
1048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: default collation did not have UCOL_DEFAULT_STRENGTH !\n");
1050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Need to use identical strength */
1052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(col, UCOL_STRENGTH, UCOL_IDENTICAL, &status);
1053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1=(UChar*)malloc(sizeof(UChar) * 6);
1055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test2=(UChar*)malloc(sizeof(UChar) * 6);
1056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test3=(UChar*)malloc(sizeof(UChar) * 6);
105785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(test1,0xFE, sizeof(UChar)*6);
1059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(test2,0xFE, sizeof(UChar)*6);
1060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(test3,0xFE, sizeof(UChar)*6);
1061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "Abcda");
1064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
1065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test3, "abcda");
1066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Use tertiary comparison level testing ....\n");
1068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test1, u_strlen(test1),  NULL, 0);
1070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(sortk1,0xFE, sortklen);
1072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortklen+1);
1073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test2, u_strlen(test2),  NULL, 0);
1075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(sortk2,0xFE, sortklen);
1077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortklen+1);
1078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    osortklen = sortklen;
1080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test2, u_strlen(test3),  NULL, 0);
1081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk3=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(sortk3,0xFE, sortklen);
1083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk3, sortklen+1);
1084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (sortklen == osortklen), "Sortkey length should be the same (abcda, abcda)");
1086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (memcmp(sortk1, sortk2, sortklen) > 0), "Result should be \"Abcda\" > \"abcda\"");
1088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (memcmp(sortk2, sortk1, sortklen) < 0), "Result should be \"abcda\" < \"Abcda\"");
1089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (memcmp(sortk2, sortk3, sortklen) == 0), "Result should be \"abcda\" ==  \"abcda\"");
1090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    resultP = ucol_sortKeyToString(col, sortk3, toStringBuffer, &toStringLen);
1092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (resultP != 0), "sortKeyToString failed!");
1093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 1 /* verobse log of sortkeys */
1095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char junk2[1000];
1097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char junk3[1000];
1098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int i;
1099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      strcpy(junk2, "abcda[2] ");
1101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      strcpy(junk3, " abcda[3] ");
1102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      for(i=0;i<sortklen;i++)
1104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
1105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          sprintf(junk2+strlen(junk2), "%02X ",(int)( 0xFF & sortk2[i]));
1106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          sprintf(junk3+strlen(junk3), "%02X ",(int)( 0xFF & sortk3[i]));
1107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
110885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("%s\n", junk2);
1110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("%s\n", junk3);
1111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk1);
1115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk2);
1116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk3);
1117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Use secondary comparision level testing ...\n");
1119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setStrength(col, UCOL_SECONDARY);
1120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test1, u_strlen(test1),  NULL, 0);
1121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortklen+1);
1123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test2, u_strlen(test2),  NULL, 0);
1124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortklen+1);
112685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( !(memcmp(sortk1, sortk2, sortklen) > 0), "Result should be \"Abcda\" == \"abcda\"");
1128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( !(memcmp(sortk2, sortk1, sortklen) < 0), "Result should be \"abcda\" == \"Abcda\"");
1129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (memcmp(sortk1, sortk2, sortklen) == 0), "Result should be \"abcda\" ==  \"abcda\"");
1130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("getting sortkey for an empty string\n");
1132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(col, UCOL_STRENGTH, UCOL_TERTIARY, &status);
1133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen = ucol_getSortKey(col, test1, 0, NULL, 0);
1134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortkEmpty = (uint8_t*)malloc(sizeof(uint8_t) * sortklen+1);
1135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen = ucol_getSortKey(col, test1, 0, sortkEmpty, sortklen+1);
1136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(sortklen != 3 || sortkEmpty[0] != 1 || sortkEmpty[0] != 1 || sortkEmpty[2] != 0) {
1137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("Empty string generated wrong sortkey!\n");
1138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortkEmpty);
1140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing passing invalid string\n");
1142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortklen = ucol_getSortKey(col, NULL, 0, NULL, 0);
1143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(sortklen != 0) {
1144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("Invalid string didn't return sortkey size of 0\n");
1145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
114685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
114785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing sortkey ends...\n");
1149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
1150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test1);
1151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test2);
1152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test3);
1153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk1);
1154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk2);
115585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestHashCode()
1158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *sortk1, *sortk2, *sortk3;
1160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t sortk1len, sortk2len, sortk3len;
1161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *col;
1162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *test1, *test2, *test3;
1163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing getHashCode begins...\n");
1165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col = ucol_open("en_US", &status);
1166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
116785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status));
1168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1=(UChar*)malloc(sizeof(UChar) * 6);
1171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test2=(UChar*)malloc(sizeof(UChar) * 6);
1172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test3=(UChar*)malloc(sizeof(UChar) * 6);
1173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "Abcda");
1174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
1175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test3, "abcda");
1176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Use tertiary comparison level testing ....\n");
1178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk1len=ucol_getSortKey(col, test1, u_strlen(test1),  NULL, 0);
1179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortk1len+1));
1180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortk1len+1);
1181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk2len=ucol_getSortKey(col, test2, u_strlen(test2),  NULL, 0);
1182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortk2len+1));
1183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortk2len+1);
1184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk3len=ucol_getSortKey(col, test2, u_strlen(test3),  NULL, 0);
1185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sortk3=(uint8_t*)malloc(sizeof(uint8_t) * (sortk3len+1));
1186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk3, sortk3len+1);
118785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
118885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("ucol_hashCode() testing ...\n");
119085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
119185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doAssert( ucol_keyHashCode(sortk1, sortk1len) != ucol_keyHashCode(sortk2, sortk2len), "Hash test1 result incorrect" );
1192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( !(ucol_keyHashCode(sortk1, sortk1len) == ucol_keyHashCode(sortk2, sortk2len)), "Hash test2 result incorrect" );
1193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( ucol_keyHashCode(sortk2, sortk2len) == ucol_keyHashCode(sortk3, sortk3len), "Hash result not equal" );
119485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("hashCode tests end.\n");
1196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
1197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk1);
1198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk2);
1199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(sortk3);
1200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test1);
1201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test2);
1202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(test3);
1203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
1207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *----------------------------------------------------------------------------
1208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Tests the UCollatorElements API.
120985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *
121085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */
1211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestElemIter()
1212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t offset;
1214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t order1, order2, order3;
1215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *testString1, *testString2;
1216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *col;
1217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iterator1, *iterator2, *iterator3;
1218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing UCollatorElements begins...\n");
1220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    col = ucol_open("en_US", &status);
1221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(col, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
1222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
122385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status));
1224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testString1=(UChar*)malloc(sizeof(UChar) * 150);
1228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testString2=(UChar*)malloc(sizeof(UChar) * 150);
1229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(testString1, "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?");
1230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(testString2, "Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?");
123185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Constructors and comparison testing....\n");
123385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iterator1 = ucol_openElements(col, testString1, u_strlen(testString1), &status);
1235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
1236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status));
1237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(col);
1238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else{ log_verbose("PASS: Default collationElement iterator1 creation passed\n");}
1241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iterator2 = ucol_openElements(col, testString1, u_strlen(testString1), &status);
1243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
1244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status));
1245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(col);
1246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else{ log_verbose("PASS: Default collationElement iterator2 creation passed\n");}
1249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iterator3 = ucol_openElements(col, testString2, u_strlen(testString2), &status);
1251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
1252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status));
1253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(col);
1254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else{ log_verbose("PASS: Default collationElement iterator3 creation passed\n");}
1257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    offset=ucol_getOffset(iterator1);
1259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setOffset(iterator1, 6, &status);
1260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error in setOffset for UCollatorElements iterator.: %s\n", myErrorName(status));
1262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(ucol_getOffset(iterator1)==6)
1265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("setOffset and getOffset working fine\n");
1266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else{
1267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("error in set and get Offset got %d instead of 6\n", ucol_getOffset(iterator1));
1268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setOffset(iterator1, 0, &status);
1271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order1 = ucol_next(iterator1, &status);
1272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator1.: %s\n", myErrorName(status));
1274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order2=ucol_getOffset(iterator2);
1277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((order1 != order2), "The first iterator advance failed");
1278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order2 = ucol_next(iterator2, &status);
1279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order3 = ucol_next(iterator3, &status);
1284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator3.: %s\n", myErrorName(status));
1286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
128885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert((order1 == order2), "The second iterator advance failed should be the same as first one");
129085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerudoAssert( (ucol_primaryOrder(order1) == ucol_primaryOrder(order3)), "The primary orders should be identical");
1292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerudoAssert( (ucol_secondaryOrder(order1) == ucol_secondaryOrder(order3)), "The secondary orders should be identical");
1293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerudoAssert( (ucol_tertiaryOrder(order1) == ucol_tertiaryOrder(order3)), "The tertiary orders should be identical");
129485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order1=ucol_next(iterator1, &status);
1296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order3=ucol_next(iterator3, &status);
1301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerudoAssert( (ucol_primaryOrder(order1) == ucol_primaryOrder(order3)), "The primary orders should be identical");
1306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerudoAssert( (ucol_tertiaryOrder(order1) != ucol_tertiaryOrder(order3)), "The tertiary orders should be different");
130785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order1=ucol_next(iterator1, &status);
1309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    order3=ucol_next(iterator3, &status);
1314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
1315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* this here, my friends, is either pure lunacy or something so obsolete that even it's mother
1319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * doesn't care about it. Essentialy, this test complains if secondary values for 'I' and '_'
1320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * are the same. According to the UCA, this is not true. Therefore, remove the test.
1321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Besides, if primary strengths for two code points are different, it doesn't matter one bit
1322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * what is the relation between secondary or any other strengths.
1323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * killed by weiv 06/11/2002.
1324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
1325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
1326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( ((order1 & UCOL_SECONDARYMASK) != (order3 & UCOL_SECONDARYMASK)), "The secondary orders should be different");
1327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    */
1328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert( (order1 != UCOL_NULLORDER), "Unexpected end of iterator reached");
1329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(testString1);
1331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(testString2);
1332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iterator1);
1333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iterator2);
1334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iterator3);
1335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(col);
133685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing CollationElementIterator ends...\n");
1338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestGetLocale() {
1341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  const char *rules = "&a<x<y<z";
1343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UChar rlz[256] = {0};
1344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  uint32_t rlzLen = u_unescape(rules, rlz, 256);
1345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UCollator *coll = NULL;
1347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  const char *locale = NULL;
1348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  int32_t i = 0;
1350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /* Now that the collation tree is separate, actual==valid at all times. [alan] */
1352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static const struct {
1353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* requestedLocale;
1354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* validLocale;
1355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* actualLocale;
1356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  } testStruct[] = {
135727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "sr_RS", "sr_Cyrl_RS", "sr" },
1358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    { "sh_YU", "sr_Latn_RS", "hr" }, /* this used to be sh, but now sh collation aliases hr */
135927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "en_BE_FOO", "en_BE", "root" },
136027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "de_DE_NONEXISTANT", "de_DE", "de" }
1361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
1362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /* test opening collators for different locales */
1364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  for(i = 0; i<sizeof(testStruct)/sizeof(testStruct[0]); i++) {
1365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
1366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_open(testStruct[i].requestedLocale, &status);
1367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
136885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "Failed to open collator for %s with %s\n", testStruct[i].requestedLocale, u_errorName(status));
1369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_close(coll);
1370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      continue;
1371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
137285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status);
1373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(locale, testStruct[i].requestedLocale) != 0) {
1374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("[Coll %s]: Error in requested locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].requestedLocale, locale);
1375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
137685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status);
1377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(locale, testStruct[i].validLocale) != 0) {
1378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("[Coll %s]: Error in valid locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].validLocale, locale);
1379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
138085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    locale = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status);
1381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(locale, testStruct[i].actualLocale) != 0) {
1382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("[Coll %s]: Error in actual locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].actualLocale, locale);
1383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
1385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /* completely non-existant locale for collator should get a default collator */
1388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
1389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *defaultColl = ucol_open(NULL, &status);
1390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_open("blahaha", &status);
1391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status)) {
139285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      if(strcmp(ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status), "blahaha")) {
1393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Nonexisting locale didn't preserve the requested locale\n");
1394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
139585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      if(strcmp(ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status),
139685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_getLocaleByType(defaultColl, ULOC_VALID_LOCALE, &status))) {
1397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Valid locale for nonexisting locale locale collator differs "
1398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "from valid locale for default collator\n");
1399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
140085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      if(strcmp(ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status),
140185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_getLocaleByType(defaultColl, ULOC_ACTUAL_LOCALE, &status))) {
1402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Actual locale for nonexisting locale locale collator differs "
1403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "from actual locale for default collator\n");
1404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
1405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_close(coll);
1406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_close(defaultColl);
1407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
1408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_data_err("Couldn't open collators\n");
1409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
141285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /* collator instantiated from rules should have all three locales NULL */
1415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  coll = ucol_openRules(rlz, rlzLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
141685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status);
1417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(locale != NULL) {
1418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("For collator instantiated from rules, requested locale returned %s instead of NULL\n", locale);
1419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
142085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status);
1421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(locale != NULL) {
1422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("For collator instantiated from rules,  valid locale returned %s instead of NULL\n", locale);
1423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
142485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  locale = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status);
1425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(locale != NULL) {
1426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("For collator instantiated from rules, actual locale returned %s instead of NULL\n", locale);
1427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ucol_close(coll);
1429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestGetAll()
1434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i, count;
1436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count=ucol_countAvailable();
1437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* use something sensible w/o hardcoding the count */
1438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(count < 0){
1439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error in countAvailable(), it returned %d\n", count);
1440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else{
1442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("PASS: countAvailable() successful, it returned %d\n", count);
1443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0;i<count;i++)
1445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("%s\n", ucol_getAvailable(i));
1446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct teststruct {
1452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *original;
1453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t key[256];
1454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} ;
1455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int compare_teststruct(const void *string1, const void *string2) {
1457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return(strcmp((const char *)((struct teststruct *)string1)->key, (const char *)((struct teststruct *)string2)->key));
1458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestBounds() {
1461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll = ucol_open("sh", &status);
1464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t sortkey[512], lower[512], upper[512];
1466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar buffer[512];
1467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char * const test[] = {
1469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "John Smith",
1470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "JOHN SMITH",
1471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "john SMITH",
1472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "j\\u00F6hn sm\\u00EFth",
1473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "J\\u00F6hn Sm\\u00EFth",
1474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "J\\u00D6HN SM\\u00CFTH",
1475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "john smithsonian",
1476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "John Smithsonian",
1477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    struct teststruct tests[] = {
1480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI MIHALJ" } ,
1481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI MIHALJ" } ,
1482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI PIRO\\u0160KA" },
1483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABAI ANDRIJA" } ,
1484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABAI LAJO\\u0160" } ,
1485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABAI MARIJA" } ,
1486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABAI STEVAN" } ,
1487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABAI STEVAN" } ,
1488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA BRANKO" } ,
1489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA MILENKO" } ,
1490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA MIROSLAV" } ,
1491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA SIMO" } ,
1492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA STANKO" } ,
1493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA TAMARA" } ,
1494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABARKAPA TOMA\\u0160" } ,
1495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABDARI\\u0106 NIKOLA" } ,
1496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABDARI\\u0106 ZORICA" } ,
1497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABI NANDOR" } ,
1498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABOVI\\u0106 MILAN" } ,
1499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRADI AGNEZIJA" } ,
1500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRADI IVAN" } ,
1501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRADI JELENA" } ,
1502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRADI LJUBICA" } ,
1503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRADI STEVAN" } ,
1504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRDA MARTIN" } ,
1505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRILO BOGDAN" } ,
1506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRILO BRANISLAV" } ,
1507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRILO LAZAR" } ,
1508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRILO LJUBICA" } ,
1509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CABRILO SPASOJA" } ,
1510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CADE\\u0160 ZDENKA" } ,
1511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CADESKI BLAGOJE" } ,
1512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CADOVSKI VLADIMIR" } ,
1513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAGLJEVI\\u0106 TOMA" } ,
1514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAGOROVI\\u0106 VLADIMIR" } ,
1515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAJA VANKA" } ,
1516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAJI\\u0106 BOGOLJUB" } ,
1517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAJI\\u0106 BORISLAV" } ,
1518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAJI\\u0106 RADOSLAV" } ,
1519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAK\\u0160IRAN MILADIN" } ,
1520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN EUGEN" } ,
1521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN EVGENIJE" } ,
1522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN IVAN" } ,
1523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN JULIJAN" } ,
1524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN MIHAJLO" } ,
1525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN STEVAN" } ,
1526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN VLADIMIR" } ,
1527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN VLADIMIR" } ,
1528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAN VLADIMIR" } ,
1529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKARA ANA" } ,
1530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAREVI\\u0106 MOMIR" } ,
1531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKAREVI\\u0106 NEDELJKO" } ,
1532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI \\u0160ANDOR" } ,
1533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI AMALIJA" } ,
1534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI ANDRA\\u0160" } ,
1535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI LADISLAV" } ,
1536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI LAJO\\u0160" } ,
1537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"\\u010CAKI LASLO" } ,
1538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i = 0, j = 0, k = 0, buffSize = 0, skSize = 0, lowerSize = 0, upperSize = 0;
1543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t arraySize = sizeof(tests)/sizeof(tests[0]);
1544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status) && coll) {
1546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(i = 0; i<arraySize; i++) {
1547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            buffSize = u_unescape(tests[i].original, buffer, 512);
1548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            skSize = ucol_getSortKey(coll, buffer, buffSize, tests[i].key, 512);
1549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        qsort(tests, arraySize, sizeof(struct teststruct), compare_teststruct);
1552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(i = 0; i < arraySize-1; i++) {
1554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(j = i+1; j < arraySize; j++) {
1555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                lowerSize = ucol_getBound(tests[i].key, -1, UCOL_BOUND_LOWER, 1, lower, 512, &status);
1556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                upperSize = ucol_getBound(tests[j].key, -1, UCOL_BOUND_UPPER, 1, upper, 512, &status);
1557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                for(k = i; k <= j; k++) {
1558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if(strcmp((const char *)lower, (const char *)tests[k].key) > 0) {
1559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        log_err("Problem with lower! j = %i (%s vs %s)\n", k, tests[k].original, tests[i].original);
1560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
1561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if(strcmp((const char *)upper, (const char *)tests[k].key) <= 0) {
1562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        log_err("Problem with upper! j = %i (%s vs %s)\n", k, tests[k].original, tests[j].original);
1563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
1564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
1570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(i = 0; i < 1000; i++) {
1571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            lowerRND = (rand()/(RAND_MAX/arraySize));
1572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            upperRND = lowerRND + (rand()/(RAND_MAX/(arraySize-lowerRND)));
1573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            lowerSize = ucol_getBound(tests[lowerRND].key, -1, UCOL_BOUND_LOWER, 1, lower, 512, &status);
1575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            upperSize = ucol_getBound(tests[upperRND].key, -1, UCOL_BOUND_UPPER_LONG, 1, upper, 512, &status);
1576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(j = lowerRND; j<=upperRND; j++) {
1578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(strcmp(lower, tests[j].key) > 0) {
1579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Problem with lower! j = %i (%s vs %s)\n", j, tests[j].original, tests[lowerRND].original);
1580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(strcmp(upper, tests[j].key) <= 0) {
1582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Problem with upper! j = %i (%s vs %s)\n", j, tests[j].original, tests[upperRND].original);
1583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(i = 0; i<sizeof(test)/sizeof(test[0]); i++) {
1593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            buffSize = u_unescape(test[i], buffer, 512);
1594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            skSize = ucol_getSortKey(coll, buffer, buffSize, sortkey, 512);
1595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            lowerSize = ucol_getBound(sortkey, skSize, UCOL_BOUND_LOWER, 1, lower, 512, &status);
1596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            upperSize = ucol_getBound(sortkey, skSize, UCOL_BOUND_UPPER_LONG, 1, upper, 512, &status);
1597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(j = i+1; j<sizeof(test)/sizeof(test[0]); j++) {
1598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                buffSize = u_unescape(test[j], buffer, 512);
1599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                skSize = ucol_getSortKey(coll, buffer, buffSize, sortkey, 512);
1600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(strcmp((const char *)lower, (const char *)sortkey) > 0) {
1601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Problem with lower! i = %i, j = %i (%s vs %s)\n", i, j, test[i], test[j]);
1602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(strcmp((const char *)upper, (const char *)sortkey) <= 0) {
1604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Problem with upper! i = %i, j = %i (%s vs %s)\n", i, j, test[i], test[j]);
1605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(coll);
1609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
1610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Couldn't open collator\n");
1611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void doOverrunTest(UCollator *coll, const UChar *uString, int32_t strLen) {
1616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t skLen = 0, skLen2 = 0;
1617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t sortKey[256];
1618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i, j;
1619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t filler = 0xFF;
1620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    skLen = ucol_getSortKey(coll, uString, strLen, NULL, 0);
1622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i = 0; i < skLen; i++) {
1624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memset(sortKey, filler, 256);
1625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        skLen2 = ucol_getSortKey(coll, uString, strLen, sortKey, i);
1626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(skLen != skLen2) {
1627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("For buffer size %i, got different sortkey length. Expected %i got %i\n", i, skLen, skLen2);
1628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(j = i; j < 256; j++) {
1630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(sortKey[j] != filler) {
1631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("Something run over index %i\n", j);
1632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                break;
1633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* j1865 reports that if a shorter buffer is passed to
163985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* to get sort key, a buffer overrun happens in some
1640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* cases. This test tries to check this.
1641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
1642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestSortKeyBufferOverrun(void) {
1643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cString = "A very Merry liTTle-lamB..";
1645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar uString[256];
1646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t strLen = 0;
1647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll = ucol_open("root", &status);
1648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    strLen = u_unescape(cString, uString, 256);
1649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("testing non ignorable\n");
1652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
1653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("testing shifted\n");
1656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
1657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("testing shifted quaternary\n");
1660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
1661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("testing with french secondaries\n");
1664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_ON, &status);
1665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status);
1666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
1667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
1671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestAttribute()
1674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode error = U_ZERO_ERROR;
1676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll = ucol_open(NULL, &error);
1677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(error)) {
167985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Creation of default collator failed\n");
1680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_OFF, &error);
1684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, &error) != UCOL_OFF ||
1685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
168685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the french collation failed\n");
1687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_ON, &error);
1690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, &error) != UCOL_ON ||
1691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
169285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the french collation failed\n");
1693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &error);
1696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &error) != UCOL_SHIFTED ||
1697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
169885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the alternate handling failed\n");
1699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &error);
1702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &error) != UCOL_NON_IGNORABLE ||
1703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
170485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the alternate handling failed\n");
1705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_LOWER_FIRST, &error);
1708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_FIRST, &error) != UCOL_LOWER_FIRST ||
1709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
171085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the case first attribute failed\n");
1711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_UPPER_FIRST, &error);
1714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_FIRST, &error) != UCOL_UPPER_FIRST ||
1715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
171685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the case first attribute failed\n");
1717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &error);
1720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_LEVEL, &error) != UCOL_ON ||
1721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
172285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the case level attribute failed\n");
1723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &error);
1726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_LEVEL, &error) != UCOL_OFF ||
1727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
172885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the case level attribute failed\n");
1729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &error);
1732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, &error) != UCOL_ON ||
1733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
173485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the normalization on/off attribute failed\n");
1735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &error);
1738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, &error) != UCOL_OFF ||
1739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
174085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the normalization on/off attribute failed\n");
1741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &error);
1744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_PRIMARY ||
1745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
174685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_SECONDARY, &error);
1750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_SECONDARY ||
1751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
175285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &error);
1756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_TERTIARY ||
1757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
175885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &error);
1762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_QUATERNARY ||
1763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
176485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_IDENTICAL, &error);
1768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_IDENTICAL ||
1769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_FAILURE(error)) {
177085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
1774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestGetTailoredSet() {
1777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  struct {
1778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *rules;
1779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *tests[20];
1780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t testsize;
1781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  } setTest[] = {
1782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    { "&a < \\u212b", { "\\u212b", "A\\u030a", "\\u00c5" }, 3},
1783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    { "& S < \\u0161 <<< \\u0160", { "\\u0161", "s\\u030C", "\\u0160", "S\\u030C" }, 4}
1784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
1785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  int32_t i = 0, j = 0;
1787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UParseError pError;
1789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UCollator *coll = NULL;
1791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UChar buff[1024];
1792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  int32_t buffLen = 0;
1793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  USet *set = NULL;
1794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  for(i = 0; i < sizeof(setTest)/sizeof(setTest[0]); i++) {
1796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buffLen = u_unescape(setTest[i].rules, buff, 1024);
1797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_openRules(buff, buffLen, UCOL_DEFAULT, UCOL_DEFAULT, &pError, &status);
1798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      set = ucol_getTailoredSet(coll, &status);
1800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(uset_size(set) != setTest[i].testsize) {
1801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Tailored set size different (%d) than expected (%d)\n", uset_size(set), setTest[i].testsize);
1802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
1803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      for(j = 0; j < setTest[i].testsize; j++) {
1804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        buffLen = u_unescape(setTest[i].tests[j], buff, 1024);
1805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(!uset_containsString(set, buff, buffLen)) {
1806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Tailored set doesn't contain %s... It should\n", setTest[i].tests[j]);
1807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
1809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      uset_close(set);
1810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
181185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "Couldn't open collator with rules %s\n", setTest[i].rules);
1812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
1814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
1815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int tMemCmp(const uint8_t *first, const uint8_t *second) {
1818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   int32_t firstLen = (int32_t)strlen((const char *)first);
1819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   int32_t secondLen = (int32_t)strlen((const char *)second);
1820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   return memcmp(first, second, uprv_min(firstLen, secondLen));
1821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char * strengthsC[] = {
1823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "UCOL_PRIMARY",
1824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "UCOL_SECONDARY",
1825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "UCOL_TERTIARY",
1826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "UCOL_QUATERNARY",
1827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "UCOL_IDENTICAL"
1828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
182985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestMergeSortKeys(void) {
1831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   UErrorCode status = U_ZERO_ERROR;
1832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   UCollator *coll = ucol_open("en", &status);
1833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   if(U_SUCCESS(status)) {
183485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* cases[] = {
1836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       "abc",
1837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         "abcd",
1838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         "abcde"
1839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     };
1840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint32_t casesSize = sizeof(cases)/sizeof(cases[0]);
1841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* prefix = "foo";
1842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* suffix = "egg";
1843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     char outBuff1[256], outBuff2[256];
184485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint8_t **sortkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *));
1846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint8_t **mergedPrefixkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *));
1847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint8_t **mergedSuffixkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *));
1848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint32_t *sortKeysLen = (uint32_t *)malloc(casesSize*sizeof(uint32_t));
1849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint8_t prefixKey[256], suffixKey[256];
1850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint32_t prefixKeyLen = 0, suffixKeyLen = 0, i = 0;
1851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     UChar buffer[256];
1852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint32_t unescapedLen = 0, l1 = 0, l2 = 0;
1853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     UColAttributeValue strength;
185485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     log_verbose("ucol_mergeSortkeys test\n");
1856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     log_verbose("Testing order of the test cases\n");
1857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     genericLocaleStarter("en", cases, casesSize);
185885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     for(i = 0; i<casesSize; i++) {
1860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       sortkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t));
1861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       mergedPrefixkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t));
1862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       mergedSuffixkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t));
1863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
186485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     unescapedLen = u_unescape(prefix, buffer, 256);
1866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     prefixKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, prefixKey, 256);
186785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     unescapedLen = u_unescape(suffix, buffer, 256);
1869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     suffixKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, suffixKey, 256);
187085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     log_verbose("Massaging data with prefixes and different strengths\n");
1872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     strength = UCOL_PRIMARY;
1873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     while(strength <= UCOL_IDENTICAL) {
1874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       log_verbose("Strength %s\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]);
1875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       ucol_setAttribute(coll, UCOL_STRENGTH, strength, &status);
1876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       for(i = 0; i<casesSize; i++) {
1877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         unescapedLen = u_unescape(cases[i], buffer, 256);
1878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         sortKeysLen[i] = ucol_getSortKey(coll, buffer, unescapedLen, sortkeys[i], 256);
1879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucol_mergeSortkeys(prefixKey, prefixKeyLen, sortkeys[i], sortKeysLen[i], mergedPrefixkeys[i], 256);
1880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucol_mergeSortkeys(sortkeys[i], sortKeysLen[i], suffixKey, suffixKeyLen, mergedSuffixkeys[i], 256);
1881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if(i>0) {
1882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           if(tMemCmp(mergedPrefixkeys[i-1], mergedPrefixkeys[i]) >= 0) {
1883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             log_err("Error while comparing prefixed keys @ strength %s:\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]);
188485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho             log_err("%s\n%s\n",
1885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedPrefixkeys[i-1], outBuff1, &l1),
1886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedPrefixkeys[i], outBuff2, &l2));
1887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           }
1888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           if(tMemCmp(mergedSuffixkeys[i-1], mergedSuffixkeys[i]) >= 0) {
1889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             log_err("Error while comparing suffixed keys @ strength %s:\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]);
189085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho             log_err("%s\n%s\n",
1891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedSuffixkeys[i-1], outBuff1, &l1),
1892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedSuffixkeys[i], outBuff2, &l2));
1893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           }
1894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
1895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
1896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if(strength == UCOL_QUATERNARY) {
1897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         strength = UCOL_IDENTICAL;
1898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       } else {
1899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         strength++;
1900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
1901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
190285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     {
1904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       uint8_t smallBuf[3];
1905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       uint32_t reqLen = 0;
1906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       log_verbose("testing buffer overflow\n");
1907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       reqLen = ucol_mergeSortkeys(prefixKey, prefixKeyLen, suffixKey, suffixKeyLen, smallBuf, 3);
1908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if(reqLen != (prefixKeyLen+suffixKeyLen-1)) {
1909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Wrong preflight size for merged sortkey\n");
1910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
1911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
191285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     {
1914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar empty = 0;
1915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       uint8_t emptyKey[20], abcKey[50], mergedKey[100];
1916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       int32_t emptyKeyLen = 0, abcKeyLen = 0, mergedKeyLen = 0;
191785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       log_verbose("testing merging with sortkeys generated for empty strings\n");
1919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       emptyKeyLen = ucol_getSortKey(coll, &empty, 0, emptyKey, 20);
1920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       unescapedLen = u_unescape(cases[0], buffer, 256);
1921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       abcKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, abcKey, 50);
1922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       mergedKeyLen = ucol_mergeSortkeys(emptyKey, emptyKeyLen, abcKey, abcKeyLen, mergedKey, 100);
1923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if(mergedKey[0] != 2) {
1924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Empty sortkey didn't produce a level separator\n");
1925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
1926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       /* try with zeros */
1927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       mergedKeyLen = ucol_mergeSortkeys(emptyKey, 0, abcKey, abcKeyLen, mergedKey, 100);
1928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if(mergedKeyLen != 0 || mergedKey[0] != 0) {
1929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Empty key didn't produce null mergedKey\n");
1930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
1931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       mergedKeyLen = ucol_mergeSortkeys(abcKey, abcKeyLen, emptyKey, 0, mergedKey, 100);
1932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if(mergedKeyLen != 0 || mergedKey[0] != 0) {
1933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Empty key didn't produce null mergedKey\n");
1934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
193585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
193785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     for(i = 0; i<casesSize; i++) {
1939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       free(sortkeys[i]);
1940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       free(mergedPrefixkeys[i]);
1941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       free(mergedSuffixkeys[i]);
1942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
1943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     free(sortkeys);
1944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     free(mergedPrefixkeys);
1945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     free(mergedSuffixkeys);
1946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     free(sortKeysLen);
1947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     ucol_close(coll);
1948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* need to finish this up */
1949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   } else {
1950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     log_data_err("Couldn't open collator");
1951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   }
1952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
195385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestShortString(void)
1954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    struct {
1956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *input;
1957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *expectedOutput;
1958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *locale;
1959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode expectedStatus;
1960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t    expectedOffset;
1961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uint32_t   expectedIdentifier;
1962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } testCases[] = {
196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*
196427f654740f2a26ad62a5c155af9199af9e69b889claireho         * The following expectedOutput contains a collation weight (2700 from UCA 6.0)
196550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * which is the primary weight for the T character (U+0041) in the input.
196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * When that character gets a different weight in FractionalUCA.txt,
196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * the expectedOutput needs to be adjusted.
196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * That is, when we upgrade to a new UCA version or change collation
196950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * in such a way that the absolute weight for 'A' changes,
197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * we will get a test failure here and need to adjust the test case.
197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         */
197227f654740f2a26ad62a5c155af9199af9e69b889claireho        {"LDE_RDE_KPHONEBOOK_T0041_ZLATN","B2700_KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
197350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
197427f654740f2a26ad62a5c155af9199af9e69b889claireho        {"LEN_RUS_NO_AS_S4","AS_LROOT_NO_S4", NULL, U_USING_DEFAULT_WARNING, 0, 0 },
1975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
1976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"LDE_Kphonebook","KPHONEBOOK_LDE", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
1977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"Xqde_DE@collation=phonebookq_S3_EX","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
197827f654740f2a26ad62a5c155af9199af9e69b889claireho        {"LFR_FO", "FO_LROOT", NULL, U_USING_DEFAULT_WARNING, 0, 0 },
1979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"SO_LX_AS", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 8, 0 },
1980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {"S3_ASS_MMM", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 5, 0 }
1981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i = 0;
198485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = NULL, *fromNormalized = NULL;
1985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UParseError parseError;
1986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
198785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char fromShortBuffer[256], normalizedBuffer[256], fromNormalizedBuffer[256];
1988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* locale = NULL;
1989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
1992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
1993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(testCases[i].locale) {
1994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            locale = testCases[i].locale;
1995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
1996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            locale = NULL;
1997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        coll = ucol_openFromShortString(testCases[i].input, FALSE, &parseError, &status);
2000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(status != testCases[i].expectedStatus) {
200185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "Got status '%s' that is different from expected '%s' for '%s'\n",
2002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                u_errorName(status), u_errorName(testCases[i].expectedStatus), testCases[i].input);
200385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            continue;
2004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
200585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_getShortDefinitionString(coll, locale, fromShortBuffer, 256, &status);
2008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(strcmp(fromShortBuffer, testCases[i].expectedOutput)) {
2010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("Got short string '%s' from the collator. Expected '%s' for input '%s'\n",
2011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fromShortBuffer, testCases[i].expectedOutput, testCases[i].input);
2012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_normalizeShortDefinitionString(testCases[i].input, normalizedBuffer, 256, &parseError, &status);
2015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fromNormalized = ucol_openFromShortString(normalizedBuffer, FALSE, &parseError, &status);
2016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_getShortDefinitionString(fromNormalized, locale, fromNormalizedBuffer, 256, &status);
2017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(strcmp(fromShortBuffer, fromNormalizedBuffer)) {
201985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("Strings obtained from collators instantiated by short string ('%s') and from normalized string ('%s') differ\n",
2020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fromShortBuffer, fromNormalizedBuffer);
2021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(!ucol_equals(coll, fromNormalized)) {
202585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("Collator from short string ('%s') differs from one obtained through a normalized version ('%s')\n",
2026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    testCases[i].input, normalizedBuffer);
2027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_close(fromNormalized);
2030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_close(coll);
2031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
2033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(parseError.offset != testCases[i].expectedOffset) {
2034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("Got parse error offset %i, but expected %i instead for '%s'\n",
2035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    parseError.offset, testCases[i].expectedOffset, testCases[i].input);
2036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerudoSetsTest(const char *locale, const USet *ref, USet *set, const char* inSet, const char* outSet, UErrorCode *status) {
2044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar buffer[512];
2045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufLen;
2046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_clear(set);
204885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    bufLen = u_unescape(inSet, buffer, 512);
2049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_applyPattern(set, buffer, bufLen, 0, status);
2050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)) {
2051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("%s: Failure setting pattern %s\n", locale, u_errorName(*status));
2052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(!uset_containsAll(ref, set)) {
2055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("%s: Some stuff from %s is not present in the set\n", locale, inSet);
2056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_clear(set);
205985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    bufLen = u_unescape(outSet, buffer, 512);
2060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_applyPattern(set, buffer, bufLen, 0, status);
2061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)) {
2062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("%s: Failure setting pattern %s\n", locale, u_errorName(*status));
2063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(!uset_containsNone(ref, set)) {
2066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("%s: Some stuff from %s is present in the set\n", locale, outSet);
2067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
207385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void
207485bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestGetContractionsAndUnsafes(void)
2075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
2076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static struct {
2077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* locale;
2078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* inConts;
2079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* outConts;
2080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* inExp;
2081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* outExp;
2082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* unsafeCodeUnits;
2083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* safeCodeUnits;
2084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } tests[] = {
208585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { "ru",
208627f654740f2a26ad62a5c155af9199af9e69b889claireho            "[{\\u0418\\u0306}{\\u0438\\u0306}]",
208727f654740f2a26ad62a5c155af9199af9e69b889claireho            "[\\u0439\\u0457]",
2088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[\\u00e6]",
208927f654740f2a26ad62a5c155af9199af9e69b889claireho            "[ae]",
209027f654740f2a26ad62a5c155af9199af9e69b889claireho            "[\\u0418\\u0438]",
2091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[aAbB\\u0430\\u0410\\u0433\\u0413]"
2092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        },
2093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "uk",
209427f654740f2a26ad62a5c155af9199af9e69b889claireho            "[{\\u0406\\u0308}{\\u0456\\u0308}{\\u0418\\u0306}{\\u0438\\u0306}]",
209527f654740f2a26ad62a5c155af9199af9e69b889claireho            "[\\u0407\\u0419\\u0439\\u0457]",
2096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[\\u00e6]",
209727f654740f2a26ad62a5c155af9199af9e69b889claireho            "[ae]",
209827f654740f2a26ad62a5c155af9199af9e69b889claireho            "[\\u0406\\u0456\\u0418\\u0438]",
2099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[aAbBxv]",
2100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        },
2101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "sh",
2102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[{C\\u0301}{C\\u030C}{C\\u0341}{DZ\\u030C}{Dz\\u030C}{D\\u017D}{D\\u017E}{lj}{nj}]",
2103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[{\\u309d\\u3099}{\\u30fd\\u3099}]",
2104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[\\u00e6]",
2105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[a]",
2106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[nlcdzNLCDZ]",
2107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[jabv]"
2108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        },
2109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        { "ja",
2110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "[{\\u3053\\u3099\\u309D}{\\u3053\\u3099\\u309D\\u3099}{\\u3053\\u3099\\u309E}{\\u3053\\u3099\\u30FC}{\\u3053\\u309D}{\\u3053\\u309D\\u3099}{\\u3053\\u309E}{\\u3053\\u30FC}{\\u30B3\\u3099\\u30FC}{\\u30B3\\u3099\\u30FD}{\\u30B3\\u3099\\u30FD\\u3099}{\\u30B3\\u3099\\u30FE}{\\u30B3\\u30FC}{\\u30B3\\u30FD}{\\u30B3\\u30FD\\u3099}{\\u30B3\\u30FE}]",
2111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "[{\\u30FD\\u3099}{\\u309D\\u3099}{\\u3053\\u3099}{\\u30B3\\u3099}{lj}{nj}]",
2112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[\\u30FE\\u00e6]",
2113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[a]",
2114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[\\u3099]",
2115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            "[]"
2116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll = NULL;
2124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i = 0;
2125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t noConts = 0;
2126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    USet *conts = uset_open(0,0);
2127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    USet *exp = uset_open(0, 0);
2128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    USet *set  = uset_open(0,0);
2129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t setBufferLen = 65536;
2130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar buffer[65536];
2131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t setLen = 0;
2132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
2134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Testing locale: %s\n", tests[i].locale);
2135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        coll = ucol_open(tests[i].locale, &status);
213685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (coll == NULL || U_FAILURE(status)) {
213785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "Unable to open collator for locale %s ==> %s\n", tests[i].locale, u_errorName(status));
213885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            continue;
213985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
2140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_getContractionsAndExpansions(coll, conts, exp, TRUE, &status);
2141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doSetsTest(tests[i].locale, conts, set, tests[i].inConts, tests[i].outConts, &status);
2142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        setLen = uset_toPattern(conts, buffer, setBufferLen, TRUE, &status);
2143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*log_verbose("Contractions %i: %s\n", uset_getItemCount(conts), aescstrdup(buffer, setLen));*/
2145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
2146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("error %s. %i\n", u_errorName(status), setLen);
2147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status = U_ZERO_ERROR;
2148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doSetsTest(tests[i].locale, exp, set, tests[i].inExp, tests[i].outExp, &status);
2150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        setLen = uset_toPattern(exp, buffer, setBufferLen, TRUE, &status);
2151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*log_verbose("Expansions %i: %s\n", uset_getItemCount(exp), aescstrdup(buffer, setLen));*/
2153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
2154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("error %s. %i\n", u_errorName(status), setLen);
2155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status = U_ZERO_ERROR;
2156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        noConts = ucol_getUnsafeSet(coll, conts, &status);
2159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        doSetsTest(tests[i].locale, conts, set, tests[i].unsafeCodeUnits, tests[i].safeCodeUnits, &status);
2160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        setLen = uset_toPattern(conts, buffer, setBufferLen, TRUE, &status);
2161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose("Unsafe %i: %s\n", uset_getItemCount(exp), aescstrdup(buffer, setLen));
2163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
2164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("error %s. %i\n", u_errorName(status), setLen);
2165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status = U_ZERO_ERROR;
2166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(coll);
2169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_close(conts);
2173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_close(exp);
2174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uset_close(set);
2175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
217785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void
217885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestOpenBinary(void)
2179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
2180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
2182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char rule[] = "&h < d < c < b";
2183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *wUCA[] = { "a", "h", "d", "c", "b", "i" };
2184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *noUCA[] = {"d", "c", "b", "a", "h", "i" };
2185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    */
2186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* we have to use Cyrillic letters because latin-1 always gets copied */
2187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char rule[] = "&\\u0452 < \\u0434 < \\u0433 < \\u0432"; /* &dje < d < g < v */
2188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *wUCA[] = { "\\u0430", "\\u0452", "\\u0434", "\\u0433", "\\u0432", "\\u0435" }; /* a, dje, d, g, v, e */
2189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *noUCA[] = {"\\u0434", "\\u0433", "\\u0432", "\\u0430", "\\u0435", "\\u0452" }; /* d, g, v, a, e, dje */
2190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar uRules[256];
2192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uRulesLen = u_unescape(rule, uRules, 256);
2193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll = ucol_openRules(uRules, uRulesLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
219585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *UCA = NULL;
2196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *cloneNOUCA = NULL, *cloneWUCA = NULL;
2197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t imageBuffer[32768];
2199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *image = imageBuffer;
2200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t imageBufferCapacity = 32768;
2201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t imageSize;
2203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
220485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if((coll==NULL)||(U_FAILURE(status))) {
2205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("could not load collators or error occured: %s\n",
2206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            u_errorName(status));
2207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
220885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
220985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCA = ucol_open("root", &status);
221085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if((UCA==NULL)||(U_FAILURE(status))) {
221185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("could not load UCA collator or error occured: %s\n",
221285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            u_errorName(status));
221385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
221485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
2215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    imageSize = ucol_cloneBinary(coll, image, imageBufferCapacity, &status);
2216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
2217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        image = (uint8_t *)malloc(imageSize*sizeof(uint8_t));
2218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
2219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        imageSize = ucol_cloneBinary(coll, imageBuffer, imageSize, &status);
2220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cloneWUCA = ucol_openBinary(image, imageSize, UCA, &status);
2224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cloneNOUCA = ucol_openBinary(image, imageSize, NULL, &status);
2225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    genericOrderingTest(coll, wUCA, sizeof(wUCA)/sizeof(wUCA[0]));
2227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    genericOrderingTest(cloneWUCA, wUCA, sizeof(wUCA)/sizeof(wUCA[0]));
2229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    genericOrderingTest(cloneNOUCA, noUCA, sizeof(noUCA)/sizeof(noUCA[0]));
2230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(image != imageBuffer) {
2232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(image);
2233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
2235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(cloneNOUCA);
2236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(cloneWUCA);
2237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(UCA);
2238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestDefault(void) {
2241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Tests for code coverage. */
2242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll = ucol_open("es@collation=pinyin", &status);
224485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (coll == NULL || status == U_FILE_ACCESS_ERROR) {
224585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Unable to open collator es@collation=pinyin\n");
224685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
224785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
2248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (status != U_USING_DEFAULT_WARNING) {
2249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* What do you mean that you know about using pinyin collation in Spanish!? This should be in the zh locale. */
2250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("es@collation=pinyin should return U_USING_DEFAULT_WARNING, but returned %s\n", u_errorName(status));
2251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
2253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getKeywordValues("funky", &status) != NULL) {
2254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Collators should not know about the funky keyword.\n");
2255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
2257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("funky keyword didn't fail as expected %s\n", u_errorName(status));
2258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ucol_getKeywordValues("collation", &status) != NULL) {
2260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucol_getKeywordValues should not work when given a bad status.\n");
2261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
226485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestDefaultKeyword(void) {
226585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Tests for code coverage. */
226685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
226785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *loc = "zh_TW@collation=default";
226885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = ucol_open(loc, &status);
226985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)) {
227085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_info("Warning: ucol_open(%s, ...) returned %s, at least it didn't crash.\n", loc, u_errorName(status));
227185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else if (status != U_USING_FALLBACK_WARNING) {
227227f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Hmm, skip the following test for CLDR 1.9 data and/or ICU 4.6, no longer seems to apply */
227327f654740f2a26ad62a5c155af9199af9e69b889claireho        #if 0
227485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("ucol_open(%s, ...) should return an error or some sort of U_USING_FALLBACK_WARNING, but returned %s\n", loc, u_errorName(status));
227527f654740f2a26ad62a5c155af9199af9e69b889claireho        #endif
227685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
227785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
227885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
227985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
228085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestGetKeywordValuesForLocale(void) {
228127f654740f2a26ad62a5c155af9199af9e69b889claireho#define INCLUDE_UNIHAN_COLLATION 0
228285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define PREFERRED_SIZE 16
228327f654740f2a26ad62a5c155af9199af9e69b889claireho#define MAX_NUMBER_OF_KEYWORDS 8
228485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *PREFERRED[PREFERRED_SIZE][MAX_NUMBER_OF_KEYWORDS+1] = {
228527f654740f2a26ad62a5c155af9199af9e69b889claireho            { "und",            "standard", "ducet", "search", NULL, NULL, NULL, NULL, NULL },
228627f654740f2a26ad62a5c155af9199af9e69b889claireho            { "en_US",          "standard", "ducet", "search", NULL, NULL, NULL, NULL, NULL },
228727f654740f2a26ad62a5c155af9199af9e69b889claireho            { "en_029",         "standard", "ducet", "search", NULL, NULL, NULL, NULL, NULL },
228827f654740f2a26ad62a5c155af9199af9e69b889claireho            { "de_DE",          "standard", "phonebook", "search", "ducet", NULL, NULL, NULL, NULL },
228927f654740f2a26ad62a5c155af9199af9e69b889claireho            { "de_Latn_DE",     "standard", "phonebook", "search", "ducet", NULL, NULL, NULL, NULL },
229027f654740f2a26ad62a5c155af9199af9e69b889claireho#if INCLUDE_UNIHAN_COLLATION
229127f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh",             "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan", "ducet", "search" },
229227f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_Hans",        "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan", "ducet", "search" },
229327f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_CN",          "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan", "ducet", "search" },
229427f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_Hant",        "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan", "ducet", "search" },
229527f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_TW",          "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan", "ducet", "search" },
229627f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh__PINYIN",     "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan", "ducet", "search" },
229727f654740f2a26ad62a5c155af9199af9e69b889claireho#else
229827f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh",             "pinyin", "big5han", "gb2312han", "standard", "stroke", "ducet", "search", NULL },
229927f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_Hans",        "pinyin", "big5han", "gb2312han", "standard", "stroke", "ducet", "search", NULL },
230027f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_CN",          "pinyin", "big5han", "gb2312han", "standard", "stroke", "ducet", "search", NULL },
230127f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_Hant",        "stroke", "big5han", "gb2312han", "pinyin", "standard", "ducet", "search", NULL },
230227f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh_TW",          "stroke", "big5han", "gb2312han", "pinyin", "standard", "ducet", "search", NULL },
230327f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zh__PINYIN",     "pinyin", "big5han", "gb2312han", "standard", "stroke", "ducet", "search", NULL },
230427f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
230527f654740f2a26ad62a5c155af9199af9e69b889claireho            { "es_ES",          "standard", "search", "traditional", "ducet", NULL, NULL, NULL, NULL },
230627f654740f2a26ad62a5c155af9199af9e69b889claireho            { "es__TRADITIONAL","traditional", "search", "standard", "ducet", NULL, NULL, NULL, NULL },
230727f654740f2a26ad62a5c155af9199af9e69b889claireho            { "und@collation=phonebook",    "standard", "ducet", "search", NULL, NULL, NULL, NULL, NULL },
230827f654740f2a26ad62a5c155af9199af9e69b889claireho            { "de_DE@collation=big5han",    "standard", "phonebook", "search", "ducet", NULL, NULL, NULL, NULL },
230927f654740f2a26ad62a5c155af9199af9e69b889claireho            { "zzz@collation=xxx",          "standard", "ducet", "search", NULL, NULL, NULL, NULL, NULL }
231085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
231127f654740f2a26ad62a5c155af9199af9e69b889claireho#if INCLUDE_UNIHAN_COLLATION
231227f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t expectedLength[PREFERRED_SIZE] = { 3, 3, 3, 4, 4, 8, 8, 8, 8, 8, 8, 4, 4, 3, 4, 3 };
231327f654740f2a26ad62a5c155af9199af9e69b889claireho#else
231427f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t expectedLength[PREFERRED_SIZE] = { 3, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 4, 4, 3, 4, 3 };
231527f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
231685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
231785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
231885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UEnumeration *keywordValues = NULL;
231985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i, n, size, valueLength;
232085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *locale = NULL, *value = NULL;
232185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool errorOccurred = FALSE;
232285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
232385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for (i = 0; i < PREFERRED_SIZE; i++) {
232485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        locale = PREFERRED[i][0];
232585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        value = NULL;
232685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        valueLength = 0;
232785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        size = 0;
232885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
232985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        keywordValues = ucol_getKeywordValuesForLocale("collation", locale, TRUE, &status);
233085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (keywordValues == NULL || U_FAILURE(status)) {
233185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "Error getting keyword values: %s\n", u_errorName(status));
233285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            break;
233385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
233485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        size = uenum_count(keywordValues, &status);
233585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
233685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (size == expectedLength[i]) {
233785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            for (n = 0; n < expectedLength[i]; n++) {
233885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if ((value = uenum_next(keywordValues, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
233985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    if (uprv_strcmp(value, PREFERRED[i][n+1]) != 0) {
234085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        log_err("Keyword values differ: Got [%s] Expected [%s] for locale: %s\n", value, PREFERRED[i][n+1], locale);
234185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        errorOccurred = TRUE;
234285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        break;
234385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    }
234485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
234585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                } else {
234685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    log_err("While getting keyword value from locale: %s got this error: %s\n", locale, u_errorName(status));
234785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    errorOccurred = TRUE;
234885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    break;
234985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
235085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
235185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (errorOccurred) {
235285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                break;
235385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
235485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        } else {
235585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Number of keywords (%d) does not match expected size (%d) for locale: %s\n", size, expectedLength[i], locale);
235685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            break;
235785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
235885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uenum_close(keywordValues);
235985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        keywordValues = NULL;
236085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
236185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (keywordValues != NULL) {
236285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uenum_close(keywordValues);
236385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
236485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
236585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
236685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
2368