1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 1997-2014, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ******************************************************************** 6 * 7 * File CMSGTST.C 8 * 9 * Modification History: 10 * Name Description 11 * Madhu Katragadda Creation 12 ********************************************************************/ 13 /* C API TEST FOR MESSAGE FORMAT */ 14 15 #include "unicode/utypes.h" 16 17 #if !UCONFIG_NO_FORMATTING 18 19 #include <stdlib.h> 20 #include <string.h> 21 #include <stdarg.h> 22 #include "unicode/uloc.h" 23 #include "unicode/umsg.h" 24 #include "unicode/udat.h" 25 #include "unicode/umsg.h" 26 #include "unicode/ustring.h" 27 #include "cintltst.h" 28 #include "cmsgtst.h" 29 #include "cformtst.h" 30 #include "cmemory.h" 31 32 static const char* const txt_testCasePatterns[] = { 33 "Quotes '', '{', a {0,number,integer} '{'0}", 34 "Quotes '', '{', a {0,number,integer} '{'0}", 35 "You deposited {0,number,integer} times an amount of {1,number,currency} on {2,date,short}", 36 "'{'2,time,full}, for {1, number }, {0,number,integer} is {2,time,full} and full date is {2,date,full}", 37 "'{'1,number,percent} for {0,number,integer} is {1,number,percent}", 38 }; 39 40 static const char* const txt_testResultStrings[] = { 41 "Quotes ', {, a 1 {0}", 42 "Quotes ', {, a 1 {0}", 43 "You deposited 1 times an amount of $3,456.00 on 1/12/70", 44 "{2,time,full}, for 3,456, 1 is 5:46:40 AM Pacific Standard Time and full date is Monday, January 12, 1970", 45 "{1,number,percent} for 1 is 345,600%" 46 }; 47 48 const int32_t cnt_testCases = 5; 49 static UChar* testCasePatterns[5]; 50 51 static UChar* testResultStrings[5]; 52 53 static UBool strings_initialized = FALSE; 54 55 /* function used to create the test patterns for testing Message formatting */ 56 static void InitStrings( void ) 57 { 58 int32_t i; 59 if (strings_initialized) 60 return; 61 62 for (i=0; i < cnt_testCases; i++ ) { 63 uint32_t strSize = (uint32_t)strlen(txt_testCasePatterns[i]) + 1; 64 testCasePatterns[i]=(UChar*)malloc(sizeof(UChar) * strSize); 65 u_uastrncpy(testCasePatterns[i], txt_testCasePatterns[i], strSize); 66 } 67 for (i=0; i < cnt_testCases; i++ ) { 68 uint32_t strSize = (uint32_t)strlen(txt_testResultStrings[i]) + 1; 69 testResultStrings[i] = (UChar*)malloc(sizeof(UChar) * strSize); 70 u_uastrncpy(testResultStrings[i], txt_testResultStrings[i], strSize); 71 } 72 73 strings_initialized = TRUE; 74 } 75 76 static void FreeStrings( void ) 77 { 78 int32_t i; 79 if (!strings_initialized) 80 return; 81 82 for (i=0; i < cnt_testCases; i++ ) { 83 free(testCasePatterns[i]); 84 } 85 for (i=0; i < cnt_testCases; i++ ) { 86 free(testResultStrings[i]); 87 } 88 strings_initialized = FALSE; 89 } 90 91 #if (U_PLATFORM == U_PF_LINUX) /* add platforms here .. */ 92 /* Keep the #if above in sync with the one below that has the same "add platforms here .." comment. */ 93 #else 94 /* Platform dependent test to detect if this type will return NULL when interpreted as a pointer. */ 95 static UBool returnsNullForType(int firstParam, ...) { 96 UBool isNULL; 97 va_list marker; 98 va_start(marker, firstParam); 99 isNULL = (UBool)(va_arg(marker, void*) == NULL); 100 va_end(marker); 101 return isNULL; 102 } 103 #endif 104 105 /* Test u_formatMessage() with various test patterns() */ 106 static void MessageFormatTest( void ) 107 { 108 UChar *str; 109 UChar* result; 110 int32_t resultLengthOut,resultlength,i, patternlength; 111 UErrorCode status = U_ZERO_ERROR; 112 UDate d1=1000000000.0; 113 114 ctest_setTimeZone(NULL, &status); 115 116 str=(UChar*)malloc(sizeof(UChar) * 7); 117 u_uastrncpy(str, "MyDisk", 7); 118 resultlength=1; 119 result=(UChar*)malloc(sizeof(UChar) * 1); 120 log_verbose("Testing u_formatMessage()\n"); 121 InitStrings(); 122 for (i = 0; i < cnt_testCases; i++) { 123 status=U_ZERO_ERROR; 124 patternlength=u_strlen(testCasePatterns[i]); 125 resultLengthOut=u_formatMessage( "en_US",testCasePatterns[i], patternlength, result, resultlength, 126 &status, 1, 3456.00, d1); 127 if(status== U_BUFFER_OVERFLOW_ERROR) 128 { 129 status=U_ZERO_ERROR; 130 resultlength=resultLengthOut+1; 131 result=(UChar*)realloc(result,sizeof(UChar) * resultlength); 132 u_formatMessage( "en_US",testCasePatterns[i], patternlength, result, resultlength, 133 &status, 1, 3456.00, d1); 134 } 135 if(U_FAILURE(status)){ 136 log_data_err("ERROR: failure in message format on testcase %d: %s (Are you missing data?)\n", i, myErrorName(status) ); 137 continue; 138 } 139 if(u_strcmp(result, testResultStrings[i])==0){ 140 log_verbose("PASS: MessagFormat successful on testcase : %d\n", i); 141 } 142 else{ 143 log_err("FAIL: Error in MessageFormat on testcase : %d\n GOT %s EXPECTED %s\n", i, 144 austrdup(result), austrdup(testResultStrings[i]) ); 145 } 146 } 147 free(result); 148 result = NULL; 149 free(str); 150 { 151 152 for (i = 0; i < cnt_testCases; i++) { 153 UParseError parseError; 154 status=U_ZERO_ERROR; 155 patternlength=u_strlen(testCasePatterns[i]); 156 resultlength=0; 157 resultLengthOut=u_formatMessageWithError( "en_US",testCasePatterns[i], patternlength, result, resultlength, 158 &parseError,&status, 1, 3456.00, d1); 159 if(status== U_BUFFER_OVERFLOW_ERROR) 160 { 161 status=U_ZERO_ERROR; 162 resultlength=resultLengthOut+1; 163 result=(UChar*)malloc(sizeof(UChar) * resultlength); 164 u_formatMessage( "en_US",testCasePatterns[i], patternlength, result, resultlength, 165 &status, 1, 3456.00, d1); 166 } 167 if(U_FAILURE(status)){ 168 log_data_err("ERROR: failure in message format on testcase %d: %s (Are you missing data?)\n", i, myErrorName(status) ); 169 continue; 170 } 171 if(u_strcmp(result, testResultStrings[i])==0){ 172 log_verbose("PASS: MessagFormat successful on testcase : %d\n", i); 173 } 174 else{ 175 log_err("FAIL: Error in MessageFormat on testcase : %d\n GOT %s EXPECTED %s\n", i, 176 austrdup(result), austrdup(testResultStrings[i]) ); 177 } 178 free(result); 179 result=NULL; 180 } 181 } 182 { 183 UErrorCode ec = U_ZERO_ERROR; 184 int32_t patternLength = u_strlen(testCasePatterns[0]); 185 186 UMessageFormat formatter = umsg_open(testCasePatterns[0],patternLength,"en_US",NULL,&ec); 187 188 if(U_FAILURE(ec)){ 189 log_data_err("umsg_open() failed for testCasePattens[%d]. -> %s (Are you missing data?)\n",i, u_errorName(ec)); 190 return; 191 } 192 for(i = 0;i<cnt_testCases; i++){ 193 UParseError parseError; 194 int32_t resultLength =0,count=0; 195 int32_t one=0; 196 int32_t two=0; 197 UDate d2=0; 198 199 result=NULL; 200 patternLength = u_strlen(testCasePatterns[i]); 201 202 umsg_applyPattern(formatter,testCasePatterns[i],patternLength,&parseError,&ec); 203 if(U_FAILURE(ec)){ 204 log_err("umsg_applyPattern() failed for testCasePattens[%d].\n",i); 205 return; 206 } 207 /* pre-flight */ 208 resultLength = umsg_format(formatter,result,resultLength,&ec,1,3456.00,d1); 209 if(ec==U_BUFFER_OVERFLOW_ERROR){ 210 ec=U_ZERO_ERROR; 211 result = (UChar*) malloc(U_SIZEOF_UCHAR*resultLength+2); 212 resultLength = umsg_format(formatter,result,resultLength+2,&ec,1,3456.00,d1); 213 if(U_FAILURE(ec)){ 214 log_err("ERROR: failure in message format on testcase %d: %s\n", i, u_errorName(status) ); 215 free(result); 216 return; 217 } 218 219 if(u_strcmp(result, testResultStrings[i])==0){ 220 log_verbose("PASS: MessagFormat successful on testcase : %d\n", i); 221 } 222 else{ 223 log_err("FAIL: Error in MessageFormat on testcase : %d\n GOT %s EXPECTED %s\n", i, 224 austrdup(result), austrdup(testResultStrings[i]) ); 225 } 226 227 #if (U_PLATFORM == U_PF_LINUX) /* add platforms here .. */ 228 log_verbose("Skipping potentially crashing test for mismatched varargs.\n"); 229 #else 230 log_verbose("Note: the next is a platform dependent test. If it crashes, add an exclusion for your platform near %s:%d\n", __FILE__, __LINE__); 231 232 if (returnsNullForType(1, (double)2.0)) { 233 /* HP/UX and possibly other platforms don't properly check for this case. 234 We pass in a UDate, but the function expects a UDate *. When va_arg is used, 235 most compilers will return NULL, but HP-UX won't do that and will return 2 236 in this case. This is a platform dependent test. It crashes on some systems. 237 238 If you get a crash here, see the definition of returnsNullForType. 239 240 This relies upon "undefined" behavior, as indicated by C99 7.15.1.1 paragraph 2 241 */ 242 umsg_parse(formatter,result,resultLength,&count,&ec,one,two,d2); 243 if(ec!=U_ILLEGAL_ARGUMENT_ERROR){ 244 log_err("FAIL: Did not get expected error for umsg_parse(). Expected: U_ILLEGAL_ARGUMENT_ERROR Got: %s \n",u_errorName(ec)); 245 }else{ 246 ec = U_ZERO_ERROR; 247 } 248 } 249 else { 250 log_verbose("Warning: Returning NULL for a mismatched va_arg type isn't supported on this platform.\n", i); 251 } 252 #endif 253 254 umsg_parse(formatter,result,resultLength,&count,&ec,&one,&two,&d2); 255 if(U_FAILURE(ec)){ 256 log_err("umsg_parse could not parse the pattern. Error: %s.\n",u_errorName(ec)); 257 } 258 free(result); 259 }else{ 260 log_err("FAIL: Expected U_BUFFER_OVERFLOW error while preflighting got: %s for testCasePatterns[%d]",u_errorName(ec),i); 261 } 262 } 263 umsg_close(formatter); 264 } 265 FreeStrings(); 266 267 ctest_resetTimeZone(); 268 } 269 270 271 /*test u_formatMessage() with sample patterns */ 272 static void TestSampleMessageFormat(void) 273 { 274 UChar *str; 275 UChar *result; 276 UChar pattern[100], expected[100]; 277 int32_t resultLengthOut, resultlength; 278 UDate d = 837039928046.0; 279 UErrorCode status = U_ZERO_ERROR; 280 281 ctest_setTimeZone(NULL, &status); 282 283 str=(UChar*)malloc(sizeof(UChar) * 15); 284 u_uastrcpy(str, "abc"); 285 286 u_uastrcpy(pattern, "There are {0} files on {1,date}"); 287 u_uastrcpy(expected, "There are abc files on Jul 10, 1996"); 288 result=(UChar*)malloc(sizeof(UChar) * 1); 289 log_verbose("\nTesting a sample for Message format test#1\n"); 290 resultlength=1; 291 resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, str, d); 292 if(status==U_BUFFER_OVERFLOW_ERROR) 293 { 294 status=U_ZERO_ERROR; 295 resultlength=resultLengthOut+1; 296 result=(UChar*)realloc(result, sizeof(UChar) * resultlength); 297 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, str, d); 298 } 299 if(U_FAILURE(status)){ 300 log_data_err("Error: failure in message format on test#1: %s (Are you missing data?)\n", myErrorName(status)); 301 } 302 else if(u_strcmp(result, expected)==0) 303 log_verbose("PASS: MessagFormat successful on test#1\n"); 304 else{ 305 log_err("FAIL: Error in MessageFormat on test#1 \n GOT: %s EXPECTED: %s\n", 306 austrdup(result), austrdup(expected) ); 307 } 308 309 310 log_verbose("\nTesting message format with another pattern test#2\n"); 311 u_uastrcpy(pattern, "The disk \"{0}\" contains {1,number,integer} file(s)"); 312 u_uastrcpy(expected, "The disk \"MyDisk\" contains 23 file(s)"); 313 u_uastrcpy(str, "MyDisk"); 314 315 resultLengthOut=u_formatMessage( "en_US", 316 pattern, 317 u_strlen(pattern), 318 result, 319 resultlength, 320 &status, 321 str, 322 235); 323 if(status==U_BUFFER_OVERFLOW_ERROR) 324 { 325 status=U_ZERO_ERROR; 326 resultlength=resultLengthOut+1; 327 result=(UChar*)realloc(result, sizeof(UChar) * (resultlength+1)); 328 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, str, 23); 329 } 330 if(U_FAILURE(status)){ 331 log_data_err("Error: failure in message format on test#2 : %s (Are you missing data?)\n", myErrorName(status)); 332 } 333 else if(u_strcmp(result, expected)==0) 334 log_verbose("PASS: MessagFormat successful on test#2\n"); 335 else{ 336 log_err("FAIL: Error in MessageFormat on test#2\n GOT: %s EXPECTED: %s\n", 337 austrdup(result), austrdup(expected) ); 338 } 339 340 341 342 log_verbose("\nTesting message format with another pattern test#3\n"); 343 u_uastrcpy(pattern, "You made a {0} of {1,number,currency}"); 344 u_uastrcpy(expected, "You made a deposit of $500.00"); 345 u_uastrcpy(str, "deposit"); 346 resultlength=0; 347 resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), NULL, resultlength, &status, str, 500.00); 348 if(status==U_BUFFER_OVERFLOW_ERROR) 349 { 350 status=U_ZERO_ERROR; 351 resultlength=resultLengthOut+1; 352 result=(UChar*)realloc(result, sizeof(UChar) * resultlength); 353 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, str, 500.00); 354 } 355 if(U_FAILURE(status)){ 356 log_data_err("Error: failure in message format on test#3 : %s (Are you missing data?)\n", myErrorName(status)); 357 } 358 else if(u_strcmp(result, expected)==0) 359 log_verbose("PASS: MessagFormat successful on test#3\n"); 360 else{ 361 log_err("FAIL: Error in MessageFormat on test#3\n GOT: %s EXPECTED %s\n", austrdup(result), 362 austrdup(expected) ); 363 } 364 365 free(result); 366 free(str); 367 368 ctest_resetTimeZone(); 369 } 370 371 /* Test umsg_format() and umsg_parse() , format and parse sequence and round trip */ 372 static void TestNewFormatAndParseAPI(void) 373 { 374 375 UChar *result, tzID[4], str[25]; 376 UChar pattern[100]; 377 UChar expected[100]; 378 int32_t resultLengthOut, resultlength; 379 UCalendar *cal; 380 UDate d1,d; 381 UDateFormat *def1; 382 UErrorCode status = U_ZERO_ERROR; 383 int32_t value = 0; 384 UChar ret[30]; 385 UParseError parseError; 386 UMessageFormat* fmt = NULL; 387 int32_t count=0; 388 389 ctest_setTimeZone(NULL, &status); 390 391 log_verbose("Testing format and parse with parse error\n"); 392 393 u_uastrcpy(str, "disturbance in force"); 394 u_uastrcpy(tzID, "PST"); 395 cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status); 396 if(U_FAILURE(status)){ 397 log_data_err("error in ucal_open caldef : %s - (Are you missing data?)\n", myErrorName(status) ); 398 return; 399 } 400 ucal_setDateTime(cal, 1999, UCAL_MARCH, 18, 0, 0, 0, &status); 401 d1=ucal_getMillis(cal, &status); 402 if(U_FAILURE(status)){ 403 log_err("Error: failure in get millis: %s\n", myErrorName(status) ); 404 return; 405 } 406 407 log_verbose("\nTesting with pattern test#4"); 408 u_uastrcpy(pattern, "On {0, date, long}, there was a {1} on planet {2,number,integer}"); 409 u_uastrcpy(expected, "On March 18, 1999, there was a disturbance in force on planet 7"); 410 resultlength=1; 411 fmt = umsg_open(pattern,u_strlen(pattern),"en_US",&parseError,&status); 412 if(U_FAILURE(status)){ 413 log_data_err("error in umsg_open : %s (Are you missing data?)\n", u_errorName(status) ); 414 return; 415 } 416 result=(UChar*)malloc(sizeof(UChar) * resultlength); 417 418 resultLengthOut=umsg_format(fmt ,result, resultlength,&status, d1, str, 7); 419 if(status==U_BUFFER_OVERFLOW_ERROR) 420 { 421 status=U_ZERO_ERROR; 422 resultlength=resultLengthOut+1; 423 result=(UChar*)realloc(result, sizeof(UChar) * resultlength); 424 u_formatMessageWithError( "en_US", pattern, u_strlen(pattern), result, resultlength,&parseError, &status, d1, str, 7); 425 426 } 427 if(U_FAILURE(status)){ 428 log_err("ERROR: failure in message format test#4: %s\n", myErrorName(status)); 429 } 430 if(u_strcmp(result, expected)==0) 431 log_verbose("PASS: MessagFormat successful on test#4\n"); 432 else{ 433 log_err("FAIL: Error in MessageFormat on test#4\n GOT: %s EXPECTED: %s\n", austrdup(result), 434 austrdup(expected) ); 435 } 436 437 438 /*try to parse this and check*/ 439 log_verbose("\nTesting the parse Message test#5\n"); 440 441 umsg_parse(fmt, result, u_strlen(result),&count,&status, &d, ret, &value); 442 if(U_FAILURE(status)){ 443 log_err("ERROR: error in parsing: test#5: %s\n", myErrorName(status)); 444 } 445 if(value!=7 && u_strcmp(str,ret)!=0) 446 log_err("FAIL: Error in parseMessage on test#5 \n"); 447 else 448 log_verbose("PASS: parseMessage successful on test#5\n"); 449 450 def1 = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, NULL,0,&status); 451 if(U_FAILURE(status)) 452 { 453 log_err("error in creating the dateformat using short date and time style:\n %s\n", myErrorName(status)); 454 }else{ 455 456 if(u_strcmp(myDateFormat(def1, d), myDateFormat(def1, d1))==0) 457 log_verbose("PASS: parseMessage successful test#5\n"); 458 else{ 459 log_err("FAIL: parseMessage didn't parse the date successfully\n GOT: %s EXPECTED %s\n", 460 austrdup(myDateFormat(def1,d)), austrdup(myDateFormat(def1,d1)) ); 461 } 462 } 463 umsg_close(fmt); 464 udat_close(def1); 465 ucal_close(cal); 466 467 free(result); 468 469 ctest_resetTimeZone(); 470 } 471 472 /* Test u_formatMessageWithError() and u_parseMessageWithError() , format and parse sequence and round trip */ 473 static void TestSampleFormatAndParseWithError(void) 474 { 475 476 UChar *result, *tzID, *str; 477 UChar pattern[100]; 478 479 UChar expected[100]; 480 int32_t resultLengthOut, resultlength; 481 UCalendar *cal; 482 UDate d1,d; 483 UDateFormat *def1; 484 UErrorCode status = U_ZERO_ERROR; 485 int32_t value = 0; 486 UChar ret[30]; 487 UParseError parseError; 488 489 ctest_setTimeZone(NULL, &status); 490 491 log_verbose("Testing format and parse with parse error\n"); 492 493 str=(UChar*)malloc(sizeof(UChar) * 25); 494 u_uastrcpy(str, "disturbance in force"); 495 tzID=(UChar*)malloc(sizeof(UChar) * 4); 496 u_uastrcpy(tzID, "PST"); 497 cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status); 498 if(U_FAILURE(status)){ 499 log_data_err("error in ucal_open caldef : %s - (Are you missing data?)\n", myErrorName(status) ); 500 } 501 ucal_setDateTime(cal, 1999, UCAL_MARCH, 18, 0, 0, 0, &status); 502 d1=ucal_getMillis(cal, &status); 503 if(U_FAILURE(status)){ 504 log_data_err("Error: failure in get millis: %s - (Are you missing data?)\n", myErrorName(status) ); 505 } 506 507 log_verbose("\nTesting with pattern test#4"); 508 u_uastrcpy(pattern, "On {0, date, long}, there was a {1} on planet {2,number,integer}"); 509 u_uastrcpy(expected, "On March 18, 1999, there was a disturbance in force on planet 7"); 510 resultlength=1; 511 result=(UChar*)malloc(sizeof(UChar) * resultlength); 512 resultLengthOut=u_formatMessageWithError( "en_US", pattern, u_strlen(pattern), result, resultlength,&parseError, &status, d1, str, 7); 513 if(status==U_BUFFER_OVERFLOW_ERROR) 514 { 515 status=U_ZERO_ERROR; 516 resultlength=resultLengthOut+1; 517 result=(UChar*)realloc(result, sizeof(UChar) * resultlength); 518 u_formatMessageWithError( "en_US", pattern, u_strlen(pattern), result, resultlength,&parseError, &status, d1, str, 7); 519 520 } 521 if(U_FAILURE(status)){ 522 log_data_err("ERROR: failure in message format test#4: %s (Are you missing data?)\n", myErrorName(status)); 523 } 524 else if(u_strcmp(result, expected)==0) 525 log_verbose("PASS: MessagFormat successful on test#4\n"); 526 else{ 527 log_err("FAIL: Error in MessageFormat on test#4\n GOT: %s EXPECTED: %s\n", austrdup(result), 528 austrdup(expected) ); 529 } 530 531 532 /*try to parse this and check*/ 533 log_verbose("\nTesting the parse Message test#5\n"); 534 535 u_parseMessageWithError("en_US", pattern, u_strlen(pattern), result, u_strlen(result), &parseError,&status, &d, ret, &value); 536 if(U_FAILURE(status)){ 537 log_data_err("ERROR: error in parsing: test#5: %s (Are you missing data?)\n", myErrorName(status)); 538 } 539 else if(value!=7 && u_strcmp(str,ret)!=0) 540 log_err("FAIL: Error in parseMessage on test#5 \n"); 541 else 542 log_verbose("PASS: parseMessage successful on test#5\n"); 543 544 def1 = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, NULL,0,&status); 545 if(U_FAILURE(status)) 546 { 547 log_data_err("error in creating the dateformat using short date and time style: %s (Are you missing data?)\n", myErrorName(status)); 548 }else{ 549 550 if(u_strcmp(myDateFormat(def1, d), myDateFormat(def1, d1))==0) 551 log_verbose("PASS: parseMessage successful test#5\n"); 552 else{ 553 log_err("FAIL: parseMessage didn't parse the date successfully\n GOT: %s EXPECTED %s\n", 554 austrdup(myDateFormat(def1,d)), austrdup(myDateFormat(def1,d1)) ); 555 } 556 } 557 udat_close(def1); 558 ucal_close(cal); 559 560 free(result); 561 free(str); 562 free(tzID); 563 564 ctest_resetTimeZone(); 565 } 566 567 /* Test u_formatMessage() and u_parseMessage() , format and parse sequence and round trip */ 568 static void TestSampleFormatAndParse(void) 569 { 570 571 UChar *result, *tzID, *str; 572 UChar pattern[100]; 573 UChar expected[100]; 574 int32_t resultLengthOut, resultlength; 575 UCalendar *cal; 576 UDate d1,d; 577 UDateFormat *def1; 578 UErrorCode status = U_ZERO_ERROR; 579 int32_t value = 0; 580 UChar ret[30]; 581 582 ctest_setTimeZone(NULL, &status); 583 584 log_verbose("Testing format and parse\n"); 585 586 str=(UChar*)malloc(sizeof(UChar) * 25); 587 u_uastrcpy(str, "disturbance in force"); 588 tzID=(UChar*)malloc(sizeof(UChar) * 4); 589 u_uastrcpy(tzID, "PST"); 590 cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status); 591 if(U_FAILURE(status)){ 592 log_data_err("error in ucal_open caldef : %s - (Are you missing data?)\n", myErrorName(status) ); 593 } 594 ucal_setDateTime(cal, 1999, UCAL_MARCH, 18, 0, 0, 0, &status); 595 d1=ucal_getMillis(cal, &status); 596 if(U_FAILURE(status)){ 597 log_data_err("Error: failure in get millis: %s - (Are you missing data?)\n", myErrorName(status) ); 598 } 599 600 log_verbose("\nTesting with pattern test#4"); 601 u_uastrcpy(pattern, "On {0, date, long}, there was a {1} on planet {2,number,integer}"); 602 u_uastrcpy(expected, "On March 18, 1999, there was a disturbance in force on planet 7"); 603 resultlength=1; 604 result=(UChar*)malloc(sizeof(UChar) * resultlength); 605 resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, d1, str, 7); 606 if(status==U_BUFFER_OVERFLOW_ERROR) 607 { 608 status=U_ZERO_ERROR; 609 resultlength=resultLengthOut+1; 610 result=(UChar*)realloc(result, sizeof(UChar) * resultlength); 611 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, d1, str, 7); 612 613 } 614 if(U_FAILURE(status)){ 615 log_data_err("ERROR: failure in message format test#4: %s (Are you missing data?)\n", myErrorName(status)); 616 } 617 else if(u_strcmp(result, expected)==0) 618 log_verbose("PASS: MessagFormat successful on test#4\n"); 619 else{ 620 log_err("FAIL: Error in MessageFormat on test#4\n GOT: %s EXPECTED: %s\n", austrdup(result), 621 austrdup(expected) ); 622 } 623 624 625 /*try to parse this and check*/ 626 log_verbose("\nTesting the parse Message test#5\n"); 627 628 u_parseMessage("en_US", pattern, u_strlen(pattern), result, u_strlen(result), &status, &d, ret, &value); 629 if(U_FAILURE(status)){ 630 log_data_err("ERROR: error in parsing: test#5: %s (Are you missing data?)\n", myErrorName(status)); 631 } 632 else if(value!=7 && u_strcmp(str,ret)!=0) 633 log_err("FAIL: Error in parseMessage on test#5 \n"); 634 else 635 log_verbose("PASS: parseMessage successful on test#5\n"); 636 637 def1 = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, NULL,0,&status); 638 if(U_FAILURE(status)) 639 { 640 log_data_err("error in creating the dateformat using short date and time style: %s (Are you missing data?)\n", myErrorName(status)); 641 }else{ 642 643 if(u_strcmp(myDateFormat(def1, d), myDateFormat(def1, d1))==0) 644 log_verbose("PASS: parseMessage successful test#5\n"); 645 else{ 646 log_err("FAIL: parseMessage didn't parse the date successfully\n GOT: %s EXPECTED %s\n", 647 austrdup(myDateFormat(def1,d)), austrdup(myDateFormat(def1,d1)) ); 648 } 649 } 650 udat_close(def1); 651 ucal_close(cal); 652 653 free(result); 654 free(str); 655 free(tzID); 656 657 ctest_resetTimeZone(); 658 } 659 660 /* Test message format with a Select option */ 661 static void TestMsgFormatSelect(void) 662 { 663 UChar* str; 664 UChar* str1; 665 UErrorCode status = U_ZERO_ERROR; 666 UChar *result; 667 UChar pattern[100]; 668 UChar expected[100]; 669 int32_t resultlength,resultLengthOut; 670 671 str=(UChar*)malloc(sizeof(UChar) * 25); 672 u_uastrcpy(str, "Kirti"); 673 str1=(UChar*)malloc(sizeof(UChar) * 25); 674 u_uastrcpy(str1, "female"); 675 log_verbose("Testing message format with Select test #1\n:"); 676 u_uastrcpy(pattern, "{0} est {1, select, female {all\\u00E9e} other {all\\u00E9}} \\u00E0 Paris."); 677 u_uastrcpy(expected, "Kirti est all\\u00E9e \\u00E0 Paris."); 678 resultlength=0; 679 resultLengthOut=u_formatMessage( "fr", pattern, u_strlen(pattern), NULL, resultlength, &status, str , str1); 680 if(status==U_BUFFER_OVERFLOW_ERROR) 681 { 682 status=U_ZERO_ERROR; 683 resultlength=resultLengthOut+1; 684 result=(UChar*)malloc(sizeof(UChar) * resultlength); 685 u_formatMessage( "fr", pattern, u_strlen(pattern), result, resultlength, &status, str , str1); 686 if(u_strcmp(result, expected)==0) 687 log_verbose("PASS: MessagFormat successful on Select test#1\n"); 688 else{ 689 log_err("FAIL: Error in MessageFormat on Select test#1\n GOT %s EXPECTED %s\n", austrdup(result), 690 austrdup(expected) ); 691 } 692 free(result); 693 } 694 if(U_FAILURE(status)){ 695 log_data_err("ERROR: failure in message format on Select test#1 : %s \n", myErrorName(status)); 696 } 697 free(str); 698 free(str1); 699 700 /*Test a nested pattern*/ 701 str=(UChar*)malloc(sizeof(UChar) * 25); 702 u_uastrcpy(str, "Noname"); 703 str1=(UChar*)malloc(sizeof(UChar) * 25); 704 u_uastrcpy(str1, "other"); 705 log_verbose("Testing message format with Select test #2\n:"); 706 u_uastrcpy(pattern, "{0} est {1, select, female {{2,number,integer} all\\u00E9e} other {all\\u00E9}} \\u00E0 Paris."); 707 u_uastrcpy(expected, "Noname est all\\u00E9 \\u00E0 Paris."); 708 resultlength=0; 709 resultLengthOut=u_formatMessage( "fr", pattern, u_strlen(pattern), NULL, resultlength, &status, str , str1,6); 710 if(status==U_BUFFER_OVERFLOW_ERROR) 711 { 712 status=U_ZERO_ERROR; 713 resultlength=resultLengthOut+1; 714 result=(UChar*)malloc(sizeof(UChar) * resultlength); 715 u_formatMessage( "fr", pattern, u_strlen(pattern), result, resultlength, &status, str , str1); 716 if(u_strcmp(result, expected)==0) 717 log_verbose("PASS: MessagFormat successful on Select test#2\n"); 718 else{ 719 log_err("FAIL: Error in MessageFormat on Select test#2\n GOT %s EXPECTED %s\n", austrdup(result), 720 austrdup(expected) ); 721 } 722 free(result); 723 } 724 if(U_FAILURE(status)){ 725 log_data_err("ERROR: failure in message format on Select test#2 : %s \n", myErrorName(status)); 726 } 727 free(str); 728 free(str1); 729 } 730 731 /* test message format with a choice option */ 732 static void TestMsgFormatChoice(void) 733 { 734 UChar* str; 735 UErrorCode status = U_ZERO_ERROR; 736 UChar *result; 737 UChar pattern[100]; 738 UChar expected[100]; 739 int32_t resultlength,resultLengthOut; 740 741 str=(UChar*)malloc(sizeof(UChar) * 25); 742 u_uastrcpy(str, "MyDisk"); 743 log_verbose("Testing message format with choice test #6\n:"); 744 /* 745 * Before ICU 4.8, umsg_xxx() did not detect conflicting argument types, 746 * and this pattern had {0,number,integer} as the inner argument. 747 * The choice argument has kDouble type while {0,number,integer} has kLong (int32_t). 748 * ICU 4.8 and above detects this as an error. 749 * We changed this pattern to work as intended. 750 */ 751 u_uastrcpy(pattern, "The disk {1} contains {0,choice,0#no files|1#one file|1<{0,number} files}"); 752 u_uastrcpy(expected, "The disk MyDisk contains 100 files"); 753 resultlength=0; 754 resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), NULL, resultlength, &status, 100., str); 755 if(status==U_BUFFER_OVERFLOW_ERROR) 756 { 757 status=U_ZERO_ERROR; 758 resultlength=resultLengthOut+1; 759 result=(UChar*)malloc(sizeof(UChar) * resultlength); 760 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, 100., str); 761 if(u_strcmp(result, expected)==0) 762 log_verbose("PASS: MessagFormat successful on test#6\n"); 763 else{ 764 log_err("FAIL: Error in MessageFormat on test#6\n GOT %s EXPECTED %s\n", austrdup(result), 765 austrdup(expected) ); 766 } 767 free(result); 768 } 769 if(U_FAILURE(status)){ 770 log_data_err("ERROR: failure in message format on test#6 : %s (Are you missing data?)\n", myErrorName(status)); 771 } 772 773 log_verbose("Testing message format with choice test #7\n:"); 774 u_uastrcpy(expected, "The disk MyDisk contains no files"); 775 resultlength=0; 776 resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), NULL, resultlength, &status, 0., str); 777 if(status==U_BUFFER_OVERFLOW_ERROR) 778 { 779 status=U_ZERO_ERROR; 780 resultlength=resultLengthOut+1; 781 result=(UChar*)malloc(sizeof(UChar) * resultlength); 782 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, 0., str); 783 784 if(u_strcmp(result, expected)==0) 785 log_verbose("PASS: MessagFormat successful on test#7\n"); 786 else{ 787 log_err("FAIL: Error in MessageFormat on test#7\n GOT: %s EXPECTED %s\n", austrdup(result), 788 austrdup(expected) ); 789 } 790 free(result); 791 } 792 if(U_FAILURE(status)){ 793 log_data_err("ERROR: failure in message format on test#7 : %s (Are you missing data?)\n", myErrorName(status)); 794 } 795 796 log_verbose("Testing message format with choice test #8\n:"); 797 u_uastrcpy(expected, "The disk MyDisk contains one file"); 798 resultlength=0; 799 resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), NULL, resultlength, &status, 1., str); 800 if(status==U_BUFFER_OVERFLOW_ERROR) 801 { 802 status=U_ZERO_ERROR; 803 resultlength=resultLengthOut+1; 804 result=(UChar*)malloc(sizeof(UChar) * resultlength); 805 u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, 1., str); 806 807 if(u_strcmp(result, expected)==0) 808 log_verbose("PASS: MessagFormat successful on test#8\n"); 809 else{ 810 log_err("FAIL: Error in MessageFormat on test#8\n GOT %s EXPECTED: %s\n", austrdup(result), 811 austrdup(expected) ); 812 } 813 814 free(result); 815 } 816 if(U_FAILURE(status)){ 817 log_data_err("ERROR: failure in message format on test#8 : %s (Are you missing data?)\n", myErrorName(status)); 818 } 819 820 free(str); 821 822 } 823 824 /*test u_parseMessage() with various test patterns */ 825 static void TestParseMessage(void) 826 { 827 UChar pattern[100]; 828 UChar source[100]; 829 UErrorCode status = U_ZERO_ERROR; 830 int32_t value; 831 UChar str[10]; 832 UChar res[10]; 833 834 log_verbose("\nTesting a sample for parse Message test#9\n"); 835 836 u_uastrcpy(source, "You deposited an amount of $500.00"); 837 u_uastrcpy(pattern, "You {0} an amount of {1,number,currency}"); 838 u_uastrcpy(res,"deposited"); 839 840 u_parseMessage( "en_US", pattern, u_strlen(pattern), source, u_strlen(source), &status, str, &value); 841 if(U_FAILURE(status)){ 842 log_data_err("ERROR: failure in parse Message on test#9: %s (Are you missing data?)\n", myErrorName(status)); 843 } 844 else if(value==500.00 && u_strcmp(str,res)==0) 845 log_verbose("PASS: parseMessage successful on test#9\n"); 846 else 847 log_err("FAIL: Error in parseMessage on test#9 \n"); 848 849 850 851 log_verbose("\nTesting a sample for parse Message test#10\n"); 852 853 u_uastrcpy(source, "There are 123 files on MyDisk created"); 854 u_uastrcpy(pattern, "There are {0,number,integer} files on {1} created"); 855 u_uastrcpy(res,"MyDisk"); 856 857 u_parseMessage( "en_US", pattern, u_strlen(pattern), source, u_strlen(source), &status, &value, str); 858 if(U_FAILURE(status)){ 859 log_data_err("ERROR: failure in parse Message on test#10: %s (Are you missing data?)\n", myErrorName(status)); 860 } 861 else if(value==123.00 && u_strcmp(str,res)==0) 862 log_verbose("PASS: parseMessage successful on test#10\n"); 863 else 864 log_err("FAIL: Error in parseMessage on test#10 \n"); 865 } 866 867 static int32_t CallFormatMessage(const char* locale, UChar* testCasePattern, int32_t patternLength, 868 UChar* result, int32_t resultLength, UErrorCode *status, ...) 869 { 870 int32_t len = 0; 871 va_list ap; 872 va_start(ap, status); 873 len = u_vformatMessage(locale, testCasePattern, patternLength, result, resultLength, ap, status); 874 va_end(ap); 875 return len; 876 } 877 878 /* Test u_vformatMessage() with various test patterns. */ 879 static void TestMessageFormatWithValist( void ) 880 { 881 882 UChar *str; 883 UChar* result; 884 int32_t resultLengthOut,resultlength,i, patternlength; 885 UErrorCode status = U_ZERO_ERROR; 886 UDate d1=1000000000.0; 887 888 ctest_setTimeZone(NULL, &status); 889 890 str=(UChar*)malloc(sizeof(UChar) * 7); 891 u_uastrcpy(str, "MyDisk"); 892 resultlength=1; 893 result=(UChar*)malloc(sizeof(UChar) * 1); 894 log_verbose("Testing u_formatMessage90\n"); 895 InitStrings(); 896 for (i = 0; i < cnt_testCases; i++) { 897 status=U_ZERO_ERROR; 898 patternlength=u_strlen(testCasePatterns[i]); 899 resultLengthOut=CallFormatMessage( "en_US",testCasePatterns[i], patternlength, result, resultlength, 900 &status, 1, 3456.00, d1); 901 if(status== U_BUFFER_OVERFLOW_ERROR) 902 { 903 status=U_ZERO_ERROR; 904 resultlength=resultLengthOut+1; 905 result=(UChar*)realloc(result,sizeof(UChar) * resultlength); 906 CallFormatMessage( "en_US",testCasePatterns[i], patternlength, result, resultlength, 907 &status, 1, 3456.00, d1); 908 } 909 if(U_FAILURE(status)){ 910 log_data_err("ERROR: failure in message format on testcase %d: %s (Are you missing data?)\n", i, myErrorName(status) ); 911 } 912 else if(u_strcmp(result, testResultStrings[i])==0){ 913 log_verbose("PASS: MessagFormat successful on testcase : %d\n", i); 914 } 915 else{ 916 log_err("FAIL: Error in MessageFormat on testcase : %d\n GOT %s EXPECTED %s\n", i, 917 austrdup(result), austrdup(testResultStrings[i]) ); 918 } 919 } 920 free(result); 921 free(str); 922 FreeStrings(); 923 924 ctest_resetTimeZone(); 925 } 926 927 static void CallParseMessage(const char* locale, UChar* pattern, int32_t patternLength, 928 UChar* source, int32_t sourceLength, UErrorCode *status, ...) 929 { 930 va_list ap; 931 va_start(ap, status); 932 u_vparseMessage(locale, pattern, patternLength, source, sourceLength, ap, status); 933 va_end(ap); 934 } 935 936 /*test u_vparseMessage() with various test patterns */ 937 static void TestParseMessageWithValist(void) 938 { 939 UChar pattern[100]; 940 UChar source[100]; 941 UErrorCode status = U_ZERO_ERROR; 942 int32_t value; 943 UChar str[10]; 944 UChar res[10]; 945 946 log_verbose("\nTesting a sample for parse Message test#9\n"); 947 948 u_uastrcpy(source, "You deposited an amount of $500.00"); 949 u_uastrcpy(pattern, "You {0} an amount of {1,number,currency}"); 950 u_uastrcpy(res,"deposited"); 951 952 CallParseMessage( "en_US", pattern, u_strlen(pattern), source, u_strlen(source), &status, str, &value); 953 if(U_FAILURE(status)){ 954 log_data_err("ERROR: failure in parse Message on test#9: %s (Are you missing data?)\n", myErrorName(status)); 955 } 956 else if(value==500.00 && u_strcmp(str,res)==0) 957 log_verbose("PASS: parseMessage successful on test#9\n"); 958 else 959 log_err("FAIL: Error in parseMessage on test#9\n"); 960 961 962 log_verbose("\nTesting a sample for parse Message test#10\n"); 963 964 u_uastrcpy(source, "There are 123 files on MyDisk created"); 965 u_uastrcpy(pattern, "There are {0,number,integer} files on {1} created"); 966 u_uastrcpy(res,"MyDisk"); 967 968 CallParseMessage( "en_US", pattern, u_strlen(pattern), source, u_strlen(source), &status, &value, str); 969 if(U_FAILURE(status)){ 970 log_data_err("ERROR: failure in parse Message on test#10: %s (Are you missing data?)\n", myErrorName(status)); 971 } 972 else if(value==123.00 && u_strcmp(str,res)==0) 973 log_verbose("PASS: parseMessage successful on test#10\n"); 974 else 975 log_err("FAIL: Error in parseMessage on test#10 \n"); 976 } 977 978 /** 979 * Regression test for ICU4C Jitterbug 904 980 */ 981 static void TestJ904(void) { 982 UChar pattern[256]; 983 UChar result[256]; 984 UChar string[16]; 985 char cresult[256]; 986 int32_t length; 987 UErrorCode status = U_ZERO_ERROR; 988 const char* PAT = "Number {1,number,#0.000}, String {0}, Date {2,date,12:mm:ss.SSS}"; 989 const char* EXP = "Number 0,143, String foo, Date 12:34:56.789"; 990 991 ctest_setTimeZone(NULL, &status); 992 993 u_uastrcpy(string, "foo"); 994 /* Slight hack here -- instead of date pattern HH:mm:ss.SSS, use 995 * 12:mm:ss.SSS. Why? So this test generates the same output -- 996 * "12:34:56.789" -- regardless of time zone (as long as we aren't 997 * in one of the 30 minute offset zones!). */ 998 u_uastrcpy(pattern, PAT); 999 length = u_formatMessage("nl", pattern, u_strlen(pattern), 1000 result, 256, &status, 1001 string, 1/7.0, 1002 789.0+1000*(56+60*(34+60*12))); 1003 (void)length; /* Suppress set but not used warning. */ 1004 1005 u_austrncpy(cresult, result, sizeof(cresult)); 1006 1007 /* This test passes if it DOESN'T CRASH. However, we test the 1008 * output anyway. If the string doesn't match in the date part, 1009 * check to see that the machine doesn't have an unusual time zone 1010 * offset, that is, one with a non-zero minutes/seconds offset 1011 * from GMT -- see above. */ 1012 if (strcmp(cresult, EXP) == 0) { 1013 log_verbose("Ok: \"%s\"\n", cresult); 1014 } else { 1015 log_data_err("FAIL: got \"%s\", expected \"%s\" -> %s (Are you missing data?)\n", cresult, EXP, u_errorName(status)); 1016 } 1017 1018 ctest_resetTimeZone(); 1019 } 1020 1021 static void OpenMessageFormatTest(void) 1022 { 1023 UMessageFormat *f1, *f2, *f3; 1024 UChar pattern[256]; 1025 UChar result[256]; 1026 char cresult[256]; 1027 UParseError parseError; 1028 const char* locale = "hi_IN"; 1029 char* retLoc; 1030 const char* PAT = "Number {1,number,#0.000}, String {0}, Date {2,date,12:mm:ss.SSS}"; 1031 int32_t length=0; 1032 UErrorCode status = U_ZERO_ERROR; 1033 1034 u_uastrncpy(pattern, PAT, sizeof(pattern)/sizeof(pattern[0])); 1035 1036 /* Test umsg_open */ 1037 f1 = umsg_open(pattern,length,NULL,NULL,&status); 1038 1039 if(U_FAILURE(status)) 1040 { 1041 log_err("umsg_open failed with pattern %s. Error: \n", PAT, u_errorName(status)); 1042 return; 1043 } 1044 1045 /* Test umsg_open with parse error */ 1046 status = U_ZERO_ERROR; 1047 f2 = umsg_open(pattern,length,NULL,&parseError,&status); 1048 1049 if(U_FAILURE(status)) 1050 { 1051 log_err("umsg_open with parseError failed with pattern %s. Error: %s\n", PAT, u_errorName(status)); 1052 return; 1053 } 1054 1055 /* Test umsg_clone */ 1056 status = U_ZERO_ERROR; 1057 f3 = umsg_clone(f1,&status); 1058 if(U_FAILURE(status)) 1059 { 1060 log_err("umsg_clone failed. Error %s \n", u_errorName(status)); 1061 } 1062 1063 /* Test umsg_setLocale */ 1064 umsg_setLocale(f1,locale); 1065 /* Test umsg_getLocale */ 1066 retLoc = (char*)umsg_getLocale(f1); 1067 if(strcmp(retLoc,locale)!=0) 1068 { 1069 log_err("umsg_setLocale and umsg_getLocale methods failed. Expected:%s Got: %s \n", locale, retLoc); 1070 } 1071 1072 /* Test umsg_applyPattern */ 1073 status = U_ZERO_ERROR; 1074 umsg_applyPattern(f1,pattern,(int32_t)strlen(PAT),NULL,&status); 1075 if(U_FAILURE(status)) 1076 { 1077 log_data_err("umsg_applyPattern failed. Error %s (Are you missing data?)\n",u_errorName(status)); 1078 } 1079 1080 /* Test umsg_toPattern */ 1081 umsg_toPattern(f1,result,256,&status); 1082 if(U_FAILURE(status) ){ 1083 log_data_err("umsg_toPattern method failed. Error: %s (Are you missing data?)\n",u_errorName(status)); 1084 } else { 1085 if(u_strcmp(result,pattern)!=0){ 1086 u_UCharsToChars(result,cresult,256); 1087 log_err("umsg_toPattern method failed. Expected: %s Got: %s \n",PAT,cresult); 1088 } 1089 } 1090 /* umsg_format umsg_parse */ 1091 1092 umsg_close(f1); 1093 umsg_close(f2); 1094 umsg_close(f3); 1095 } 1096 1097 static void MessageLength(void) 1098 { 1099 UErrorCode status = U_ZERO_ERROR; 1100 const char patChars[] = {"123{0}456{0}"}; 1101 const char expectedChars[] = {"123abc"}; 1102 UChar pattern[sizeof(patChars)]; 1103 UChar arg[] = {0x61,0x62,0x63,0}; 1104 UChar result[128] = {0}; 1105 UChar expected[sizeof(expectedChars)]; 1106 1107 u_uastrncpy(pattern, patChars, sizeof(pattern)/sizeof(pattern[0])); 1108 u_uastrncpy(expected, expectedChars, sizeof(expected)/sizeof(expected[0])); 1109 1110 u_formatMessage("en_US", pattern, 6, result, sizeof(result)/sizeof(result[0]), &status, arg); 1111 if (U_FAILURE(status)) { 1112 log_err("u_formatMessage method failed. Error: %s \n",u_errorName(status)); 1113 } 1114 if (u_strcmp(result, expected) != 0) { 1115 log_err("u_formatMessage didn't return expected result\n"); 1116 } 1117 } 1118 1119 static void TestMessageWithUnusedArgNumber() { 1120 UErrorCode errorCode = U_ZERO_ERROR; 1121 U_STRING_DECL(pattern, "abc {1} def", 11); 1122 UChar x[2] = { 0x78, 0 }; // "x" 1123 UChar y[2] = { 0x79, 0 }; // "y" 1124 U_STRING_DECL(expected, "abc y def", 9); 1125 UChar result[20]; 1126 int32_t length; 1127 1128 U_STRING_INIT(pattern, "abc {1} def", 11); 1129 U_STRING_INIT(expected, "abc y def", 9); 1130 length = u_formatMessage("en", pattern, -1, result, UPRV_LENGTHOF(result), &errorCode, x, y); 1131 if (U_FAILURE(errorCode) || length != u_strlen(expected) || u_strcmp(result, expected) != 0) { 1132 log_err("u_formatMessage(pattern with only {1}, 2 args) failed: result length %d, UErrorCode %s \n", 1133 (int)length, u_errorName(errorCode)); 1134 } 1135 } 1136 1137 static void TestErrorChaining(void) { 1138 UErrorCode status = U_USELESS_COLLATOR_ERROR; 1139 1140 umsg_open(NULL, 0, NULL, NULL, &status); 1141 umsg_applyPattern(NULL, NULL, 0, NULL, &status); 1142 umsg_toPattern(NULL, NULL, 0, &status); 1143 umsg_clone(NULL, &status); 1144 umsg_format(NULL, NULL, 0, &status); 1145 umsg_parse(NULL, NULL, 0, NULL, &status); 1146 umsg_close(NULL); 1147 1148 /* All of this code should have done nothing. */ 1149 if (status != U_USELESS_COLLATOR_ERROR) { 1150 log_err("Status got changed to %s\n", u_errorName(status)); 1151 } 1152 1153 status = U_ZERO_ERROR; 1154 umsg_open(NULL, 0, NULL, NULL, &status); 1155 if (status != U_ILLEGAL_ARGUMENT_ERROR) { 1156 log_err("Status should be U_ILLEGAL_ARGUMENT_ERROR instead of %s\n", u_errorName(status)); 1157 } 1158 status = U_ZERO_ERROR; 1159 umsg_applyPattern(NULL, NULL, 0, NULL, &status); 1160 if (status != U_ILLEGAL_ARGUMENT_ERROR) { 1161 log_err("Status should be U_ILLEGAL_ARGUMENT_ERROR instead of %s\n", u_errorName(status)); 1162 } 1163 status = U_ZERO_ERROR; 1164 umsg_toPattern(NULL, NULL, 0, &status); 1165 if (status != U_ILLEGAL_ARGUMENT_ERROR) { 1166 log_err("Status should be U_ILLEGAL_ARGUMENT_ERROR instead of %s\n", u_errorName(status)); 1167 } 1168 status = U_ZERO_ERROR; 1169 umsg_clone(NULL, &status); 1170 if (status != U_ILLEGAL_ARGUMENT_ERROR) { 1171 log_err("Status should be U_ILLEGAL_ARGUMENT_ERROR instead of %s\n", u_errorName(status)); 1172 } 1173 } 1174 1175 void addMsgForTest(TestNode** root); 1176 1177 void addMsgForTest(TestNode** root) 1178 { 1179 addTest(root, &OpenMessageFormatTest, "tsformat/cmsgtst/OpenMessageFormatTest"); 1180 addTest(root, &MessageFormatTest, "tsformat/cmsgtst/MessageFormatTest"); 1181 addTest(root, &TestSampleMessageFormat, "tsformat/cmsgtst/TestSampleMessageFormat"); 1182 addTest(root, &TestSampleFormatAndParse, "tsformat/cmsgtst/TestSampleFormatAndParse"); 1183 addTest(root, &TestSampleFormatAndParseWithError, "tsformat/cmsgtst/TestSampleFormatAndParseWithError"); 1184 addTest(root, &TestNewFormatAndParseAPI, "tsformat/cmsgtst/TestNewFormatAndParseAPI"); 1185 addTest(root, &TestMsgFormatChoice, "tsformat/cmsgtst/TestMsgFormatChoice"); 1186 addTest(root, &TestParseMessage, "tsformat/cmsgtst/TestParseMessage"); 1187 addTest(root, &TestMessageFormatWithValist, "tsformat/cmsgtst/TestMessageFormatWithValist"); 1188 addTest(root, &TestParseMessageWithValist, "tsformat/cmsgtst/TestParseMessageWithValist"); 1189 addTest(root, &TestJ904, "tsformat/cmsgtst/TestJ904"); 1190 addTest(root, &MessageLength, "tsformat/cmsgtst/MessageLength"); 1191 addTest(root, &TestMessageWithUnusedArgNumber, "tsformat/cmsgtst/TestMessageWithUnusedArgNumber"); 1192 addTest(root, &TestErrorChaining, "tsformat/cmsgtst/TestErrorChaining"); 1193 addTest(root, &TestMsgFormatSelect, "tsformat/cmsgtst/TestMsgFormatSelect"); 1194 } 1195 1196 #endif /* #if !UCONFIG_NO_FORMATTING */ 1197