]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /******************************************************************** |
2 | * COPYRIGHT: | |
729e4ab9 | 3 | * Copyright (c) 1997-2010, International Business Machines Corporation and |
b75a7d8f A |
4 | * others. All Rights Reserved. |
5 | ********************************************************************/ | |
6 | /******************************************************************************* | |
7 | * | |
8 | * File CRESTST.C | |
9 | * | |
10 | * Modification History: | |
11 | * Name Description | |
12 | * Madhu Katragadda Ported for C API | |
13 | * 06/14/99 stephen Updated for RB API changes (no suffix). | |
14 | ******************************************************************************** | |
15 | */ | |
16 | ||
17 | ||
18 | #include "unicode/utypes.h" | |
19 | #include "cintltst.h" | |
20 | #include "unicode/ustring.h" | |
21 | #include "cstring.h" | |
22 | #include "filestrm.h" | |
374ca955 | 23 | #include <stdlib.h> |
b75a7d8f A |
24 | |
25 | #define RESTEST_HEAP_CHECK 0 | |
26 | ||
27 | #include "unicode/ures.h" | |
28 | #include "crestst.h" | |
29 | #include "unicode/ctest.h" | |
30 | ||
374ca955 A |
31 | #include "ucol_imp.h" /* collation */ |
32 | ||
33 | #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) | |
34 | ||
b75a7d8f A |
35 | static void TestOpenDirect(void); |
36 | static void TestFallback(void); | |
374ca955 | 37 | static void TestTable32(void); |
b75a7d8f A |
38 | static void TestFileStream(void); |
39 | /*****************************************************************************/ | |
40 | ||
41 | const UChar kERROR[] = { 0x0045 /*E*/, 0x0052 /*'R'*/, 0x0052 /*'R'*/, | |
42 | 0x004F /*'O'*/, 0x0052/*'R'*/, 0x0000 /*'\0'*/}; | |
43 | ||
44 | /*****************************************************************************/ | |
45 | ||
46 | enum E_Where | |
47 | { | |
48 | e_Root, | |
49 | e_te, | |
50 | e_te_IN, | |
51 | e_Where_count | |
52 | }; | |
53 | typedef enum E_Where E_Where; | |
54 | /*****************************************************************************/ | |
55 | ||
56 | #define CONFIRM_EQ(actual,expected) if (u_strcmp(expected,actual)==0){ record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, austrdup(actual), austrdup(expected)); } | |
57 | ||
58 | #define CONFIRM_ErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, myErrorName(actual), myErrorName(expected)); } | |
59 | ||
60 | ||
61 | /* Array of our test objects */ | |
62 | ||
63 | static struct | |
64 | { | |
65 | const char* name; | |
66 | UErrorCode expected_constructor_status; | |
67 | E_Where where; | |
68 | UBool like[e_Where_count]; | |
69 | UBool inherits[e_Where_count]; | |
70 | } param[] = | |
71 | { | |
72 | /* "te" means test */ | |
73 | /* "IN" means inherits */ | |
74 | /* "NE" or "ne" means "does not exist" */ | |
75 | ||
76 | { "root", U_ZERO_ERROR, e_Root, { TRUE, FALSE, FALSE }, { TRUE, FALSE, FALSE } }, | |
77 | { "te", U_ZERO_ERROR, e_te, { FALSE, TRUE, FALSE }, { TRUE, TRUE, FALSE } }, | |
78 | { "te_IN", U_ZERO_ERROR, e_te_IN, { FALSE, FALSE, TRUE }, { TRUE, TRUE, TRUE } }, | |
79 | { "te_NE", U_USING_FALLBACK_WARNING, e_te, { FALSE, TRUE, FALSE }, { TRUE, TRUE, FALSE } }, | |
80 | { "te_IN_NE", U_USING_FALLBACK_WARNING, e_te_IN, { FALSE, FALSE, TRUE }, { TRUE, TRUE, TRUE } }, | |
81 | { "ne", U_USING_DEFAULT_WARNING, e_Root, { TRUE, FALSE, FALSE }, { TRUE, FALSE, FALSE } } | |
82 | }; | |
83 | ||
84 | static int32_t bundles_count = sizeof(param) / sizeof(param[0]); | |
85 | ||
86 | ||
87 | ||
88 | /***************************************************************************************/ | |
89 | ||
90 | /* Array of our test objects */ | |
91 | ||
92 | void addResourceBundleTest(TestNode** root); | |
93 | ||
94 | void addResourceBundleTest(TestNode** root) | |
95 | { | |
729e4ab9 | 96 | #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
b75a7d8f A |
97 | addTest(root, &TestConstruction1, "tsutil/crestst/TestConstruction1"); |
98 | addTest(root, &TestOpenDirect, "tsutil/crestst/TestOpenDirect"); | |
374ca955 A |
99 | addTest(root, &TestResourceBundles, "tsutil/crestst/TestResourceBundles"); |
100 | addTest(root, &TestTable32, "tsutil/crestst/TestTable32"); | |
b75a7d8f | 101 | addTest(root, &TestFileStream, "tsutil/crestst/TestFileStream"); |
374ca955 A |
102 | addTest(root, &TestGetSize, "tsutil/crestst/TestGetSize"); |
103 | addTest(root, &TestGetLocaleByType, "tsutil/crestst/TestGetLocaleByType"); | |
729e4ab9 A |
104 | #endif |
105 | addTest(root, &TestFallback, "tsutil/crestst/TestFallback"); | |
106 | addTest(root, &TestAliasConflict, "tsutil/crestst/TestAliasConflict"); | |
107 | ||
b75a7d8f A |
108 | } |
109 | ||
110 | ||
111 | /***************************************************************************************/ | |
112 | void TestAliasConflict(void) { | |
113 | UErrorCode status = U_ZERO_ERROR; | |
114 | UResourceBundle *he = NULL; | |
115 | UResourceBundle *iw = NULL; | |
116 | const UChar *result = NULL; | |
117 | int32_t resultLen; | |
118 | ||
119 | he = ures_open(NULL, "he", &status); | |
120 | iw = ures_open(NULL, "iw", &status); | |
121 | if(U_FAILURE(status)) { | |
729e4ab9 | 122 | log_err_status(status, "Failed to get resource with %s\n", myErrorName(status)); |
b75a7d8f A |
123 | } |
124 | ures_close(iw); | |
46f4442e | 125 | result = ures_getStringByKey(he, "ExemplarCharacters", &resultLen, &status); |
b75a7d8f | 126 | if(U_FAILURE(status) || result == NULL) { |
729e4ab9 | 127 | log_err_status(status, "Failed to get resource with %s\n", myErrorName(status)); |
b75a7d8f A |
128 | } |
129 | ures_close(he); | |
130 | } | |
131 | ||
132 | ||
133 | void TestResourceBundles() | |
134 | { | |
46f4442e A |
135 | UErrorCode status = U_ZERO_ERROR; |
136 | loadTestData(&status); | |
137 | if(U_FAILURE(status)) { | |
138 | log_data_err("Could not load testdata.dat, status = %s\n", u_errorName(status)); | |
139 | return; | |
140 | } | |
141 | ||
b75a7d8f A |
142 | testTag("only_in_Root", TRUE, FALSE, FALSE); |
143 | testTag("in_Root_te", TRUE, TRUE, FALSE); | |
144 | testTag("in_Root_te_te_IN", TRUE, TRUE, TRUE); | |
145 | testTag("in_Root_te_IN", TRUE, FALSE, TRUE); | |
146 | testTag("only_in_te", FALSE, TRUE, FALSE); | |
147 | testTag("only_in_te_IN", FALSE, FALSE, TRUE); | |
148 | testTag("in_te_te_IN", FALSE, TRUE, TRUE); | |
149 | testTag("nonexistent", FALSE, FALSE, FALSE); | |
150 | ||
151 | log_verbose("Passed:= %d Failed= %d \n", pass, fail); | |
152 | } | |
153 | ||
154 | void TestConstruction1() | |
155 | { | |
156 | UResourceBundle *test1 = 0, *test2 = 0; | |
157 | const UChar *result1, *result2; | |
158 | int32_t resultLen; | |
159 | UChar temp[7]; | |
160 | ||
161 | UErrorCode err = U_ZERO_ERROR; | |
162 | const char* testdatapath ; | |
163 | const char* locale="te_IN"; | |
164 | ||
165 | log_verbose("Testing ures_open()......\n"); | |
166 | ||
167 | ||
168 | testdatapath=loadTestData(&err); | |
169 | if(U_FAILURE(err)) | |
170 | { | |
46f4442e | 171 | log_data_err("Could not load testdata.dat %s \n",myErrorName(err)); |
b75a7d8f A |
172 | return; |
173 | } | |
174 | ||
175 | test1=ures_open(testdatapath, NULL, &err); | |
176 | if(U_FAILURE(err)) | |
177 | { | |
178 | log_err("construction of %s did not succeed : %s \n",NULL, myErrorName(err)); | |
179 | return; | |
180 | } | |
181 | ||
182 | ||
183 | test2=ures_open(testdatapath, locale, &err); | |
184 | if(U_FAILURE(err)) | |
185 | { | |
186 | log_err("construction of %s did not succeed : %s \n",locale, myErrorName(err)); | |
187 | return; | |
188 | } | |
189 | result1= ures_getStringByKey(test1, "string_in_Root_te_te_IN", &resultLen, &err); | |
190 | result2= ures_getStringByKey(test2, "string_in_Root_te_te_IN", &resultLen, &err); | |
191 | ||
192 | ||
193 | if (U_FAILURE(err)) { | |
194 | log_err("Something threw an error in TestConstruction(): %s\n", myErrorName(err)); | |
195 | return; | |
196 | } | |
197 | ||
198 | u_uastrcpy(temp, "TE_IN"); | |
199 | ||
200 | if(u_strcmp(result2, temp)!=0) | |
201 | { | |
202 | int n; | |
203 | ||
204 | log_err("Construction test failed for ures_open();\n"); | |
729e4ab9 | 205 | if(!getTestOption(VERBOSITY_OPTION)) |
b75a7d8f A |
206 | log_info("(run verbose for more information)\n"); |
207 | ||
208 | log_verbose("\nGot->"); | |
209 | for(n=0;result2[n];n++) | |
210 | { | |
211 | log_verbose("%04X ",result2[n]); | |
212 | } | |
213 | log_verbose("<\n"); | |
214 | ||
215 | log_verbose("\nWant>"); | |
216 | for(n=0;temp[n];n++) | |
217 | { | |
218 | log_verbose("%04X ",temp[n]); | |
219 | } | |
220 | log_verbose("<\n"); | |
221 | ||
222 | } | |
223 | ||
224 | log_verbose("for string_in_Root_te_te_IN, default.txt had %s\n", austrdup(result1)); | |
225 | log_verbose("for string_in_Root_te_te_IN, te_IN.txt had %s\n", austrdup(result2)); | |
226 | ||
227 | /* Test getVersionNumber*/ | |
228 | log_verbose("Testing version number\n"); | |
229 | log_verbose("for getVersionNumber : %s\n", ures_getVersionNumber(test1)); | |
230 | ||
231 | ures_close(test1); | |
232 | ures_close(test2); | |
233 | } | |
234 | ||
235 | /*****************************************************************************/ | |
236 | /*****************************************************************************/ | |
237 | ||
238 | UBool testTag(const char* frag, | |
239 | UBool in_Root, | |
240 | UBool in_te, | |
241 | UBool in_te_IN) | |
242 | { | |
243 | int32_t passNum=pass; | |
244 | ||
245 | /* Make array from input params */ | |
246 | ||
247 | UBool is_in[3]; | |
248 | const char *NAME[] = { "ROOT", "TE", "TE_IN" }; | |
249 | ||
250 | /* Now try to load the desired items */ | |
251 | UResourceBundle* theBundle = NULL; | |
252 | char tag[99]; | |
253 | char action[256]; | |
254 | UErrorCode status = U_ZERO_ERROR,expected_resource_status = U_ZERO_ERROR; | |
255 | UChar* base = NULL; | |
256 | UChar* expected_string = NULL; | |
257 | const UChar* string = NULL; | |
258 | char item_tag[10]; | |
259 | int32_t i,j; | |
260 | int32_t actual_bundle; | |
261 | int32_t resultLen; | |
262 | const char *testdatapath = loadTestData(&status); | |
263 | ||
264 | is_in[0] = in_Root; | |
265 | is_in[1] = in_te; | |
266 | is_in[2] = in_te_IN; | |
267 | ||
268 | strcpy(item_tag, "tag"); | |
269 | ||
270 | status = U_ZERO_ERROR; | |
271 | theBundle = ures_open(testdatapath, "root", &status); | |
272 | if(U_FAILURE(status)) | |
273 | { | |
274 | ures_close(theBundle); | |
275 | log_err("Couldn't open root bundle in %s", testdatapath); | |
276 | return FALSE; | |
277 | } | |
278 | ures_close(theBundle); | |
279 | theBundle = NULL; | |
280 | ||
281 | ||
282 | for (i=0; i<bundles_count; ++i) | |
283 | { | |
284 | strcpy(action,"construction for"); | |
285 | strcat(action, param[i].name); | |
286 | ||
287 | ||
288 | status = U_ZERO_ERROR; | |
289 | ||
290 | theBundle = ures_open(testdatapath, param[i].name, &status); | |
291 | /*theBundle = ures_open("c:\\icu\\icu\\source\\test\\testdata\\testdata", param[i].name, &status);*/ | |
292 | ||
293 | CONFIRM_ErrorCode(status,param[i].expected_constructor_status); | |
294 | ||
295 | ||
296 | ||
297 | if(i == 5) | |
298 | actual_bundle = 0; /* ne -> default */ | |
299 | else if(i == 3) | |
300 | actual_bundle = 1; /* te_NE -> te */ | |
301 | else if(i == 4) | |
302 | actual_bundle = 2; /* te_IN_NE -> te_IN */ | |
303 | else | |
304 | actual_bundle = i; | |
305 | ||
306 | expected_resource_status = U_MISSING_RESOURCE_ERROR; | |
307 | for (j=e_te_IN; j>=e_Root; --j) | |
308 | { | |
309 | if (is_in[j] && param[i].inherits[j]) | |
310 | { | |
311 | ||
312 | if(j == actual_bundle) /* it's in the same bundle OR it's a nonexistent=default bundle (5) */ | |
313 | expected_resource_status = U_ZERO_ERROR; | |
314 | else if(j == 0) | |
315 | expected_resource_status = U_USING_DEFAULT_WARNING; | |
316 | else | |
317 | expected_resource_status = U_USING_FALLBACK_WARNING; | |
318 | ||
319 | log_verbose("%s[%d]::%s: in<%d:%s> inherits<%d:%s>. actual_bundle=%s\n", | |
320 | param[i].name, | |
321 | i, | |
322 | frag, | |
323 | j, | |
324 | is_in[j]?"Yes":"No", | |
325 | j, | |
326 | param[i].inherits[j]?"Yes":"No", | |
327 | param[actual_bundle].name); | |
328 | ||
329 | break; | |
330 | } | |
331 | } | |
332 | ||
333 | for (j=param[i].where; j>=0; --j) | |
334 | { | |
335 | if (is_in[j]) | |
336 | { | |
337 | if(base != NULL) { | |
338 | free(base); | |
339 | base = NULL; | |
340 | } | |
341 | ||
342 | base=(UChar*)malloc(sizeof(UChar)*(strlen(NAME[j]) + 1)); | |
343 | u_uastrcpy(base,NAME[j]); | |
344 | ||
345 | break; | |
346 | } | |
347 | else { | |
348 | if(base != NULL) { | |
349 | free(base); | |
350 | base = NULL; | |
351 | } | |
352 | base = (UChar*) malloc(sizeof(UChar) * 1); | |
353 | *base = 0x0000; | |
354 | } | |
355 | } | |
356 | ||
357 | /*-------------------------------------------------------------------- */ | |
358 | /* string */ | |
359 | ||
360 | strcpy(tag,"string_"); | |
361 | strcat(tag,frag); | |
362 | ||
363 | strcpy(action,param[i].name); | |
364 | strcat(action, ".ures_get(" ); | |
365 | strcat(action,tag); | |
366 | strcat(action, ")"); | |
367 | ||
368 | string= kERROR; | |
369 | ||
370 | status = U_ZERO_ERROR; | |
371 | ||
372 | ures_getStringByKey(theBundle, tag, &resultLen, &status); | |
373 | if(U_SUCCESS(status)) | |
374 | { | |
375 | status = U_ZERO_ERROR; | |
376 | string=ures_getStringByKey(theBundle, tag, &resultLen, &status); | |
377 | } | |
378 | ||
379 | log_verbose("%s got %d, expected %d\n", action, status, expected_resource_status); | |
380 | ||
381 | CONFIRM_ErrorCode(status, expected_resource_status); | |
382 | ||
383 | ||
384 | if(U_SUCCESS(status)){ | |
385 | expected_string=(UChar*)malloc(sizeof(UChar)*(u_strlen(base) + 3)); | |
386 | u_strcpy(expected_string,base); | |
387 | ||
388 | } | |
389 | else | |
390 | { | |
391 | expected_string = (UChar*)malloc(sizeof(UChar)*(u_strlen(kERROR) + 1)); | |
392 | u_strcpy(expected_string,kERROR); | |
393 | ||
394 | } | |
395 | ||
396 | CONFIRM_EQ(string, expected_string); | |
397 | ||
398 | free(expected_string); | |
399 | ures_close(theBundle); | |
400 | } | |
401 | free(base); | |
402 | return (UBool)(passNum == pass); | |
403 | } | |
404 | ||
405 | void record_pass() | |
406 | { | |
407 | ++pass; | |
408 | } | |
409 | ||
410 | void record_fail() | |
411 | { | |
412 | ++fail; | |
413 | } | |
414 | ||
415 | /** | |
416 | * Test to make sure that the U_USING_FALLBACK_ERROR and U_USING_DEFAULT_ERROR | |
417 | * are set correctly | |
418 | */ | |
419 | ||
420 | static void TestFallback() | |
421 | { | |
422 | UErrorCode status = U_ZERO_ERROR; | |
423 | UResourceBundle *fr_FR = NULL; | |
374ca955 | 424 | UResourceBundle *subResource = NULL; |
b75a7d8f A |
425 | const UChar *junk; /* ignored */ |
426 | int32_t resultLen; | |
427 | ||
428 | log_verbose("Opening fr_FR.."); | |
429 | fr_FR = ures_open(NULL, "fr_FR", &status); | |
430 | if(U_FAILURE(status)) | |
431 | { | |
729e4ab9 | 432 | log_err_status(status, "Couldn't open fr_FR - %s\n", u_errorName(status)); |
b75a7d8f A |
433 | return; |
434 | } | |
435 | ||
436 | status = U_ZERO_ERROR; | |
437 | ||
438 | ||
439 | /* clear it out.. just do some calls to get the gears turning */ | |
440 | junk = ures_getStringByKey(fr_FR, "LocaleID", &resultLen, &status); | |
441 | status = U_ZERO_ERROR; | |
442 | junk = ures_getStringByKey(fr_FR, "LocaleString", &resultLen, &status); | |
443 | status = U_ZERO_ERROR; | |
444 | junk = ures_getStringByKey(fr_FR, "LocaleID", &resultLen, &status); | |
445 | status = U_ZERO_ERROR; | |
446 | ||
447 | /* OK first one. This should be a Default value. */ | |
374ca955 | 448 | subResource = ures_getByKey(fr_FR, "MeasurementSystem", NULL, &status); |
b75a7d8f A |
449 | if(status != U_USING_DEFAULT_WARNING) |
450 | { | |
374ca955 | 451 | log_data_err("Expected U_USING_DEFAULT_ERROR when trying to get CurrencyMap from fr_FR, got %s\n", |
b75a7d8f A |
452 | u_errorName(status)); |
453 | } | |
374ca955 | 454 | ures_close(subResource); |
b75a7d8f A |
455 | status = U_ZERO_ERROR; |
456 | ||
457 | /* and this is a Fallback, to fr */ | |
729e4ab9 | 458 | junk = ures_getStringByKey(fr_FR, "ExemplarCharacters", &resultLen, &status); |
b75a7d8f A |
459 | if(status != U_USING_FALLBACK_WARNING) |
460 | { | |
729e4ab9 | 461 | log_data_err("Expected U_USING_FALLBACK_ERROR when trying to get ExemplarCharacters from fr_FR, got %s\n", |
b75a7d8f A |
462 | u_errorName(status)); |
463 | } | |
464 | ||
465 | status = U_ZERO_ERROR; | |
466 | ||
467 | ures_close(fr_FR); | |
468 | } | |
469 | ||
470 | static void | |
471 | TestOpenDirect(void) { | |
73c04bcf | 472 | UResourceBundle *idna_rules, *casing, *te_IN, *ne, *item; |
b75a7d8f A |
473 | UErrorCode errorCode; |
474 | ||
475 | /* | |
476 | * test that ures_openDirect() opens a resource bundle | |
477 | * where one can look up its own items but not fallback items | |
478 | * from root or similar | |
479 | */ | |
480 | errorCode=U_ZERO_ERROR; | |
73c04bcf | 481 | idna_rules=ures_openDirect(loadTestData(&errorCode), "idna_rules", &errorCode); |
b75a7d8f | 482 | if(U_FAILURE(errorCode)) { |
46f4442e | 483 | log_data_err("ures_openDirect(\"idna_rules\") failed: %s\n", u_errorName(errorCode)); |
b75a7d8f A |
484 | return; |
485 | } | |
486 | ||
374ca955 A |
487 | if(0!=uprv_strcmp("idna_rules", ures_getLocale(idna_rules, &errorCode))) { |
488 | log_err("ures_openDirect(\"idna_rules\").getLocale()!=idna_rules\n"); | |
b75a7d8f A |
489 | } |
490 | errorCode=U_ZERO_ERROR; | |
491 | ||
374ca955 A |
492 | /* try an item in idna_rules, must work */ |
493 | item=ures_getByKey(idna_rules, "UnassignedSet", NULL, &errorCode); | |
b75a7d8f A |
494 | if(U_FAILURE(errorCode)) { |
495 | log_err("translit_index.getByKey(local key) failed: %s\n", u_errorName(errorCode)); | |
496 | errorCode=U_ZERO_ERROR; | |
497 | } else { | |
498 | ures_close(item); | |
499 | } | |
500 | ||
501 | /* try an item in root, must fail */ | |
73c04bcf | 502 | item=ures_getByKey(idna_rules, "ShortLanguage", NULL, &errorCode); |
b75a7d8f A |
503 | if(U_FAILURE(errorCode)) { |
504 | errorCode=U_ZERO_ERROR; | |
505 | } else { | |
374ca955 | 506 | log_err("idna_rules.getByKey(root key) succeeded!\n"); |
b75a7d8f A |
507 | ures_close(item); |
508 | } | |
374ca955 | 509 | ures_close(idna_rules); |
b75a7d8f | 510 | |
374ca955 | 511 | /* now make sure that "idna_rules" will not work with ures_open() */ |
b75a7d8f | 512 | errorCode=U_ZERO_ERROR; |
374ca955 | 513 | idna_rules=ures_open("testdata", "idna_rules", &errorCode); |
b75a7d8f A |
514 | if(U_FAILURE(errorCode) || errorCode==U_USING_DEFAULT_WARNING || errorCode==U_USING_FALLBACK_WARNING) { |
515 | /* falling back to default or root is ok */ | |
516 | errorCode=U_ZERO_ERROR; | |
374ca955 | 517 | } else if(0!=uprv_strcmp("idna_rules", ures_getLocale(idna_rules, &errorCode))) { |
b75a7d8f A |
518 | /* Opening this file will work in "files mode" on Windows and the Mac, |
519 | which have case insensitive file systems */ | |
374ca955 | 520 | log_err("ures_open(\"idna_rules\") succeeded, should fail! Got: %s\n", u_errorName(errorCode)); |
b75a7d8f | 521 | } |
374ca955 | 522 | ures_close(idna_rules); |
b75a7d8f A |
523 | |
524 | /* ures_openDirect("translit_index_WronG") must fail */ | |
374ca955 | 525 | idna_rules=ures_openDirect(NULL, "idna_rules_WronG", &errorCode); |
b75a7d8f A |
526 | if(U_FAILURE(errorCode)) { |
527 | errorCode=U_ZERO_ERROR; | |
528 | } else { | |
374ca955 A |
529 | log_err("ures_openDirect(\"idna_rules_WronG\") succeeded, should fail!\n"); |
530 | } | |
531 | ures_close(idna_rules); | |
532 | ||
533 | errorCode = U_USING_FALLBACK_WARNING;; | |
534 | idna_rules=ures_openDirect("testdata", "idna_rules", &errorCode); | |
535 | if(U_FAILURE(errorCode)) { | |
46f4442e | 536 | log_data_err("ures_openDirect(\"idna_rules\") failed when U_USING_FALLBACK_WARNING was set prior to call: %s\n", u_errorName(errorCode)); |
374ca955 | 537 | return; |
b75a7d8f | 538 | } |
374ca955 | 539 | ures_close(idna_rules); |
73c04bcf A |
540 | |
541 | /* | |
542 | * ICU 3.6 has new resource bundle syntax and data for bundles that do not | |
543 | * participate in locale fallback. Now, | |
544 | * - ures_open() works like ures_openDirect() on a bundle with a top-level | |
545 | * type of ":table(nofallback)" _if_ the bundle exists | |
546 | * - ures_open() will continue to find a root bundle if the requested one | |
547 | * does not exist, unlike ures_openDirect() | |
548 | * | |
549 | * Test with a different bundle than above to avoid confusion in the cache. | |
550 | */ | |
551 | ||
552 | /* | |
553 | * verify that ures_open("casing"), which now has a nofallback declaration, | |
554 | * does not enable fallbacks | |
555 | */ | |
556 | errorCode=U_ZERO_ERROR; | |
557 | casing=ures_open("testdata", "casing", &errorCode); | |
558 | if(U_FAILURE(errorCode)) { | |
46f4442e | 559 | log_data_err("ures_open(\"casing\") failed: %s\n", u_errorName(errorCode)); |
73c04bcf A |
560 | return; |
561 | } | |
562 | ||
563 | errorCode=U_ZERO_ERROR; | |
564 | item=ures_getByKey(casing, "Info", NULL, &errorCode); | |
565 | if(U_FAILURE(errorCode)) { | |
566 | log_err("casing.getByKey(Info) failed - %s\n", u_errorName(errorCode)); | |
567 | } else { | |
568 | ures_close(item); | |
569 | } | |
570 | ||
571 | errorCode=U_ZERO_ERROR; | |
572 | item=ures_getByKey(casing, "ShortLanguage", NULL, &errorCode); | |
573 | if(U_SUCCESS(errorCode)) { | |
574 | log_err("casing.getByKey(root key) succeeded despite nofallback declaration - %s\n", u_errorName(errorCode)); | |
575 | ures_close(item); | |
576 | } | |
577 | ures_close(casing); | |
578 | ||
579 | /* | |
580 | * verify that ures_open("ne") finds the root bundle but | |
581 | * ures_openDirect("ne") does not | |
582 | */ | |
583 | errorCode=U_ZERO_ERROR; | |
584 | ne=ures_open("testdata", "ne", &errorCode); | |
585 | if(U_FAILURE(errorCode)) { | |
46f4442e | 586 | log_data_err("ures_open(\"ne\") failed (expected to get root): %s\n", u_errorName(errorCode)); |
73c04bcf A |
587 | } |
588 | if(errorCode!=U_USING_DEFAULT_WARNING || 0!=uprv_strcmp("root", ures_getLocale(ne, &errorCode))) { | |
589 | log_err("ures_open(\"ne\") found something other than \"root\" - %s\n", u_errorName(errorCode)); | |
590 | } | |
591 | ures_close(ne); | |
592 | ||
593 | errorCode=U_ZERO_ERROR; | |
594 | ne=ures_openDirect("testdata", "ne", &errorCode); | |
595 | if(U_SUCCESS(errorCode)) { | |
46f4442e | 596 | log_data_err("ures_openDirect(\"ne\") succeeded unexpectedly\n"); |
73c04bcf A |
597 | ures_close(ne); |
598 | } | |
599 | ||
600 | /* verify that ures_openDirect("te_IN") does not enable fallbacks */ | |
601 | errorCode=U_ZERO_ERROR; | |
602 | te_IN=ures_openDirect("testdata", "te_IN", &errorCode); | |
603 | if(U_FAILURE(errorCode)) { | |
46f4442e | 604 | log_data_err("ures_open(\"te_IN\") failed: %s\n", u_errorName(errorCode)); |
73c04bcf A |
605 | return; |
606 | } | |
607 | errorCode=U_ZERO_ERROR; | |
608 | item=ures_getByKey(te_IN, "ShortLanguage", NULL, &errorCode); | |
609 | if(U_SUCCESS(errorCode)) { | |
610 | log_err("te_IN.getByKey(root key) succeeded despite use of ures_openDirect() - %s\n", u_errorName(errorCode)); | |
611 | ures_close(item); | |
612 | } | |
613 | ures_close(te_IN); | |
374ca955 A |
614 | } |
615 | ||
616 | static int32_t | |
617 | parseTable32Key(const char *key) { | |
618 | int32_t number; | |
619 | char c; | |
620 | ||
621 | number=0; | |
622 | while((c=*key++)!=0) { | |
623 | number<<=1; | |
624 | if(c=='1') { | |
625 | number|=1; | |
626 | } | |
627 | } | |
628 | return number; | |
629 | } | |
630 | ||
631 | static void | |
632 | TestTable32(void) { | |
633 | static const struct { | |
634 | const char *key; | |
635 | int32_t number; | |
636 | } testcases[]={ | |
637 | { "ooooooooooooooooo", 0 }, | |
638 | { "oooooooooooooooo1", 1 }, | |
639 | { "ooooooooooooooo1o", 2 }, | |
640 | { "oo11ooo1ooo11111o", 25150 }, | |
641 | { "oo11ooo1ooo111111", 25151 }, | |
642 | { "o1111111111111111", 65535 }, | |
643 | { "1oooooooooooooooo", 65536 }, | |
644 | { "1ooooooo11o11ooo1", 65969 }, | |
645 | { "1ooooooo11o11oo1o", 65970 }, | |
646 | { "1ooooooo111oo1111", 65999 } | |
647 | }; | |
648 | ||
649 | /* ### TODO UResourceBundle staticItem={ 0 }; - need to know the size */ | |
650 | UResourceBundle *res, *item; | |
651 | const UChar *s; | |
652 | const char *key; | |
653 | UErrorCode errorCode; | |
654 | int32_t i, j, number, parsedNumber, length, count; | |
655 | ||
656 | errorCode=U_ZERO_ERROR; | |
657 | res=ures_open(loadTestData(&errorCode), "testtable32", &errorCode); | |
658 | if(U_FAILURE(errorCode)) { | |
659 | log_data_err("unable to open testdata/testtable32.res - %s\n", u_errorName(errorCode)); | |
660 | return; | |
661 | } | |
662 | if(ures_getType(res)!=URES_TABLE) { | |
663 | log_data_err("testdata/testtable32.res has type %d instead of URES_TABLE\n", ures_getType(res)); | |
664 | } | |
665 | ||
666 | count=ures_getSize(res); | |
667 | if(count!=66000) { | |
668 | log_err("testdata/testtable32.res should have 66000 entries but has %d\n", count); | |
669 | } | |
670 | ||
671 | /* get the items by index */ | |
672 | item=NULL; | |
673 | for(i=0; i<count; ++i) { | |
674 | item=ures_getByIndex(res, i, item, &errorCode); | |
675 | if(U_FAILURE(errorCode)) { | |
676 | log_err("unable to get item %d of %d in testdata/testtable32.res - %s\n", | |
677 | i, count, u_errorName(errorCode)); | |
678 | break; | |
679 | } | |
680 | ||
681 | key=ures_getKey(item); | |
682 | parsedNumber=parseTable32Key(key); | |
683 | ||
684 | switch(ures_getType(item)) { | |
685 | case URES_STRING: | |
686 | s=ures_getString(item, &length, &errorCode); | |
687 | if(U_FAILURE(errorCode) || s==NULL) { | |
688 | log_err("unable to access the string \"%s\" at %d in testdata/testtable32.res - %s\n", | |
689 | key, i, u_errorName(errorCode)); | |
690 | number=-1; | |
691 | } else { | |
692 | j=0; | |
693 | U16_NEXT(s, j, length, number); | |
694 | } | |
695 | break; | |
696 | case URES_INT: | |
697 | number=ures_getInt(item, &errorCode); | |
698 | if(U_FAILURE(errorCode)) { | |
699 | log_err("unable to access the integer \"%s\" at %d in testdata/testtable32.res - %s\n", | |
700 | key, i, u_errorName(errorCode)); | |
701 | number=-1; | |
702 | } | |
703 | break; | |
704 | default: | |
705 | log_err("unexpected resource type %d for \"%s\" at %d in testdata/testtable32.res - %s\n", | |
706 | ures_getType(item), key, i, u_errorName(errorCode)); | |
707 | number=-1; | |
708 | break; | |
709 | } | |
710 | ||
711 | if(number>=0 && number!=parsedNumber) { | |
712 | log_err("\"%s\" at %d in testdata/testtable32.res has a string/int value of %d, expected %d\n", | |
713 | key, i, number, parsedNumber); | |
714 | } | |
715 | } | |
716 | ||
717 | /* search for some items by key */ | |
718 | for(i=0; i<LENGTHOF(testcases); ++i) { | |
719 | item=ures_getByKey(res, testcases[i].key, item, &errorCode); | |
720 | if(U_FAILURE(errorCode)) { | |
721 | log_err("unable to find the key \"%s\" in testdata/testtable32.res - %s\n", | |
722 | testcases[i].key, u_errorName(errorCode)); | |
723 | continue; | |
724 | } | |
725 | ||
726 | switch(ures_getType(item)) { | |
727 | case URES_STRING: | |
728 | s=ures_getString(item, &length, &errorCode); | |
729 | if(U_FAILURE(errorCode) || s==NULL) { | |
730 | log_err("unable to access the string \"%s\" in testdata/testtable32.res - %s\n", | |
731 | testcases[i].key, u_errorName(errorCode)); | |
732 | number=-1; | |
733 | } else { | |
734 | j=0; | |
735 | U16_NEXT(s, j, length, number); | |
736 | } | |
737 | break; | |
738 | case URES_INT: | |
739 | number=ures_getInt(item, &errorCode); | |
740 | if(U_FAILURE(errorCode)) { | |
741 | log_err("unable to access the integer \"%s\" in testdata/testtable32.res - %s\n", | |
742 | testcases[i].key, u_errorName(errorCode)); | |
743 | number=-1; | |
744 | } | |
745 | break; | |
746 | default: | |
747 | log_err("unexpected resource type %d for \"%s\" in testdata/testtable32.res - %s\n", | |
748 | ures_getType(item), testcases[i].key, u_errorName(errorCode)); | |
749 | number=-1; | |
750 | break; | |
751 | } | |
752 | ||
753 | if(number>=0 && number!=testcases[i].number) { | |
754 | log_err("\"%s\" in testdata/testtable32.res has a string/int value of %d, expected %d\n", | |
755 | testcases[i].key, number, testcases[i].number); | |
756 | } | |
757 | ||
758 | key=ures_getKey(item); | |
759 | if(0!=uprv_strcmp(key, testcases[i].key)) { | |
760 | log_err("\"%s\" in testdata/testtable32.res claims to have the key \"%s\"\n", | |
761 | testcases[i].key, key); | |
762 | } | |
763 | } | |
764 | ||
765 | ures_close(item); | |
766 | ures_close(res); | |
b75a7d8f A |
767 | } |
768 | ||
769 | static void TestFileStream(void){ | |
770 | int32_t c = 0; | |
771 | int32_t c1=0; | |
772 | UErrorCode status = U_ZERO_ERROR; | |
773 | const char* testdatapath = loadTestData(&status); | |
374ca955 | 774 | char* fileName = (char*) malloc(uprv_strlen(testdatapath) +10); |
b75a7d8f A |
775 | FileStream* stream = NULL; |
776 | /* these should not be closed */ | |
777 | FileStream* pStdin = T_FileStream_stdin(); | |
778 | FileStream* pStdout = T_FileStream_stdout(); | |
779 | FileStream* pStderr = T_FileStream_stderr(); | |
780 | ||
781 | const char* testline = "This is a test line"; | |
374ca955 A |
782 | int32_t bufLen = (int32_t)strlen(testline)+10; |
783 | char* buf = (char*) malloc(bufLen); | |
b75a7d8f A |
784 | int32_t retLen = 0; |
785 | ||
786 | if(pStdin==NULL){ | |
787 | log_err("failed to get T_FileStream_stdin()"); | |
788 | } | |
789 | if(pStdout==NULL){ | |
790 | log_err("failed to get T_FileStream_stdout()"); | |
791 | } | |
792 | if(pStderr==NULL){ | |
793 | log_err("failed to get T_FileStream_stderr()"); | |
794 | } | |
795 | ||
796 | uprv_strcpy(fileName,testdatapath); | |
797 | uprv_strcat(fileName,".dat"); | |
798 | stream = T_FileStream_open(fileName, "r"); | |
799 | if(stream==NULL){ | |
800 | log_data_err("T_FileStream_open failed to open %s\n",fileName); | |
374ca955 A |
801 | } else { |
802 | if(!T_FileStream_file_exists(fileName)){ | |
b75a7d8f | 803 | log_data_err("T_FileStream_file_exists failed to verify existence of %s \n",fileName); |
374ca955 A |
804 | } |
805 | ||
806 | retLen=T_FileStream_read(stream,&c,1); | |
807 | if(retLen==0){ | |
b75a7d8f | 808 | log_data_err("T_FileStream_read failed to read from %s \n",fileName); |
374ca955 A |
809 | } |
810 | retLen=0; | |
811 | T_FileStream_rewind(stream); | |
812 | T_FileStream_read(stream,&c1,1); | |
813 | if(c!=c1){ | |
b75a7d8f | 814 | log_data_err("T_FileStream_rewind failed to rewind %s \n",fileName); |
374ca955 A |
815 | } |
816 | T_FileStream_rewind(stream); | |
817 | c1 = T_FileStream_peek(stream); | |
818 | if(c!=c1){ | |
b75a7d8f | 819 | log_data_err("T_FileStream_peek failed to peekd %s \n",fileName); |
374ca955 A |
820 | } |
821 | c = T_FileStream_getc(stream); | |
822 | T_FileStream_ungetc(c,stream); | |
823 | if(c!= T_FileStream_getc(stream)){ | |
b75a7d8f | 824 | log_data_err("T_FileStream_ungetc failed to d %s \n",fileName); |
374ca955 A |
825 | } |
826 | ||
827 | if(T_FileStream_size(stream)<=0){ | |
b75a7d8f | 828 | log_data_err("T_FileStream_size failed to d %s \n",fileName); |
374ca955 A |
829 | } |
830 | if(T_FileStream_error(stream)){ | |
b75a7d8f | 831 | log_data_err("T_FileStream_error shouldn't have an error %s\n",fileName); |
374ca955 A |
832 | } |
833 | if(!T_FileStream_error(NULL)){ | |
b75a7d8f | 834 | log_err("T_FileStream_error didn't get an error %s\n",fileName); |
374ca955 A |
835 | } |
836 | T_FileStream_putc(stream, 0x20); | |
837 | if(!T_FileStream_error(stream)){ | |
b75a7d8f | 838 | /* |
374ca955 A |
839 | Warning |
840 | writing to a read-only file may not consistently fail on all platforms | |
841 | (e.g. HP-UX, FreeBSD, MacOSX) | |
b75a7d8f A |
842 | */ |
843 | log_verbose("T_FileStream_error didn't get an error when writing to a readonly file %s\n",fileName); | |
374ca955 | 844 | } |
b75a7d8f | 845 | |
374ca955 A |
846 | T_FileStream_close(stream); |
847 | } | |
b75a7d8f A |
848 | /* test writing function */ |
849 | stream=NULL; | |
850 | uprv_strcpy(fileName,testdatapath); | |
851 | uprv_strcat(fileName,".tmp"); | |
852 | stream = T_FileStream_open(fileName,"w+"); | |
853 | ||
854 | if(stream == NULL){ | |
855 | log_data_err("Could not open %s for writing\n",fileName); | |
374ca955 A |
856 | } else { |
857 | c= '$'; | |
858 | T_FileStream_putc(stream,c); | |
859 | T_FileStream_rewind(stream); | |
860 | if(c != T_FileStream_getc(stream)){ | |
b75a7d8f | 861 | log_data_err("T_FileStream_putc failed %s\n",fileName); |
374ca955 | 862 | } |
b75a7d8f | 863 | |
374ca955 A |
864 | T_FileStream_rewind(stream); |
865 | T_FileStream_writeLine(stream,testline); | |
866 | T_FileStream_rewind(stream); | |
867 | T_FileStream_readLine(stream,buf,bufLen); | |
868 | if(uprv_strncmp(testline, buf,uprv_strlen(buf))!=0){ | |
b75a7d8f | 869 | log_data_err("T_FileStream_writeLine failed %s\n",fileName); |
374ca955 | 870 | } |
b75a7d8f | 871 | |
374ca955 A |
872 | T_FileStream_rewind(stream); |
873 | T_FileStream_write(stream,testline,(int32_t)strlen(testline)); | |
874 | T_FileStream_rewind(stream); | |
875 | retLen = T_FileStream_read(stream, buf, bufLen); | |
876 | if(uprv_strncmp(testline, buf,retLen)!=0){ | |
b75a7d8f | 877 | log_data_err("T_FileStream_write failed %s\n",fileName); |
374ca955 | 878 | } |
b75a7d8f | 879 | |
374ca955 A |
880 | T_FileStream_close(stream); |
881 | } | |
b75a7d8f A |
882 | if(!T_FileStream_remove(fileName)){ |
883 | log_data_err("T_FileStream_remove failed to delete %s\n",fileName); | |
884 | } | |
885 | ||
886 | ||
374ca955 A |
887 | free(fileName); |
888 | free(buf); | |
b75a7d8f A |
889 | |
890 | } | |
374ca955 A |
891 | |
892 | static void TestGetSize(void) { | |
893 | const struct { | |
894 | const char* key; | |
895 | int32_t size; | |
896 | } test[] = { | |
897 | { "zerotest", 1}, | |
898 | { "one", 1}, | |
899 | { "importtest", 1}, | |
900 | { "integerarray", 1}, | |
901 | { "emptyarray", 0}, | |
902 | { "emptytable", 0}, | |
903 | { "emptystring", 1}, /* empty string is still a string */ | |
904 | { "emptyint", 1}, | |
905 | { "emptybin", 1}, | |
906 | { "testinclude", 1}, | |
907 | { "collations", 1}, /* not 2 - there is hidden %%CollationBin */ | |
908 | }; | |
909 | ||
910 | UErrorCode status = U_ZERO_ERROR; | |
911 | ||
912 | UResourceBundle *rb = NULL; | |
913 | UResourceBundle *res = NULL; | |
914 | UResourceBundle *helper = NULL; | |
915 | const char* testdatapath = loadTestData(&status); | |
916 | int32_t i = 0, j = 0; | |
917 | int32_t size = 0; | |
918 | ||
919 | if(U_FAILURE(status)) | |
920 | { | |
46f4442e | 921 | log_data_err("Could not load testdata.dat %s\n", u_errorName(status)); |
374ca955 A |
922 | return; |
923 | } | |
924 | ||
925 | rb = ures_open(testdatapath, "testtypes", &status); | |
926 | if(U_FAILURE(status)) | |
927 | { | |
928 | log_err("Could not testtypes resource bundle %s\n", u_errorName(status)); | |
929 | return; | |
930 | } | |
931 | ||
932 | for(i = 0; i < sizeof(test)/sizeof(test[0]); i++) { | |
933 | res = ures_getByKey(rb, test[i].key, res, &status); | |
934 | if(U_FAILURE(status)) | |
935 | { | |
936 | log_err("Couldn't find the key %s. Error: %s\n", test[i].key, u_errorName(status)); | |
937 | ures_close(rb); | |
938 | return; | |
939 | } | |
940 | size = ures_getSize(res); | |
941 | if(size != test[i].size) { | |
942 | log_err("Expected size %i, got size %i for key %s\n", test[i].size, size, test[i].key); | |
943 | for(j = 0; j < size; j++) { | |
944 | helper = ures_getByIndex(res, j, helper, &status); | |
945 | log_err("%s\n", ures_getKey(helper)); | |
946 | } | |
947 | } | |
948 | } | |
949 | ures_close(helper); | |
950 | ures_close(res); | |
951 | ures_close(rb); | |
952 | } | |
953 | ||
954 | static void TestGetLocaleByType(void) { | |
955 | static const struct { | |
956 | const char *requestedLocale; | |
957 | const char *resourceKey; | |
958 | const char *validLocale; | |
959 | const char *actualLocale; | |
960 | } test[] = { | |
961 | { "te_IN_BLAH", "string_only_in_te_IN", "te_IN", "te_IN" }, | |
962 | { "te_IN_BLAH", "string_only_in_te", "te_IN", "te" }, | |
963 | { "te_IN_BLAH", "string_only_in_Root", "te_IN", "root" }, | |
964 | { "te_IN_BLAH_01234567890_01234567890_01234567890_01234567890_01234567890_01234567890", "array_2d_only_in_Root", "te_IN", "root" }, | |
965 | { "te_IN_BLAH@currency=euro", "array_2d_only_in_te_IN", "te_IN", "te_IN" }, | |
966 | { "te_IN_BLAH@collation=phonebook;calendar=thai", "array_2d_only_in_te", "te_IN", "te" } | |
967 | }; | |
968 | ||
969 | UErrorCode status = U_ZERO_ERROR; | |
970 | ||
971 | UResourceBundle *rb = NULL; | |
972 | UResourceBundle *res = NULL; | |
973 | const char* testdatapath = loadTestData(&status); | |
974 | int32_t i = 0; | |
975 | const char *locale = NULL; | |
976 | ||
977 | if(U_FAILURE(status)) | |
978 | { | |
46f4442e | 979 | log_data_err("Could not load testdata.dat %s\n", u_errorName(status)); |
374ca955 A |
980 | return; |
981 | } | |
982 | ||
983 | for(i = 0; i < sizeof(test)/sizeof(test[0]); i++) { | |
984 | rb = ures_open(testdatapath, test[i].requestedLocale, &status); | |
985 | if(U_FAILURE(status)) | |
986 | { | |
987 | log_err("Could not open resource bundle %s (error %s)\n", test[i].requestedLocale, u_errorName(status)); | |
988 | status = U_ZERO_ERROR; | |
989 | continue; | |
990 | } | |
991 | ||
992 | res = ures_getByKey(rb, test[i].resourceKey, res, &status); | |
993 | if(U_FAILURE(status)) | |
994 | { | |
995 | log_err("Couldn't find the key %s. Error: %s\n", test[i].resourceKey, u_errorName(status)); | |
996 | ures_close(rb); | |
997 | status = U_ZERO_ERROR; | |
998 | continue; | |
999 | } | |
1000 | ||
1001 | locale = ures_getLocaleByType(res, ULOC_REQUESTED_LOCALE, &status); | |
1002 | if(locale) { | |
1003 | log_err("Requested locale should return NULL\n"); | |
1004 | } | |
1005 | locale = ures_getLocaleByType(res, ULOC_VALID_LOCALE, &status); | |
1006 | if(!locale || strcmp(locale, test[i].validLocale) != 0) { | |
1007 | log_err("Expected valid locale to be %s. Got %s\n", test[i].requestedLocale, locale); | |
1008 | } | |
1009 | locale = ures_getLocaleByType(res, ULOC_ACTUAL_LOCALE, &status); | |
1010 | if(!locale || strcmp(locale, test[i].actualLocale) != 0) { | |
1011 | log_err("Expected actual locale to be %s. Got %s\n", test[i].requestedLocale, locale); | |
1012 | } | |
1013 | ures_close(rb); | |
1014 | } | |
1015 | ures_close(res); | |
1016 | } | |
1017 |