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