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