OLD | NEW |
(Empty) | |
| 1 /******************************************************************** |
| 2 * COPYRIGHT: |
| 3 * Copyright (c) 1997-2010, 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 #include "ucol_imp.h" /* collation */ |
| 32 |
| 33 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) |
| 34 |
| 35 static void TestOpenDirect(void); |
| 36 static void TestFallback(void); |
| 37 static void TestTable32(void); |
| 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_pa
ss(); } else { record_fail(); log_err("%s returned %s instead of %s\n", actio
n, austrdup(actual), austrdup(expected)); } |
| 57 |
| 58 #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)); } |
| 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 { |
| 96 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
| 97 addTest(root, &TestConstruction1, "tsutil/crestst/TestConstruction1"); |
| 98 addTest(root, &TestOpenDirect, "tsutil/crestst/TestOpenDirect"); |
| 99 addTest(root, &TestResourceBundles, "tsutil/crestst/TestResourceBundles"); |
| 100 addTest(root, &TestTable32, "tsutil/crestst/TestTable32"); |
| 101 addTest(root, &TestFileStream, "tsutil/crestst/TestFileStream"); |
| 102 addTest(root, &TestGetSize, "tsutil/crestst/TestGetSize"); |
| 103 addTest(root, &TestGetLocaleByType, "tsutil/crestst/TestGetLocaleByType"); |
| 104 #endif |
| 105 addTest(root, &TestFallback, "tsutil/crestst/TestFallback"); |
| 106 addTest(root, &TestAliasConflict, "tsutil/crestst/TestAliasConflict"); |
| 107 |
| 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)) { |
| 122 log_err_status(status, "Failed to get resource with %s\n", myErrorName(s
tatus)); |
| 123 } |
| 124 ures_close(iw); |
| 125 result = ures_getStringByKey(he, "ExemplarCharacters", &resultLen, &status); |
| 126 if(U_FAILURE(status) || result == NULL) { |
| 127 log_err_status(status, "Failed to get resource with %s\n", myErrorName(s
tatus)); |
| 128 } |
| 129 ures_close(he); |
| 130 } |
| 131 |
| 132 |
| 133 void TestResourceBundles() |
| 134 { |
| 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(s
tatus)); |
| 139 return; |
| 140 } |
| 141 |
| 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 { |
| 171 log_data_err("Could not load testdata.dat %s \n",myErrorName(err)); |
| 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, myErrorNam
e(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", myErrorN
ame(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"); |
| 205 if(!getTestOption(VERBOSITY_OPTION)) |
| 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(r
esult1)); |
| 225 log_verbose("for string_in_Root_te_te_IN, te_IN.txt had %s\n", austrdup(resu
lt2)); |
| 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 none
xistent=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_bund
le=%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_resourc
e_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; |
| 424 UResourceBundle *subResource = NULL; |
| 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 { |
| 432 log_err_status(status, "Couldn't open fr_FR - %s\n", u_errorName(status)
); |
| 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. */ |
| 448 subResource = ures_getByKey(fr_FR, "MeasurementSystem", NULL, &status); |
| 449 if(status != U_USING_DEFAULT_WARNING) |
| 450 { |
| 451 log_data_err("Expected U_USING_DEFAULT_ERROR when trying to get Currency
Map from fr_FR, got %s\n", |
| 452 u_errorName(status)); |
| 453 } |
| 454 ures_close(subResource); |
| 455 status = U_ZERO_ERROR; |
| 456 |
| 457 /* and this is a Fallback, to fr */ |
| 458 junk = ures_getStringByKey(fr_FR, "ExemplarCharacters", &resultLen, &status)
; |
| 459 if(status != U_USING_FALLBACK_WARNING) |
| 460 { |
| 461 log_data_err("Expected U_USING_FALLBACK_ERROR when trying to get Exempla
rCharacters from fr_FR, got %s\n", |
| 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) { |
| 472 UResourceBundle *idna_rules, *casing, *te_IN, *ne, *item; |
| 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; |
| 481 idna_rules=ures_openDirect(loadTestData(&errorCode), "idna_rules", &errorCod
e); |
| 482 if(U_FAILURE(errorCode)) { |
| 483 log_data_err("ures_openDirect(\"idna_rules\") failed: %s\n", u_errorName
(errorCode)); |
| 484 return; |
| 485 } |
| 486 |
| 487 if(0!=uprv_strcmp("idna_rules", ures_getLocale(idna_rules, &errorCode))) { |
| 488 log_err("ures_openDirect(\"idna_rules\").getLocale()!=idna_rules\n"); |
| 489 } |
| 490 errorCode=U_ZERO_ERROR; |
| 491 |
| 492 /* try an item in idna_rules, must work */ |
| 493 item=ures_getByKey(idna_rules, "UnassignedSet", NULL, &errorCode); |
| 494 if(U_FAILURE(errorCode)) { |
| 495 log_err("translit_index.getByKey(local key) failed: %s\n", u_errorName(e
rrorCode)); |
| 496 errorCode=U_ZERO_ERROR; |
| 497 } else { |
| 498 ures_close(item); |
| 499 } |
| 500 |
| 501 /* try an item in root, must fail */ |
| 502 item=ures_getByKey(idna_rules, "ShortLanguage", NULL, &errorCode); |
| 503 if(U_FAILURE(errorCode)) { |
| 504 errorCode=U_ZERO_ERROR; |
| 505 } else { |
| 506 log_err("idna_rules.getByKey(root key) succeeded!\n"); |
| 507 ures_close(item); |
| 508 } |
| 509 ures_close(idna_rules); |
| 510 |
| 511 /* now make sure that "idna_rules" will not work with ures_open() */ |
| 512 errorCode=U_ZERO_ERROR; |
| 513 idna_rules=ures_open("testdata", "idna_rules", &errorCode); |
| 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; |
| 517 } else if(0!=uprv_strcmp("idna_rules", ures_getLocale(idna_rules, &errorCode
))) { |
| 518 /* Opening this file will work in "files mode" on Windows and the Mac, |
| 519 which have case insensitive file systems */ |
| 520 log_err("ures_open(\"idna_rules\") succeeded, should fail! Got: %s\n", u
_errorName(errorCode)); |
| 521 } |
| 522 ures_close(idna_rules); |
| 523 |
| 524 /* ures_openDirect("translit_index_WronG") must fail */ |
| 525 idna_rules=ures_openDirect(NULL, "idna_rules_WronG", &errorCode); |
| 526 if(U_FAILURE(errorCode)) { |
| 527 errorCode=U_ZERO_ERROR; |
| 528 } else { |
| 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)) { |
| 536 log_data_err("ures_openDirect(\"idna_rules\") failed when U_USING_FALLBA
CK_WARNING was set prior to call: %s\n", u_errorName(errorCode)); |
| 537 return; |
| 538 } |
| 539 ures_close(idna_rules); |
| 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)) { |
| 559 log_data_err("ures_open(\"casing\") failed: %s\n", u_errorName(errorCode
)); |
| 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 declarat
ion - %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)) { |
| 586 log_data_err("ures_open(\"ne\") failed (expected to get root): %s\n", u_
errorName(errorCode)); |
| 587 } |
| 588 if(errorCode!=U_USING_DEFAULT_WARNING || 0!=uprv_strcmp("root", ures_getLoca
le(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)) { |
| 596 log_data_err("ures_openDirect(\"ne\") succeeded unexpectedly\n"); |
| 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)) { |
| 604 log_data_err("ures_open(\"te_IN\") failed: %s\n", u_errorName(errorCode)
); |
| 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_openDire
ct() - %s\n", u_errorName(errorCode)); |
| 611 ures_close(item); |
| 612 } |
| 613 ures_close(te_IN); |
| 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_errorNa
me(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/te
sttable32.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/t
esttable32.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/te
sttable32.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 v
alue 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/testtabl
e32.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/testtab
le32.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/testtabl
e32.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 o
f %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); |
| 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); |
| 774 char* fileName = (char*) malloc(uprv_strlen(testdatapath) +10); |
| 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"; |
| 782 int32_t bufLen = (int32_t)strlen(testline)+10; |
| 783 char* buf = (char*) malloc(bufLen); |
| 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); |
| 801 } else { |
| 802 if(!T_FileStream_file_exists(fileName)){ |
| 803 log_data_err("T_FileStream_file_exists failed to verify existence of %s
\n",fileName); |
| 804 } |
| 805 |
| 806 retLen=T_FileStream_read(stream,&c,1); |
| 807 if(retLen==0){ |
| 808 log_data_err("T_FileStream_read failed to read from %s \n",fileName); |
| 809 } |
| 810 retLen=0; |
| 811 T_FileStream_rewind(stream); |
| 812 T_FileStream_read(stream,&c1,1); |
| 813 if(c!=c1){ |
| 814 log_data_err("T_FileStream_rewind failed to rewind %s \n",fileName); |
| 815 } |
| 816 T_FileStream_rewind(stream); |
| 817 c1 = T_FileStream_peek(stream); |
| 818 if(c!=c1){ |
| 819 log_data_err("T_FileStream_peek failed to peekd %s \n",fileName); |
| 820 } |
| 821 c = T_FileStream_getc(stream); |
| 822 T_FileStream_ungetc(c,stream); |
| 823 if(c!= T_FileStream_getc(stream)){ |
| 824 log_data_err("T_FileStream_ungetc failed to d %s \n",fileName); |
| 825 } |
| 826 |
| 827 if(T_FileStream_size(stream)<=0){ |
| 828 log_data_err("T_FileStream_size failed to d %s \n",fileName); |
| 829 } |
| 830 if(T_FileStream_error(stream)){ |
| 831 log_data_err("T_FileStream_error shouldn't have an error %s\n",fileName)
; |
| 832 } |
| 833 if(!T_FileStream_error(NULL)){ |
| 834 log_err("T_FileStream_error didn't get an error %s\n",fileName); |
| 835 } |
| 836 T_FileStream_putc(stream, 0x20); |
| 837 if(!T_FileStream_error(stream)){ |
| 838 /* |
| 839 Warning |
| 840 writing to a read-only file may not consistently fail on all platforms |
| 841 (e.g. HP-UX, FreeBSD, MacOSX) |
| 842 */ |
| 843 log_verbose("T_FileStream_error didn't get an error when writing to a re
adonly file %s\n",fileName); |
| 844 } |
| 845 |
| 846 T_FileStream_close(stream); |
| 847 } |
| 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); |
| 856 } else { |
| 857 c= '$'; |
| 858 T_FileStream_putc(stream,c); |
| 859 T_FileStream_rewind(stream); |
| 860 if(c != T_FileStream_getc(stream)){ |
| 861 log_data_err("T_FileStream_putc failed %s\n",fileName); |
| 862 } |
| 863 |
| 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){ |
| 869 log_data_err("T_FileStream_writeLine failed %s\n",fileName); |
| 870 } |
| 871 |
| 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){ |
| 877 log_data_err("T_FileStream_write failed %s\n",fileName); |
| 878 } |
| 879 |
| 880 T_FileStream_close(stream); |
| 881 } |
| 882 if(!T_FileStream_remove(fileName)){ |
| 883 log_data_err("T_FileStream_remove failed to delete %s\n",fileName); |
| 884 } |
| 885 |
| 886 |
| 887 free(fileName); |
| 888 free(buf); |
| 889 |
| 890 } |
| 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 { |
| 921 log_data_err("Could not load testdata.dat %s\n", u_errorName(status)); |
| 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_erro
rName(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_0123456789
0_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 { |
| 979 log_data_err("Could not load testdata.dat %s\n", u_errorName(status)); |
| 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].re
questedLocale, 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].requeste
dLocale, 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].request
edLocale, locale); |
| 1012 } |
| 1013 ures_close(rb); |
| 1014 } |
| 1015 ures_close(res); |
| 1016 } |
| 1017 |
OLD | NEW |