Home | History | Annotate | Download | only in cintltst
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1997-2010, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ***************************************************************************/
      6 /*****************************************************************************
      7 *
      8 * File NCNVCBTS
      9 *
     10 * Modification History:
     11 *      Name              Date                  Description
     12 * Madhu Katragadda    06/23/2000     Tests for Conveter FallBack API and Functionality
     13 ******************************************************************************
     14 */
     15 #include <stdio.h>
     16 #include "unicode/uloc.h"
     17 #include "unicode/ucnv.h"
     18 #include "unicode/ucnv_err.h"
     19 #include "cintltst.h"
     20 #include "unicode/utypes.h"
     21 #include "unicode/ustring.h"
     22 #include "ncnvfbts.h"
     23 #include "cmemory.h"
     24 #include "cstring.h"
     25 
     26 #if !UCONFIG_NO_LEGACY_CONVERSION
     27 #define NEW_MAX_BUFFER 999
     28 
     29 
     30 #define nct_min(x,y)  ((x<y) ? x : y)
     31 
     32 static int32_t  gInBufferSize = 0;
     33 static int32_t  gOutBufferSize = 0;
     34 static char     gNuConvTestName[1024];
     35 
     36 static UConverter *my_ucnv_open(const char *cnv, UErrorCode *err)
     37 {
     38   if(cnv && cnv[0] == '@') {
     39     return ucnv_openPackage("testdata", cnv+1, err);
     40   } else {
     41     return ucnv_open(cnv, err);
     42   }
     43 }
     44 
     45 
     46 static void printSeq(const unsigned char* a, int len)
     47 {
     48     int i=0;
     49     log_verbose("{");
     50     while (i<len)
     51         log_verbose("0x%02x ", a[i++]);
     52     log_verbose("}\n");
     53 }
     54 
     55 static void printUSeq(const UChar* a, int len)
     56 {
     57     int i=0;
     58     log_verbose("{U+");
     59     while (i<len)
     60         log_verbose("0x%04x ", a[i++]);
     61     log_verbose("}\n");
     62 }
     63 
     64 static void printSeqErr(const unsigned char* a, int len)
     65 {
     66     int i=0;
     67     fprintf(stderr, "{");
     68     while (i<len)
     69         fprintf(stderr, "0x%02x ", a[i++]);
     70     fprintf(stderr, "}\n");
     71 }
     72 
     73 static void printUSeqErr(const UChar* a, int len)
     74 {
     75     int i=0;
     76     fprintf(stderr, "{U+");
     77     while (i<len)
     78         fprintf(stderr, "0x%04x ", a[i++]);
     79     fprintf(stderr,"}\n");
     80 }
     81 
     82 static void TestConverterFallBack(void)
     83 {
     84    TestConvertFallBackWithBufferSizes(10,10);
     85    TestConvertFallBackWithBufferSizes(2,3);
     86    TestConvertFallBackWithBufferSizes(3,2);
     87    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,1);
     88    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,2);
     89    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,3);
     90    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,4);
     91    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,5);
     92    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,6);
     93    TestConvertFallBackWithBufferSizes(1,NEW_MAX_BUFFER);
     94    TestConvertFallBackWithBufferSizes(2,NEW_MAX_BUFFER);
     95    TestConvertFallBackWithBufferSizes(3,NEW_MAX_BUFFER);
     96    TestConvertFallBackWithBufferSizes(4,NEW_MAX_BUFFER);
     97    TestConvertFallBackWithBufferSizes(5,NEW_MAX_BUFFER);
     98    TestConvertFallBackWithBufferSizes(NEW_MAX_BUFFER,NEW_MAX_BUFFER);
     99 
    100 }
    101 
    102 
    103 void addTestConverterFallBack(TestNode** root);
    104 
    105 void addTestConverterFallBack(TestNode** root)
    106 {
    107 #if !UCONFIG_NO_FILE_IO
    108    addTest(root, &TestConverterFallBack, "tsconv/ncnvfbts/TestConverterFallBack");
    109 #endif
    110 
    111 }
    112 
    113 
    114 /* Note that this test already makes use of statics, so it's not really
    115    multithread safe.
    116    This convenience function lets us make the error messages actually useful.
    117 */
    118 
    119 static void setNuConvTestName(const char *codepage, const char *direction)
    120 {
    121     sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]",
    122         codepage,
    123         direction,
    124         (int)gInBufferSize,
    125         (int)gOutBufferSize);
    126 }
    127 
    128 
    129 static UBool testConvertFromUnicode(const UChar *source, int sourceLen,  const uint8_t *expect, int expectLen,
    130                 const char *codepage, UBool fallback, const int32_t *expectOffsets)
    131 {
    132 
    133 
    134     UErrorCode status = U_ZERO_ERROR;
    135     UConverter *conv = 0;
    136     char junkout[NEW_MAX_BUFFER]; /* FIX */
    137     int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
    138     const UChar *src;
    139     char *end;
    140     char *targ;
    141     int32_t *offs;
    142     int i;
    143     int32_t   realBufferSize;
    144     char *realBufferEnd;
    145     const UChar *realSourceEnd;
    146     const UChar *sourceLimit;
    147     UBool checkOffsets = TRUE;
    148     UBool doFlush;
    149     UBool action=FALSE;
    150     char *p;
    151 
    152 
    153     for(i=0;i<NEW_MAX_BUFFER;i++)
    154         junkout[i] = (char)0xF0;
    155     for(i=0;i<NEW_MAX_BUFFER;i++)
    156         junokout[i] = 0xFF;
    157     setNuConvTestName(codepage, "FROM");
    158 
    159     log_verbose("\nTesting========= %s  FROM \n  inputbuffer= %d   outputbuffer= %d\n", codepage, gInBufferSize,
    160             gOutBufferSize);
    161 
    162     conv = my_ucnv_open(codepage, &status);
    163     if(U_FAILURE(status))
    164     {
    165         log_data_err("Couldn't open converter %s\n",codepage);
    166         return TRUE;
    167     }
    168 
    169     log_verbose("Converter opened..\n");
    170     /*----setting the callback routine----*/
    171     ucnv_setFallback (conv, fallback);
    172     action = ucnv_usesFallback(conv);
    173     if(action != fallback){
    174         log_err("FAIL: Error is setting fallback. Errocode=%s\n", myErrorName(status));
    175     }
    176     /*------------------------*/
    177     src = source;
    178     targ = junkout;
    179     offs = junokout;
    180 
    181     realBufferSize = (sizeof(junkout)/sizeof(junkout[0]));
    182     realBufferEnd = junkout + realBufferSize;
    183     realSourceEnd = source + sourceLen;
    184 
    185     if ( gOutBufferSize != realBufferSize )
    186         checkOffsets = FALSE;
    187 
    188     if( gInBufferSize != NEW_MAX_BUFFER )
    189         checkOffsets = FALSE;
    190 
    191     do
    192     {
    193         end = nct_min(targ + gOutBufferSize, realBufferEnd);
    194         sourceLimit = nct_min(src + gInBufferSize, realSourceEnd);
    195 
    196         doFlush = (UBool)(sourceLimit == realSourceEnd);
    197 
    198         if(targ == realBufferEnd)
    199         {
    200             log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName);
    201             return FALSE;
    202         }
    203         log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx  TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE");
    204 
    205 
    206         status = U_ZERO_ERROR;
    207 
    208         ucnv_fromUnicode (conv,
    209                   (char **)&targ,
    210                   (const char *)end,
    211                   &src,
    212                   sourceLimit,
    213                   checkOffsets ? offs : NULL,
    214                   doFlush, /* flush if we're at the end of the input data */
    215                   &status);
    216 
    217     } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (sourceLimit < realSourceEnd) );
    218 
    219     if(U_FAILURE(status))
    220     {
    221         log_err("Problem doing toUnicode, errcode %d %s\n", myErrorName(status), gNuConvTestName);
    222         return FALSE;
    223     }
    224 
    225     log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :",
    226         sourceLen, targ-junkout);
    227     if(getTestOption(VERBOSITY_OPTION))
    228     {
    229         char junk[9999];
    230         char offset_str[9999];
    231 
    232         junk[0] = 0;
    233         offset_str[0] = 0;
    234         for(p = junkout;p<targ;p++)
    235         {
    236             sprintf(junk + uprv_strlen(junk), "0x%02x, ", (0xFF) & (unsigned int)*p);
    237             sprintf(offset_str + strlen(offset_str), "0x%02x, ", (0xFF) & (unsigned int)junokout[p-junkout]);
    238         }
    239 
    240         log_verbose(junk);
    241         printSeq((const unsigned char*)expect, expectLen);
    242         if ( checkOffsets )
    243         {
    244             log_verbose("\nOffsets:");
    245             log_verbose(offset_str);
    246         }
    247         log_verbose("\n");
    248     }
    249     ucnv_close(conv);
    250 
    251 
    252     if(expectLen != targ-junkout)
    253     {
    254         log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
    255         log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
    256         printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout));
    257         printSeqErr((const unsigned char*)expect, expectLen);
    258         return FALSE;
    259     }
    260 
    261     if (checkOffsets && (expectOffsets != 0) )
    262     {
    263         log_verbose("\ncomparing %d offsets..\n", targ-junkout);
    264         if(uprv_memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){
    265             log_err("\ndid not get the expected offsets while %s \n", gNuConvTestName);
    266             log_err("Got  : ");
    267             printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout));
    268             for(p=junkout;p<targ;p++)
    269                 log_err("%d, ", junokout[p-junkout]);
    270             log_err("\nExpected: ");
    271             for(i=0; i<(targ-junkout); i++)
    272                 log_err("%d,", expectOffsets[i]);
    273         }
    274     }
    275 
    276     log_verbose("\n\ncomparing..\n");
    277     if(!memcmp(junkout, expect, expectLen))
    278     {
    279         log_verbose("Matches!\n");
    280         return TRUE;
    281     }
    282     else
    283     {
    284         log_err("String does not match. %s\n", gNuConvTestName);
    285         log_verbose("String does not match. %s\n", gNuConvTestName);
    286         printSeqErr((const unsigned char*)junkout, expectLen);
    287         printSeqErr((const unsigned char*)expect, expectLen);
    288         return FALSE;
    289     }
    290 }
    291 
    292 static UBool testConvertToUnicode( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen,
    293                const char *codepage, UBool fallback, const int32_t *expectOffsets)
    294 {
    295     UErrorCode status = U_ZERO_ERROR;
    296     UConverter *conv = 0;
    297     UChar   junkout[NEW_MAX_BUFFER]; /* FIX */
    298     int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
    299     const char *src;
    300     const char *realSourceEnd;
    301     const char *srcLimit;
    302     UChar *targ;
    303     UChar *end;
    304     int32_t *offs;
    305     int i;
    306     UBool   checkOffsets = TRUE;
    307     char junk[9999];
    308     char offset_str[9999];
    309     UChar *p;
    310     UBool action;
    311 
    312     int32_t   realBufferSize;
    313     UChar *realBufferEnd;
    314 
    315 
    316     for(i=0;i<NEW_MAX_BUFFER;i++)
    317         junkout[i] = 0xFFFE;
    318 
    319     for(i=0;i<NEW_MAX_BUFFER;i++)
    320         junokout[i] = -1;
    321 
    322     setNuConvTestName(codepage, "TO");
    323 
    324     log_verbose("\n=========  %s\n", gNuConvTestName);
    325 
    326     conv = my_ucnv_open(codepage, &status);
    327     if(U_FAILURE(status))
    328     {
    329         log_data_err("Couldn't open converter %s\n",gNuConvTestName);
    330         return TRUE; /* because it has been logged */
    331     }
    332 
    333     log_verbose("Converter opened..\n");
    334 
    335     src = (const char *)source;
    336     targ = junkout;
    337     offs = junokout;
    338 
    339     realBufferSize = (sizeof(junkout)/sizeof(junkout[0]));
    340     realBufferEnd = junkout + realBufferSize;
    341     realSourceEnd = src + sourcelen;
    342     /*----setting the fallback routine----*/
    343     ucnv_setFallback (conv, fallback);
    344     action = ucnv_usesFallback(conv);
    345     if(action != fallback){
    346         log_err("FAIL: Error is setting fallback. Errocode=%s\n", myErrorName(status));
    347     }
    348     /*-------------------------------------*/
    349     if ( gOutBufferSize != realBufferSize )
    350       checkOffsets = FALSE;
    351 
    352     if( gInBufferSize != NEW_MAX_BUFFER )
    353       checkOffsets = FALSE;
    354 
    355     do
    356     {
    357         end = nct_min( targ + gOutBufferSize, realBufferEnd);
    358         srcLimit = nct_min(realSourceEnd, src + gInBufferSize);
    359 
    360         if(targ == realBufferEnd)
    361         {
    362             log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjey=%08lx %s",targ,gNuConvTestName);
    363             return FALSE;
    364         }
    365         log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end);
    366 
    367 
    368 
    369         status = U_ZERO_ERROR;
    370 
    371         ucnv_toUnicode (conv,
    372                 &targ,
    373                 end,
    374                 (const char **)&src,
    375                 (const char *)srcLimit,
    376                 checkOffsets ? offs : NULL,
    377                 (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of hte source data */
    378                 &status);
    379     } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (srcLimit < realSourceEnd) ); /* while we just need another buffer */
    380 
    381 
    382     if(U_FAILURE(status))
    383     {
    384         log_err("Problem doing toUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
    385         return FALSE;
    386     }
    387 
    388     log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :",
    389         sourcelen, targ-junkout);
    390     if(getTestOption(VERBOSITY_OPTION))
    391     {
    392 
    393         junk[0] = 0;
    394         offset_str[0] = 0;
    395 
    396         for(p = junkout;p<targ;p++)
    397         {
    398             sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*p);
    399             sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[p-junkout]);
    400         }
    401 
    402         log_verbose(junk);
    403         printUSeq(expect, expectlen);
    404         if ( checkOffsets )
    405         {
    406             log_verbose("\nOffsets:");
    407             log_verbose(offset_str);
    408         }
    409         log_verbose("\n");
    410     }
    411     ucnv_close(conv);
    412 
    413     log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2);
    414 
    415     if (checkOffsets && (expectOffsets != 0))
    416     {
    417         if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t)))
    418         {
    419             log_err("\n\ndid not get the expected offsets while %s \n", gNuConvTestName);
    420             log_err("\nGot  : ");
    421             for(p=junkout;p<targ;p++)
    422                 log_err("%d, ", junokout[p-junkout]);
    423             log_err("\nExpected: ");
    424             for(i=0; i<(targ-junkout); i++)
    425                 log_err("%d,", expectOffsets[i]);
    426             log_err("");
    427             for(i=0; i<(targ-junkout); i++)
    428                 log_err("0x%04X,", junkout[i]);
    429             log_err("");
    430             for(i=0; i<(src-(const char *)source); i++)
    431                 log_err("0x%04X,", (unsigned char)source[i]);
    432         }
    433     }
    434 
    435     if(!memcmp(junkout, expect, expectlen*2))
    436     {
    437         log_verbose("Matches!\n");
    438         return TRUE;
    439     }
    440     else
    441     {
    442         log_err("String does not match. %s\n", gNuConvTestName);
    443         log_verbose("String does not match. %s\n", gNuConvTestName);
    444         printUSeqErr(junkout, expectlen);
    445         printf("\n");
    446         printUSeqErr(expect, expectlen);
    447         return FALSE;
    448     }
    449 }
    450 
    451 
    452 
    453 static void TestConvertFallBackWithBufferSizes(int32_t outsize, int32_t insize )
    454 {
    455 
    456     static const UChar    SBCSText[] =
    457      { 0x0021, 0xFF01, 0x0022, 0xFF02, 0x0023, 0xFF03, 0x003A, 0xFF1A, 0x003B, 0xFF1B, 0x003C, 0xFF1C };
    458      /* 21, ?, 22, ?, 23, ?, 3a, ?, 3b, ?, 3c, ? SBCS*/
    459     static const uint8_t expectedNative[] =
    460      {  0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x3a, 0x3a, 0x3b, 0x3b, 0x3c, 0x3c};
    461     static const UChar retrievedSBCSText[]=
    462        { 0x0021, 0x0021, 0x0022, 0x0022, 0x0023, 0x0023, 0x003A, 0x003A, 0x003B, 0x003B, 0x003C, 0x003C };
    463     static const int32_t  toNativeOffs    [] =
    464      {  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b};
    465     static const int32_t fromNativeoffs []  =
    466     {  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
    467 
    468 
    469     /* 1363 isn't DBCS, but it has the DBCS section */
    470     static const UChar    DBCSText[] =
    471      { 0x00a1, 0x00ad, 0x2010, 0x00b7, 0x30fb};
    472     static const uint8_t expectedIBM1363_DBCS[] =
    473      {  0xa2, 0xae, 0xa1 ,0xa9, 0xa1, 0xa9,0xa1 ,0xa4, 0xa1, 0xa4};
    474     static const UChar retrievedDBCSText[]=
    475         { 0x00a1, 0x2010, 0x2010, 0x30fb, 0x30fb };
    476     static const int32_t  toIBM1363Offs_DBCS[] =
    477         {  0x00, 0x00, 0x01,0x01, 0x02, 0x02,  0x03, 0x03, 0x04, 0x04};
    478     static const int32_t fromIBM1363offs_DBCS[]  =
    479     {  0, 2, 4, 6, 8};
    480 
    481 
    482     static const UChar    MBCSText[] =
    483      { 0x0001, 0x263a, 0x2013, 0x2014, 0x263b, 0x0002};
    484     static const  uint8_t expectedIBM950[] =
    485      {  0x01, 0x01, 0xa1, 0x56, 0xa1, 0x56, 0x02, 0x02};
    486     static const UChar retrievedMBCSText[]=
    487        { 0x0001, 0x0001, 0x2014, 0x2014, 0x0002, 0x0002};
    488     static const int32_t  toIBM950Offs    [] =
    489      {  0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05};
    490     static const int32_t fromIBM950offs []  =
    491     {  0, 1, 2, 4, 6, 7};
    492 
    493     static const UChar    MBCSText1363[] =
    494      { 0x0005,
    495        0xffe8,
    496        0x0007,
    497        0x2022,
    498        0x005c,
    499        0x00b7,
    500        0x3016,
    501        0x30fb,
    502        0x9a36};
    503     static const uint8_t expectedIBM1363[] =
    504      {  0x05,
    505         0x05,
    506         0x07,
    507         0x07,
    508         0x7f,
    509         0xa1, 0xa4,
    510         0xa1, 0xe0,
    511         0xa1, 0xa4,
    512         0xf5, 0xe2};
    513     static const UChar retrievedMBCSText1363[]=
    514        { 0x0005, 0x0005, 0x0007, 0x0007, 0x001a,  0x30fb, 0x25a1, 0x30fb, 0x9a36};
    515     static const int32_t  toIBM1363Offs    [] =
    516      {  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08};
    517     static const int32_t fromIBM1363offs []  =
    518     {  0, 1, 2, 3, 4, 5, 7, 9, 11};
    519 
    520 
    521 
    522     static const char* nativeCodePage[]={
    523         /*NLCS Mapping*/
    524         "ibm-437",
    525         "ibm-850",
    526         "ibm-878",
    527         "ibm-923",
    528         "ibm-1051",
    529         "ibm-1089",
    530         "ibm-1250",
    531         "ibm-1251",
    532         "ibm-1253",
    533         "ibm-1254",
    534         "ibm-1255",
    535         "ibm-1256",
    536         "ibm-1257",
    537         "ibm-1258",
    538         "ibm-1276"
    539     };
    540 
    541     int32_t i=0;
    542     gInBufferSize = insize;
    543     gOutBufferSize = outsize;
    544 
    545     for(i=0; i<sizeof(nativeCodePage)/sizeof(nativeCodePage[0]); i++){
    546         log_verbose("Testing %s\n", nativeCodePage[i]);
    547         if(!testConvertFromUnicode(SBCSText, sizeof(SBCSText)/sizeof(SBCSText[0]),
    548             expectedNative, sizeof(expectedNative), nativeCodePage[i], TRUE, toNativeOffs ))
    549             log_err("u-> %s(SBCS) with FallBack did not match.\n", nativeCodePage[i]);
    550 
    551         if(!testConvertToUnicode(expectedNative, sizeof(expectedNative),
    552             retrievedSBCSText, sizeof(retrievedSBCSText)/sizeof(retrievedSBCSText[0]), nativeCodePage[i], TRUE, fromNativeoffs ))
    553             log_err("%s->u(SBCS) with Fallback did not match.\n", nativeCodePage[i]);
    554     }
    555 
    556     /*DBCS*/
    557     if(!testConvertFromUnicode(DBCSText, sizeof(DBCSText)/sizeof(DBCSText[0]),
    558         expectedIBM1363_DBCS, sizeof(expectedIBM1363_DBCS), "ibm-1363", TRUE, toIBM1363Offs_DBCS ))
    559        log_err("u-> ibm-1363(DBCS portion) with FallBack did not match.\n");
    560 
    561     if(!testConvertToUnicode(expectedIBM1363_DBCS, sizeof(expectedIBM1363_DBCS),
    562         retrievedDBCSText, sizeof(retrievedDBCSText)/sizeof(retrievedDBCSText[0]),"ibm-1363", TRUE, fromIBM1363offs_DBCS ))
    563         log_err("ibm-1363->u(DBCS portion) with Fallback did not match.\n");
    564 
    565 
    566     /*MBCS*/
    567     if(!testConvertFromUnicode(MBCSText, sizeof(MBCSText)/sizeof(MBCSText[0]),
    568         expectedIBM950, sizeof(expectedIBM950), "ibm-950", TRUE, toIBM950Offs ))
    569        log_err("u-> ibm-950(MBCS) with FallBack did not match.\n");
    570 
    571     if(!testConvertToUnicode(expectedIBM950, sizeof(expectedIBM950),
    572         retrievedMBCSText, sizeof(retrievedMBCSText)/sizeof(retrievedMBCSText[0]),"ibm-950", TRUE, fromIBM950offs ))
    573         log_err("ibm-950->u(MBCS) with Fallback did not match.\n");
    574 
    575    /*commented untill data table is available*/
    576     log_verbose("toUnicode fallback with fallback data for MBCS\n");
    577     {
    578         const uint8_t IBM950input[] =   {
    579             0xf4, 0x87, 0xa4, 0x4a, 0xf4, 0x88, 0xa4, 0x4b,
    580                 0xf9, 0x92, 0xdc, 0xb0, };
    581         UChar expectedUnicodeText[]= { 0x5165, 0x5165, 0x516b, 0x516b, 0x9ef9, 0x9ef9};
    582         int32_t fromIBM950inputOffs []  =   {  0, 2, 4, 6, 8, 10};
    583         /* for testing reverse fallback behavior */
    584         UChar expectedFallbackFalse[]= { 0x5165, 0x5165, 0x516b, 0x516b, 0x9ef9, 0x9ef9};
    585 
    586         if(!testConvertToUnicode(IBM950input, sizeof(IBM950input),
    587                 expectedUnicodeText, sizeof(expectedUnicodeText)/sizeof(expectedUnicodeText[0]),"ibm-950", TRUE, fromIBM950inputOffs ))
    588             log_err("ibm-950->u(MBCS) with Fallback did not match.\n");
    589         if(!testConvertToUnicode(IBM950input, sizeof(IBM950input),
    590                 expectedFallbackFalse, sizeof(expectedFallbackFalse)/sizeof(expectedFallbackFalse[0]),"ibm-950", FALSE, fromIBM950inputOffs ))
    591             log_err("ibm-950->u(MBCS) with Fallback  did not match.\n");
    592 
    593     }
    594     log_verbose("toUnicode fallback with fallback data for euc-tw\n");
    595     {
    596         const uint8_t euc_tw_input[] =   {
    597             0xA7, 0xCC, 0x8E, 0xA2, 0xA1, 0xAB,
    598             0xA8, 0xC7, 0xC8, 0xDE,
    599             0xA8, 0xCD, 0x8E, 0xA2, 0xA2, 0xEA,};
    600         UChar expectedUnicodeText[]= { 0x5C6E, 0x5C6E, 0x81FC, 0x81FC, 0x8278, 0x8278};
    601         int32_t from_euc_tw_offs []  =   {  0, 2, 6, 8, 10, 12};
    602         /* for testing reverse fallback behavior */
    603         UChar expectedFallbackFalse[]= { 0x5C6E, 0x5C6E, 0x81FC, 0x81FC, 0x8278, 0x8278};
    604 
    605         if(!testConvertToUnicode(euc_tw_input, sizeof(euc_tw_input),
    606                 expectedUnicodeText, sizeof(expectedUnicodeText)/sizeof(expectedUnicodeText[0]),"euc-tw", TRUE, from_euc_tw_offs ))
    607             log_err("from euc-tw->u with Fallback did not match.\n");
    608 
    609         if(!testConvertToUnicode(euc_tw_input, sizeof(euc_tw_input),
    610                 expectedFallbackFalse, sizeof(expectedFallbackFalse)/sizeof(expectedFallbackFalse[0]),"euc-tw", FALSE, from_euc_tw_offs ))
    611             log_err("from euc-tw->u with Fallback false did not match.\n");
    612 
    613 
    614     }
    615     log_verbose("fromUnicode to euc-tw with fallback data euc-tw\n");
    616     {
    617         UChar inputText[]= { 0x0001, 0x008e, 0x203e, 0x2223, 0xff5c, 0x5296,
    618                              0x5C6E, 0x5C6E, 0x81FC, 0x81FC, 0x8278, 0x8278, 0xEDEC};
    619         const uint8_t expected_euc_tw[] =   {
    620             0x01, 0x1a, 0xa2, 0xa3,
    621             0xa2, 0xde, 0xa2, 0xde,
    622             0x8e, 0xa2, 0xe5, 0xb9,
    623             0x8e, 0xa2, 0xa1, 0xab, 0x8e, 0xa2, 0xa1, 0xab,
    624             0xc8, 0xde, 0xc8, 0xde,
    625             0x8e, 0xa2, 0xa2, 0xea, 0x8e, 0xa2, 0xa2, 0xea,
    626             0x8e, 0xac, 0xc6, 0xf7};
    627         int32_t to_euc_tw_offs []  =   {  0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6,
    628             6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12};
    629 
    630         if(!testConvertFromUnicode(inputText, sizeof(inputText)/sizeof(inputText[0]),
    631                 expected_euc_tw, sizeof(expected_euc_tw), "euc-tw", TRUE, to_euc_tw_offs ))
    632             log_err("u-> euc-tw with FallBack did not match.\n");
    633 
    634     }
    635 
    636     /*MBCS 1363*/
    637     if(!testConvertFromUnicode(MBCSText1363, sizeof(MBCSText1363)/sizeof(MBCSText1363[0]),
    638         expectedIBM1363, sizeof(expectedIBM1363), "ibm-1363", TRUE, toIBM1363Offs ))
    639        log_err("u-> ibm-1363(MBCS) with FallBack did not match.\n");
    640 
    641     if(!testConvertToUnicode(expectedIBM1363, sizeof(expectedIBM1363),
    642         retrievedMBCSText1363, sizeof(retrievedMBCSText1363)/sizeof(retrievedMBCSText1363[0]),"ibm-1363", TRUE, fromIBM1363offs ))
    643         log_err("ibm-1363->u(MBCS) with Fallback did not match.\n");
    644 
    645 
    646       /*some more test to increase the code coverage in MBCS.  Create an test converter from test1.ucm
    647       which is test file for MBCS conversion with single-byte codepage data.*/
    648     {
    649 
    650         /* MBCS with single byte codepage data test1.ucm*/
    651         const UChar unicodeInput[]    = { 0x20ac, 0x0005, 0x0006, 0xdbc4, 0xde34, 0xdbba, 0xdfcd, 0x0003};
    652         const uint8_t expectedtest1[] = { 0x00, 0x05, 0xff, 0x07, 0x08, 0xff,};
    653         int32_t  totest1Offs[]        = { 0, 1, 2, 3, 5, 7};
    654 
    655         const uint8_t test1input[]    = { 0x00, 0x05, 0x06, 0x07, 0x08, 0x09};
    656         const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0xdbc4, 0xde34, 0xfffd, 0xfffd, 0xfffe};
    657         int32_t fromtest1Offs[]       = { 0, 1, 2, 3, 3, 4,5};
    658 
    659         /*from Unicode*/
    660         if(!testConvertFromUnicode(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
    661                 expectedtest1, sizeof(expectedtest1), "@test1", TRUE, totest1Offs ))
    662             log_err("u-> test1(MBCS conversion with single-byte) did not match.\n");
    663 
    664         /*to Unicode*/
    665         if(!testConvertToUnicode(test1input, sizeof(test1input),
    666                expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test1", TRUE, fromtest1Offs ))
    667             log_err("test1(MBCS conversion with single-byte) -> u  did not match.\n");
    668 
    669     }
    670 
    671     /*some more test to increase the code coverage in MBCS.  Create an test converter from test3.ucm
    672       which is test file for MBCS conversion with three-byte codepage data.*/
    673     {
    674 
    675         /* MBCS with three byte codepage data test3.ucm*/
    676         const UChar unicodeInput[]    = { 0x20ac, 0x0005, 0x0006, 0xdbc4, 0xde34, 0xdbba, 0xdfcd, 0x000b, 0xd84d, 0xdc56, 0x000e, 0x0003, };
    677         const uint8_t expectedtest3[] = { 0x00, 0x05, 0xff, 0x07, 0xff, 0x01, 0x02, 0x0b,  0x01, 0x02, 0x0a,  0xff, 0xff,};
    678         int32_t  totest3Offs[]        = { 0, 1, 2, 3, 5, 7, 7, 7, 8, 8, 8, 10,  11};
    679 
    680         const uint8_t test3input[]    = { 0x00, 0x05, 0x06, 0x01, 0x02, 0x0b,  0x07,  0x01, 0x02, 0x0a,
    681                           0x01, 0x02, 0x0e, 0x01, 0x02, 0x0d, 0x03, 0x01, 0x02, 0x0f,};
    682         const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56,
    683                           0x000e, 0xd891, 0xdd67, 0xfffd, 0xfffd };
    684         int32_t fromtest3Offs[]       = { 0, 1, 2, 3, 6, 6, 7, 7, 10, 13, 13, 16, 17};
    685 
    686         /*from Unicode*/
    687         if(!testConvertFromUnicode(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
    688                 expectedtest3, sizeof(expectedtest3), "@test3", TRUE, totest3Offs ))
    689             log_err("u-> test3(MBCS conversion with three-byte) did not match.\n");
    690 
    691         /*to Unicode*/
    692         if(!testConvertToUnicode(test3input, sizeof(test3input),
    693                expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test3", TRUE, fromtest3Offs ))
    694             log_err("test3(MBCS conversion with three-byte) -> u  did not match.\n");
    695 
    696     }
    697 
    698     /*some more test to increase the code coverage in MBCS.  Create an test converter from test4.ucm
    699       which is test file for MBCS conversion with four-byte codepage data.*/
    700     {
    701 
    702         /* MBCS with three byte codepage data test4.ucm*/
    703         const UChar unicodeInput[]    =
    704                 { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xdbba, 0xdfcd,
    705                   0xd84d, 0xdc56, 0x000e, 0xd891, 0xdd67, 0x000f};
    706         const uint8_t expectedtest4[] =
    707                 { 0x00, 0x05, 0xff, 0x01, 0x02, 0x03, 0x0b,  0x07, 0xff,
    708                   0x01, 0x02, 0x03, 0x0a,  0xff, 0xff, 0xff};
    709         int32_t  totest4Offs[]        =
    710                 { 0, 1, 2, 3, 3, 3, 3, 4, 6, 8, 8, 8, 8, 10, 11, 13};
    711 
    712         const uint8_t test4input[]    =
    713                 { 0x00, 0x05, 0x06, 0x01, 0x02, 0x03, 0x0b,  0x07,  0x08,
    714                 0x01, 0x02, 0x03, 0x0a, 0x01, 0x02, 0x03, 0x0e, 0x01, 0x02, 0x03, 0x0d, 0x03, 0x01, 0x02, 0x03, 0x0c,};
    715         const UChar expectedUnicode[] =
    716                 { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xdbba, 0xdfcd,
    717                   0xd84d, 0xdc56, 0x000e, 0xd891, 0xdd67, 0x1a, 0xfffd};
    718         int32_t fromtest4Offs[]       =
    719                 { 0, 1, 2, 3, 7, 7, 8, 8, 9, 9, 13, 17, 17, 21, 22,};
    720 
    721         /*from Unicode*/
    722         if(!testConvertFromUnicode(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
    723                 expectedtest4, sizeof(expectedtest4), "@test4", TRUE, totest4Offs ))
    724             log_err("u-> test4(MBCS conversion with four-byte) did not match.\n");
    725 
    726         /*to Unicode*/
    727         if(!testConvertToUnicode(test4input, sizeof(test4input),
    728                expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test4", TRUE, fromtest4Offs ))
    729             log_err("test4(MBCS conversion with four-byte) -> u  did not match.\n");
    730 
    731     }
    732     /* Test for jitterbug 509 EBCDIC_STATEFUL Converters*/
    733     {
    734         const UChar unicodeInput[]    = {0x00AF,         0x2013,     0x2223,    0x004C,    0x5F5D,         0xFF5E };
    735         const uint8_t expectedtest1[] = {0x0E,0x42,0xA1, 0x44,0x4A,  0x42,0x4F, 0x0F,0xD3, 0x0E,0x65,0x60, 0x43,0xA1,0x0f };
    736         int32_t  totest1Offs[]        = {0,   0,   0,    1,   1,     2,   2,    3,   3,    4,   4,   4,    5,   5,   5 };
    737         const uint8_t test1input[]    = {0x0E,0x42,0xA1, 0x44,0x4A,  0x42,0x4F, 0x0F,0xD3, 0x0E,0x65,0x60, 0x43,0xA1 };
    738         const UChar expectedUnicode[] = {0x203e,         0x2014,     0xff5c,    0x004c,    0x5f5e,         0x223c };
    739         int32_t fromtest1Offs[]       = {1,              3,          5,         8,         10,             12 };
    740         /*from Unicode*/
    741         if(!testConvertFromUnicode(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
    742                 expectedtest1, sizeof(expectedtest1), "ibm-1371", TRUE, totest1Offs ))
    743             log_err("u-> ibm-1371(MBCS conversion with single-byte) did not match.,\n");
    744         /*to Unicode*/
    745         if(!testConvertToUnicode(test1input, sizeof(test1input),
    746                expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "ibm-1371", TRUE, fromtest1Offs ))
    747             log_err("ibm-1371(MBCS conversion with single-byte) -> u  did not match.,\n");
    748     }
    749 
    750 }
    751 #else
    752 void addTestConverterFallBack(TestNode** root)
    753 {
    754   /* test nothing... */
    755 
    756 }
    757 #endif
    758