127f654740f2a26ad62a5c155af9199af9e69b889claireho
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Copyright (c) 2001-2013, International Business Machines Corporation and
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File cmsccoll.C
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************/
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * These are the tests specific to ICU 1.8 and above, that I didn't know where
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to fit.
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucol.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucoleitr.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ccolltst.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "callcoll.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "string.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_imp.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_tok.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h"
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/parseerr.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h"
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ures.h"
3927f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uscript.h"
40103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h"
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uparse.h"
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "putilimp.h"
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LEN(a) (sizeof(a)/sizeof(a[0]))
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAX_TOKEN_LEN 16
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UCollationResult tst_strcoll(void *collator, const int object,
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const UChar *source, const int sLen,
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const UChar *target, const int tLen);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char cnt1[][10] = {
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "AA",
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "AC",
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "AZ",
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "AQ",
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "AB",
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "ABZ",
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "ABQ",
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "Z",
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "ABC",
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "Q",
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "B"
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char cnt2[][10] = {
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "DA",
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "DAD",
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "DAZ",
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "MAR",
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "Z",
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "DAVIS",
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "MARK",
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "DAV",
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "DAVI"
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void IncompleteCntTest(void)
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar temp[90];
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t1[90];
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t2[90];
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll =  NULL;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0, j = 0;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t size = 0;
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_uastrcpy(temp, " & Z < ABC < Q < B");
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  coll = ucol_openRules(temp, u_strlen(temp), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL,&status);
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = sizeof(cnt1)/sizeof(cnt1[0]);
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < size-1; i++) {
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = i+1; j < size; j++) {
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollationElements *iter;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t1, cnt1[i]);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t2, cnt1[j]);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, t1, t2, UCOL_LESS);
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* synwee : added collation element iterator test */
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iter = ucol_openElements(coll, t2, u_strlen(t2), &status);
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Creation of iterator failed\n");
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        backAndForth(iter);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_closeElements(iter);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_uastrcpy(temp, " & Z < DAVIS < MARK <DAV");
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  coll = ucol_openRules(temp, u_strlen(temp), UCOL_OFF, UCOL_DEFAULT_STRENGTH,NULL, &status);
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = sizeof(cnt2)/sizeof(cnt2[0]);
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < size-1; i++) {
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = i+1; j < size; j++) {
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollationElements *iter;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t1, cnt2[i]);
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t2, cnt2[j]);
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, t1, t2, UCOL_LESS);
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* synwee : added collation element iterator test */
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iter = ucol_openElements(coll, t2, u_strlen(t2), &status);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Creation of iterator failed\n");
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        backAndForth(iter);
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_closeElements(iter);
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char shifted[][20] = {
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black bird",
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black-bird",
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "blackbird",
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black Bird",
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black-Bird",
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "blackBird",
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black birds",
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black-birds",
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "blackbirds"
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UCollationResult shiftedTert[] = {
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL,
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL,
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL,
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_LESS,
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL,
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL,
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_LESS,
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL,
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCOL_EQUAL
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char nonignorable[][20] = {
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black bird",
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black Bird",
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black birds",
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black-bird",
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black-Bird",
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "black-birds",
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "blackbird",
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "blackBird",
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "blackbirds"
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void BlackBirdTest(void) {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t1[90];
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t2[90];
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0, j = 0;
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t size = 0;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("en_US", &status);
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = sizeof(nonignorable)/sizeof(nonignorable[0]);
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < size-1; i++) {
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = i+1; j < size; j++) {
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t1, nonignorable[i]);
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t2, nonignorable[j]);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, t1, t2, UCOL_LESS);
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = sizeof(shifted)/sizeof(shifted[0]);
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < size-1; i++) {
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = i+1; j < size; j++) {
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t1, shifted[i]);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(t2, shifted[j]);
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, t1, t2, UCOL_LESS);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = sizeof(shifted)/sizeof(shifted[0]);
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 1; i < size; i++) {
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      u_uastrcpy(t1, shifted[i-1]);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      u_uastrcpy(t2, shifted[i]);
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doTest(coll, t1, t2, shiftedTert[i]);
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UChar testSourceCases[][MAX_TOKEN_LEN] = {
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0300, 0x0301, 0x0000},
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0300, 0x0316, 0x0000},
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0300, 0x0000},
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x00C0, 0x0301, 0x0000},
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this would work with forced normalization */
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x00C0, 0x0316, 0x0000}
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UChar testTargetCases[][MAX_TOKEN_LEN] = {
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0301, 0x0300, 0x0000},
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0316, 0x0300, 0x0000},
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x00C0, 0},
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0301, 0x0300, 0x0000},
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this would work with forced normalization */
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0041/*'A'*/, 0x0316, 0x0300, 0x0000}
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UCollationResult results[] = {
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_GREATER,
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_EQUAL,
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_EQUAL,
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_GREATER,
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_EQUAL
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void FunkyATest(void)
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator  *myCollation;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myCollation = ucol_open("en_US", &status);
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
26985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing some A letters, for some reason\n");
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(myCollation, UCOL_TERTIARY);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < 4 ; i++)
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(myCollation);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue caseFirst[] = {
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_OFF,
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_LOWER_FIRST,
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_UPPER_FIRST
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue alternateHandling[] = {
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_NON_IGNORABLE,
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_SHIFTED
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue caseLevel[] = {
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_OFF,
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_ON
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue strengths[] = {
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_PRIMARY,
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_SECONDARY,
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_TERTIARY,
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_QUATERNARY,
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_IDENTICAL
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * strengthsC[] = {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_PRIMARY",
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_SECONDARY",
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_TERTIARY",
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_QUATERNARY",
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_IDENTICAL"
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * caseFirstC[] = {
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_OFF",
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_LOWER_FIRST",
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_UPPER_FIRST"
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * alternateHandlingC[] = {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_NON_IGNORABLE",
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_SHIFTED"
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * caseLevelC[] = {
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_OFF",
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UCOL_ON"
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* not used currently - does not test only prints */
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void PrintMarkDavis(void)
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar m[256];
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint8_t sortkey[256];
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("en_US", &status);
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t h,i,j,k, sortkeysize;
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t sizem = 0;
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char buffer[512];
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t len = 512;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("PrintMarkDavis");
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_uastrcpy(m, "Mark Davis");
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sizem = u_strlen(m);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  m[1] = 0xe4;
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sizem; i++) {
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stderr, "\\u%04X ", m[i]);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  fprintf(stderr, "\n");
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(h = 0; h<sizeof(caseFirst)/sizeof(caseFirst[0]); h++) {
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_FIRST, caseFirst[i], &status);
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stderr, "caseFirst: %s\n", caseFirstC[h]);
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<sizeof(alternateHandling)/sizeof(alternateHandling[0]); i++) {
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, alternateHandling[i], &status);
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      fprintf(stderr, "  AltHandling: %s\n", alternateHandlingC[i]);
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = 0; j<sizeof(caseLevel)/sizeof(caseLevel[0]); j++) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_CASE_LEVEL, caseLevel[j], &status);
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr, "    caseLevel: %s\n", caseLevelC[j]);
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(k = 0; k<sizeof(strengths)/sizeof(strengths[0]); k++) {
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          ucol_setAttribute(coll, UCOL_STRENGTH, strengths[k], &status);
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          sortkeysize = ucol_getSortKey(coll, m, sizem, sortkey, 256);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stderr, "      strength: %s\n      Sortkey: ", strengthsC[k]);
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stderr, "%s\n", ucol_sortKeyToString(coll, sortkey, buffer, &len));
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void BillFairmanTest(void) {
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru** check for actual locale via ICU resource bundles
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru** lp points to the original locale ("fr_FR_....")
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *lr,*cr;
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode              lec = U_ZERO_ERROR;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *lp = "fr_FR_you_ll_never_find_this_locale";
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("BillFairmanTest\n");
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lr = ures_open(NULL,lp,&lec);
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (lr) {
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cr = ures_getByKey(lr,"collations",0,&lec);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cr) {
40285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            lp = ures_getLocaleByType(cr, ULOC_ACTUAL_LOCALE, &lec);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lp) {
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_SUCCESS(lec)) {
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(strcmp(lp, "fr") != 0) {
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("Wrong locale for French Collation Data, expected \"fr\" got %s", lp);
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ures_close(cr);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(lr);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testPrimary(UCollator* col, const UChar* p,const UChar* q){
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar source[256] = { '\0'};
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar target[256] = { '\0'};
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar preP = 0x31a3;
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar preQ = 0x310d;
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar preP = (*p>0x0400 && *p<0x0500)?0x00e1:0x491;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar preQ = (*p>0x0400 && *p<0x0500)?0x0041:0x413;
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*log_verbose("Testing primary\n");*/
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, p, q, UCOL_LESS);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationResult result = ucol_strcoll(col,p,u_strlen(p),q,u_strlen(q));
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=UCOL_LESS){
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       aescstrdup(p,utfSource,256);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       aescstrdup(q,utfTarget,256);
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       fprintf(file,"Primary failed  source: %s target: %s \n", utfSource,utfTarget);
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[0] = preP;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(source+1,p);
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[0] = preQ;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(target+1,q);
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, source, target, UCOL_LESS);
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"Primary swamps 2nd failed  source: %s target: %s \n", utfSource,utfTarget);
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testSecondary(UCollator* col, const UChar* p,const UChar* q){
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar source[256] = { '\0'};
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar target[256] = { '\0'};
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*log_verbose("Testing secondary\n");*/
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, p, q, UCOL_LESS);
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"secondary failed  source: %s target: %s \n", utfSource,utfTarget);
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[0] = 0x0053;
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(source+1,p);
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[0]= 0x0073;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(target+1,q);
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, source, target, UCOL_LESS);
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"secondary swamps 3rd failed  source: %s target: %s \n",utfSource,utfTarget);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(source,p);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[u_strlen(p)] = 0x62;
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[u_strlen(p)+1] = 0;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(target,q);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[u_strlen(q)] = 0x61;
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[u_strlen(q)+1] = 0;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, source, target, UCOL_GREATER);
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"secondary is swamped by 1  failed  source: %s target: %s \n",utfSource,utfTarget);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testTertiary(UCollator* col, const UChar* p,const UChar* q){
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar source[256] = { '\0'};
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar target[256] = { '\0'};
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*log_verbose("Testing tertiary\n");*/
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, p, q, UCOL_LESS);
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"Tertiary failed  source: %s target: %s \n",utfSource,utfTarget);
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[0] = 0x0020;
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(source+1,p);
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[0]= 0x002D;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(target+1,q);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, source, target, UCOL_LESS);
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"Tertiary swamps 4th failed  source: %s target: %s \n", utfSource,utfTarget);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(source,p);
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[u_strlen(p)] = 0xE0;
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[u_strlen(p)+1] = 0;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcpy(target,q);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[u_strlen(q)] = 0x61;
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target[u_strlen(q)+1] = 0;
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, source, target, UCOL_GREATER);
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"Tertiary is swamped by 3rd failed  source: %s target: %s \n",utfSource,utfTarget);
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testEquality(UCollator* col, const UChar* p,const UChar* q){
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar source[256] = { '\0'};
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar target[256] = { '\0'};
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doTest(col, p, q, UCOL_EQUAL);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(file,"Primary failed  source: %s target: %s \n", utfSource,utfTarget);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testCollator(UCollator *coll, UErrorCode *status) {
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar *rules = NULL, *current = NULL;
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t ruleLen = 0;
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t strength = 0;
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t chOffset = 0; uint32_t chLen = 0;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t exOffset = 0; uint32_t exLen = 0;
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t prefixOffset = 0; uint32_t prefixLen = 0;
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t firstEx = 0;
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  uint32_t rExpsLen = 0; */
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t firstLen = 0;
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool varT = FALSE; UBool top_ = TRUE;
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint16_t specs = 0;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool startOfRules = TRUE;
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool lastReset = FALSE;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool before = FALSE;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t beforeStrength = 0;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColTokenParser src;
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColOptionSet opts;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar first[256];
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar second[256];
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar tempB[256];
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t tempLen;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *rulesCopy = NULL;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UParseError parseError;
55685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
55727f654740f2a26ad62a5c155af9199af9e69b889claireho  uprv_memset(&src, 0, sizeof(UColTokenParser));
55827f654740f2a26ad62a5c155af9199af9e69b889claireho
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  src.opts = &opts;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  rules = ucol_getRules(coll, &ruleLen);
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(*status) && ruleLen > 0) {
56327f654740f2a26ad62a5c155af9199af9e69b889claireho    rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar));
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.current = src.source = rulesCopy;
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.end = rulesCopy+ruleLen;
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.extraCurrent = src.end;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *first = *second = 0;
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57127f654740f2a26ad62a5c155af9199af9e69b889claireho	/* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
57227f654740f2a26ad62a5c155af9199af9e69b889claireho	   the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while ((current = ucol_tok_parseNextToken(&src, startOfRules,&parseError, status)) != NULL) {
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strength = src.parsedToken.strength;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      chOffset = src.parsedToken.charsOffset;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      chLen = src.parsedToken.charsLen;
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      exOffset = src.parsedToken.extensionOffset;
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      exLen = src.parsedToken.extensionLen;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      prefixOffset = src.parsedToken.prefixOffset;
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      prefixLen = src.parsedToken.prefixLen;
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      specs = src.parsedToken.flags;
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      startOfRules = FALSE;
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      top_ = (UBool)((specs & UCOL_TOK_TOP) != 0);
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(top_) { /* if reset is on top, the sequence is broken. We should have an empty string */
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        second[0] = 0;
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
58927f654740f2a26ad62a5c155af9199af9e69b889claireho        u_strncpy(second,src.source+chOffset, chLen);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        second[chLen] = 0;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(exLen > 0 && firstEx == 0) {
59327f654740f2a26ad62a5c155af9199af9e69b889claireho          u_strncat(first, src.source+exOffset, exLen);
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          first[firstLen+exLen] = 0;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(lastReset == TRUE && prefixLen != 0) {
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          u_strncpy(first+prefixLen, first, firstLen);
59927f654740f2a26ad62a5c155af9199af9e69b889claireho          u_strncpy(first, src.source+prefixOffset, prefixLen);
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          first[firstLen+prefixLen] = 0;
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          firstLen = firstLen+prefixLen;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(before == TRUE) { /* swap first and second */
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          u_strcpy(tempB, first);
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          u_strcpy(first, second);
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          u_strcpy(second, tempB);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          tempLen = firstLen;
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          firstLen = chLen;
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          chLen = tempLen;
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          tempLen = firstEx;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          firstEx = exLen;
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          exLen = tempLen;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          if(beforeStrength < strength) {
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strength = beforeStrength;
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      lastReset = FALSE;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      switch(strength){
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UCOL_IDENTICAL:
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          testEquality(coll,first,second);
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UCOL_PRIMARY:
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          testPrimary(coll,first,second);
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UCOL_SECONDARY:
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          testSecondary(coll,first,second);
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UCOL_TERTIARY:
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          testTertiary(coll,first,second);
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UCOL_TOK_RESET:
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lastReset = TRUE;
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        before = (UBool)((specs & UCOL_TOK_BEFORE) != 0);
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(before) {
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          beforeStrength = (specs & UCOL_TOK_BEFORE)-1;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      default:
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(before == TRUE && strength != UCOL_TOK_RESET) { /* first and second were swapped */
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        before = FALSE;
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        firstLen = chLen;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        firstEx = exLen;
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strcpy(first, second);
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
65527f654740f2a26ad62a5c155af9199af9e69b889claireho    uprv_free(src.source);
6568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    uprv_free(src.reorderCodes);
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult ucaTest(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen) {
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *UCA = (UCollator *)collator;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return ucol_strcoll(UCA, source, sLen, target, tLen);
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult winTest(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen) {
667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_HAS_WIN32_API
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LCID lcid = (LCID)collator;
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return (UCollationResult)CompareString(lcid, 0, source, sLen, target, tLen);
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return 0;
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult swampEarlier(tst_strcoll* func, void *collator, int opts,
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     UChar s1, UChar s2,
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     const UChar *s, const uint32_t sLen,
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     const UChar *t, const uint32_t tLen) {
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar source[256] = {0};
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar target[256] = {0};
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  source[0] = s1;
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_strcpy(source+1, s);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  target[0] = s2;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_strcpy(target+1, t);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return func(collator, opts, source, sLen+1, target, tLen+1);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult swampLater(tst_strcoll* func, void *collator, int opts,
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   UChar s1, UChar s2,
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   const UChar *s, const uint32_t sLen,
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   const UChar *t, const uint32_t tLen) {
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar source[256] = {0};
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar target[256] = {0};
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_strcpy(source, s);
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  source[sLen] = s1;
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_strcpy(target, t);
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  target[tLen] = s2;
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return func(collator, opts, source, sLen+1, target, tLen+1);
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint32_t probeStrength(tst_strcoll* func, void *collator, int opts,
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              const UChar *s, const uint32_t sLen,
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              const UChar *t, const uint32_t tLen,
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCollationResult result) {
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*UChar fPrimary = 0x6d;*/
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*UChar sPrimary = 0x6e;*/
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar fSecondary = 0x310d;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar sSecondary = 0x31a3;
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar fTertiary = 0x310f;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar sTertiary = 0x31b7;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollationResult oposite;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(result == UCOL_EQUAL) {
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UCOL_IDENTICAL;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(result == UCOL_GREATER) {
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    oposite = UCOL_LESS;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    oposite = UCOL_GREATER;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(swampEarlier(func, collator, opts, sSecondary, fSecondary, s, sLen, t, tLen) == result) {
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UCOL_PRIMARY;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if((swampEarlier(func, collator, opts, sTertiary, 0x310f, s, sLen, t, tLen) == result) &&
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (swampEarlier(func, collator, opts, 0x310f, sTertiary, s, sLen, t, tLen) == result)) {
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UCOL_SECONDARY;
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if((swampLater(func, collator, opts, sTertiary, fTertiary, s, sLen, t, tLen) == result) &&
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (swampLater(func, collator, opts, fTertiary, sTertiary, s, sLen, t, tLen) == result)) {
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UCOL_TERTIARY;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if((swampLater(func, collator, opts, sTertiary, 0x310f, s, sLen, t, tLen) == oposite) &&
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (swampLater(func, collator, opts, fTertiary, sTertiary, s, sLen, t, tLen) == oposite)) {
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UCOL_QUATERNARY;
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UCOL_IDENTICAL;
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *getRelationSymbol(UCollationResult res, uint32_t strength, char *buffer) {
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0;
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(res == UCOL_EQUAL || strength == 0xdeadbeef) {
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0] = '=';
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[1] = '=';
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2] = '\0';
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(res == UCOL_GREATER) {
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<strength+1; i++) {
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      buffer[i] = '>';
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[strength+1] = '\0';
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<strength+1; i++) {
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      buffer[i] = '<';
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[strength+1] = '\0';
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return buffer;
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void logFailure (const char *platform, const char *test,
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const UChar *source, const uint32_t sLen,
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const UChar *target, const uint32_t tLen,
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCollationResult realRes, uint32_t realStrength,
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCollationResult expRes, uint32_t expStrength, UBool error) {
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0;
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char sEsc[256], s[256], tEsc[256], t[256], b[256], output[512], relation[256];
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static int32_t maxOutputLength = 0;
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t outputLength;
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  *sEsc = *tEsc = *s = *t = 0;
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(error == TRUE) {
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Difference between expected and generated order. Run test with -v for more info\n");
78127f654740f2a26ad62a5c155af9199af9e69b889claireho  } else if(getTestOption(VERBOSITY_OPTION) == 0) {
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sLen; i++) {
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(b, "%04X", source[i]);
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(sEsc, "\\u");
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(sEsc, b);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(s, b);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(s, " ");
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(source[i] < 0x80) {
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      sprintf(b, "(%c)", source[i]);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcat(sEsc, b);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<tLen; i++) {
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(b, "%04X", target[i]);
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(tEsc, "\\u");
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(tEsc, b);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(t, b);
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(t, " ");
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(target[i] < 0x80) {
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      sprintf(b, "(%c)", target[i]);
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strcat(tEsc, b);
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcpy(output, "[[ ");
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, sEsc);
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, getRelationSymbol(expRes, expStrength, relation));
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, tEsc);
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, " : ");
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, sEsc);
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, getRelationSymbol(realRes, realStrength, relation));
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, tEsc);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, " ]] ");
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("%s", output);
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcpy(output, "DIFF: ");
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, s);
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, " : ");
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, t);
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, test);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, ": ");
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, sEsc);
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, getRelationSymbol(expRes, expStrength, relation));
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, tEsc);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, " ");
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, platform);
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, ": ");
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, sEsc);
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, getRelationSymbol(realRes, realStrength, relation));
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  strcat(output, tEsc);
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  outputLength = (int32_t)strlen(output);
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(outputLength > maxOutputLength) {
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    maxOutputLength = outputLength;
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_ASSERT(outputLength < sizeof(output));
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("%s\n", output);
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printOutRules(const UChar *rules) {
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t len = u_strlen(rules);
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char toPrint;
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t line = 0;
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  fprintf(stdout, "Rules:");
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<len; i++) {
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(rules[i]<0x7f && rules[i]>=0x20) {
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      toPrint = (char)rules[i];
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(toPrint == '&') {
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line = 1;
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "\n&");
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else if(toPrint == ';') {
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "<<");
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line+=2;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else if(toPrint == ',') {
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "<<<");
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line+=3;
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "%c", toPrint);
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        line++;
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(rules[i]<0x3400 || rules[i]>=0xa000) {
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      fprintf(stdout, "\\u%04X", rules[i]);
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      line+=6;
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(line>72) {
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      fprintf(stdout, "\n");
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      line = 0;
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("\n");
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint32_t testSwitch(tst_strcoll* func, void *collator, int opts, uint32_t strength, const UChar *first, const UChar *second, const char* msg, UBool error) {
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t diffs = 0;
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollationResult realResult;
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t realStrength;
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t sLen = u_strlen(first);
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t tLen = u_strlen(second);
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  realResult = func(collator, opts, first, sLen, second, tLen);
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  realStrength = probeStrength(func, collator, opts, first, sLen, second, tLen, realResult);
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
906103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  if(strength == UCOL_IDENTICAL && realResult != UCOL_EQUAL) {
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logFailure(msg, "tailoring", first, sLen, second, tLen, realResult, realStrength, UCOL_EQUAL, strength, error);
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    diffs++;
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(realResult != UCOL_LESS || realStrength != strength) {
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logFailure(msg, "tailoring", first, sLen, second, tLen, realResult, realStrength, UCOL_LESS, strength, error);
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    diffs++;
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return diffs;
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testAgainstUCA(UCollator *coll, UCollator *UCA, const char *refName, UBool error, UErrorCode *status) {
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar *rules = NULL, *current = NULL;
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t ruleLen = 0;
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t strength = 0;
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t chOffset = 0; uint32_t chLen = 0;
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t exOffset = 0; uint32_t exLen = 0;
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t prefixOffset = 0; uint32_t prefixLen = 0;
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  uint32_t rExpsLen = 0; */
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t firstLen = 0, secondLen = 0;
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool varT = FALSE; UBool top_ = TRUE;
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint16_t specs = 0;
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool startOfRules = TRUE;
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColTokenParser src;
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColOptionSet opts;
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar first[256];
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar second[256];
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *rulesCopy = NULL;
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t UCAdiff = 0;
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t Windiff = 1;
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UParseError parseError;
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
94027f654740f2a26ad62a5c155af9199af9e69b889claireho  uprv_memset(&src, 0, sizeof(UColTokenParser));
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  src.opts = &opts;
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  rules = ucol_getRules(coll, &ruleLen);
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*printOutRules(rules);*/
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(*status) && ruleLen > 0) {
94827f654740f2a26ad62a5c155af9199af9e69b889claireho    rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar));
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.current = src.source = rulesCopy;
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.end = rulesCopy+ruleLen;
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.extraCurrent = src.end;
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *first = *second = 0;
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95627f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
95727f654740f2a26ad62a5c155af9199af9e69b889claireho       the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,status)) != NULL) {
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      strength = src.parsedToken.strength;
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      chOffset = src.parsedToken.charsOffset;
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      chLen = src.parsedToken.charsLen;
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      exOffset = src.parsedToken.extensionOffset;
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      exLen = src.parsedToken.extensionLen;
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      prefixOffset = src.parsedToken.prefixOffset;
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      prefixLen = src.parsedToken.prefixLen;
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      specs = src.parsedToken.flags;
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      startOfRules = FALSE;
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0);
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      top_ = (UBool)((specs & UCOL_TOK_TOP) != 0);
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97227f654740f2a26ad62a5c155af9199af9e69b889claireho      u_strncpy(second,src.source+chOffset, chLen);
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      second[chLen] = 0;
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      secondLen = chLen;
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(exLen > 0) {
97727f654740f2a26ad62a5c155af9199af9e69b889claireho        u_strncat(first, src.source+exOffset, exLen);
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        first[firstLen+exLen] = 0;
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        firstLen += exLen;
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(strength != UCOL_TOK_RESET) {
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((*first<0x3400 || *first>=0xa000) && (*second<0x3400 || *second>=0xa000)) {
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCAdiff += testSwitch(&ucaTest, (void *)UCA, 0, strength, first, second, refName, error);
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          /*Windiff += testSwitch(&winTest, (void *)lcid, 0, strength, first, second, "Win32");*/
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      firstLen = chLen;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      u_strcpy(first, second);
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UCAdiff != 0 && Windiff != 0) {
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("\n");
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UCAdiff == 0) {
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("No immediate difference with %s!\n", refName);
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(Windiff == 0) {
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("No immediate difference with Win32!\n");
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
100327f654740f2a26ad62a5c155af9199af9e69b889claireho    uprv_free(src.source);
10048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    uprv_free(src.reorderCodes);
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Takes two CEs (lead and continuation) and
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * compares them as CEs should be compared:
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * primary vs. primary, secondary vs. secondary
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tertiary vs. tertiary
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t compareCEs(uint32_t s1, uint32_t s2,
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   uint32_t t1, uint32_t t2) {
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t s = 0, t = 0;
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(s1 == t1 && s2 == t2) {
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return 0;
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16);
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16);
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(s < t) {
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -1;
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(s > t) {
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return 1;
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s = (s1 & 0x0000FF00) | (s2 & 0x0000FF00)>>8;
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    t = (t1 & 0x0000FF00) | (t2 & 0x0000FF00)>>8;
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(s < t) {
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return -1;
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(s > t) {
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return 1;
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      s = (s1 & 0x000000FF)<<8 | (s2 & 0x000000FF);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      t = (t1 & 0x000000FF)<<8 | (t2 & 0x000000FF);
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(s < t) {
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct {
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t startCE;
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t startContCE;
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t limitCE;
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t limitContCE;
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} indirectBoundaries;
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* these values are used for finding CE values for indirect positioning. */
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Indirect positioning is a mechanism for allowing resets on symbolic   */
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* values. It only works for resets and you cannot tailor indirect names */
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* An indirect name can define either an anchor point or a range. An     */
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* anchor point behaves in exactly the same way as a code point in reset */
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* would, except that it cannot be tailored. A range (we currently only  */
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* know for the [top] range will explicitly set the upper bound for      */
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* generated CEs, thus allowing for better control over how many CEs can */
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* be squeezed between in the range without performance penalty.         */
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* In that respect, we use [top] for tailoring of locales that use CJK   */
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* characters. Other indirect values are currently a pure convenience,   */
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* they can be used to assure that the CEs will be always positioned in  */
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* the same place relative to a point with known properties (e.g. first  */
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* primary ignorable). */
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic indirectBoundaries ucolIndirectBoundaries[15];
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool indirectBoundariesSet = FALSE;
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void setIndirectBoundaries(uint32_t indexR, uint32_t *start, uint32_t *end) {
106985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Set values for the top - TODO: once we have values for all the indirects, we are going */
107085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* to initalize here. */
107185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucolIndirectBoundaries[indexR].startCE = start[0];
107285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucolIndirectBoundaries[indexR].startContCE = start[1];
107385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(end) {
107485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucolIndirectBoundaries[indexR].limitCE = end[0];
107585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucolIndirectBoundaries[indexR].limitContCE = end[1];
107685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
107785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucolIndirectBoundaries[indexR].limitCE = 0;
107885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucolIndirectBoundaries[indexR].limitContCE = 0;
107985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testCEs(UCollator *coll, UErrorCode *status) {
108385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UChar *rules = NULL, *current = NULL;
108485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t ruleLen = 0;
108585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
108685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t strength = 0;
108785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t maxStrength = UCOL_IDENTICAL;
108885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t baseCE, baseContCE, nextCE, nextContCE, currCE, currContCE;
108985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t lastCE;
109085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t lastContCE;
109185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
109285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t result = 0;
109385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t chOffset = 0; uint32_t chLen = 0;
109485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t exOffset = 0; uint32_t exLen = 0;
109585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t prefixOffset = 0; uint32_t prefixLen = 0;
109685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t oldOffset = 0;
109785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
109885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* uint32_t rExpsLen = 0; */
109985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* uint32_t firstLen = 0; */
110085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint16_t specs = 0;
110185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool varT = FALSE; UBool top_ = TRUE;
110285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool startOfRules = TRUE;
110385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool before = FALSE;
110485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UColTokenParser src;
110585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UColOptionSet opts;
110685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UParseError parseError;
110785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar *rulesCopy = NULL;
110850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    collIterate *c = uprv_new_collIterate(status);
110985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCAConstants *consts = NULL;
111085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t UCOL_RESET_TOP_VALUE, /*UCOL_RESET_TOP_CONT, */
111185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UCOL_NEXT_TOP_VALUE, UCOL_NEXT_TOP_CONT;
111285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *colLoc;
111385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *UCA = ucol_open("root", status);
111485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
111585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(*status)) {
111685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Could not open root collator %s\n", u_errorName(*status));
111750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uprv_delete_collIterate(c);
111885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
111985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    colLoc = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, status);
112285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(*status)) {
112385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Could not get collator name: %s\n", u_errorName(*status));
112450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ucol_close(UCA);
112550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uprv_delete_collIterate(c);
112685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
112785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112927f654740f2a26ad62a5c155af9199af9e69b889claireho    uprv_memset(&src, 0, sizeof(UColTokenParser));
113027f654740f2a26ad62a5c155af9199af9e69b889claireho
113185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    consts = (UCAConstants *)((uint8_t *)UCA->image + UCA->image->UCAConsts);
113285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCOL_RESET_TOP_VALUE = consts->UCA_LAST_NON_VARIABLE[0];
113385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /*UCOL_RESET_TOP_CONT = consts->UCA_LAST_NON_VARIABLE[1]; */
113485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCOL_NEXT_TOP_VALUE = consts->UCA_FIRST_IMPLICIT[0];
113585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCOL_NEXT_TOP_CONT = consts->UCA_FIRST_IMPLICIT[1];
113685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
113785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    baseCE=baseContCE=nextCE=nextContCE=currCE=currContCE=lastCE=lastContCE = UCOL_NOT_FOUND;
113885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
113985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    src.opts = &opts;
114085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
114185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    rules = ucol_getRules(coll, &ruleLen);
114285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
114385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    src.invUCA = ucol_initInverseUCA(status);
114485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
114585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(indirectBoundariesSet == FALSE) {
114685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_RESET_TOP_VALUE */
114785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT);
114885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_PRIMARY_IGNORABLE */
114985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(1, consts->UCA_FIRST_PRIMARY_IGNORABLE, 0);
115085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_PRIMARY_IGNORABLE */
115185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(2, consts->UCA_LAST_PRIMARY_IGNORABLE, 0);
115285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_SECONDARY_IGNORABLE */
115385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(3, consts->UCA_FIRST_SECONDARY_IGNORABLE, 0);
115485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_SECONDARY_IGNORABLE */
115585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(4, consts->UCA_LAST_SECONDARY_IGNORABLE, 0);
115685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_TERTIARY_IGNORABLE */
115785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(5, consts->UCA_FIRST_TERTIARY_IGNORABLE, 0);
115885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_TERTIARY_IGNORABLE */
115985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(6, consts->UCA_LAST_TERTIARY_IGNORABLE, 0);
116085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_VARIABLE */
116185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(7, consts->UCA_FIRST_VARIABLE, 0);
116285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_VARIABLE */
116385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(8, consts->UCA_LAST_VARIABLE, 0);
116485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_NON_VARIABLE */
116585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(9, consts->UCA_FIRST_NON_VARIABLE, 0);
116685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_NON_VARIABLE */
116785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(10, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT);
116885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_IMPLICIT */
116985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(11, consts->UCA_FIRST_IMPLICIT, 0);
117085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_IMPLICIT */
117185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(12, consts->UCA_LAST_IMPLICIT, consts->UCA_FIRST_TRAILING);
117285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_FIRST_TRAILING */
117385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(13, consts->UCA_FIRST_TRAILING, 0);
117485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* UCOL_LAST_TRAILING */
117585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        setIndirectBoundaries(14, consts->UCA_LAST_TRAILING, 0);
117685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucolIndirectBoundaries[14].limitCE = (consts->UCA_PRIMARY_SPECIAL_MIN<<24);
117785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        indirectBoundariesSet = TRUE;
117885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_SUCCESS(*status) && ruleLen > 0) {
118227f654740f2a26ad62a5c155af9199af9e69b889claireho        rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
118385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar));
118485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        src.current = src.source = rulesCopy;
118585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        src.end = rulesCopy+ruleLen;
118685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        src.extraCurrent = src.end;
118785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
118885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
118927f654740f2a26ad62a5c155af9199af9e69b889claireho	    /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
119027f654740f2a26ad62a5c155af9199af9e69b889claireho	       the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
119185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,status)) != NULL) {
119285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            strength = src.parsedToken.strength;
119385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            chOffset = src.parsedToken.charsOffset;
119485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            chLen = src.parsedToken.charsLen;
119585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            exOffset = src.parsedToken.extensionOffset;
119685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            exLen = src.parsedToken.extensionLen;
119785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            prefixOffset = src.parsedToken.prefixOffset;
119885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            prefixLen = src.parsedToken.prefixLen;
119985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            specs = src.parsedToken.flags;
120085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
120185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            startOfRules = FALSE;
120285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0);
120385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            top_ = (UBool)((specs & UCOL_TOK_TOP) != 0);
120485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
120527f654740f2a26ad62a5c155af9199af9e69b889claireho            uprv_init_collIterate(coll, src.source+chOffset, chLen, c, status);
120685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
120750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            currCE = ucol_getNextCE(coll, c, status);
120827f654740f2a26ad62a5c155af9199af9e69b889claireho            if(currCE == 0 && UCOL_ISTHAIPREVOWEL(*(src.source+chOffset))) {
120985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_verbose("Thai prevowel detected. Will pick next CE\n");
121050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                currCE = ucol_getNextCE(coll, c, status);
121185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            currContCE = ucol_getNextCE(coll, c, status);
121485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(!isContinuation(currContCE)) {
121585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                currContCE = 0;
121685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            /* we need to repack CEs here */
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(strength == UCOL_TOK_RESET) {
122185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                before = (UBool)((specs & UCOL_TOK_BEFORE) != 0);
122285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(top_ == TRUE) {
122327f654740f2a26ad62a5c155af9199af9e69b889claireho                    int32_t tokenIndex = src.parsedToken.indirectIndex;
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122527f654740f2a26ad62a5c155af9199af9e69b889claireho                    nextCE = baseCE = currCE = ucolIndirectBoundaries[tokenIndex].startCE;
122627f654740f2a26ad62a5c155af9199af9e69b889claireho                    nextContCE = baseContCE = currContCE = ucolIndirectBoundaries[tokenIndex].startContCE;
122785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                } else {
122885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    nextCE = baseCE = currCE;
122985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    nextContCE = baseContCE = currContCE;
123085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
123185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                maxStrength = UCOL_IDENTICAL;
123285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            } else {
123385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(strength < maxStrength) {
123485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    maxStrength = strength;
123585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    if(baseCE == UCOL_RESET_TOP_VALUE) {
123685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        log_verbose("Resetting to [top]\n");
123785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        nextCE = UCOL_NEXT_TOP_VALUE;
123885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        nextContCE = UCOL_NEXT_TOP_CONT;
123985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    } else {
124085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        result = ucol_inv_getNextCE(&src, baseCE & 0xFFFFFF3F, baseContCE, &nextCE, &nextContCE, maxStrength);
124185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    }
124285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    if(result < 0) {
124327f654740f2a26ad62a5c155af9199af9e69b889claireho                        if(ucol_isTailored(coll, *(src.source+oldOffset), status)) {
124427f654740f2a26ad62a5c155af9199af9e69b889claireho                            log_verbose("Reset is tailored codepoint %04X, don't know how to continue, taking next test\n", *(src.source+oldOffset));
124585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            return;
124685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        } else {
124785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            log_err("%s: couldn't find the CE\n", colLoc);
124885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            return;
124985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        }
125085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    }
125185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                currCE &= 0xFFFFFF3F;
125485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                currContCE &= 0xFFFFFFBF;
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(maxStrength == UCOL_IDENTICAL) {
125785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    if(baseCE != currCE || baseContCE != currContCE) {
125885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        log_err("%s: current CE  (initial strength UCOL_EQUAL)\n", colLoc);
125985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    }
126085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                } else {
126185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    if(strength == UCOL_IDENTICAL) {
126285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        if(lastCE != currCE || lastContCE != currContCE) {
126385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            log_err("%s: current CE  (initial strength UCOL_EQUAL)\n", colLoc);
126485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        }
126585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    } else {
126685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        if(compareCEs(currCE, currContCE, nextCE, nextContCE) > 0) {
126785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            /*if(currCE > nextCE || (currCE == nextCE && currContCE >= nextContCE)) {*/
126885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            log_err("%s: current CE is not less than base CE\n", colLoc);
126985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        }
127085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        if(!before) {
127185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            if(compareCEs(currCE, currContCE, lastCE, lastContCE) < 0) {
127285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/
127385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                log_err("%s: sequence of generated CEs is broken\n", colLoc);
127485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            }
127585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        } else {
127685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            before = FALSE;
127785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            if(compareCEs(currCE, currContCE, lastCE, lastContCE) > 0) {
127885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/
127985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                log_err("%s: sequence of generated CEs is broken\n", colLoc);
128085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                            }
128185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        }
128285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    }
128385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            oldOffset = chOffset;
128885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            lastCE = currCE & 0xFFFFFF3F;
128985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            lastContCE = currContCE & 0xFFFFFFBF;
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
129127f654740f2a26ad62a5c155af9199af9e69b889claireho        uprv_free(src.source);
12928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        uprv_free(src.reorderCodes);
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
129485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(UCA);
129550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uprv_delete_collIterate(c);
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* these locales are now picked from index RB */
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* localesToTest[] = {
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"ar", "bg", "ca", "cs", "da",
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"el", "en_BE", "en_US_POSIX",
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"es", "et", "fi", "fr", "hi",
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"hr", "hu", "is", "iw", "ja",
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"ko", "lt", "lv", "mk", "mt",
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"nb", "nn", "nn_NO", "pl", "ro",
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"ru", "sh", "sk", "sl", "sq",
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"sr", "sv", "th", "tr", "uk",
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"vi", "zh", "zh_TW"
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* rulesToTest[] = {
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* Funky fa rule */
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "&\\u0622 < \\u0627 << \\u0671 < \\u0621",
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*"& Z < p, P",*/
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Cui Mins rules */
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<o,O<p,P<q,Q<'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U & Qu<'?'",*/
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<o,O<p,P<q,Q;'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U & Qu;'?'",*/
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<o,O<p,P<q,Q,'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U&'Qu','?'",*/
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q;'?'/u<r,R<u,U",  /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & Qu;'?'",*/
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<'?';Qu<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q<r,R<u,U",  /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & '?';Qu",*/
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q;'?'/um<r,R<u,U", /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & Qum;'?'",*/
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[top]<'?';Qum<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q<r,R<u,U"  /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & '?';Qum"*/
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollations(void) {
132985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t noOfLoc = uloc_countAvailable();
133085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i = 0, j = 0;
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
133385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char cName[256];
133485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar name[256];
133585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t nameSize;
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *locName = NULL;
133985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = NULL;
134085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *UCA = ucol_open("", &status);
134185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UColAttributeValue oldStrength = ucol_getAttribute(UCA, UCOL_STRENGTH, &status);
134285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
134385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Could not open UCA collator %s\n", u_errorName(status));
134485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
134585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
134685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setAttribute(UCA, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(i = 0; i<noOfLoc; i++) {
134985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        status = U_ZERO_ERROR;
135085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        locName = uloc_getAvailable(i);
135185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(uprv_strcmp("ja", locName) == 0) {
135285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_verbose("Don't know how to test prefixes\n");
135385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            continue;
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
135585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(hasCollationElements(locName)) {
135685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            nameSize = uloc_getDisplayName(locName, NULL, name, 256, &status);
135785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            for(j = 0; j<nameSize; j++) {
135885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                cName[j] = (char)name[j];
135985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
136085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            cName[nameSize] = 0;
136185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_verbose("\nTesting locale %s (%s)\n", locName, cName);
136285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            coll = ucol_open(locName, &status);
136385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(U_SUCCESS(status)) {
136485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                testAgainstUCA(coll, UCA, "UCA", FALSE, &status);
136585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                ucol_close(coll);
136685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            } else {
136785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("Couldn't instantiate collator for locale %s, error: %s\n", locName, u_errorName(status));
136885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                status = U_ZERO_ERROR;
136985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
137285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setAttribute(UCA, UCOL_STRENGTH, oldStrength, &status);
137385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(UCA);
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void RamsRulesTest(void) {
137785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
137885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i = 0;
137985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = NULL;
138085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar rule[2048];
138185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t ruleLen;
138285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t noOfLoc = uloc_countAvailable();
138385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *locName = NULL;
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("RamsRulesTest\n");
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (uprv_strcmp("km", uloc_getDefault())==0 || uprv_strcmp("km_KH", uloc_getDefault())==0) {
138827f654740f2a26ad62a5c155af9199af9e69b889claireho        /* This test will fail if the default locale is "km" or "km_KH". Enable after trac#6040. */
138927f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
139027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
139127f654740f2a26ad62a5c155af9199af9e69b889claireho
139285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(i = 0; i<noOfLoc; i++) {
139385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        locName = uloc_getAvailable(i);
139485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(hasCollationElements(locName)) {
139585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (uprv_strcmp("ja", locName)==0) {
139685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_verbose("Don't know how to test Japanese because of prefixes\n");
139785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                continue;
139885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
139985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (uprv_strcmp("de__PHONEBOOK", locName)==0) {
140085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_verbose("Don't know how to test Phonebook because the reset is on an expanding character\n");
140185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                continue;
140285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
140327f654740f2a26ad62a5c155af9199af9e69b889claireho            if (uprv_strcmp("bn", locName)==0 ||
14048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                uprv_strcmp("bs", locName)==0 ||            /* Add due to import per cldrbug 5647 */
14058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                uprv_strcmp("bs_Cyrl", locName)==0 ||       /* Add due to import per cldrbug 5647 */
140627f654740f2a26ad62a5c155af9199af9e69b889claireho                uprv_strcmp("en_US_POSIX", locName)==0 ||
14078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                uprv_strcmp("fa_AF", locName)==0 ||         /* Add due to import per cldrbug 5647 */
14088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                uprv_strcmp("he", locName)==0 ||            /* Add due to new tailoring of \u05F3 vs \u0027 per cldrbug 5576 */
14098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                uprv_strcmp("he_IL", locName)==0 ||         /* Add due to new tailoring of \u05F3 vs \u0027 per cldrbug 5576 */
141027f654740f2a26ad62a5c155af9199af9e69b889claireho                uprv_strcmp("km", locName)==0 ||
141185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                uprv_strcmp("km_KH", locName)==0 ||
141227f654740f2a26ad62a5c155af9199af9e69b889claireho                uprv_strcmp("my", locName)==0 ||
141385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                uprv_strcmp("si", locName)==0 ||
141485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                uprv_strcmp("si_LK", locName)==0 ||
14158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                uprv_strcmp("sr_Latn", locName)==0 ||       /* Add due to import per cldrbug 5647 */
141654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                uprv_strcmp("th", locName)==0 ||
141754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                uprv_strcmp("th_TH", locName)==0 ||
141885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                uprv_strcmp("zh", locName)==0 ||
141927f654740f2a26ad62a5c155af9199af9e69b889claireho                uprv_strcmp("zh_Hant", locName)==0
142027f654740f2a26ad62a5c155af9199af9e69b889claireho            ) {
142127f654740f2a26ad62a5c155af9199af9e69b889claireho                log_verbose("Don't know how to test %s. "
142227f654740f2a26ad62a5c155af9199af9e69b889claireho                            "TODO: Fix ticket #6040 and reenable RamsRulesTest for this locale.\n", locName);
142327f654740f2a26ad62a5c155af9199af9e69b889claireho                continue;
142485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
142585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_verbose("Testing locale %s\n", locName);
142627f654740f2a26ad62a5c155af9199af9e69b889claireho            status = U_ZERO_ERROR;
142785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            coll = ucol_open(locName, &status);
142885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(U_SUCCESS(status)) {
142927f654740f2a26ad62a5c155af9199af9e69b889claireho              if((status != U_USING_DEFAULT_WARNING) && (status != U_USING_FALLBACK_WARNING)) {
143085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(coll->image->jamoSpecial == TRUE) {
143127f654740f2a26ad62a5c155af9199af9e69b889claireho                  log_err("%s has special JAMOs\n", locName);
143285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
143385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_OFF, &status);
143485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                testCollator(coll, &status);
143585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                testCEs(coll, &status);
143627f654740f2a26ad62a5c155af9199af9e69b889claireho              } else {
143727f654740f2a26ad62a5c155af9199af9e69b889claireho                log_verbose("Skipping %s: %s\n", locName, u_errorName(status));
143827f654740f2a26ad62a5c155af9199af9e69b889claireho              }
143927f654740f2a26ad62a5c155af9199af9e69b889claireho              ucol_close(coll);
144027f654740f2a26ad62a5c155af9199af9e69b889claireho            } else {
144127f654740f2a26ad62a5c155af9199af9e69b889claireho              log_err("Could not open %s: %s\n", locName, u_errorName(status));
144285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(i = 0; i<sizeof(rulesToTest)/sizeof(rulesToTest[0]); i++) {
144785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("Testing rule: %s\n", rulesToTest[i]);
144885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ruleLen = u_unescape(rulesToTest[i], rule, 2048);
144927f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
145085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
145185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_SUCCESS(status)) {
145285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            testCollator(coll, &status);
145385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            testCEs(coll, &status);
145485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_close(coll);
145527f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
145627f654740f2a26ad62a5c155af9199af9e69b889claireho          log_err_status(status, "Could not test rule: %s: '%s'\n", u_errorName(status), rulesToTest[i]);
145785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void IsTailoredTest(void) {
146385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
146485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t i = 0;
146585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = NULL;
146685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar rule[2048];
146785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar tailored[2048];
146885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar notTailored[2048];
146985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t ruleLen, tailoredLen, notTailoredLen;
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("IsTailoredTest\n");
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_uastrcpy(rule, "&Z < A, B, C;c < d");
147485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ruleLen = u_strlen(rule);
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_uastrcpy(tailored, "ABCcd");
147785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    tailoredLen = u_strlen(tailored);
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_uastrcpy(notTailored, "ZabD");
148085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    notTailoredLen = u_strlen(notTailored);
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
148285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
148385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_SUCCESS(status)) {
148485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<tailoredLen; i++) {
148585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(!ucol_isTailored(coll, tailored[i], &status)) {
148685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("%i: %04X should be tailored - it is reported as not\n", i, tailored[i]);
148785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
148885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
148985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<notTailoredLen; i++) {
149085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(ucol_isTailored(coll, notTailored[i], &status)) {
149185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("%i: %04X should not be tailored - it is reported as it is\n", i, notTailored[i]);
149285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
149385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
149485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(coll);
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
149685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    else {
149785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Can't tailor rules\n");
149885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
149985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Code coverage */
150085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    status = U_ZERO_ERROR;
150185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_open("ja", &status);
150285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(!ucol_isTailored(coll, 0x4E9C, &status)) {
150385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "0x4E9C should be tailored - it is reported as not\n");
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char chTest[][20] = {
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "c",
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "C",
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "ca", "cb", "cx", "cy", "CZ",
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "c\\u030C", "C\\u030C",
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "h",
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "H",
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "ha", "Ha", "harly", "hb", "HB", "hx", "HX", "hy", "HY",
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "ch", "cH", "Ch", "CH",
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "cha", "charly", "che", "chh", "chch", "chr",
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "i", "I", "iarly",
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "r", "R",
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "r\\u030C", "R\\u030C",
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "s",
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "S",
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "s\\u030C", "S\\u030C",
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "z", "Z",
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "z\\u030C", "Z\\u030C"
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestChMove(void) {
153085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar t1[256] = {0};
153185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar t2[256] = {0};
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
153385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t i = 0, j = 0;
153485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t size = 0;
153585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
153785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = ucol_open("cs", &status);
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
153985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_SUCCESS(status)) {
154085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        size = sizeof(chTest)/sizeof(chTest[0]);
154185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i < size-1; i++) {
154285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            for(j = i+1; j < size; j++) {
154385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                u_unescape(chTest[i], t1, 256);
154485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                u_unescape(chTest[j], t2, 256);
154585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                doTest(coll, t1, t2, UCOL_LESS);
154685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
154785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
154985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    else {
155027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_data_err("Can't open collator");
155185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
155285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char impTest[][20] = {
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "\\u4e00",
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a",
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "A",
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "b",
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "B",
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u4e01"
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestImplicitTailoring(void) {
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *data[10];
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint32_t len;
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      { "&[before 1]\\u4e00 < b < c &[before 1]\\u4e00 < d < e", { "d", "e", "b", "c", "\\u4e00"}, 5 },
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      { "&\\u4e00 < a <<< A < b <<< B",   { "\\u4e00", "a", "A", "b", "B", "\\u4e01"}, 6 },
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      { "&[before 1]\\u4e00 < \\u4e01 < \\u4e02", { "\\u4e01", "\\u4e02", "\\u4e00"}, 3},
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      { "&[before 1]\\u4e01 < \\u4e02 < \\u4e03", { "\\u4e02", "\\u4e03", "\\u4e01"}, 3}
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = 0;
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len);
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t1[256] = {0};
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t2[256] = {0};
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *rule = "&\\u4e00 < a <<< A < b <<< B";
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i = 0, j = 0;
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t size = 0;
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t ruleLen = 0;
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = NULL;
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ruleLen = u_unescape(rule, t1, 256);
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  coll = ucol_openRules(t1, ruleLen, UCOL_OFF, UCOL_TERTIARY,NULL, &status);
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = sizeof(impTest)/sizeof(impTest[0]);
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < size-1; i++) {
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(j = i+1; j < size; j++) {
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(impTest[i], t1, 256);
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(impTest[j], t2, 256);
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, t1, t2, UCOL_LESS);
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  else {
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Can't open collator");
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  */
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestFCDProblem(void) {
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t1[256] = {0};
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar t2[256] = {0};
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *s1 = "\\u0430\\u0306\\u0325";
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *s2 = "\\u04D1\\u0325";
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_unescape(s1, t1, 256);
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_unescape(s2, t2, 256);
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  doTest(coll, t1, t2, UCOL_EQUAL);
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  doTest(coll, t1, t2, UCOL_EQUAL);
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
164085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoThe largest normalization form is 18 for NFKC/NFKD, 4 for NFD and 3 for NFC
164185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoWe're only using NFC/NFD in this test.
164285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/
164385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define NORM_BUFFER_TEST_LEN 18
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct {
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar32 u;
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar NFC[NORM_BUFFER_TEST_LEN];
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar NFD[NORM_BUFFER_TEST_LEN];
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} tester;
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestComposeDecompose(void) {
165185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* [[:NFD_Inert=false:][:NFC_Inert=false:]] */
165285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar UNICODESET_STR[] = {
165385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        0x5B,0x5B,0x3A,0x4E,0x46,0x44,0x5F,0x49,0x6E,0x65,0x72,0x74,0x3D,0x66,0x61,
165485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        0x6C,0x73,0x65,0x3A,0x5D,0x5B,0x3A,0x4E,0x46,0x43,0x5F,0x49,0x6E,0x65,0x72,
165585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        0x74,0x3D,0x66,0x61,0x6C,0x73,0x65,0x3A,0x5D,0x5D,0
165685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t noOfLoc;
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, j = 0;
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *locName = NULL;
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t nfcSize;
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t nfdSize;
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tester **t;
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t noCases = 0;
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 u = 0;
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar comp[NORM_BUFFER_TEST_LEN];
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t len = 0;
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationElements *iter;
167185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    USet *charsToTest = uset_openPattern(UNICODESET_STR, -1, &status);
167285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t charsToTestSize;
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    noOfLoc = uloc_countAvailable();
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("", &status);
167785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
167885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Error opening collator -> %s (Are you missing data?)\n", u_errorName(status));
167985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
168185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    charsToTestSize = uset_size(charsToTest);
168285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (charsToTestSize <= 0) {
168385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Set was zero. Missing data?\n");
168485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
168585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
1686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    t = (tester **)malloc(charsToTestSize * sizeof(tester *));
168785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    t[0] = (tester *)malloc(sizeof(tester));
168885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing UCA extensively for %d characters\n", charsToTestSize);
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(u = 0; u < charsToTestSize; u++) {
169185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar32 ch = uset_charAt(charsToTest, u);
169285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        len = 0;
1693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        U16_APPEND_UNSAFE(comp, len, ch);
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nfcSize = unorm_normalize(comp, len, UNORM_NFC, 0, t[noCases]->NFC, NORM_BUFFER_TEST_LEN, &status);
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nfdSize = unorm_normalize(comp, len, UNORM_NFD, 0, t[noCases]->NFD, NORM_BUFFER_TEST_LEN, &status);
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(nfcSize != nfdSize || (uprv_memcmp(t[noCases]->NFC, t[noCases]->NFD, nfcSize * sizeof(UChar)) != 0)
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          || (len != nfdSize || (uprv_memcmp(comp, t[noCases]->NFD, nfdSize * sizeof(UChar)) != 0))) {
169985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            t[noCases]->u = ch;
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(len != nfdSize || (uprv_memcmp(comp, t[noCases]->NFD, nfdSize * sizeof(UChar)) != 0)) {
170185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                u_strncpy(t[noCases]->NFC, comp, len);
170285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                t[noCases]->NFC[len] = 0;
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            noCases++;
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            t[noCases] = (tester *)malloc(sizeof(tester));
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_memset(t[noCases], 0, sizeof(tester));
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
170985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing %d/%d of possible test cases\n", noCases, charsToTestSize);
171085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uset_close(charsToTest);
171185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    charsToTest = NULL;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(u=0; u<(UChar32)noCases; u++) {
171485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(!ucol_equal(coll, t[u]->NFC, -1, t[u]->NFD, -1)) {
171585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Failure: codePoint %05X fails TestComposeDecompose in the UCA\n", t[u]->u);
171685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            doTest(coll, t[u]->NFC, t[u]->NFD, UCOL_EQUAL);
171785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
172085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(u = 0; u < charsToTestSize; u++) {
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(!(u&0xFFFF)) {
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%08X ", u);
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_memset(t[noCases], 0, sizeof(tester));
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      t[noCases]->u = u;
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      len = 0;
1727103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      U16_APPEND_UNSAFE(comp, len, u);
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      comp[len] = 0;
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      nfcSize = unorm_normalize(comp, len, UNORM_NFC, 0, t[noCases]->NFC, NORM_BUFFER_TEST_LEN, &status);
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      nfdSize = unorm_normalize(comp, len, UNORM_NFD, 0, t[noCases]->NFD, NORM_BUFFER_TEST_LEN, &status);
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doTest(coll, comp, t[noCases]->NFD, UCOL_EQUAL);
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doTest(coll, comp, t[noCases]->NFC, UCOL_EQUAL);
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing locales, number of cases = %i\n", noCases);
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<noOfLoc; i++) {
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        locName = uloc_getAvailable(i);
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(hasCollationElements(locName)) {
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char cName[256];
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar name[256];
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t nameSize = uloc_getDisplayName(locName, NULL, name, sizeof(cName), &status);
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j = 0; j<nameSize; j++) {
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                cName[j] = (char)name[j];
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cName[nameSize] = 0;
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("\nTesting locale %s (%s)\n", locName, cName);
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            coll = ucol_open(locName, &status);
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(coll, UCOL_IDENTICAL);
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            iter = ucol_openElements(coll, t[u]->NFD, u_strlen(t[u]->NFD), &status);
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(u=0; u<(UChar32)noCases; u++) {
175885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(!ucol_equal(coll, t[u]->NFC, -1, t[u]->NFD, -1)) {
175985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    log_err("Failure: codePoint %05X fails TestComposeDecompose for locale %s\n", t[u]->u, cName);
176085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    doTest(coll, t[u]->NFC, t[u]->NFD, UCOL_EQUAL);
176185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    log_verbose("Testing NFC\n");
176285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    ucol_setText(iter, t[u]->NFC, u_strlen(t[u]->NFC), &status);
176385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    backAndForth(iter);
176485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    log_verbose("Testing NFD\n");
176585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    ucol_setText(iter, t[u]->NFD, u_strlen(t[u]->NFD), &status);
176685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    backAndForth(iter);
176785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_closeElements(iter);
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_close(coll);
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(u = 0; u <= (UChar32)noCases; u++) {
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(t[u]);
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(t);
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestEmptyRule(void) {
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar rulez[] = { 0 };
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_openRules(rulez, 0, UCOL_OFF, UCOL_TERTIARY,NULL, &status);
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestUCARules(void) {
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar b[256];
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *rules = b;
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t ruleLen = 0;
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *UCAfromRules = NULL;
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(status == U_FILE_ACCESS_ERROR) {
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_data_err("Is your data around?\n");
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(U_FAILURE(status)) {
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Error opening collator\n");
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ruleLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rules, 256);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("TestUCARules\n");
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(ruleLen > 256) {
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules = (UChar *)malloc((ruleLen+1)*sizeof(UChar));
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ruleLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rules, ruleLen);
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Rules length is %d\n", ruleLen);
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCAfromRules = ucol_openRules(rules, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(UCAfromRules);
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Unable to create a collator from UCARules!\n");
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  u_unescape(blah, b, 256);
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_getSortKey(coll, b, 1, res, 256);
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(rules != b) {
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(rules);
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Pinyin tonal order */
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    A < .. (\u0101) < .. (\u00e1) < .. (\u01ce) < .. (\u00e0)
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          (w/macron)<  (w/acute)<   (w/caron)<   (w/grave)
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    E < .. (\u0113) < .. (\u00e9) < .. (\u011b) < .. (\u00e8)
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    I < .. (\u012b) < .. (\u00ed) < .. (\u01d0) < .. (\u00ec)
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    O < .. (\u014d) < .. (\u00f3) < .. (\u01d2) < .. (\u00f2)
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U < .. (\u016b) < .. (\u00fa) < .. (\u01d4) < .. (\u00f9)
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      < .. (\u01d6) < .. (\u01d8) < .. (\u01da) < .. (\u01dc) <
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru.. (\u00fc)
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruHowever, in testing we got the following order:
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    A < .. (\u00e1) < .. (\u00e0) < .. (\u01ce) < .. (\u0101)
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          (w/acute)<   (w/grave)<   (w/caron)<   (w/macron)
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    E < .. (\u00e9) < .. (\u00e8) < .. (\u00ea) < .. (\u011b) <
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru.. (\u0113)
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    I < .. (\u00ed) < .. (\u00ec) < .. (\u01d0) < .. (\u012b)
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    O < .. (\u00f3) < .. (\u00f2) < .. (\u01d2) < .. (\u014d)
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U < .. (\u00fa) < .. (\u00f9) < .. (\u01d4) < .. (\u00fc) <
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru.. (\u01d8)
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      < .. (\u01dc) < .. (\u01da) < .. (\u01d6) < .. (\u016b)
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBefore(void) {
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *data[] = {
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0101", "\\u00e1", "\\u01ce", "\\u00e0", "A",
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0113", "\\u00e9", "\\u011b", "\\u00e8", "E",
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u012b", "\\u00ed", "\\u01d0", "\\u00ec", "I",
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u014d", "\\u00f3", "\\u01d2", "\\u00f2", "O",
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u016b", "\\u00fa", "\\u01d4", "\\u00f9", "U",
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u01d6", "\\u01d8", "\\u01da", "\\u01dc", "\\u00fc"
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter(
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[before 1]a<\\u0101<\\u00e1<\\u01ce<\\u00e0"
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[before 1]e<\\u0113<\\u00e9<\\u011b<\\u00e8"
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[before 1]i<\\u012b<\\u00ed<\\u01d0<\\u00ec"
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[before 1]o<\\u014d<\\u00f3<\\u01d2<\\u00f2"
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&[before 1]u<\\u016b<\\u00fa<\\u01d4<\\u00f9"
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&u<\\u01d6<\\u01d8<\\u01da<\\u01dc<\\u00fc",
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    data, sizeof(data)/sizeof(data[0]));
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* superceded by TestBeforePinyin */
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ784(void) {
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *data[] = {
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "A", "\\u0101", "\\u00e1", "\\u01ce", "\\u00e0",
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "E", "\\u0113", "\\u00e9", "\\u011b", "\\u00e8",
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "I", "\\u012b", "\\u00ed", "\\u01d0", "\\u00ec",
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "O", "\\u014d", "\\u00f3", "\\u01d2", "\\u00f2",
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "U", "\\u016b", "\\u00fa", "\\u01d4", "\\u00f9",
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u00fc",
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "\\u01d6", "\\u01d8", "\\u01da", "\\u01dc"
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarter("zh", data, sizeof(data)/sizeof(data[0]));
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* superceded by the changes to the lv locale */
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ831(void) {
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *data[] = {
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "I",
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "i",
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Y",
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "y"
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarter("lv", data, sizeof(data)/sizeof(data[0]));
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ815(void) {
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *data[] = {
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "aa",
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Aa",
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "ab",
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Ab",
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "ad",
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Ad",
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "ae",
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Ae",
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u00e6",
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u00c6",
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "af",
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Af",
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "b",
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "B"
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarter("fr", data, sizeof(data)/sizeof(data[0]));
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter("[backwards 2]&A<<\\u00e6/e<<<\\u00c6/E", data, sizeof(data)/sizeof(data[0]));
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& r < c",                                   "& a < b < d& r < c",
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& c < m",                                   "& a < b < c < m < d",
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& a < m",                                   "& a < m < b < c < d",
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a <<< b << c < d& a < m",                                "& a <<< b << c < m < d",
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& [before 1] c < m",                        "& a < b < m < c < d",
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e& [before 3] e <<< x",            "& a < b <<< c << d <<< x <<< e",
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e& [before 2] e <<< x",            "& a < b <<< c <<< x << d <<< e",
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e& [before 1] e <<< x",            "& a <<< x < b <<< c << d <<< e",
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e <<< f < g& [before 1] g < x",    "& a < b <<< c << d <<< e <<< f < x < g",
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRedundantRules(void) {
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i;
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *rules;
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *expectedRules;
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const char *testdata[8];
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uint32_t testdatalen;
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this test conflicts with positioning of CODAN placeholder */
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       /*{
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a <<< b <<< c << d <<< e& [before 1] e <<< x",
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u2089<<<x",
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u2089", "x"}, 2
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       }, */
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this test conflicts with the [before x] syntax tightening */
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /*{
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& b <<< c <<< d << e <<< f& [before 1] f <<< x",
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u0252<<<x",
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"\\u0252", "x"}, 2
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }, */
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this test conflicts with the [before x] syntax tightening */
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /*{
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         "& a < b <<< c << d <<< e& [before 1] e <<< x",
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         "& a <<< x < b <<< c << d <<< e",
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "x", "b", "c", "d", "e"}, 6
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }, */
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < c < d& [before 1] c < m",
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < m < c < d",
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "m", "c", "d"}, 5
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b <<< c << d <<< e& [before 3] e <<< x",
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b <<< c << d <<< x <<< e",
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "c", "d", "x", "e"}, 6
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this test conflicts with the [before x] syntax tightening */
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /* {
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b <<< c << d <<< e& [before 2] e <<< x",
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b <<< c <<< x << d <<< e",
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "c", "x", "d", "e"},, 6
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }, */
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b <<< c << d <<< e <<< f < g& [before 1] g < x",
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b <<< c << d <<< e <<< f < x < g",
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "c", "d", "e", "f", "x", "g"}, 8
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a <<< b << c < d& a < m",
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a <<< b << c < m < d",
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "c", "m", "d"}, 5
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&a<b<<b\\u0301 &z<b",
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&a<b\\u0301 &z<b",
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b\\u0301", "z", "b"}, 4
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z<m<<<q<<<m",
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z<q<<<m",
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"z", "q", "m"},3
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z<<<m<q<<<m",
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z<q<<<m",
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"z", "q", "m"}, 3
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < c < d& r < c",
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < d& r < c",
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "d"}, 3
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < c < d& r < c",
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < d& r < c",
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"r", "c"}, 2
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < c < d& c < m",
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < c < m < d",
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "b", "c", "m", "d"}, 5
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      },
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < b < c < d& a < m",
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "& a < m < b < c < d",
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a", "m", "b", "c", "d"}, 5
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *credundant = NULL;
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *cresulting = NULL;
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar rlz[2048] = { 0 };
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t rlen = 0;
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sizeof(tests)/sizeof(tests[0]); i++) {
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing rule %s, expected to be %s\n", tests[i].rules, tests[i].expectedRules);
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rlen = u_unescape(tests[i].rules, rlz, 2048);
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    credundant = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status);
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening collator\n");
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rlen = u_unescape(tests[i].expectedRules, rlz, 2048);
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cresulting = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status);
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testAgainstUCA(cresulting, credundant, "expected", TRUE, &status);
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(credundant);
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(cresulting);
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing using data\n");
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(tests[i].rules, tests[i].testdata, tests[i].testdatalen);
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExpansionSyntax(void) {
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i;
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *rules[] = {
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&AE <<< a << b <<< c &d <<< f",
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&AE <<< a <<< b << c << d < e < f <<< g",
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&AE <<< B <<< C / D <<< F"
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *expectedRules[] = {
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&A <<< a / E << b / E <<< c /E  &d <<< f",
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&A <<< a / E <<< b / E << c / E << d / E < e < f <<< g",
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&A <<< B / E <<< C / ED <<< F / E"
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static char *testdata[][8] = {
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"AE", "a", "b", "c"},
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"AE", "a", "b", "c", "d", "e", "f", "g"},
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {"AE", "B", "C"} /* / ED <<< F / E"},*/
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const static uint32_t testdatalen[] = {
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      4,
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      8,
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      3
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *credundant = NULL;
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *cresulting = NULL;
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar rlz[2048] = { 0 };
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t rlen = 0;
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sizeof(rules)/sizeof(rules[0]); i++) {
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing rule %s, expected to be %s\n", rules[i], expectedRules[i]);
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rlen = u_unescape(rules[i], rlz, 2048);
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    credundant = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening collator\n");
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rlen = u_unescape(expectedRules[i], rlz, 2048);
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cresulting = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status);
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testAgainstUCA still doesn't handle expansions correctly, so this is not run */
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* as a hard error test, but only in information mode */
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testAgainstUCA(cresulting, credundant, "expected", FALSE, &status);
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(credundant);
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(cresulting);
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("testing using data\n");
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rules[i], testdata[i], testdatalen[i]);
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCase(void)
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UChar gRules[MAX_TOKEN_LEN] =
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*" & 0 < 1,\u2461<a,A"*/
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x0026, 0x0030, 0x003C, 0x0031, 0x002C, 0x2460, 0x003C, 0x0061, 0x002C, 0x0041, 0x0000 };
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UChar testCase[][MAX_TOKEN_LEN] =
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*0*/ {0x0031 /*'1'*/, 0x0061/*'a'*/, 0x0000},
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*1*/ {0x0031 /*'1'*/, 0x0041/*'A'*/, 0x0000},
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*2*/ {0x2460 /*circ'1'*/, 0x0061/*'a'*/, 0x0000},
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*3*/ {0x2460 /*circ'1'*/, 0x0041/*'A'*/, 0x0000}
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UCollationResult caseTestResults[][9] =
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_LESS,    UCOL_LESS, UCOL_LESS,    UCOL_EQUAL, UCOL_LESS,    UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_LESS },
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_GREATER, UCOL_LESS, UCOL_LESS,    UCOL_EQUAL, UCOL_LESS,    UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_GREATER },
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_LESS,    UCOL_LESS, UCOL_LESS,    UCOL_EQUAL, UCOL_GREATER, UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_LESS },
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_GREATER, UCOL_LESS, UCOL_GREATER, UCOL_EQUAL, UCOL_LESS,    UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_GREATER }
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UColAttributeValue caseTestAttributes[][2] =
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_LOWER_FIRST, UCOL_OFF},
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_UPPER_FIRST, UCOL_OFF},
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_LOWER_FIRST, UCOL_ON},
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UCOL_UPPER_FIRST, UCOL_ON}
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i,j,k;
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationElements *iter;
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator  *myCollation;
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myCollation = ucol_open("en_US", &status);
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
215485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing different case settings\n");
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(myCollation, UCOL_TERTIARY);
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(k = 0; k<4; k++) {
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(myCollation, UCOL_CASE_FIRST, caseTestAttributes[k][0], &status);
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, caseTestAttributes[k][1], &status);
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("Case first = %d, Case level = %d\n", caseTestAttributes[k][0], caseTestAttributes[k][1]);
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for (i = 0; i < 3 ; i++) {
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(j = i+1; j<4; j++) {
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          doTest(myCollation, testCase[i], testCase[j], caseTestResults[k][3*i+j-1]);
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(myCollation);
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myCollation = ucol_openRules(gRules, u_strlen(gRules), UCOL_OFF, UCOL_TERTIARY,NULL, &status);
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: in creation of rule based collator: %s\n", myErrorName(status));
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing different case settings with custom rules\n");
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(myCollation, UCOL_TERTIARY);
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(k = 0; k<4; k++) {
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(myCollation, UCOL_CASE_FIRST, caseTestAttributes[k][0], &status);
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, caseTestAttributes[k][1], &status);
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for (i = 0; i < 3 ; i++) {
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(j = i+1; j<4; j++) {
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_verbose("k:%d, i:%d, j:%d\n", k, i, j);
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          doTest(myCollation, testCase[i], testCase[j], caseTestResults[k][3*i+j-1]);
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          iter=ucol_openElements(myCollation, testCase[i], u_strlen(testCase[i]), &status);
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          backAndForth(iter);
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          ucol_closeElements(iter);
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          iter=ucol_openElements(myCollation, testCase[j], u_strlen(testCase[j]), &status);
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          backAndForth(iter);
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          ucol_closeElements(iter);
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(myCollation);
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const static char *lowerFirst[] = {
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "h",
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "H",
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ch",
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Ch",
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CH",
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "cha",
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "chA",
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Cha",
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ChA",
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CHa",
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CHA",
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "i",
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "I"
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      };
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const static char *upperFirst[] = {
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "H",
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "h",
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CH",
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Ch",
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ch",
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CHA",
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CHa",
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ChA",
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Cha",
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "chA",
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "cha",
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "I",
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "i"
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      };
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("mixed case test\n");
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("lower first, case level off\n");
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      genericRulesStarter("[casefirst lower]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0]));
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("upper first, case level off\n");
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      genericRulesStarter("[casefirst upper]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0]));
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("lower first, case level on\n");
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      genericRulesStarter("[casefirst lower][caselevel on]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0]));
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("upper first, case level on\n");
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      genericRulesStarter("[casefirst upper][caselevel on]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0]));
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIncrementalNormalize(void) {
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*UChar baseA     =0x61;*/
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar baseA     =0x41;
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    UChar baseB     = 0x42;*/
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar ccMix[]   = {0x316, 0x321, 0x300};
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*UChar ccMix[]   = {0x61, 0x61, 0x61};*/
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x316 is combining grave accent below, cc=220
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x321 is combining palatalized hook below, cc=202
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x300 is combining grave accent, cc=230
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
225585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define MAXSLEN 2000
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*int          maxSLen   = 64000;*/
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int          sLen;
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int          i;
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator        *coll;
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode       status = U_ZERO_ERROR;
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationResult result;
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226427f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t myQ = getTestOption(QUICK_OPTION);
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(getTestOption(QUICK_OPTION) < 0) {
226727f654740f2a26ad62a5c155af9199af9e69b889claireho        setTestOption(QUICK_OPTION, 1);
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Test 1.  Run very long unnormalized strings, to force overflow of*/
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*          most buffers along the way.*/
227385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar            strA[MAXSLEN+1];
227485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar            strB[MAXSLEN+1];
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll = ucol_open("en_US", &status);
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Is your data around?\n");
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Error opening collator\n");
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*for (sLen = 257; sLen<MAXSLEN; sLen++) {*/
228785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*for (sLen = 4; sLen<MAXSLEN; sLen++) {*/
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for (sLen = 1000; sLen<1001; sLen++) {*/
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (sLen = 500; sLen<501; sLen++) {
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for (sLen = 40000; sLen<65000; sLen+=1000) {*/
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strA[0] = baseA;
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strB[0] = baseA;
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i=1; i<=sLen-1; i++) {
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strA[i] = ccMix[i % 3];
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strB[sLen-i] = ccMix[i % 3];
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strA[sLen]   = 0;
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strB[sLen]   = 0;
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(coll, UCOL_TERTIARY);   /* Do test with default strength, which runs*/
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTest(coll, strA, strB, UCOL_EQUAL);    /*   optimized functions in the impl*/
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(coll, UCOL_IDENTICAL);   /* Do again with the slow, general impl.*/
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTest(coll, strA, strB, UCOL_EQUAL);
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
230727f654740f2a26ad62a5c155af9199af9e69b889claireho    setTestOption(QUICK_OPTION, myQ);
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  Test 2:  Non-normal sequence in a string that extends to the last character*/
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*         of the string.  Checks a couple of edge cases.*/
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0};
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strB[] = {0x41, 0xc0, 0x316, 0};
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(coll, UCOL_TERTIARY);
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, strA, strB, UCOL_EQUAL);
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  Test 3:  Non-normal sequence is terminated by a surrogate pair.*/
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /* New UCA  3.1.1.
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       * test below used a code point from Desseret, which sorts differently
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       * than d800 dc00
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       */
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0xD801, 0xDC00, 0};*/
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0xD800, 0xDC01, 0};
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strB[] = {0x41, 0xc0, 0x316, 0xD800, 0xDC00, 0};
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(coll, UCOL_TERTIARY);
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, strA, strB, UCOL_GREATER);
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  Test 4:  Imbedded nulls do not terminate a string when length is specified.*/
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strA[] = {0x41, 0x00, 0x42, 0x00};
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strB[] = {0x41, 0x00, 0x00, 0x00};
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyA[50];
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyAz[50];
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyB[50];
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyBz[50];
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int   r;
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* there used to be -3 here. Hmmmm.... */
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*result = ucol_strcoll(coll, strA, -3, strB, -3);*/
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, strA, 3, strB, 3);
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != UCOL_GREATER) {
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR 1 in test 4\n");
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, strA, -1, strB, -1);
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != UCOL_EQUAL) {
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR 2 in test 4\n");
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA,  3, (uint8_t *)sortKeyA, sizeof(sortKeyA));
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz));
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB,  3, (uint8_t *)sortKeyB, sizeof(sortKeyB));
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz));
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyAz);
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 3 in test 4\n");
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyB);
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 4 in test 4\n");
2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyAz, sortKeyBz);
2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r != 0) {
2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 5 in test 4\n");
2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(coll, UCOL_IDENTICAL);
2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA,  3, (uint8_t *)sortKeyA, sizeof(sortKeyA));
2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz));
2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB,  3, (uint8_t *)sortKeyB, sizeof(sortKeyB));
2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz));
2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyAz);
2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 6 in test 4\n");
2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyB);
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 7 in test 4\n");
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyAz, sortKeyBz);
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r != 0) {
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 8 in test 4\n");
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(coll, UCOL_TERTIARY);
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  Test 5:  Null characters in non-normal source strings.*/
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0x00, 0x42, 0x00};
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strB[] = {0x41, 0x41, 0x300, 0x316, 0x00, 0x00, 0x00};
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyA[50];
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyAz[50];
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyB[50];
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  sortKeyBz[50];
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int   r;
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, strA, 6, strB, 6);
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != UCOL_GREATER) {
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR 1 in test 5\n");
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, strA, -1, strB, -1);
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != UCOL_EQUAL) {
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR 2 in test 5\n");
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA,  6, (uint8_t *)sortKeyA, sizeof(sortKeyA));
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz));
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB,  6, (uint8_t *)sortKeyB, sizeof(sortKeyB));
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz));
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyAz);
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 3 in test 5\n");
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyB);
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 4 in test 5\n");
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyAz, sortKeyBz);
2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r != 0) {
2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 5 in test 5\n");
2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(coll, UCOL_IDENTICAL);
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA,  6, (uint8_t *)sortKeyA, sizeof(sortKeyA));
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz));
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB,  6, (uint8_t *)sortKeyB, sizeof(sortKeyB));
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz));
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyAz);
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 6 in test 5\n");
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyA, sortKeyB);
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r <= 0) {
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 7 in test 5\n");
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r = strcmp(sortKeyAz, sortKeyBz);
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (r != 0) {
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 8 in test 5\n");
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(coll, UCOL_TERTIARY);
2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  Test 6:  Null character as base of a non-normal combining sequence.*/
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strA[] = {0x41, 0x0, 0x300, 0x316, 0x41, 0x302, 0x00};
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar strB[] = {0x41, 0x0, 0x302, 0x316, 0x41, 0x300, 0x00};
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, strA, 5, strB, 5);
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != UCOL_LESS) {
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 1 in test 6\n");
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, strA, -1, strB, -1);
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != UCOL_EQUAL) {
2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error 2 in test 6\n");
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetCaseBit(void) {
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *caseBitData[] = {
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a", "A", "ch", "Ch", "CH",
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uFF9E", "\\u0009"
2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const uint8_t results[] = {
2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCOL_LOWER_CASE, UCOL_UPPER_CASE, UCOL_LOWER_CASE, UCOL_MIXED_CASE, UCOL_UPPER_CASE,
2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UCOL_UPPER_CASE, UCOL_LOWER_CASE
2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i, blen = 0;
2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar b[256] = {0};
2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *UCA = ucol_open("", &status);
2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint8_t res = 0;
2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<sizeof(results)/sizeof(results[0]); i++) {
2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    blen = u_unescape(caseBitData[i], b, 256);
2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res = ucol_uprv_getCaseBits(UCA, b, blen, &status);
2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(results[i] != res) {
2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Expected case = %02X, got %02X for %04X\n", results[i], res, b[0]);
2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestHangulTailoring(void) {
2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *koreanData[] = {
2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\uac00", "\\u4f3d", "\\u4f73", "\\u5047", "\\u50f9", "\\u52a0", "\\u53ef", "\\u5475",
2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u54e5", "\\u5609", "\\u5ac1", "\\u5bb6", "\\u6687", "\\u67b6", "\\u67b7", "\\u67ef",
2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u6b4c", "\\u73c2", "\\u75c2", "\\u7a3c", "\\u82db", "\\u8304", "\\u8857", "\\u8888",
2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u8a36", "\\u8cc8", "\\u8dcf", "\\u8efb", "\\u8fe6", "\\u99d5",
2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u4EEE", "\\u50A2", "\\u5496", "\\u54FF", "\\u5777", "\\u5B8A", "\\u659D", "\\u698E",
2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u6A9F", "\\u73C8", "\\u7B33", "\\u801E", "\\u8238", "\\u846D", "\\u8B0C"
2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules =
2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\uac00 <<< \\u4f3d <<< \\u4f73 <<< \\u5047 <<< \\u50f9 <<< \\u52a0 <<< \\u53ef <<< \\u5475 "
2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "<<< \\u54e5 <<< \\u5609 <<< \\u5ac1 <<< \\u5bb6 <<< \\u6687 <<< \\u67b6 <<< \\u67b7 <<< \\u67ef "
2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "<<< \\u6b4c <<< \\u73c2 <<< \\u75c2 <<< \\u7a3c <<< \\u82db <<< \\u8304 <<< \\u8857 <<< \\u8888 "
2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "<<< \\u8a36 <<< \\u8cc8 <<< \\u8dcf <<< \\u8efb <<< \\u8fe6 <<< \\u99d5 "
2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "<<< \\u4EEE <<< \\u50A2 <<< \\u5496 <<< \\u54FF <<< \\u5777 <<< \\u5B8A <<< \\u659D <<< \\u698E "
2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "<<< \\u6A9F <<< \\u73C8 <<< \\u7B33 <<< \\u801E <<< \\u8238 <<< \\u846D <<< \\u8B0C";
2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar rlz[2048] = { 0 };
2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t rlen = u_unescape(rules, rlz, 2048);
2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status);
2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(status == U_FILE_ACCESS_ERROR) {
2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_data_err("Is your data around?\n");
2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(U_FAILURE(status)) {
2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Error opening collator\n");
2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Using start of korean rules\n");
2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericOrderingTest(coll, koreanData, sizeof(koreanData)/sizeof(koreanData[0]));
2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Unable to open collator with rules %s\n", rules);
2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Setting jamoSpecial to TRUE and testing once more\n");
2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ((UCATableHeader *)coll->image)->jamoSpecial = TRUE; /* don't try this at home  */
2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericOrderingTest(coll, koreanData, sizeof(koreanData)/sizeof(koreanData[0]));
2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Using ko__LOTUS locale\n");
2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarter("ko__LOTUS", koreanData, sizeof(koreanData)/sizeof(koreanData[0]));
2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompressOverlap(void) {
2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       secstr[150];
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       tertstr[150];
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode  status = U_ZERO_ERROR;
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator  *coll;
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char        result[200];
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t    resultlen;
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int         count = 0;
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char       *tempptr;
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("", &status);
2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
256885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Collator can't be created -> %s\n", u_errorName(status));
2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 149) {
2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        secstr[count] = 0x0020; /* [06, 05, 05] */
2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tertstr[count] = 0x0020;
2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* top down compression ----------------------------------- */
2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    secstr[count] = 0x0332; /* [, 87, 05] */
2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tertstr[count] = 0x3000; /* [06, 05, 07] */
2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* no compression secstr should have 150 secondary bytes, tertstr should
2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    have 150 tertiary bytes.
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    with correct overlapping compression, secstr should have 4 secondary
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bytes, tertstr should have > 2 tertiary bytes */
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlen = ucol_getSortKey(coll, secstr, 150, (uint8_t *)result, 250);
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempptr = uprv_strchr(result, 1) + 1;
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (*(tempptr + 1) != 1) {
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* the last secondary collation element is not checked since it is not
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        part of the compression */
2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*tempptr < UCOL_COMMON_TOP2 - UCOL_TOP_COUNT2) {
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Secondary compression overlapped\n");
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempptr ++;
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* tertiary top/bottom/common for en_US is similar to the secondary
2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    top/bottom/common */
2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlen = ucol_getSortKey(coll, tertstr, 150, (uint8_t *)result, 250);
2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempptr = uprv_strrchr(result, 1) + 1;
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (*(tempptr + 1) != 0) {
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* the last secondary collation element is not checked since it is not
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        part of the compression */
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*tempptr < coll->tertiaryTop - coll->tertiaryTopCount) {
2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Tertiary compression overlapped\n");
2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempptr ++;
2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* bottom up compression ------------------------------------- */
2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    secstr[count] = 0;
2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tertstr[count] = 0;
2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlen = ucol_getSortKey(coll, secstr, 150, (uint8_t *)result, 250);
2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempptr = uprv_strchr(result, 1) + 1;
2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (*(tempptr + 1) != 1) {
2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* the last secondary collation element is not checked since it is not
2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        part of the compression */
2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*tempptr > UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2) {
2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Secondary compression overlapped\n");
2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempptr ++;
2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* tertiary top/bottom/common for en_US is similar to the secondary
2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    top/bottom/common */
2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlen = ucol_getSortKey(coll, tertstr, 150, (uint8_t *)result, 250);
2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempptr = uprv_strrchr(result, 1) + 1;
2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (*(tempptr + 1) != 0) {
2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* the last secondary collation element is not checked since it is not
2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        part of the compression */
2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*tempptr > coll->tertiaryBottom + coll->tertiaryBottomCount) {
2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Tertiary compression overlapped\n");
2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempptr ++;
2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCyrillicTailoring(void) {
2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *test[] = {
2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u0410b",
2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0410\\u0306a",
2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u04d0A"
2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Russian overrides contractions, so this test is not valid anymore */
2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*genericLocaleStarter("ru", test, 3);*/
2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarter("root", test, 3);
2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter("&\\u0410 = \\u0410", test, 3);
2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter("&Z < \\u0410", test, 3);
2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter("&\\u0410 = \\u0410 < \\u04d0", test, 3);
2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter("&Z < \\u0410 < \\u04d0", test, 3);
2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter("&\\u0410 = \\u0410 < \\u0410\\u0301", test, 3);
2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter("&Z < \\u0410 < \\u0410\\u0301", test, 3);
2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSuppressContractions(void) {
2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *testNoCont2[] = {
2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0410\\u0302a",
2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0410\\u0306b",
2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0410c"
2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *testNoCont[] = {
2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "a\\u0410",
2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "A\\u0410\\u0306",
2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uFF21\\u0410\\u0302"
2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter("[suppressContractions [\\u0400-\\u047f]]", testNoCont, 3);
2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter("[suppressContractions [\\u0400-\\u047f]]", testNoCont2, 3);
2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContraction(void) {
2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *testrules[] = {
2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&A = AB / B",
2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&A = A\\u0306/\\u0306",
2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&c = ch / h"
2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UChar testdata[][2] = {
2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0041 /* 'A' */, 0x0042 /* 'B' */},
2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0041 /* 'A' */, 0x0306 /* combining breve */},
2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0063 /* 'c' */, 0x0068 /* 'h' */}
2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UChar testdata2[][2] = {
2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0063 /* 'c' */, 0x0067 /* 'g' */},
2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0063 /* 'c' */, 0x0068 /* 'h' */},
2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0063 /* 'c' */, 0x006C /* 'l' */}
2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *testrules3[] = {
2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z < xyz &xyzw << B",
2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z < xyz &xyz << B / w",
2694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z < ch &achm << B",
2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&z < ch &a << B / chm",
2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\ud800\\udc00w << B",
2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\ud800\\udc00 << B / w",
2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&a\\ud800\\udc00m << B",
2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&a << B / \\ud800\\udc00m",
2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode  status   = U_ZERO_ERROR;
2703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator  *coll;
2704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       rule[256] = {0};
2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t    rlen     = 0;
2706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int         i;
2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < sizeof(testrules) / sizeof(testrules[0]); i ++) {
2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollationElements *iter1;
2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int j = 0;
2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Rule %s for testing\n", testrules[i]);
2712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rlen = u_unescape(testrules[i], rule, 32);
2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status);
2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
271585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "Collator creation failed %s -> %s\n", testrules[i], u_errorName(status));
2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iter1 = ucol_openElements(coll, testdata[i], 2, &status);
2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Collation iterator creation failed\n");
2721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (j < 2) {
2724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UCollationElements *iter2 = ucol_openElements(coll,
2725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &(testdata[i][j]),
2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         1, &status);
2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t ce;
2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Collation iterator creation failed\n");
2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
2731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ce = ucol_next(iter2, &status);
2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            while (ce != UCOL_NULLORDER) {
2734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if ((uint32_t)ucol_next(iter1, &status) != ce) {
2735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Collation elements in contraction split does not match\n");
2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return;
2737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ce = ucol_next(iter2, &status);
2739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            j ++;
2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_closeElements(iter2);
2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ucol_next(iter1, &status) != UCOL_NULLORDER) {
2744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Collation elements not exhausted\n");
2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_closeElements(iter1);
2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
2749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rlen = u_unescape("& a < b < c < ch < d & c = ch / h", rule, 256);
2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status);
2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_strcoll(coll, testdata2[0], 2, testdata2[1], 2) != UCOL_LESS) {
2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected \\u%04x\\u%04x < \\u%04x\\u%04x\n",
2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testdata2[0][0], testdata2[0][1], testdata2[1][0],
2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testdata2[1][1]);
2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ucol_strcoll(coll, testdata2[1], 2, testdata2[2], 2) != UCOL_LESS) {
2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected \\u%04x\\u%04x < \\u%04x\\u%04x\n",
2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testdata2[1][0], testdata2[1][1], testdata2[2][0],
2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testdata2[2][1]);
2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < sizeof(testrules3) / sizeof(testrules3[0]); i += 2) {
2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollator          *coll1,
2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           *coll2;
2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCollationElements *iter1,
2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           *iter2;
2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar               ch = 0x0042 /* 'B' */;
2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t            ce;
2774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rlen = u_unescape(testrules3[i], rule, 32);
2775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll1 = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status);
2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rlen = u_unescape(testrules3[i + 1], rule, 32);
2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll2 = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status);
2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Collator creation failed %s\n", testrules[i]);
2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iter1 = ucol_openElements(coll1, &ch, 1, &status);
2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iter2 = ucol_openElements(coll2, &ch, 1, &status);
2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Collation iterator creation failed\n");
2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ce = ucol_next(iter1, &status);
2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Retrieving ces failed\n");
2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (ce != UCOL_NULLORDER) {
2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ce != (uint32_t)ucol_next(iter2, &status)) {
2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("CEs does not match\n");
2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ce = ucol_next(iter1, &status);
2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Retrieving ces failed\n");
2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ucol_next(iter2, &status) != UCOL_NULLORDER) {
2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("CEs not exhausted\n");
2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_closeElements(iter1);
2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_closeElements(iter2);
2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll1);
2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll2);
2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExpansion(void) {
2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *testrules[] = {
2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&J << K / B & K << M",
2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&J << K / B << M"
2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static UChar testdata[][3] = {
2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x004A /*'J'*/, 0x0041 /*'A'*/, 0},
2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x004D /*'M'*/, 0x0041 /*'A'*/, 0},
2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x004B /*'K'*/, 0x0041 /*'A'*/, 0},
2824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x004B /*'K'*/, 0x0043 /*'C'*/, 0},
2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x004A /*'J'*/, 0x0043 /*'C'*/, 0},
2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x004D /*'M'*/, 0x0043 /*'C'*/, 0}
2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode  status   = U_ZERO_ERROR;
2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator  *coll;
2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       rule[256] = {0};
2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t    rlen     = 0;
2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int         i;
2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < sizeof(testrules) / sizeof(testrules[0]); i ++) {
2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int j = 0;
2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Rule %s for testing\n", testrules[i]);
2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rlen = u_unescape(testrules[i], rule, 32);
2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status);
2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
284185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "Collator creation failed %s -> %s\n", testrules[i], u_errorName(status));
2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j = 0; j < 5; j ++) {
2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTest(coll, testdata[j], testdata[j + 1], UCOL_LESS);
2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* this test tests the current limitations of the engine */
2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* it always fail, so it is disabled by default */
2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLimitations(void) {
2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* recursive expansions */
2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *rule = "&a=b/c&d=c/e";
2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit01[] = {"add","b","adf"};
2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit02[] = {"aa","b","af"};
2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("recursive expansions\n");
2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]));
2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]));
2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* contractions spanning expansions */
2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *rule = "&a<<<c/e&g<<<eh";
2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit01[] = {"ad","c","af","f","ch","h"};
2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit02[] = {"ad","c","ch","af","f","h"};
2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("contractions spanning expansions\n");
2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]));
2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]));
2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* normalization: nulls in contractions */
2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *rule = "&a<<<\\u0000\\u0302";
2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit01[] = {"a","\\u0000\\u0302\\u0327"};
2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit02[] = {"\\u0000\\u0302\\u0327","a"};
2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttribute att[] = { UCOL_DECOMPOSITION_MODE };
2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOn[] = { UCOL_ON };
2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOff[] = { UCOL_OFF };
2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("NULL in contractions\n");
2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOn, 1);
2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOn, 1);
2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOff, 1);
2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOff, 1);
2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* normalization: contractions spanning normalization */
2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *rule = "&a<<<\\u0000\\u0302";
2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit01[] = {"a","\\u0000\\u0302\\u0327"};
2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit02[] = {"\\u0000\\u0302\\u0327","a"};
2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttribute att[] = { UCOL_DECOMPOSITION_MODE };
2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOn[] = { UCOL_ON };
2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOff[] = { UCOL_OFF };
2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("contractions spanning normalization\n");
2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOn, 1);
2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOn, 1);
2902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOff, 1);
2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOff, 1);
2904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* variable top:  */
2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*static const char *rule2 = "&\\u2010<x=[variable top]<z";*/
2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *rule = "&\\u2010<x<[variable top]=z";
2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*static const char *rule3 = "&' '<x<[variable top]=z";*/
2911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit01[] = {" ", "z", "zb", "a", " b", "xb", "b", "c" };
2912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit02[] = {"-", "-x", "x","xb", "-z", "z", "zb", "-a", "a", "-b", "b", "c"};
2913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit03[] = {" ", "xb", "z", "zb", "a", " b", "b", "c" };
2914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttribute att[] = { UCOL_ALTERNATE_HANDLING, UCOL_STRENGTH };
2915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOn[] = { UCOL_SHIFTED, UCOL_QUATERNARY };
2916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOff[] = { UCOL_NON_IGNORABLE, UCOL_TERTIARY };
2917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("variable top\n");
2919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit03, sizeof(tlimit03)/sizeof(tlimit03[0]), att, valOn, sizeof(att)/sizeof(att[0]));
2920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOn, sizeof(att)/sizeof(att[0]));
2921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOn, sizeof(att)/sizeof(att[0]));
2922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOff, sizeof(att)/sizeof(att[0]));
2923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOff, sizeof(att)/sizeof(att[0]));
2924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* case level */
2927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
2928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *rule = "&c<ch<<<cH<<<Ch<<<CH";
2929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit01[] = {"c","CH","Ch","cH","ch"};
2930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *tlimit02[] = {"c","CH","cH","Ch","ch"};
2931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttribute att[] = { UCOL_CASE_FIRST};
2932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UColAttributeValue valOn[] = { UCOL_UPPER_FIRST};
2933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*static const UColAttributeValue valOff[] = { UCOL_OFF};*/
2934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("case level\n");
2935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOn, sizeof(att)/sizeof(att[0]));
2936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOn, sizeof(att)/sizeof(att[0]));
2937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOff, sizeof(att)/sizeof(att[0]));*/
2938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOff, sizeof(att)/sizeof(att[0]));*/
2939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBocsuCoverage(void) {
2945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *testString = "\\u0041\\u0441\\u4441\\U00044441\\u4441\\u0441\\u0041";
2947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar       test[256] = {0};
2948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t    tlen     = u_unescape(testString, test, 32);
2949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint8_t key[256]     = {0};
2950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t klen         = 0;
2951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
2953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
2954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_IDENTICAL, &status);
2955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  klen = ucol_getSortKey(coll, test, tlen, key, 256);
2957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
2959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
2960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_data_err("Couldn't open UCA\n");
2961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariableTopSetting(void) {
2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar *current = NULL;
2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t varTopOriginal = 0, varTop1, varTop2;
2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t strength = 0;
2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint16_t specs = 0;
2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t chOffset = 0;
2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t chLen = 0;
2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t exOffset = 0;
2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t exLen = 0;
2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t oldChOffset = 0;
2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t oldChLen = 0;
2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t oldExOffset = 0;
2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t oldExLen = 0;
2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t prefixOffset = 0;
2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t prefixLen = 0;
2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UBool startOfRules = TRUE;
2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColTokenParser src;
2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColOptionSet opts;
2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *rulesCopy = NULL;
2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t rulesLen;
2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollationResult result;
2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar first[256] = { 0 };
2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar second[256] = { 0 };
2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UParseError parseError;
299627f654740f2a26ad62a5c155af9199af9e69b889claireho  int32_t myQ = getTestOption(QUICK_OPTION);
299727f654740f2a26ad62a5c155af9199af9e69b889claireho
299827f654740f2a26ad62a5c155af9199af9e69b889claireho  uprv_memset(&src, 0, sizeof(UColTokenParser));
2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  src.opts = &opts;
3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
300227f654740f2a26ad62a5c155af9199af9e69b889claireho  if(getTestOption(QUICK_OPTION) <= 0) {
300327f654740f2a26ad62a5c155af9199af9e69b889claireho    setTestOption(QUICK_OPTION, 1);
3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* this test will fail when normalization is turned on */
3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* therefore we always turn off exhaustive mode for it */
3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { /* QUICK > 0*/
3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Slide variable top over UCARules\n");
3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, 0);
301127f654740f2a26ad62a5c155af9199af9e69b889claireho    rulesCopy = (UChar *)uprv_malloc((rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE);
3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status) && rulesLen > 0) {
3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      src.current = src.source = rulesCopy;
3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      src.end = rulesCopy+rulesLen;
3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      src.extraCurrent = src.end;
3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
302127f654740f2a26ad62a5c155af9199af9e69b889claireho	  /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
302227f654740f2a26ad62a5c155af9199af9e69b889claireho	   the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,&status)) != NULL) {
3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strength = src.parsedToken.strength;
3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        chOffset = src.parsedToken.charsOffset;
3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        chLen = src.parsedToken.charsLen;
3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        exOffset = src.parsedToken.extensionOffset;
3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        exLen = src.parsedToken.extensionLen;
3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        prefixOffset = src.parsedToken.prefixOffset;
3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        prefixLen = src.parsedToken.prefixLen;
3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        specs = src.parsedToken.flags;
3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        startOfRules = FALSE;
3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
303527f654740f2a26ad62a5c155af9199af9e69b889claireho          log_verbose("%04X %d ", *(src.source+chOffset), chLen);
3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strength == UCOL_PRIMARY) {
3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          status = U_ZERO_ERROR;
3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          varTopOriginal = ucol_getVariableTop(coll, &status);
304027f654740f2a26ad62a5c155af9199af9e69b889claireho          varTop1 = ucol_setVariableTop(coll, src.source+oldChOffset, oldChLen, &status);
3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          if(U_FAILURE(status)) {
3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char buffer[256];
3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *buf = buffer;
3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t i = 0, j;
3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t CE = UCOL_NO_MORE_CES;
3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* before we start screaming, let's see if there is a problem with the rules */
304850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            UErrorCode collIterateStatus = U_ZERO_ERROR;
304950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            collIterate *s = uprv_new_collIterate(&collIterateStatus);
305027f654740f2a26ad62a5c155af9199af9e69b889claireho            uprv_init_collIterate(coll, src.source+oldChOffset, oldChLen, s, &collIterateStatus);
3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
305250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            CE = ucol_getNextCE(coll, s, &status);
3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(i = 0; i < oldChLen; i++) {
305527f654740f2a26ad62a5c155af9199af9e69b889claireho              j = sprintf(buf, "%04X ", *(src.source+oldChOffset+i));
3056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              buf += j;
3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(status == U_PRIMARY_TOO_LONG_ERROR) {
3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              log_verbose("= Expected failure for %s =", buffer);
3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
306150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              if(uprv_collIterateAtEnd(s)) {
3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Unexpected failure setting variable top at offset %d. Error %s. Codepoints: %s\n",
3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  oldChOffset, u_errorName(status), buffer);
3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              } else {
3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("There is a goofy contraction in UCA rules that does not appear in the fractional UCA. Codepoints: %s\n",
3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  buffer);
3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              }
3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
306950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            uprv_delete_collIterate(s);
3070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
3071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          varTop2 = ucol_getVariableTop(coll, &status);
3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          if((varTop1 & 0xFFFF0000) != (varTop2 & 0xFFFF0000)) {
3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("cannot retrieve set varTop value!\n");
3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          if((varTop1 & 0xFFFF0000) > 0 && oldExLen == 0) {
3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307927f654740f2a26ad62a5c155af9199af9e69b889claireho            u_strncpy(first, src.source+oldChOffset, oldChLen);
308027f654740f2a26ad62a5c155af9199af9e69b889claireho            u_strncpy(first+oldChLen, src.source+chOffset, chLen);
308127f654740f2a26ad62a5c155af9199af9e69b889claireho            u_strncpy(first+oldChLen+chLen, src.source+oldChOffset, oldChLen);
3082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            first[2*oldChLen+chLen] = 0;
3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(oldExLen == 0) {
308527f654740f2a26ad62a5c155af9199af9e69b889claireho              u_strncpy(second, src.source+chOffset, chLen);
3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              second[chLen] = 0;
3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else { /* This is skipped momentarily, but should work once UCARules are fully UCA conformant */
308827f654740f2a26ad62a5c155af9199af9e69b889claireho              u_strncpy(second, src.source+oldExOffset, oldExLen);
308927f654740f2a26ad62a5c155af9199af9e69b889claireho              u_strncpy(second+oldChLen, src.source+chOffset, chLen);
309027f654740f2a26ad62a5c155af9199af9e69b889claireho              u_strncpy(second+oldChLen+chLen, src.source+oldExOffset, oldExLen);
3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              second[2*oldExLen+chLen] = 0;
3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result = ucol_strcoll(coll, first, -1, second, -1);
3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(result == UCOL_EQUAL) {
3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              doTest(coll, first, second, UCOL_EQUAL);
3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
309727f654740f2a26ad62a5c155af9199af9e69b889claireho              log_verbose("Suspicious strcoll result for %04X and %04X\n", *(src.source+oldChOffset), *(src.source+chOffset));
3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strength != UCOL_TOK_RESET) {
3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          oldChOffset = chOffset;
3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          oldChLen = chLen;
3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          oldExOffset = exOffset;
3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          oldExLen = exLen;
3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      status = U_ZERO_ERROR;
3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Unexpected failure getting rules %s\n", u_errorName(status));
3112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
3115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error parsing rules %s\n", u_errorName(status));
3116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312127f654740f2a26ad62a5c155af9199af9e69b889claireho  setTestOption(QUICK_OPTION, myQ);
3122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Testing setting variable top to contractions\n");
3124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
3125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *conts = (UChar *)((uint8_t *)coll->image + coll->image->contractionUCACombos);
3126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t maxUCAContractionLength = coll->image->contractionUCACombosWidth;
3127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(*conts != 0) {
3128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      /*
3129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius       * A continuation is NUL-terminated and NUL-padded
3130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius       * except if it has the maximum length.
3131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius       */
3132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      int32_t contractionLength = maxUCAContractionLength;
3133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      while(contractionLength > 0 && conts[contractionLength - 1] == 0) {
3134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        --contractionLength;
3135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      }
3136103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      if(*(conts+1)==0) { /* pre-context */
3137103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        varTop1 = ucol_setVariableTop(coll, conts, 1, &status);
3138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
3139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        varTop1 = ucol_setVariableTop(coll, conts, contractionLength, &status);
3140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
3141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_FAILURE(status)) {
314227f654740f2a26ad62a5c155af9199af9e69b889claireho        if(status == U_PRIMARY_TOO_LONG_ERROR) {
314327f654740f2a26ad62a5c155af9199af9e69b889claireho          /* ucol_setVariableTop() is documented to not accept 3-byte primaries,
314427f654740f2a26ad62a5c155af9199af9e69b889claireho           * therefore it is not an error when it complains about them. */
314527f654740f2a26ad62a5c155af9199af9e69b889claireho          log_verbose("Couldn't set variable top to a contraction %04X %04X %04X - U_PRIMARY_TOO_LONG_ERROR\n",
314627f654740f2a26ad62a5c155af9199af9e69b889claireho                      *conts, *(conts+1), *(conts+2));
314727f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
314827f654740f2a26ad62a5c155af9199af9e69b889claireho          log_err("Couldn't set variable top to a contraction %04X %04X %04X - %s\n",
314927f654740f2a26ad62a5c155af9199af9e69b889claireho                  *conts, *(conts+1), *(conts+2), u_errorName(status));
315027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
3151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
3152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
3153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      conts+=maxUCAContractionLength;
3154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    first[0] = 0x0040;
3159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    first[1] = 0x0050;
3160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    first[2] = 0x0000;
3161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setVariableTop(coll, first, -1, &status);
3163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
3165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Invalid contraction succeded in setting variable top!\n");
3166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Test restoring variable top\n");
3171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_ZERO_ERROR;
3173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_restoreVariableTop(coll, varTopOriginal, &status);
3174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(varTopOriginal != ucol_getVariableTop(coll, &status)) {
3175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Couldn't restore old variable top\n");
3176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Testing calling with error set\n");
3179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_INTERNAL_PROGRAM_ERROR;
3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  varTop1 = ucol_setVariableTop(coll, first, 1, &status);
3182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  varTop2 = ucol_getVariableTop(coll, &status);
3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_restoreVariableTop(coll, varTop2, &status);
3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  varTop1 = ucol_setVariableTop(NULL, first, 1, &status);
3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  varTop2 = ucol_getVariableTop(NULL, &status);
3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_restoreVariableTop(NULL, varTop2, &status);
3187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(status != U_INTERNAL_PROGRAM_ERROR) {
3188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Bad reaction to passed error!\n");
3189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
319027f654740f2a26ad62a5c155af9199af9e69b889claireho  uprv_free(src.source);
3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
3193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_data_err("Couldn't open UCA collator\n");
3194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNonChars(void) {
3199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *test[] = {
320027f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\u0000",  /* ignorable */
320127f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\uFFFE",  /* special merge-sort character with minimum non-ignorable weights */
320227f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\uFDD0", "\\uFDEF",
320327f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\U0001FFFE", "\\U0001FFFF",  /* UCA 6.0: noncharacters are treated like unassigned, */
320427f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\U0002FFFE", "\\U0002FFFF",  /* not like ignorable. */
3205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0003FFFE", "\\U0003FFFF",
3206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0004FFFE", "\\U0004FFFF",
3207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0005FFFE", "\\U0005FFFF",
3208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0006FFFE", "\\U0006FFFF",
3209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0007FFFE", "\\U0007FFFF",
3210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0008FFFE", "\\U0008FFFF",
3211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U0009FFFE", "\\U0009FFFF",
3212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U000AFFFE", "\\U000AFFFF",
3213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U000BFFFE", "\\U000BFFFF",
3214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U000CFFFE", "\\U000CFFFF",
3215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U000DFFFE", "\\U000DFFFF",
3216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U000EFFFE", "\\U000EFFFF",
3217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\U000FFFFE", "\\U000FFFFF",
321827f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\U0010FFFE", "\\U0010FFFF",
321927f654740f2a26ad62a5c155af9199af9e69b889claireho      "\\uFFFF"  /* special character with maximum primary weight */
3220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
3222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("en_US", &status);
3223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  log_verbose("Test non characters\n");
3225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
322727f654740f2a26ad62a5c155af9199af9e69b889claireho    genericOrderingTestWithResult(coll, test, 35, UCOL_LESS);
3228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
322985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_err_status(status, "Unable to open collator\n");
3230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
3233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExtremeCompression(void) {
3236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static char *test[4];
3237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t j = 0, i = 0;
3238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<4; i++) {
3240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test[i] = (char *)malloc(2048*sizeof(char));
3241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(j = 20; j < 500; j++) {
3244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<4; i++) {
3245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_memset(test[i], 'a', (j-1)*sizeof(char));
3246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test[i][j-1] = (char)('a'+i);
3247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test[i][j] = 0;
3248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarter("en_US", (const char **)test, 4);
3250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<4; i++) {
3254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test[i]);
3255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
3259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExtremeCompression(void) {
3260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static char *test[4];
3261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t j = 0, i = 0;
3262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
3263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("en_US", status);
3264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<4; i++) {
3265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test[i] = (char *)malloc(2048*sizeof(char));
3266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(j = 10; j < 2048; j++) {
3268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<4; i++) {
3269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_memset(test[i], 'a', (j-2)*sizeof(char));
3270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test[i][j-1] = (char)('a'+i);
3271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test[i][j] = 0;
3272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarter("en_US", (const char **)test, 4);
3275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(j = 10; j < 2048; j++) {
3277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<1; i++) {
3278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_memset(test[i], 'a', (j-1)*sizeof(char));
3279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      test[i][j] = 0;
3280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<4; i++) {
3283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(test[i]);
3284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSurrogates(void) {
3289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *test[] = {
3290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "z","\\ud900\\udc25",  "\\ud805\\udc50",
3291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "\\ud800\\udc00y",  "\\ud800\\udc00r",
3292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "\\ud800\\udc00f",  "\\ud800\\udc00",
3293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "\\ud800\\udc00c", "\\ud800\\udc00b",
3294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "\\ud800\\udc00fa", "\\ud800\\udc00fb",
3295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "\\ud800\\udc00a",
3296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "c", "b"
3297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *rule =
3300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&z < \\ud900\\udc25   < \\ud805\\udc50"
3301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "< \\ud800\\udc00y  < \\ud800\\udc00r"
3302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "< \\ud800\\udc00f  << \\ud800\\udc00"
3303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "< \\ud800\\udc00fa << \\ud800\\udc00fb"
3304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "< \\ud800\\udc00a  < c < b" ;
3305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter(rule, test, 14);
3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is a test for prefix implementation, used by JIS X 4061 collation rules */
3310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPrefix(void) {
3311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i;
3312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
3314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
3315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *data[50];
3316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint32_t len;
3317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
3318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&z <<< z|a",
3319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {"zz", "za"}, 2 },
3320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&z <<< z|   a",
3322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {"zz", "za"}, 2 },
3323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "[strength I]"
3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&a=\\ud900\\udc25"
3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&z<<<\\ud900\\udc25|a",
3326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {"aa", "az", "\\ud900\\udc25z", "\\ud900\\udc25a", "zz"}, 4 },
3327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) {
3331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len);
3332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This test uses data suplied by Masashiko Maedera to test the implementation */
3336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* JIS X 4061 collation order implementation                                   */
3337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNewJapanese(void) {
3338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char * const test1[] = {
3340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30b7\\u30e3\\u30fc\\u30ec",
3341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30b7\\u30e3\\u30a4",
3342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30b7\\u30e4\\u30a3",
3343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30b7\\u30e3\\u30ec",
3344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3061\\u3087\\u3053",
3345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3061\\u3088\\u3053",
3346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c1\\u30e7\\u30b3\\u30ec\\u30fc\\u30c8",
3347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3066\\u30fc\\u305f",
3348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30fc\\u30bf",
3349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30a7\\u30bf",
3350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3066\\u3048\\u305f",
3351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3067\\u30fc\\u305f",
3352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c7\\u30fc\\u30bf",
3353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c7\\u30a7\\u30bf",
3354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3067\\u3048\\u305f",
3355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3066\\u30fc\\u305f\\u30fc",
3356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30fc\\u30bf\\u30a1",
3357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30a7\\u30bf\\u30fc",
3358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3066\\u3047\\u305f\\u3041",
3359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3066\\u3048\\u305f\\u30fc",
3360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3067\\u30fc\\u305f\\u30fc",
3361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c7\\u30fc\\u30bf\\u30a1",
3362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3067\\u30a7\\u305f\\u30a1",
3363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c7\\u3047\\u30bf\\u3041",
3364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c7\\u30a8\\u30bf\\u30a2",
3365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3072\\u3086",
3366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3073\\u3085\\u3042",
3367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3074\\u3085\\u3042",
3368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3073\\u3085\\u3042\\u30fc",
3369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d3\\u30e5\\u30a2\\u30fc",
3370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3074\\u3085\\u3042\\u30fc",
3371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d4\\u30e5\\u30a2\\u30fc",
3372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d2\\u30e5\\u30a6",
3373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d2\\u30e6\\u30a6",
3374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d4\\u30e5\\u30a6\\u30a2",
3375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3073\\u3085\\u30fc\\u3042\\u30fc",
3376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d3\\u30e5\\u30fc\\u30a2\\u30fc",
3377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d3\\u30e5\\u30a6\\u30a2\\u30fc",
3378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3072\\u3085\\u3093",
3379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3074\\u3085\\u3093",
3380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u30fc\\u308a",
3381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d5\\u30fc\\u30ea",
3382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u3045\\u308a",
3383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u30a5\\u308a",
3384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u30a5\\u30ea",
3385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d5\\u30a6\\u30ea",
3386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u30fc\\u308a",
3387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d6\\u30fc\\u30ea",
3388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u3045\\u308a",
3389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d6\\u30a5\\u308a",
3390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3077\\u3046\\u308a",
3391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d7\\u30a6\\u30ea",
3392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u30fc\\u308a\\u30fc",
3393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d5\\u30a5\\u30ea\\u30fc",
3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u30a5\\u308a\\u30a3",
3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d5\\u3045\\u308a\\u3043",
3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d5\\u30a6\\u30ea\\u30fc",
3397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u3046\\u308a\\u3043",
3398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d6\\u30a6\\u30ea\\u30a4",
3399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3077\\u30fc\\u308a\\u30fc",
3400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3077\\u30a5\\u308a\\u30a4",
3401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3077\\u3046\\u308a\\u30fc",
3402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d7\\u30a6\\u30ea\\u30a4",
3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d5\\u30fd",
3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3075\\u309e",
3405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u309d",
3406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u3075",
3407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u30d5",
3408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d6\\u3075",
3409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d6\\u30d5",
3410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u309e",
3411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3076\\u3077",
3412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d6\\u3077",
3413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3077\\u309d",
3414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30d7\\u30fd",
3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u3077\\u3075",
3416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *test2[] = {
3419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u306f\\u309d", /* H\\u309d */
3420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30cf\\u30fd", /* K\\u30fd */
3421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u306f\\u306f", /* HH */
3422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u306f\\u30cf", /* HK */
3423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30cf\\u30cf", /* KK */
3424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u306f\\u309e", /* H\\u309e */
3425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30cf\\u30fe", /* K\\u30fe */
3426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u306f\\u3070", /* HH\\u309b */
3427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30cf\\u30d0", /* KK\\u309b */
3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u306f\\u3071", /* HH\\u309c */
3429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30cf\\u3071", /* KH\\u309c */
3430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30cf\\u30d1", /* KK\\u309c */
3431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3070\\u309d", /* H\\u309b\\u309d */
3432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d0\\u30fd", /* K\\u309b\\u30fd */
3433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3070\\u306f", /* H\\u309bH */
3434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d0\\u30cf", /* K\\u309bK */
3435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3070\\u309e", /* H\\u309b\\u309e */
3436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d0\\u30fe", /* K\\u309b\\u30fe */
3437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3070\\u3070", /* H\\u309bH\\u309b */
3438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d0\\u3070", /* K\\u309bH\\u309b */
3439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d0\\u30d0", /* K\\u309bK\\u309b */
3440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3070\\u3071", /* H\\u309bH\\u309c */
3441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d0\\u30d1", /* K\\u309bK\\u309c */
3442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3071\\u309d", /* H\\u309c\\u309d */
3443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d1\\u30fd", /* K\\u309c\\u30fd */
3444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3071\\u306f", /* H\\u309cH */
3445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d1\\u30cf", /* K\\u309cK */
3446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3071\\u3070", /* H\\u309cH\\u309b */
3447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3071\\u30d0", /* H\\u309cK\\u309b */
3448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d1\\u30d0", /* K\\u309cK\\u309b */
3449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u3071\\u3071", /* H\\u309cH\\u309c */
3450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30d1\\u30d1", /* K\\u309cK\\u309c */
3451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*
3453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *test3[] = {
3454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u221er\\u221e",
3455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u221eR#",
3456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u221et\\u221e",
3457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "#r\\u221e",
3458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "#R#",
3459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "#t%",
3460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "#T%",
3461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8t\\u221e",
3462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8T\\u221e",
3463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8t#",
3464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8T#",
3465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8t%",
3466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8T%",
3467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8t8",
3468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8T8",
3469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u03c9r\\u221e",
3470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u03a9R%",
3471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "rr\\u221e",
3472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "rR\\u221e",
3473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Rr\\u221e",
3474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "RR\\u221e",
3475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "RT%",
3476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "rt8",
3477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "tr\\u221e",
3478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "tr8",
3479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "TR8",
3480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "tt8",
3481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u30b7\\u30e3\\u30fc\\u30ec",
3482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  */
3484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UColAttribute att[] = { UCOL_STRENGTH };
3485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UColAttributeValue val[] = { UCOL_QUATERNARY };
3486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UColAttribute attShifted[] = { UCOL_STRENGTH, UCOL_ALTERNATE_HANDLING};
3488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UColAttributeValue valShifted[] = { UCOL_QUATERNARY, UCOL_SHIFTED };
3489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptions("ja", test1, sizeof(test1)/sizeof(test1[0]), att, val, 1);
3491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptions("ja", test2, sizeof(test2)/sizeof(test2[0]), att, val, 1);
3492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*genericLocaleStarter("ja", test3, sizeof(test3)/sizeof(test3[0]));*/
3493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptions("ja", test1, sizeof(test1)/sizeof(test1[0]), attShifted, valShifted, 2);
3494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptions("ja", test2, sizeof(test2)/sizeof(test2[0]), attShifted, valShifted, 2);
3495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStrCollIdenticalPrefix(void) {
3498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* rule = "&\\ud9b0\\udc70=\\ud9b0\\udc71";
3499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* test[] = {
3500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "ab\\ud9b0\\udc70",
3501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "ab\\ud9b0\\udc71"
3502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarterWithResult(rule, test, sizeof(test)/sizeof(test[0]), UCOL_EQUAL);
3504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Contractions should have all their canonically equivalent */
3506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* strings included */
3507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContractionClosure(void) {
3508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
3509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
3510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *data[10];
3511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint32_t len;
3512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
3513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "&b=\\u00e4\\u00e4",
3514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      { "b", "\\u00e4\\u00e4", "a\\u0308a\\u0308", "\\u00e4a\\u0308", "a\\u0308\\u00e4" }, 5},
3515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "&b=\\u00C5",
3516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      { "b", "\\u00C5", "A\\u030A", "\\u212B" }, 4},
3517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i;
3519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) {
3522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarterWithResult(tests[i].rules, tests[i].data, tests[i].len, UCOL_EQUAL);
3523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This tests also fails*/
3527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBeforePrefixFailure(void) {
3528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
3529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
3530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *data[10];
3531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint32_t len;
3532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
3533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&g <<< a"
3534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[before 3]\\uff41 <<< x",
3535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {"x", "\\uff41"}, 2 },
3536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "&\\u30A7=\\u30A7=\\u3047=\\uff6a"
3537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A8=\\u30A8=\\u3048=\\uff74"
3538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 3]\\u30a7<<<\\u30a9",
3539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {"\\u30a9", "\\u30a7"}, 2 },
3540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   "&[before 3]\\u30a7<<<\\u30a9"
3541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A7=\\u30A7=\\u3047=\\uff6a"
3542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A8=\\u30A8=\\u3048=\\uff74",
3543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {"\\u30a9", "\\u30a7"}, 2 },
3544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i;
3546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) {
3549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len);
3550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
3553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* rule1 =
3554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A7=\\u30A7=\\u3047=\\uff6a"
3555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A8=\\u30A8=\\u3048=\\uff74"
3556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 3]\\u30a7<<<\\u30c6|\\u30fc";
3557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* rule2 =
3558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 3]\\u30a7<<<\\u30c6|\\u30fc"
3559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A7=\\u30A7=\\u3047=\\uff6a"
3560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30A8=\\u30A8=\\u3048=\\uff74";
3561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* test[] = {
3562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30fc\\u30bf",
3563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30a7\\u30bf",
3564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter(rule1, test, sizeof(test)/sizeof(test[0]));
3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarter(rule2, test, sizeof(test)/sizeof(test[0]));
3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* this piece of code should be in some sort of verbose mode     */
3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* it gets the collation elements for elements and prints them   */
3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is useful when trying to see whether the problem is      */
3570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t i = 0;
3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationElements *it = NULL;
3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t CE;
3575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar string[256];
3576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t uStringLen;
3577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
3578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uStringLen = u_unescape(rule1, string, 256);
3580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(string, uStringLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*coll = ucol_open("ja_JP_JIS", &status);*/
3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    it = ucol_openElements(coll, string, 0, &status);
3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(test)/sizeof(test[0]); i++) {
3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("%s\n", test[i]);
3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uStringLen = u_unescape(test[i], string, 256);
3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucol_setText(it, string, uStringLen, &status);
3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      while((CE=ucol_next(it, &status)) != UCOL_NULLORDER) {
3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%08X\n", CE);
3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("\n");
3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_closeElements(it);
3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPrefixCompose(void) {
3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* rule1 =
3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&\\u30a7<<<\\u30ab|\\u30fc=\\u30ac|\\u30fc";
3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*
3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* test[] = {
3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30fc\\u30bf",
3610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u30c6\\u30a7\\u30bf",
3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  */
3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*uint32_t i = 0;*/
3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*UCollationElements *it = NULL;*/
3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    uint32_t CE;*/
3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar string[256];
3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t uStringLen;
3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uStringLen = u_unescape(rule1, string, 256);
3623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(string, uStringLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
3625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last variable] last variable value
3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last primary ignorable] largest CE for primary ignorable
3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last secondary ignorable] largest CE for secondary ignorable
3635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last tertiary ignorable] largest CE for tertiary ignorable
3636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8)
3637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRuleOptions(void) {
3640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* values here are hardcoded and are correct for the current UCA
3641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   * when the UCA changes, one might be forced to change these
364227f654740f2a26ad62a5c155af9199af9e69b889claireho   * values.
364327f654740f2a26ad62a5c155af9199af9e69b889claireho   */
364427f654740f2a26ad62a5c155af9199af9e69b889claireho
364527f654740f2a26ad62a5c155af9199af9e69b889claireho  /*
364627f654740f2a26ad62a5c155af9199af9e69b889claireho   * These strings contain the last character before [variable top]
364727f654740f2a26ad62a5c155af9199af9e69b889claireho   * and the first and second characters (by primary weights) after it.
364827f654740f2a26ad62a5c155af9199af9e69b889claireho   * See FractionalUCA.txt. For example:
364927f654740f2a26ad62a5c155af9199af9e69b889claireho      [last variable [0C FE, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR
365027f654740f2a26ad62a5c155af9199af9e69b889claireho      [variable top = 0C FE]
365127f654740f2a26ad62a5c155af9199af9e69b889claireho      [first regular [0D 0A, 05, 05]] # U+0060 GRAVE ACCENT
365227f654740f2a26ad62a5c155af9199af9e69b889claireho     and
365327f654740f2a26ad62a5c155af9199af9e69b889claireho      00B4; [0D 0C, 05, 05]
365427f654740f2a26ad62a5c155af9199af9e69b889claireho   *
365527f654740f2a26ad62a5c155af9199af9e69b889claireho   * Note: Starting with UCA 6.0, the [variable top] collation element
365627f654740f2a26ad62a5c155af9199af9e69b889claireho   * is not the weight of any character or string,
365727f654740f2a26ad62a5c155af9199af9e69b889claireho   * which means that LAST_VARIABLE_CHAR_STRING sorts before [last variable].
365827f654740f2a26ad62a5c155af9199af9e69b889claireho   */
365927f654740f2a26ad62a5c155af9199af9e69b889claireho#define LAST_VARIABLE_CHAR_STRING "\\U00010A7F"
366027f654740f2a26ad62a5c155af9199af9e69b889claireho#define FIRST_REGULAR_CHAR_STRING "\\u0060"
366127f654740f2a26ad62a5c155af9199af9e69b889claireho#define SECOND_REGULAR_CHAR_STRING "\\u00B4"
366227f654740f2a26ad62a5c155af9199af9e69b889claireho
366327f654740f2a26ad62a5c155af9199af9e69b889claireho  /*
366427f654740f2a26ad62a5c155af9199af9e69b889claireho   * This string has to match the character that has the [last regular] weight
366527f654740f2a26ad62a5c155af9199af9e69b889claireho   * which changes with each UCA version.
366627f654740f2a26ad62a5c155af9199af9e69b889claireho   * See the bottom of FractionalUCA.txt which says something like
366727f654740f2a26ad62a5c155af9199af9e69b889claireho      [last regular [7A FE, 05, 05]] # U+1342E EGYPTIAN HIEROGLYPH AA032
366827f654740f2a26ad62a5c155af9199af9e69b889claireho   *
366927f654740f2a26ad62a5c155af9199af9e69b889claireho   * Note: Starting with UCA 6.0, the [last regular] collation element
367027f654740f2a26ad62a5c155af9199af9e69b889claireho   * is not the weight of any character or string,
367127f654740f2a26ad62a5c155af9199af9e69b889claireho   * which means that LAST_REGULAR_CHAR_STRING sorts before [last regular].
3672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   */
367327f654740f2a26ad62a5c155af9199af9e69b889claireho#define LAST_REGULAR_CHAR_STRING "\\U0001342E"
367427f654740f2a26ad62a5c155af9199af9e69b889claireho
3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
3677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *data[10];
3678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint32_t len;
3679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
3680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* - all befores here amount to zero */
3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][first tertiary ignorable]<<<a",
3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "\\u0000", "a"}, 2
3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, /* you cannot go before first tertiary ignorable */
3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][last tertiary ignorable]<<<a",
3686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "\\u0000", "a"}, 2
3687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, /* you cannot go before last tertiary ignorable */
3688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][first secondary ignorable]<<<a",
3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "\\u0000", "a"}, 2
3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, /* you cannot go before first secondary ignorable */
3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][last secondary ignorable]<<<a",
3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "\\u0000", "a"}, 2
3695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, /* you cannot go before first secondary ignorable */
3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 'normal' befores */
3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][first primary ignorable]<<<c<<<b &[first primary ignorable]<a",
3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {  "c", "b", "\\u0332", "a" }, 4
3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* we don't have a code point that corresponds to
3704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the last primary ignorable
3705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][last primary ignorable]<<<c<<<b &[last primary ignorable]<a",
3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {  "\\u0332", "\\u20e3", "c", "b", "a" }, 5
3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 3][first variable]<<<c<<<b &[first variable]<a",
3711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {  "c", "b", "\\u0009", "a", "\\u000a" }, 5
3712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[last variable]<a &[before 3][last variable]<<<c<<<b ",
371527f654740f2a26ad62a5c155af9199af9e69b889claireho        { LAST_VARIABLE_CHAR_STRING, "c", "b", /* [last variable] */ "a", FIRST_REGULAR_CHAR_STRING }, 5
3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[first regular]<a"
3719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[before 1][first regular]<b",
372027f654740f2a26ad62a5c155af9199af9e69b889claireho      { "b", FIRST_REGULAR_CHAR_STRING, "a", SECOND_REGULAR_CHAR_STRING }, 4
3721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 1][last regular]<b"
3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[last regular]<a",
372527f654740f2a26ad62a5c155af9199af9e69b889claireho        { LAST_REGULAR_CHAR_STRING, "b", /* [last regular] */ "a", "\\u4e00" }, 4
3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 1][first implicit]<b"
3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[first implicit]<a",
3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "b", "\\u4e00", "a", "\\u4e01"}, 4
3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[before 1][last implicit]<b"
3734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[last implicit]<a",
3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "b", "\\U0010FFFD", "a" }, 3
3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "&[last variable]<z"
3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[last primary ignorable]<x"
3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[last secondary ignorable]<<y"
3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[last tertiary ignorable]<<<w"
3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "&[top]<u",
374327f654740f2a26ad62a5c155af9199af9e69b889claireho      {"\\ufffb",  "w", "y", "\\u20e3", "x", LAST_VARIABLE_CHAR_STRING, "z", "u"}, 7
3744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i;
3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) {
3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len);
3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOptimize(void) {
3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* this is not really a test - just trying out
3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   * whether copying of UCA contents will fail
3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   * Cannot really test, since the functionality
3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   * remains the same.
3760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   */
3761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const struct {
3762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *rules;
3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *data[10];
3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint32_t len;
3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* - all befores here amount to zero */
3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "[optimize [\\uAC00-\\uD7FF]]",
3768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "a", "b"}, 2}
3769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint32_t i;
3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) {
3773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len);
3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... we got inconsistent results when using the UTF-16BE iterator and the UTF-8 iterator.
3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    ucol_strcollIter?
3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... e.g. s1 = 0xfffc0062, and s2 = d8000021
3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    these are the input strings?
3782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... yes, using the utf-16 iterator and UCA with normalization on, we have s1 > s2
3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    will check - could be a problem with utf-8 iterator
3784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... but if we use the utf-8 iterator, i.e. s1 = efbfbc62 and s2 = eda08021, we have s1 < s2
3785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    hmmm
3786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... note that we have a standalone high surrogate
3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    that doesn't sound right
3788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... we got the same inconsistent results on AIX and Win2000
3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    so you have two strings, you convert them to utf-8 and to utf-16BE
3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... yes
3791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    and then do the comparison
3792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... in one case, the input strings are in utf8, and in the other case the input strings are in utf-16be
3793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    utf-16 strings look like a little endian ones in the example you sent me
3794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    It could be a bug - let me try to test it out
3795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... ok
3796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... we can wait till the conf. call
3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... next weke
3798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    that would be great
3799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    hmmm
3800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    I might be wrong
3801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    let me play with it some more
3802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... ok
3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... also please check s3 = 0x0e3a0062  and s4 = 0x0e400021. both are in utf-16be
3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... seems with icu 2.2 we have s3 > s4, but not in icu 2.4 that's built for db2
3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... also s1 & s2 that I sent you earlier are also in utf-16be
3806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    ok
3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... i ask sherman to send you more inconsistent data
3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv    thanks
3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... the 4 strings we sent are just samples
3810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
3811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
3812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Alexis(void) {
3813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
3814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
3815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char utf16be[2][4] = {
3818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { (char)0xd8, (char)0x00, (char)0x00, (char)0x21 },
3819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { (char)0xff, (char)0xfc, (char)0x00, (char)0x62 }
3820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char utf8[2][4] = {
3823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { (char)0xed, (char)0xa0, (char)0x80, (char)0x21 },
3824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { (char)0xef, (char)0xbf, (char)0xbc, (char)0x62 },
3825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCharIterator iterU161, iterU162;
3828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCharIterator iterU81, iterU82;
3829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollationResult resU16, resU8;
3831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uiter_setUTF16BE(&iterU161, utf16be[0], 4);
3833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uiter_setUTF16BE(&iterU162, utf16be[1], 4);
3834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uiter_setUTF8(&iterU81, utf8[0], 4);
3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uiter_setUTF8(&iterU82, utf8[1], 4);
3837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  resU16 = ucol_strcollIter(coll, &iterU161, &iterU162, &status);
3841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  resU8 = ucol_strcollIter(coll, &iterU81, &iterU82, &status);
3842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(resU16 != resU8) {
3845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("different results\n");
3846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
3849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CMSCOLL_ALEXIS2_BUFFER_SIZE 256
3853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Alexis2(void) {
3854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
3855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar U16Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U16Target[CMSCOLL_ALEXIS2_BUFFER_SIZE];
3856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char U16BESource[CMSCOLL_ALEXIS2_BUFFER_SIZE], U16BETarget[CMSCOLL_ALEXIS2_BUFFER_SIZE];
3857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char U8Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U8Target[CMSCOLL_ALEXIS2_BUFFER_SIZE];
3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t U16LenS = 0, U16LenT = 0, U16BELenS = 0, U16BELenT = 0, U8LenS = 0, U8LenT = 0;
3859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UConverter *conv = NULL;
3861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCharIterator U16BEItS, U16BEItT;
3863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCharIterator U8ItS, U8ItT;
3864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollationResult resU16, resU16BE, resU8;
3866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char* const pairs[][2] = {
3868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\ud800\\u0021", "\\uFFFC\\u0062"},
3869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0435\\u0308\\u0334", "\\u0415\\u0334\\u0340" },
3870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0E40\\u0021", "\\u00A1\\u0021"},
3871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0E40\\u0021", "\\uFE57\\u0062"},
3872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u5F20", "\\u5F20\\u4E00\\u8E3F"},
3873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0000\\u0020", "\\u0000\\u0020\\u0000"},
3874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0020", "\\u0020\\u0000"}
3875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
3876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru5F20 (my result here)
3877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru5F204E008E3F
3878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru5F20 (your result here)
3879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
3880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = 0;
3883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
3885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(status == U_FILE_ACCESS_ERROR) {
3886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_data_err("Is your data around?\n");
3887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
3888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else if(U_FAILURE(status)) {
3889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Error opening collator\n");
3890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
3891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
3893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  conv = ucnv_open("UTF16BE", &status);
3894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(pairs)/sizeof(pairs[0]); i++) {
3895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U16LenS = u_unescape(pairs[i][0], U16Source, CMSCOLL_ALEXIS2_BUFFER_SIZE);
3896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U16LenT = u_unescape(pairs[i][1], U16Target, CMSCOLL_ALEXIS2_BUFFER_SIZE);
3897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resU16 = ucol_strcoll(coll, U16Source, U16LenS, U16Target, U16LenT);
3899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Result of strcoll is %i\n", resU16);
3901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U16BELenS = ucnv_fromUChars(conv, U16BESource, CMSCOLL_ALEXIS2_BUFFER_SIZE, U16Source, U16LenS, &status);
3903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U16BELenT = ucnv_fromUChars(conv, U16BETarget, CMSCOLL_ALEXIS2_BUFFER_SIZE, U16Target, U16LenT, &status);
3904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* use the original sizes, as the result from converter is in bytes */
3906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setUTF16BE(&U16BEItS, U16BESource, U16LenS);
3907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setUTF16BE(&U16BEItT, U16BETarget, U16LenT);
3908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resU16BE = ucol_strcollIter(coll, &U16BEItS, &U16BEItT, &status);
3910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Result of U16BE is %i\n", resU16BE);
3912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(resU16 != resU16BE) {
3914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("Different results between UTF16 and UTF16BE for %s & %s\n", pairs[i][0], pairs[i][1]);
3915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strToUTF8(U8Source, CMSCOLL_ALEXIS2_BUFFER_SIZE, &U8LenS, U16Source, U16LenS, &status);
3918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strToUTF8(U8Target, CMSCOLL_ALEXIS2_BUFFER_SIZE, &U8LenT, U16Target, U16LenT, &status);
3919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setUTF8(&U8ItS, U8Source, U8LenS);
3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setUTF8(&U8ItT, U8Target, U8LenT);
3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resU8 = ucol_strcollIter(coll, &U8ItS, &U8ItT, &status);
3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(resU16 != resU8) {
3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("Different results between UTF16 and UTF8 for %s & %s\n", pairs[i][0], pairs[i][1]);
3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucnv_close(conv);
3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestHebrewUCA(void) {
3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *first[] = {
3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "d790d6b8d79cd795d6bcd7a9",
3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "d790d79cd79ed7a7d799d799d7a1",
3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "d790d6b4d79ed795d6bcd7a9",
3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  char utf8String[3][256];
3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar utf16String[3][256];
3945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = 0, j = 0;
3947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t sizeUTF8[3];
3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t sizeUTF16[3];
3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
395185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  if (U_FAILURE(status)) {
395285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "Could not open UCA collation %s\n", u_errorName(status));
395385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      return;
395485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  }
3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);*/
3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(first)/sizeof(first[0]); i++) {
3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sizeUTF8[i] = u_parseUTF8(first[i], -1, utf8String[i], 256, &status);
3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strFromUTF8(utf16String[i], 256, &sizeUTF16[i], utf8String[i], sizeUTF8[i], &status);
3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("%i: ");
3961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(j = 0; j < sizeUTF16[i]; j++) {
3962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /*log_verbose("\\u%04X", utf16String[i][j]);*/
3963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("%04X", utf16String[i][j]);
3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(first)/sizeof(first[0])-1; i++) {
3968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(j = i + 1; j < sizeof(first)/sizeof(first[0]); j++) {
3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doTest(coll, utf16String[i], utf16String[j], UCOL_LESS);
3970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPartialSortKeyTermination(void) {
3978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char* cases[] = {
3979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\u1234\\u1234\\udc00",
3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\\udc00\\ud800\\ud800"
3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = sizeof(UCollator);
3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *coll = ucol_open("", &status);
3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCharIterator iter;
3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar currCase[256];
3992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t length = 0;
3993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t pKeyLen = 0;
3994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  uint8_t key[256];
3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(cases)/sizeof(cases[0]); i++) {
3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t state[2] = {0, 0};
3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = u_unescape(cases[i], currCase, 256);
4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setString(&iter, currCase, length);
4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pKeyLen = ucol_nextSortKeyPart(coll, &iter, state, key, 256, &status);
4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Done\n");
4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
4006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSettings(void) {
4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char* cases[] = {
4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "apple",
4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "Apple"
4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char* locales[] = {
4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "",
4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "en"
4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
4019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t i = 0, j = 0;
4023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar source[256], target[256];
4025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t sLen = 0, tLen = 0;
4026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UCollator *collateObject = NULL;
4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0; i < sizeof(locales)/sizeof(locales[0]); i++) {
4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collateObject = ucol_open(locales[i], &status);
4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collateObject, UCOL_PRIMARY);
4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(collateObject, UCOL_CASE_LEVEL , UCOL_OFF, &status);
4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(j = 1; j < sizeof(cases)/sizeof(cases[0]); j++) {
4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      sLen = u_unescape(cases[j-1], source, 256);
4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      source[sLen] = 0;
4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      tLen = u_unescape(cases[j], target, 256);
4036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      source[tLen] = 0;
4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doTest(collateObject, source, target, UCOL_EQUAL);
4038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collateObject);
4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t TestEqualsForCollator(const char* locName, UCollator *source, UCollator *target) {
404485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
404585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t errorNo = 0;
404685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /*const UChar *sourceRules = NULL;*/
404785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /*int32_t sourceRulesLen = 0;*/
404885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UColAttributeValue french = UCOL_OFF;
404985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t cloneSize = 0;
405085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!ucol_equals(source, target)) {
405285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Same collators, different address not equal\n");
405385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        errorNo++;
4054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(target);
405685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(uprv_strcmp(ucol_getLocaleByType(source, ULOC_REQUESTED_LOCALE, &status), ucol_getLocaleByType(source, ULOC_ACTUAL_LOCALE, &status)) == 0) {
405785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* currently, safeClone is implemented through getRules/openRules
405885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        * so it is the same as the test below - I will comment that test out.
405985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        */
406085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* real thing */
406185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        target = ucol_safeClone(source, NULL, &cloneSize, &status);
406285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
406385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Error creating clone\n");
406485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errorNo++;
406585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return errorNo;
406685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
406785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(!ucol_equals(source, target)) {
406885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Collator different from it's clone\n");
406985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errorNo++;
407085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
407185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        french = ucol_getAttribute(source, UCOL_FRENCH_COLLATION, &status);
407285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(french == UCOL_ON) {
407385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_setAttribute(target, UCOL_FRENCH_COLLATION, UCOL_OFF, &status);
407485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        } else {
407585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_setAttribute(target, UCOL_FRENCH_COLLATION, UCOL_ON, &status);
407685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
407785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
407885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Error setting attributes\n");
407985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errorNo++;
408085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return errorNo;
408185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
408285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(ucol_equals(source, target)) {
408385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Collators same even when options changed\n");
408485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errorNo++;
408585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
408685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(target);
408785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* commented out since safeClone uses exactly the same technique */
408885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*
408985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        sourceRules = ucol_getRules(source, &sourceRulesLen);
409085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        target = ucol_openRules(sourceRules, sourceRulesLen, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status);
409185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
409285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Error instantiating target from rules\n");
409385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        errorNo++;
409485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return errorNo;
409585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
409685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(!ucol_equals(source, target)) {
409785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Collator different from collator that was created from the same rules\n");
409885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        errorNo++;
409985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
410085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(target);
410185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        */
4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
410385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return errorNo;
4104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestEquals(void) {
410885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* ucol_equals is not currently a public API. There is a chance that it will become
410985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    * something like this, but currently it is only used by RuleBasedCollator::operator==
411085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    */
411185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* test whether the two collators instantiated from the same locale are equal */
411285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
411385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UParseError parseError;
411485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t noOfLoc = uloc_countAvailable();
411585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *locName = NULL;
411685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *source = NULL, *target = NULL;
411785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i = 0;
4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
411985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char* rules[] = {
412085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        "&l < lj <<< Lj <<< LJ",
412185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        "&n < nj <<< Nj <<< NJ",
412285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        "&ae <<< \\u00e4",
412385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        "&AE <<< \\u00c4"
412485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
412585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /*
412685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char* badRules[] = {
4127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "&l <<< Lj",
412885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "&n < nj <<< nJ <<< NJ",
412985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "&a <<< \\u00e4",
413085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "&AE <<< \\u00c4 <<< x"
413185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
413285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    */
4133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar sourceRules[1024], targetRules[1024];
413585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t sourceRulesSize = 0, targetRulesSize = 0;
413685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t rulesSize = sizeof(rules)/sizeof(rules[0]);
4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(i = 0; i < rulesSize; i++) {
413985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        sourceRulesSize += u_unescape(rules[i], sourceRules+sourceRulesSize, 1024 - sourceRulesSize);
414085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        targetRulesSize += u_unescape(rules[rulesSize-i-1], targetRules+targetRulesSize, 1024 - targetRulesSize);
414185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
414385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    source = ucol_openRules(sourceRules, sourceRulesSize, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status);
414485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(status == U_FILE_ACCESS_ERROR) {
414585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Is your data around?\n");
414685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
414785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else if(U_FAILURE(status)) {
414885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Error opening collator\n");
414985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
415085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
415185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    target = ucol_openRules(targetRules, targetRulesSize, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status);
415285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(!ucol_equals(source, target)) {
415385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Equivalent collators not equal!\n");
415485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
415585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(source);
415685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(target);
4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    source = ucol_open("root", &status);
415985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    target = ucol_open("root", &status);
416085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing root\n");
416185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(!ucol_equals(source, source)) {
416285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Same collator not equal\n");
416385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
416485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(TestEqualsForCollator(locName, source, target)) {
416585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Errors for root\n", locName);
416685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
416785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(source);
416885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
416985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(i = 0; i<noOfLoc; i++) {
417085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        status = U_ZERO_ERROR;
417185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        locName = uloc_getAvailable(i);
417285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*if(hasCollationElements(locName)) {*/
417385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("Testing equality for locale %s\n", locName);
417485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        source = ucol_open(locName, &status);
417585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        target = ucol_open(locName, &status);
417685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (U_FAILURE(status)) {
417785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Error opening collator for locale %s  %s\n", locName, u_errorName(status));
417885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            continue;
417985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
418085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(TestEqualsForCollator(locName, source, target)) {
418185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("Errors for locale %s\n", locName);
418285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
418385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(source);
418485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*}*/
418585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ2726(void) {
418985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar a[2] = { 0x61, 0x00 }; /*"a"*/
419085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar aSpace[3] = { 0x61, 0x20, 0x00 }; /*"a "*/
419185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar spaceA[3] = { 0x20, 0x61, 0x00 }; /*" a"*/
419285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
419385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = ucol_open("en", &status);
419485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
419585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
419685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doTest(coll, a, aSpace, UCOL_EQUAL);
419785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doTest(coll, aSpace, a, UCOL_EQUAL);
419885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doTest(coll, a, spaceA, UCOL_EQUAL);
419985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doTest(coll, spaceA, a, UCOL_EQUAL);
420085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doTest(coll, spaceA, aSpace, UCOL_EQUAL);
420185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    doTest(coll, aSpace, spaceA, UCOL_EQUAL);
420285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
4203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void NullRule(void) {
420685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar r[3] = {0};
420785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
420885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll = ucol_openRules(r, 1, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
420985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_SUCCESS(status)) {
421085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("This should have been an error!\n");
421185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(coll);
421285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
421385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        status = U_ZERO_ERROR;
421485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
421585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_openRules(r, 0, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
421685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)) {
421785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Empty rules should have produced a valid collator -> %s\n", u_errorName(status));
421885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
421985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(coll);
422085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of
4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unicode characters with normalization on.
4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumericCollation(void)
4228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
4230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *basicTestStrings[]={
4232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello1",
4233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello2",
4234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello2002",
4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello2003",
4236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello123456",
4237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello1234567",
4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello10000000",
4239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello100000000",
4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello1000000000",
4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "hello10000000000",
4242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *preZeroTestStrings[]={
4245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery10000",
4246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery010000",
4247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery0010000",
4248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery00010000",
4249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery000010000",
4250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery0000010000",
4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery00000010000",
4252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery000000010000",
4253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *thirtyTwoBitNumericStrings[]={
4256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery42949672960",
4257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery42949672961",
4258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery42949672962",
4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "avery429496729610"
4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
426285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     const static char *longNumericStrings[]={
426385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     /* Some of these sort out of the order that would expected if digits-as-numbers handled arbitrarily-long digit strings.
426485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        In fact, a single collation element can represent a maximum of 254 digits as a number. Digit strings longer than that
426585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        are treated as multiple collation elements. */
426685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num9234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123z", /*253digits, num + 9.23E252 + z */
426785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", /*254digits, num + 1.00E253 */
426885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", /*255digits, num + 1.00E253 + 0, out of numeric order but expected */
426985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", /*254digits, num + 1.23E253 */
427085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345", /*255digits, num + 1.23E253 + 5 */
427185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456", /*256digits, num + 1.23E253 + 56 */
427285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567", /*257digits, num + 1.23E253 + 567 */
427385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234a", /*254digits, num + 1.23E253 + a, out of numeric order but expected */
427485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num92345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", /*254digits, num + 9.23E253, out of numeric order but expected */
427585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "num92345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234a", /*254digits, num + 9.23E253 + a, out of numeric order but expected */
427685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
427785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *supplementaryDigits[] = {
4279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFCE", /* 0 */
4280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFCF", /* 1 */
4281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFD0", /* 2 */
4282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFD1", /* 3 */
4283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFCF\\uD835\\uDFCE", /* 10 */
4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFCF\\uD835\\uDFCF", /* 11 */
4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFCF\\uD835\\uDFD0", /* 12 */
4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFD0\\uD835\\uDFCE", /* 20 */
4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFD0\\uD835\\uDFCF", /* 21 */
4288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\uD835\\uDFD0\\uD835\\uDFD0" /* 22 */
4289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *foreignDigits[] = {
4292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0661",
4293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0662",
4294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0663",
4295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0661\\u0660",
4296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0661\\u0662",
4297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0661\\u0663",
4298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0662\\u0660",
4299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0662\\u0662",
4300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0662\\u0663",
4301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0663\\u0660",
4302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0663\\u0662",
4303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "\\u0663\\u0663"
4304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *evenZeroes[] = {
4307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "2000",
4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "2001",
4309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "2002",
4310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "2003"
4311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UColAttribute att = UCOL_NUMERIC_COLLATION;
4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UColAttributeValue val = UCOL_ON;
4315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Open our collator. */
4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator* coll = ucol_open("root", &status);
4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)){
431985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in using ucol_open() -> %s\n",
4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              myErrorName(status));
4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarterWithOptions("root", basicTestStrings, sizeof(basicTestStrings)/sizeof(basicTestStrings[0]), &att, &val, 1);
4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarterWithOptions("root", thirtyTwoBitNumericStrings, sizeof(thirtyTwoBitNumericStrings)/sizeof(thirtyTwoBitNumericStrings[0]), &att, &val, 1);
432585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    genericLocaleStarterWithOptions("root", longNumericStrings, sizeof(longNumericStrings)/sizeof(longNumericStrings[0]), &att, &val, 1);
4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarterWithOptions("en_US", foreignDigits, sizeof(foreignDigits)/sizeof(foreignDigits[0]), &att, &val, 1);
4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarterWithOptions("root", supplementaryDigits, sizeof(supplementaryDigits)/sizeof(supplementaryDigits[0]), &att, &val, 1);
4328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarterWithOptions("root", evenZeroes, sizeof(evenZeroes)/sizeof(evenZeroes[0]), &att, &val, 1);
4329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Setting up our collator to do digits. */
4331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
4332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)){
4333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: in setting UCOL_NUMERIC_COLLATION as an attribute\n %s\n",
4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              myErrorName(status));
4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
4339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       Testing that prepended zeroes still yield the correct collation behavior.
4340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       We expect that every element in our strings array will be equal.
4341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
4342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericOrderingTestWithResult(coll, preZeroTestStrings, sizeof(preZeroTestStrings)/sizeof(preZeroTestStrings[0]), UCOL_EQUAL);
4343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
4345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTibetanConformance(void)
4348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* test[] = {
4350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0FB2\\u0591\\u0F71\\u0061",
4351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0FB2\\u0F71\\u0061"
4352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
4355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_open("", &status);
4356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar source[100];
4357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar target[100];
4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int result;
4359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
4360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
4361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(test[0], source, 100);
4362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(test[1], target, 100);
4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(coll, source, target, UCOL_EQUAL);
4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = ucol_strcoll(coll, source, -1,   target, -1);
4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("result %d\n", result);
4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (UCOL_EQUAL != result) {
4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Tibetan comparison error\n");
4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarterWithResult("", test, 2, UCOL_EQUAL);
4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPinyinProblem(void) {
4376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *test[] = { "\\u4E56\\u4E56\\u7761", "\\u4E56\\u5B69\\u5B50" };
4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarter("zh__PINYIN", test, sizeof(test)/sizeof(test[0]));
4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TST_UCOL_MAX_INPUT 0x220001
4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define topByte 0xFF000000;
4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define bottomByte 0xFF;
4383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define fourBytes 0xFFFFFFFF;
4384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void showImplicit(UChar32 i) {
4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i >= 0 && i <= TST_UCOL_MAX_INPUT) {
4388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%08X\t%08X\n", i, uprv_uca_getImplicitFromRaw(i));
4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestImplicitGeneration(void) {
4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 last = 0;
4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 current;
4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 i = 0, j = 0;
4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 roundtrip = 0;
4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 lastBottom = 0;
4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 currentBottom = 0;
4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 lastTop = 0;
4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 currentTop = 0;
4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = ucol_open("root", &status);
4404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
440585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status));
4406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_uca_getRawFromImplicit(0xE20303E7);
4410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i <= TST_UCOL_MAX_INPUT; ++i) {
4412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        current = uprv_uca_getImplicitFromRaw(i) & fourBytes;
4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* check that it round-trips AND that all intervening ones are illegal*/
4415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        roundtrip = uprv_uca_getRawFromImplicit(current);
4416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (roundtrip != i) {
4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("No roundtrip %08X\n", i);
4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (last != 0) {
4420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (j = last + 1; j < current; ++j) {
4421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                roundtrip = uprv_uca_getRawFromImplicit(j);
4422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* raise an error if it *doesn't* find an error*/
4423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (roundtrip != -1) {
4424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Fails to recognize illegal %08X\n", j);
4425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
4426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* now do other consistency checks*/
4429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lastBottom = last & bottomByte;
4430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        currentBottom = current & bottomByte;
4431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lastTop = last & topByte;
4432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        currentTop = current & topByte;
4433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* print out some values for spot-checking*/
4435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (lastTop != currentTop || i == 0x10000 || i == 0x110000) {
4436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            showImplicit(i-3);
4437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            showImplicit(i-2);
4438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            showImplicit(i-1);
4439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            showImplicit(i);
4440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            showImplicit(i+1);
4441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            showImplicit(i+2);
4442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        last = current;
4444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_uca_getCodePointFromRaw(uprv_uca_getRawFromCodePoint(i)) != i) {
4446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("No raw <-> code point roundtrip for 0x%08X\n", i);
4447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    showImplicit(TST_UCOL_MAX_INPUT-2);
4450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    showImplicit(TST_UCOL_MAX_INPUT-1);
4451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    showImplicit(TST_UCOL_MAX_INPUT);
4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
4453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
4456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Iterate through the given iterator, checking to see that all the strings
4457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in the expected array are present.
4458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expected array of strings we expect to see, or NULL
4459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expectedCount number of elements of expected, or 0
4460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
4461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t checkUEnumeration(const char* msg,
4462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 UEnumeration* iter,
4463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 const char** expected,
4464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 int32_t expectedCount) {
4465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
4466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0, n, j, bit;
4467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t seenMask = 0;
4468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_ASSERT(expectedCount >= 0 && expectedCount < 31); /* [sic] 31 not 32 */
4470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    n = uenum_count(iter, &ec);
4471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccess("count", &ec)) return -1;
4472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("%s = [", msg);
4473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (;; ++i) {
4474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* s = uenum_next(iter, NULL, &ec);
4475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertSuccess("snext", &ec) || s == NULL) break;
4476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i != 0) log_verbose(",");
4477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%s", s);
4478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* check expected list */
4479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=0, bit=1; j<expectedCount; ++j, bit<<=1) {
4480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if ((seenMask&bit) == 0 &&
4481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uprv_strcmp(s, expected[j]) == 0) {
4482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                seenMask |= bit;
4483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
4484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("] (%d)\n", i);
4488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertTrue("count verified", i==n);
4489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* did we see all expected strings? */
4490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (j=0, bit=1; j<expectedCount; ++j, bit<<=1) {
4491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((seenMask&bit)!=0) {
4492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Ok: \"%s\" seen\n", expected[j]);
4493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
4494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: \"%s\" not seen\n", expected[j]);
4495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return n;
4498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
4501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test new API added for separate collation tree.
4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
4503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSeparateTrees(void) {
4504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
4505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UEnumeration *e = NULL;
4506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n = -1;
4507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isAvailable;
4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char loc[256];
4509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* AVAIL[] = { "en", "de" };
4511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* KW[] = { "collation" };
4513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* KWVAL[] = { "phonebook", "stroke" };
4515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
4517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    e = ucol_openAvailableLocales(&ec);
451885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (e != NULL) {
451985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertSuccess("ucol_openAvailableLocales", &ec);
452085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertTrue("ucol_openAvailableLocales!=0", e!=0);
452185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        n = checkUEnumeration("ucol_openAvailableLocales", e, AVAIL, LEN(AVAIL));
452285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* Don't need to check n because we check list */
452385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uenum_close(e);
452485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
452585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Error calling ucol_openAvailableLocales() -> %s (Are you missing data?)\n", u_errorName(ec));
452685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
4528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    e = ucol_getKeywords(&ec);
453085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (e != NULL) {
453185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertSuccess("ucol_getKeywords", &ec);
453285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertTrue("ucol_getKeywords!=0", e!=0);
453385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        n = checkUEnumeration("ucol_getKeywords", e, KW, LEN(KW));
453485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* Don't need to check n because we check list */
453585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uenum_close(e);
453685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
453785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Error calling ucol_getKeywords() -> %s (Are you missing data?)\n", u_errorName(ec));
453885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    e = ucol_getKeywordValues(KW[0], &ec);
454185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (e != NULL) {
454285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertSuccess("ucol_getKeywordValues", &ec);
454385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertTrue("ucol_getKeywordValues!=0", e!=0);
454485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        n = checkUEnumeration("ucol_getKeywordValues", e, KWVAL, LEN(KWVAL));
454585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* Don't need to check n because we check list */
454685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uenum_close(e);
454785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
454885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Error calling ucol_getKeywordValues() -> %s (Are you missing data?)\n", u_errorName(ec));
454985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Try setting a warning before calling ucol_getKeywordValues */
4552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ec = U_USING_FALLBACK_WARNING;
4553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    e = ucol_getKeywordValues(KW[0], &ec);
455485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (assertSuccess("ucol_getKeywordValues [with warning code set]", &ec)) {
455585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        assertTrue("ucol_getKeywordValues!=0 [with warning code set]", e!=0);
455685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        n = checkUEnumeration("ucol_getKeywordValues [with warning code set]", e, KWVAL, LEN(KWVAL));
455785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* Don't need to check n because we check list */
455885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uenum_close(e);
455985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
4562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_DRAFT int32_t U_EXPORT2
4563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_getFunctionalEquivalent(char* result, int32_t resultCapacity,
4564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* locale, UBool* isAvailable,
4565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             UErrorCode* status);
4566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
456827f654740f2a26ad62a5c155af9199af9e69b889claireho    n = ucol_getFunctionalEquivalent(loc, sizeof(loc), "collation", "de",
4569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     &isAvailable, &ec);
457085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (assertSuccess("getFunctionalEquivalent", &ec)) {
457127f654740f2a26ad62a5c155af9199af9e69b889claireho        assertEquals("getFunctionalEquivalent(de)", "de", loc);
457227f654740f2a26ad62a5c155af9199af9e69b889claireho        assertTrue("getFunctionalEquivalent(de).isAvailable==TRUE",
457385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                   isAvailable == TRUE);
457485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
457627f654740f2a26ad62a5c155af9199af9e69b889claireho    n = ucol_getFunctionalEquivalent(loc, sizeof(loc), "collation", "de_DE",
4577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     &isAvailable, &ec);
457885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (assertSuccess("getFunctionalEquivalent", &ec)) {
457927f654740f2a26ad62a5c155af9199af9e69b889claireho        assertEquals("getFunctionalEquivalent(de_DE)", "de", loc);
458027f654740f2a26ad62a5c155af9199af9e69b889claireho        assertTrue("getFunctionalEquivalent(de_DE).isAvailable==TRUE",
458185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                   isAvailable == TRUE);
458285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* supercedes TestJ784 */
4586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBeforePinyin(void) {
4587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char rules[] = {
4588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 2]A<<\\u0101<<<\\u0100<<\\u00E1<<<\\u00C1<<\\u01CE<<<\\u01CD<<\\u00E0<<<\\u00C0"
4589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 2]e<<\\u0113<<<\\u0112<<\\u00E9<<<\\u00C9<<\\u011B<<<\\u011A<<\\u00E8<<<\\u00C8"
4590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 2]i<<\\u012B<<<\\u012A<<\\u00ED<<<\\u00CD<<\\u01D0<<<\\u01CF<<\\u00EC<<<\\u00CC"
4591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 2]o<<\\u014D<<<\\u014C<<\\u00F3<<<\\u00D3<<\\u01D2<<<\\u01D1<<\\u00F2<<<\\u00D2"
4592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&[before 2]u<<\\u016B<<<\\u016A<<\\u00FA<<<\\u00DA<<\\u01D4<<<\\u01D3<<\\u00F9<<<\\u00D9"
4593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "&U<<\\u01D6<<<\\u01D5<<\\u01D8<<<\\u01D7<<\\u01DA<<<\\u01D9<<\\u01DC<<<\\u01DB<<\\u00FC"
4594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *test[] = {
4597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "l\\u0101",
4598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "la",
4599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "l\\u0101n",
4600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "lan ",
4601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "l\\u0113",
4602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "le",
4603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "l\\u0113n",
4604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "len"
4605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *test2[] = {
4608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u0101",
4609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u0100",
4610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u0101",
4611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u0100",
4612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00E1",
4613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00C1",
4614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u00E1",
4615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u00C1",
4616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u01CE",
4617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u01CD",
4618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u01CE",
4619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u01CD",
4620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00E0",
4621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00C0",
4622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u00E0",
4623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "X\\u00C0",
4624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xa",
4625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xA",
4626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Xa",
4627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "XA",
4628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u0101x",
4629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u0100x",
4630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00E1x",
4631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00C1x",
4632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u01CEx",
4633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u01CDx",
4634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00E0x",
4635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x\\u00C0x",
4636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xax",
4637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "xAx"
4638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rules, test, sizeof(test)/sizeof(test[0]));
4641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarter("zh", test, sizeof(test)/sizeof(test[0]));
4642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rules, test2, sizeof(test2)/sizeof(test2[0]));
4643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarter("zh", test2, sizeof(test2)/sizeof(test2[0]));
4644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBeforeTightening(void) {
4647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
4648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *rules;
4649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode expectedStatus;
4650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[] = {
4651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 1]a<x", U_ZERO_ERROR },
4652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 1]a<<x", U_INVALID_FORMAT_ERROR },
4653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 1]a<<<x", U_INVALID_FORMAT_ERROR },
4654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 1]a=x", U_INVALID_FORMAT_ERROR },
4655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 2]a<x",U_INVALID_FORMAT_ERROR },
4656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 2]a<<x",U_ZERO_ERROR },
4657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 2]a<<<x",U_INVALID_FORMAT_ERROR },
4658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 2]a=x",U_INVALID_FORMAT_ERROR },
4659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 3]a<x",U_INVALID_FORMAT_ERROR  },
4660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 3]a<<x",U_INVALID_FORMAT_ERROR  },
4661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 3]a<<<x",U_ZERO_ERROR },
4662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 3]a=x",U_INVALID_FORMAT_ERROR  },
4663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before I]a = x",U_INVALID_FORMAT_ERROR }
4664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
4667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
4669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar rlz[RULE_BUFFER_LEN] = { 0 };
4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t rlen = 0;
4671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
4676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rlen = u_unescape(tests[i].rules, rlz, RULE_BUFFER_LEN);
4677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status);
4678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != tests[i].expectedStatus) {
467985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "Opening a collator with rules %s returned error code %s, expected %s\n",
4680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                tests[i].rules, u_errorName(status), u_errorName(tests[i].expectedStatus));
4681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
4683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
4684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
468854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/*
4689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m < a
4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] a < x <<< X << q <<< Q < z
4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M < x <<< X << q <<< Q < z < a < n
4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m < a
4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] a << x <<< X << q <<< Q < z
4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M < x <<< X << q <<< Q << a < z < n
4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m < a
4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] a <<< x <<< X << q <<< Q < z
4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M < x <<< X <<< a << q <<< Q < z < n
4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m << a
4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] a < x <<< X << q <<< Q < z
4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q < z < m <<< M << a < n
4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m << a
4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] a << x <<< X << q <<< Q < z
4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M << x <<< X << q <<< Q << a < z < n
4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m << a
4711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] a <<< x <<< X << q <<< Q < z
4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M << x <<< X <<< a << q <<< Q < z < n
4713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m <<< a
4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] a < x <<< X << q <<< Q < z
4717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q < z < n < m <<< a <<< M
4718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m <<< a
4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] a << x <<< X << q <<< Q < z
4721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert:  x <<< X << q <<< Q << m <<< a <<< M < z < n
4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m <<< a
4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] a <<< x <<< X << q <<< Q < z
4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< x <<< X <<< a <<< M  << q <<< Q < z < n
4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] s < x <<< X << q <<< Q < z
4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: r <<< R < x <<< X << q <<< Q < z < s < n
4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] s << x <<< X << q <<< Q < z
4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: r <<< R < x <<< X << q <<< Q << s < z < n
4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] s <<< x <<< X << q <<< Q < z
4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: r <<< R < x <<< X <<< s << q <<< Q < z < n
4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] \u24DC < x <<< X << q <<< Q < z
4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q < z < n < m <<< \u24DC <<< M
4740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] \u24DC << x <<< X << q <<< Q < z
4742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert:  x <<< X << q <<< Q << m <<< \u24DC <<< M < z < n
4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] \u24DC <<< x <<< X << q <<< Q < z
4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< x <<< X <<< \u24DC <<< M  << q <<< Q < z < n
474654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*/
4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* requires features not yet supported */
4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestMoreBefore(void) {
4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* rules;
4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* order[16];
4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t size;
4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[] = {
4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m < a &[before 1] a < x <<< X << q <<< Q < z",
4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","M","x","X","q","Q","z","a","n" }, 9},
4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m < a &[before 2] a << x <<< X << q <<< Q < z",
4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","M","x","X","q","Q","a","z","n" }, 9},
4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m < a &[before 3] a <<< x <<< X << q <<< Q < z",
4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","M","x","X","a","q","Q","z","n" }, 9},
4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m << a &[before 1] a < x <<< X << q <<< Q < z",
4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x","X","q","Q","z","m","M","a","n" }, 9},
4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m << a &[before 2] a << x <<< X << q <<< Q < z",
4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","M","x","X","q","Q","a","z","n" }, 9},
4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m << a &[before 3] a <<< x <<< X << q <<< Q < z",
4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","M","x","X","a","q","Q","z","n" }, 9},
4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m <<< a &[before 1] a < x <<< X << q <<< Q < z",
4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x","X","q","Q","z","n","m","a","M" }, 9},
4771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m <<< a &[before 2] a << x <<< X << q <<< Q < z",
4772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x","X","q","Q","m","a","M","z","n" }, 9},
4773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&m <<< a &[before 3] a <<< x <<< X << q <<< Q < z",
4774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","x","X","a","M","q","Q","z","n" }, 9},
4775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 1] s < x <<< X << q <<< Q < z",
4776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "r","R","x","X","q","Q","z","s","n" }, 9},
4777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 2] s << x <<< X << q <<< Q < z",
4778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "r","R","x","X","q","Q","s","z","n" }, 9},
4779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 3] s <<< x <<< X << q <<< Q < z",
4780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "r","R","x","X","s","q","Q","z","n" }, 9},
4781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 1] \\u24DC < x <<< X << q <<< Q < z",
4782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x","X","q","Q","z","n","m","\\u24DC","M" }, 9},
4783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 2] \\u24DC << x <<< X << q <<< Q < z",
4784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "x","X","q","Q","m","\\u24DC","M","z","n" }, 9},
4785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "&[before 3] \\u24DC <<< x <<< X << q <<< Q < z",
4786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "m","x","X","\\u24DC","M","q","Q","z","n" }, 9}
4787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
4790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
4792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        genericRulesStarter(tests[i].rules, tests[i].order, tests[i].size);
4793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
4796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTailorNULL( void ) {
4798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char* rule = "&a <<< '\\u0000'";
4799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
4800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar rlz[RULE_BUFFER_LEN] = { 0 };
4801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t rlen = 0;
4802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar a = 1, null = 0;
4803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollationResult res = UCOL_EQUAL;
4804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
4806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rlen = u_unescape(rule, rlz, RULE_BUFFER_LEN);
4809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status);
4810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
481285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Could not open default collator! -> %s\n", u_errorName(status));
4813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
4814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res = ucol_strcoll(coll, &a, 1, &null, 1);
4815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(res != UCOL_LESS) {
4817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("NULL was not tailored properly!\n");
4818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
4822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestUpperFirstQuaternary(void)
4826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* tests[] = { "B", "b", "Bb", "bB" };
4828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttribute att[] = { UCOL_STRENGTH, UCOL_CASE_FIRST };
4829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttributeValue attVals[] = { UCOL_QUATERNARY, UCOL_UPPER_FIRST };
4830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptions("root", tests, sizeof(tests)/sizeof(tests[0]), att, attVals, sizeof(att)/sizeof(att[0]));
4831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ4960(void)
4835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* tests[] = { "\\u00e2T", "aT" };
4837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttribute att[] = { UCOL_STRENGTH, UCOL_CASE_LEVEL };
4838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttributeValue attVals[] = { UCOL_PRIMARY, UCOL_ON };
4839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* tests2[] = { "a", "A" };
4840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char* rule = "&[first tertiary ignorable]=A=a";
4841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttribute att2[] = { UCOL_CASE_LEVEL };
4842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UColAttributeValue attVals2[] = { UCOL_ON };
4843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* Test whether we correctly ignore primary ignorables on case level when */
4844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* we have only primary & case level */
4845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptionsAndResult("root", tests, sizeof(tests)/sizeof(tests[0]), att, attVals, sizeof(att)/sizeof(att[0]), UCOL_EQUAL);
4846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* Test whether ICU4J will make case level for sortkeys that have primary strength */
4847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* and case level */
4848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericLocaleStarterWithOptions("root", tests2, sizeof(tests2)/sizeof(tests2[0]), att, attVals, sizeof(att)/sizeof(att[0]));
4849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* Test whether completely ignorable letters have case level info (they shouldn't) */
4850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  genericRulesStarterWithOptionsAndResult(rule, tests2, sizeof(tests2)/sizeof(tests2[0]), att2, attVals2, sizeof(att2)/sizeof(att2[0]), UCOL_EQUAL);
4851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ5223(void)
4855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const char *test = "this is a test string";
4857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar ustr[256];
4858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t ustr_length = u_unescape(test, ustr, 256);
4859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  unsigned char sortkey[256];
4860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t sortkey_length;
4861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
4862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static UCollator *coll = NULL;
4863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  coll = ucol_open("root", &status);
4864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) {
486585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status));
4866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
4867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
4868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setStrength(coll, UCOL_PRIMARY);
4869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
4870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
4871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (U_FAILURE(status)) {
4872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Failed setting atributes\n");
4873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
487485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  }
4875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, NULL, 0);
4876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (sortkey_length > 256) return;
4877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* we mark the position where the null byte should be written in advance */
4879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sortkey[sortkey_length-1] = 0xAA;
4880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* we set the buffer size one byte higher than needed */
4882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, sortkey,
4883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortkey_length+1);
4884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* no error occurs (for me) */
4886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (sortkey[sortkey_length-1] == 0xAA) {
4887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Hit bug at first try\n");
4888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
4889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* we mark the position where the null byte should be written again */
4891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sortkey[sortkey_length-1] = 0xAA;
4892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* this time we set the buffer size to the exact amount needed */
4894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, sortkey,
4895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sortkey_length);
4896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* now the trailing null byte is not written */
4898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (sortkey[sortkey_length-1] == 0xAA) {
4899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Hit bug at second try\n");
4900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
4901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ucol_close(coll);
4903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Regression test for Thai partial sort key problem */
4906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ5232(void)
4908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *test[] = {
4910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0e40\\u0e01\\u0e47\\u0e1a\\u0e40\\u0e25\\u0e47\\u0e21",
4911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\\u0e40\\u0e01\\u0e47\\u0e1a\\u0e40\\u0e25\\u0e48\\u0e21"
4912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
491385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericLocaleStarter("th", test, sizeof(test)/sizeof(test[0]));
4915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ5367(void)
4919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const static char *test[] = { "a", "y" };
4921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* rules = "&Ny << Y &[first secondary ignorable] <<< a";
4922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    genericRulesStarter(rules, test, sizeof(test)/sizeof(test[0]));
4923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestVI5913(void)
4927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
4929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j;
4930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll =NULL;
4931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t  resColl[100], expColl[100];
4932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t  rLen, tLen, ruleLen, sLen, kLen;
4933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar rule[256]={0x26, 0x62, 0x3c, 0x1FF3, 0};  /* &a<0x1FF3-omega with Ypogegrammeni*/
4934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar rule2[256]={0x26, 0x7a, 0x3c, 0x0161, 0};  /* &z<s with caron*/
4935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar rule3[256]={0x26, 0x7a, 0x3c, 0x0061, 0x00ea, 0};  /* &z<a+e with circumflex.*/
493685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar tData[][20]={
4937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1EAC, 0},
4938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0041, 0x0323, 0x0302, 0},
4939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1EA0, 0x0302, 0},
4940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00C2, 0x0323, 0},
4941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1ED8, 0},  /* O with dot and circumflex */
4942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1ECC, 0x0302, 0},
4943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1EB7, 0},
4944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1EA1, 0x0306, 0},
4945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
494685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar tailorData[][20]={
4947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1FA2, 0},  /* Omega with 3 combining marks */
4948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x03C9, 0x0313, 0x0300, 0x0345, 0},
4949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1FF3, 0x0313, 0x0300, 0},
4950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1F60, 0x0300, 0x0345, 0},
4951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1F62, 0x0345, 0},
4952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1FA0, 0x0300, 0},
4953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
495485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar tailorData2[][20]={
4955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x1E63, 0x030C, 0},  /* s with dot below + caron */
4956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0073, 0x0323, 0x030C, 0},
4957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0073, 0x030C, 0x0323, 0},
4958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
495985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar tailorData3[][20]={
4960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x007a, 0},  /*  z */
4961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0061, 0x0065, 0},  /*  a + e */
4962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0061, 0x00ea, 0}, /* a + e with circumflex */
4963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0061, 0x1EC7, 0},  /* a+ e with dot below and circumflex */
4964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0061, 0x1EB9, 0x0302, 0}, /* a + e with dot below + combining circumflex */
4965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x0061, 0x00EA, 0x0323, 0},  /* a + e with circumflex + combining dot below */
4966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00EA, 0x0323, 0},  /* e with circumflex + combining dot below */
4967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0x00EA, 0},  /* e with circumflex  */
4968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test Vietnamese sort. */
4971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("vi", &status);
497285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)) {
497385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status));
497485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
497585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n\nVI collation:");
4977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[2], u_strlen(tData[2])) ) {
4978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1EAC not equals to \\u1EA0+\\u0302\n");
4979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[3], u_strlen(tData[3])) ) {
4981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1EAC not equals to \\u00c2+\\u0323\n");
4982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[5], u_strlen(tData[5]), tData[4], u_strlen(tData[4])) ) {
4984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1ED8 not equals to \\u1ECC+\\u0302\n");
4985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[7], u_strlen(tData[7]), tData[6], u_strlen(tData[6])) ) {
4987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1EB7 not equals to \\u1EA1+\\u0306\n");
4988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (j=0; j<8; j++) {
4991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tLen = u_strlen(tData[j]);
4992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n Data :%s  \tlen: %d key: ", tData[j], tLen);
4993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rLen = ucol_getSortKey(coll, tData[j], tLen, resColl, 100);
4994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i = 0; i<rLen; i++) {
4995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose(" %02X", resColl[i]);
4996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
5000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Test Romanian sort. */
5002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("ro", &status);
5003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n\nRO collation:");
5004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[1], u_strlen(tData[1])) ) {
5005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1EAC not equals to \\u1EA0+\\u0302\n");
5006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[4], u_strlen(tData[4]), tData[5], u_strlen(tData[5])) ) {
5008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1EAC not equals to \\u00c2+\\u0323\n");
5009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( !ucol_equal(coll, tData[6], u_strlen(tData[6]), tData[7], u_strlen(tData[7])) ) {
5011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\\u1EB7 not equals to \\u1EA1+\\u0306\n");
5012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (j=4; j<8; j++) {
5015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tLen = u_strlen(tData[j]);
5016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n Data :%s  \tlen: %d key: ", tData[j], tLen);
5017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rLen = ucol_getSortKey(coll, tData[j], tLen, resColl, 100);
5018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i = 0; i<rLen; i++) {
5019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose(" %02X", resColl[i]);
5020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
5021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
5023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test the precomposed Greek character with 3 combining marks. */
5025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n\nTailoring test: Greek character with 3 combining marks");
5026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ruleLen = u_strlen(rule);
5027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
502885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
502985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("ucol_openRules failed with %s\n", u_errorName(status));
503085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
503185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
5032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sLen = u_strlen(tailorData[0]);
5033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (j=1; j<6; j++) {
5034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tLen = u_strlen(tailorData[j]);
5035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( !ucol_equal(coll, tailorData[0], sLen, tailorData[j], tLen))  {
5036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\n \\u1FA2 not equals to data[%d]:%s\n", j, tailorData[j]);
5037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
5038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test getSortKey. */
5040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tLen = u_strlen(tailorData[0]);
5041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    kLen=ucol_getSortKey(coll, tailorData[0], tLen, expColl, 100);
5042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (j=0; j<6; j++) {
5043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tLen = u_strlen(tailorData[j]);
5044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rLen = ucol_getSortKey(coll, tailorData[j], tLen, resColl, 100);
5045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
5046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\n Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
5047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(i = 0; i<rLen; i++) {
5048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err(" %02X", resColl[i]);
5049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
5050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
5051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
5053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n\nTailoring test for s with caron:");
5055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ruleLen = u_strlen(rule2);
5056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
5057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tLen = u_strlen(tailorData2[0]);
5058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    kLen=ucol_getSortKey(coll, tailorData2[0], tLen, expColl, 100);
5059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (j=1; j<3; j++) {
5060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tLen = u_strlen(tailorData2[j]);
5061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rLen = ucol_getSortKey(coll, tailorData2[j], tLen, resColl, 100);
5062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
5063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\n After tailoring Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
5064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(i = 0; i<rLen; i++) {
5065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err(" %02X", resColl[i]);
5066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
5067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
5068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
5070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n\nTailoring test for &z< ae with circumflex:");
507285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ruleLen = u_strlen(rule3);
507385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_openRules(rule3, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
507485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    tLen = u_strlen(tailorData3[3]);
507585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    kLen=ucol_getSortKey(coll, tailorData3[3], tLen, expColl, 100);
507685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for (j=4; j<6; j++) {
507785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        tLen = u_strlen(tailorData3[j]);
507885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        rLen = ucol_getSortKey(coll, tailorData3[j], tLen, resColl, 100);
507985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
508085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
508185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("\n After tailoring Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
508285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            for(i = 0; i<rLen; i++) {
508385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err(" %02X", resColl[i]);
508485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
508585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
508685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
508785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("\n Test Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
508885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         for(i = 0; i<rLen; i++) {
508985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho             log_verbose(" %02X", resColl[i]);
5090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
509185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
509285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
509385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
5094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
509585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void
509685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestTailor6179(void)
509785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
509885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
509985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i;
510085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll =NULL;
510185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint8_t  resColl[100];
510285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t  rLen, tLen, ruleLen;
510385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* &[last primary ignorable]<< a  &[first primary ignorable]<<b */
5104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const UChar rule1[]={
5105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            0x26,0x5B,0x6C,0x61,0x73,0x74,0x20,0x70,0x72,0x69,0x6D,0x61,0x72,0x79,
510685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x20,0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,0x3C,0x20,0x61,0x20,
510785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x26,0x5B,0x66,0x69,0x72,0x73,0x74,0x20,0x70,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,
510885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,0x3C,0x62,0x20, 0};
510985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* &[last secondary ignorable]<<< a &[first secondary ignorable]<<<b */
5110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const UChar rule2[]={
5111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            0x26,0x5B,0x6C,0x61,0x73,0x74,0x20,0x73,0x65,0x63,0x6F,0x6E,0x64,0x61,
511285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x72,0x79,0x20,0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,0x3C,0x3C,
511385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x61,0x20,0x26,0x5B,0x66,0x69,0x72,0x73,0x74,0x20,0x73,0x65,0x63,0x6F,0x6E,
511485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x64,0x61,0x72,0x79,0x20,0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,
511585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x3C,0x3C,0x20,0x62,0};
511685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const UChar tData1[][4]={
511885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        {0x61, 0},
511985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        {0x62, 0},
512085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { 0xFDD0,0x009E, 0}
512185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
5122103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const UChar tData2[][4]={
5123103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {0x61, 0},
5124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        {0x62, 0},
5125103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { 0xFDD0,0x009E, 0}
512685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     };
512785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
512850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
512950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * These values from FractionalUCA.txt will change,
513050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * and need to be updated here.
513150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
5132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const uint8_t firstPrimaryIgnCE[]={1, 0x88, 1, 5, 0};
5133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const uint8_t lastPrimaryIgnCE[]={1, 0xE3, 1, 5, 0};
5134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const uint8_t firstSecondaryIgnCE[]={1, 1, 0xbf, 0x04, 0};
5135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const uint8_t lastSecondaryIgnCE[]={1, 1, 0xbf, 0x04, 0};
513685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
513785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Test [Last Primary ignorable] */
513885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    log_verbose("Tailoring test: &[last primary ignorable]<<a  &[first primary ignorable]<<b\n");
514085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ruleLen = u_strlen(rule1);
514185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_openRules(rule1, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
514285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
514385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Tailoring test: &[last primary ignorable] failed! -> %s\n", u_errorName(status));
514485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
514585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
514685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    tLen = u_strlen(tData1[0]);
514785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    rLen = ucol_getSortKey(coll, tData1[0], tLen, resColl, 100);
5148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (rLen != LEN(lastPrimaryIgnCE) || uprv_memcmp(resColl, lastPrimaryIgnCE, rLen) != 0) {
5149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("Bad result for &[lpi]<<a...: Data[%d] :%s  \tlen: %d key: ", 0, tData1[0], rLen);
515085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<rLen; i++) {
515185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err(" %02X", resColl[i]);
515285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("\n");
515485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
515585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    tLen = u_strlen(tData1[1]);
515685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    rLen = ucol_getSortKey(coll, tData1[1], tLen, resColl, 100);
5157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (rLen != LEN(firstPrimaryIgnCE) || uprv_memcmp(resColl, firstPrimaryIgnCE, rLen) != 0) {
5158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("Bad result for &[lpi]<<a...: Data[%d] :%s  \tlen: %d key: ", 1, tData1[1], rLen);
515985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<rLen; i++) {
516085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err(" %02X", resColl[i]);
516185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("\n");
516385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
516485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
516585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
516685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
516785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Test [Last Secondary ignorable] */
5168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    log_verbose("Tailoring test: &[last secondary ignorable]<<<a  &[first secondary ignorable]<<<b\n");
516985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ruleLen = u_strlen(rule1);
517085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
517185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
5172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("Tailoring test: &[last secondary ignorable] failed! -> %s\n", u_errorName(status));
517385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
517485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
517585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    tLen = u_strlen(tData2[0]);
517685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    rLen = ucol_getSortKey(coll, tData2[0], tLen, resColl, 100);
5177103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (rLen != LEN(lastSecondaryIgnCE) || uprv_memcmp(resColl, lastSecondaryIgnCE, rLen) != 0) {
5178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("Bad result for &[lsi]<<<a...: Data[%d] :%s  \tlen: %d key: ", 0, tData2[0], rLen);
517985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<rLen; i++) {
518085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err(" %02X", resColl[i]);
518185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("\n");
518385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
51848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusif(isICUVersionAtLeast(52, 0, 1)) {  /* TODO: debug & fix, see ticket #8982 */
518585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    tLen = u_strlen(tData2[1]);
518685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    rLen = ucol_getSortKey(coll, tData2[1], tLen, resColl, 100);
5187103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (rLen != LEN(firstSecondaryIgnCE) || uprv_memcmp(resColl, firstSecondaryIgnCE, rLen) != 0) {
5188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("Bad result for &[lsi]<<<a...: Data[%d] :%s  \tlen: %d key: ", 1, tData2[1], rLen);
518985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<rLen; i++) {
519085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err(" %02X", resColl[i]);
519185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("\n");
519385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
5194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
519585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
519685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
519785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
519885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void
519985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestUCAPrecontext(void)
520085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
520185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
520285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i, j;
520385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *coll =NULL;
520485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint8_t  resColl[100], prevColl[100];
520585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t  rLen, tLen, ruleLen;
520685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar rule1[256]= {0x26, 0xb7, 0x3c, 0x61, 0}; /* & middle-dot < a */
520785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar rule2[256]= {0x26, 0x4C, 0xb7, 0x3c, 0x3c, 0x61, 0};
520885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* & l middle-dot << a  a is an expansion. */
520985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
521085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar tData1[][20]={
521185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0xb7, 0},  /* standalone middle dot(0xb7) */
521285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x387, 0}, /* standalone middle dot(0x387) */
521385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x61, 0},  /* a */
521485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x6C, 0},  /* l */
521585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x4C, 0x0332, 0},  /* l with [first primary ignorable] */
521685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x6C, 0xb7, 0},  /* l with middle dot(0xb7) */
521785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x6C, 0x387, 0}, /* l with middle dot(0x387) */
521885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x4C, 0xb7, 0},  /* L with middle dot(0xb7) */
521985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x4C, 0x387, 0}, /* L with middle dot(0x387) */
522085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x6C, 0x61, 0x387, 0}, /* la  with middle dot(0x387) */
522185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            { 0x4C, 0x61, 0xb7, 0},  /* La with middle dot(0xb7) */
522285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     };
522385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
522485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("\n\nEN collation:");
522585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_open("en", &status);
522685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
522785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Tailoring test: &z <<a|- failed! -> %s\n", u_errorName(status));
522885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
522985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
523085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for (j=0; j<11; j++) {
523185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        tLen = u_strlen(tData1[j]);
523285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100);
523385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if ((j>0) && (strcmp((char *)resColl, (char *)prevColl)<0)) {
523485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("\n Expecting greater key than previous test case: Data[%d] :%s.",
523585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    j, tData1[j]);
523685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
523785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("\n Data[%d] :%s  \tlen: %d key: ", j, tData1[j], rLen);
523885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i = 0; i<rLen; i++) {
523985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_verbose(" %02X", resColl[i]);
524085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
524185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1));
524285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     }
524385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     ucol_close(coll);
524485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
524585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
524685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     log_verbose("\n\nJA collation:");
524785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     coll = ucol_open("ja", &status);
524885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     if (U_FAILURE(status)) {
524985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         log_err("Tailoring test: &z <<a|- failed!");
525085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         return;
525185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     }
525285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     for (j=0; j<11; j++) {
525385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         tLen = u_strlen(tData1[j]);
525485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100);
525585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         if ((j>0) && (strcmp((char *)resColl, (char *)prevColl)<0)) {
525685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho             log_err("\n Expecting greater key than previous test case: Data[%d] :%s.",
525785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                     j, tData1[j]);
525885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         }
525985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         log_verbose("\n Data[%d] :%s  \tlen: %d key: ", j, tData1[j], rLen);
526085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         for(i = 0; i<rLen; i++) {
526185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho             log_verbose(" %02X", resColl[i]);
526285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         }
526385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1));
526485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      }
526585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      ucol_close(coll);
526685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
526785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
526885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_verbose("\n\nTailoring test: & middle dot < a ");
526985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      ruleLen = u_strlen(rule1);
527085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      coll = ucol_openRules(rule1, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
527185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      if (U_FAILURE(status)) {
527285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          log_err("Tailoring test: & middle dot < a failed!");
527385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          return;
527485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      }
527585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      for (j=0; j<11; j++) {
527685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          tLen = u_strlen(tData1[j]);
527785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100);
527885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          if ((j>0) && (strcmp((char *)resColl, (char *)prevColl)<0)) {
527985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho              log_err("\n Expecting greater key than previous test case: Data[%d] :%s.",
528085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                      j, tData1[j]);
528185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          }
528285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          log_verbose("\n Data[%d] :%s  \tlen: %d key: ", j, tData1[j], rLen);
5283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          for(i = 0; i<rLen; i++) {
5284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              log_verbose(" %02X", resColl[i]);
5285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
528685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1));
528785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       }
528885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       ucol_close(coll);
528985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
529085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
529185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       log_verbose("\n\nTailoring test: & l middle-dot << a ");
529285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       ruleLen = u_strlen(rule2);
529385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
529485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       if (U_FAILURE(status)) {
529585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           log_err("Tailoring test: & l middle-dot << a failed!");
529685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           return;
529785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       }
529885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       for (j=0; j<11; j++) {
529985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           tLen = u_strlen(tData1[j]);
530085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100);
530185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           if ((j>0) && (j!=3) && (strcmp((char *)resColl, (char *)prevColl)<0)) {
530285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho               log_err("\n Expecting greater key than previous test case: Data[%d] :%s.",
530385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                       j, tData1[j]);
530485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           }
530585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           if ((j==3)&&(strcmp((char *)resColl, (char *)prevColl)>0)) {
530685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho               log_err("\n Expecting smaller key than previous test case: Data[%d] :%s.",
530785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                       j, tData1[j]);
530885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           }
530985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           log_verbose("\n Data[%d] :%s  \tlen: %d key: ", j, tData1[j], rLen);
531085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           for(i = 0; i<rLen; i++) {
531185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho               log_verbose(" %02X", resColl[i]);
531285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           }
531385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1));
531485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
531585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol_close(coll);
531685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
531785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
531885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void
531985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestOutOfBuffer5468(void)
532085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
532185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const char *test = "\\u4e00";
532285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar ustr[256];
532385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t ustr_length = u_unescape(test, ustr, 256);
532485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    unsigned char shortKeyBuf[1];
532585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t sortkey_length;
532685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
532785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UCollator *coll = NULL;
532885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
532985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    coll = ucol_open("root", &status);
533085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)) {
533185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status));
533285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      return;
533385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
533485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setStrength(coll, UCOL_PRIMARY);
533585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
533685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
533785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
533885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err("Failed setting atributes\n");
533985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      return;
534085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
534185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
534285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, shortKeyBuf, sizeof(shortKeyBuf));
534385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (sortkey_length != 4) {
534485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("expecting length of sortKey is 4  got:%d ", sortkey_length);
534585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
534685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("length of sortKey is %d", sortkey_length);
534785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(coll);
5348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
5349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TSKC_DATA_SIZE 5
5351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TSKC_BUF_SIZE  50
5352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
5353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSortKeyConsistency(void)
5354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
5355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode icuRC = U_ZERO_ERROR;
5356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator* ucol;
5357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar data[] = { 0xFFFD, 0x0006, 0x0006, 0x0006, 0xFFFD};
5358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t bufFull[TSKC_DATA_SIZE][TSKC_BUF_SIZE];
5360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t bufPart[TSKC_DATA_SIZE][TSKC_BUF_SIZE];
536185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i, j, i2;
5362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol = ucol_openFromShortString("LEN_S4", FALSE, NULL, &icuRC);
5364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(icuRC))
536585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {
536685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(icuRC, "ucol_openFromShortString failed -> %s\n", u_errorName(icuRC));
5367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
536885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
5369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < TSKC_DATA_SIZE; i++)
5371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
5372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharIterator uiter;
5373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t state[2] = { 0, 0 };
5374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dataLen = i+1;
537585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for (j=0; j<TSKC_BUF_SIZE; j++)
537685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            bufFull[i][j] = bufPart[i][j] = 0;
5377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Full sort key */
5379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_getSortKey(ucol, data, dataLen, bufFull[i], TSKC_BUF_SIZE);
5380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Partial sort key */
5382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uiter_setString(&uiter, data, dataLen);
5383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_nextSortKeyPart(ucol, &uiter, state, bufPart[i], TSKC_BUF_SIZE, &icuRC);
5384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(icuRC))
538585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        {
538685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("ucol_nextSortKeyPart failed\n");
538785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucol_close(ucol);
538885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return;
538985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
539185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for (i2=0; i2<i; i2++)
539285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        {
539385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            UBool fullMatch = TRUE;
539485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            UBool partMatch = TRUE;
539585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            for (j=0; j<TSKC_BUF_SIZE; j++)
539685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            {
539785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                fullMatch = fullMatch && (bufFull[i][j] != bufFull[i2][j]);
539885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                partMatch = partMatch && (bufPart[i][j] != bufPart[i2][j]);
539985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
540085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (fullMatch != partMatch) {
540185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err(fullMatch ? "full key was consistent, but partial key changed\n"
540285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                  : "partial key was consistent, but full key changed\n");
540385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                ucol_close(ucol);
540485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                return;
540585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
540685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
5408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*=============================================*/
5410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   ucol_close(ucol);
5411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
5412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
541385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* ticket: 6101 */
541485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestCroatianSortKey(void) {
541585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char* collString = "LHR_AN_CX_EX_FX_HX_NX_S3";
541685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
541785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator *ucol;
541885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCharIterator iter;
541985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
542085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar text[] = { 0x0044, 0xD81A };
542185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
542285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    size_t length = sizeof(text)/sizeof(*text);
542385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
542485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint8_t textSortKey[32];
542585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    size_t lenSortKey = 32;
542685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    size_t actualSortKeyLen;
542785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t uStateInfo[2] = { 0, 0 };
542885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
542985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol = ucol_openFromShortString(collString, FALSE, NULL, &status);
543085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
543185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ucol_openFromShortString error in Craotian test. -> %s\n", u_errorName(status));
543285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
543385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
543485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
543585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uiter_setString(&iter, text, length);
543685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
543785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    actualSortKeyLen = ucol_nextSortKeyPart(
543885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucol, &iter, (uint32_t*)uStateInfo,
543985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        textSortKey, lenSortKey, &status
544085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        );
544185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
544285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (actualSortKeyLen == lenSortKey) {
544385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("ucol_nextSortKeyPart did not give correct result in Croatian test.\n");
544485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
544585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
544685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(ucol);
544785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
544885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
544985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* ticket: 6140 */
545085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* This test ensures that codepoints such as 0x3099 are flagged correctly by the collator since
545185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * they are both Hiragana and Katakana
545285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */
545385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SORTKEYLEN 50
545485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestHiragana(void) {
545585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
545685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollator* ucol;
545785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCollationResult strcollresult;
545885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar data1[] = { 0x3058, 0x30B8 }; /* Hiragana and Katakana letter Zi */
545985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar data2[] = { 0x3057, 0x3099, 0x30B7, 0x3099 };
546085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t data1Len = sizeof(data1)/sizeof(*data1);
546185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t data2Len = sizeof(data2)/sizeof(*data2);
546285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t i, j;
546385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint8_t sortKey1[SORTKEYLEN];
546485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint8_t sortKey2[SORTKEYLEN];
546585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
546685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCharIterator uiter1;
546785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UCharIterator uiter2;
546885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t state1[2] = { 0, 0 };
546985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t state2[2] = { 0, 0 };
547085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t keySize1;
547185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t keySize2;
547285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
547385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol = ucol_openFromShortString("LJA_AN_CX_EX_FX_HO_NX_S4", FALSE, NULL,
547485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            &status);
547585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
547685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Error status: %s; Unable to open collator from short string.\n", u_errorName(status));
547785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
547885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
547985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
548085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Start of full sort keys */
548185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Full sort key1 */
548285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    keySize1 = ucol_getSortKey(ucol, data1, data1Len, sortKey1, SORTKEYLEN);
548385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Full sort key2 */
548485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    keySize2 = ucol_getSortKey(ucol, data2, data2Len, sortKey2, SORTKEYLEN);
548585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (keySize1 == keySize2) {
548685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for (i = 0; i < keySize1; i++) {
548785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (sortKey1[i] != sortKey2[i]) {
548885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("Full sort keys are different. Should be equal.");
548985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
549085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
549185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
549285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Full sort keys sizes doesn't match: %d %d", keySize1, keySize2);
549385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
549485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* End of full sort keys */
549585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
549685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Start of partial sort keys */
549785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Partial sort key1 */
549885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uiter_setString(&uiter1, data1, data1Len);
549985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    keySize1 = ucol_nextSortKeyPart(ucol, &uiter1, state1, sortKey1, SORTKEYLEN, &status);
550085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Partial sort key2 */
550185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uiter_setString(&uiter2, data2, data2Len);
550285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    keySize2 = ucol_nextSortKeyPart(ucol, &uiter2, state2, sortKey2, SORTKEYLEN, &status);
550385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_SUCCESS(status) && keySize1 == keySize2) {
550485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for (j = 0; j < keySize1; j++) {
550585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (sortKey1[j] != sortKey2[j]) {
550685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("Partial sort keys are different. Should be equal");
550785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
550885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
550985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
551085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Error Status: %s or Partial sort keys sizes doesn't match: %d %d", u_errorName(status), keySize1, keySize2);
551185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
551285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* End of partial sort keys */
551385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
551485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Start of strcoll */
551585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Use ucol_strcoll() to determine ordering */
551685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    strcollresult = ucol_strcoll(ucol, data1, data1Len, data2, data2Len);
551785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (strcollresult != UCOL_EQUAL) {
551885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Result from ucol_strcoll() should be UCOL_EQUAL.");
551985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
552085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
552185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucol_close(ucol);
552285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
5523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552427f654740f2a26ad62a5c155af9199af9e69b889claireho/* Convenient struct for running collation tests */
552527f654740f2a26ad62a5c155af9199af9e69b889clairehotypedef struct {
552627f654740f2a26ad62a5c155af9199af9e69b889claireho  const UChar source[MAX_TOKEN_LEN];  /* String on left */
552727f654740f2a26ad62a5c155af9199af9e69b889claireho  const UChar target[MAX_TOKEN_LEN];  /* String on right */
552827f654740f2a26ad62a5c155af9199af9e69b889claireho  UCollationResult result;            /* -1, 0 or +1, depending on collation */
552927f654740f2a26ad62a5c155af9199af9e69b889claireho} OneTestCase;
553027f654740f2a26ad62a5c155af9199af9e69b889claireho
553127f654740f2a26ad62a5c155af9199af9e69b889claireho/*
553227f654740f2a26ad62a5c155af9199af9e69b889claireho * Utility function to test one collation test case.
553327f654740f2a26ad62a5c155af9199af9e69b889claireho * @param testcases Array of test cases.
553427f654740f2a26ad62a5c155af9199af9e69b889claireho * @param n_testcases Size of the array testcases.
553527f654740f2a26ad62a5c155af9199af9e69b889claireho * @param str_rules Array of rules.  These rules should be specifying the same rule in different formats.
553627f654740f2a26ad62a5c155af9199af9e69b889claireho * @param n_rules Size of the array str_rules.
553727f654740f2a26ad62a5c155af9199af9e69b889claireho */
553827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void doTestOneTestCase(const OneTestCase testcases[],
553927f654740f2a26ad62a5c155af9199af9e69b889claireho                              int n_testcases,
554027f654740f2a26ad62a5c155af9199af9e69b889claireho                              const char* str_rules[],
554127f654740f2a26ad62a5c155af9199af9e69b889claireho                              int n_rules)
554227f654740f2a26ad62a5c155af9199af9e69b889claireho{
554327f654740f2a26ad62a5c155af9199af9e69b889claireho  int rule_no, testcase_no;
554427f654740f2a26ad62a5c155af9199af9e69b889claireho  UChar rule[500];
554527f654740f2a26ad62a5c155af9199af9e69b889claireho  int32_t length = 0;
554627f654740f2a26ad62a5c155af9199af9e69b889claireho  UErrorCode status = U_ZERO_ERROR;
554727f654740f2a26ad62a5c155af9199af9e69b889claireho  UParseError parse_error;
554827f654740f2a26ad62a5c155af9199af9e69b889claireho  UCollator  *myCollation;
554927f654740f2a26ad62a5c155af9199af9e69b889claireho
555027f654740f2a26ad62a5c155af9199af9e69b889claireho  for (rule_no = 0; rule_no < n_rules; ++rule_no) {
555127f654740f2a26ad62a5c155af9199af9e69b889claireho
555227f654740f2a26ad62a5c155af9199af9e69b889claireho    length = u_unescape(str_rules[rule_no], rule, 500);
555327f654740f2a26ad62a5c155af9199af9e69b889claireho    if (length == 0) {
555427f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("ERROR: The rule cannot be unescaped: %s\n");
555527f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
555627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
555727f654740f2a26ad62a5c155af9199af9e69b889claireho    myCollation = ucol_openRules(rule, length, UCOL_ON, UCOL_TERTIARY, &parse_error, &status);
555827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){
555927f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
556027f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
556127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
556227f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing the <<* syntax\n");
556327f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
556427f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setStrength(myCollation, UCOL_TERTIARY);
556527f654740f2a26ad62a5c155af9199af9e69b889claireho    for (testcase_no = 0; testcase_no < n_testcases; ++testcase_no) {
556627f654740f2a26ad62a5c155af9199af9e69b889claireho      doTest(myCollation,
556727f654740f2a26ad62a5c155af9199af9e69b889claireho             testcases[testcase_no].source,
556827f654740f2a26ad62a5c155af9199af9e69b889claireho             testcases[testcase_no].target,
556927f654740f2a26ad62a5c155af9199af9e69b889claireho             testcases[testcase_no].result
557027f654740f2a26ad62a5c155af9199af9e69b889claireho             );
557127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
557227f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(myCollation);
557327f654740f2a26ad62a5c155af9199af9e69b889claireho  }
557427f654740f2a26ad62a5c155af9199af9e69b889claireho}
557527f654740f2a26ad62a5c155af9199af9e69b889claireho
557627f654740f2a26ad62a5c155af9199af9e69b889clairehoconst static OneTestCase rangeTestcases[] = {
557727f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0062},                          UCOL_LESS }, /* "a" < "b" */
557827f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0062},                            {0x0063},                          UCOL_LESS }, /* "b" < "c" */
557927f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0063},                          UCOL_LESS }, /* "a" < "c" */
558027f654740f2a26ad62a5c155af9199af9e69b889claireho
558127f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0062},                            {0x006b},                          UCOL_LESS }, /* "b" << "k" */
558227f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x006b},                            {0x006c},                          UCOL_LESS }, /* "k" << "l" */
558327f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0062},                            {0x006c},                          UCOL_LESS }, /* "b" << "l" */
558427f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x006c},                          UCOL_LESS }, /* "a" < "l" */
558527f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x006d},                          UCOL_LESS },  /* "a" < "m" */
558627f654740f2a26ad62a5c155af9199af9e69b889claireho
558727f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0079},                            {0x006d},                          UCOL_LESS },  /* "y" < "f" */
558827f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0079},                            {0x0067},                          UCOL_LESS },  /* "y" < "g" */
558927f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0068},                          UCOL_LESS },  /* "y" < "h" */
559027f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0065},                          UCOL_LESS },  /* "g" < "e" */
559127f654740f2a26ad62a5c155af9199af9e69b889claireho
559227f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0031},                          UCOL_EQUAL }, /* "a" = "1" */
559327f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0032},                          UCOL_EQUAL }, /* "a" = "2" */
559427f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0033},                          UCOL_EQUAL }, /* "a" = "3" */
559527f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061},                            {0x0066},                          UCOL_LESS }, /* "a" < "f" */
559627f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x006c, 0x0061},                    {0x006b, 0x0062},                  UCOL_LESS },  /* "la" < "123" */
559727f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061, 0x0061, 0x0061},            {0x0031, 0x0032, 0x0033},          UCOL_EQUAL }, /* "aaa" = "123" */
559827f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0062},                            {0x007a},                          UCOL_LESS },  /* "b" < "z" */
559927f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0061, 0x007a, 0x0062},            {0x0032, 0x0079, 0x006d},          UCOL_LESS }, /* "azm" = "2yc" */
560050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
560150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
560227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int nRangeTestcases = LEN(rangeTestcases);
560327f654740f2a26ad62a5c155af9199af9e69b889claireho
560427f654740f2a26ad62a5c155af9199af9e69b889clairehoconst static OneTestCase rangeTestcasesSupplemental[] = {
560527f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xfffe},                            {0xffff},                          UCOL_LESS }, /* U+FFFE < U+FFFF */
560627f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xffff},                            {0xd800, 0xdc00},                  UCOL_LESS }, /* U+FFFF < U+10000 */
560727f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xd800, 0xdc00},                    {0xd800, 0xdc01},                  UCOL_LESS }, /* U+10000 < U+10001 */
560827f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xfffe},                            {0xd800, 0xdc01},                  UCOL_LESS }, /* U+FFFE < U+10001 */
560927f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xd800, 0xdc01},                    {0xd800, 0xdc02},                  UCOL_LESS }, /* U+10000 < U+10001 */
561027f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xd800, 0xdc01},                    {0xd800, 0xdc02},                  UCOL_LESS }, /* U+10000 < U+10001 */
561127f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0xfffe},                            {0xd800, 0xdc02},                  UCOL_LESS }, /* U+FFFE < U+10001 */
561250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
561350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
561427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int nRangeTestcasesSupplemental = LEN(rangeTestcasesSupplemental);
561527f654740f2a26ad62a5c155af9199af9e69b889claireho
561627f654740f2a26ad62a5c155af9199af9e69b889clairehoconst static OneTestCase rangeTestcasesQwerty[] = {
561727f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0071},                            {0x0077},                          UCOL_LESS }, /* "q" < "w" */
561827f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0077},                            {0x0065},                          UCOL_LESS }, /* "w" < "e" */
561927f654740f2a26ad62a5c155af9199af9e69b889claireho
562027f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0079},                            {0x0075},                          UCOL_LESS }, /* "y" < "u" */
562127f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0071},                            {0x0075},                          UCOL_LESS }, /* "q" << "u" */
562227f654740f2a26ad62a5c155af9199af9e69b889claireho
562327f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0074},                            {0x0069},                          UCOL_LESS }, /* "t" << "i" */
562427f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x006f},                            {0x0070},                          UCOL_LESS }, /* "o" << "p" */
562527f654740f2a26ad62a5c155af9199af9e69b889claireho
562627f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0079},                            {0x0065},                          UCOL_LESS },  /* "y" < "e" */
562727f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0069},                            {0x0075},                          UCOL_LESS },  /* "i" < "u" */
562827f654740f2a26ad62a5c155af9199af9e69b889claireho
562927f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0071, 0x0075, 0x0065, 0x0073, 0x0074},
563027f654740f2a26ad62a5c155af9199af9e69b889claireho    {0x0077, 0x0065, 0x0072, 0x0065},                                       UCOL_LESS }, /* "quest" < "were" */
563127f654740f2a26ad62a5c155af9199af9e69b889claireho  { {0x0071, 0x0075, 0x0061, 0x0063, 0x006b},
563227f654740f2a26ad62a5c155af9199af9e69b889claireho    {0x0071, 0x0075, 0x0065, 0x0073, 0x0074},                               UCOL_LESS }, /* "quack" < "quest" */
563350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
563450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
563527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int nRangeTestcasesQwerty = LEN(rangeTestcasesQwerty);
563627f654740f2a26ad62a5c155af9199af9e69b889claireho
563750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestSameStrengthList(void)
563850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
563927f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
564027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Normal */
564127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<b<c<d &b<<k<<l<<m &k<<<x<<<y<<<z  &y<f<g<h<e &a=1=2=3",
564250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
564327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Lists */
564427f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<*bcd &b<<*klm &k<<<*xyz &y<*fghe &a=*123",
564527f654740f2a26ad62a5c155af9199af9e69b889claireho  };
564627f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcases, nRangeTestcases, strRules, LEN(strRules));
564727f654740f2a26ad62a5c155af9199af9e69b889claireho}
564827f654740f2a26ad62a5c155af9199af9e69b889claireho
564927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListQuoted(void)
565027f654740f2a26ad62a5c155af9199af9e69b889claireho{
565127f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
565227f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Lists with quoted characters */
565327f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u0061<*bcd &b<<*klm &k<<<*xyz &y<*f\\u0067\\u0068e &a=*123",
565427f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u0061'<*bcd &b<<*klm &k<<<*xyz &y<*f'\\u0067\\u0068'e &a=*123",
565527f654740f2a26ad62a5c155af9199af9e69b889claireho
565627f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u0061<*b\\u0063d &b<<*klm &k<<<*xyz &\\u0079<*fgh\\u0065 &a=*\\u0031\\u0032\\u0033",
565727f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u0061'<*b'\\u0063'd &b<<*klm &k<<<*xyz &'\\u0079'<*fgh'\\u0065' &a=*'\\u0031\\u0032\\u0033'",
565827f654740f2a26ad62a5c155af9199af9e69b889claireho
565927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u0061<*\\u0062c\\u0064 &b<<*klm &k<<<*xyz  &y<*fghe &a=*\\u0031\\u0032\\u0033",
566027f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u0061'<*'\\u0062'c'\\u0064' &b<<*klm &k<<<*xyz  &y<*fghe &a=*'\\u0031\\u0032\\u0033'",
566127f654740f2a26ad62a5c155af9199af9e69b889claireho  };
566227f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcases, nRangeTestcases, strRules, LEN(strRules));
566327f654740f2a26ad62a5c155af9199af9e69b889claireho}
566427f654740f2a26ad62a5c155af9199af9e69b889claireho
566527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListSupplemental(void)
566627f654740f2a26ad62a5c155af9199af9e69b889claireho{
566727f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
566827f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\ufffe<\\uffff<\\U00010000<\\U00010001<\\U00010002",
566927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\ufffe<\\uffff<\\ud800\\udc00<\\ud800\\udc01<\\ud800\\udc02",
567027f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\ufffe<*\\uffff\\U00010000\\U00010001\\U00010002",
567127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\ufffe<*\\uffff\\ud800\\udc00\\ud800\\udc01\\ud800\\udc02",
567227f654740f2a26ad62a5c155af9199af9e69b889claireho  };
567327f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcasesSupplemental, nRangeTestcasesSupplemental, strRules, LEN(strRules));
567427f654740f2a26ad62a5c155af9199af9e69b889claireho}
567527f654740f2a26ad62a5c155af9199af9e69b889claireho
567627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListQwerty(void)
567727f654740f2a26ad62a5c155af9199af9e69b889claireho{
567827f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
567927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&q<w<e<r &w<<t<<y<<u &t<<<i<<<o<<<p &o=a=s=d",   /* Normal */
568027f654740f2a26ad62a5c155af9199af9e69b889claireho    "&q<*wer &w<<*tyu &t<<<*iop &o=*asd",             /* Lists  */
568127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u0071<\\u0077<\\u0065<\\u0072 &\\u0077<<\\u0074<<\\u0079<<\\u0075 &\\u0074<<<\\u0069<<<\\u006f<<<\\u0070 &\\u006f=\\u0061=\\u0073=\\u0064",
568227f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u0071'<\\u0077<\\u0065<\\u0072 &\\u0077<<'\\u0074'<<\\u0079<<\\u0075 &\\u0074<<<\\u0069<<<'\\u006f'<<<\\u0070 &\\u006f=\\u0061='\\u0073'=\\u0064",
568327f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u0071<*\\u0077\\u0065\\u0072 &\\u0077<<*\\u0074\\u0079\\u0075 &\\u0074<<<*\\u0069\\u006f\\u0070 &\\u006f=*\\u0061\\u0073\\u0064",
568427f654740f2a26ad62a5c155af9199af9e69b889claireho
568527f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Quoted characters also will work if two quoted characters are not consecutive.  */
568627f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u0071<*'\\u0077'\\u0065\\u0072 &\\u0077<<*\\u0074'\\u0079'\\u0075 &\\u0074<<<*\\u0069\\u006f'\\u0070' &'\\u006f'=*\\u0061\\u0073\\u0064",
568727f654740f2a26ad62a5c155af9199af9e69b889claireho
568827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Consecutive quoted charactes do not work, because a '' will be treated as a quote character. */
568927f654740f2a26ad62a5c155af9199af9e69b889claireho    /* "&\\u0071<*'\\u0077''\\u0065''\\u0072' &\\u0077<<*'\\u0074''\\u0079''\\u0075' &\\u0074<<<*'\\u0069''\\u006f''\\u0070' &'\\u006f'=*\\u0061\\u0073\\u0064",*/
569027f654740f2a26ad62a5c155af9199af9e69b889claireho
569127f654740f2a26ad62a5c155af9199af9e69b889claireho };
569227f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcasesQwerty, nRangeTestcasesQwerty, strRules, LEN(strRules));
569327f654740f2a26ad62a5c155af9199af9e69b889claireho}
569427f654740f2a26ad62a5c155af9199af9e69b889claireho
569527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListQuotedQwerty(void)
569627f654740f2a26ad62a5c155af9199af9e69b889claireho{
569727f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
569827f654740f2a26ad62a5c155af9199af9e69b889claireho    "&q<w<e<r &w<<t<<y<<u &t<<<i<<<o<<<p &o=a=s=d",   /* Normal */
569927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&q<*wer &w<<*tyu &t<<<*iop &o=*asd",             /* Lists  */
570027f654740f2a26ad62a5c155af9199af9e69b889claireho    "&q<*w'e'r &w<<*'t'yu &t<<<*io'p' &o=*'a's'd'",   /* Lists with quotes */
570127f654740f2a26ad62a5c155af9199af9e69b889claireho
570227f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Lists with continuous quotes may not work, because '' will be treated as a quote character. */
570327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* "&q<*'w''e''r' &w<<*'t''y''u' &t<<<*'i''o''p' &o=*'a''s''d'", */
570427f654740f2a26ad62a5c155af9199af9e69b889claireho   };
570527f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcasesQwerty, nRangeTestcasesQwerty, strRules, LEN(strRules));
570627f654740f2a26ad62a5c155af9199af9e69b889claireho}
570727f654740f2a26ad62a5c155af9199af9e69b889claireho
570827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListRanges(void)
570927f654740f2a26ad62a5c155af9199af9e69b889claireho{
571027f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
571127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<*b-d &b<<*k-m &k<<<*x-z &y<*f-he &a=*1-3",
571227f654740f2a26ad62a5c155af9199af9e69b889claireho  };
571327f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcases, nRangeTestcases, strRules, LEN(strRules));
571427f654740f2a26ad62a5c155af9199af9e69b889claireho}
571527f654740f2a26ad62a5c155af9199af9e69b889claireho
571627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListSupplementalRanges(void)
571727f654740f2a26ad62a5c155af9199af9e69b889claireho{
571827f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
571927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\ufffe<*\\uffff-\\U00010002",
572027f654740f2a26ad62a5c155af9199af9e69b889claireho  };
572127f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(rangeTestcasesSupplemental, nRangeTestcasesSupplemental, strRules, LEN(strRules));
572227f654740f2a26ad62a5c155af9199af9e69b889claireho}
572327f654740f2a26ad62a5c155af9199af9e69b889claireho
572427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSpecialCharacters(void)
572527f654740f2a26ad62a5c155af9199af9e69b889claireho{
572627f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
572727f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Normal */
572827f654740f2a26ad62a5c155af9199af9e69b889claireho    "&';'<'+'<','<'-'<'&'<'*'",
572927f654740f2a26ad62a5c155af9199af9e69b889claireho
573027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* List */
573127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&';'<*'+,-&*'",
573227f654740f2a26ad62a5c155af9199af9e69b889claireho
573327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Range */
573427f654740f2a26ad62a5c155af9199af9e69b889claireho    "&';'<*'+'-'-&*'",
573527f654740f2a26ad62a5c155af9199af9e69b889claireho  };
573627f654740f2a26ad62a5c155af9199af9e69b889claireho
573727f654740f2a26ad62a5c155af9199af9e69b889claireho  const static OneTestCase specialCharacterStrings[] = {
573827f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x003b}, {0x002b}, UCOL_LESS },  /* ; < + */
573927f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x002b}, {0x002c}, UCOL_LESS },  /* + < , */
574027f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x002c}, {0x002d}, UCOL_LESS },  /* , < - */
574127f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x002d}, {0x0026}, UCOL_LESS },  /* - < & */
574227f654740f2a26ad62a5c155af9199af9e69b889claireho  };
574327f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(specialCharacterStrings, LEN(specialCharacterStrings), strRules, LEN(strRules));
574427f654740f2a26ad62a5c155af9199af9e69b889claireho}
574527f654740f2a26ad62a5c155af9199af9e69b889claireho
574627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestPrivateUseCharacters(void)
574727f654740f2a26ad62a5c155af9199af9e69b889claireho{
574827f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
574927f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Normal */
575027f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u5ea7'<'\\uE2D8'<'\\uE2D9'<'\\uE2DA'<'\\uE2DB'<'\\uE2DC'<'\\u4e8d'",
575127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u5ea7<\\uE2D8<\\uE2D9<\\uE2DA<\\uE2DB<\\uE2DC<\\u4e8d",
575227f654740f2a26ad62a5c155af9199af9e69b889claireho  };
575327f654740f2a26ad62a5c155af9199af9e69b889claireho
575427f654740f2a26ad62a5c155af9199af9e69b889claireho  const static OneTestCase privateUseCharacterStrings[] = {
575527f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x5ea7}, {0xe2d8}, UCOL_LESS },
575627f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2d8}, {0xe2d9}, UCOL_LESS },
575727f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2d9}, {0xe2da}, UCOL_LESS },
575827f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2da}, {0xe2db}, UCOL_LESS },
575927f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2db}, {0xe2dc}, UCOL_LESS },
576027f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2dc}, {0x4e8d}, UCOL_LESS },
576127f654740f2a26ad62a5c155af9199af9e69b889claireho  };
576227f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
576327f654740f2a26ad62a5c155af9199af9e69b889claireho}
576427f654740f2a26ad62a5c155af9199af9e69b889claireho
576527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestPrivateUseCharactersInList(void)
576627f654740f2a26ad62a5c155af9199af9e69b889claireho{
576727f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
576827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* List */
576927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u5ea7'<*'\\uE2D8\\uE2D9\\uE2DA\\uE2DB\\uE2DC\\u4e8d'",
577027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* "&'\\u5ea7'<*\\uE2D8'\\uE2D9\\uE2DA'\\uE2DB'\\uE2DC\\u4e8d'", */
577127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u5ea7<*\\uE2D8\\uE2D9\\uE2DA\\uE2DB\\uE2DC\\u4e8d",
577227f654740f2a26ad62a5c155af9199af9e69b889claireho  };
577327f654740f2a26ad62a5c155af9199af9e69b889claireho
577427f654740f2a26ad62a5c155af9199af9e69b889claireho  const static OneTestCase privateUseCharacterStrings[] = {
577527f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x5ea7}, {0xe2d8}, UCOL_LESS },
577627f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2d8}, {0xe2d9}, UCOL_LESS },
577727f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2d9}, {0xe2da}, UCOL_LESS },
577827f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2da}, {0xe2db}, UCOL_LESS },
577927f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2db}, {0xe2dc}, UCOL_LESS },
578027f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2dc}, {0x4e8d}, UCOL_LESS },
578127f654740f2a26ad62a5c155af9199af9e69b889claireho  };
578227f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
578327f654740f2a26ad62a5c155af9199af9e69b889claireho}
578427f654740f2a26ad62a5c155af9199af9e69b889claireho
578527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestPrivateUseCharactersInRange(void)
578627f654740f2a26ad62a5c155af9199af9e69b889claireho{
578727f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* strRules[] = {
578827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Range */
578927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&'\\u5ea7'<*'\\uE2D8'-'\\uE2DC\\u4e8d'",
579027f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\u5ea7<*\\uE2D8-\\uE2DC\\u4e8d",
579127f654740f2a26ad62a5c155af9199af9e69b889claireho    /* "&\\u5ea7<\\uE2D8'\\uE2D8'-'\\uE2D9'\\uE2DA-\\uE2DB\\uE2DC\\u4e8d", */
579227f654740f2a26ad62a5c155af9199af9e69b889claireho  };
579327f654740f2a26ad62a5c155af9199af9e69b889claireho
579427f654740f2a26ad62a5c155af9199af9e69b889claireho  const static OneTestCase privateUseCharacterStrings[] = {
579527f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0x5ea7}, {0xe2d8}, UCOL_LESS },
579627f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2d8}, {0xe2d9}, UCOL_LESS },
579727f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2d9}, {0xe2da}, UCOL_LESS },
579827f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2da}, {0xe2db}, UCOL_LESS },
579927f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2db}, {0xe2dc}, UCOL_LESS },
580027f654740f2a26ad62a5c155af9199af9e69b889claireho    { {0xe2dc}, {0x4e8d}, UCOL_LESS },
580127f654740f2a26ad62a5c155af9199af9e69b889claireho  };
580227f654740f2a26ad62a5c155af9199af9e69b889claireho  doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
580327f654740f2a26ad62a5c155af9199af9e69b889claireho}
580427f654740f2a26ad62a5c155af9199af9e69b889claireho
580527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestInvalidListsAndRanges(void)
580627f654740f2a26ad62a5c155af9199af9e69b889claireho{
580727f654740f2a26ad62a5c155af9199af9e69b889claireho  const char* invalidRules[] = {
580827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Range not in starred expression */
580927f654740f2a26ad62a5c155af9199af9e69b889claireho    "&\\ufffe<\\uffff-\\U00010002",
581027f654740f2a26ad62a5c155af9199af9e69b889claireho
581127f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Range without start */
581227f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<*-c",
581327f654740f2a26ad62a5c155af9199af9e69b889claireho
581427f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Range without end */
581527f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<*b-",
581627f654740f2a26ad62a5c155af9199af9e69b889claireho
581727f654740f2a26ad62a5c155af9199af9e69b889claireho    /* More than one hyphen */
581827f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<*b-g-l",
581927f654740f2a26ad62a5c155af9199af9e69b889claireho
582027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Range in the wrong order */
582127f654740f2a26ad62a5c155af9199af9e69b889claireho    "&a<*k-b",
582227f654740f2a26ad62a5c155af9199af9e69b889claireho
582327f654740f2a26ad62a5c155af9199af9e69b889claireho  };
582427f654740f2a26ad62a5c155af9199af9e69b889claireho
582527f654740f2a26ad62a5c155af9199af9e69b889claireho  UChar rule[500];
582627f654740f2a26ad62a5c155af9199af9e69b889claireho  UErrorCode status = U_ZERO_ERROR;
582727f654740f2a26ad62a5c155af9199af9e69b889claireho  UParseError parse_error;
582827f654740f2a26ad62a5c155af9199af9e69b889claireho  int n_rules = LEN(invalidRules);
582927f654740f2a26ad62a5c155af9199af9e69b889claireho  int rule_no;
583027f654740f2a26ad62a5c155af9199af9e69b889claireho  int length;
583127f654740f2a26ad62a5c155af9199af9e69b889claireho  UCollator  *myCollation;
583227f654740f2a26ad62a5c155af9199af9e69b889claireho
583327f654740f2a26ad62a5c155af9199af9e69b889claireho  for (rule_no = 0; rule_no < n_rules; ++rule_no) {
583427f654740f2a26ad62a5c155af9199af9e69b889claireho
583527f654740f2a26ad62a5c155af9199af9e69b889claireho    length = u_unescape(invalidRules[rule_no], rule, 500);
583627f654740f2a26ad62a5c155af9199af9e69b889claireho    if (length == 0) {
583727f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("ERROR: The rule cannot be unescaped: %s\n");
583827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
583927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
584027f654740f2a26ad62a5c155af9199af9e69b889claireho    myCollation = ucol_openRules(rule, length, UCOL_ON, UCOL_TERTIARY, &parse_error, &status);
584127f654740f2a26ad62a5c155af9199af9e69b889claireho    if(!U_FAILURE(status)){
584227f654740f2a26ad62a5c155af9199af9e69b889claireho      log_err("ERROR: Could not cause a failure as expected: \n");
584327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
584427f654740f2a26ad62a5c155af9199af9e69b889claireho    status = U_ZERO_ERROR;
584527f654740f2a26ad62a5c155af9199af9e69b889claireho  }
584627f654740f2a26ad62a5c155af9199af9e69b889claireho}
584727f654740f2a26ad62a5c155af9199af9e69b889claireho
584827f654740f2a26ad62a5c155af9199af9e69b889claireho/*
584927f654740f2a26ad62a5c155af9199af9e69b889claireho * This test ensures that characters placed before a character in a different script have the same lead byte
585027f654740f2a26ad62a5c155af9199af9e69b889claireho * in their collation key before and after script reordering.
585127f654740f2a26ad62a5c155af9199af9e69b889claireho */
585227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestBeforeRuleWithScriptReordering(void)
585327f654740f2a26ad62a5c155af9199af9e69b889claireho{
585450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UParseError error;
585550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
585650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCollator  *myCollation;
585727f654740f2a26ad62a5c155af9199af9e69b889claireho    char srules[500] = "&[before 1]\\u03b1 < \\u0e01";
585827f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar rules[500];
585927f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t rulesLength = 0;
586027f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t reorderCodes[1] = {USCRIPT_GREEK};
586127f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollationResult collResult;
586250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
586327f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t baseKey[256];
586427f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t baseKeyLength;
586527f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t beforeKey[256];
586627f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t beforeKeyLength;
586727f654740f2a26ad62a5c155af9199af9e69b889claireho
586827f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar base[] = { 0x03b1 }; /* base */
586927f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t baseLen = sizeof(base)/sizeof(*base);
587027f654740f2a26ad62a5c155af9199af9e69b889claireho
587127f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar before[] = { 0x0e01 }; /* ko kai */
587227f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t beforeLen = sizeof(before)/sizeof(*before);
587327f654740f2a26ad62a5c155af9199af9e69b889claireho
587427f654740f2a26ad62a5c155af9199af9e69b889claireho    /*UChar *data[] = { before, base };
587527f654740f2a26ad62a5c155af9199af9e69b889claireho    genericRulesStarter(srules, data, 2);*/
587627f654740f2a26ad62a5c155af9199af9e69b889claireho
587727f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing the &[before 1] rule with [reorder grek]\n");
587827f654740f2a26ad62a5c155af9199af9e69b889claireho
587927f654740f2a26ad62a5c155af9199af9e69b889claireho
588027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* build collator */
588127f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing the &[before 1] rule with [scriptReorder grek]\n");
588227f654740f2a26ad62a5c155af9199af9e69b889claireho
588327f654740f2a26ad62a5c155af9199af9e69b889claireho    rulesLength = u_unescape(srules, rules, LEN(rules));
588427f654740f2a26ad62a5c155af9199af9e69b889claireho    myCollation = ucol_openRules(rules, rulesLength, UCOL_ON, UCOL_TERTIARY, &error, &status);
588527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
588650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
588750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
588850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
588927f654740f2a26ad62a5c155af9199af9e69b889claireho
589027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* check collation results - before rule applied but not script reordering */
589127f654740f2a26ad62a5c155af9199af9e69b889claireho    collResult = ucol_strcoll(myCollation, base, baseLen, before, beforeLen);
589227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (collResult != UCOL_GREATER) {
589327f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Collation result not correct before script reordering = %d\n", collResult);
589427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
589527f654740f2a26ad62a5c155af9199af9e69b889claireho
589627f654740f2a26ad62a5c155af9199af9e69b889claireho    /* check the lead byte of the collation keys before script reordering */
589727f654740f2a26ad62a5c155af9199af9e69b889claireho    baseKeyLength = ucol_getSortKey(myCollation, base, baseLen, baseKey, 256);
589827f654740f2a26ad62a5c155af9199af9e69b889claireho    beforeKeyLength = ucol_getSortKey(myCollation, before, beforeLen, beforeKey, 256);
589927f654740f2a26ad62a5c155af9199af9e69b889claireho    if (baseKey[0] != beforeKey[0]) {
590027f654740f2a26ad62a5c155af9199af9e69b889claireho      log_err("Different lead byte for sort keys using before rule and before script reordering. base character lead byte = %02x, before character lead byte = %02x\n", baseKey[0], beforeKey[0]);
590127f654740f2a26ad62a5c155af9199af9e69b889claireho   }
590227f654740f2a26ad62a5c155af9199af9e69b889claireho
590327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* reorder the scripts */
590427f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setReorderCodes(myCollation, reorderCodes, 1, &status);
590527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
590627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: while setting script order: %s\n", myErrorName(status));
590727f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
590827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
590927f654740f2a26ad62a5c155af9199af9e69b889claireho
591027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* check collation results - before rule applied and after script reordering */
591127f654740f2a26ad62a5c155af9199af9e69b889claireho    collResult = ucol_strcoll(myCollation, base, baseLen, before, beforeLen);
591227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (collResult != UCOL_GREATER) {
591327f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Collation result not correct after script reordering = %d\n", collResult);
591427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
591527f654740f2a26ad62a5c155af9199af9e69b889claireho
591627f654740f2a26ad62a5c155af9199af9e69b889claireho    /* check the lead byte of the collation keys after script reordering */
591727f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_getSortKey(myCollation, base, baseLen, baseKey, 256);
591827f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_getSortKey(myCollation, before, beforeLen, beforeKey, 256);
591927f654740f2a26ad62a5c155af9199af9e69b889claireho    if (baseKey[0] != beforeKey[0]) {
592027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Different lead byte for sort keys using before fule and after script reordering. base character lead byte = %02x, before character lead byte = %02x\n", baseKey[0], beforeKey[0]);
592150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
592227f654740f2a26ad62a5c155af9199af9e69b889claireho
592350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ucol_close(myCollation);
592450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
592550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
592627f654740f2a26ad62a5c155af9199af9e69b889claireho/*
592727f654740f2a26ad62a5c155af9199af9e69b889claireho * Test that in a primary-compressed sort key all bytes except the first one are unchanged under script reordering.
592827f654740f2a26ad62a5c155af9199af9e69b889claireho */
592927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNonLeadBytesDuringCollationReordering(void)
593027f654740f2a26ad62a5c155af9199af9e69b889claireho{
593127f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
593227f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator  *myCollation;
593327f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t reorderCodes[1] = {USCRIPT_GREEK};
593427f654740f2a26ad62a5c155af9199af9e69b889claireho
593527f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t baseKey[256];
593627f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t baseKeyLength;
593727f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t reorderKey[256];
593827f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t reorderKeyLength;
593927f654740f2a26ad62a5c155af9199af9e69b889claireho
594027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar testString[] = { 0x03b1, 0x03b2, 0x03b3 };
594127f654740f2a26ad62a5c155af9199af9e69b889claireho
5942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    uint32_t i;
594327f654740f2a26ad62a5c155af9199af9e69b889claireho
594427f654740f2a26ad62a5c155af9199af9e69b889claireho
594527f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing non-lead bytes in a sort key with and without reordering\n");
594627f654740f2a26ad62a5c155af9199af9e69b889claireho
594727f654740f2a26ad62a5c155af9199af9e69b889claireho    /* build collator tertiary */
594827f654740f2a26ad62a5c155af9199af9e69b889claireho    myCollation = ucol_open("", &status);
594927f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setStrength(myCollation, UCOL_TERTIARY);
595027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
595127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
595227f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
595327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
595427f654740f2a26ad62a5c155af9199af9e69b889claireho    baseKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), baseKey, 256);
595527f654740f2a26ad62a5c155af9199af9e69b889claireho
595627f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status);
595727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
595827f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status));
595927f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
596027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
596127f654740f2a26ad62a5c155af9199af9e69b889claireho    reorderKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), reorderKey, 256);
596227f654740f2a26ad62a5c155af9199af9e69b889claireho
596327f654740f2a26ad62a5c155af9199af9e69b889claireho    if (baseKeyLength != reorderKeyLength) {
5964b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("Key lengths not the same during reordering.\n");
596527f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
596627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
596727f654740f2a26ad62a5c155af9199af9e69b889claireho
596827f654740f2a26ad62a5c155af9199af9e69b889claireho    for (i = 1; i < baseKeyLength; i++) {
596927f654740f2a26ad62a5c155af9199af9e69b889claireho        if (baseKey[i] != reorderKey[i]) {
597027f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("Collation key bytes not the same at position %d.\n", i);
597127f654740f2a26ad62a5c155af9199af9e69b889claireho            return;
597227f654740f2a26ad62a5c155af9199af9e69b889claireho        }
597327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
597427f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(myCollation);
597527f654740f2a26ad62a5c155af9199af9e69b889claireho
597627f654740f2a26ad62a5c155af9199af9e69b889claireho    /* build collator quaternary */
597727f654740f2a26ad62a5c155af9199af9e69b889claireho    myCollation = ucol_open("", &status);
597827f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setStrength(myCollation, UCOL_QUATERNARY);
597927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
598027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
598127f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
598227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
598327f654740f2a26ad62a5c155af9199af9e69b889claireho    baseKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), baseKey, 256);
598427f654740f2a26ad62a5c155af9199af9e69b889claireho
598527f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status);
598627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
598727f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status));
598827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
598927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
599027f654740f2a26ad62a5c155af9199af9e69b889claireho    reorderKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), reorderKey, 256);
599127f654740f2a26ad62a5c155af9199af9e69b889claireho
599227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (baseKeyLength != reorderKeyLength) {
5993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("Key lengths not the same during reordering.\n");
599427f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
599527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
599627f654740f2a26ad62a5c155af9199af9e69b889claireho
599727f654740f2a26ad62a5c155af9199af9e69b889claireho    for (i = 1; i < baseKeyLength; i++) {
599827f654740f2a26ad62a5c155af9199af9e69b889claireho        if (baseKey[i] != reorderKey[i]) {
599927f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("Collation key bytes not the same at position %d.\n", i);
600027f654740f2a26ad62a5c155af9199af9e69b889claireho            return;
600127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
600227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
600327f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(myCollation);
600427f654740f2a26ad62a5c155af9199af9e69b889claireho}
600527f654740f2a26ad62a5c155af9199af9e69b889claireho
600627f654740f2a26ad62a5c155af9199af9e69b889claireho/*
600727f654740f2a26ad62a5c155af9199af9e69b889claireho * Test reordering API.
600827f654740f2a26ad62a5c155af9199af9e69b889claireho */
600927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestReorderingAPI(void)
601027f654740f2a26ad62a5c155af9199af9e69b889claireho{
601127f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
601227f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator  *myCollation;
601327f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t reorderCodes[3] = {USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION};
6014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t duplicateReorderCodes[] = {USCRIPT_CUNEIFORM, USCRIPT_GREEK, UCOL_REORDER_CODE_CURRENCY, USCRIPT_EGYPTIAN_HIEROGLYPHS};
6015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t reorderCodesStartingWithDefault[] = {UCOL_REORDER_CODE_DEFAULT, USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION};
601627f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollationResult collResult;
601727f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t retrievedReorderCodesLength;
6018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t retrievedReorderCodes[10];
601927f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar greekString[] = { 0x03b1 };
602027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar punctuationString[] = { 0x203e };
6021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int loopIndex;
602227f654740f2a26ad62a5c155af9199af9e69b889claireho
602327f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing non-lead bytes in a sort key with and without reordering\n");
602427f654740f2a26ad62a5c155af9199af9e69b889claireho
602527f654740f2a26ad62a5c155af9199af9e69b889claireho    /* build collator tertiary */
602627f654740f2a26ad62a5c155af9199af9e69b889claireho    myCollation = ucol_open("", &status);
602727f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setStrength(myCollation, UCOL_TERTIARY);
602827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)) {
602927f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
603027f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
603127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
603227f654740f2a26ad62a5c155af9199af9e69b889claireho
603327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* set the reorderding */
603427f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status);
603527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(status)) {
603627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status));
603727f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
603827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
603927f654740f2a26ad62a5c155af9199af9e69b889claireho
6040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* get the reordering */
604127f654740f2a26ad62a5c155af9199af9e69b889claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status);
604227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (status != U_BUFFER_OVERFLOW_ERROR) {
604327f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: getting error codes should have returned U_BUFFER_OVERFLOW_ERROR : %s\n", myErrorName(status));
604427f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
604527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
604627f654740f2a26ad62a5c155af9199af9e69b889claireho    status = U_ZERO_ERROR;
604727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (retrievedReorderCodesLength != LEN(reorderCodes)) {
604827f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes));
604927f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
605027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
6051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* now let's really get it */
6052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status);
6053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status));
6055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (retrievedReorderCodesLength != LEN(reorderCodes)) {
6058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes));
6059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) {
6062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (retrievedReorderCodes[loopIndex] != reorderCodes[loopIndex]) {
6063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex);
6064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
6065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
6066b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
606727f654740f2a26ad62a5c155af9199af9e69b889claireho    collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString));
606827f654740f2a26ad62a5c155af9199af9e69b889claireho    if (collResult != UCOL_LESS) {
606927f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: collation result should have been UCOL_LESS\n");
607027f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
607127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
607227f654740f2a26ad62a5c155af9199af9e69b889claireho
607327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* clear the reordering */
607427f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_setReorderCodes(myCollation, NULL, 0, &status);
607527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(status)) {
607627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: setting reorder codes to NULL: %s\n", myErrorName(status));
607727f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
607827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
607927f654740f2a26ad62a5c155af9199af9e69b889claireho
6080b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* get the reordering again */
608127f654740f2a26ad62a5c155af9199af9e69b889claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status);
608227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (retrievedReorderCodesLength != 0) {
608327f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, 0);
608427f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
608527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
608627f654740f2a26ad62a5c155af9199af9e69b889claireho
608727f654740f2a26ad62a5c155af9199af9e69b889claireho    collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString));
608827f654740f2a26ad62a5c155af9199af9e69b889claireho    if (collResult != UCOL_GREATER) {
608927f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: collation result should have been UCOL_GREATER\n");
609027f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
609127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
609227f654740f2a26ad62a5c155af9199af9e69b889claireho
6093b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test for error condition on duplicate reorder codes */
6094b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setReorderCodes(myCollation, duplicateReorderCodes, LEN(duplicateReorderCodes), &status);
6095b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (!U_FAILURE(status)) {
6096b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: setting duplicate reorder codes did not generate a failure\n");
6097b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6098b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
6101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test for reorder codes after a reset code */
6102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setReorderCodes(myCollation, reorderCodesStartingWithDefault, LEN(reorderCodesStartingWithDefault), &status);
6103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (!U_FAILURE(status)) {
6104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: reorderd code sequence starting with default and having following codes didn't cause an error\n");
6105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
610827f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(myCollation);
610927f654740f2a26ad62a5c155af9199af9e69b889claireho}
611027f654740f2a26ad62a5c155af9199af9e69b889claireho
611127f654740f2a26ad62a5c155af9199af9e69b889claireho/*
6112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Test reordering API.
611327f654740f2a26ad62a5c155af9199af9e69b889claireho */
6114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestReorderingAPIWithRuleCreatedCollator(void)
611527f654740f2a26ad62a5c155af9199af9e69b889claireho{
611627f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
611727f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator  *myCollation;
6118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar rules[90];
6119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t rulesReorderCodes[2] = {USCRIPT_HAN, USCRIPT_GREEK};
6120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t reorderCodes[3] = {USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION};
6121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollationResult collResult;
6122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t retrievedReorderCodesLength;
6123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t retrievedReorderCodes[10];
6124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar greekString[] = { 0x03b1 };
6125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar punctuationString[] = { 0x203e };
6126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar hanString[] = { 0x65E5, 0x672C };
6127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int loopIndex;
612827f654740f2a26ad62a5c155af9199af9e69b889claireho
6129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("Testing non-lead bytes in a sort key with and without reordering\n");
6130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* build collator from rules */
6132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    u_uastrcpy(rules, "[reorder Hani Grek]");
6133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    myCollation = ucol_openRules(rules, u_strlen(rules), UCOL_DEFAULT, UCOL_TERTIARY, NULL, &status);
6134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(status)) {
6135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
6136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* get the reordering */
6140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status);
6141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status));
6143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (retrievedReorderCodesLength != LEN(rulesReorderCodes)) {
6146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(rulesReorderCodes));
6147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) {
6150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (retrievedReorderCodes[loopIndex] != rulesReorderCodes[loopIndex]) {
6151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex);
615227f654740f2a26ad62a5c155af9199af9e69b889claireho            return;
615327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
6154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), hanString, LEN(hanString));
6156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (collResult != UCOL_GREATER) {
6157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: collation result should have been UCOL_LESS\n");
6158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* set the reorderding */
6163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status);
6164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status));
6166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* get the reordering */
6170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status);
6171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (status != U_BUFFER_OVERFLOW_ERROR) {
6172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: getting error codes should have returned U_BUFFER_OVERFLOW_ERROR : %s\n", myErrorName(status));
6173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
6176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (retrievedReorderCodesLength != LEN(reorderCodes)) {
6177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes));
6178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* now let's really get it */
6181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status);
6182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status));
6184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (retrievedReorderCodesLength != LEN(reorderCodes)) {
6187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes));
6188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) {
6191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (retrievedReorderCodes[loopIndex] != reorderCodes[loopIndex]) {
6192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex);
619327f654740f2a26ad62a5c155af9199af9e69b889claireho            return;
619427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
6195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString));
6197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (collResult != UCOL_LESS) {
6198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: collation result should have been UCOL_LESS\n");
6199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* clear the reordering */
6203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setReorderCodes(myCollation, NULL, 0, &status);
6204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: setting reorder codes to NULL: %s\n", myErrorName(status));
6206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* get the reordering again */
6210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status);
6211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (retrievedReorderCodesLength != 0) {
6212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, 0);
6213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString));
6217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (collResult != UCOL_GREATER) {
6218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: collation result should have been UCOL_GREATER\n");
6219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_close(myCollation);
6223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
6224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic int compareUScriptCodes(const void * a, const void * b)
6226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
6227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  return ( *(int32_t*)a - *(int32_t*)b );
6228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
6229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestEquivalentReorderingScripts(void) {
6231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
6232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t equivalentScripts[50];
6233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t equivalentScriptsLength;
6234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int loopIndex;
6235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t equivalentScriptsResult[] = {
6236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_BOPOMOFO,
6237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_LISU,
6238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_LYCIAN,
6239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_CARIAN,
6240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_LYDIAN,
6241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_YI,
6242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_OLD_ITALIC,
6243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_GOTHIC,
6244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_DESERET,
6245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_SHAVIAN,
6246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_OSMANYA,
6247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_LINEAR_B,
6248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_CYPRIOT,
6249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_OLD_SOUTH_ARABIAN,
6250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_AVESTAN,
6251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_IMPERIAL_ARAMAIC,
6252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_INSCRIPTIONAL_PARTHIAN,
6253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_INSCRIPTIONAL_PAHLAVI,
6254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_UGARITIC,
6255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_OLD_PERSIAN,
6256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_CUNEIFORM,
6257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        USCRIPT_EGYPTIAN_HIEROGLYPHS,
6258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        USCRIPT_PHONETIC_POLLARD,
6259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        USCRIPT_SORA_SOMPENG,
6260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        USCRIPT_MEROITIC_CURSIVE,
6261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        USCRIPT_MEROITIC_HIEROGLYPHS
6262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
6263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    qsort(equivalentScriptsResult, LEN(equivalentScriptsResult), sizeof(int32_t), compareUScriptCodes);
6265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* UScript.GOTHIC */
6267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    equivalentScriptsLength = ucol_getEquivalentReorderCodes(USCRIPT_GOTHIC, equivalentScripts, LEN(equivalentScripts), &status);
6268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieving equivalent reorder codes: %s\n", myErrorName(status));
6270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*
6273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    fprintf(stdout, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
6274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    fprintf(stdout, "equivalentScriptsLength = %d\n", equivalentScriptsLength);
6275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < equivalentScriptsLength; loopIndex++) {
6276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        fprintf(stdout, "%d = %x\n", loopIndex, equivalentScripts[loopIndex]);
6277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    */
6279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (equivalentScriptsLength != LEN(equivalentScriptsResult)) {
6280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved equivalent script length wrong: expected = %d, was = %d\n", LEN(equivalentScriptsResult), equivalentScriptsLength);
6281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < equivalentScriptsLength; loopIndex++) {
6284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (equivalentScriptsResult[loopIndex] != equivalentScripts[loopIndex]) {
6285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR: equivalent scripts results don't match: expected = %d, was = %d\n", equivalentScriptsResult[loopIndex], equivalentScripts[loopIndex]);
6286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
6287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
6288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* UScript.SHAVIAN */
6291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    equivalentScriptsLength = ucol_getEquivalentReorderCodes(USCRIPT_SHAVIAN, equivalentScripts, LEN(equivalentScripts), &status);
6292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieving equivalent reorder codes: %s\n", myErrorName(status));
6294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (equivalentScriptsLength != LEN(equivalentScriptsResult)) {
6297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved equivalent script length wrong: expected = %d, was = %d\n", LEN(equivalentScriptsResult), equivalentScriptsLength);
6298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < equivalentScriptsLength; loopIndex++) {
6301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (equivalentScriptsResult[loopIndex] != equivalentScripts[loopIndex]) {
6302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR: equivalent scripts results don't match: expected = %d, was = %d\n", equivalentScriptsResult[loopIndex], equivalentScripts[loopIndex]);
6303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
630427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
630527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
630627f654740f2a26ad62a5c155af9199af9e69b889claireho}
630727f654740f2a26ad62a5c155af9199af9e69b889claireho
6308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestReorderingAcrossCloning(void)
6309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
6310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
6311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollator  *myCollation;
6312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t reorderCodes[3] = {USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION};
6313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollator *clonedCollation;
6314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t bufferSize;
6315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t retrievedReorderCodesLength;
6316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t retrievedReorderCodes[10];
6317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int loopIndex;
6318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("Testing non-lead bytes in a sort key with and without reordering\n");
6320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* build collator tertiary */
6322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    myCollation = ucol_open("", &status);
6323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setStrength(myCollation, UCOL_TERTIARY);
6324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(status)) {
6325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
6326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* set the reorderding */
6330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status);
6331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status));
6333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* clone the collator */
6337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    clonedCollation = ucol_safeClone(myCollation, NULL, &bufferSize, &status);
6338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: cloning collator: %s\n", myErrorName(status));
6340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* get the reordering */
6344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    retrievedReorderCodesLength = ucol_getReorderCodes(clonedCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status);
6345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status));
6347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (retrievedReorderCodesLength != LEN(reorderCodes)) {
6350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes));
6351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) {
6354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (retrievedReorderCodes[loopIndex] != reorderCodes[loopIndex]) {
6355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex);
6356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
6357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
6358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*uprv_free(buffer);*/
6361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_close(myCollation);
6362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_close(clonedCollation);
6363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
6364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
6366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Utility function to test one collation reordering test case set.
6367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param testcases Array of test cases.
6368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param n_testcases Size of the array testcases.
6369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param reorderTokens Array of reordering codes.
6370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param reorderTokensLen Size of the array reorderTokens.
6371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
6372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void doTestOneReorderingAPITestCase(const OneTestCase testCases[], uint32_t testCasesLen, const int32_t reorderTokens[], int32_t reorderTokensLen)
6373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
6374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    uint32_t testCaseNum;
6375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
6376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollator  *myCollation;
6377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    myCollation = ucol_open("", &status);
6379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
6380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
6381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_setReorderCodes(myCollation, reorderTokens, reorderTokensLen, &status);
6384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(status)) {
6385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR: while setting script order: %s\n", myErrorName(status));
6386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
6387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (testCaseNum = 0; testCaseNum < testCasesLen; ++testCaseNum) {
6390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        doTest(myCollation,
6391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            testCases[testCaseNum].source,
6392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            testCases[testCaseNum].target,
6393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            testCases[testCaseNum].result
6394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        );
6395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
6396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_close(myCollation);
6397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
6398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
639927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestGreekFirstReorder(void)
640027f654740f2a26ad62a5c155af9199af9e69b889claireho{
640127f654740f2a26ad62a5c155af9199af9e69b889claireho    const char* strRules[] = {
640227f654740f2a26ad62a5c155af9199af9e69b889claireho        "[reorder Grek]"
640327f654740f2a26ad62a5c155af9199af9e69b889claireho    };
640427f654740f2a26ad62a5c155af9199af9e69b889claireho
640527f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t apiRules[] = {
640627f654740f2a26ad62a5c155af9199af9e69b889claireho        USCRIPT_GREEK
640727f654740f2a26ad62a5c155af9199af9e69b889claireho    };
640827f654740f2a26ad62a5c155af9199af9e69b889claireho
640927f654740f2a26ad62a5c155af9199af9e69b889claireho    const static OneTestCase privateUseCharacterStrings[] = {
641027f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0391}, {0x0391}, UCOL_EQUAL },
641127f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0041}, {0x0391}, UCOL_GREATER },
641227f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x03B1, 0x0041}, {0x03B1, 0x0391}, UCOL_GREATER },
641327f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0060}, {0x0391}, UCOL_LESS },
641427f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0391}, {0xe2dc}, UCOL_LESS },
641527f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0391}, {0x0060}, UCOL_GREATER },
641627f654740f2a26ad62a5c155af9199af9e69b889claireho    };
641727f654740f2a26ad62a5c155af9199af9e69b889claireho
641827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test rules creation */
641927f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
642027f654740f2a26ad62a5c155af9199af9e69b889claireho
642127f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test collation reordering API */
642227f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules));
642327f654740f2a26ad62a5c155af9199af9e69b889claireho}
642427f654740f2a26ad62a5c155af9199af9e69b889claireho
642527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestGreekLastReorder(void)
642627f654740f2a26ad62a5c155af9199af9e69b889claireho{
642727f654740f2a26ad62a5c155af9199af9e69b889claireho    const char* strRules[] = {
642827f654740f2a26ad62a5c155af9199af9e69b889claireho        "[reorder Zzzz Grek]"
642927f654740f2a26ad62a5c155af9199af9e69b889claireho    };
643027f654740f2a26ad62a5c155af9199af9e69b889claireho
643127f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t apiRules[] = {
643227f654740f2a26ad62a5c155af9199af9e69b889claireho        USCRIPT_UNKNOWN, USCRIPT_GREEK
643327f654740f2a26ad62a5c155af9199af9e69b889claireho    };
643427f654740f2a26ad62a5c155af9199af9e69b889claireho
643527f654740f2a26ad62a5c155af9199af9e69b889claireho    const static OneTestCase privateUseCharacterStrings[] = {
643627f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0391}, {0x0391}, UCOL_EQUAL },
643727f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0041}, {0x0391}, UCOL_LESS },
643827f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x03B1, 0x0041}, {0x03B1, 0x0391}, UCOL_LESS },
643927f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0060}, {0x0391}, UCOL_LESS },
644027f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0391}, {0xe2dc}, UCOL_GREATER },
644127f654740f2a26ad62a5c155af9199af9e69b889claireho    };
644227f654740f2a26ad62a5c155af9199af9e69b889claireho
644327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test rules creation */
644427f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
644527f654740f2a26ad62a5c155af9199af9e69b889claireho
644627f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test collation reordering API */
644727f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules));
644827f654740f2a26ad62a5c155af9199af9e69b889claireho}
644927f654740f2a26ad62a5c155af9199af9e69b889claireho
645027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNonScriptReorder(void)
645127f654740f2a26ad62a5c155af9199af9e69b889claireho{
645227f654740f2a26ad62a5c155af9199af9e69b889claireho    const char* strRules[] = {
645327f654740f2a26ad62a5c155af9199af9e69b889claireho        "[reorder Grek Symbol DIGIT Latn Punct space Zzzz cURRENCy]"
645427f654740f2a26ad62a5c155af9199af9e69b889claireho    };
645527f654740f2a26ad62a5c155af9199af9e69b889claireho
645627f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t apiRules[] = {
645727f654740f2a26ad62a5c155af9199af9e69b889claireho        USCRIPT_GREEK, UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_DIGIT, USCRIPT_LATIN,
645827f654740f2a26ad62a5c155af9199af9e69b889claireho        UCOL_REORDER_CODE_PUNCTUATION, UCOL_REORDER_CODE_SPACE, USCRIPT_UNKNOWN,
645927f654740f2a26ad62a5c155af9199af9e69b889claireho        UCOL_REORDER_CODE_CURRENCY
646027f654740f2a26ad62a5c155af9199af9e69b889claireho    };
646127f654740f2a26ad62a5c155af9199af9e69b889claireho
646227f654740f2a26ad62a5c155af9199af9e69b889claireho    const static OneTestCase privateUseCharacterStrings[] = {
646327f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0391}, {0x0041}, UCOL_LESS },
646427f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0041}, {0x0391}, UCOL_GREATER },
646527f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0060}, {0x0041}, UCOL_LESS },
646627f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0060}, {0x0391}, UCOL_GREATER },
646727f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x0024}, {0x0041}, UCOL_GREATER },
646827f654740f2a26ad62a5c155af9199af9e69b889claireho    };
646927f654740f2a26ad62a5c155af9199af9e69b889claireho
647027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test rules creation */
647127f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
647227f654740f2a26ad62a5c155af9199af9e69b889claireho
647327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test collation reordering API */
647427f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules));
647527f654740f2a26ad62a5c155af9199af9e69b889claireho}
647627f654740f2a26ad62a5c155af9199af9e69b889claireho
647727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestHaniReorder(void)
647827f654740f2a26ad62a5c155af9199af9e69b889claireho{
647927f654740f2a26ad62a5c155af9199af9e69b889claireho    const char* strRules[] = {
648027f654740f2a26ad62a5c155af9199af9e69b889claireho        "[reorder Hani]"
648127f654740f2a26ad62a5c155af9199af9e69b889claireho    };
648227f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t apiRules[] = {
648327f654740f2a26ad62a5c155af9199af9e69b889claireho        USCRIPT_HAN
648427f654740f2a26ad62a5c155af9199af9e69b889claireho    };
648527f654740f2a26ad62a5c155af9199af9e69b889claireho
648627f654740f2a26ad62a5c155af9199af9e69b889claireho    const static OneTestCase privateUseCharacterStrings[] = {
648727f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x4e00}, {0x0041}, UCOL_LESS },
648827f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x4e00}, {0x0060}, UCOL_GREATER },
648927f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0xD86D, 0xDF40}, {0x0041}, UCOL_LESS },
649027f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0xD86D, 0xDF40}, {0x0060}, UCOL_GREATER },
649127f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0x4e00}, {0xD86D, 0xDF40}, UCOL_LESS },
649227f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0xfa27}, {0x0041}, UCOL_LESS },
649327f654740f2a26ad62a5c155af9199af9e69b889claireho        { {0xD869, 0xDF00}, {0x0041}, UCOL_LESS },
649427f654740f2a26ad62a5c155af9199af9e69b889claireho    };
649527f654740f2a26ad62a5c155af9199af9e69b889claireho
649627f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test rules creation */
649727f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
649827f654740f2a26ad62a5c155af9199af9e69b889claireho
649927f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Test collation reordering API */
650027f654740f2a26ad62a5c155af9199af9e69b889claireho    doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules));
650127f654740f2a26ad62a5c155af9199af9e69b889claireho}
650227f654740f2a26ad62a5c155af9199af9e69b889claireho
6503103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestHaniReorderWithOtherRules(void)
6504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
6505103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const char* strRules[] = {
6506103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "[reorder Hani] &b<a"
6507103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    };
650854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /*const int32_t apiRules[] = {
6509103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        USCRIPT_HAN
651054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    };*/
6511103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6512103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const static OneTestCase privateUseCharacterStrings[] = {
6513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0x4e00}, {0x0041}, UCOL_LESS },
6514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0x4e00}, {0x0060}, UCOL_GREATER },
6515103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0xD86D, 0xDF40}, {0x0041}, UCOL_LESS },
6516103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0xD86D, 0xDF40}, {0x0060}, UCOL_GREATER },
6517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0x4e00}, {0xD86D, 0xDF40}, UCOL_LESS },
6518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0xfa27}, {0x0041}, UCOL_LESS },
6519103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0xD869, 0xDF00}, {0x0041}, UCOL_LESS },
6520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        { {0x0062}, {0x0061}, UCOL_LESS },
6521103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    };
6522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Test rules creation */
6524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules));
6525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
6526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestMultipleReorder(void)
6528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
6529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char* strRules[] = {
6530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "[reorder Grek Zzzz DIGIT Latn Hani]"
6531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
6532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t apiRules[] = {
6534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        USCRIPT_GREEK, USCRIPT_UNKNOWN, UCOL_REORDER_CODE_DIGIT, USCRIPT_LATIN, USCRIPT_HAN
6535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
6536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const static OneTestCase collationTestCases[] = {
6538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        { {0x0391}, {0x0041}, UCOL_LESS},
6539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        { {0x0031}, {0x0041}, UCOL_LESS},
6540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        { {0x0041}, {0x4e00}, UCOL_LESS},
6541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
6542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Test rules creation */
6544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    doTestOneTestCase(collationTestCases, LEN(collationTestCases), strRules, LEN(strRules));
6545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Test collation reordering API */
6547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    doTestOneReorderingAPITestCase(collationTestCases, LEN(collationTestCases), apiRules, LEN(apiRules));
6548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
6549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6550103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*
6551103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Test that covers issue reported in ticket 8814
6552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
655354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestReorderWithNumericCollation(void)
6554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
6555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
6556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UCollator  *myCollation;
6557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UCollator  *myReorderCollation;
6558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t reorderCodes[] = {UCOL_REORDER_CODE_SPACE, UCOL_REORDER_CODE_PUNCTUATION, UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_DIGIT, USCRIPT_GREEK,USCRIPT_LATIN, USCRIPT_HEBREW, UCOL_REORDER_CODE_OTHERS};
6559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* UChar fortyS[] = { 0x0034, 0x0030, 0x0053 };
6560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar fortyThreeP[] = { 0x0034, 0x0033, 0x0050 }; */
6561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar fortyS[] = { 0x0053 };
6562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar fortyThreeP[] = { 0x0050 };
6563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    uint8_t fortyS_sortKey[128];
6564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t fortyS_sortKey_Length;
6565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    uint8_t fortyThreeP_sortKey[128];
6566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t fortyThreeP_sortKey_Length;
6567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    uint8_t fortyS_sortKey_reorder[128];
6568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t fortyS_sortKey_reorder_Length;
6569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    uint8_t fortyThreeP_sortKey_reorder[128];
6570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t fortyThreeP_sortKey_reorder_Length;
6571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UCollationResult collResult;
6572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UCollationResult collResultReorder;
6573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    log_verbose("Testing reordering with and without numeric collation\n");
6575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* build collator tertiary with numeric */
6577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    myCollation = ucol_open("", &status);
6578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /*
6579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_setStrength(myCollation, UCOL_TERTIARY);
6580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    */
6581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_setAttribute(myCollation, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
6582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(status)) {
6583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
6584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
6585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
6586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* build collator tertiary with numeric and reordering */
6588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    myReorderCollation = ucol_open("", &status);
6589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /*
6590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_setStrength(myReorderCollation, UCOL_TERTIARY);
6591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    */
6592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_setAttribute(myReorderCollation, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
6593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_setReorderCodes(myReorderCollation, reorderCodes, LEN(reorderCodes), &status);
6594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(status)) {
6595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status));
6596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
6597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
6598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fortyS_sortKey_Length = ucol_getSortKey(myCollation, fortyS, LEN(fortyS), fortyS_sortKey, 128);
6600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fortyThreeP_sortKey_Length = ucol_getSortKey(myCollation, fortyThreeP, LEN(fortyThreeP), fortyThreeP_sortKey, 128);
6601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fortyS_sortKey_reorder_Length = ucol_getSortKey(myReorderCollation, fortyS, LEN(fortyS), fortyS_sortKey_reorder, 128);
6602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fortyThreeP_sortKey_reorder_Length = ucol_getSortKey(myReorderCollation, fortyThreeP, LEN(fortyThreeP), fortyThreeP_sortKey_reorder, 128);
6603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (fortyS_sortKey_Length < 0 || fortyThreeP_sortKey_Length < 0 || fortyS_sortKey_reorder_Length < 0 || fortyThreeP_sortKey_reorder_Length < 0) {
6605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(status, "ERROR: couldn't generate sort keys\n");
6606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
6607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
6608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    collResult = ucol_strcoll(myCollation, fortyS, LEN(fortyS), fortyThreeP, LEN(fortyThreeP));
6609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    collResultReorder = ucol_strcoll(myReorderCollation, fortyS, LEN(fortyS), fortyThreeP, LEN(fortyThreeP));
6610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /*
6611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fprintf(stderr, "\tcollResult = %x\n", collResult);
6612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fprintf(stderr, "\tcollResultReorder = %x\n", collResultReorder);
6613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fprintf(stderr, "\nfortyS\n");
6614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for (i = 0; i < fortyS_sortKey_Length; i++) {
6615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fprintf(stderr, "%x --- %x\n", fortyS_sortKey[i], fortyS_sortKey_reorder[i]);
6616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
6617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    fprintf(stderr, "\nfortyThreeP\n");
6618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for (i = 0; i < fortyThreeP_sortKey_Length; i++) {
6619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fprintf(stderr, "%x --- %x\n", fortyThreeP_sortKey[i], fortyThreeP_sortKey_reorder[i]);
6620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
6621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    */
6622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (collResult != collResultReorder) {
6623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(status, "ERROR: collation results should have been the same.\n");
6624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
6625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
6626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_close(myCollation);
6628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ucol_close(myReorderCollation);
6629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
6630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
663127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int compare_uint8_t_arrays(const uint8_t* a, const uint8_t* b)
663227f654740f2a26ad62a5c155af9199af9e69b889claireho{
663327f654740f2a26ad62a5c155af9199af9e69b889claireho  for (; *a == *b; ++a, ++b) {
663427f654740f2a26ad62a5c155af9199af9e69b889claireho    if (*a == 0) {
663527f654740f2a26ad62a5c155af9199af9e69b889claireho      return 0;
663627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
663727f654740f2a26ad62a5c155af9199af9e69b889claireho  }
663827f654740f2a26ad62a5c155af9199af9e69b889claireho  return (*a < *b ? -1 : 1);
663927f654740f2a26ad62a5c155af9199af9e69b889claireho}
664027f654740f2a26ad62a5c155af9199af9e69b889claireho
6641103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestImportRulesDeWithPhonebook(void)
6642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
6643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* normalRules[] = {
6644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<\\u00e6<\\u00c6<\\u00dc<\\u00fc",
6645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<<\\u00e6<<\\u00c6<<\\u00dc<<\\u00fc",
6646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<<\\u00e6<<<\\u00c6<<\\u00dc<<\\u00fc",
6647103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase normalTests[] = {
6649103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00e6}, {0x00c6}, UCOL_LESS},
6650103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00fc}, {0x00dc}, UCOL_GREATER},
6651103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6652103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* importRules[] = {
6654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<\\u00e6<\\u00c6<\\u00dc<\\u00fc[import de-u-co-phonebk]",
6655103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<<\\u00e6<<\\u00c6<<\\u00dc<<\\u00fc[import de-u-co-phonebk]",
6656103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<<\\u00e6<<<\\u00c6<<\\u00dc<<\\u00fc[import de-u-co-phonebk]",
6657103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase importTests[] = {
6659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00e6}, {0x00c6}, UCOL_LESS},
6660103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00fc}, {0x00dc}, UCOL_LESS},
6661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(normalTests, LEN(normalTests), normalRules, LEN(normalRules));
66648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  // BEGIN Android-remove. Android does not use rule-based collation0
66658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  // doTestOneTestCase(importTests, LEN(importTests), importRules, LEN(importRules));
66668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  // END Android-remove
6667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
6668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
666954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if 0
6670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestImportRulesFiWithEor(void)
6671103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
6672103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* DUCET. */
6673103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* defaultRules[] = {
6674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<b",                                    /* Dummy rule. */
6675103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase defaultTests[] = {
6678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0110}, {0x00F0}, UCOL_LESS},
6679103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00a3}, {0x00a5}, UCOL_LESS},
6680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0061}, {0x0061, 0x00a3}, UCOL_LESS},
6681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* European Ordering rules: ignore currency characters. */
6684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* eorRules[] = {
6685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "[import root-u-co-eor]",
6686103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6687103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6688103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase eorTests[] = {
6689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0110}, {0x00F0}, UCOL_LESS},
6690103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00a3}, {0x00a5}, UCOL_EQUAL},
6691103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0061}, {0x0061, 0x00a3}, UCOL_EQUAL},
6692103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6694103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* fiStdRules[] = {
6695103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "[import fi-u-co-standard]",
6696103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6697103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6698103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase fiStdTests[] = {
6699103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0110}, {0x00F0}, UCOL_GREATER},
6700103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00a3}, {0x00a5}, UCOL_LESS},
6701103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0061}, {0x0061, 0x00a3}, UCOL_LESS},
6702103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6703103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6704103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* Both European Ordering Rules and Fi Standard Rules. */
6705103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* eorFiStdRules[] = {
6706103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "[import root-u-co-eor][import fi-u-co-standard]",
6707103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6708103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6709103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* This is essentially same as the one before once fi.txt is updated with import. */
6710103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* fiEorRules[] = {
6711103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "[import fi-u-co-eor]",
6712103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6713103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase fiEorTests[] = {
6715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0110}, {0x00F0}, UCOL_GREATER},
6716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x00a3}, {0x00a5}, UCOL_EQUAL},
6717103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x0061}, {0x0061, 0x00a3}, UCOL_EQUAL},
6718103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(defaultTests, LEN(defaultTests), defaultRules, LEN(defaultRules));
6721103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(eorTests, LEN(eorTests), eorRules, LEN(eorRules));
6722103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(fiStdTests, LEN(fiStdTests), fiStdRules, LEN(fiStdRules));
6723103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(fiEorTests, LEN(fiEorTests), eorFiStdRules, LEN(eorFiStdRules));
6724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6725103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* TODO: Fix ICU ticket #8962 by uncommenting the following test after fi.txt is updated with the following rule:
6726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        eor{
6727103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            Sequence{
6728103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                "[import root-u-co-eor][import fi-u-co-standard]"
6729103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
6730103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            Version{"21.0"}
6731103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
6732103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  */
6733103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* doTestOneTestCase(fiEorTests, LEN(fiEorTests), fiEorRules, LEN(fiEorRules)); */
6734103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6735103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
673654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
6737103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if 0
6739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*
6740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This test case tests inclusion with the unihan rules, but this cannot be included now, unless
6741103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * the resource files are built with -includeUnihanColl option.
6742103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * TODO: Uncomment this function and make it work when unihan rules are built by default.
6743103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
6744103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestImportRulesCJKWithUnihan(void)
6745103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
6746103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* DUCET. */
6747103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* defaultRules[] = {
6748103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "&a<b",                                    /* Dummy rule. */
6749103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6751103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase defaultTests[] = {
6752103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x3402}, {0x4e1e}, UCOL_GREATER},
6753103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6755103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /* European Ordering rules: ignore currency characters. */
6756103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const char* unihanRules[] = {
6757103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    "[import ko-u-co-unihan]",
6758103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6760103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  const OneTestCase unihanTests[] = {
6761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { {0x3402}, {0x4e1e}, UCOL_LESS},
6762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  };
6763103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6764103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(defaultTests, LEN(defaultTests), defaultRules, LEN(defaultRules));
6765103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  doTestOneTestCase(unihanTests, LEN(unihanTests), unihanRules, LEN(unihanRules));
6766103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6767103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
6768103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
6769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
677027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestImport(void)
677127f654740f2a26ad62a5c155af9199af9e69b889claireho{
677227f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* vicoll;
677327f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* escoll;
677427f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* viescoll;
677527f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* importviescoll;
677627f654740f2a26ad62a5c155af9199af9e69b889claireho    UParseError error;
677727f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
677827f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar* virules;
677927f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t viruleslength;
678027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar* esrules;
678127f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t esruleslength;
678227f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar* viesrules;
678327f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t viesruleslength;
678427f654740f2a26ad62a5c155af9199af9e69b889claireho    char srules[500] = "[import vi][import es]";
678527f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar rules[500];
678627f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t length = 0;
678727f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t itemCount;
678827f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t i, k;
678927f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar32 start;
679027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar32 end;
679127f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar str[500];
679227f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t strLength;
679327f654740f2a26ad62a5c155af9199af9e69b889claireho
679427f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t sk1[500];
679527f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t sk2[500];
679627f654740f2a26ad62a5c155af9199af9e69b889claireho
679727f654740f2a26ad62a5c155af9199af9e69b889claireho    UBool b;
679827f654740f2a26ad62a5c155af9199af9e69b889claireho    USet* tailoredSet;
679927f654740f2a26ad62a5c155af9199af9e69b889claireho    USet* importTailoredSet;
680027f654740f2a26ad62a5c155af9199af9e69b889claireho
680127f654740f2a26ad62a5c155af9199af9e69b889claireho
680227f654740f2a26ad62a5c155af9199af9e69b889claireho    vicoll = ucol_open("vi", &status);
680327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){
680427f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: Call ucol_open(\"vi\", ...): %s\n", myErrorName(status));
680527f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
680627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
680727f654740f2a26ad62a5c155af9199af9e69b889claireho
680827f654740f2a26ad62a5c155af9199af9e69b889claireho    virules = (UChar*) ucol_getRules(vicoll, &viruleslength);
680927f654740f2a26ad62a5c155af9199af9e69b889claireho    escoll = ucol_open("es", &status);
681027f654740f2a26ad62a5c155af9199af9e69b889claireho    esrules = (UChar*) ucol_getRules(escoll, &esruleslength);
681127f654740f2a26ad62a5c155af9199af9e69b889claireho    viesrules = (UChar*)uprv_malloc((viruleslength+esruleslength+1)*sizeof(UChar*));
681227f654740f2a26ad62a5c155af9199af9e69b889claireho    viesrules[0] = 0;
681327f654740f2a26ad62a5c155af9199af9e69b889claireho    u_strcat(viesrules, virules);
681427f654740f2a26ad62a5c155af9199af9e69b889claireho    u_strcat(viesrules, esrules);
681527f654740f2a26ad62a5c155af9199af9e69b889claireho    viesruleslength = viruleslength + esruleslength;
681627f654740f2a26ad62a5c155af9199af9e69b889claireho    viescoll = ucol_openRules(viesrules, viesruleslength, UCOL_ON, UCOL_TERTIARY, &error, &status);
681727f654740f2a26ad62a5c155af9199af9e69b889claireho
681827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* u_strFromUTF8(rules, 500, &length, srules, strlen(srules), &status); */
681927f654740f2a26ad62a5c155af9199af9e69b889claireho    length = u_unescape(srules, rules, 500);
682027f654740f2a26ad62a5c155af9199af9e69b889claireho    importviescoll = ucol_openRules(rules, length, UCOL_ON, UCOL_TERTIARY, &error, &status);
682127f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){
682227f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
682327f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
682427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
682527f654740f2a26ad62a5c155af9199af9e69b889claireho
682627f654740f2a26ad62a5c155af9199af9e69b889claireho    tailoredSet = ucol_getTailoredSet(viescoll, &status);
682727f654740f2a26ad62a5c155af9199af9e69b889claireho    importTailoredSet = ucol_getTailoredSet(importviescoll, &status);
682827f654740f2a26ad62a5c155af9199af9e69b889claireho
682927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(!uset_equals(tailoredSet, importTailoredSet)){
683027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Tailored sets not equal");
683127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
683227f654740f2a26ad62a5c155af9199af9e69b889claireho
683327f654740f2a26ad62a5c155af9199af9e69b889claireho    uset_close(importTailoredSet);
683427f654740f2a26ad62a5c155af9199af9e69b889claireho
683527f654740f2a26ad62a5c155af9199af9e69b889claireho    itemCount = uset_getItemCount(tailoredSet);
683627f654740f2a26ad62a5c155af9199af9e69b889claireho
683727f654740f2a26ad62a5c155af9199af9e69b889claireho    for( i = 0; i < itemCount; i++){
683827f654740f2a26ad62a5c155af9199af9e69b889claireho        strLength = uset_getItem(tailoredSet, i, &start, &end, str, 500, &status);
683927f654740f2a26ad62a5c155af9199af9e69b889claireho        if(strLength < 2){
684027f654740f2a26ad62a5c155af9199af9e69b889claireho            for (; start <= end; start++){
684127f654740f2a26ad62a5c155af9199af9e69b889claireho                k = 0;
684227f654740f2a26ad62a5c155af9199af9e69b889claireho                U16_APPEND(str, k, 500, start, b);
684327f654740f2a26ad62a5c155af9199af9e69b889claireho                ucol_getSortKey(viescoll, str, 1, sk1, 500);
684427f654740f2a26ad62a5c155af9199af9e69b889claireho                ucol_getSortKey(importviescoll, str, 1, sk2, 500);
684527f654740f2a26ad62a5c155af9199af9e69b889claireho                if(compare_uint8_t_arrays(sk1, sk2) != 0){
684627f654740f2a26ad62a5c155af9199af9e69b889claireho                    log_err("Sort key for %s not equal\n", str);
684727f654740f2a26ad62a5c155af9199af9e69b889claireho                    break;
684827f654740f2a26ad62a5c155af9199af9e69b889claireho                }
684927f654740f2a26ad62a5c155af9199af9e69b889claireho            }
685027f654740f2a26ad62a5c155af9199af9e69b889claireho        }else{
685127f654740f2a26ad62a5c155af9199af9e69b889claireho            ucol_getSortKey(viescoll, str, strLength, sk1, 500);
685227f654740f2a26ad62a5c155af9199af9e69b889claireho            ucol_getSortKey(importviescoll, str, strLength, sk2, 500);
685327f654740f2a26ad62a5c155af9199af9e69b889claireho            if(compare_uint8_t_arrays(sk1, sk2) != 0){
685427f654740f2a26ad62a5c155af9199af9e69b889claireho                log_err("ZZSort key for %s not equal\n", str);
685527f654740f2a26ad62a5c155af9199af9e69b889claireho                break;
685627f654740f2a26ad62a5c155af9199af9e69b889claireho            }
685727f654740f2a26ad62a5c155af9199af9e69b889claireho
685827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
685927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
686027f654740f2a26ad62a5c155af9199af9e69b889claireho
686127f654740f2a26ad62a5c155af9199af9e69b889claireho    uset_close(tailoredSet);
686227f654740f2a26ad62a5c155af9199af9e69b889claireho
686327f654740f2a26ad62a5c155af9199af9e69b889claireho    uprv_free(viesrules);
686427f654740f2a26ad62a5c155af9199af9e69b889claireho
686527f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(vicoll);
686627f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(escoll);
686727f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(viescoll);
686827f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(importviescoll);
686927f654740f2a26ad62a5c155af9199af9e69b889claireho}
687027f654740f2a26ad62a5c155af9199af9e69b889claireho
687127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestImportWithType(void)
687227f654740f2a26ad62a5c155af9199af9e69b889claireho{
687327f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* vicoll;
687427f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* decoll;
687527f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* videcoll;
687627f654740f2a26ad62a5c155af9199af9e69b889claireho    UCollator* importvidecoll;
687727f654740f2a26ad62a5c155af9199af9e69b889claireho    UParseError error;
687827f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
687927f654740f2a26ad62a5c155af9199af9e69b889claireho    const UChar* virules;
688027f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t viruleslength;
688127f654740f2a26ad62a5c155af9199af9e69b889claireho    const UChar* derules;
688227f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t deruleslength;
688327f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar* viderules;
688427f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t videruleslength;
688527f654740f2a26ad62a5c155af9199af9e69b889claireho    const char srules[500] = "[import vi][import de-u-co-phonebk]";
688627f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar rules[500];
688727f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t length = 0;
688827f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t itemCount;
688927f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t i, k;
689027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar32 start;
689127f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar32 end;
689227f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar str[500];
689327f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t strLength;
689427f654740f2a26ad62a5c155af9199af9e69b889claireho
689527f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t sk1[500];
689627f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t sk2[500];
689727f654740f2a26ad62a5c155af9199af9e69b889claireho
689827f654740f2a26ad62a5c155af9199af9e69b889claireho    USet* tailoredSet;
689927f654740f2a26ad62a5c155af9199af9e69b889claireho    USet* importTailoredSet;
690027f654740f2a26ad62a5c155af9199af9e69b889claireho
690127f654740f2a26ad62a5c155af9199af9e69b889claireho    vicoll = ucol_open("vi", &status);
690227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){
690327f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
690427f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
690527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
690627f654740f2a26ad62a5c155af9199af9e69b889claireho    virules = ucol_getRules(vicoll, &viruleslength);
690727f654740f2a26ad62a5c155af9199af9e69b889claireho    /* decoll = ucol_open("de@collation=phonebook", &status); */
690827f654740f2a26ad62a5c155af9199af9e69b889claireho    decoll = ucol_open("de-u-co-phonebk", &status);
690927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){
691027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
691127f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
691227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
691327f654740f2a26ad62a5c155af9199af9e69b889claireho
691427f654740f2a26ad62a5c155af9199af9e69b889claireho
691527f654740f2a26ad62a5c155af9199af9e69b889claireho    derules = ucol_getRules(decoll, &deruleslength);
691627f654740f2a26ad62a5c155af9199af9e69b889claireho    viderules = (UChar*)uprv_malloc((viruleslength+deruleslength+1)*sizeof(UChar*));
691727f654740f2a26ad62a5c155af9199af9e69b889claireho    viderules[0] = 0;
691827f654740f2a26ad62a5c155af9199af9e69b889claireho    u_strcat(viderules, virules);
691927f654740f2a26ad62a5c155af9199af9e69b889claireho    u_strcat(viderules, derules);
692027f654740f2a26ad62a5c155af9199af9e69b889claireho    videruleslength = viruleslength + deruleslength;
692127f654740f2a26ad62a5c155af9199af9e69b889claireho    videcoll = ucol_openRules(viderules, videruleslength, UCOL_ON, UCOL_TERTIARY, &error, &status);
692227f654740f2a26ad62a5c155af9199af9e69b889claireho
692327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* u_strFromUTF8(rules, 500, &length, srules, strlen(srules), &status); */
692427f654740f2a26ad62a5c155af9199af9e69b889claireho    length = u_unescape(srules, rules, 500);
692527f654740f2a26ad62a5c155af9199af9e69b889claireho    importvidecoll = ucol_openRules(rules, length, UCOL_ON, UCOL_TERTIARY, &error, &status);
692627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){
692727f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
692827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
692927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
693027f654740f2a26ad62a5c155af9199af9e69b889claireho
693127f654740f2a26ad62a5c155af9199af9e69b889claireho    tailoredSet = ucol_getTailoredSet(videcoll, &status);
693227f654740f2a26ad62a5c155af9199af9e69b889claireho    importTailoredSet = ucol_getTailoredSet(importvidecoll, &status);
693327f654740f2a26ad62a5c155af9199af9e69b889claireho
693427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(!uset_equals(tailoredSet, importTailoredSet)){
693527f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Tailored sets not equal");
693627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
693727f654740f2a26ad62a5c155af9199af9e69b889claireho
693827f654740f2a26ad62a5c155af9199af9e69b889claireho    uset_close(importTailoredSet);
693927f654740f2a26ad62a5c155af9199af9e69b889claireho
694027f654740f2a26ad62a5c155af9199af9e69b889claireho    itemCount = uset_getItemCount(tailoredSet);
694127f654740f2a26ad62a5c155af9199af9e69b889claireho
694227f654740f2a26ad62a5c155af9199af9e69b889claireho    for( i = 0; i < itemCount; i++){
694327f654740f2a26ad62a5c155af9199af9e69b889claireho        strLength = uset_getItem(tailoredSet, i, &start, &end, str, 500, &status);
694427f654740f2a26ad62a5c155af9199af9e69b889claireho        if(strLength < 2){
694527f654740f2a26ad62a5c155af9199af9e69b889claireho            for (; start <= end; start++){
694627f654740f2a26ad62a5c155af9199af9e69b889claireho                k = 0;
694727f654740f2a26ad62a5c155af9199af9e69b889claireho                U16_APPEND_UNSAFE(str, k, start);
694827f654740f2a26ad62a5c155af9199af9e69b889claireho                ucol_getSortKey(videcoll, str, 1, sk1, 500);
694927f654740f2a26ad62a5c155af9199af9e69b889claireho                ucol_getSortKey(importvidecoll, str, 1, sk2, 500);
695027f654740f2a26ad62a5c155af9199af9e69b889claireho                if(compare_uint8_t_arrays(sk1, sk2) != 0){
695127f654740f2a26ad62a5c155af9199af9e69b889claireho                    log_err("Sort key for %s not equal\n", str);
695227f654740f2a26ad62a5c155af9199af9e69b889claireho                    break;
695327f654740f2a26ad62a5c155af9199af9e69b889claireho                }
695427f654740f2a26ad62a5c155af9199af9e69b889claireho            }
695527f654740f2a26ad62a5c155af9199af9e69b889claireho        }else{
695627f654740f2a26ad62a5c155af9199af9e69b889claireho            ucol_getSortKey(videcoll, str, strLength, sk1, 500);
695727f654740f2a26ad62a5c155af9199af9e69b889claireho            ucol_getSortKey(importvidecoll, str, strLength, sk2, 500);
695827f654740f2a26ad62a5c155af9199af9e69b889claireho            if(compare_uint8_t_arrays(sk1, sk2) != 0){
695927f654740f2a26ad62a5c155af9199af9e69b889claireho                log_err("Sort key for %s not equal\n", str);
696027f654740f2a26ad62a5c155af9199af9e69b889claireho                break;
696127f654740f2a26ad62a5c155af9199af9e69b889claireho            }
696227f654740f2a26ad62a5c155af9199af9e69b889claireho
696327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
696427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
696527f654740f2a26ad62a5c155af9199af9e69b889claireho
696627f654740f2a26ad62a5c155af9199af9e69b889claireho    uset_close(tailoredSet);
696727f654740f2a26ad62a5c155af9199af9e69b889claireho
696827f654740f2a26ad62a5c155af9199af9e69b889claireho    uprv_free(viderules);
696927f654740f2a26ad62a5c155af9199af9e69b889claireho
697027f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(videcoll);
697127f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(importvidecoll);
697227f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(vicoll);
697327f654740f2a26ad62a5c155af9199af9e69b889claireho    ucol_close(decoll);
6974b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
6975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 'IV INTERNATIONAL SCIENTIFIC - PRACTICAL CONFERENCE "GEOPOLITICS, GEOECONOMICS AND INTERNATIONAL RELATIONS PROBLEMS" 22-23 June 2010, St. Petersburg, Russia' */
6977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar longUpperStr1[]= { /* 155 chars */
6978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x49, 0x56, 0x20, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4E, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x41, 0x4C,
6979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x20, 0x53, 0x43, 0x49, 0x45, 0x4E, 0x54, 0x49, 0x46, 0x49, 0x43, 0x20, 0x2D, 0x20, 0x50, 0x52,
6980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41, 0x43, 0x54, 0x49, 0x43, 0x41, 0x4C, 0x20, 0x43, 0x4F, 0x4E, 0x46, 0x45, 0x52, 0x45, 0x4E,
6981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x43, 0x45, 0x20, 0x22, 0x47, 0x45, 0x4F, 0x50, 0x4F, 0x4C, 0x49, 0x54, 0x49, 0x43, 0x53, 0x2C,
6982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x20, 0x47, 0x45, 0x4F, 0x45, 0x43, 0x4F, 0x4E, 0x4F, 0x4D, 0x49, 0x43, 0x53, 0x20, 0x41, 0x4E,
6983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x44, 0x20, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4E, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x41, 0x4C, 0x20,
6984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x52, 0x45, 0x4C, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x53, 0x20, 0x50, 0x52, 0x4F, 0x42, 0x4C, 0x45,
6985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x4D, 0x53, 0x22, 0x20, 0x32, 0x32, 0x2D, 0x32, 0x33, 0x20, 0x4A, 0x75, 0x6E, 0x65, 0x20, 0x32,
6986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x30, 0x31, 0x30, 0x2C, 0x20, 0x53, 0x74, 0x2E, 0x20, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62,
6987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x75, 0x72, 0x67, 0x2C, 0x20, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61
6988b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
6989b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 'BACEDIFOGUHAJEKILOMUNAPE ' with diacritics on vowels, repeated 5 times */
6991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar longUpperStr2[]= { /* 125 chars, > 128 collation elements */
6992b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20,
6993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20,
6994b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20,
6995b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20,
6996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20
6997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
6998b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ' repeated 12 times */
7000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar longUpperStr3[]= { /* 324 chars */
7001b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7003b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7004b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7005b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7006b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7007b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7008b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7009b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7010b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7011b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20,
7012b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20
7013b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
7014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define MY_ARRAY_LEN(array) (sizeof(array)/sizeof(array[0]))
7016b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7017b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
7018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar * longUpperStrPtr;
7019b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t       longUpperStrLen;
7020b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} LongUpperStrItem;
7021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7022b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* String pointers must be in reverse collation order of the corresponding strings */
7023b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const LongUpperStrItem longUpperStrItems[] = {
7024b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { longUpperStr1, MY_ARRAY_LEN(longUpperStr1) },
7025b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { longUpperStr2, MY_ARRAY_LEN(longUpperStr2) },
7026b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { longUpperStr3, MY_ARRAY_LEN(longUpperStr3) },
7027b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,          0                           }
7028b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
702927f654740f2a26ad62a5c155af9199af9e69b889claireho
7030b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kCollKeyLenMax = 800 }; /* longest expected is 749, but may change with collation changes */
7031b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7032b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Text fix for #8445; without fix, could have crash due to stack or heap corruption */
7033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestCaseLevelBufferOverflow(void)
7034b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
7035b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
7036b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollator * ucol = ucol_open("root", &status);
7037b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if ( U_SUCCESS(status) ) {
7038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ucol_setAttribute(ucol, UCOL_CASE_LEVEL, UCOL_ON, &status);
7039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if ( U_SUCCESS(status) ) {
7040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            const LongUpperStrItem * itemPtr;
7041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            uint8_t sortKeyA[kCollKeyLenMax], sortKeyB[kCollKeyLenMax];
7042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            for ( itemPtr = longUpperStrItems; itemPtr->longUpperStrPtr != NULL; itemPtr++ ) {
7043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                int32_t sortKeyLen;
7044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if (itemPtr > longUpperStrItems) {
7045b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    uprv_strcpy((char *)sortKeyB, (char *)sortKeyA);
7046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
7047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                sortKeyLen = ucol_getSortKey(ucol, itemPtr->longUpperStrPtr, itemPtr->longUpperStrLen, sortKeyA, kCollKeyLenMax);
7048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if (sortKeyLen <= 0 || sortKeyLen > kCollKeyLenMax) {
7049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("ERROR sort key length from ucol_getSortKey is %d\n", sortKeyLen);
7050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    break;
7051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
7052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if ( itemPtr > longUpperStrItems ) {
7053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    int compareResult = uprv_strcmp((char *)sortKeyA, (char *)sortKeyB);
7054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if (compareResult >= 0) {
7055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("ERROR in sort key comparison result, expected -1, got %d\n", compareResult);
7056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
7057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
7058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
7059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
7060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "ERROR in ucol_setAttribute UCOL_CASE_LEVEL on: %s\n", myErrorName(status));
7061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
7062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ucol_close(ucol);
7063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
7064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err_status(status, "ERROR in ucol_open for root: %s\n", myErrorName(status));
7065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
706627f654740f2a26ad62a5c155af9199af9e69b889claireho}
706727f654740f2a26ad62a5c155af9199af9e69b889claireho
706827f654740f2a26ad62a5c155af9199af9e69b889claireho
7069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST(x) addTest(root, &x, "tscoll/cmsccoll/" # x)
7070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addMiscCollTest(TestNode** root)
7072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
7073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestRuleOptions);
7074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestBeforePrefixFailure);
7075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestContractionClosure);
7076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestPrefixCompose);
7077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestStrCollIdenticalPrefix);
7078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestPrefix);
7079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestNewJapanese);
7080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*TEST(TestLimitations);*/
7081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestNonChars);
7082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestExtremeCompression);
708354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TEST(TestSurrogates);
7084ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* BEGIN android-removed
7085ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       To save space, Android does not include the collation tailoring rules.
7086ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho       We skip the tailing tests for collations. */
7087ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* TEST(TestVariableTopSetting); */
7088ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho    /* END android-removed */
7089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestBocsuCoverage);
7090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestCyrillicTailoring);
7091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestCase);
7092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(IncompleteCntTest);
7093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(BlackBirdTest);
7094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(FunkyATest);
7095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(BillFairmanTest);
7096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(RamsRulesTest);
7097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(IsTailoredTest);
7098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestCollations);
7099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestChMove);
7100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestImplicitTailoring);
7101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestFCDProblem);
7102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestEmptyRule);
7103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*TEST(TestJ784);*/ /* 'zh' locale has changed - now it is getting tested by TestBeforePinyin */
7104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestJ815);
7105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*TEST(TestJ831);*/ /* we changed lv locale */
7106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestBefore);
7107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestRedundantRules);
7108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestExpansionSyntax);
7109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestHangulTailoring);
7110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestUCARules);
7111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestIncrementalNormalize);
7112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestComposeDecompose);
7113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestCompressOverlap);
7114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestContraction);
7115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestExpansion);
7116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*TEST(PrintMarkDavis);*/ /* this test doesn't test - just prints sortkeys */
7117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*TEST(TestGetCaseBit);*/ /*this one requires internal things to be exported */
7118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestOptimize);
7119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestSuppressContractions);
7120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(Alexis2);
7121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestHebrewUCA);
7122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestPartialSortKeyTermination);
7123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestSettings);
7124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestEquals);
7125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestJ2726);
7126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(NullRule);
7127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestNumericCollation);
7128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestTibetanConformance);
7129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestPinyinProblem);
7130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestImplicitGeneration);
7131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestSeparateTrees);
7132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestBeforePinyin);
7133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestBeforeTightening);
7134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*TEST(TestMoreBefore);*/
7135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestTailorNULL);
7136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestUpperFirstQuaternary);
7137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestJ4960);
7138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestJ5223);
7139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestJ5232);
7140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestJ5367);
714185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TEST(TestHiragana);
7142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestSortKeyConsistency);
7143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST(TestVI5913);  /* VI, RO tailored rules */
714485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TEST(TestCroatianSortKey);
714585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TEST(TestTailor6179);
714685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TEST(TestUCAPrecontext);
714785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TEST(TestOutOfBuffer5468);
714850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TEST(TestSameStrengthList);
714927f654740f2a26ad62a5c155af9199af9e69b889claireho
715027f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSameStrengthListQuoted);
715127f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSameStrengthListSupplemental);
715227f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSameStrengthListQwerty);
715327f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSameStrengthListQuotedQwerty);
715427f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSameStrengthListRanges);
715527f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSameStrengthListSupplementalRanges);
715627f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestSpecialCharacters);
715727f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestPrivateUseCharacters);
715827f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestPrivateUseCharactersInList);
715927f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestPrivateUseCharactersInRange);
716027f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestInvalidListsAndRanges);
716154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TEST(TestImportRulesDeWithPhonebook);
716254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* TEST(TestImportRulesFiWithEor); EOR rules removed from CLDR 21 */
716354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* TEST(TestImportRulesCJKWithUnihan); */
7164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* BEGIN android-removed: Due to Android does not include reverse UCA table.
716527f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestImport);
716627f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestImportWithType);
7167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    END android-removed */
716827f654740f2a26ad62a5c155af9199af9e69b889claireho
716927f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestBeforeRuleWithScriptReordering);
717027f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestNonLeadBytesDuringCollationReordering);
717127f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestReorderingAPI);
7172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST(TestReorderingAPIWithRuleCreatedCollator);
7173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST(TestEquivalentReorderingScripts);
717427f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestGreekFirstReorder);
717527f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestGreekLastReorder);
717627f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestNonScriptReorder);
717727f654740f2a26ad62a5c155af9199af9e69b889claireho    TEST(TestHaniReorder);
7178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    TEST(TestHaniReorderWithOtherRules);
7179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST(TestMultipleReorder);
7180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST(TestReorderingAcrossCloning);
718154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TEST(TestReorderWithNumericCollation);
7182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST(TestCaseLevelBufferOverflow);
7184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
7185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
7187