| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ********************************************************************** | |
| 3 * Copyright (c) 2002-2014, International Business Machines | |
| 4 * Corporation and others. All Rights Reserved. | |
| 5 ********************************************************************** | |
| 6 */ | |
| 7 #include "unicode/uset.h" | |
| 8 #include "unicode/ustring.h" | |
| 9 #include "cintltst.h" | |
| 10 #include "cmemory.h" | |
| 11 #include <stdlib.h> | |
| 12 #include <string.h> | |
| 13 | |
| 14 #define TEST(x) addTest(root, &x, "uset/" # x) | |
| 15 | |
| 16 static void TestAPI(void); | |
| 17 static void Testj2269(void); | |
| 18 static void TestSerialized(void); | |
| 19 static void TestNonInvariantPattern(void); | |
| 20 static void TestBadPattern(void); | |
| 21 static void TestFreezable(void); | |
| 22 static void TestSpan(void); | |
| 23 | |
| 24 void addUSetTest(TestNode** root); | |
| 25 | |
| 26 static void expect(const USet* set, | |
| 27 const char* inList, | |
| 28 const char* outList, | |
| 29 UErrorCode* ec); | |
| 30 static void expectContainment(const USet* set, | |
| 31 const char* list, | |
| 32 UBool isIn); | |
| 33 static char oneUCharToChar(UChar32 c); | |
| 34 static void expectItems(const USet* set, | |
| 35 const char* items); | |
| 36 | |
| 37 void | |
| 38 addUSetTest(TestNode** root) { | |
| 39 TEST(TestAPI); | |
| 40 TEST(Testj2269); | |
| 41 TEST(TestSerialized); | |
| 42 TEST(TestNonInvariantPattern); | |
| 43 TEST(TestBadPattern); | |
| 44 TEST(TestFreezable); | |
| 45 TEST(TestSpan); | |
| 46 } | |
| 47 | |
| 48 /*------------------------------------------------------------------ | |
| 49 * Tests | |
| 50 *------------------------------------------------------------------*/ | |
| 51 | |
| 52 static void Testj2269() { | |
| 53 UErrorCode status = U_ZERO_ERROR; | |
| 54 UChar a[4] = { 0x61, 0x62, 0x63, 0 }; | |
| 55 USet *s = uset_open(1, 0); | |
| 56 uset_addString(s, a, 3); | |
| 57 a[0] = 0x63; a[1] = 0x63; | |
| 58 expect(s, "{abc}", "{ccc}", &status); | |
| 59 uset_close(s); | |
| 60 } | |
| 61 | |
| 62 static const UChar PAT[] = {91,97,45,99,123,97,98,125,93,0}; /* "[a-c{ab}]" */ | |
| 63 static const int32_t PAT_LEN = (sizeof(PAT) / sizeof(PAT[0])) - 1; | |
| 64 | |
| 65 static const UChar PAT_lb[] = {0x6C, 0x62, 0}; /* "lb" */ | |
| 66 static const int32_t PAT_lb_LEN = (sizeof(PAT_lb) / sizeof(PAT_lb[0])) - 1; | |
| 67 | |
| 68 static const UChar VAL_SP[] = {0x53, 0x50, 0}; /* "SP" */ | |
| 69 static const int32_t VAL_SP_LEN = (sizeof(VAL_SP) / sizeof(VAL_SP[0])) - 1; | |
| 70 | |
| 71 static const UChar STR_bc[] = {98,99,0}; /* "bc" */ | |
| 72 static const int32_t STR_bc_LEN = (sizeof(STR_bc) / sizeof(STR_bc[0])) - 1; | |
| 73 | |
| 74 static const UChar STR_ab[] = {97,98,0}; /* "ab" */ | |
| 75 static const int32_t STR_ab_LEN = (sizeof(STR_ab) / sizeof(STR_ab[0])) - 1; | |
| 76 | |
| 77 /** | |
| 78 * Basic API test for uset.x | |
| 79 */ | |
| 80 static void TestAPI() { | |
| 81 USet* set; | |
| 82 USet* set2; | |
| 83 UErrorCode ec; | |
| 84 | |
| 85 /* [] */ | |
| 86 set = uset_openEmpty(); | |
| 87 expect(set, "", "abc{ab}", NULL); | |
| 88 uset_close(set); | |
| 89 | |
| 90 set = uset_open(1, 0); | |
| 91 expect(set, "", "abc{ab}", NULL); | |
| 92 uset_close(set); | |
| 93 | |
| 94 set = uset_open(1, 1); | |
| 95 uset_clear(set); | |
| 96 expect(set, "", "abc{ab}", NULL); | |
| 97 uset_close(set); | |
| 98 | |
| 99 /* [ABC] */ | |
| 100 set = uset_open(0x0041, 0x0043); | |
| 101 expect(set, "ABC", "DEF{ab}", NULL); | |
| 102 uset_close(set); | |
| 103 | |
| 104 /* [a-c{ab}] */ | |
| 105 ec = U_ZERO_ERROR; | |
| 106 set = uset_openPattern(PAT, PAT_LEN, &ec); | |
| 107 if(U_FAILURE(ec)) { | |
| 108 log_err("uset_openPattern([a-c{ab}]) failed - %s\n", u_errorName(ec)); | |
| 109 return; | |
| 110 } | |
| 111 if(!uset_resemblesPattern(PAT, PAT_LEN, 0)) { | |
| 112 log_err("uset_resemblesPattern of PAT failed\n"); | |
| 113 } | |
| 114 expect(set, "abc{ab}", "def{bc}", &ec); | |
| 115 | |
| 116 /* [a-d{ab}] */ | |
| 117 uset_add(set, 0x64); | |
| 118 expect(set, "abcd{ab}", "ef{bc}", NULL); | |
| 119 | |
| 120 /* [acd{ab}{bc}] */ | |
| 121 uset_remove(set, 0x62); | |
| 122 uset_addString(set, STR_bc, STR_bc_LEN); | |
| 123 expect(set, "acd{ab}{bc}", "bef{cd}", NULL); | |
| 124 | |
| 125 /* [acd{bc}] */ | |
| 126 uset_removeString(set, STR_ab, STR_ab_LEN); | |
| 127 expect(set, "acd{bc}", "bfg{ab}", NULL); | |
| 128 | |
| 129 /* [^acd{bc}] */ | |
| 130 uset_complement(set); | |
| 131 expect(set, "bef{bc}", "acd{ac}", NULL); | |
| 132 | |
| 133 /* [a-e{bc}] */ | |
| 134 uset_complement(set); | |
| 135 uset_addRange(set, 0x0062, 0x0065); | |
| 136 expect(set, "abcde{bc}", "fg{ab}", NULL); | |
| 137 | |
| 138 /* [de{bc}] */ | |
| 139 uset_removeRange(set, 0x0050, 0x0063); | |
| 140 expect(set, "de{bc}", "bcfg{ab}", NULL); | |
| 141 | |
| 142 /* [g-l] */ | |
| 143 uset_set(set, 0x0067, 0x006C); | |
| 144 expect(set, "ghijkl", "de{bc}", NULL); | |
| 145 | |
| 146 if (uset_indexOf(set, 0x0067) != 0) { | |
| 147 log_err("uset_indexOf failed finding correct index of 'g'\n"); | |
| 148 } | |
| 149 | |
| 150 if (uset_charAt(set, 0) != 0x0067) { | |
| 151 log_err("uset_charAt failed finding correct char 'g' at index 0\n"); | |
| 152 } | |
| 153 | |
| 154 /* How to test this one...? */ | |
| 155 uset_compact(set); | |
| 156 | |
| 157 /* [g-i] */ | |
| 158 uset_retain(set, 0x0067, 0x0069); | |
| 159 expect(set, "ghi", "dejkl{bc}", NULL); | |
| 160 | |
| 161 /* UCHAR_ASCII_HEX_DIGIT */ | |
| 162 uset_applyIntPropertyValue(set, UCHAR_ASCII_HEX_DIGIT, 1, &ec); | |
| 163 if(U_FAILURE(ec)) { | |
| 164 log_err("uset_applyIntPropertyValue([UCHAR_ASCII_HEX_DIGIT]) failed - %s
\n", u_errorName(ec)); | |
| 165 return; | |
| 166 } | |
| 167 expect(set, "0123456789ABCDEFabcdef", "GHIjkl{bc}", NULL); | |
| 168 | |
| 169 /* [ab] */ | |
| 170 uset_clear(set); | |
| 171 uset_addAllCodePoints(set, STR_ab, STR_ab_LEN); | |
| 172 expect(set, "ab", "def{ab}", NULL); | |
| 173 if (uset_containsAllCodePoints(set, STR_bc, STR_bc_LEN)){ | |
| 174 log_err("set should not conatin all characters of \"bc\" \n"); | |
| 175 } | |
| 176 | |
| 177 /* [] */ | |
| 178 set2 = uset_open(1, 1); | |
| 179 uset_clear(set2); | |
| 180 | |
| 181 /* space */ | |
| 182 uset_applyPropertyAlias(set2, PAT_lb, PAT_lb_LEN, VAL_SP, VAL_SP_LEN, &ec); | |
| 183 expect(set2, " ", "abcdefghi{bc}", NULL); | |
| 184 | |
| 185 /* [a-c] */ | |
| 186 uset_set(set2, 0x0061, 0x0063); | |
| 187 /* [g-i] */ | |
| 188 uset_set(set, 0x0067, 0x0069); | |
| 189 | |
| 190 /* [a-c g-i] */ | |
| 191 if (uset_containsSome(set, set2)) { | |
| 192 log_err("set should not contain some of set2 yet\n"); | |
| 193 } | |
| 194 uset_complementAll(set, set2); | |
| 195 if (!uset_containsSome(set, set2)) { | |
| 196 log_err("set should contain some of set2\n"); | |
| 197 } | |
| 198 expect(set, "abcghi", "def{bc}", NULL); | |
| 199 | |
| 200 /* [g-i] */ | |
| 201 uset_removeAll(set, set2); | |
| 202 expect(set, "ghi", "abcdef{bc}", NULL); | |
| 203 | |
| 204 /* [a-c g-i] */ | |
| 205 uset_addAll(set2, set); | |
| 206 expect(set2, "abcghi", "def{bc}", NULL); | |
| 207 | |
| 208 /* [g-i] */ | |
| 209 uset_retainAll(set2, set); | |
| 210 expect(set2, "ghi", "abcdef{bc}", NULL); | |
| 211 | |
| 212 uset_close(set); | |
| 213 uset_close(set2); | |
| 214 } | |
| 215 | |
| 216 /*------------------------------------------------------------------ | |
| 217 * Support | |
| 218 *------------------------------------------------------------------*/ | |
| 219 | |
| 220 /** | |
| 221 * Verifies that the given set contains the characters and strings in | |
| 222 * inList, and does not contain those in outList. Also verifies that | |
| 223 * 'set' is not NULL and that 'ec' succeeds. | |
| 224 * @param set the set to test, or NULL (on error) | |
| 225 * @param inList list of set contents, in iteration order. Format is | |
| 226 * list of individual strings, in iteration order, followed by sorted | |
| 227 * list of strings, delimited by {}. This means we do not test | |
| 228 * characters '{' or '}' and we do not test strings containing those | |
| 229 * characters either. | |
| 230 * @param outList list of things not in the set. Same format as | |
| 231 * inList. | |
| 232 * @param ec an error code, checked for success. May be NULL in which | |
| 233 * case it is ignored. | |
| 234 */ | |
| 235 static void expect(const USet* set, | |
| 236 const char* inList, | |
| 237 const char* outList, | |
| 238 UErrorCode* ec) { | |
| 239 if (ec!=NULL && U_FAILURE(*ec)) { | |
| 240 log_err("FAIL: %s\n", u_errorName(*ec)); | |
| 241 return; | |
| 242 } | |
| 243 if (set == NULL) { | |
| 244 log_err("FAIL: USet is NULL\n"); | |
| 245 return; | |
| 246 } | |
| 247 expectContainment(set, inList, TRUE); | |
| 248 expectContainment(set, outList, FALSE); | |
| 249 expectItems(set, inList); | |
| 250 } | |
| 251 | |
| 252 static void expectContainment(const USet* set, | |
| 253 const char* list, | |
| 254 UBool isIn) { | |
| 255 const char* p = list; | |
| 256 UChar ustr[4096]; | |
| 257 char *pat; | |
| 258 UErrorCode ec; | |
| 259 int32_t rangeStart = -1, rangeEnd = -1, length; | |
| 260 | |
| 261 ec = U_ZERO_ERROR; | |
| 262 length = uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); | |
| 263 if(U_FAILURE(ec)) { | |
| 264 log_err("FAIL: uset_toPattern() fails in expectContainment() - %s\n", u_
errorName(ec)); | |
| 265 return; | |
| 266 } | |
| 267 pat=aescstrdup(ustr, length); | |
| 268 | |
| 269 while (*p) { | |
| 270 if (*p=='{') { | |
| 271 const char* stringStart = ++p; | |
| 272 int32_t stringLength = 0; | |
| 273 char strCopy[64]; | |
| 274 | |
| 275 while (*p++ != '}') { | |
| 276 } | |
| 277 stringLength = (int32_t)(p - stringStart - 1); | |
| 278 strncpy(strCopy, stringStart, stringLength); | |
| 279 strCopy[stringLength] = 0; | |
| 280 | |
| 281 u_charsToUChars(stringStart, ustr, stringLength); | |
| 282 | |
| 283 if (uset_containsString(set, ustr, stringLength) == isIn) { | |
| 284 log_verbose("Ok: %s %s \"%s\"\n", pat, | |
| 285 (isIn ? "contains" : "does not contain"), | |
| 286 strCopy); | |
| 287 } else { | |
| 288 log_data_err("FAIL: %s %s \"%s\" (Are you missing data?)\n", pat
, | |
| 289 (isIn ? "does not contain" : "contains"), | |
| 290 strCopy); | |
| 291 } | |
| 292 } | |
| 293 | |
| 294 else { | |
| 295 UChar32 c; | |
| 296 | |
| 297 u_charsToUChars(p, ustr, 1); | |
| 298 c = ustr[0]; | |
| 299 | |
| 300 if (uset_contains(set, c) == isIn) { | |
| 301 log_verbose("Ok: %s %s '%c'\n", pat, | |
| 302 (isIn ? "contains" : "does not contain"), | |
| 303 *p); | |
| 304 } else { | |
| 305 log_data_err("FAIL: %s %s '%c' (Are you missing data?)\n", pat, | |
| 306 (isIn ? "does not contain" : "contains"), | |
| 307 *p); | |
| 308 } | |
| 309 | |
| 310 /* Test the range API too by looking for ranges */ | |
| 311 if (c == rangeEnd+1) { | |
| 312 rangeEnd = c; | |
| 313 } else { | |
| 314 if (rangeStart >= 0) { | |
| 315 if (uset_containsRange(set, rangeStart, rangeEnd) == isIn) { | |
| 316 log_verbose("Ok: %s %s U+%04X-U+%04X\n", pat, | |
| 317 (isIn ? "contains" : "does not contain"), | |
| 318 rangeStart, rangeEnd); | |
| 319 } else { | |
| 320 log_data_err("FAIL: %s %s U+%04X-U+%04X (Are you missing
data?)\n", pat, | |
| 321 (isIn ? "does not contain" : "contains"), | |
| 322 rangeStart, rangeEnd); | |
| 323 } | |
| 324 } | |
| 325 rangeStart = rangeEnd = c; | |
| 326 } | |
| 327 | |
| 328 ++p; | |
| 329 } | |
| 330 } | |
| 331 | |
| 332 if (rangeStart >= 0) { | |
| 333 if (uset_containsRange(set, rangeStart, rangeEnd) == isIn) { | |
| 334 log_verbose("Ok: %s %s U+%04X-U+%04X\n", pat, | |
| 335 (isIn ? "contains" : "does not contain"), | |
| 336 rangeStart, rangeEnd); | |
| 337 } else { | |
| 338 log_data_err("FAIL: %s %s U+%04X-U+%04X (Are you missing data?)\n",
pat, | |
| 339 (isIn ? "does not contain" : "contains"), | |
| 340 rangeStart, rangeEnd); | |
| 341 } | |
| 342 } | |
| 343 } | |
| 344 | |
| 345 /* This only works for invariant BMP chars */ | |
| 346 static char oneUCharToChar(UChar32 c) { | |
| 347 UChar ubuf[1]; | |
| 348 char buf[1]; | |
| 349 ubuf[0] = (UChar) c; | |
| 350 u_UCharsToChars(ubuf, buf, 1); | |
| 351 return buf[0]; | |
| 352 } | |
| 353 | |
| 354 static void expectItems(const USet* set, | |
| 355 const char* items) { | |
| 356 const char* p = items; | |
| 357 UChar ustr[4096], itemStr[4096]; | |
| 358 char buf[4096]; | |
| 359 char *pat; | |
| 360 UErrorCode ec; | |
| 361 int32_t expectedSize = 0; | |
| 362 int32_t itemCount = uset_getItemCount(set); | |
| 363 int32_t itemIndex = 0; | |
| 364 UChar32 start = 1, end = 0; | |
| 365 int32_t itemLen = 0, length; | |
| 366 | |
| 367 ec = U_ZERO_ERROR; | |
| 368 length = uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); | |
| 369 if (U_FAILURE(ec)) { | |
| 370 log_err("FAIL: uset_toPattern => %s\n", u_errorName(ec)); | |
| 371 return; | |
| 372 } | |
| 373 pat=aescstrdup(ustr, length); | |
| 374 | |
| 375 if (uset_isEmpty(set) != (strlen(items)==0)) { | |
| 376 log_data_err("FAIL: %s should return %s from isEmpty (Are you missing da
ta?)\n", | |
| 377 pat, | |
| 378 strlen(items)==0 ? "TRUE" : "FALSE"); | |
| 379 } | |
| 380 | |
| 381 /* Don't test patterns starting with "[^" */ | |
| 382 if (u_strlen(ustr) > 2 && ustr[1] == 0x5e /*'^'*/) { | |
| 383 return; | |
| 384 } | |
| 385 | |
| 386 while (*p) { | |
| 387 | |
| 388 ++expectedSize; | |
| 389 | |
| 390 if (start > end || start == -1) { | |
| 391 /* Fetch our next item */ | |
| 392 if (itemIndex >= itemCount) { | |
| 393 log_data_err("FAIL: ran out of items iterating %s (Are you missi
ng data?)\n", pat); | |
| 394 return; | |
| 395 } | |
| 396 | |
| 397 itemLen = uset_getItem(set, itemIndex, &start, &end, | |
| 398 itemStr, sizeof(itemStr), &ec); | |
| 399 if (U_FAILURE(ec) || itemLen < 0) { | |
| 400 log_err("FAIL: uset_getItem => %s\n", u_errorName(ec)); | |
| 401 return; | |
| 402 } | |
| 403 | |
| 404 if (itemLen == 0) { | |
| 405 log_verbose("Ok: %s item %d is %c-%c\n", pat, | |
| 406 itemIndex, oneUCharToChar(start), | |
| 407 oneUCharToChar(end)); | |
| 408 } else { | |
| 409 itemStr[itemLen] = 0; | |
| 410 u_UCharsToChars(itemStr, buf, itemLen+1); | |
| 411 log_verbose("Ok: %s item %d is \"%s\"\n", pat, itemIndex, buf); | |
| 412 } | |
| 413 | |
| 414 ++itemIndex; | |
| 415 } | |
| 416 | |
| 417 if (*p=='{') { | |
| 418 const char* stringStart = ++p; | |
| 419 int32_t stringLength = 0; | |
| 420 char strCopy[64]; | |
| 421 | |
| 422 while (*p++ != '}') { | |
| 423 } | |
| 424 stringLength = (int32_t)(p - stringStart - 1); | |
| 425 strncpy(strCopy, stringStart, stringLength); | |
| 426 strCopy[stringLength] = 0; | |
| 427 | |
| 428 u_charsToUChars(stringStart, ustr, stringLength); | |
| 429 ustr[stringLength] = 0; | |
| 430 | |
| 431 if (itemLen == 0) { | |
| 432 log_err("FAIL: for %s expect \"%s\" next, but got a char\n", | |
| 433 pat, strCopy); | |
| 434 return; | |
| 435 } | |
| 436 | |
| 437 if (u_strcmp(ustr, itemStr) != 0) { | |
| 438 log_err("FAIL: for %s expect \"%s\" next\n", | |
| 439 pat, strCopy); | |
| 440 return; | |
| 441 } | |
| 442 } | |
| 443 | |
| 444 else { | |
| 445 UChar32 c; | |
| 446 | |
| 447 u_charsToUChars(p, ustr, 1); | |
| 448 c = ustr[0]; | |
| 449 | |
| 450 if (itemLen != 0) { | |
| 451 log_err("FAIL: for %s expect '%c' next, but got a string\n", | |
| 452 pat, *p); | |
| 453 return; | |
| 454 } | |
| 455 | |
| 456 if (c != start++) { | |
| 457 log_err("FAIL: for %s expect '%c' next\n", | |
| 458 pat, *p); | |
| 459 return; | |
| 460 } | |
| 461 | |
| 462 ++p; | |
| 463 } | |
| 464 } | |
| 465 | |
| 466 if (uset_size(set) == expectedSize) { | |
| 467 log_verbose("Ok: %s size is %d\n", pat, expectedSize); | |
| 468 } else { | |
| 469 log_err("FAIL: %s size is %d, expected %d\n", | |
| 470 pat, uset_size(set), expectedSize); | |
| 471 } | |
| 472 } | |
| 473 | |
| 474 static void | |
| 475 TestSerialized() { | |
| 476 uint16_t buffer[1000]; | |
| 477 USerializedSet sset; | |
| 478 USet *set; | |
| 479 UErrorCode errorCode; | |
| 480 UChar32 c; | |
| 481 int32_t length; | |
| 482 | |
| 483 /* use a pattern that generates both BMP and supplementary code points */ | |
| 484 U_STRING_DECL(pattern, "[:Cf:]", 6); | |
| 485 U_STRING_INIT(pattern, "[:Cf:]", 6); | |
| 486 | |
| 487 errorCode=U_ZERO_ERROR; | |
| 488 set=uset_openPattern(pattern, -1, &errorCode); | |
| 489 if(U_FAILURE(errorCode)) { | |
| 490 log_data_err("uset_openPattern([:Cf:]) failed - %s (Are you missing data
?)\n", u_errorName(errorCode)); | |
| 491 return; | |
| 492 } | |
| 493 | |
| 494 length=uset_serialize(set, buffer, UPRV_LENGTHOF(buffer), &errorCode); | |
| 495 if(U_FAILURE(errorCode)) { | |
| 496 log_err("unable to uset_serialize([:Cf:]) - %s\n", u_errorName(errorCode
)); | |
| 497 uset_close(set); | |
| 498 return; | |
| 499 } | |
| 500 | |
| 501 uset_getSerializedSet(&sset, buffer, length); | |
| 502 for(c=0; c<=0x10ffff; ++c) { | |
| 503 if(uset_contains(set, c)!=uset_serializedContains(&sset, c)) { | |
| 504 log_err("uset_contains(U+%04x)!=uset_serializedContains(U+%04x)\n",
c); | |
| 505 break; | |
| 506 } | |
| 507 } | |
| 508 | |
| 509 uset_close(set); | |
| 510 } | |
| 511 | |
| 512 /** | |
| 513 * Make sure that when non-invariant chars are passed to uset_openPattern | |
| 514 * they do not cause an ugly failure mode (e.g. assertion failure). | |
| 515 * JB#3795. | |
| 516 */ | |
| 517 static void | |
| 518 TestNonInvariantPattern() { | |
| 519 UErrorCode ec = U_ZERO_ERROR; | |
| 520 /* The critical part of this test is that the following pattern | |
| 521 must contain a non-invariant character. */ | |
| 522 static const char *pattern = "[:ccc!=0:]"; | |
| 523 UChar buf[256]; | |
| 524 int32_t len = u_unescape(pattern, buf, 256); | |
| 525 /* This test 'fails' by having an assertion failure within the | |
| 526 following call. It passes by running to completion with no | |
| 527 assertion failure. */ | |
| 528 USet *set = uset_openPattern(buf, len, &ec); | |
| 529 uset_close(set); | |
| 530 } | |
| 531 | |
| 532 static void TestBadPattern(void) { | |
| 533 UErrorCode status = U_ZERO_ERROR; | |
| 534 USet *pat; | |
| 535 U_STRING_DECL(pattern, "[", 1); | |
| 536 U_STRING_INIT(pattern, "[", 1); | |
| 537 pat = uset_openPatternOptions(pattern, u_strlen(pattern), 0, &status); | |
| 538 if (pat != NULL || U_SUCCESS(status)) { | |
| 539 log_err("uset_openPatternOptions did not fail as expected %s\n", u_error
Name(status)); | |
| 540 } | |
| 541 } | |
| 542 | |
| 543 static USet *openIDSet() { | |
| 544 UErrorCode errorCode = U_ZERO_ERROR; | |
| 545 U_STRING_DECL(pattern, "[:ID_Continue:]", 15); | |
| 546 U_STRING_INIT(pattern, "[:ID_Continue:]", 15); | |
| 547 return uset_openPattern(pattern, 15, &errorCode); | |
| 548 } | |
| 549 | |
| 550 static void TestFreezable() { | |
| 551 USet *idSet; | |
| 552 USet *frozen; | |
| 553 USet *thawed; | |
| 554 | |
| 555 idSet=openIDSet(); | |
| 556 | |
| 557 if (idSet == NULL) { | |
| 558 log_data_err("openIDSet() returned NULL. (Are you missing data?)\n"); | |
| 559 uset_close(idSet); | |
| 560 return; | |
| 561 } | |
| 562 | |
| 563 frozen=uset_clone(idSet); | |
| 564 | |
| 565 if (frozen == NULL) { | |
| 566 log_err("uset_Clone() returned NULL\n"); | |
| 567 return; | |
| 568 } | |
| 569 | |
| 570 if(!uset_equals(frozen, idSet)) { | |
| 571 log_err("uset_clone() did not make an equal copy\n"); | |
| 572 } | |
| 573 | |
| 574 uset_freeze(frozen); | |
| 575 uset_addRange(frozen, 0xd802, 0xd805); | |
| 576 | |
| 577 if(uset_isFrozen(idSet) || !uset_isFrozen(frozen) || !uset_equals(frozen, id
Set)) { | |
| 578 log_err("uset_freeze() or uset_isFrozen() does not work\n"); | |
| 579 } | |
| 580 | |
| 581 thawed=uset_cloneAsThawed(frozen); | |
| 582 | |
| 583 if (thawed == NULL) { | |
| 584 log_err("uset_cloneAsThawed(frozen) returned NULL"); | |
| 585 uset_close(frozen); | |
| 586 uset_close(idSet); | |
| 587 return; | |
| 588 } | |
| 589 | |
| 590 uset_addRange(thawed, 0xd802, 0xd805); | |
| 591 | |
| 592 if(uset_isFrozen(thawed) || uset_equals(thawed, idSet) || !uset_containsRang
e(thawed, 0xd802, 0xd805)) { | |
| 593 log_err("uset_cloneAsThawed() does not work\n"); | |
| 594 } | |
| 595 | |
| 596 uset_close(idSet); | |
| 597 uset_close(frozen); | |
| 598 uset_close(thawed); | |
| 599 } | |
| 600 | |
| 601 static void TestSpan() { | |
| 602 static const UChar s16[2]={ 0xe01, 0x3000 }; | |
| 603 static const char* s8="\xE0\xB8\x81\xE3\x80\x80"; | |
| 604 | |
| 605 USet *idSet=openIDSet(); | |
| 606 | |
| 607 if (idSet == NULL) { | |
| 608 log_data_err("openIDSet() returned NULL (Are you missing data?)\n"); | |
| 609 return; | |
| 610 } | |
| 611 | |
| 612 if( | |
| 613 1!=uset_span(idSet, s16, 2, USET_SPAN_CONTAINED) || | |
| 614 0!=uset_span(idSet, s16, 2, USET_SPAN_NOT_CONTAINED) || | |
| 615 2!=uset_spanBack(idSet, s16, 2, USET_SPAN_CONTAINED) || | |
| 616 1!=uset_spanBack(idSet, s16, 2, USET_SPAN_NOT_CONTAINED) | |
| 617 ) { | |
| 618 log_err("uset_span() or uset_spanBack() does not work\n"); | |
| 619 } | |
| 620 | |
| 621 if( | |
| 622 3!=uset_spanUTF8(idSet, s8, 6, USET_SPAN_CONTAINED) || | |
| 623 0!=uset_spanUTF8(idSet, s8, 6, USET_SPAN_NOT_CONTAINED) || | |
| 624 6!=uset_spanBackUTF8(idSet, s8, 6, USET_SPAN_CONTAINED) || | |
| 625 3!=uset_spanBackUTF8(idSet, s8, 6, USET_SPAN_NOT_CONTAINED) | |
| 626 ) { | |
| 627 log_err("uset_spanUTF8() or uset_spanBackUTF8() does not work\n"); | |
| 628 } | |
| 629 | |
| 630 uset_freeze(idSet); | |
| 631 | |
| 632 if( | |
| 633 1!=uset_span(idSet, s16, 2, USET_SPAN_CONTAINED) || | |
| 634 0!=uset_span(idSet, s16, 2, USET_SPAN_NOT_CONTAINED) || | |
| 635 2!=uset_spanBack(idSet, s16, 2, USET_SPAN_CONTAINED) || | |
| 636 1!=uset_spanBack(idSet, s16, 2, USET_SPAN_NOT_CONTAINED) | |
| 637 ) { | |
| 638 log_err("uset_span(frozen) or uset_spanBack(frozen) does not work\n"); | |
| 639 } | |
| 640 | |
| 641 if( | |
| 642 3!=uset_spanUTF8(idSet, s8, 6, USET_SPAN_CONTAINED) || | |
| 643 0!=uset_spanUTF8(idSet, s8, 6, USET_SPAN_NOT_CONTAINED) || | |
| 644 6!=uset_spanBackUTF8(idSet, s8, 6, USET_SPAN_CONTAINED) || | |
| 645 3!=uset_spanBackUTF8(idSet, s8, 6, USET_SPAN_NOT_CONTAINED) | |
| 646 ) { | |
| 647 log_err("uset_spanUTF8(frozen) or uset_spanBackUTF8(frozen) does not wor
k\n"); | |
| 648 } | |
| 649 | |
| 650 uset_close(idSet); | |
| 651 } | |
| 652 | |
| 653 /*eof*/ | |
| OLD | NEW |