1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Copyright (C) 2002-2003, 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
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addEnumerationTest(TestNode** root);
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addEnumerationTest(TestNode** root)
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &EnumerationTest, "tsutil/uenumtst/EnumerationTest");
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &EmptyEnumerationTest, "tsutil/uenumtst/EmptyEnumerationTest");
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &DefaultNextTest, "tsutil/uenumtst/DefaultNextTest");
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
308