capitst.c revision 50294ead5e5d23f5bbfed76e00e6b510bd41eee1
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010 International Business Machines
3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Corporation and others. All Rights Reserved.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
5c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/*****************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CAPITEST.C
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*        Name                     Description
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda             Ported for C API
12b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*     Brian Rower                  Added TestOpenVsOpenRules
13c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru******************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*//* C API TEST For COLLATOR */
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/ulocdata.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucoleitr.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "capitst.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ccolltst.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h"
32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAttribute(void);
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDefault(void);
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestDefaultKeyword(void);
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int TestBufferSize();    /* defined in "colutil.c" */
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* next two function is modified from "i18n/ucol.cpp" to avoid include "ucol_imp.h" */
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void uprv_appendByteToHexString(char *dst, uint8_t val) {
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t len = (uint32_t)strlen(dst);
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sprintf(dst+len, "%02X", val);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* U_EXPORT2 ucol_sortKeyToString(const UCollator *coll, const uint8_t *sortkey, char *buffer, uint32_t *len) {
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t strength = UCOL_PRIMARY;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t res_size = 0;
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool doneCase = FALSE;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char *current = buffer;
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const uint8_t *currentSk = sortkey;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error_code = U_ZERO_ERROR;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcpy(current, "[");
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  while(strength <= UCOL_QUATERNARY && strength <= ucol_getAttribute(coll,UCOL_STRENGTH, &error_code)) {
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(error_code)) {
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code));
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strength > UCOL_PRIMARY) {
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcat(current, " . ");
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(*currentSk != 0x01 && *currentSk != 0x00) { /* print a level */
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_appendByteToHexString(current, *currentSk++);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcat(current, " ");
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ucol_getAttribute(coll,UCOL_CASE_LEVEL, &error_code) == UCOL_ON && strength == UCOL_SECONDARY && doneCase == FALSE) {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doneCase = TRUE;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(ucol_getAttribute(coll,UCOL_CASE_LEVEL, &error_code) == UCOL_OFF || doneCase == TRUE || strength != UCOL_SECONDARY) {
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strength ++;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(error_code)) {
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code));
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_appendByteToHexString(current, *currentSk++); /* This should print '01' */
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strength == UCOL_QUATERNARY && ucol_getAttribute(coll,UCOL_ALTERNATE_HANDLING, &error_code) == UCOL_NON_IGNORABLE) {
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(ucol_getAttribute(coll,UCOL_STRENGTH, &error_code) == UCOL_IDENTICAL) {
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(current, " . ");
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(*currentSk != 0) {
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_appendByteToHexString(current, *currentSk++);
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcat(current, " ");
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_appendByteToHexString(current, *currentSk++);
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(error_code)) {
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code));
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(current, "]");
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(res_size > *len) {
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return NULL;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return buffer;
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* end of  avoid include "ucol_imp.h" */
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addCollAPITest(TestNode** root)
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* WEIVTODO: return tests here */
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestProperty,      "tscoll/capitst/TestProperty");
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestRuleBasedColl, "tscoll/capitst/TestRuleBasedColl");
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCompare,       "tscoll/capitst/TestCompare");
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSortKey,       "tscoll/capitst/TestSortKey");
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestHashCode,      "tscoll/capitst/TestHashCode");
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestElemIter,      "tscoll/capitst/TestElemIter");
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetAll,        "tscoll/capitst/TestGetAll");
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*addTest(root, &TestGetDefaultRules, "tscoll/capitst/TestGetDefaultRules");*/
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestDecomposition, "tscoll/capitst/TestDecomposition");
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSafeClone, "tscoll/capitst/TestSafeClone");
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCloneBinary, "tscoll/capitst/TestCloneBinary");
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetAttr, "tscoll/capitst/TestGetSetAttr");
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBounds, "tscoll/capitst/TestBounds");
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetLocale, "tscoll/capitst/TestGetLocale");
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSortKeyBufferOverrun, "tscoll/capitst/TestSortKeyBufferOverrun");
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestAttribute, "tscoll/capitst/TestAttribute");
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetTailoredSet, "tscoll/capitst/TestGetTailoredSet");
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestMergeSortKeys, "tscoll/capitst/TestMergeSortKeys");
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestShortString, "tscoll/capitst/TestShortString");
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetContractionsAndUnsafes, "tscoll/capitst/TestGetContractionsAndUnsafes");
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOpenBinary, "tscoll/capitst/TestOpenBinary");
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestDefault, "tscoll/capitst/TestDefault");
133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestDefaultKeyword, "tscoll/capitst/TestDefaultKeyword");
134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestOpenVsOpenRules, "tscoll/capitst/TestOpenVsOpenRules");
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestGetKeywordValuesForLocale, "tscoll/capitst/TestGetKeywordValuesForLocale");
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetSetAttr(void) {
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open(NULL, &status);
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  struct attrTest {
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UColAttribute att;
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UColAttributeValue val[5];
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t valueSize;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UColAttributeValue nonValue;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } attrs[] = {
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_FRENCH_COLLATION, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_ALTERNATE_HANDLING, {UCOL_NON_IGNORABLE, UCOL_SHIFTED}, 2, UCOL_OFF},/* attribute for handling variable elements*/
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_CASE_FIRST, {UCOL_OFF, UCOL_LOWER_FIRST, UCOL_UPPER_FIRST}, 3, UCOL_SHIFTED},/* who goes first, lower case or uppercase */
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_CASE_LEVEL, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* do we have an extra case level */
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_NORMALIZATION_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* attribute for normalization */
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_DECOMPOSITION_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_STRENGTH,         {UCOL_PRIMARY, UCOL_SECONDARY, UCOL_TERTIARY, UCOL_QUATERNARY, UCOL_IDENTICAL}, 5, UCOL_SHIFTED},/* attribute for strength */
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {UCOL_HIRAGANA_QUATERNARY_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* when turned on, this attribute */
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttribute currAttr;
157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  UColAttributeValue value;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0, j = 0;
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru  if (coll == NULL) {
1616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    log_err_status(status, "Unable to open collator. %s\n", u_errorName(status));
1626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    return;
1636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru  }
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sizeof(attrs)/sizeof(attrs[0]); i++) {
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currAttr = attrs[i].att;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, currAttr, UCOL_DEFAULT, &status);
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      log_err_status(status, "ucol_setAttribute with the default value returned error: %s\n", u_errorName(status));
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    value = ucol_getAttribute(coll, currAttr, &status);
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ucol_getAttribute returned error: %s\n", u_errorName(status));
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(j = 0; j<attrs[i].valueSize; j++) {
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(coll, currAttr, attrs[i].val[j], &status);
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_FAILURE(status)) {
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucol_setAttribute with the value %i returned error: %s\n", attrs[i].val[j], u_errorName(status));
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, currAttr, attrs[i].nonValue, &status);
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ucol_setAttribute with the bad value didn't return an error\n");
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, currAttr, value, &status);
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ucol_setAttribute with the default valuereturned error: %s\n", u_errorName(status));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_ZERO_ERROR;
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  value = ucol_getAttribute(coll, UCOL_ATTRIBUTE_COUNT, &status);
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("ucol_getAttribute for UCOL_ATTRIBUTE_COUNT didn't return an error\n");
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_ZERO_ERROR;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_ATTRIBUTE_COUNT, UCOL_DEFAULT, &status);
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("ucol_setAttribute for UCOL_ATTRIBUTE_COUNT didn't return an error\n");
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_ZERO_ERROR;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doAssert(int condition, const char *message)
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (condition==0) {
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR :  %s\n", message);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* We don't have default rules, at least not in the previous sense */
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetDefaultRules(){
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t size=0;
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll=NULL;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len1 = 0, len2=0;
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *binColData = NULL;
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *res = NULL;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *binColl = NULL;
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *binResult = NULL;
231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar * defaultRulesArray=ucol_getDefaultRulesArray(&size);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Test the function ucol_getDefaultRulesArray()\n");
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(defaultRulesArray, size, UCOL_ON, UCOL_PRIMARY, &status);
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status) && coll !=NULL) {
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        binColData = (uint8_t*)ucol_cloneRuleData(coll, &len1, &status);
239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res=ures_open(NULL, "root", &status);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: Failed to get resource for \"root Locale\" with %s", myErrorName(status));
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    binColl=ures_getByKey(res, "%%Collation", binColl, &status);
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        binResult=(uint8_t*)ures_getBinary(binColl,  &len2, &status);
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: ures_getBinary() failed\n");
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: ures_getByKey(locale(default), %%Collation) failed");
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(len1 != len2){
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: ucol_getDefaultRulesArray() failed to return the correct length.\n");
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(memcmp(binColData, binResult, len1) != 0){
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: ucol_getDefaultRulesArray() failed\n");
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(binColData);
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(binColl);
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(res);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Collator Properties
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_open, ucol_strcoll,  getStrength/setStrength
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getDecomposition/setDecomposition, getDisplayName*/
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestProperty()
279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *col, *ruled;
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *disName;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = 0, i = 0;
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *source, *target;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t tempLength;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /*
28750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Expected version of the English collator.
28850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Currently, the major/minor version numbers change when the builder code
28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * changes,
29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * number 2 is from the tailoring data version and
29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * number 3 is the UCA version.
29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * This changes with every UCA version change, and the expected value
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * needs to be adjusted.
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Same in intltest/apicoll.cpp.
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UVersionInfo currVersionArray = {0x31, 0xC0, 0x00, 0x2A};
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UVersionInfo currUCAVersionArray = {5, 2, 0, 0};
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UVersionInfo versionArray = {0, 0, 0, 0};
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UVersionInfo versionUCAArray = {0, 0, 0, 0};
300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("The property tests begin : \n");
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Test ucol_strcoll : \n");
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = ucol_open("en_US", &status);
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Default Collator creation failed.: %s\n", myErrorName(status));
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getVersion(col, versionArray);
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<4; ++i) {
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (versionArray[i] != currVersionArray[i]) {
312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("Testing ucol_getVersion() - unexpected result: %hu.%hu.%hu.%hu\n",
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            versionArray[0], versionArray[1], versionArray[2], versionArray[3]);
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getUCAVersion(col, versionUCAArray);
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<4; ++i) {
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (versionUCAArray[i] != currUCAVersionArray[i]) {
321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("Testing ucol_getUCAVersion() - unexpected result: %hu.%hu.%hu.%hu\n",
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            versionUCAArray[0], versionUCAArray[1], versionUCAArray[2], versionUCAArray[3]);
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source=(UChar*)malloc(sizeof(UChar) * 12);
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=(UChar*)malloc(sizeof(UChar) * 12);
329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(source, "ab");
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(target, "abc");
333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), "ab < abc comparison failed");
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(source, "ab");
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(target, "AB");
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), "ab < AB comparison failed");
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    u_uastrcpy(source, "black-bird");
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(target, "blackbird"); */
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(target, "black-bird");
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(source, "blackbird");
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_GREATER),
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "black-bird > blackbird comparison failed");
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(source, "black bird");
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(target, "black-bird");
349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS),
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "black bird < black-bird comparison failed");
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(source, "Hello");
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(target, "hello");
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_GREATER),
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Hello > hello comparison failed");
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(source);
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(target);
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Test ucol_strcoll ends.\n");
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing ucol_getStrength() method ...\n");
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_TERTIARY), "collation object has the wrong strength");
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference");
363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing ucol_setStrength() method ...\n");
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(col, UCOL_SECONDARY);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_TERTIARY), "collation object's strength is secondary difference");
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_SECONDARY), "collation object has the wrong strength");
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Get display name for the default collation in German : \n");
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len=ucol_getDisplayName("en_US", "de_DE", NULL, 0,  &status);
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        disName=(UChar*)malloc(sizeof(UChar) * (len+1));
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getDisplayName("en_US", "de_DE", disName, len+1,  &status);
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("the display name for default collation in german: %s\n", austrdup(disName) );
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(disName);
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: in getDisplayName: %s\n", myErrorName(status));
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Default collation getDisplayName ended.\n");
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ruled = ucol_open("da_DK", &status);
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("ucol_getRules() testing ...\n");
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getRules(ruled, &tempLength);
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( tempLength != 0, "getRules() result incorrect" );
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("getRules tests end.\n");
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *buffer = (UChar *)malloc(200000*sizeof(UChar));
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t bufLen = 200000;
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[0] = '\0';
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ucol_getRulesEx() testing ...\n");
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempLength = ucol_getRulesEx(col,UCOL_TAILORING_ONLY,buffer,bufLen );
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doAssert( tempLength == 0x0a, "getRulesEx() result incorrect" );
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("getRules tests end.\n");
400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ucol_getRulesEx() testing ...\n");
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempLength=ucol_getRulesEx(col,UCOL_FULL_RULES,buffer,bufLen );
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doAssert( tempLength != 0, "getRulesEx() result incorrect" );
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("getRules tests end.\n");
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(buffer);
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(ruled);
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("open an collator for french locale");
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = ucol_open("fr_FR", &status);
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_err("ERROR: Creating French collation failed.: %s\n", myErrorName(status));
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(col, UCOL_PRIMARY);
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing ucol_getStrength() method again ...\n");
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_TERTIARY), "collation object has the wrong strength");
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_PRIMARY), "collation object's strength is not primary difference");
420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing French ucol_setStrength() method ...\n");
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(col, UCOL_TERTIARY);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) == UCOL_TERTIARY), "collation object's strength is not tertiary difference");
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference");
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_getStrength(col) != UCOL_SECONDARY), "collation object's strength is secondary difference");
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Get display name for the french collation in english : \n");
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len=ucol_getDisplayName("fr_FR", "en_US", NULL, 0,  &status);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        disName=(UChar*)malloc(sizeof(UChar) * (len+1));
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getDisplayName("fr_FR", "en_US", disName, len+1,  &status);
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("the display name for french collation in english: %s\n", austrdup(disName) );
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(disName);
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: in getDisplayName: %s\n", myErrorName(status));
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Default collation getDisplayName ended.\n");
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test RuleBasedCollator and getRules*/
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestRuleBasedColl()
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *col1, *col2, *col3, *col4;
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationElements *iter1, *iter2;
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar ruleset1[60];
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar ruleset2[50];
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar teststr[10];
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar teststr2[10];
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *rule1, *rule2, *rule3, *rule4;
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t tempLength;
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(ruleset1, "&9 < a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E");
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(ruleset2, "&9 < a, A < b, B < c, C < d, D, e, E");
459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL,&status);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
4636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "RuleBased Collator creation failed.: %s\n", myErrorName(status));
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: RuleBased Collator creation passed\n");
468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col2 = ucol_openRules(ruleset2, u_strlen(ruleset2),  UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: RuleBased Collator creation passed\n");
477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col3= ucol_open(NULL, &status);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Default Collator creation failed.: %s\n", myErrorName(status));
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: Default Collator creation passed\n");
487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rule1 = ucol_getRules(col1, &tempLength);
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rule2 = ucol_getRules(col2, &tempLength);
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rule3 = ucol_getRules(col3, &tempLength);
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((u_strcmp(rule1, rule2) != 0), "Default collator getRules failed");
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((u_strcmp(rule2, rule3) != 0), "Default collator getRules failed");
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((u_strcmp(rule1, rule3) != 0), "Default collator getRules failed");
495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col4=ucol_openRules(rule2, u_strlen(rule2), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rule4= ucol_getRules(col4, &tempLength);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((u_strcmp(rule2, rule4) == 0), "Default collator getRules failed");
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col1);
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col2);
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col3);
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col4);
508b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* tests that modifier ! is always ignored */
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(ruleset1, "!&a<b");
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    teststr[0] = 0x0e40;
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    teststr[1] = 0x0e01;
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    teststr[2] = 0x0e2d;
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col2 = ucol_open("en_US", &status);
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("en_US Collator creation failed.: %s\n", myErrorName(status));
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter1 = ucol_openElements(col1, teststr, 3, &status);
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter2 = ucol_openElements(col2, teststr, 3, &status);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status));
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (TRUE) {
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* testing with en since thai has its own tailoring */
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t ce = ucol_next(iter1, &status);
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t ce2 = ucol_next(iter2, &status);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status));
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ce2 != ce) {
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("! modifier test failed");
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ce == UCOL_NULLORDER) {
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_closeElements(iter1);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_closeElements(iter2);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col1);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col2);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test that we can start a rule without a & or < */
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(ruleset1, "< z < a");
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(teststr, "z");
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(teststr2, "a");
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_greaterOrEqual(col1, teststr, 1, teststr2, 1)) {
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Rule \"z < a\" fails");
560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col1);
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCompare()
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *col;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* test1;
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* test2;
570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("The compare tests begin : \n");
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = ucol_open("en_US", &status);
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
5756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ucal_open() collation creation failed.: %s\n", myErrorName(status));
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test1=(UChar*)malloc(sizeof(UChar) * 6);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test2=(UChar*)malloc(sizeof(UChar) * 6);
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test1, "Abcda");
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
582b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Use tertiary comparison level testing ....\n");
584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (!ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" != \"abcda\" ");
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" >>> \"abcda\" ");
587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" >>> \"abcda\"");
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(col, UCOL_SECONDARY);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Use secondary comparison level testing ....\n");
591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2) )), "Result should be \"Abcda\" == \"abcda\"");
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (!ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2) )), "Result should be \"Abcda\" == \"abcda\"");
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(col, UCOL_PRIMARY);
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Use primary comparison level testing ....\n");
598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (!ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\"");
602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("The compare tests end.\n");
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test1);
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test2);
608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru---------------------------------------------
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tests decomposition setting
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestDecomposition() {
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *en_US, *el_GR, *vi_VN;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    en_US = ucol_open("en_US", &status);
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    el_GR = ucol_open("el_GR", &status);
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vi_VN = ucol_open("vi_VN", &status);
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
6226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ERROR: collation creation failed.: %s\n", myErrorName(status));
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(vi_VN, UCOL_NORMALIZATION_MODE, &status) != UCOL_ON ||
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status))
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: vi_VN collation did not have cannonical decomposition for normalization!\n");
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(el_GR, UCOL_NORMALIZATION_MODE, &status) != UCOL_ON ||
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status))
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: el_GR collation did not have cannonical decomposition for normalization!\n");
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(en_US, UCOL_NORMALIZATION_MODE, &status) != UCOL_OFF ||
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status))
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: en_US collation had cannonical decomposition for normalization!\n");
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(en_US);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(el_GR);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(vi_VN);
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CLONETEST_COLLATOR_COUNT 4
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSafeClone() {
654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar test1[6];
655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar test2[6];
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar umlautUStr[] = {0x00DC, 0};
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar oeStr[] = {0x0055, 0x0045, 0};
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator * someCollators [CLONETEST_COLLATOR_COUNT];
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator * someClonedCollators [CLONETEST_COLLATOR_COUNT];
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator * col;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int8_t index = 6;    /* Leave this here to test buffer alingment in memory*/
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t buffer [CLONETEST_COLLATOR_COUNT] [U_COL_SAFECLONE_BUFFERSIZE];
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char sampleRuleChars[] = "&Z < CH";
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar sampleRule[sizeof(sampleRuleChars)];
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (TestBufferSize()) {
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("U_COL_SAFECLONE_BUFFERSIZE should be larger than sizeof(UCollator)\n");
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test1, "abCda");
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(sampleRule, sampleRuleChars);
676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* one default collator & two complex ones */
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someCollators[0] = ucol_open("en_US", &err);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someCollators[1] = ucol_open("ko", &err);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someCollators[2] = ucol_open("ja_JP", &err);
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someCollators[3] = ucol_openRules(sampleRule, -1, UCOL_ON, UCOL_TERTIARY, NULL, &err);
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++) {
684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            ucol_close(someCollators[index]);
685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Couldn't open one or more collators\n");
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check the various error & informational states: */
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Null status - just returns NULL */
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, 0))
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null status\n");
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* error status - should return 0 & keep error the same */
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_MEMORY_ALLOCATION_ERROR;
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err) || err != U_MEMORY_ALLOCATION_ERROR)
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with incoming error status\n");
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], 0, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null bufferSize pointer\n");
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* buffer size pointer is 0 - fill in pbufferSize with a size */
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bufferSize = 0;
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err) || U_FAILURE(err) || bufferSize <= 0)
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed a sizing request ('preflighting')\n");
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Verify our define is large enough  */
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_COL_SAFECLONE_BUFFERSIZE < bufferSize)
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Pre-calculated buffer size is too small\n");
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Verify we can use this run-time calculated size */
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 == (col = ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err)) || U_FAILURE(err))
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Collator can't be cloned with run-time size\n");
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (col) ucol_close(col);
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* size one byte too small - should allocate & let us know */
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    --bufferSize;
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 == (col = ucol_safeClone(someCollators[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING)
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with too-small buffer size\n");
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (col) ucol_close(col);
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Null buffer pointer - return Collator & set error to U_SAFECLONE_ALLOCATED_ERROR */
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 == (col = ucol_safeClone(someCollators[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING)
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null buffer pointer\n");
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (col) ucol_close(col);
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Null Collator - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (0 != ucol_safeClone(0, buffer[0], &bufferSize, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned Collator failed to deal correctly with null Collator pointer\n");
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test that a cloned collator doesn't accidentally use UCA. */
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col=ucol_open("de@collation=phonebook", &err);
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someClonedCollators[0] = ucol_safeClone(col, buffer[0], &bufferSize, &err);
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_greater(col, umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Original German phonebook collation sorts differently than expected");
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (ucol_greater(someClonedCollators[0], umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Cloned German phonebook collation sorts differently than expected");
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!ucol_equals(someClonedCollators[0], col)) {
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Cloned German phonebook collator is not equal to original.\n");
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(someClonedCollators[0]);
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* change orig & clone & make sure they are independent */
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++)
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(someCollators[index], UCOL_IDENTICAL);
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = 1;
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(ucol_safeClone(someCollators[index], buffer[index], &bufferSize, &err));
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (err != U_SAFECLONE_ALLOCATED_WARNING) {
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: collator number %d was not allocated.\n", index);
780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("FAIL: status of Collator[%d] is %d  (hex: %x).\n", index, err, err);
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = U_COL_SAFECLONE_BUFFERSIZE;
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        someClonedCollators[index] = ucol_safeClone(someCollators[index], buffer[index], &bufferSize, &err);
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (someClonedCollators[index] == NULL
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            || someClonedCollators[index] < (UCollator *)buffer[index]
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            || someClonedCollators[index] > (UCollator *)(buffer[index]+(U_COL_SAFECLONE_BUFFERSIZE-1)))
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned collator didn't use provided buffer.\n");
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!ucol_equals(someClonedCollators[index], someCollators[index])) {
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned collator is not equal to original at index = %d.\n", index);
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Check the usability */
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(someCollators[index], UCOL_PRIMARY);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(someCollators[index], UCOL_CASE_LEVEL, UCOL_OFF, &err);
800b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doAssert( (ucol_equal(someCollators[index], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abcda\" == \"abCda\"");
802b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Close the original to make sure that the clone is usable. */
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(someCollators[index]);
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(someClonedCollators[index], UCOL_TERTIARY);
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(someClonedCollators[index], UCOL_CASE_LEVEL, UCOL_OFF, &err);
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doAssert( (ucol_greater(someClonedCollators[index], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abCda\" >>> \"abcda\" ");
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(someClonedCollators[index]);
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCloneBinary(){
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator * col = ucol_open("en_US", &err);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator * c;
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t size;
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t * buffer;
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)) {
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Couldn't open collator. Error: %s\n", u_errorName(err));
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = ucol_cloneBinary(col, NULL, 0, &err);
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(size==0 || err!=U_BUFFER_OVERFLOW_ERROR) {
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucol_cloneBinary - couldn't check size. Error: %s\n", u_errorName(err));
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer = (uint8_t *) malloc(size);
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_cloneBinary(col, buffer, size, &err);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucol_cloneBinary - couldn't clone.. Error: %s\n", u_errorName(err));
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(buffer);
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* how to check binary result ? */
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = ucol_openBinary(buffer, size, col, &err);
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucol_openBinary failed. Error: %s\n", u_errorName(err));
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar t[] = {0x41, 0x42, 0x43, 0};  /* ABC */
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint8_t  *k1, *k2;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int l1, l2;
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l1 = ucol_getSortKey(col, t, -1, NULL,0);
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l2 = ucol_getSortKey(c, t, -1, NULL,0);
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        k1 = (uint8_t *) malloc(sizeof(uint8_t) * l1);
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        k2 = (uint8_t *) malloc(sizeof(uint8_t) * l2);
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(col, t, -1, k1, l1);
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(col, t, -1, k2, l2);
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strcmp((char *)k1,(char *)k2) != 0){
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucol_openBinary - new collator should equal to old one\n");
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(k1);
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(k2);
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(buffer);
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(c);
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOpenVsOpenRules ensures that collators from ucol_open and ucol_openRules
868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    will generate identical sort keys
869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*/
870b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid TestOpenVsOpenRules(){
871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* create an array of all the locales */
873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t numLocales = uloc_countAvailable();
874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t sizeOfStdSet;
875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uint32_t adder;
876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar str[41]; /* create an array of UChar of size maximum strSize + 1 */
877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    USet *stdSet;
878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char* curLoc;
879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UCollator * c1;
880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UCollator * c2;
881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar* rules;
882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t rulesLength;
883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t sortKeyLen1, sortKeyLen2;
884b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uint8_t *sortKey1 = NULL, *sortKey2 = NULL;
885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ULocaleData *uld;
88650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t x, y, z;
887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    USet *eSet;
888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t eSize;
889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int strSize;
890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* create a set of standard characters that aren't very interesting...
894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    and then we can find some interesting ones later */
895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    stdSet = uset_open(0x61, 0x7A);
897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uset_addRange(stdSet, 0x41, 0x5A);
898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uset_addRange(stdSet, 0x30, 0x39);
899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sizeOfStdSet = uset_size(stdSet);
900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    adder = 1;
90250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(getTestOption(QUICK_OPTION))
903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {
904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        adder = 10;
905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(x = 0; x < numLocales; x+=adder){
908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        curLoc = (char *)uloc_getAvailable(x);
909b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_verbose("Processing %s\n", curLoc);
910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* create a collator the normal API way */
912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        c1 = ucol_open(curLoc, &err);
913b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(err)) {
914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("ERROR: Normal collation creation failed with locale: %s : %s\n", curLoc, myErrorName(err));
915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* grab the rules */
919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        rules = ucol_getRules(c1, &rulesLength);
920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* use those rules to create a collator from rules */
922b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        c2 = ucol_openRules(rules, rulesLength, UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &err);
923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(err)) {
924b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("ERROR: Creating collator from rules failed with locale: %s : %s\n", curLoc, myErrorName(err));
925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
926b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uld = ulocdata_open(curLoc, &err);
929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /*now that we have some collators, we get several strings */
931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for(y = 0; y < 5; y++){
933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
934b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* get a set of ALL the characters in this locale */
935b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            eSet =  ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &err);
936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            eSize = uset_size(eSet);
937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* make a string with these characters in it */
939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            strSize = (rand()%40) + 1;
940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
941b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            for(z = 0; z < strSize; z++){
942b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                str[z] = uset_charAt(eSet, rand()%eSize);
943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
945b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* change the set to only include 'abnormal' characters (not A-Z, a-z, 0-9 */
946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            uset_removeAll(eSet, stdSet);
947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            eSize = uset_size(eSet);
948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
949b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* if there are some non-normal characters left, put a few into the string, just to make sure we have some */
950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(eSize > 0){
951b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                str[2%strSize] = uset_charAt(eSet, rand()%eSize);
952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                str[3%strSize] = uset_charAt(eSet, rand()%eSize);
953b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                str[5%strSize] = uset_charAt(eSet, rand()%eSize);
954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                str[10%strSize] = uset_charAt(eSet, rand()%eSize);
955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                str[13%strSize] = uset_charAt(eSet, rand()%eSize);
956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* terminate the string */
958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            str[strSize-1] = '\0';
959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("String used: %S\n", str);
960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* get sort keys for both of them, and check that the keys are identicle */
962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            sortKeyLen1 = ucol_getSortKey(c1, str, u_strlen(str),  NULL, 0);
963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            sortKey1 = (uint8_t*)malloc(sizeof(uint8_t) * (sortKeyLen1 + 1));
964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /*memset(sortKey1, 0xFE, sortKeyLen1);*/
965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            ucol_getSortKey(c1, str, u_strlen(str), sortKey1, sortKeyLen1 + 1);
966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            sortKeyLen2 = ucol_getSortKey(c2, str, u_strlen(str),  NULL, 0);
968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            sortKey2 = (uint8_t*)malloc(sizeof(uint8_t) * (sortKeyLen2 + 1));
969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /*memset(sortKey2, 0xFE, sortKeyLen2);*/
970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            ucol_getSortKey(c2, str, u_strlen(str), sortKey2, sortKeyLen2 + 1);
971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* Check that the lengths are the same */
973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            doAssert((sortKeyLen1 == sortKeyLen2), "Sort key lengths do not match.");
974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* check that the keys are the same */
976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            doAssert((memcmp(sortKey1, sortKey2, sortKeyLen1) == 0), "Keys are not equivalent");
977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* clean up after each string */
979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            free(sortKey1);
980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            free(sortKey2);
981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            uset_close(eSet);
982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* clean up after each locale */
984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ulocdata_close(uld);
985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucol_close(c1);
986b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucol_close(c2);
987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* final clean up */
989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uset_close(stdSet);
990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru----------------------------------------------------------------------------
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ctor -- Tests the getSortKey
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSortKey()
996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *sortk1 = NULL, *sortk2 = NULL, *sortk3 = NULL, *sortkEmpty = NULL;
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t sortklen, osortklen;
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t toStringLen=0;
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *col;
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *test1, *test2, *test3;
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char toStringBuffer[256], *resultP;
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t s1[] = { 0x9f, 0x00 };
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t s2[] = { 0x61, 0x00 };
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int  strcmpResult;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcmpResult = strcmp((const char *)s1, (const char *)s2);
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("strcmp(0x9f..., 0x61...) = %d\n", strcmpResult);
1012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmpResult <= 0) {
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-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",
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              strcmpResult);
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing SortKey begins...\n");
1020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* this is supposed to open default date format, but later on it treats it like it is "en_US"
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* col = ucol_open(NULL, &status); */
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = ucol_open("en_US", &status);
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
10256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status));
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ucol_getStrength(col) != UCOL_DEFAULT_STRENGTH)
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: default collation did not have UCOL_DEFAULT_STRENGTH !\n");
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Need to use identical strength */
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(col, UCOL_STRENGTH, UCOL_IDENTICAL, &status);
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test1=(UChar*)malloc(sizeof(UChar) * 6);
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test2=(UChar*)malloc(sizeof(UChar) * 6);
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test3=(UChar*)malloc(sizeof(UChar) * 6);
1040b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(test1,0xFE, sizeof(UChar)*6);
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(test2,0xFE, sizeof(UChar)*6);
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(test3,0xFE, sizeof(UChar)*6);
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test1, "Abcda");
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test3, "abcda");
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Use tertiary comparison level testing ....\n");
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test1, u_strlen(test1),  NULL, 0);
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(sortk1,0xFE, sortklen);
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortklen+1);
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test2, u_strlen(test2),  NULL, 0);
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(sortk2,0xFE, sortklen);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortklen+1);
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    osortklen = sortklen;
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test2, u_strlen(test3),  NULL, 0);
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk3=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(sortk3,0xFE, sortklen);
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk3, sortklen+1);
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (sortklen == osortklen), "Sortkey length should be the same (abcda, abcda)");
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (memcmp(sortk1, sortk2, sortklen) > 0), "Result should be \"Abcda\" > \"abcda\"");
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (memcmp(sortk2, sortk1, sortklen) < 0), "Result should be \"abcda\" < \"Abcda\"");
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (memcmp(sortk2, sortk3, sortklen) == 0), "Result should be \"abcda\" ==  \"abcda\"");
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    resultP = ucol_sortKeyToString(col, sortk3, toStringBuffer, &toStringLen);
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (resultP != 0), "sortKeyToString failed!");
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1 /* verobse log of sortkeys */
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      char junk2[1000];
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      char junk3[1000];
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      int i;
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcpy(junk2, "abcda[2] ");
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcpy(junk3, " abcda[3] ");
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(i=0;i<sortklen;i++)
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          sprintf(junk2+strlen(junk2), "%02X ",(int)( 0xFF & sortk2[i]));
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          sprintf(junk3+strlen(junk3), "%02X ",(int)( 0xFF & sortk3[i]));
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("%s\n", junk2);
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("%s\n", junk3);
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk1);
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk2);
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk3);
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Use secondary comparision level testing ...\n");
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(col, UCOL_SECONDARY);
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test1, u_strlen(test1),  NULL, 0);
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortklen+1);
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen=ucol_getSortKey(col, test2, u_strlen(test2),  NULL, 0);
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1));
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortklen+1);
1109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( !(memcmp(sortk1, sortk2, sortklen) > 0), "Result should be \"Abcda\" == \"abcda\"");
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( !(memcmp(sortk2, sortk1, sortklen) < 0), "Result should be \"abcda\" == \"Abcda\"");
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (memcmp(sortk1, sortk2, sortklen) == 0), "Result should be \"abcda\" ==  \"abcda\"");
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("getting sortkey for an empty string\n");
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(col, UCOL_STRENGTH, UCOL_TERTIARY, &status);
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen = ucol_getSortKey(col, test1, 0, NULL, 0);
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortkEmpty = (uint8_t*)malloc(sizeof(uint8_t) * sortklen+1);
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen = ucol_getSortKey(col, test1, 0, sortkEmpty, sortklen+1);
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(sortklen != 3 || sortkEmpty[0] != 1 || sortkEmpty[0] != 1 || sortkEmpty[2] != 0) {
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Empty string generated wrong sortkey!\n");
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortkEmpty);
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing passing invalid string\n");
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortklen = ucol_getSortKey(col, NULL, 0, NULL, 0);
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(sortklen != 0) {
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Invalid string didn't return sortkey size of 0\n");
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing sortkey ends...\n");
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test1);
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test2);
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test3);
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk1);
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk2);
1138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestHashCode()
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *sortk1, *sortk2, *sortk3;
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t sortk1len, sortk2len, sortk3len;
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *col;
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *test1, *test2, *test3;
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing getHashCode begins...\n");
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = ucol_open("en_US", &status);
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
11506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status));
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test1=(UChar*)malloc(sizeof(UChar) * 6);
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test2=(UChar*)malloc(sizeof(UChar) * 6);
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test3=(UChar*)malloc(sizeof(UChar) * 6);
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test1, "Abcda");
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test2, "abcda");
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(test3, "abcda");
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Use tertiary comparison level testing ....\n");
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk1len=ucol_getSortKey(col, test1, u_strlen(test1),  NULL, 0);
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortk1len+1));
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortk1len+1);
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk2len=ucol_getSortKey(col, test2, u_strlen(test2),  NULL, 0);
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortk2len+1));
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortk2len+1);
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk3len=ucol_getSortKey(col, test2, u_strlen(test3),  NULL, 0);
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortk3=(uint8_t*)malloc(sizeof(uint8_t) * (sortk3len+1));
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_getSortKey(col, test2, u_strlen(test2), sortk3, sortk3len+1);
1170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("ucol_hashCode() testing ...\n");
1173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    doAssert( ucol_keyHashCode(sortk1, sortk1len) != ucol_keyHashCode(sortk2, sortk2len), "Hash test1 result incorrect" );
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( !(ucol_keyHashCode(sortk1, sortk1len) == ucol_keyHashCode(sortk2, sortk2len)), "Hash test2 result incorrect" );
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( ucol_keyHashCode(sortk2, sortk2len) == ucol_keyHashCode(sortk3, sortk3len), "Hash result not equal" );
1177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("hashCode tests end.\n");
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk1);
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk2);
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(sortk3);
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test1);
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test2);
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test3);
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *----------------------------------------------------------------------------
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests the UCollatorElements API.
1192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *
1193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestElemIter()
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset;
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t order1, order2, order3;
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *testString1, *testString2;
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *col;
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationElements *iterator1, *iterator2, *iterator3;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing UCollatorElements begins...\n");
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    col = ucol_open("en_US", &status);
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(col, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
12066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status));
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testString1=(UChar*)malloc(sizeof(UChar) * 150);
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testString2=(UChar*)malloc(sizeof(UChar) * 150);
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(testString1, "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?");
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(testString2, "Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?");
1214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Constructors and comparison testing....\n");
1216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iterator1 = ucol_openElements(col, testString1, u_strlen(testString1), &status);
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status));
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(col);
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{ log_verbose("PASS: Default collationElement iterator1 creation passed\n");}
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iterator2 = ucol_openElements(col, testString1, u_strlen(testString1), &status);
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status));
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(col);
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{ log_verbose("PASS: Default collationElement iterator2 creation passed\n");}
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iterator3 = ucol_openElements(col, testString2, u_strlen(testString2), &status);
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status));
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(col);
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{ log_verbose("PASS: Default collationElement iterator3 creation passed\n");}
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset=ucol_getOffset(iterator1);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setOffset(iterator1, 6, &status);
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in setOffset for UCollatorElements iterator.: %s\n", myErrorName(status));
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ucol_getOffset(iterator1)==6)
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("setOffset and getOffset working fine\n");
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in set and get Offset got %d instead of 6\n", ucol_getOffset(iterator1));
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setOffset(iterator1, 0, &status);
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order1 = ucol_next(iterator1, &status);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator1.: %s\n", myErrorName(status));
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order2=ucol_getOffset(iterator2);
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((order1 != order2), "The first iterator advance failed");
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order2 = ucol_next(iterator2, &status);
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order3 = ucol_next(iterator3, &status);
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator3.: %s\n", myErrorName(status));
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert((order1 == order2), "The second iterator advance failed should be the same as first one");
1273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_primaryOrder(order1) == ucol_primaryOrder(order3)), "The primary orders should be identical");
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_secondaryOrder(order1) == ucol_secondaryOrder(order3)), "The secondary orders should be identical");
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_tertiaryOrder(order1) == ucol_tertiaryOrder(order3)), "The tertiary orders should be identical");
1277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order1=ucol_next(iterator1, &status);
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order3=ucol_next(iterator3, &status);
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_primaryOrder(order1) == ucol_primaryOrder(order3)), "The primary orders should be identical");
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_tertiaryOrder(order1) != ucol_tertiaryOrder(order3)), "The tertiary orders should be different");
1290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order1=ucol_next(iterator1, &status);
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    order3=ucol_next(iterator3, &status);
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status));
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this here, my friends, is either pure lunacy or something so obsolete that even it's mother
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * doesn't care about it. Essentialy, this test complains if secondary values for 'I' and '_'
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * are the same. According to the UCA, this is not true. Therefore, remove the test.
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Besides, if primary strengths for two code points are different, it doesn't matter one bit
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * what is the relation between secondary or any other strengths.
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * killed by weiv 06/11/2002.
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( ((order1 & UCOL_SECONDARYMASK) != (order3 & UCOL_SECONDARYMASK)), "The secondary orders should be different");
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doAssert( (order1 != UCOL_NULLORDER), "Unexpected end of iterator reached");
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(testString1);
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(testString2);
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_closeElements(iterator1);
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_closeElements(iterator2);
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_closeElements(iterator3);
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(col);
1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing CollationElementIterator ends...\n");
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetLocale() {
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *rules = "&a<x<y<z";
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar rlz[256] = {0};
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t rlzLen = u_unescape(rules, rlz, 256);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = NULL;
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *locale = NULL;
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = 0;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* Now that the collation tree is separate, actual==valid at all times. [alan] */
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* requestedLocale;
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* validLocale;
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* actualLocale;
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } testStruct[] = {
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "sr_RS", "sr_Cyrl_RS", "ru" },
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "sh_YU", "sr_Latn_RS", "hr" }, /* this used to be sh, but now sh collation aliases hr */
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "en_BE_FOO", "en_BE", "en_BE" },
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "fr_FR_NONEXISTANT", "fr_FR", "fr" }
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* test opening collators for different locales */
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sizeof(testStruct)/sizeof(testStruct[0]); i++) {
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open(testStruct[i].requestedLocale, &status);
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
13516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      log_err_status(status, "Failed to open collator for %s with %s\n", testStruct[i].requestedLocale, u_errorName(status));
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_close(coll);
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      continue;
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status);
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(locale, testStruct[i].requestedLocale) != 0) {
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("[Coll %s]: Error in requested locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].requestedLocale, locale);
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status);
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(locale, testStruct[i].validLocale) != 0) {
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("[Coll %s]: Error in valid locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].validLocale, locale);
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    locale = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status);
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(locale, testStruct[i].actualLocale) != 0) {
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("[Coll %s]: Error in actual locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].actualLocale, locale);
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* completely non-existant locale for collator should get a default collator */
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *defaultColl = ucol_open(NULL, &status);
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("blahaha", &status);
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      if(strcmp(ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status), "blahaha")) {
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Nonexisting locale didn't preserve the requested locale\n");
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      if(strcmp(ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status),
1379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucol_getLocaleByType(defaultColl, ULOC_VALID_LOCALE, &status))) {
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Valid locale for nonexisting locale locale collator differs "
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "from valid locale for default collator\n");
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      if(strcmp(ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status),
1384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucol_getLocaleByType(defaultColl, ULOC_ACTUAL_LOCALE, &status))) {
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Actual locale for nonexisting locale locale collator differs "
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "from actual locale for default collator\n");
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_close(coll);
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_close(defaultColl);
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Couldn't open collators\n");
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* collator instantiated from rules should have all three locales NULL */
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  coll = ucol_openRules(rlz, rlzLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
1399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status);
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(locale != NULL) {
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("For collator instantiated from rules, requested locale returned %s instead of NULL\n", locale);
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status);
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(locale != NULL) {
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("For collator instantiated from rules,  valid locale returned %s instead of NULL\n", locale);
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  locale = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status);
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(locale != NULL) {
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("For collator instantiated from rules, actual locale returned %s instead of NULL\n", locale);
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetAll()
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, count;
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=ucol_countAvailable();
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* use something sensible w/o hardcoding the count */
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(count < 0){
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in countAvailable(), it returned %d\n", count);
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: countAvailable() successful, it returned %d\n", count);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<count;i++)
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%s\n", ucol_getAvailable(i));
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct teststruct {
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *original;
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t key[256];
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} ;
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int compare_teststruct(const void *string1, const void *string2) {
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return(strcmp((const char *)((struct teststruct *)string1)->key, (const char *)((struct teststruct *)string2)->key));
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestBounds() {
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_open("sh", &status);
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t sortkey[512], lower[512], upper[512];
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[512];
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char * const test[] = {
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "John Smith",
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "JOHN SMITH",
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "john SMITH",
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "j\\u00F6hn sm\\u00EFth",
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "J\\u00F6hn Sm\\u00EFth",
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "J\\u00D6HN SM\\u00CFTH",
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "john smithsonian",
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "John Smithsonian",
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    struct teststruct tests[] = {
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI MIHALJ" } ,
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI MIHALJ" } ,
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI PIRO\\u0160KA" },
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABAI ANDRIJA" } ,
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABAI LAJO\\u0160" } ,
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABAI MARIJA" } ,
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABAI STEVAN" } ,
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABAI STEVAN" } ,
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA BRANKO" } ,
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA MILENKO" } ,
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA MIROSLAV" } ,
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA SIMO" } ,
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA STANKO" } ,
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA TAMARA" } ,
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABARKAPA TOMA\\u0160" } ,
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABDARI\\u0106 NIKOLA" } ,
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABDARI\\u0106 ZORICA" } ,
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABI NANDOR" } ,
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABOVI\\u0106 MILAN" } ,
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRADI AGNEZIJA" } ,
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRADI IVAN" } ,
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRADI JELENA" } ,
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRADI LJUBICA" } ,
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRADI STEVAN" } ,
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRDA MARTIN" } ,
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRILO BOGDAN" } ,
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRILO BRANISLAV" } ,
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRILO LAZAR" } ,
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRILO LJUBICA" } ,
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CABRILO SPASOJA" } ,
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CADE\\u0160 ZDENKA" } ,
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CADESKI BLAGOJE" } ,
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CADOVSKI VLADIMIR" } ,
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAGLJEVI\\u0106 TOMA" } ,
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAGOROVI\\u0106 VLADIMIR" } ,
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAJA VANKA" } ,
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAJI\\u0106 BOGOLJUB" } ,
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAJI\\u0106 BORISLAV" } ,
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAJI\\u0106 RADOSLAV" } ,
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAK\\u0160IRAN MILADIN" } ,
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN EUGEN" } ,
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN EVGENIJE" } ,
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN IVAN" } ,
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN JULIJAN" } ,
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN MIHAJLO" } ,
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN STEVAN" } ,
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN VLADIMIR" } ,
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN VLADIMIR" } ,
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAN VLADIMIR" } ,
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKARA ANA" } ,
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAREVI\\u0106 MOMIR" } ,
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKAREVI\\u0106 NEDELJKO" } ,
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI \\u0160ANDOR" } ,
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI AMALIJA" } ,
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI ANDRA\\u0160" } ,
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI LADISLAV" } ,
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI LAJO\\u0160" } ,
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u010CAKI LASLO" } ,
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, j = 0, k = 0, buffSize = 0, skSize = 0, lowerSize = 0, upperSize = 0;
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t arraySize = sizeof(tests)/sizeof(tests[0]);
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status) && coll) {
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i = 0; i<arraySize; i++) {
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffSize = u_unescape(tests[i].original, buffer, 512);
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            skSize = ucol_getSortKey(coll, buffer, buffSize, tests[i].key, 512);
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qsort(tests, arraySize, sizeof(struct teststruct), compare_teststruct);
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i = 0; i < arraySize-1; i++) {
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j = i+1; j < arraySize; j++) {
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lowerSize = ucol_getBound(tests[i].key, -1, UCOL_BOUND_LOWER, 1, lower, 512, &status);
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                upperSize = ucol_getBound(tests[j].key, -1, UCOL_BOUND_UPPER, 1, upper, 512, &status);
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(k = i; k <= j; k++) {
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp((const char *)lower, (const char *)tests[k].key) > 0) {
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("Problem with lower! j = %i (%s vs %s)\n", k, tests[k].original, tests[i].original);
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp((const char *)upper, (const char *)tests[k].key) <= 0) {
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("Problem with upper! j = %i (%s vs %s)\n", k, tests[k].original, tests[j].original);
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i = 0; i < 1000; i++) {
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lowerRND = (rand()/(RAND_MAX/arraySize));
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            upperRND = lowerRND + (rand()/(RAND_MAX/(arraySize-lowerRND)));
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lowerSize = ucol_getBound(tests[lowerRND].key, -1, UCOL_BOUND_LOWER, 1, lower, 512, &status);
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            upperSize = ucol_getBound(tests[upperRND].key, -1, UCOL_BOUND_UPPER_LONG, 1, upper, 512, &status);
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j = lowerRND; j<=upperRND; j++) {
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(strcmp(lower, tests[j].key) > 0) {
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Problem with lower! j = %i (%s vs %s)\n", j, tests[j].original, tests[lowerRND].original);
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(strcmp(upper, tests[j].key) <= 0) {
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Problem with upper! j = %i (%s vs %s)\n", j, tests[j].original, tests[upperRND].original);
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i = 0; i<sizeof(test)/sizeof(test[0]); i++) {
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffSize = u_unescape(test[i], buffer, 512);
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            skSize = ucol_getSortKey(coll, buffer, buffSize, sortkey, 512);
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lowerSize = ucol_getBound(sortkey, skSize, UCOL_BOUND_LOWER, 1, lower, 512, &status);
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            upperSize = ucol_getBound(sortkey, skSize, UCOL_BOUND_UPPER_LONG, 1, upper, 512, &status);
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j = i+1; j<sizeof(test)/sizeof(test[0]); j++) {
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                buffSize = u_unescape(test[j], buffer, 512);
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                skSize = ucol_getSortKey(coll, buffer, buffSize, sortkey, 512);
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(strcmp((const char *)lower, (const char *)sortkey) > 0) {
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Problem with lower! i = %i, j = %i (%s vs %s)\n", i, j, test[i], test[j]);
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(strcmp((const char *)upper, (const char *)sortkey) <= 0) {
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Problem with upper! i = %i, j = %i (%s vs %s)\n", i, j, test[i], test[j]);
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Couldn't open collator\n");
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doOverrunTest(UCollator *coll, const UChar *uString, int32_t strLen) {
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t skLen = 0, skLen2 = 0;
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t sortKey[256];
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j;
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t filler = 0xFF;
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    skLen = ucol_getSortKey(coll, uString, strLen, NULL, 0);
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < skLen; i++) {
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(sortKey, filler, 256);
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        skLen2 = ucol_getSortKey(coll, uString, strLen, sortKey, i);
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(skLen != skLen2) {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("For buffer size %i, got different sortkey length. Expected %i got %i\n", i, skLen, skLen2);
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(j = i; j < 256; j++) {
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(sortKey[j] != filler) {
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Something run over index %i\n", j);
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* j1865 reports that if a shorter buffer is passed to
1622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru* to get sort key, a buffer overrun happens in some
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* cases. This test tries to check this.
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSortKeyBufferOverrun(void) {
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* cString = "A very Merry liTTle-lamB..";
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar uString[256];
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t strLen = 0;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_open("root", &status);
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strLen = u_unescape(cString, uString, 256);
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("testing non ignorable\n");
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("testing shifted\n");
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("testing shifted quaternary\n");
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("testing with french secondaries\n");
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_ON, &status);
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status);
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doOverrunTest(coll, uString, strLen);
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAttribute()
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode error = U_ZERO_ERROR;
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_open(NULL, &error);
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(error)) {
16626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Creation of default collator failed\n");
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_OFF, &error);
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, &error) != UCOL_OFF ||
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
16696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the french collation failed\n");
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_ON, &error);
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, &error) != UCOL_ON ||
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
16756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the french collation failed\n");
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &error);
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &error) != UCOL_SHIFTED ||
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
16816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the alternate handling failed\n");
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &error);
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &error) != UCOL_NON_IGNORABLE ||
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
16876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the alternate handling failed\n");
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_LOWER_FIRST, &error);
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_FIRST, &error) != UCOL_LOWER_FIRST ||
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
16936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the case first attribute failed\n");
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_UPPER_FIRST, &error);
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_FIRST, &error) != UCOL_UPPER_FIRST ||
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
16996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the case first attribute failed\n");
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &error);
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_LEVEL, &error) != UCOL_ON ||
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the case level attribute failed\n");
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &error);
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_CASE_LEVEL, &error) != UCOL_OFF ||
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the case level attribute failed\n");
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &error);
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, &error) != UCOL_ON ||
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the normalization on/off attribute failed\n");
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &error);
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, &error) != UCOL_OFF ||
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the normalization on/off attribute failed\n");
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &error);
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_PRIMARY ||
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_SECONDARY, &error);
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_SECONDARY ||
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &error);
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_TERTIARY ||
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &error);
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_QUATERNARY ||
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_IDENTICAL, &error);
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_IDENTICAL ||
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(error)) {
17536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(error, "Setting and retrieving of the collation strength failed\n");
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetTailoredSet() {
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  struct {
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *tests[20];
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t testsize;
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } setTest[] = {
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&a < \\u212b", { "\\u212b", "A\\u030a", "\\u00c5" }, 3},
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "& S < \\u0161 <<< \\u0160", { "\\u0161", "s\\u030C", "\\u0160", "S\\u030C" }, 4}
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = 0, j = 0;
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UParseError pError;
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = NULL;
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar buff[1024];
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t buffLen = 0;
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  USet *set = NULL;
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(setTest)/sizeof(setTest[0]); i++) {
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffLen = u_unescape(setTest[i].rules, buff, 1024);
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(buff, buffLen, UCOL_DEFAULT, UCOL_DEFAULT, &pError, &status);
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      set = ucol_getTailoredSet(coll, &status);
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(uset_size(set) != setTest[i].testsize) {
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Tailored set size different (%d) than expected (%d)\n", uset_size(set), setTest[i].testsize);
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = 0; j < setTest[i].testsize; j++) {
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffLen = u_unescape(setTest[i].tests[j], buff, 1024);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!uset_containsString(set, buff, buffLen)) {
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Tailored set doesn't contain %s... It should\n", setTest[i].tests[j]);
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uset_close(set);
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
17946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      log_err_status(status, "Couldn't open collator with rules %s\n", setTest[i].rules);
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int tMemCmp(const uint8_t *first, const uint8_t *second) {
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   int32_t firstLen = (int32_t)strlen((const char *)first);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   int32_t secondLen = (int32_t)strlen((const char *)second);
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   return memcmp(first, second, uprv_min(firstLen, secondLen));
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * strengthsC[] = {
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     "UCOL_PRIMARY",
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     "UCOL_SECONDARY",
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     "UCOL_TERTIARY",
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     "UCOL_QUATERNARY",
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     "UCOL_IDENTICAL"
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestMergeSortKeys(void) {
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   UErrorCode status = U_ZERO_ERROR;
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   UCollator *coll = ucol_open("en", &status);
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if(U_SUCCESS(status)) {
1817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     const char* cases[] = {
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "abc",
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         "abcd",
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         "abcde"
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint32_t casesSize = sizeof(cases)/sizeof(cases[0]);
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     const char* prefix = "foo";
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     const char* suffix = "egg";
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     char outBuff1[256], outBuff2[256];
1827b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint8_t **sortkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *));
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint8_t **mergedPrefixkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *));
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint8_t **mergedSuffixkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *));
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint32_t *sortKeysLen = (uint32_t *)malloc(casesSize*sizeof(uint32_t));
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint8_t prefixKey[256], suffixKey[256];
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint32_t prefixKeyLen = 0, suffixKeyLen = 0, i = 0;
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UChar buffer[256];
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     uint32_t unescapedLen = 0, l1 = 0, l2 = 0;
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UColAttributeValue strength;
1837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     log_verbose("ucol_mergeSortkeys test\n");
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     log_verbose("Testing order of the test cases\n");
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     genericLocaleStarter("en", cases, casesSize);
1841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     for(i = 0; i<casesSize; i++) {
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       sortkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t));
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       mergedPrefixkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t));
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       mergedSuffixkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t));
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
1847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     unescapedLen = u_unescape(prefix, buffer, 256);
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     prefixKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, prefixKey, 256);
1850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     unescapedLen = u_unescape(suffix, buffer, 256);
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     suffixKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, suffixKey, 256);
1853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     log_verbose("Massaging data with prefixes and different strengths\n");
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     strength = UCOL_PRIMARY;
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     while(strength <= UCOL_IDENTICAL) {
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_verbose("Strength %s\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]);
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       ucol_setAttribute(coll, UCOL_STRENGTH, strength, &status);
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       for(i = 0; i<casesSize; i++) {
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         unescapedLen = u_unescape(cases[i], buffer, 256);
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         sortKeysLen[i] = ucol_getSortKey(coll, buffer, unescapedLen, sortkeys[i], 256);
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         ucol_mergeSortkeys(prefixKey, prefixKeyLen, sortkeys[i], sortKeysLen[i], mergedPrefixkeys[i], 256);
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         ucol_mergeSortkeys(sortkeys[i], sortKeysLen[i], suffixKey, suffixKeyLen, mergedSuffixkeys[i], 256);
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if(i>0) {
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           if(tMemCmp(mergedPrefixkeys[i-1], mergedPrefixkeys[i]) >= 0) {
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("Error while comparing prefixed keys @ strength %s:\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]);
1867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             log_err("%s\n%s\n",
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedPrefixkeys[i-1], outBuff1, &l1),
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedPrefixkeys[i], outBuff2, &l2));
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           }
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           if(tMemCmp(mergedSuffixkeys[i-1], mergedSuffixkeys[i]) >= 0) {
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("Error while comparing suffixed keys @ strength %s:\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]);
1873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             log_err("%s\n%s\n",
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedSuffixkeys[i-1], outBuff1, &l1),
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         ucol_sortKeyToString(coll, mergedSuffixkeys[i], outBuff2, &l2));
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           }
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       if(strength == UCOL_QUATERNARY) {
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         strength = UCOL_IDENTICAL;
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       } else {
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         strength++;
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
1885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     {
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       uint8_t smallBuf[3];
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       uint32_t reqLen = 0;
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_verbose("testing buffer overflow\n");
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       reqLen = ucol_mergeSortkeys(prefixKey, prefixKeyLen, suffixKey, suffixKeyLen, smallBuf, 3);
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       if(reqLen != (prefixKeyLen+suffixKeyLen-1)) {
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Wrong preflight size for merged sortkey\n");
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
1895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     {
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       UChar empty = 0;
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       uint8_t emptyKey[20], abcKey[50], mergedKey[100];
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       int32_t emptyKeyLen = 0, abcKeyLen = 0, mergedKeyLen = 0;
1900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_verbose("testing merging with sortkeys generated for empty strings\n");
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       emptyKeyLen = ucol_getSortKey(coll, &empty, 0, emptyKey, 20);
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       unescapedLen = u_unescape(cases[0], buffer, 256);
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       abcKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, abcKey, 50);
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       mergedKeyLen = ucol_mergeSortkeys(emptyKey, emptyKeyLen, abcKey, abcKeyLen, mergedKey, 100);
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       if(mergedKey[0] != 2) {
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Empty sortkey didn't produce a level separator\n");
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       /* try with zeros */
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       mergedKeyLen = ucol_mergeSortkeys(emptyKey, 0, abcKey, abcKeyLen, mergedKey, 100);
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       if(mergedKeyLen != 0 || mergedKey[0] != 0) {
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Empty key didn't produce null mergedKey\n");
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       mergedKeyLen = ucol_mergeSortkeys(abcKey, abcKeyLen, emptyKey, 0, mergedKey, 100);
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       if(mergedKeyLen != 0 || mergedKey[0] != 0) {
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Empty key didn't produce null mergedKey\n");
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }
1918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
1920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     for(i = 0; i<casesSize; i++) {
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       free(sortkeys[i]);
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       free(mergedPrefixkeys[i]);
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       free(mergedSuffixkeys[i]);
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     free(sortkeys);
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     free(mergedPrefixkeys);
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     free(mergedSuffixkeys);
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     free(sortKeysLen);
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     ucol_close(coll);
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     /* need to finish this up */
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   } else {
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     log_data_err("Couldn't open collator");
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestShortString(void)
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct {
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *input;
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expectedOutput;
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *locale;
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode expectedStatus;
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t    expectedOffset;
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t   expectedIdentifier;
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*
194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * The following expectedOutput contains a collation weight (2D00 from UCA 5.2)
194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * which is the primary weight for the T character (U+0041) in the input.
194950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * When that character gets a different weight in FractionalUCA.txt,
195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * the expectedOutput needs to be adjusted.
195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * That is, when we upgrade to a new UCA version or change collation
195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * in such a way that the absolute weight for 'A' changes,
195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * we will get a test failure here and need to adjust the test case.
195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         */
195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {"LDE_RDE_KPHONEBOOK_T0041_ZLATN","B2D00_KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"LEN_RUS_NO_AS_S4","AS_LEN_NO_S4", NULL, U_USING_FALLBACK_WARNING, 0, 0 },
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"LDE_Kphonebook","KPHONEBOOK_LDE", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Xqde_DE@collation=phonebookq_S3_EX","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"LFR_FO", "LFR", NULL, U_ZERO_ERROR, 0, 0 },
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SO_LX_AS", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 8, 0 },
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"S3_ASS_MMM", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 5, 0 }
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1966c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t i = 0;
1967c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCollator *coll = NULL, *fromNormalized = NULL;
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError parseError;
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    char fromShortBuffer[256], normalizedBuffer[256], fromNormalizedBuffer[256];
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* locale = NULL;
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) {
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(testCases[i].locale) {
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            locale = testCases[i].locale;
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            locale = NULL;
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll = ucol_openFromShortString(testCases[i].input, FALSE, &parseError, &status);
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != testCases[i].expectedStatus) {
19846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "Got status '%s' that is different from expected '%s' for '%s'\n",
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(status), u_errorName(testCases[i].expectedStatus), testCases[i].input);
19866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            continue;
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_getShortDefinitionString(coll, locale, fromShortBuffer, 256, &status);
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(strcmp(fromShortBuffer, testCases[i].expectedOutput)) {
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Got short string '%s' from the collator. Expected '%s' for input '%s'\n",
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fromShortBuffer, testCases[i].expectedOutput, testCases[i].input);
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_normalizeShortDefinitionString(testCases[i].input, normalizedBuffer, 256, &parseError, &status);
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fromNormalized = ucol_openFromShortString(normalizedBuffer, FALSE, &parseError, &status);
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_getShortDefinitionString(fromNormalized, locale, fromNormalizedBuffer, 256, &status);
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(strcmp(fromShortBuffer, fromNormalizedBuffer)) {
2002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("Strings obtained from collators instantiated by short string ('%s') and from normalized string ('%s') differ\n",
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fromShortBuffer, fromNormalizedBuffer);
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(!ucol_equals(coll, fromNormalized)) {
2008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("Collator from short string ('%s') differs from one obtained through a normalized version ('%s')\n",
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testCases[i].input, normalizedBuffer);
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_close(fromNormalized);
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_close(coll);
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(parseError.offset != testCases[i].expectedOffset) {
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Got parse error offset %i, but expected %i instead for '%s'\n",
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    parseError.offset, testCases[i].expectedOffset, testCases[i].input);
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoSetsTest(const char *locale, const USet *ref, USet *set, const char* inSet, const char* outSet, UErrorCode *status) {
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[512];
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t bufLen;
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_clear(set);
2031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    bufLen = u_unescape(inSet, buffer, 512);
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_applyPattern(set, buffer, bufLen, 0, status);
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) {
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("%s: Failure setting pattern %s\n", locale, u_errorName(*status));
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!uset_containsAll(ref, set)) {
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("%s: Some stuff from %s is not present in the set\n", locale, inSet);
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_clear(set);
2042b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    bufLen = u_unescape(outSet, buffer, 512);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_applyPattern(set, buffer, bufLen, 0, status);
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) {
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("%s: Failure setting pattern %s\n", locale, u_errorName(*status));
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!uset_containsNone(ref, set)) {
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("%s: Some stuff from %s is present in the set\n", locale, outSet);
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void
2057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruTestGetContractionsAndUnsafes(void)
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static struct {
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* locale;
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* inConts;
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* outConts;
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* inExp;
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* outExp;
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* unsafeCodeUnits;
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* safeCodeUnits;
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[] = {
2068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { "ru",
2069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            "[{\\u0474\\u030F}{\\u0475\\u030F}{\\u04D8\\u0308}{\\u04D9\\u0308}{\\u04E8\\u0308}{\\u04E9\\u0308}]",
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[{\\u0430\\u0306}{\\u0410\\u0306}{\\u0430\\u0308}{\\u0410\\u0306}{\\u0433\\u0301}{\\u0413\\u0301}]",
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u00e6]",
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[a]",
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u0474\\u0475\\u04d8\\u04d9\\u04e8\\u04e9]",
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[aAbB\\u0430\\u0410\\u0433\\u0413]"
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "uk",
2077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            "[{\\u0474\\u030F}{\\u0475\\u030F}{\\u04D8\\u0308}{\\u04D9\\u0308}{\\u04E8\\u0308}{\\u04E9\\u0308}"
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "{\\u0430\\u0306}{\\u0410\\u0306}{\\u0430\\u0308}{\\u0410\\u0306}{\\u0433\\u0301}{\\u0413\\u0301}]",
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[]",
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u00e6]",
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[a]",
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u0474\\u0475\\u04D8\\u04D9\\u04E8\\u04E9\\u0430\\u0410\\u0433\\u0413]",
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[aAbBxv]",
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "sh",
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[{C\\u0301}{C\\u030C}{C\\u0341}{DZ\\u030C}{Dz\\u030C}{D\\u017D}{D\\u017E}{lj}{nj}]",
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[{\\u309d\\u3099}{\\u30fd\\u3099}]",
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u00e6]",
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[a]",
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[nlcdzNLCDZ]",
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[jabv]"
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ja",
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-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}]",
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "[{\\u30FD\\u3099}{\\u309D\\u3099}{\\u3053\\u3099}{\\u30B3\\u3099}{lj}{nj}]",
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u30FE\\u00e6]",
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[a]",
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[\\u3099]",
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "[]"
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t noConts = 0;
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USet *conts = uset_open(0,0);
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USet *exp = uset_open(0, 0);
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USet *set  = uset_open(0,0);
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t setBufferLen = 65536;
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[65536];
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t setLen = 0;
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing locale: %s\n", tests[i].locale);
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll = ucol_open(tests[i].locale, &status);
21206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (coll == NULL || U_FAILURE(status)) {
21216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "Unable to open collator for locale %s ==> %s\n", tests[i].locale, u_errorName(status));
21226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            continue;
21236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getContractionsAndExpansions(coll, conts, exp, TRUE, &status);
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doSetsTest(tests[i].locale, conts, set, tests[i].inConts, tests[i].outConts, &status);
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setLen = uset_toPattern(conts, buffer, setBufferLen, TRUE, &status);
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /*log_verbose("Contractions %i: %s\n", uset_getItemCount(conts), aescstrdup(buffer, setLen));*/
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error %s. %i\n", u_errorName(status), setLen);
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doSetsTest(tests[i].locale, exp, set, tests[i].inExp, tests[i].outExp, &status);
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setLen = uset_toPattern(exp, buffer, setBufferLen, TRUE, &status);
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /*log_verbose("Expansions %i: %s\n", uset_getItemCount(exp), aescstrdup(buffer, setLen));*/
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error %s. %i\n", u_errorName(status), setLen);
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        noConts = ucol_getUnsafeSet(coll, conts, &status);
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doSetsTest(tests[i].locale, conts, set, tests[i].unsafeCodeUnits, tests[i].safeCodeUnits, &status);
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setLen = uset_toPattern(conts, buffer, setBufferLen, TRUE, &status);
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Unsafe %i: %s\n", uset_getItemCount(exp), aescstrdup(buffer, setLen));
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error %s. %i\n", u_errorName(status), setLen);
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(conts);
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(exp);
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(set);
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void
2162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruTestOpenBinary(void)
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char rule[] = "&h < d < c < b";
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *wUCA[] = { "a", "h", "d", "c", "b", "i" };
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *noUCA[] = {"d", "c", "b", "a", "h", "i" };
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* we have to use Cyrillic letters because latin-1 always gets copied */
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char rule[] = "&\\u0452 < \\u0434 < \\u0433 < \\u0432"; /* &dje < d < g < v */
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *wUCA[] = { "\\u0430", "\\u0452", "\\u0434", "\\u0433", "\\u0432", "\\u0435" }; /* a, dje, d, g, v, e */
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *noUCA[] = {"\\u0434", "\\u0433", "\\u0432", "\\u0430", "\\u0435", "\\u0452" }; /* d, g, v, a, e, dje */
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar uRules[256];
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uRulesLen = u_unescape(rule, uRules, 256);
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_openRules(uRules, uRulesLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
2179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCollator *UCA = NULL;
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *cloneNOUCA = NULL, *cloneWUCA = NULL;
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t imageBuffer[32768];
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *image = imageBuffer;
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t imageBufferCapacity = 32768;
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t imageSize;
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if((coll==NULL)||(U_FAILURE(status))) {
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("could not load collators or error occured: %s\n",
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCA = ucol_open("root", &status);
2194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if((UCA==NULL)||(U_FAILURE(status))) {
2195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_data_err("could not load UCA collator or error occured: %s\n",
2196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            u_errorName(status));
2197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
2198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    imageSize = ucol_cloneBinary(coll, image, imageBufferCapacity, &status);
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        image = (uint8_t *)malloc(imageSize*sizeof(uint8_t));
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        imageSize = ucol_cloneBinary(coll, imageBuffer, imageSize, &status);
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cloneWUCA = ucol_openBinary(image, imageSize, UCA, &status);
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cloneNOUCA = ucol_openBinary(image, imageSize, NULL, &status);
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericOrderingTest(coll, wUCA, sizeof(wUCA)/sizeof(wUCA[0]));
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericOrderingTest(cloneWUCA, wUCA, sizeof(wUCA)/sizeof(wUCA[0]));
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericOrderingTest(cloneNOUCA, noUCA, sizeof(noUCA)/sizeof(noUCA[0]));
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(image != imageBuffer) {
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(image);
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(cloneNOUCA);
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(cloneWUCA);
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(UCA);
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDefault(void) {
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Tests for code coverage. */
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_open("es@collation=pinyin", &status);
22286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (coll == NULL || status == U_FILE_ACCESS_ERROR) {
22296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("Unable to open collator es@collation=pinyin\n");
22306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
22316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status != U_USING_DEFAULT_WARNING) {
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* What do you mean that you know about using pinyin collation in Spanish!? This should be in the zh locale. */
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("es@collation=pinyin should return U_USING_DEFAULT_WARNING, but returned %s\n", u_errorName(status));
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getKeywordValues("funky", &status) != NULL) {
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Collators should not know about the funky keyword.\n");
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("funky keyword didn't fail as expected %s\n", u_errorName(status));
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_getKeywordValues("collation", &status) != NULL) {
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucol_getKeywordValues should not work when given a bad status.\n");
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestDefaultKeyword(void) {
2249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* Tests for code coverage. */
2250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *loc = "zh_TW@collation=default";
2252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UCollator *coll = ucol_open(loc, &status);
2253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(U_FAILURE(status)) {
2254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_info("Warning: ucol_open(%s, ...) returned %s, at least it didn't crash.\n", loc, u_errorName(status));
2255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else if (status != U_USING_FALLBACK_WARNING) {
2256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        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));
2257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_close(coll);
2259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestGetKeywordValuesForLocale(void) {
2262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define PREFERRED_SIZE 16
2263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define MAX_NUMBER_OF_KEYWORDS 6
2264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *PREFERRED[PREFERRED_SIZE][MAX_NUMBER_OF_KEYWORDS+1] = {
2265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "und",            "standard", NULL, NULL, NULL, NULL, NULL },
2266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "en_US",          "standard", NULL, NULL, NULL, NULL, NULL },
2267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "en_029",         "standard", NULL, NULL, NULL, NULL, NULL },
2268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "de_DE",          "standard", "phonebook", NULL, NULL, NULL, NULL },
2269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "de_Latn_DE",     "standard", "phonebook", NULL, NULL, NULL, NULL },
2270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zh",             "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" },
2271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zh_Hans",        "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" },
2272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zh_CN",          "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" },
2273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zh_Hant",        "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan" },
2274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zh_TW",          "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan" },
2275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zh__PINYIN",     "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" },
2276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "es_ES",          "standard", "traditional", NULL, NULL, NULL, NULL },
2277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "es__TRADITIONAL","traditional", "standard", NULL, NULL, NULL, NULL },
2278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "und@collation=phonebook",    "standard", NULL, NULL, NULL, NULL, NULL },
2279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "de_DE@collation=big5han",    "standard", "phonebook", NULL, NULL, NULL, NULL },
2280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "zzz@collation=xxx",          "standard", NULL, NULL, NULL, NULL, NULL }
2281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
2282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const int32_t expectedLength[PREFERRED_SIZE] = { 1, 1, 1, 2, 2, 6, 6, 6, 6, 6, 6, 2, 2, 1, 2, 1 };
2283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UEnumeration *keywordValues = NULL;
2286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t i, n, size, valueLength;
2287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *locale = NULL, *value = NULL;
2288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool errorOccurred = FALSE;
2289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (i = 0; i < PREFERRED_SIZE; i++) {
2291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        locale = PREFERRED[i][0];
2292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        value = NULL;
2293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        valueLength = 0;
2294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        size = 0;
2295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        keywordValues = ucol_getKeywordValuesForLocale("collation", locale, TRUE, &status);
2297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (keywordValues == NULL || U_FAILURE(status)) {
22986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "Error getting keyword values: %s\n", u_errorName(status));
2299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            break;
2300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        size = uenum_count(keywordValues, &status);
2302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (size == expectedLength[i]) {
2304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            for (n = 0; n < expectedLength[i]; n++) {
2305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if ((value = uenum_next(keywordValues, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
2306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    if (uprv_strcmp(value, PREFERRED[i][n+1]) != 0) {
2307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        log_err("Keyword values differ: Got [%s] Expected [%s] for locale: %s\n", value, PREFERRED[i][n+1], locale);
2308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        errorOccurred = TRUE;
2309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        break;
2310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    }
2311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else {
2313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    log_err("While getting keyword value from locale: %s got this error: %s\n", locale, u_errorName(status));
2314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    errorOccurred = TRUE;
2315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    break;
2316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
2317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
2318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (errorOccurred) {
2319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                break;
2320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
2321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
2322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("Number of keywords (%d) does not match expected size (%d) for locale: %s\n", size, expectedLength[i], locale);
2323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            break;
2324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uenum_close(keywordValues);
2326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        keywordValues = NULL;
2327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (keywordValues != NULL) {
2329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uenum_close(keywordValues);
2330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
2335