| OLD | NEW |
| (Empty) |
| 1 /******************************************************************** | |
| 2 * COPYRIGHT: | |
| 3 * Copyright (c) 1997-2015, International Business Machines Corporation and | |
| 4 * others. All Rights Reserved. | |
| 5 ********************************************************************/ | |
| 6 | |
| 7 | |
| 8 /** | |
| 9 * IntlTestUtilities is the medium level test class for everything in the direct
ory "utility". | |
| 10 */ | |
| 11 | |
| 12 #include "unicode/utypes.h" | |
| 13 #include "unicode/errorcode.h" | |
| 14 #include "unicode/localpointer.h" | |
| 15 #include "charstr.h" | |
| 16 #include "itutil.h" | |
| 17 #include "strtest.h" | |
| 18 #include "loctest.h" | |
| 19 #include "citrtest.h" | |
| 20 #include "ustrtest.h" | |
| 21 #include "ucdtest.h" | |
| 22 #include "restest.h" | |
| 23 #include "restsnew.h" | |
| 24 #include "tsmthred.h" | |
| 25 #include "tsputil.h" | |
| 26 #include "uobjtest.h" | |
| 27 #include "utxttest.h" | |
| 28 #include "v32test.h" | |
| 29 #include "uvectest.h" | |
| 30 #include "aliastst.h" | |
| 31 #include "usettest.h" | |
| 32 | |
| 33 extern IntlTest *createBytesTrieTest(); | |
| 34 static IntlTest *createLocalPointerTest(); | |
| 35 extern IntlTest *createUCharsTrieTest(); | |
| 36 static IntlTest *createEnumSetTest(); | |
| 37 extern IntlTest *createSimplePatternFormatterTest(); | |
| 38 extern IntlTest *createUnifiedCacheTest(); | |
| 39 extern IntlTest *createQuantityFormatterTest(); | |
| 40 extern IntlTest *createPluralMapTest(); | |
| 41 | |
| 42 | |
| 43 #define CASE(id, test) case id: \ | |
| 44 name = #test; \ | |
| 45 if (exec) { \ | |
| 46 logln(#test "---"); logln(); \ | |
| 47 test t; \ | |
| 48 callTest(t, par); \ | |
| 49 } \ | |
| 50 break | |
| 51 | |
| 52 void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* &
name, char* par ) | |
| 53 { | |
| 54 if (exec) logln("TestSuite Utilities: "); | |
| 55 switch (index) { | |
| 56 CASE(0, MultithreadTest); | |
| 57 CASE(1, StringTest); | |
| 58 CASE(2, UnicodeStringTest); | |
| 59 CASE(3, LocaleTest); | |
| 60 CASE(4, CharIterTest); | |
| 61 CASE(5, UObjectTest); | |
| 62 CASE(6, UnicodeTest); | |
| 63 CASE(7, ResourceBundleTest); | |
| 64 CASE(8, NewResourceBundleTest); | |
| 65 CASE(9, PUtilTest); | |
| 66 CASE(10, UVector32Test); | |
| 67 CASE(11, UVectorTest); | |
| 68 CASE(12, UTextTest); | |
| 69 CASE(13, LocaleAliasTest); | |
| 70 CASE(14, UnicodeSetTest); | |
| 71 CASE(15, ErrorCodeTest); | |
| 72 case 16: | |
| 73 name = "LocalPointerTest"; | |
| 74 if (exec) { | |
| 75 logln("TestSuite LocalPointerTest---"); logln(); | |
| 76 LocalPointer<IntlTest> test(createLocalPointerTest()); | |
| 77 callTest(*test, par); | |
| 78 } | |
| 79 break; | |
| 80 case 17: | |
| 81 name = "BytesTrieTest"; | |
| 82 if (exec) { | |
| 83 logln("TestSuite BytesTrieTest---"); logln(); | |
| 84 LocalPointer<IntlTest> test(createBytesTrieTest()); | |
| 85 callTest(*test, par); | |
| 86 } | |
| 87 break; | |
| 88 case 18: | |
| 89 name = "UCharsTrieTest"; | |
| 90 if (exec) { | |
| 91 logln("TestSuite UCharsTrieTest---"); logln(); | |
| 92 LocalPointer<IntlTest> test(createUCharsTrieTest()); | |
| 93 callTest(*test, par); | |
| 94 } | |
| 95 break; | |
| 96 case 19: | |
| 97 name = "EnumSetTest"; | |
| 98 if (exec) { | |
| 99 logln("TestSuite EnumSetTest---"); logln(); | |
| 100 LocalPointer<IntlTest> test(createEnumSetTest()); | |
| 101 callTest(*test, par); | |
| 102 } | |
| 103 break; | |
| 104 case 20: | |
| 105 name = "SimplePatternFormatterTest"; | |
| 106 if (exec) { | |
| 107 logln("TestSuite SimplePatternFormatterTest---"); logln(); | |
| 108 LocalPointer<IntlTest> test(createSimplePatternFormatterTest()); | |
| 109 callTest(*test, par); | |
| 110 } | |
| 111 break; | |
| 112 case 21: | |
| 113 name = "UnifiedCacheTest"; | |
| 114 if (exec) { | |
| 115 logln("TestSuite UnifiedCacheTest---"); logln(); | |
| 116 LocalPointer<IntlTest> test(createUnifiedCacheTest()); | |
| 117 callTest(*test, par); | |
| 118 } | |
| 119 break; | |
| 120 case 22: | |
| 121 name = "QuantityFormatterTest"; | |
| 122 if (exec) { | |
| 123 logln("TestSuite QuantityFormatterTest---"); logln(); | |
| 124 LocalPointer<IntlTest> test(createQuantityFormatterTest()); | |
| 125 callTest(*test, par); | |
| 126 } | |
| 127 break; | |
| 128 case 23: | |
| 129 name = "PluralMapTest"; | |
| 130 if (exec) { | |
| 131 logln("TestSuite PluralMapTest---"); logln(); | |
| 132 LocalPointer<IntlTest> test(createPluralMapTest()); | |
| 133 callTest(*test, par); | |
| 134 } | |
| 135 break; | |
| 136 default: name = ""; break; //needed to end loop | |
| 137 } | |
| 138 } | |
| 139 | |
| 140 void ErrorCodeTest::runIndexedTest(int32_t index, UBool exec, const char* &name,
char* /*par*/) { | |
| 141 if (exec) logln("TestSuite Utilities: "); | |
| 142 switch (index) { | |
| 143 case 0: name = "TestErrorCode"; if (exec) TestErrorCode(); break; | |
| 144 case 1: name = "TestSubclass"; if (exec) TestSubclass(); break; | |
| 145 default: name = ""; break; //needed to end loop | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 static void RefPlusOne(UErrorCode &code) { code=(UErrorCode)(code+1); } | |
| 150 static void PtrPlusTwo(UErrorCode *code) { *code=(UErrorCode)(*code+2); } | |
| 151 | |
| 152 void ErrorCodeTest::TestErrorCode() { | |
| 153 ErrorCode errorCode; | |
| 154 if(errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFa
ilure()) { | |
| 155 errln("ErrorCode did not initialize properly"); | |
| 156 return; | |
| 157 } | |
| 158 errorCode.assertSuccess(); | |
| 159 if(errorCode.errorName()!=u_errorName(U_ZERO_ERROR)) { | |
| 160 errln("ErrorCode did not format error message string properly"); | |
| 161 } | |
| 162 RefPlusOne(errorCode); | |
| 163 if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !er
rorCode.isFailure()) { | |
| 164 errln("ErrorCode did not yield a writable reference"); | |
| 165 } | |
| 166 PtrPlusTwo(errorCode); | |
| 167 if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !erro
rCode.isFailure()) { | |
| 168 errln("ErrorCode did not yield a writable pointer"); | |
| 169 } | |
| 170 errorCode.set(U_PARSE_ERROR); | |
| 171 if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isF
ailure()) { | |
| 172 errln("ErrorCode.set() failed"); | |
| 173 } | |
| 174 if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR || | |
| 175 !errorCode.isSuccess() || errorCode.isFailure() | |
| 176 ) { | |
| 177 errln("ErrorCode did not reset properly"); | |
| 178 } | |
| 179 } | |
| 180 | |
| 181 class MyErrorCode: public ErrorCode { | |
| 182 public: | |
| 183 MyErrorCode(int32_t &countChecks, int32_t &countDests) | |
| 184 : checks(countChecks), dests(countDests) {} | |
| 185 ~MyErrorCode() { | |
| 186 if(isFailure()) { | |
| 187 ++dests; | |
| 188 } | |
| 189 } | |
| 190 private: | |
| 191 virtual void handleFailure() const { | |
| 192 ++checks; | |
| 193 } | |
| 194 int32_t &checks; | |
| 195 int32_t &dests; | |
| 196 }; | |
| 197 | |
| 198 void ErrorCodeTest::TestSubclass() { | |
| 199 int32_t countChecks=0; | |
| 200 int32_t countDests=0; | |
| 201 { | |
| 202 MyErrorCode errorCode(countChecks, countDests); | |
| 203 if( errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode
.isFailure() || | |
| 204 countChecks!=0 || countDests!=0 | |
| 205 ) { | |
| 206 errln("ErrorCode did not initialize properly"); | |
| 207 return; | |
| 208 } | |
| 209 errorCode.assertSuccess(); | |
| 210 if(countChecks!=0) { | |
| 211 errln("ErrorCode.assertSuccess() called handleFailure() despite succ
ess"); | |
| 212 } | |
| 213 RefPlusOne(errorCode); | |
| 214 if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() ||
!errorCode.isFailure()) { | |
| 215 errln("ErrorCode did not yield a writable reference"); | |
| 216 } | |
| 217 errorCode.assertSuccess(); | |
| 218 if(countChecks!=1) { | |
| 219 errln("ErrorCode.assertSuccess() did not handleFailure()"); | |
| 220 } | |
| 221 PtrPlusTwo(errorCode); | |
| 222 if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !
errorCode.isFailure()) { | |
| 223 errln("ErrorCode did not yield a writable pointer"); | |
| 224 } | |
| 225 errorCode.assertSuccess(); | |
| 226 if(countChecks!=2) { | |
| 227 errln("ErrorCode.assertSuccess() did not handleFailure()"); | |
| 228 } | |
| 229 errorCode.set(U_PARSE_ERROR); | |
| 230 if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode
.isFailure()) { | |
| 231 errln("ErrorCode.set() failed"); | |
| 232 } | |
| 233 if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR || | |
| 234 !errorCode.isSuccess() || errorCode.isFailure() | |
| 235 ) { | |
| 236 errln("ErrorCode did not reset properly"); | |
| 237 } | |
| 238 errorCode.assertSuccess(); | |
| 239 if(countChecks!=2) { | |
| 240 errln("ErrorCode.assertSuccess() called handleFailure() despite succ
ess"); | |
| 241 } | |
| 242 } | |
| 243 if(countDests!=0) { | |
| 244 errln("MyErrorCode destructor detected failure despite success"); | |
| 245 } | |
| 246 countChecks=countDests=0; | |
| 247 { | |
| 248 MyErrorCode errorCode(countChecks, countDests); | |
| 249 errorCode.set(U_PARSE_ERROR); | |
| 250 } | |
| 251 if(countDests!=1) { | |
| 252 errln("MyErrorCode destructor failed to detect failure"); | |
| 253 } | |
| 254 } | |
| 255 | |
| 256 class LocalPointerTest : public IntlTest { | |
| 257 public: | |
| 258 LocalPointerTest() {} | |
| 259 | |
| 260 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=
NULL); | |
| 261 | |
| 262 void TestLocalPointer(); | |
| 263 void TestLocalPointerMoveSwap(); | |
| 264 void TestLocalArray(); | |
| 265 void TestLocalArrayMoveSwap(); | |
| 266 void TestLocalXyzPointer(); | |
| 267 void TestLocalXyzPointerMoveSwap(); | |
| 268 void TestLocalXyzPointerNull(); | |
| 269 }; | |
| 270 | |
| 271 static IntlTest *createLocalPointerTest() { | |
| 272 return new LocalPointerTest(); | |
| 273 } | |
| 274 | |
| 275 void LocalPointerTest::runIndexedTest(int32_t index, UBool exec, const char *&na
me, char * /*par*/) { | |
| 276 if(exec) { | |
| 277 logln("TestSuite LocalPointerTest: "); | |
| 278 } | |
| 279 TESTCASE_AUTO_BEGIN; | |
| 280 TESTCASE_AUTO(TestLocalPointer); | |
| 281 TESTCASE_AUTO(TestLocalPointerMoveSwap); | |
| 282 TESTCASE_AUTO(TestLocalArray); | |
| 283 TESTCASE_AUTO(TestLocalArrayMoveSwap); | |
| 284 TESTCASE_AUTO(TestLocalXyzPointer); | |
| 285 TESTCASE_AUTO(TestLocalXyzPointerMoveSwap); | |
| 286 TESTCASE_AUTO(TestLocalXyzPointerNull); | |
| 287 TESTCASE_AUTO_END; | |
| 288 } | |
| 289 | |
| 290 // Exercise almost every LocalPointer and LocalPointerBase method. | |
| 291 void LocalPointerTest::TestLocalPointer() { | |
| 292 // constructor | |
| 293 LocalPointer<UnicodeString> s(new UnicodeString((UChar32)0x50005)); | |
| 294 // isNULL(), isValid(), operator==(), operator!=() | |
| 295 if(s.isNull() || !s.isValid() || s==NULL || !(s!=NULL)) { | |
| 296 errln("LocalPointer constructor or NULL test failure"); | |
| 297 return; | |
| 298 } | |
| 299 // getAlias(), operator->, operator* | |
| 300 if(s.getAlias()->length()!=2 || s->length()!=2 || (*s).length()!=2) { | |
| 301 errln("LocalPointer access failure"); | |
| 302 } | |
| 303 // adoptInstead(), orphan() | |
| 304 s.adoptInstead(new UnicodeString((UChar)0xfffc)); | |
| 305 if(s->length()!=1) { | |
| 306 errln("LocalPointer adoptInstead(U+FFFC) failure"); | |
| 307 } | |
| 308 UnicodeString *orphan=s.orphan(); | |
| 309 if(orphan==NULL || orphan->length()!=1 || s.isValid() || s!=NULL) { | |
| 310 errln("LocalPointer orphan() failure"); | |
| 311 } | |
| 312 delete orphan; | |
| 313 s.adoptInstead(new UnicodeString()); | |
| 314 if(s->length()!=0) { | |
| 315 errln("LocalPointer adoptInstead(empty) failure"); | |
| 316 } | |
| 317 | |
| 318 // LocalPointer(p, errorCode) sets U_MEMORY_ALLOCATION_ERROR if p==NULL. | |
| 319 UErrorCode errorCode = U_ZERO_ERROR; | |
| 320 LocalPointer<CharString> cs(new CharString("some chars", errorCode), errorCo
de); | |
| 321 if(cs.isNull() && U_SUCCESS(errorCode)) { | |
| 322 errln("LocalPointer(p, errorCode) failure"); | |
| 323 return; | |
| 324 } | |
| 325 errorCode = U_ZERO_ERROR; | |
| 326 cs.adoptInsteadAndCheckErrorCode(new CharString("different chars", errorCode
), errorCode); | |
| 327 if(cs.isNull() && U_SUCCESS(errorCode)) { | |
| 328 errln("adoptInsteadAndCheckErrorCode(p, errorCode) failure"); | |
| 329 return; | |
| 330 } | |
| 331 // Incoming failure: Keep the current object and delete the input object. | |
| 332 errorCode = U_ILLEGAL_ARGUMENT_ERROR; | |
| 333 cs.adoptInsteadAndCheckErrorCode(new CharString("unused", errorCode), errorC
ode); | |
| 334 if(cs.isValid() && strcmp(cs->data(), "different chars") != 0) { | |
| 335 errln("adoptInsteadAndCheckErrorCode(p, U_FAILURE) did not retain the ol
d object"); | |
| 336 return; | |
| 337 } | |
| 338 errorCode = U_ZERO_ERROR; | |
| 339 cs.adoptInsteadAndCheckErrorCode(NULL, errorCode); | |
| 340 if(errorCode != U_MEMORY_ALLOCATION_ERROR) { | |
| 341 errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) did not set U_MEMO
RY_ALLOCATION_ERROR"); | |
| 342 return; | |
| 343 } | |
| 344 if(cs.isValid()) { | |
| 345 errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) kept the object"); | |
| 346 return; | |
| 347 } | |
| 348 errorCode = U_ZERO_ERROR; | |
| 349 LocalPointer<CharString> null(NULL, errorCode); | |
| 350 if(errorCode != U_MEMORY_ALLOCATION_ERROR) { | |
| 351 errln("LocalPointer(NULL, errorCode) did not set U_MEMORY_ALLOCATION_ERR
OR"); | |
| 352 return; | |
| 353 } | |
| 354 | |
| 355 // destructor | |
| 356 } | |
| 357 | |
| 358 void LocalPointerTest::TestLocalPointerMoveSwap() { | |
| 359 UnicodeString *p1 = new UnicodeString((UChar)0x61); | |
| 360 UnicodeString *p2 = new UnicodeString((UChar)0x62); | |
| 361 LocalPointer<UnicodeString> s1(p1); | |
| 362 LocalPointer<UnicodeString> s2(p2); | |
| 363 s1.swap(s2); | |
| 364 if(s1.getAlias() != p2 || s2.getAlias() != p1) { | |
| 365 errln("LocalPointer.swap() did not swap"); | |
| 366 } | |
| 367 swap(s1, s2); | |
| 368 if(s1.getAlias() != p1 || s2.getAlias() != p2) { | |
| 369 errln("swap(LocalPointer) did not swap back"); | |
| 370 } | |
| 371 LocalPointer<UnicodeString> s3; | |
| 372 s3.moveFrom(s1); | |
| 373 if(s3.getAlias() != p1 || s1.isValid()) { | |
| 374 errln("LocalPointer.moveFrom() did not move"); | |
| 375 } | |
| 376 #if U_HAVE_RVALUE_REFERENCES | |
| 377 infoln("TestLocalPointerMoveSwap() with rvalue references"); | |
| 378 s1 = static_cast<LocalPointer<UnicodeString> &&>(s3); | |
| 379 if(s1.getAlias() != p1 || s3.isValid()) { | |
| 380 errln("LocalPointer move assignment operator did not move"); | |
| 381 } | |
| 382 LocalPointer<UnicodeString> s4(static_cast<LocalPointer<UnicodeString> &&>(s
2)); | |
| 383 if(s4.getAlias() != p2 || s2.isValid()) { | |
| 384 errln("LocalPointer move constructor did not move"); | |
| 385 } | |
| 386 #else | |
| 387 infoln("TestLocalPointerMoveSwap() without rvalue references"); | |
| 388 #endif | |
| 389 | |
| 390 // Move self assignment leaves the object valid but in an undefined state. | |
| 391 // Do it to make sure there is no crash, | |
| 392 // but do not check for any particular resulting value. | |
| 393 s1.moveFrom(s1); | |
| 394 s3.moveFrom(s3); | |
| 395 } | |
| 396 | |
| 397 // Exercise almost every LocalArray method (but not LocalPointerBase). | |
| 398 void LocalPointerTest::TestLocalArray() { | |
| 399 // constructor | |
| 400 LocalArray<UnicodeString> a(new UnicodeString[2]); | |
| 401 // operator[]() | |
| 402 a[0].append((UChar)0x61); | |
| 403 a[1].append((UChar32)0x60006); | |
| 404 if(a[0].length()!=1 || a[1].length()!=2) { | |
| 405 errln("LocalArray access failure"); | |
| 406 } | |
| 407 // adoptInstead() | |
| 408 a.adoptInstead(new UnicodeString[4]); | |
| 409 a[3].append((UChar)0x62).append((UChar)0x63).reverse(); | |
| 410 if(a[3].length()!=2 || a[3][1]!=0x62) { | |
| 411 errln("LocalArray adoptInstead() failure"); | |
| 412 } | |
| 413 | |
| 414 // LocalArray(p, errorCode) sets U_MEMORY_ALLOCATION_ERROR if p==NULL. | |
| 415 UErrorCode errorCode = U_ZERO_ERROR; | |
| 416 LocalArray<UnicodeString> ua(new UnicodeString[3], errorCode); | |
| 417 if(ua.isNull() && U_SUCCESS(errorCode)) { | |
| 418 errln("LocalArray(p, errorCode) failure"); | |
| 419 return; | |
| 420 } | |
| 421 errorCode = U_ZERO_ERROR; | |
| 422 UnicodeString *u4 = new UnicodeString[4]; | |
| 423 ua.adoptInsteadAndCheckErrorCode(u4, errorCode); | |
| 424 if(ua.isNull() && U_SUCCESS(errorCode)) { | |
| 425 errln("adoptInsteadAndCheckErrorCode(p, errorCode) failure"); | |
| 426 return; | |
| 427 } | |
| 428 // Incoming failure: Keep the current object and delete the input object. | |
| 429 errorCode = U_ILLEGAL_ARGUMENT_ERROR; | |
| 430 ua.adoptInsteadAndCheckErrorCode(new UnicodeString[5], errorCode); | |
| 431 if(ua.isValid() && ua.getAlias() != u4) { | |
| 432 errln("adoptInsteadAndCheckErrorCode(p, U_FAILURE) did not retain the ol
d array"); | |
| 433 return; | |
| 434 } | |
| 435 errorCode = U_ZERO_ERROR; | |
| 436 ua.adoptInsteadAndCheckErrorCode(NULL, errorCode); | |
| 437 if(errorCode != U_MEMORY_ALLOCATION_ERROR) { | |
| 438 errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) did not set U_MEMO
RY_ALLOCATION_ERROR"); | |
| 439 return; | |
| 440 } | |
| 441 if(ua.isValid()) { | |
| 442 errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) kept the array"); | |
| 443 return; | |
| 444 } | |
| 445 errorCode = U_ZERO_ERROR; | |
| 446 LocalArray<UnicodeString> null(NULL, errorCode); | |
| 447 if(errorCode != U_MEMORY_ALLOCATION_ERROR) { | |
| 448 errln("LocalArray(NULL, errorCode) did not set U_MEMORY_ALLOCATION_ERROR
"); | |
| 449 return; | |
| 450 } | |
| 451 | |
| 452 // destructor | |
| 453 } | |
| 454 | |
| 455 void LocalPointerTest::TestLocalArrayMoveSwap() { | |
| 456 UnicodeString *p1 = new UnicodeString[2]; | |
| 457 UnicodeString *p2 = new UnicodeString[3]; | |
| 458 LocalArray<UnicodeString> a1(p1); | |
| 459 LocalArray<UnicodeString> a2(p2); | |
| 460 a1.swap(a2); | |
| 461 if(a1.getAlias() != p2 || a2.getAlias() != p1) { | |
| 462 errln("LocalArray.swap() did not swap"); | |
| 463 } | |
| 464 swap(a1, a2); | |
| 465 if(a1.getAlias() != p1 || a2.getAlias() != p2) { | |
| 466 errln("swap(LocalArray) did not swap back"); | |
| 467 } | |
| 468 LocalArray<UnicodeString> a3; | |
| 469 a3.moveFrom(a1); | |
| 470 if(a3.getAlias() != p1 || a1.isValid()) { | |
| 471 errln("LocalArray.moveFrom() did not move"); | |
| 472 } | |
| 473 #if U_HAVE_RVALUE_REFERENCES | |
| 474 infoln("TestLocalArrayMoveSwap() with rvalue references"); | |
| 475 a1 = static_cast<LocalArray<UnicodeString> &&>(a3); | |
| 476 if(a1.getAlias() != p1 || a3.isValid()) { | |
| 477 errln("LocalArray move assignment operator did not move"); | |
| 478 } | |
| 479 LocalArray<UnicodeString> a4(static_cast<LocalArray<UnicodeString> &&>(a2)); | |
| 480 if(a4.getAlias() != p2 || a2.isValid()) { | |
| 481 errln("LocalArray move constructor did not move"); | |
| 482 } | |
| 483 #else | |
| 484 infoln("TestLocalArrayMoveSwap() without rvalue references"); | |
| 485 #endif | |
| 486 | |
| 487 // Move self assignment leaves the object valid but in an undefined state. | |
| 488 // Do it to make sure there is no crash, | |
| 489 // but do not check for any particular resulting value. | |
| 490 a1.moveFrom(a1); | |
| 491 a3.moveFrom(a3); | |
| 492 } | |
| 493 | |
| 494 #include "unicode/ucnvsel.h" | |
| 495 #include "unicode/ucal.h" | |
| 496 #include "unicode/udatpg.h" | |
| 497 #include "unicode/uidna.h" | |
| 498 #include "unicode/uldnames.h" | |
| 499 #include "unicode/umsg.h" | |
| 500 #include "unicode/unorm2.h" | |
| 501 #include "unicode/uregex.h" | |
| 502 #include "unicode/utrans.h" | |
| 503 | |
| 504 // Use LocalXyzPointer types that are not covered elsewhere in the intltest suit
e. | |
| 505 void LocalPointerTest::TestLocalXyzPointer() { | |
| 506 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointer"); | |
| 507 | |
| 508 static const char *const encoding="ISO-8859-1"; | |
| 509 LocalUConverterSelectorPointer sel( | |
| 510 ucnvsel_open(&encoding, 1, NULL, UCNV_ROUNDTRIP_SET, errorCode)); | |
| 511 if(errorCode.logIfFailureAndReset("ucnvsel_open()")) { | |
| 512 return; | |
| 513 } | |
| 514 if(sel.isNull()) { | |
| 515 errln("LocalUConverterSelectorPointer failure"); | |
| 516 return; | |
| 517 } | |
| 518 | |
| 519 #if !UCONFIG_NO_FORMATTING | |
| 520 LocalUCalendarPointer cal(ucal_open(NULL, 0, "root", UCAL_GREGORIAN, errorCo
de)); | |
| 521 if(errorCode.logDataIfFailureAndReset("ucal_open()")) { | |
| 522 return; | |
| 523 } | |
| 524 if(cal.isNull()) { | |
| 525 errln("LocalUCalendarPointer failure"); | |
| 526 return; | |
| 527 } | |
| 528 | |
| 529 LocalUDateTimePatternGeneratorPointer patgen(udatpg_open("root", errorCode))
; | |
| 530 if(errorCode.logDataIfFailureAndReset("udatpg_open()")) { | |
| 531 return; | |
| 532 } | |
| 533 if(patgen.isNull()) { | |
| 534 errln("LocalUDateTimePatternGeneratorPointer failure"); | |
| 535 return; | |
| 536 } | |
| 537 | |
| 538 LocalULocaleDisplayNamesPointer ldn(uldn_open("de-CH", ULDN_STANDARD_NAMES,
errorCode)); | |
| 539 if(errorCode.logIfFailureAndReset("uldn_open()")) { | |
| 540 return; | |
| 541 } | |
| 542 if(ldn.isNull()) { | |
| 543 errln("LocalULocaleDisplayNamesPointer failure"); | |
| 544 return; | |
| 545 } | |
| 546 | |
| 547 UnicodeString hello=UNICODE_STRING_SIMPLE("Hello {0}!"); | |
| 548 LocalUMessageFormatPointer msg( | |
| 549 umsg_open(hello.getBuffer(), hello.length(), "root", NULL, errorCode)); | |
| 550 if(errorCode.logIfFailureAndReset("umsg_open()")) { | |
| 551 return; | |
| 552 } | |
| 553 if(msg.isNull()) { | |
| 554 errln("LocalUMessageFormatPointer failure"); | |
| 555 return; | |
| 556 } | |
| 557 #endif /* UCONFIG_NO_FORMATTING */ | |
| 558 | |
| 559 #if !UCONFIG_NO_NORMALIZATION | |
| 560 const UNormalizer2 *nfc=unorm2_getNFCInstance(errorCode); | |
| 561 UnicodeSet emptySet; | |
| 562 LocalUNormalizer2Pointer fn2(unorm2_openFiltered(nfc, emptySet.toUSet(), err
orCode)); | |
| 563 if(errorCode.logIfFailureAndReset("unorm2_openFiltered()")) { | |
| 564 return; | |
| 565 } | |
| 566 if(fn2.isNull()) { | |
| 567 errln("LocalUNormalizer2Pointer failure"); | |
| 568 return; | |
| 569 } | |
| 570 #endif /* !UCONFIG_NO_NORMALIZATION */ | |
| 571 | |
| 572 #if !UCONFIG_NO_IDNA | |
| 573 LocalUIDNAPointer idna(uidna_openUTS46(0, errorCode)); | |
| 574 if(errorCode.logIfFailureAndReset("uidna_openUTS46()")) { | |
| 575 return; | |
| 576 } | |
| 577 if(idna.isNull()) { | |
| 578 errln("LocalUIDNAPointer failure"); | |
| 579 return; | |
| 580 } | |
| 581 #endif /* !UCONFIG_NO_IDNA */ | |
| 582 | |
| 583 #if !UCONFIG_NO_REGULAR_EXPRESSIONS | |
| 584 UnicodeString pattern=UNICODE_STRING_SIMPLE("abc|xy+z"); | |
| 585 LocalURegularExpressionPointer regex( | |
| 586 uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, errorCode)); | |
| 587 if(errorCode.logIfFailureAndReset("uregex_open()")) { | |
| 588 return; | |
| 589 } | |
| 590 if(regex.isNull()) { | |
| 591 errln("LocalURegularExpressionPointer failure"); | |
| 592 return; | |
| 593 } | |
| 594 #endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */ | |
| 595 | |
| 596 #if !UCONFIG_NO_TRANSLITERATION | |
| 597 UnicodeString id=UNICODE_STRING_SIMPLE("Grek-Latn"); | |
| 598 LocalUTransliteratorPointer trans( | |
| 599 utrans_openU(id.getBuffer(), id.length(), UTRANS_FORWARD, NULL, 0, NULL,
errorCode)); | |
| 600 if(errorCode.logIfFailureAndReset("utrans_open()")) { | |
| 601 return; | |
| 602 } | |
| 603 if(trans.isNull()) { | |
| 604 errln("LocalUTransliteratorPointer failure"); | |
| 605 return; | |
| 606 } | |
| 607 #endif /* !UCONFIG_NO_TRANSLITERATION */ | |
| 608 | |
| 609 // destructors | |
| 610 } | |
| 611 | |
| 612 void LocalPointerTest::TestLocalXyzPointerMoveSwap() { | |
| 613 #if !UCONFIG_NO_NORMALIZATION | |
| 614 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerMoveSwap"); | |
| 615 const UNormalizer2 *nfc=unorm2_getNFCInstance(errorCode); | |
| 616 const UNormalizer2 *nfd=unorm2_getNFDInstance(errorCode); | |
| 617 if(errorCode.logIfFailureAndReset("unorm2_getNF[CD]Instance()")) { | |
| 618 return; | |
| 619 } | |
| 620 UnicodeSet emptySet; | |
| 621 UNormalizer2 *p1 = unorm2_openFiltered(nfc, emptySet.toUSet(), errorCode); | |
| 622 UNormalizer2 *p2 = unorm2_openFiltered(nfd, emptySet.toUSet(), errorCode); | |
| 623 LocalUNormalizer2Pointer f1(p1); | |
| 624 LocalUNormalizer2Pointer f2(p2); | |
| 625 if(errorCode.logIfFailureAndReset("unorm2_openFiltered()")) { | |
| 626 return; | |
| 627 } | |
| 628 if(f1.isNull() || f2.isNull()) { | |
| 629 errln("LocalUNormalizer2Pointer failure"); | |
| 630 return; | |
| 631 } | |
| 632 f1.swap(f2); | |
| 633 if(f1.getAlias() != p2 || f2.getAlias() != p1) { | |
| 634 errln("LocalUNormalizer2Pointer.swap() did not swap"); | |
| 635 } | |
| 636 swap(f1, f2); | |
| 637 if(f1.getAlias() != p1 || f2.getAlias() != p2) { | |
| 638 errln("swap(LocalUNormalizer2Pointer) did not swap back"); | |
| 639 } | |
| 640 LocalUNormalizer2Pointer f3; | |
| 641 f3.moveFrom(f1); | |
| 642 if(f3.getAlias() != p1 || f1.isValid()) { | |
| 643 errln("LocalUNormalizer2Pointer.moveFrom() did not move"); | |
| 644 } | |
| 645 #if U_HAVE_RVALUE_REFERENCES | |
| 646 infoln("TestLocalXyzPointerMoveSwap() with rvalue references"); | |
| 647 f1 = static_cast<LocalUNormalizer2Pointer &&>(f3); | |
| 648 if(f1.getAlias() != p1 || f3.isValid()) { | |
| 649 errln("LocalUNormalizer2Pointer move assignment operator did not move"); | |
| 650 } | |
| 651 LocalUNormalizer2Pointer f4(static_cast<LocalUNormalizer2Pointer &&>(f2)); | |
| 652 if(f4.getAlias() != p2 || f2.isValid()) { | |
| 653 errln("LocalUNormalizer2Pointer move constructor did not move"); | |
| 654 } | |
| 655 #else | |
| 656 infoln("TestLocalXyzPointerMoveSwap() without rvalue references"); | |
| 657 #endif | |
| 658 // Move self assignment leaves the object valid but in an undefined state. | |
| 659 // Do it to make sure there is no crash, | |
| 660 // but do not check for any particular resulting value. | |
| 661 f1.moveFrom(f1); | |
| 662 f3.moveFrom(f3); | |
| 663 #endif /* !UCONFIG_NO_NORMALIZATION */ | |
| 664 } | |
| 665 | |
| 666 // Try LocalXyzPointer types with NULL pointers. | |
| 667 void LocalPointerTest::TestLocalXyzPointerNull() { | |
| 668 { | |
| 669 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUConvert
erSelectorPointer"); | |
| 670 static const char *const encoding="ISO-8859-1"; | |
| 671 LocalUConverterSelectorPointer null; | |
| 672 LocalUConverterSelectorPointer sel( | |
| 673 ucnvsel_open(&encoding, 1, NULL, UCNV_ROUNDTRIP_SET, errorCode)); | |
| 674 sel.adoptInstead(NULL); | |
| 675 } | |
| 676 #if !UCONFIG_NO_FORMATTING | |
| 677 { | |
| 678 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUCalenda
rPointer"); | |
| 679 LocalUCalendarPointer null; | |
| 680 LocalUCalendarPointer cal(ucal_open(NULL, 0, "root", UCAL_GREGORIAN, err
orCode)); | |
| 681 if(!errorCode.logDataIfFailureAndReset("ucal_open()")) { | |
| 682 cal.adoptInstead(NULL); | |
| 683 } | |
| 684 } | |
| 685 { | |
| 686 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUDateTim
ePatternGeneratorPointer"); | |
| 687 LocalUDateTimePatternGeneratorPointer null; | |
| 688 LocalUDateTimePatternGeneratorPointer patgen(udatpg_open("root", errorCo
de)); | |
| 689 patgen.adoptInstead(NULL); | |
| 690 } | |
| 691 { | |
| 692 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUMessage
FormatPointer"); | |
| 693 UnicodeString hello=UNICODE_STRING_SIMPLE("Hello {0}!"); | |
| 694 LocalUMessageFormatPointer null; | |
| 695 LocalUMessageFormatPointer msg( | |
| 696 umsg_open(hello.getBuffer(), hello.length(), "root", NULL, errorCode
)); | |
| 697 msg.adoptInstead(NULL); | |
| 698 } | |
| 699 #endif /* !UCONFIG_NO_FORMATTING */ | |
| 700 | |
| 701 #if !UCONFIG_NO_REGULAR_EXPRESSIONS | |
| 702 { | |
| 703 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalURegular
ExpressionPointer"); | |
| 704 UnicodeString pattern=UNICODE_STRING_SIMPLE("abc|xy+z"); | |
| 705 LocalURegularExpressionPointer null; | |
| 706 LocalURegularExpressionPointer regex( | |
| 707 uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, errorCod
e)); | |
| 708 if(!errorCode.logDataIfFailureAndReset("urege_open()")) { | |
| 709 regex.adoptInstead(NULL); | |
| 710 } | |
| 711 } | |
| 712 #endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ | |
| 713 | |
| 714 #if !UCONFIG_NO_TRANSLITERATION | |
| 715 { | |
| 716 IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUTransli
teratorPointer"); | |
| 717 UnicodeString id=UNICODE_STRING_SIMPLE("Grek-Latn"); | |
| 718 LocalUTransliteratorPointer null; | |
| 719 LocalUTransliteratorPointer trans( | |
| 720 utrans_openU(id.getBuffer(), id.length(), UTRANS_FORWARD, NULL, 0, N
ULL, errorCode)); | |
| 721 if(!errorCode.logDataIfFailureAndReset("utrans_openU()")) { | |
| 722 trans.adoptInstead(NULL); | |
| 723 } | |
| 724 } | |
| 725 #endif /* !UCONFIG_NO_TRANSLITERATION */ | |
| 726 | |
| 727 } | |
| 728 | |
| 729 /** EnumSet test **/ | |
| 730 #include "unicode/enumset.h" | |
| 731 | |
| 732 class EnumSetTest : public IntlTest { | |
| 733 public: | |
| 734 EnumSetTest() {} | |
| 735 virtual void runIndexedTest(int32_t index, UBool exec, const char *&name, char
*par=NULL); | |
| 736 void TestEnumSet(); | |
| 737 }; | |
| 738 | |
| 739 static IntlTest *createEnumSetTest() { | |
| 740 return new EnumSetTest(); | |
| 741 } | |
| 742 | |
| 743 void EnumSetTest::runIndexedTest(int32_t index, UBool exec, const char *&name, c
har * /*par*/) { | |
| 744 TESTCASE_AUTO_BEGIN; | |
| 745 TESTCASE_AUTO(TestEnumSet); | |
| 746 TESTCASE_AUTO_END; | |
| 747 } | |
| 748 enum myEnum { | |
| 749 MAX_NONBOOLEAN=-1, | |
| 750 THING1, | |
| 751 THING2, | |
| 752 THING3, | |
| 753 LIMIT_BOOLEAN | |
| 754 }; | |
| 755 | |
| 756 void EnumSetTest::TestEnumSet() { | |
| 757 EnumSet<myEnum, | |
| 758 MAX_NONBOOLEAN+1, | |
| 759 LIMIT_BOOLEAN> | |
| 760 flags; | |
| 761 | |
| 762 logln("Enum is from [%d..%d]\n", MAX_NONBOOLEAN+1, | |
| 763 LIMIT_BOOLEAN); | |
| 764 | |
| 765 TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); | |
| 766 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 767 TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); | |
| 768 | |
| 769 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 770 logln("Value now: %d\n", flags.getAll()); | |
| 771 flags.clear(); | |
| 772 logln("clear -Value now: %d\n", flags.getAll()); | |
| 773 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 774 TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); | |
| 775 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 776 TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); | |
| 777 flags.add(THING1); | |
| 778 logln("set THING1 -Value now: %d\n", flags.getAll()); | |
| 779 TEST_ASSERT_TRUE(flags.get(THING1) == TRUE); | |
| 780 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 781 TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); | |
| 782 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 783 flags.add(THING3); | |
| 784 logln("set THING3 -Value now: %d\n", flags.getAll()); | |
| 785 TEST_ASSERT_TRUE(flags.get(THING1) == TRUE); | |
| 786 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 787 TEST_ASSERT_TRUE(flags.get(THING3) == TRUE); | |
| 788 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 789 flags.remove(THING2); | |
| 790 TEST_ASSERT_TRUE(flags.get(THING1) == TRUE); | |
| 791 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 792 TEST_ASSERT_TRUE(flags.get(THING3) == TRUE); | |
| 793 logln("remove THING2 -Value now: %d\n", flags.getAll()); | |
| 794 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 795 flags.remove(THING1); | |
| 796 TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); | |
| 797 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 798 TEST_ASSERT_TRUE(flags.get(THING3) == TRUE); | |
| 799 logln("remove THING1 -Value now: %d\n", flags.getAll()); | |
| 800 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 801 | |
| 802 flags.clear(); | |
| 803 logln("clear -Value now: %d\n", flags.getAll()); | |
| 804 logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get
(THING1), flags.get(THING2), flags.get(THING3)); | |
| 805 TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); | |
| 806 TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); | |
| 807 TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); | |
| 808 } | |
| OLD | NEW |