1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   Copyright (C) 2002-2012, International Business Machines
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   file name:  uenumtst.c
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   encoding:   US-ASCII
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   tab size:   8 (not used)
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   indentation:2
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created on: 2002jul08
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created by: Vladimir Weinstein
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uenumimp.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char quikBuf[256];
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char* quikU2C(const UChar* str, int32_t len) {
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_UCharsToChars(str, quikBuf, len);
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    quikBuf[len] = 0;
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return quikBuf;
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* test1[] = {
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "first",
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "second",
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "third",
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "fourth"
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct chArrayContext {
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t currIndex;
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t maxIndex;
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *currChar;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *currUChar;
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char **array;
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct chArrayContext chArrayContext;
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define cont ((chArrayContext *)en->context)
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void U_CALLCONV
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruchArrayClose(UEnumeration *en) {
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(cont->currUChar != NULL) {
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(cont->currUChar);
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cont->currUChar = NULL;
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(en);
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t U_CALLCONV
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruchArrayCount(UEnumeration *en, UErrorCode *status) {
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return cont->maxIndex;
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar* U_CALLCONV
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruchArrayUNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(cont->currIndex >= cont->maxIndex) {
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(cont->currUChar == NULL) {
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cont->currUChar = (UChar *)malloc(1024*sizeof(UChar));
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->currChar = (cont->array)[cont->currIndex];
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *resultLength = (int32_t)strlen(cont->currChar);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_charsToUChars(cont->currChar, cont->currUChar, *resultLength);
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->currIndex++;
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return cont->currUChar;
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* U_CALLCONV
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruchArrayNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(cont->currIndex >= cont->maxIndex) {
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->currChar = (cont->array)[cont->currIndex];
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *resultLength = (int32_t)strlen(cont->currChar);
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->currIndex++;
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return cont->currChar;
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void U_CALLCONV
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruchArrayReset(UEnumeration *en, UErrorCode *status) {
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->currIndex = 0;
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruchArrayContext myCont = {
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    0, 0,
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL, NULL,
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUEnumeration chEnum = {
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    &myCont,
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chArrayClose,
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chArrayCount,
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chArrayUNext,
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chArrayNext,
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chArrayReset
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UEnumeration emptyEnumerator = {
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UEnumeration emptyPartialEnumerator = {
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_unextDefault,
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************/
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar _first[] = {102,105,114,115,116,0};    /* "first"  */
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar _second[]= {115,101,99,111,110,100,0}; /* "second" */
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar _third[] = {116,104,105,114,100,0};    /* "third"  */
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar _fourth[]= {102,111,117,114,116,104,0};/* "fourth" */
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar* test2[] = {
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    _first, _second, _third, _fourth
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct uchArrayContext {
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t currIndex;
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t maxIndex;
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *currUChar;
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar **array;
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct uchArrayContext uchArrayContext;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ucont ((uchArrayContext *)en->context)
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void U_CALLCONV
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruuchArrayClose(UEnumeration *en) {
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(en);
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t U_CALLCONV
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruuchArrayCount(UEnumeration *en, UErrorCode *status) {
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ucont->maxIndex;
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar* U_CALLCONV
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruuchArrayUNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(ucont->currIndex >= ucont->maxIndex) {
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucont->currUChar = (ucont->array)[ucont->currIndex];
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *resultLength = u_strlen(ucont->currUChar);
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucont->currIndex++;
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ucont->currUChar;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void U_CALLCONV
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruuchArrayReset(UEnumeration *en, UErrorCode *status) {
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucont->currIndex = 0;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruuchArrayContext myUCont = {
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    0, 0,
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL, NULL
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUEnumeration uchEnum = {
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    &myUCont,
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uchArrayClose,
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uchArrayCount,
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uchArrayUNext,
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_nextDefault,
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uchArrayReset
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************/
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UEnumeration *getchArrayEnum(const char** source, int32_t size) {
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UEnumeration *en = (UEnumeration *)malloc(sizeof(UEnumeration));
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memcpy(en, &chEnum, sizeof(UEnumeration));
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->array = (char **)source;
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cont->maxIndex = size;
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return en;
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void EnumerationTest(void) {
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t len = 0;
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UEnumeration *en = getchArrayEnum(test1, sizeof(test1)/sizeof(test1[0]));
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *string = NULL;
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *uString = NULL;
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ((string = uenum_next(en, &len, &status))) {
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("read \"%s\", length %i\n", string, len);
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_reset(en, &status);
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ((uString = uenum_unext(en, &len, &status))) {
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("read \"%s\" (UChar), length %i\n", quikU2C(uString, len), len);
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_close(en);
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void EmptyEnumerationTest(void) {
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UEnumeration *emptyEnum = uprv_malloc(sizeof(UEnumeration));
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_memcpy(emptyEnum, &emptyEnumerator, sizeof(UEnumeration));
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uenum_count(emptyEnum, &status) != -1 || status != U_UNSUPPORTED_ERROR) {
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_count failed\n");
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uenum_next(emptyEnum, NULL, &status) != NULL || status != U_UNSUPPORTED_ERROR) {
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_next failed\n");
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uenum_unext(emptyEnum, NULL, &status) != NULL || status != U_UNSUPPORTED_ERROR) {
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_unext failed\n");
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_reset(emptyEnum, &status);
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (status != U_UNSUPPORTED_ERROR) {
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_reset failed\n");
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_close(emptyEnum);
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uenum_next(NULL, NULL, &status) != NULL || status != U_ZERO_ERROR) {
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_next(NULL) failed\n");
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uenum_unext(NULL, NULL, &status) != NULL || status != U_ZERO_ERROR) {
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_unext(NULL) failed\n");
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_reset(NULL, &status);
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (status != U_ZERO_ERROR) {
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("uenum_reset(NULL) failed\n");
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    emptyEnum = uprv_malloc(sizeof(UEnumeration));
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_memcpy(emptyEnum, &emptyPartialEnumerator, sizeof(UEnumeration));
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (uenum_unext(emptyEnum, NULL, &status) != NULL || status != U_UNSUPPORTED_ERROR) {
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("partial uenum_unext failed\n");
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_close(emptyEnum);
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UEnumeration *getuchArrayEnum(const UChar** source, int32_t size) {
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UEnumeration *en = (UEnumeration *)malloc(sizeof(UEnumeration));
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memcpy(en, &uchEnum, sizeof(UEnumeration));
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucont->array = (UChar **)source;
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucont->maxIndex = size;
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return en;
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void DefaultNextTest(void) {
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t len = 0;
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UEnumeration *en = getuchArrayEnum(test2, sizeof(test2)/sizeof(test2[0]));
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *string = NULL;
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *uString = NULL;
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ((uString = uenum_unext(en, &len, &status))) {
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("read \"%s\" (UChar), length %i\n", quikU2C(uString, len), len);
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: uenum_unext => %s\n", u_errorName(status));
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_reset(en, &status);
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ((string = uenum_next(en, &len, &status))) {
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("read \"%s\", length %i\n", string, len);
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: uenum_next => %s\n", u_errorName(status));
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_close(en);
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void verifyEnumeration(int line, UEnumeration *u, const char * const * compareToChar, const UChar * const * compareToUChar, int32_t expect_count) {
30154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UErrorCode status = U_ZERO_ERROR;
30254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  int32_t got_count,i,len;
30354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  const char *c;
30454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UChar buf[1024];
30554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
30654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  log_verbose("%s:%d: verifying enumeration..\n", __FILE__, line);
30754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
30854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  uenum_reset(u, &status);
30954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(U_FAILURE(status)) {
31054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("%s:%d: FAIL: could not reset char strings enumeration: %s\n", __FILE__, line, u_errorName(status));
31154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return;
31254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
31354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
31454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  got_count = uenum_count(u, &status);
31554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(U_FAILURE(status)) {
31654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("%s:%d: FAIL: could not count char strings enumeration: %s\n", __FILE__, line, u_errorName(status));
31754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return;
31854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
31954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
32054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(got_count!=expect_count) {
32154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("%s:%d: FAIL: expect count %d got %d\n", __FILE__, line, expect_count, got_count);
32254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  } else {
32354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("%s:%d: OK: got count %d\n", __FILE__, line, got_count);
32454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
32554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
32654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(compareToChar!=NULL) { /* else, not invariant */
32754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    for(i=0;i<got_count;i++) {
32854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      c = uenum_next(u,&len, &status);
32954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(U_FAILURE(status)) {
33054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: could not iterate to next after %d: %s\n", __FILE__, line, i, u_errorName(status));
33154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return;
33254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
33354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(c==NULL) {
33454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: got NULL for next after %d: %s\n", __FILE__, line, i, u_errorName(status));
33554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return;
33654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
33754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
33854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(strcmp(c,compareToChar[i])) {
33954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: string #%d expected '%s' got '%s'\n", __FILE__, line, i, compareToChar[i], c);
34054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      } else {
34154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: OK: string #%d got '%s'\n", __FILE__, line, i, c);
34254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
34354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
34454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(len!=strlen(compareToChar[i])) {
34554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: string #%d expected len %d got %d\n", __FILE__, line, i, strlen(compareToChar[i]), len);
34654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      } else {
34754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: OK: string #%d got len %d\n", __FILE__, line, i, len);
34854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
34954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
35054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
35154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
35254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  /* now try U */
35354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  uenum_reset(u, &status);
35454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(U_FAILURE(status)) {
35554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("%s:%d: FAIL: could not reset again char strings enumeration: %s\n", __FILE__, line, u_errorName(status));
35654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return;
35754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
35854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
35954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  for(i=0;i<got_count;i++) {
36054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    const UChar *ustr = uenum_unext(u,&len, &status);
36154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
36254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      log_err("%s:%d: FAIL: could not iterate to unext after %d: %s\n", __FILE__, line, i, u_errorName(status));
36354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      return;
36454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
36554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(ustr==NULL) {
36654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      log_err("%s:%d: FAIL: got NULL for unext after %d: %s\n", __FILE__, line, i, u_errorName(status));
36754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      return;
36854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
36954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(compareToChar!=NULL) {
37054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      u_charsToUChars(compareToChar[i], buf, strlen(compareToChar[i])+1);
37154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(u_strncmp(ustr,buf,len)) {
37254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int j;
37354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: ustring #%d expected '%s' got '%s'\n", __FILE__, line, i, compareToChar[i], austrdup(ustr));
37454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        for(j=0;ustr[j]&&buf[j];j++) {
37554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          log_verbose("  @ %d\t<U+%04X> vs <U+%04X>\n", j, ustr[j],buf[j]);
37654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
37754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      } else {
37854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: OK: ustring #%d got '%s'\n", __FILE__, line, i, compareToChar[i]);
37954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
38054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
38154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(len!=strlen(compareToChar[i])) {
38254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: ustring #%d expected len %d got %d\n", __FILE__, line, i, strlen(compareToChar[i]), len);
38354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      } else {
38454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: OK: ustring #%d got len %d\n", __FILE__, line, i, len);
38554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
38654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
38754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
38854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(compareToUChar!=NULL) {
38954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(u_strcmp(ustr,compareToUChar[i])) {
39054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int j;
39154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: ustring #%d expected '%s' got '%s'\n", __FILE__, line, i, austrdup(compareToUChar[i]), austrdup(ustr));
39254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        for(j=0;ustr[j]&&compareToUChar[j];j++) {
39354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          log_verbose("  @ %d\t<U+%04X> vs <U+%04X>\n", j, ustr[j],compareToUChar[j]);
39454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
39554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      } else {
39654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: OK: ustring #%d got '%s'\n", __FILE__, line, i, austrdup(compareToUChar[i]));
39754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
39854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
39954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if(len!=u_strlen(compareToUChar[i])) {
40054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: ustring #%d expected len %d got %d\n", __FILE__, line, i, u_strlen(compareToUChar[i]), len);
40154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      } else {
40254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: OK: ustring #%d got len %d\n", __FILE__, line, i, len);
40354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
40454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
40554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
40654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
40754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
40854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
40954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
41054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
41154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
41254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestCharStringsEnumeration(void)  {
41354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UErrorCode status = U_ZERO_ERROR;
41454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
41554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  /* //! [uenum_openCharStringsEnumeration] */
41654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  const char* strings[] = { "Firstly", "Secondly", "Thirdly", "Fourthly" };
41754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UEnumeration *u = uenum_openCharStringsEnumeration(strings, 4, &status);
41854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  /* //! [uenum_openCharStringsEnumeration] */
41954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(U_FAILURE(status)) {
42054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("FAIL: could not open char strings enumeration: %s\n", u_errorName(status));
42154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return;
42254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
42354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
42454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  verifyEnumeration(__LINE__, u, strings, NULL, 4);
42554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
42654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  uenum_close(u);
42754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
42854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
42954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestUCharStringsEnumeration(void)  {
43054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UErrorCode status = U_ZERO_ERROR;
43154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  /* //! [uenum_openUCharStringsEnumeration] */
43254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  static const UChar nko_1[] = {0x07c1,0}, nko_2[] = {0x07c2}, nko_3[] = {0x07c3,0}, nko_4[] = {0x07c4,0};
43354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  static const UChar* ustrings[] = {  nko_1, nko_2, nko_3, nko_4  };
43454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UEnumeration *u = uenum_openUCharStringsEnumeration(ustrings, 4, &status);
43554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  /* //! [uenum_openUCharStringsEnumeration] */
43654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(U_FAILURE(status)) {
43754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("FAIL: could not open uchar strings enumeration: %s\n", u_errorName(status));
43854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return;
43954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
44054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
44154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  verifyEnumeration(__LINE__, u, NULL, ustrings, 4);
44254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  uenum_close(u);
44354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
44454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
44554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  u =  uenum_openUCharStringsEnumeration(test2, 4, &status);
44654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if(U_FAILURE(status)) {
44754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_err("FAIL: could not reopen uchar strings enumeration: %s\n", u_errorName(status));
44854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return;
44954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
45054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  verifyEnumeration(__LINE__, u, test1, NULL, 4); /* same string */
45154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  uenum_close(u);
45254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
45354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
45454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addEnumerationTest(TestNode** root);
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addEnumerationTest(TestNode** root)
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &EnumerationTest, "tsutil/uenumtst/EnumerationTest");
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &EmptyEnumerationTest, "tsutil/uenumtst/EmptyEnumerationTest");
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &DefaultNextTest, "tsutil/uenumtst/DefaultNextTest");
46254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    addTest(root, &TestCharStringsEnumeration, "tsutil/uenumtst/TestCharStringsEnumeration");
46354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    addTest(root, &TestUCharStringsEnumeration, "tsutil/uenumtst/TestUCharStringsEnumeration");
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
465