1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************************
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File CITERTST.C
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date      Name               Description
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*           Madhu Katragadda   Ported for C API
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 02/19/01  synwee             Modified test case for new collation iterator
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*********************************************************************************/
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Collation Iterator tests.
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (Let me reiterate my position...)
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucol.h"
25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucoleitr.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uloc.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uchar.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "callcoll.h"
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "citertst.h"
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ccolltst.h"
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "filestrm.h"
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucol_imp.h"
3827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "uparse.h"
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern uint8_t ucol_uprv_getCaseBits(const UChar *, uint32_t, UErrorCode *);
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addCollIterTest(TestNode** root)
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestPrevious, "tscoll/citertst/TestPrevious");
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestOffset, "tscoll/citertst/TestOffset");
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestSetText, "tscoll/citertst/TestSetText");
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestMaxExpansion, "tscoll/citertst/TestMaxExpansion");
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestUnicodeChar, "tscoll/citertst/TestUnicodeChar");
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestNormalizedUnicodeChar,
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                "tscoll/citertst/TestNormalizedUnicodeChar");
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestNormalization, "tscoll/citertst/TestNormalization");
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestBug672, "tscoll/citertst/TestBug672");
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestBug672Normalize, "tscoll/citertst/TestBug672Normalize");
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestSmallBuffer, "tscoll/citertst/TestSmallBuffer");
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestDiscontiguos, "tscoll/citertst/TestDiscontiguos");
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestSearchCollatorElements, "tscoll/citertst/TestSearchCollatorElements");
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* The locales we support */
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char * LOCALES[] = {"en_AU", "en_BE", "en_CA"};
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestBug672() {
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode  status = U_ZERO_ERROR;
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar       pattern[20];
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar       text[50];
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int         i;
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int         result[3][3];
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(pattern, "resume");
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(text, "Time to resume updating my resume.");
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (i = 0; i < 3; ++ i) {
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCollator          *coll = ucol_open(LOCALES[i], &status);
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCollationElements *pitr = ucol_openElements(coll, pattern, -1,
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                                     &status);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCollationElements *titer = ucol_openElements(coll, text, -1,
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                                     &status);
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n",
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("locale tested %s\n", LOCALES[i]);
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        while (ucol_next(pitr, &status) != UCOL_NULLORDER &&
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               U_SUCCESS(status)) {
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: reversing collation iterator :%s\n",
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_reset(pitr);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setOffset(titer, u_strlen(pattern), &status);
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: setting offset in collator :%s\n",
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result[i][0] = ucol_getOffset(titer);
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Text iterator set to offset %d\n", result[i][0]);
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Use previous() */
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_previous(titer, &status);
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result[i][1] = ucol_getOffset(titer);
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Current offset %d after previous\n", result[i][1]);
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Add one to index */
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Adding one to current offset...\n");
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status);
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: setting offset in collator :%s\n",
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result[i][2] = ucol_getOffset(titer);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Current offset in text = %d\n", result[i][2]);
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_closeElements(pitr);
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_closeElements(titer);
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(coll);
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uprv_memcmp(result[0], result[1], 3) != 0 ||
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memcmp(result[1], result[2], 3) != 0) {
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: Different locales have different offsets at the same character\n");
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*  Running this test with normalization enabled showed up a bug in the incremental
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    normalization code. */
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestBug672Normalize() {
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode  status = U_ZERO_ERROR;
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar       pattern[20];
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar       text[50];
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int         i;
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int         result[3][3];
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(pattern, "resume");
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(text, "Time to resume updating my resume.");
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (i = 0; i < 3; ++ i) {
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCollator          *coll = ucol_open(LOCALES[i], &status);
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCollationElements *pitr = NULL;
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCollationElements *titer = NULL;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        pitr = ucol_openElements(coll, pattern, -1, &status);
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        titer = ucol_openElements(coll, text, -1, &status);
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n",
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("locale tested %s\n", LOCALES[i]);
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        while (ucol_next(pitr, &status) != UCOL_NULLORDER &&
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               U_SUCCESS(status)) {
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: reversing collation iterator :%s\n",
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_reset(pitr);
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setOffset(titer, u_strlen(pattern), &status);
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: setting offset in collator :%s\n",
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result[i][0] = ucol_getOffset(titer);
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Text iterator set to offset %d\n", result[i][0]);
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Use previous() */
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_previous(titer, &status);
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result[i][1] = ucol_getOffset(titer);
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Current offset %d after previous\n", result[i][1]);
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Add one to index */
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Adding one to current offset...\n");
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status);
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: setting offset in collator :%s\n",
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    myErrorName(status));
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        result[i][2] = ucol_getOffset(titer);
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Current offset in text = %d\n", result[i][2]);
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_closeElements(pitr);
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_closeElements(titer);
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(coll);
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uprv_memcmp(result[0], result[1], 3) != 0 ||
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memcmp(result[1], result[2], 3) != 0) {
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: Different locales have different offsets at the same character\n");
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unicode characters.
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUnicodeChar()
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar source[0x100];
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *en_us;
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter;
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar codepoint;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *test;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    en_us = ucol_open("en_US", &status);
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)){
22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       log_err_status(status, "ERROR: in creation of collation data using ucol_open()\n %s\n",
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       return;
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (codepoint = 1; codepoint < 0xFFFE;)
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      test = source;
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      while (codepoint % 0xFF != 0)
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (u_isdefined(codepoint))
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          *(test ++) = codepoint;
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepoint ++;
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (u_isdefined(codepoint))
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *(test ++) = codepoint;
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (codepoint != 0xFFFF)
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepoint ++;
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      *test = 0;
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter=ucol_openElements(en_us, source, u_strlen(source), &status);
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(status)){
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ucol_close(en_us);
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          return;
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* A basic test to see if it's working at all */
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("codepoint testing %x\n", codepoint);
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      backAndForth(iter);
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* null termination test */
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter=ucol_openElements(en_us, source, -1, &status);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(status)){
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ucol_close(en_us);
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          return;
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* A basic test to see if it's working at all */
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      backAndForth(iter);
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unicode characters with normalization on.
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNormalizedUnicodeChar()
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar source[0x100];
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *th_th;
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter;
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar codepoint;
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *test;
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* thai should have normalization on */
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    th_th = ucol_open("th_TH", &status);
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)){
29485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of thai collation using ucol_open()\n %s\n",
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (codepoint = 1; codepoint < 0xFFFE;)
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      test = source;
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      while (codepoint % 0xFF != 0)
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (u_isdefined(codepoint))
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          *(test ++) = codepoint;
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepoint ++;
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (u_isdefined(codepoint))
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *(test ++) = codepoint;
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (codepoint != 0xFFFF)
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepoint ++;
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      *test = 0;
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter=ucol_openElements(th_th, source, u_strlen(source), &status);
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(status)){
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_close(th_th);
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          return;
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      backAndForth(iter);
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter=ucol_openElements(th_th, source, -1, &status);
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(status)){
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_close(th_th);
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          return;
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      backAndForth(iter);
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(th_th);
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Test the incremental normalization
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNormalization()
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UErrorCode          status = U_ZERO_ERROR;
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char               *str    =
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            "&a < \\u0300\\u0315 < A\\u0300\\u0315 < \\u0316\\u0315B < \\u0316\\u0300\\u0315";
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UCollator          *coll;
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UChar               rule[50];
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int                 rulelen = u_unescape(str, rule, 50);
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int                 count = 0;
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char                *testdata[] =
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        {"\\u1ED9", "o\\u0323\\u0302",
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        "\\u0300\\u0315", "\\u0315\\u0300",
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        "A\\u0300\\u0315B", "A\\u0315\\u0300B",
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        "A\\u0316\\u0315B", "A\\u0315\\u0316B",
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        "\\u0316\\u0300\\u0315", "\\u0315\\u0300\\u0316",
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        "A\\u0316\\u0300\\u0315B", "A\\u0315\\u0300\\u0316B",
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        "\\u0316\\u0315\\u0300", "A\\u0316\\u0315\\u0300B"};
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t   srclen;
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar source[10];
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter;
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_openRules(rule, rulelen, UCOL_ON, UCOL_TERTIARY, NULL, &status);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)){
37085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of collator using ucol_openRules()\n %s\n",
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              myErrorName(status));
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    srclen = u_unescape(testdata[0], source, 10);
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = ucol_openElements(coll, source, srclen, &status);
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    srclen = u_unescape(testdata[1], source, 10);
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = ucol_openElements(coll, source, srclen, &status);
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (count < 12) {
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        srclen = u_unescape(testdata[count], source, 10);
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        iter = ucol_openElements(coll, source, srclen, &status);
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)){
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: in creation of collator element iterator\n %s\n",
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  myErrorName(status));
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        backAndForth(iter);
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_closeElements(iter);
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        iter = ucol_openElements(coll, source, -1, &status);
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)){
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ERROR: in creation of collator element iterator\n %s\n",
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  myErrorName(status));
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        backAndForth(iter);
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_closeElements(iter);
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        count ++;
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator.previous()
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @bug 4108758 - Make sure it works with contracting characters
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestPrevious()
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *coll=NULL;
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar rule[50];
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *source;
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *c1, *c2, *c3;
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter;
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
42585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test1[50];
42685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test2[50];
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "What subset of all possible test cases?");
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "has the highest probability of detecting");
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_open("en_US", &status);
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter=ucol_openElements(coll, test1, u_strlen(test1), &status);
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("English locale testing back and forth\n");
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
43585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(coll);
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* A basic test to see if it's working at all */
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test with a contracting character sequence */
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(rule, "&a,A < b,B < c,C, d,D < z,Z < ch,cH,Ch,CH");
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c1 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status);
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Contraction rule testing back and forth with no normalization\n");
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c1 == NULL || U_FAILURE(status))
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Couldn't create a RuleBasedCollator with a contracting sequence\n %s\n",
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(UChar*)malloc(sizeof(UChar) * 20);
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "abchdcba");
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter=ucol_openElements(c1, source, u_strlen(source), &status);
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(c1);
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test with an expanding character sequence */
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(rule, "&a < b < c/abd < d");
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c2 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status);
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Expansion rule testing back and forth with no normalization\n");
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c2 == NULL || U_FAILURE(status))
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n",
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "abcd");
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter=ucol_openElements(c2, source, u_strlen(source), &status);
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(c2);
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Now try both */
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(rule, "&a < b < c/aba < d < z < ch");
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c3 = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT,  UCOL_DEFAULT_STRENGTH,NULL, &status);
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Expansion/contraction rule testing back and forth with no normalization\n");
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c3 == NULL || U_FAILURE(status))
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n",
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(source, "abcdbchdc");
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter=ucol_openElements(c3, source, u_strlen(source), &status);
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(c3);
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[0] = 0x0e41;
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[1] = 0x0e02;
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[2] = 0x0e41;
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[3] = 0x0e02;
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[4] = 0x0e27;
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[5] = 0x61;
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[6] = 0x62;
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[7] = 0x63;
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[8] = 0;
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_open("th_TH", &status);
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Thai locale testing back and forth with normalization\n");
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter=ucol_openElements(coll, source, u_strlen(source), &status);
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* prev test */
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[0] = 0x0061;
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[1] = 0x30CF;
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[2] = 0x3099;
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[3] = 0x30FC;
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source[4] = 0;
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_open("ja_JP", &status);
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Japanese locale testing back and forth with normalization\n");
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter=ucol_openElements(coll, source, u_strlen(source), &status);
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(iter);
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(source);
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for getOffset() and setOffset()
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestOffset()
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status= U_ZERO_ERROR;
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *en_us=NULL;
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter, *pristine;
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t offset;
56385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    OrderAndOffset *orders;
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t orderLength=0;
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int     count = 0;
56685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test1[50];
56785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test2[50];
56885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "What subset of all possible test cases?");
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "has the highest probability of detecting");
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    en_us = ucol_open("en_US", &status);
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing getOffset and setOffset for collations\n");
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = ucol_openElements(en_us, test1, u_strlen(test1), &status);
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
57585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(en_us);
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* testing boundaries */
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setOffset(iter, 0, &status);
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || ucol_previous(iter, &status) != UCOL_NULLORDER) {
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error: After setting offset to 0, we should be at the end "
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "of the backwards iteration");
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setOffset(iter, u_strlen(test1), &status);
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || ucol_next(iter, &status) != UCOL_NULLORDER) {
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error: After setting offset to end of the string, we should "
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "be at the end of the backwards iteration");
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Run all the way through the iterator, then get the offset */
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    orders = getOrders(iter, &orderLength);
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    offset = ucol_getOffset(iter);
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (offset != u_strlen(test1))
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("offset at end != length %d vs %d\n", offset,
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            u_strlen(test1) );
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Now set the offset back to the beginning and see if it works */
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    pristine=ucol_openElements(en_us, test1, u_strlen(test1), &status);
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setOffset(iter, 0, &status);
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("setOffset failed. %s\n",    myErrorName(status));
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        assertEqual(iter, pristine);
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(pristine);
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(orders);
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* testing offsets in normalization buffer */
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1[0] = 0x61;
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1[1] = 0x300;
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1[2] = 0x316;
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1[3] = 0x62;
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test1[4] = 0;
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setAttribute(en_us, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = ucol_openElements(en_us, test1, 4, &status);
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_close(en_us);
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count = 0;
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (ucol_next(iter, &status) != UCOL_NULLORDER &&
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_SUCCESS(status)) {
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        switch (count) {
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 0:
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (ucol_getOffset(iter) != 1) {
65085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("ERROR: Offset of iteration should be 1\n");
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 3:
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (ucol_getOffset(iter) != 4) {
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ERROR: Offset of iteration should be 4\n");
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        default:
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (ucol_getOffset(iter) != 3) {
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ERROR: Offset of iteration should be 3\n");
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        count ++;
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_reset(iter);
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count = 0;
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (ucol_previous(iter, &status) != UCOL_NULLORDER &&
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U_SUCCESS(status)) {
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        switch (count) {
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 0:
67285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 1:
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (ucol_getOffset(iter) != 3) {
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ERROR: Offset of iteration should be 3\n");
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
67785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 2:
67885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if (ucol_getOffset(iter) != 1) {
67985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                log_err("ERROR: Offset of iteration should be 1\n");
68085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
68185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            break;
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        default:
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (ucol_getOffset(iter) != 0) {
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ERROR: Offset of iteration should be 0\n");
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        count ++;
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in iterating collation elements %s\n",
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for setText()
701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSetText()
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t c,i;
705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator *en_us=NULL;
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter1, *iter2;
70885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test1[50];
70985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar test2[50];
71085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test1, "What subset of all possible test cases?");
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(test2, "has the highest probability of detecting");
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    en_us = ucol_open("en_US", &status);
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("testing setText for Collation elements\n");
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter1=ucol_openElements(en_us, test1, u_strlen(test1), &status);
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
71785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "ERROR: in creation of collation element iterator1 using ucol_openElements()\n %s\n",
718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter2=ucol_openElements(en_us, test2, u_strlen(test2), &status);
723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: in creation of collation element iterator2 using ucol_openElements()\n %s\n",
725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myErrorName(status));
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Run through the second iterator just to exercise it */
731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c = ucol_next(iter2, &status);
732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    i = 0;
733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ( ++i < 10 && (c != UCOL_NULLORDER))
735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status))
737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("iter2->next() returned an error. %s\n", myErrorName(status));
739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_closeElements(iter2);
740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_closeElements(iter1);
741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = ucol_next(iter2, &status);
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Now set it to point to the same string as the first iterator */
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setText(iter2, test1, u_strlen(test1), &status);
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("call to iter2->setText(test1) failed. %s\n", myErrorName(status));
753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        assertEqual(iter1, iter2);
757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Now set it to point to a null string with fake length*/
760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_setText(iter2, NULL, 2, &status);
761fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (status != U_ILLEGAL_ARGUMENT_ERROR)
762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
763fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        log_err("call to iter2->setText(null, 2) should yield an illegal-argument-error - %s\n",
764fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                myErrorName(status));
765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter2);
768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter1);
769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(en_us);
770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** @bug 4108762
773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for getMaxExpansion()
774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestMaxExpansion()
776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode          status = U_ZERO_ERROR;
778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator          *coll   ;/*= ucol_open("en_US", &status);*/
779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar               ch     = 0;
780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar32             unassigned = 0xEFFFD;
781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar               supplementary[2];
78227f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t            stringOffset = 0;
783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool               isError = FALSE;
784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t            sorder = 0;
785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *iter   ;/*= ucol_openElements(coll, &ch, 1, &status);*/
786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t            temporder = 0;
787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar rule[256];
789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_uastrcpy(rule, "&a < ab < c/aba < d < z < ch");
790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT,
791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UCOL_DEFAULT_STRENGTH,NULL, &status);
792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status) && coll) {
793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter = ucol_openElements(coll, &ch, 1, &status);
794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      while (ch < 0xFFFF && U_SUCCESS(status)) {
796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int      count = 1;
797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          uint32_t order;
798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int32_t  size = 0;
799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ch ++;
801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ucol_setText(iter, &ch, 1, &status);
803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          order = ucol_previous(iter, &status);
804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          /* thai management */
806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          if (order == 0)
807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              order = ucol_previous(iter, &status);
808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          while (U_SUCCESS(status) &&
810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              ucol_previous(iter, &status) != UCOL_NULLORDER) {
811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              count ++;
812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          }
813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          size = ucol_getMaxExpansion(iter, order);
815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          if (U_FAILURE(status) || size < count) {
816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              log_err("Failure at codepoint %d, maximum expansion count < %d\n",
817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, count);
818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          }
819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* testing for exact max expansion */
822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ch = 0;
823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      while (ch < 0x61) {
824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          uint32_t order;
825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int32_t  size;
826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ucol_setText(iter, &ch, 1, &status);
827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          order = ucol_previous(iter, &status);
828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          size  = ucol_getMaxExpansion(iter, order);
829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          if (U_FAILURE(status) || size != 1) {
830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              log_err("Failure at codepoint %d, maximum expansion count < %d\n",
831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, 1);
832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          }
833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ch ++;
834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ch = 0x63;
837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_setText(iter, &ch, 1, &status);
838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      temporder = ucol_previous(iter, &status);
839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 3) {
841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Failure at codepoint %d, maximum expansion count != %d\n",
842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, 3);
843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ch = 0x64;
846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_setText(iter, &ch, 1, &status);
847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      temporder = ucol_previous(iter, &status);
848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 1) {
850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Failure at codepoint %d, maximum expansion count != %d\n",
851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, 3);
852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
85427f654740f2a26ad62a5c155af9199af9e69b889claireho      U16_APPEND(supplementary, stringOffset, 2, unassigned, isError);
85559d709d503bab6e2b61931737e662dd293b40578ccornelius      (void)isError;    /* Suppress set but not used warning. */
856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_setText(iter, supplementary, 2, &status);
857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      sorder = ucol_previous(iter, &status);
858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(status) || ucol_getMaxExpansion(iter, sorder) != 2) {
860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Failure at codepoint %d, maximum expansion count < %d\n",
861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, 2);
862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* testing jamo */
865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ch = 0x1165;
866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_setText(iter, &ch, 1, &status);
868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      temporder = ucol_previous(iter, &status);
869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) > 3) {
870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Failure at codepoint %d, maximum expansion count > %d\n",
871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, 3);
872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_close(coll);
876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* testing special jamo &a<\u1160 */
878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[0] = 0x26;
879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[1] = 0x71;
880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[2] = 0x3c;
881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[3] = 0x1165;
882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[4] = 0x2f;
883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[5] = 0x71;
884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[6] = 0x71;
885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[7] = 0x71;
886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[8] = 0x71;
887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      rule[9] = 0;
888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT,
890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UCOL_DEFAULT_STRENGTH,NULL, &status);
891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter = ucol_openElements(coll, &ch, 1, &status);
892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      temporder = ucol_previous(iter, &status);
894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 6) {
895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Failure at codepoint %d, maximum expansion count > %d\n",
896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ch, 5);
897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_close(coll);
901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
90285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status));
903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void assertEqual(UCollationElements *i1, UCollationElements *i2)
909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t c1, c2;
911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count = 0;
912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do
915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c1 = ucol_next(i1, &status);
917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c2 = ucol_next(i2, &status);
918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (c1 != c2)
920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Error in iteration %d assetEqual between\n  %d  and   %d, they are not equal\n", count, c1, c2);
922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        count += 1;
926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (c1 != UCOL_NULLORDER);
928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Testing iterators with extremely small buffers
932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSmallBuffer()
934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode          status = U_ZERO_ERROR;
936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator          *coll;
937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationElements *testiter,
938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                       *iter;
939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t             count = 0;
94085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    OrderAndOffset     *testorders,
941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                       *orders;
942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar teststr[500];
944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar str[] = {0x300, 0x31A, 0};
945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    creating a long string of decomposable characters,
947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    since by default the writable buffer is of size 256
948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    */
949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (count < 500) {
950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ((count & 1) == 0) {
951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            teststr[count ++] = 0x300;
952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else {
954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            teststr[count ++] = 0x31A;
955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll = ucol_open("th_TH", &status);
959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(status) && coll) {
960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      testiter = ucol_openElements(coll, teststr, 500, &status);
961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter = ucol_openElements(coll, str, 2, &status);
962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      orders     = getOrders(iter, &count);
964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (count != 2) {
965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Error collation elements size is not 2 for \\u0300\\u031A\n");
966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /*
969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      this will rearrange the string data to 250 characters of 0x300 first then
970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      250 characters of 0x031A
971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      */
972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      testorders = getOrders(testiter, &count);
973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (count != 500) {
975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Error decomposition does not give the right sized collation elements\n");
976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      while (count != 0) {
979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          /* UCA collation element for 0x0F76 */
98085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          if ((count > 250 && testorders[-- count].order != orders[1].order) ||
98185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho              (count <= 250 && testorders[-- count].order != orders[0].order)) {
982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              log_err("Error decomposition does not give the right collation element at %d count\n", count);
983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              break;
984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          }
985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      free(testorders);
988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      free(orders);
989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_reset(testiter);
991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* ensures closing of elements done properly to clear writable buffer */
993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_next(testiter, &status);
994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_next(testiter, &status);
995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(testiter);
996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_closeElements(iter);
997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucol_close(coll);
998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
99985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status));
1000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
1004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Testing the discontigous contractions
1005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
1006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestDiscontiguos() {
1007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char               *rulestr    =
1008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            "&z < AB < X\\u0300 < ABC < X\\u0300\\u0315";
1009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UChar               rule[50];
1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int                 rulelen = u_unescape(rulestr, rule, 50);
1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char               *src[] = {
1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "ADB", "ADBC", "A\\u0315B", "A\\u0315BC",
1013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* base character blocked */
1014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "XD\\u0300", "XD\\u0300\\u0315",
1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* non blocking combining character */
1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0319\\u0300", "X\\u0319\\u0300\\u0315",
1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* blocking combining character */
1018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0314\\u0300", "X\\u0314\\u0300\\u0315",
1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* contraction prefix */
1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "ABDC", "AB\\u0315C","X\\u0300D\\u0315", "X\\u0300\\u0319\\u0315",
1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0300\\u031A\\u0315",
1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* ends not with a contraction character */
1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0319\\u0300D", "X\\u0319\\u0300\\u0315D", "X\\u0300D\\u0315D",
1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0300\\u0319\\u0315D", "X\\u0300\\u031A\\u0315D"
1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char               *tgt[] = {
1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* non blocking combining character */
1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "A D B", "A D BC", "A \\u0315 B", "A \\u0315 BC",
1029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* base character blocked */
1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X D \\u0300", "X D \\u0300\\u0315",
1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* non blocking combining character */
1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0300 \\u0319", "X\\u0300\\u0315 \\u0319",
1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* blocking combining character */
1034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X \\u0314 \\u0300", "X \\u0314 \\u0300\\u0315",
1035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* contraction prefix */
1036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "AB DC", "AB \\u0315 C","X\\u0300 D \\u0315", "X\\u0300\\u0315 \\u0319",
1037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0300 \\u031A \\u0315",
1038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* ends not with a contraction character */
1039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0300 \\u0319D", "X\\u0300\\u0315 \\u0319D", "X\\u0300 D\\u0315D",
1040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     "X\\u0300\\u0315 \\u0319D", "X\\u0300 \\u031A\\u0315D"
1041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int                 size   = 20;
1043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UCollator          *coll;
1044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UErrorCode          status    = U_ZERO_ERROR;
1045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int                 count     = 0;
1046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UCollationElements *iter;
1047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UCollationElements *resultiter;
1048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll       = ucol_openRules(rule, rulelen, UCOL_OFF, UCOL_DEFAULT_STRENGTH,NULL, &status);
1050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter       = ucol_openElements(coll, rule, 1, &status);
1051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    resultiter = ucol_openElements(coll, rule, 1, &status);
1052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
105485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err_status(status, "Error opening collation rules -> %s\n", u_errorName(status));
1055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (count < size) {
1059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar  str[20];
1060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar  tstr[20];
1061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int    strLen = u_unescape(src[count], str, 20);
1062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar *s;
1063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setText(iter, str, strLen, &status);
1065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status)) {
1066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Error opening collation iterator\n");
1067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
1068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        u_unescape(tgt[count], tstr, 20);
1071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        s = tstr;
1072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("count %d\n", count);
1074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (;;) {
1076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uint32_t  ce;
1077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UChar    *e = u_strchr(s, 0x20);
1078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (e == 0) {
1079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                e = u_strchr(s, 0);
1080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_setText(resultiter, s, (int32_t)(e - s), &status);
1082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ce = ucol_next(resultiter, &status);
1083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (U_FAILURE(status)) {
1084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("Error manipulating collation iterator\n");
1085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return;
1086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            while (ce != UCOL_NULLORDER) {
1088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (ce != (uint32_t)ucol_next(iter, &status) ||
1089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    U_FAILURE(status)) {
1090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Discontiguos contraction test mismatch\n");
1091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return;
1092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                ce = ucol_next(resultiter, &status);
1094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (U_FAILURE(status)) {
1095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Error getting next collation element\n");
1096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return;
1097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            s = e + 1;
1100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (*e == 0) {
1101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                break;
1102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_reset(iter);
1105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        backAndForth(iter);
1106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        count ++;
1107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(resultiter);
1109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_closeElements(iter);
1110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(coll);
1111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
1114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* TestSearchCollatorElements tests iterator behavior (forwards and backwards) with
1115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* normalization on AND jamo tailoring, among other things.
1116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*
1117fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Note: This test is sensitive to changes of the root collator,
1118fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* for example whether the ae-ligature maps to three CEs (as in the DUCET)
1119fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* or to two CEs (as in the CLDR 24 FractionalUCA.txt).
1120fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* It is also sensitive to how those CEs map to the iterator's 32-bit CE encoding.
1121fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* For example, the DUCET's artificial secondary CE in the ae-ligature
1122fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* may map to two 32-bit iterator CEs (as it did until ICU 52).
1123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/
1124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar tsceText[] = {   /* Nothing in here should be ignorable */
1125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0xAC00,                 /* simple LV Hangul */
1126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0xAC01,                 /* simple LVT Hangul */
1127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0xAC0F,                 /* LVTT, last jamo expands for search */
1128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0xAFFF,                 /* LLVVVTT, every jamo expands for search */
1129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0x1100, 0x1161, 0x11A8, /* 0xAC01 as conjoining jamo */
1130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0x3131, 0x314F, 0x3131, /* 0xAC01 as compatibility jamo */
1131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0x1100, 0x1161, 0x11B6, /* 0xAC0F as conjoining jamo; last expands for search */
1132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0x1101, 0x1170, 0x11B6, /* 0xAFFF as conjoining jamo; all expand for search */
1133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0x00E6,                 /* small letter ae, expands */
1134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020, 0x1E4D,                 /* small letter o with tilde and acute, decomposes */
1135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x0020
1136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kLen_tsceText = sizeof(tsceText)/sizeof(tsceText[0]) };
1138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t rootStandardOffsets[] = {
1140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0,  1,2,
1141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    2,  3,4,4,
1142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    4,  5,6,6,
1143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    6,  7,8,8,
1144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    8,  9,10,11,
1145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    12, 13,14,15,
1146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    16, 17,18,19,
1147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    20, 21,22,23,
1148fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    24, 25,26,  /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */
1149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    26, 27,28,28,
1150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    28,
1151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    29
1152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kLen_rootStandardOffsets = sizeof(rootStandardOffsets)/sizeof(rootStandardOffsets[0]) };
1154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t rootSearchOffsets[] = {
1156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0,  1,2,
1157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    2,  3,4,4,
1158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    4,  5,6,6,6,
1159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    6,  7,8,8,8,8,8,8,
1160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    8,  9,10,11,
1161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    12, 13,14,15,
1162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    16, 17,18,19,20,
1163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    20, 21,22,22,23,23,23,24,
1164fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    24, 25,26,  /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */
1165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    26, 27,28,28,
1166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    28,
1167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    29
1168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kLen_rootSearchOffsets = sizeof(rootSearchOffsets)/sizeof(rootSearchOffsets[0]) };
1170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
1172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *    locale;
1173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t * offsets;
1174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t         offsetsLen;
1175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} TSCEItem;
1176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const TSCEItem tsceItems[] = {
1178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "root",                  rootStandardOffsets, kLen_rootStandardOffsets },
1179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "root@collation=search", rootSearchOffsets,   kLen_rootSearchOffsets   },
1180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,                    NULL,                0                        }
1181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestSearchCollatorElements(void)
1184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
1185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const TSCEItem * tsceItemPtr;
1186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (tsceItemPtr = tsceItems; tsceItemPtr->locale != NULL; tsceItemPtr++) {
1187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
1188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UCollator* ucol = ucol_open(tsceItemPtr->locale, &status);
1189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if ( U_SUCCESS(status) ) {
1190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UCollationElements * uce = ucol_openElements(ucol, tsceText, kLen_tsceText, &status);
1191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if ( U_SUCCESS(status) ) {
1192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                int32_t offset, element;
1193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                const int32_t * nextOffsetPtr;
1194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                const int32_t * limitOffsetPtr;
1195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                nextOffsetPtr = tsceItemPtr->offsets;
1197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                limitOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen;
1198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                do {
1199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    offset = ucol_getOffset(uce);
1200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    element = ucol_next(uce, &status);
1201fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    log_verbose("(%s) offset=%2d  ce=%08x\n", tsceItemPtr->locale, offset, element);
1202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if ( element == 0 ) {
1203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("error, locale %s, ucol_next returned element 0\n", tsceItemPtr->locale );
1204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
1205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if ( nextOffsetPtr < limitOffsetPtr ) {
1206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if (offset != *nextOffsetPtr) {
1207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            log_err("error, locale %s, expected ucol_next -> ucol_getOffset %d, got %d\n",
1208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                                            tsceItemPtr->locale, *nextOffsetPtr, offset );
1209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            nextOffsetPtr = limitOffsetPtr;
1210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            break;
1211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
1212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextOffsetPtr++;
1213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    } else {
1214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("error, locale %s, ucol_next returned more elements than expected\n", tsceItemPtr->locale );
1215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
1216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                } while ( U_SUCCESS(status) && element != UCOL_NULLORDER );
1217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if ( nextOffsetPtr < limitOffsetPtr ) {
1218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("error, locale %s, ucol_next returned fewer elements than expected\n", tsceItemPtr->locale );
1219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
1220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                ucol_setOffset(uce, kLen_tsceText, &status);
1222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                nextOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen;
1224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                limitOffsetPtr = tsceItemPtr->offsets;
1225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                do {
1226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    offset = ucol_getOffset(uce);
1227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    element = ucol_previous(uce, &status);
1228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if ( element == 0 ) {
1229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("error, locale %s, ucol_previous returned element 0\n", tsceItemPtr->locale );
1230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
1231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if ( nextOffsetPtr > limitOffsetPtr ) {
1232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextOffsetPtr--;
1233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if (offset != *nextOffsetPtr) {
1234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            log_err("error, locale %s, expected ucol_previous -> ucol_getOffset %d, got %d\n",
1235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                                                tsceItemPtr->locale, *nextOffsetPtr, offset );
1236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            nextOffsetPtr = limitOffsetPtr;
1237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            break;
1238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
1239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                   } else {
1240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("error, locale %s, ucol_previous returned more elements than expected\n", tsceItemPtr->locale );
1241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
1242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                } while ( U_SUCCESS(status) && element != UCOL_NULLORDER );
1243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if ( nextOffsetPtr > limitOffsetPtr ) {
1244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("error, locale %s, ucol_previous returned fewer elements than expected\n", tsceItemPtr->locale );
1245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
1246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                ucol_closeElements(uce);
1248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
1249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("error, locale %s, ucol_openElements failed: %s\n", tsceItemPtr->locale, u_errorName(status) );
1250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            ucol_close(ucol);
1252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
1253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_data_err("error, locale %s, ucol_open failed: %s\n", tsceItemPtr->locale, u_errorName(status) );
1254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
1259