OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 2000-2009, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 /* | |
7 * File stdnmtst.c | |
8 * | |
9 * Modification History: | |
10 * | |
11 * Date Name Description | |
12 * 08/05/2000 Yves Creation | |
13 ****************************************************************************** | |
14 */ | |
15 | |
16 #include "unicode/ucnv.h" | |
17 #include "unicode/ustring.h" | |
18 #include "cstring.h" | |
19 #include "cintltst.h" | |
20 | |
21 #define ARRAY_SIZE(array) (int32_t)(sizeof array / sizeof array[0]) | |
22 | |
23 static void TestStandardName(void); | |
24 static void TestStandardNames(void); | |
25 static void TestCanonicalName(void); | |
26 | |
27 void addStandardNamesTest(TestNode** root); | |
28 | |
29 | |
30 void | |
31 addStandardNamesTest(TestNode** root) | |
32 { | |
33 addTest(root, &TestStandardName, "tsconv/stdnmtst/TestStandardName"); | |
34 addTest(root, &TestStandardNames, "tsconv/stdnmtst/TestStandardNames"); | |
35 addTest(root, &TestCanonicalName, "tsconv/stdnmtst/TestCanonicalName"); | |
36 } | |
37 | |
38 static int dotestname(const char *name, const char *standard, const char *expect
ed) { | |
39 int res = 1; | |
40 | |
41 UErrorCode error; | |
42 const char *tag; | |
43 | |
44 error = U_ZERO_ERROR; | |
45 tag = ucnv_getStandardName(name, standard, &error); | |
46 if (!tag && expected) { | |
47 log_err_status(error, "FAIL: could not find %s standard name for %s\n",
standard, name); | |
48 res = 0; | |
49 } else if (expected && (name == tag || uprv_strcmp(expected, tag))) { | |
50 log_err("FAIL: expected %s for %s standard name for %s, got %s\n", expec
ted, standard, name, tag); | |
51 res = 0; | |
52 } | |
53 | |
54 return res; | |
55 } | |
56 | |
57 static void TestStandardName() | |
58 { | |
59 int res = 1; | |
60 | |
61 uint16_t i, count; | |
62 UErrorCode err; | |
63 | |
64 /* Iterate over all standards. */ | |
65 for (i = 0, count = ucnv_countStandards(); i < count-1; ++i) { | |
66 const char *standard; | |
67 | |
68 err = U_ZERO_ERROR; | |
69 standard = ucnv_getStandard(i, &err); | |
70 if (U_FAILURE(err)) { | |
71 log_err("FAIL: ucnv_getStandard(%d), error=%s\n", i, u_errorName(err
)); | |
72 res = 0; | |
73 } else if (!standard || !*standard) { | |
74 log_err("FAIL: %s standard name at index %d\n", (standard ? "empty"
: | |
75 "null"), i); | |
76 res = 0; | |
77 } | |
78 } | |
79 err = U_ZERO_ERROR; | |
80 /* "" must be last */ | |
81 if(!count) { | |
82 log_data_err("No standards. You probably have no data.\n"); | |
83 } else if (*ucnv_getStandard((uint16_t)(count-1), &err) != 0) { | |
84 log_err("FAIL: ucnv_getStandard(%d) should return ""\n", count-1); | |
85 res = 0; | |
86 } | |
87 err = U_ZERO_ERROR; | |
88 if (ucnv_getStandard(++i, &err)) { | |
89 log_err("FAIL: ucnv_getStandard(%d) should return NULL\n", i); | |
90 res = 0; | |
91 } | |
92 | |
93 if (res) { | |
94 log_verbose("PASS: iterating over standard names works\n"); | |
95 } | |
96 | |
97 /* Test for some expected results. */ | |
98 | |
99 if (dotestname("ibm-1208", "MIME", "UTF-8") && | |
100 /*dotestname("cp1252", "MIME", "windows-1252") &&*/ | |
101 dotestname("ascii", "MIME", "US-ASCII") && | |
102 dotestname("csiso2022jp2", "MIME", "ISO-2022-JP-2") && | |
103 dotestname("Iso20-22__cN", "IANA", "ISO-2022-CN") && | |
104 dotestname("ascii", "IANA", "ANSI_X3.4-1968") && | |
105 dotestname("cp850", "IANA", "IBM850") && | |
106 dotestname("crazy", "MIME", NULL) && | |
107 dotestname("ASCII", "crazy", NULL) && | |
108 dotestname("LMBCS-1", "MIME", NULL)) | |
109 { | |
110 log_verbose("PASS: getting IANA and MIME standard names works\n"); | |
111 } | |
112 } | |
113 | |
114 static int dotestconv(const char *name, const char *standard, const char *expect
ed) { | |
115 int res = 1; | |
116 | |
117 UErrorCode error; | |
118 const char *tag; | |
119 | |
120 error = U_ZERO_ERROR; | |
121 tag = ucnv_getCanonicalName(name, standard, &error); | |
122 if (tag && !expected) { | |
123 log_err("FAIL: Unexpectedly found %s canonical name for %s, got %s\n", s
tandard, name, tag); | |
124 res = 0; | |
125 } | |
126 else if (!tag && expected) { | |
127 log_err_status(error, "FAIL: could not find %s canonical name for %s\n",
(standard ? "\"\"" : standard), name); | |
128 res = 0; | |
129 } | |
130 else if (expected && (name == tag || uprv_strcmp(expected, tag) != 0)) { | |
131 log_err("FAIL: expected %s for %s canonical name for %s, got %s\n", expe
cted, standard, name, tag); | |
132 res = 0; | |
133 } | |
134 else { | |
135 log_verbose("PASS: (\"%s\", \"%s\") -> %s == %s \n", name, standard, tag
, expected); | |
136 } | |
137 | |
138 return res; | |
139 } | |
140 | |
141 static void TestCanonicalName() | |
142 { | |
143 /* Test for some expected results. */ | |
144 | |
145 if (dotestconv("UTF-8", "IANA", "UTF-8") && /* default name */ | |
146 dotestconv("UTF-8", "MIME", "UTF-8") && /* default name */ | |
147 dotestconv("ibm-1208", "IBM", "UTF-8") && /* default name */ | |
148 dotestconv("ibm-5305", "IBM", "UTF-8") && /* non-default name */ | |
149 dotestconv("ibm-5305", "MIME", NULL) && /* mapping does not exist */ | |
150 dotestconv("ascii", "MIME", NULL) && /* mapping does not exist */ | |
151 dotestconv("ibm-1208", "IANA", NULL) && /* mapping does not exist */ | |
152 dotestconv("ibm-5305", "IANA", NULL) && /* mapping does not exist */ | |
153 dotestconv("cp1208", "", "UTF-8") && /* default name due to order
ing */ | |
154 dotestconv("UTF16_BigEndian", "", "UTF-16BE") && /* non-default n
ame due to ordering */ | |
155 dotestconv("ISO-2022-CN", "IANA", "ISO_2022,locale=zh,version=0") &&/* d
efault name */ | |
156 dotestconv("Shift_JIS", "MIME", "ibm-943_P15A-2003") &&/* ambiguous alia
s */ | |
157 dotestconv("Shift_JIS", "", "ibm-943_P130-1999") &&/* ambiguous alias */ | |
158 dotestconv("ibm-943", "", "ibm-943_P15A-2003") &&/* ambiguous alias */ | |
159 dotestconv("ibm-943", "IBM", "ibm-943_P130-1999") &&/* ambiguous alias *
/ | |
160 dotestconv("ibm-1363", "", "ibm-1363_P11B-1998") &&/* ambiguous alias */ | |
161 dotestconv("ibm-1363", "IBM", "ibm-1363_P110-1997") &&/* ambiguous alias
*/ | |
162 dotestconv("crazy", "MIME", NULL) && | |
163 dotestconv("ASCII", "crazy", NULL)) | |
164 { | |
165 log_verbose("PASS: getting IANA and MIME canonical names works\n"); | |
166 } | |
167 } | |
168 | |
169 | |
170 static UBool doTestNames(const char *name, const char *standard, const char **ex
pected, int32_t size) { | |
171 UErrorCode err = U_ZERO_ERROR; | |
172 UEnumeration *myEnum = ucnv_openStandardNames(name, standard, &err); | |
173 const char *enumName, *testName; | |
174 int32_t enumCount = uenum_count(myEnum, &err); | |
175 int32_t idx, len, repeatTimes = 3; | |
176 | |
177 if (err == U_FILE_ACCESS_ERROR) { | |
178 log_data_err("Unable to open standard names for %s of standard: %s\n", n
ame, standard); | |
179 return 0; | |
180 } | |
181 if (size != enumCount) { | |
182 log_err("FAIL: different size arrays for %s. Got %d. Expected %d\n", nam
e, enumCount, size); | |
183 return 0; | |
184 } | |
185 if (size < 0 && myEnum) { | |
186 log_err("FAIL: size < 0, but recieved an actual object\n"); | |
187 return 0; | |
188 } | |
189 log_verbose("\n%s %s\n", name, standard); | |
190 while (repeatTimes-- > 0) { | |
191 for (idx = 0; idx < enumCount; idx++) { | |
192 enumName = uenum_next(myEnum, &len, &err); | |
193 testName = expected[idx]; | |
194 if (uprv_strcmp(enumName, testName) != 0 || U_FAILURE(err) | |
195 || len != (int32_t)uprv_strlen(expected[idx])) | |
196 { | |
197 log_err("FAIL: uenum_next(%d) == \"%s\". expected \"%s\", len=%d
, error=%s\n", | |
198 idx, enumName, testName, len, u_errorName(err)); | |
199 } | |
200 log_verbose("%s\n", enumName); | |
201 err = U_ZERO_ERROR; | |
202 } | |
203 if (enumCount >= 0) { | |
204 /* one past the list of all names must return NULL */ | |
205 enumName = uenum_next(myEnum, &len, &err); | |
206 if (enumName != NULL || len != 0 || U_FAILURE(err)) { | |
207 log_err("FAIL: uenum_next(past the list) did not return NULL[0]
with U_SUCCESS(). name=%s standard=%s len=%d err=%s\n", name, standard, len, u_e
rrorName(err)); | |
208 } | |
209 } | |
210 log_verbose("\n reset\n"); | |
211 uenum_reset(myEnum, &err); | |
212 if (U_FAILURE(err)) { | |
213 log_err("FAIL: uenum_reset() for %s{%s} failed with %s\n", | |
214 name, standard, u_errorName(err)); | |
215 err = U_ZERO_ERROR; | |
216 } | |
217 } | |
218 uenum_close(myEnum); | |
219 return 1; | |
220 } | |
221 | |
222 static UBool doTestUCharNames(const char *name, const char *standard, const char
**expected, int32_t size) { | |
223 UErrorCode err = U_ZERO_ERROR; | |
224 UEnumeration *myEnum = ucnv_openStandardNames(name, standard, &err); | |
225 int32_t enumCount = uenum_count(myEnum, &err); | |
226 int32_t idx, repeatTimes = 3; | |
227 | |
228 if (err == U_FILE_ACCESS_ERROR) { | |
229 log_data_err("Unable to open standard names for %s of standard: %s\n", n
ame, standard); | |
230 return 0; | |
231 } | |
232 | |
233 if (size != enumCount) { | |
234 log_err("FAIL: different size arrays. Got %d. Expected %d\n", enumCount,
size); | |
235 return 0; | |
236 } | |
237 if (size < 0 && myEnum) { | |
238 log_err("FAIL: size < 0, but recieved an actual object\n"); | |
239 return 0; | |
240 } | |
241 log_verbose("\n%s %s\n", name, standard); | |
242 while (repeatTimes-- > 0) { | |
243 for (idx = 0; idx < enumCount; idx++) { | |
244 UChar testName[256]; | |
245 int32_t len; | |
246 const UChar *enumName = uenum_unext(myEnum, &len, &err); | |
247 u_uastrncpy(testName, expected[idx], sizeof(testName)/sizeof(testNam
e[0])); | |
248 if (u_strcmp(enumName, testName) != 0 || U_FAILURE(err) | |
249 || len != (int32_t)uprv_strlen(expected[idx])) | |
250 { | |
251 log_err("FAIL: uenum_next(%d) == \"%s\". expected \"%s\", len=%d
, error=%s\n", | |
252 idx, enumName, testName, len, u_errorName(err)); | |
253 } | |
254 log_verbose("%s\n", expected[idx]); | |
255 err = U_ZERO_ERROR; | |
256 } | |
257 log_verbose("\n reset\n"); | |
258 uenum_reset(myEnum, &err); | |
259 if (U_FAILURE(err)) { | |
260 log_err("FAIL: uenum_reset() for %s{%s} failed with %s\n", | |
261 name, standard, u_errorName(err)); | |
262 err = U_ZERO_ERROR; | |
263 } | |
264 } | |
265 uenum_close(myEnum); | |
266 return 1; | |
267 } | |
268 | |
269 static void TestStandardNames() | |
270 { | |
271 static const char *asciiIANA[] = { | |
272 "ANSI_X3.4-1968", | |
273 "US-ASCII", | |
274 "ASCII", | |
275 "ANSI_X3.4-1986", | |
276 "ISO_646.irv:1991", | |
277 "ISO646-US", | |
278 "us", | |
279 "csASCII", | |
280 "iso-ir-6", | |
281 "cp367", | |
282 "IBM367", | |
283 }; | |
284 static const char *asciiMIME[] = { | |
285 "US-ASCII" | |
286 }; | |
287 | |
288 static const char *iso2022MIME[] = { | |
289 "ISO-2022-KR", | |
290 }; | |
291 | |
292 doTestNames("ASCII", "IANA", asciiIANA, ARRAY_SIZE(asciiIANA)); | |
293 doTestNames("US-ASCII", "IANA", asciiIANA, ARRAY_SIZE(asciiIANA)); | |
294 doTestNames("ASCII", "MIME", asciiMIME, ARRAY_SIZE(asciiMIME)); | |
295 doTestNames("ascii", "mime", asciiMIME, ARRAY_SIZE(asciiMIME)); | |
296 | |
297 doTestNames("ASCII", "crazy", asciiMIME, -1); | |
298 doTestNames("crazy", "MIME", asciiMIME, -1); | |
299 | |
300 doTestNames("LMBCS-1", "MIME", asciiMIME, 0); | |
301 | |
302 doTestNames("ISO_2022,locale=ko,version=0", "MIME", iso2022MIME, ARRAY_SIZE(
iso2022MIME)); | |
303 doTestNames("csiso2022kr", "MIME", iso2022MIME, ARRAY_SIZE(iso2022MIME)); | |
304 | |
305 log_verbose(" Testing unext()\n"); | |
306 doTestUCharNames("ASCII", "IANA", asciiIANA, ARRAY_SIZE(asciiIANA)); | |
307 | |
308 } | |
OLD | NEW |