Home | History | Annotate | Download | only in cintltst
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1998-2012, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 /*
      7 * File putiltst.c (Tests the API in putil)
      8 *
      9 * Modification History:
     10 *
     11 *   Date          Name        Description
     12 *   07/12/2000    Madhu       Creation
     13 *******************************************************************************
     14 */
     15 
     16 #include "unicode/utypes.h"
     17 #include "cintltst.h"
     18 #include "cmemory.h"
     19 #include "unicode/putil.h"
     20 #include "unicode/ustring.h"
     21 #include "unicode/icudataver.h"
     22 #include "cstring.h"
     23 #include "putilimp.h"
     24 #include "toolutil.h"
     25 #include "uinvchar.h"
     26 #include <stdio.h>
     27 
     28 /* See the comments on U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC. */
     29 static void TestSignedRightShiftIsArithmetic(void) {
     30     int32_t x=0xfff5fff3;
     31     int32_t m=-1;
     32     int32_t x4=x>>4;
     33     int32_t m1=m>>1;
     34     UBool signedRightShiftIsArithmetic= x4==0xffff5fff && m1==-1;
     35     if(signedRightShiftIsArithmetic==U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC) {
     36         log_info("signed right shift is Arithmetic Shift Right: %d\n",
     37                  signedRightShiftIsArithmetic);
     38     } else {
     39         log_err("error: unexpected signed right shift is Arithmetic Shift Right: %d\n"
     40                 "       You need to change the value of U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC "
     41                 "for your platform.\n",
     42                 signedRightShiftIsArithmetic);
     43     }
     44 }
     45 
     46 static UBool compareWithNAN(double x, double y);
     47 static void doAssert(double expect, double got, const char *message);
     48 
     49 static void TestPUtilAPI(void){
     50 
     51     double  n1=0.0, y1=0.0, expn1, expy1;
     52     double  value1 = 0.021;
     53     char *str=0;
     54     UBool isTrue=FALSE;
     55 
     56     log_verbose("Testing the API uprv_modf()\n");
     57     y1 = uprv_modf(value1, &n1);
     58     expn1=0;
     59     expy1=0.021;
     60     if(y1 != expy1   || n1 != expn1){
     61         log_err("Error in uprv_modf.  Expected IntegralValue=%f, Got=%f, \n Expected FractionalValue=%f, Got=%f\n",
     62              expn1, n1, expy1, y1);
     63     }
     64     if(getTestOption(VERBOSITY_OPTION)){
     65         log_verbose("[float]  x = %f  n = %f y = %f\n", value1, n1, y1);
     66     }
     67     log_verbose("Testing the API uprv_fmod()\n");
     68     expn1=uprv_fmod(30.50, 15.00);
     69     doAssert(expn1, 0.5, "uprv_fmod(30.50, 15.00) failed.");
     70 
     71     log_verbose("Testing the API uprv_ceil()\n");
     72     expn1=uprv_ceil(value1);
     73     doAssert(expn1, 1, "uprv_ceil(0.021) failed.");
     74 
     75     log_verbose("Testing the API uprv_floor()\n");
     76     expn1=uprv_floor(value1);
     77     doAssert(expn1, 0, "uprv_floor(0.021) failed.");
     78 
     79     log_verbose("Testing the API uprv_fabs()\n");
     80     expn1=uprv_fabs((2.02-1.345));
     81     doAssert(expn1, 0.675, "uprv_fabs(2.02-1.345) failed.");
     82 
     83     log_verbose("Testing the API uprv_fmax()\n");
     84     doAssert(uprv_fmax(2.4, 1.2), 2.4, "uprv_fmax(2.4, 1.2) failed.");
     85 
     86     log_verbose("Testing the API uprv_fmax() with x value= NaN\n");
     87     expn1=uprv_fmax(uprv_getNaN(), 1.2);
     88     doAssert(expn1, uprv_getNaN(), "uprv_fmax(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
     89 
     90     log_verbose("Testing the API uprv_fmin()\n");
     91     doAssert(uprv_fmin(2.4, 1.2), 1.2, "uprv_fmin(2.4, 1.2) failed.");
     92 
     93     log_verbose("Testing the API uprv_fmin() with x value= NaN\n");
     94     expn1=uprv_fmin(uprv_getNaN(), 1.2);
     95     doAssert(expn1, uprv_getNaN(), "uprv_fmin(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
     96 
     97     log_verbose("Testing the API uprv_max()\n");
     98     doAssert(uprv_max(4, 2), 4, "uprv_max(4, 2) failed.");
     99 
    100     log_verbose("Testing the API uprv_min()\n");
    101     doAssert(uprv_min(-4, 2), -4, "uprv_min(-4, 2) failed.");
    102 
    103     log_verbose("Testing the API uprv_trunc()\n");
    104     doAssert(uprv_trunc(12.3456), 12, "uprv_trunc(12.3456) failed.");
    105     doAssert(uprv_trunc(12.234E2), 1223, "uprv_trunc(12.234E2) failed.");
    106     doAssert(uprv_trunc(uprv_getNaN()), uprv_getNaN(), "uprv_trunc(uprv_getNaN()) failed. with parameter=NaN");
    107     doAssert(uprv_trunc(uprv_getInfinity()), uprv_getInfinity(), "uprv_trunc(uprv_getInfinity()) failed. with parameter=Infinity");
    108 
    109 
    110     log_verbose("Testing the API uprv_pow10()\n");
    111     doAssert(uprv_pow10(4), 10000, "uprv_pow10(4) failed.");
    112 
    113     log_verbose("Testing the API uprv_isNegativeInfinity()\n");
    114     isTrue=uprv_isNegativeInfinity(uprv_getInfinity() * -1);
    115     if(isTrue != TRUE){
    116         log_err("ERROR: uprv_isNegativeInfinity failed.\n");
    117     }
    118     log_verbose("Testing the API uprv_isPositiveInfinity()\n");
    119     isTrue=uprv_isPositiveInfinity(uprv_getInfinity());
    120     if(isTrue != TRUE){
    121         log_err("ERROR: uprv_isPositiveInfinity failed.\n");
    122     }
    123     log_verbose("Testing the API uprv_isInfinite()\n");
    124     isTrue=uprv_isInfinite(uprv_getInfinity());
    125     if(isTrue != TRUE){
    126         log_err("ERROR: uprv_isInfinite failed.\n");
    127     }
    128 
    129 #if 0
    130     log_verbose("Testing the API uprv_digitsAfterDecimal()....\n");
    131     doAssert(uprv_digitsAfterDecimal(value1), 3, "uprv_digitsAfterDecimal() failed.");
    132     doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
    133     doAssert(uprv_digitsAfterDecimal(1.2345E-2), 6, "uprv_digitsAfterDecimal(1.2345E-2) failed.");
    134     doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
    135     doAssert(uprv_digitsAfterDecimal(-1.2345E-20), 24, "uprv_digitsAfterDecimal(1.2345E-20) failed.");
    136     doAssert(uprv_digitsAfterDecimal(1.2345E20), 0, "uprv_digitsAfterDecimal(1.2345E20) failed.");
    137     doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021) failed.");
    138     doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) failed.");
    139     doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecimal(0.022223333321) failed.");
    140 #endif
    141 
    142     log_verbose("Testing the API u_errorName()...\n");
    143     str=(char*)u_errorName((UErrorCode)0);
    144     if(strcmp(str, "U_ZERO_ERROR") != 0){
    145         log_err("ERROR: u_getVersion() failed. Expected: U_ZERO_ERROR Got=%s\n",  str);
    146     }
    147     log_verbose("Testing the API u_errorName()...\n");
    148     str=(char*)u_errorName((UErrorCode)-127);
    149     if(strcmp(str, "U_USING_DEFAULT_WARNING") != 0){
    150         log_err("ERROR: u_getVersion() failed. Expected: U_USING_DEFAULT_WARNING Got=%s\n",  str);
    151     }
    152     log_verbose("Testing the API u_errorName().. with BOGUS ERRORCODE...\n");
    153     str=(char*)u_errorName((UErrorCode)200);
    154     if(strcmp(str, "[BOGUS UErrorCode]") != 0){
    155         log_err("ERROR: u_getVersion() failed. Expected: [BOGUS UErrorCode] Got=%s\n",  str);
    156     }
    157 
    158     {
    159         const char* dataDirectory;
    160         int32_t dataDirectoryLen;
    161         UChar *udataDir=0;
    162         UChar temp[100];
    163         char *charvalue=0;
    164         log_verbose("Testing chars to UChars\n");
    165 
    166          /* This cannot really work on a japanese system. u_uastrcpy will have different results than */
    167         /* u_charsToUChars when there is a backslash in the string! */
    168         /*dataDirectory=u_getDataDirectory();*/
    169 
    170         dataDirectory="directory1";  /*no backslashes*/
    171         dataDirectoryLen=(int32_t)strlen(dataDirectory);
    172         udataDir=(UChar*)malloc(sizeof(UChar) * (dataDirectoryLen + 1));
    173         u_charsToUChars(dataDirectory, udataDir, (dataDirectoryLen + 1));
    174         u_uastrcpy(temp, dataDirectory);
    175 
    176         if(u_strcmp(temp, udataDir) != 0){
    177             log_err("ERROR: u_charsToUChars failed. Expected %s, Got %s\n", austrdup(temp), austrdup(udataDir));
    178         }
    179         log_verbose("Testing UChars to chars\n");
    180         charvalue=(char*)malloc(sizeof(char) * (u_strlen(udataDir) + 1));
    181 
    182         u_UCharsToChars(udataDir, charvalue, (u_strlen(udataDir)+1));
    183         if(strcmp(charvalue, dataDirectory) != 0){
    184             log_err("ERROR: u_UCharsToChars failed. Expected %s, Got %s\n", charvalue, dataDirectory);
    185         }
    186         free(charvalue);
    187         free(udataDir);
    188     }
    189 
    190     log_verbose("Testing uprv_timezone()....\n");
    191     {
    192         int32_t tzoffset = uprv_timezone();
    193         log_verbose("Value returned from uprv_timezone = %d\n",  tzoffset);
    194         if (tzoffset != 28800) {
    195             log_verbose("***** WARNING: If testing in the PST timezone, t_timezone should return 28800! *****");
    196         }
    197         if ((tzoffset % 1800 != 0)) {
    198             log_info("Note: t_timezone offset of %ld (for %s : %s) is not a multiple of 30min.", tzoffset, uprv_tzname(0), uprv_tzname(1));
    199         }
    200         /*tzoffset=uprv_getUTCtime();*/
    201 
    202     }
    203 }
    204 
    205 static void TestVersion(void)
    206 {
    207     UVersionInfo versionArray = {0x01, 0x00, 0x02, 0x02};
    208     UVersionInfo versionArray2 = {0x01, 0x00, 0x02, 0x02};
    209     char versionString[17]; /* xxx.xxx.xxx.xxx\0 */
    210     UChar versionUString[] = { 0x0031, 0x002E, 0x0030, 0x002E,
    211                                0x0032, 0x002E, 0x0038, 0x0000 }; /* 1.0.2.8 */
    212     UVersionInfo version;
    213     UErrorCode status = U_ZERO_ERROR;
    214 
    215     log_verbose("Testing the API u_versionToString().....\n");
    216     u_versionToString(versionArray, versionString);
    217     if(strcmp(versionString, "1.0.2.2") != 0){
    218         log_err("ERROR: u_versionToString() failed. Expected: 1.0.2.2, Got=%s\n", versionString);
    219     }
    220     log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
    221     u_versionToString(NULL, versionString);
    222     if(strcmp(versionString, "") != 0){
    223         log_err("ERROR: u_versionToString() failed. with versionArray=NULL. It should just return\n");
    224     }
    225     log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
    226     u_versionToString(NULL, versionString);
    227     if(strcmp(versionString, "") != 0){
    228         log_err("ERROR: u_versionToString() failed . It should just return\n");
    229     }
    230     log_verbose("Testing the API u_versionToString().....with versionString=NULL\n");
    231     u_versionToString(versionArray, NULL);
    232     if(strcmp(versionString, "") != 0){
    233         log_err("ERROR: u_versionToString() failed. with versionArray=NULL  It should just return\n");
    234     }
    235     versionArray[0] = 0x0a;
    236     log_verbose("Testing the API u_versionToString().....\n");
    237     u_versionToString(versionArray, versionString);
    238     if(strcmp(versionString, "10.0.2.2") != 0){
    239         log_err("ERROR: u_versionToString() failed. Expected: 10.0.2.2, Got=%s\n", versionString);
    240     }
    241     versionArray[0] = 0xa0;
    242     u_versionToString(versionArray, versionString);
    243     if(strcmp(versionString, "160.0.2.2") != 0){
    244         log_err("ERROR: u_versionToString() failed. Expected: 160.0.2.2, Got=%s\n", versionString);
    245     }
    246     versionArray[0] = 0xa0;
    247     versionArray[1] = 0xa0;
    248     u_versionToString(versionArray, versionString);
    249     if(strcmp(versionString, "160.160.2.2") != 0){
    250         log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
    251     }
    252     versionArray[0] = 0x01;
    253     versionArray[1] = 0x0a;
    254     u_versionToString(versionArray, versionString);
    255     if(strcmp(versionString, "1.10.2.2") != 0){
    256         log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
    257     }
    258 
    259     log_verbose("Testing the API u_versionFromString() ....\n");
    260     u_versionFromString(versionArray, "1.3.5.6");
    261     u_versionToString(versionArray, versionString);
    262     if(strcmp(versionString, "1.3.5.6") != 0){
    263         log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
    264     }
    265     log_verbose("Testing the API u_versionFromString() where versionArray=NULL....\n");
    266     u_versionFromString(NULL, "1.3.5.6");
    267     u_versionToString(versionArray, versionString);
    268     if(strcmp(versionString, "1.3.5.6") != 0){
    269         log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
    270     }
    271 
    272     log_verbose("Testing the API u_getVersion().....\n");
    273     u_getVersion(versionArray);
    274     u_versionToString(versionArray, versionString);
    275     if(strcmp(versionString, U_ICU_VERSION) != 0){
    276         log_err("ERROR: u_getVersion() failed. Got=%s, expected %s\n",  versionString, U_ICU_VERSION);
    277     }
    278     /* test unicode */
    279     log_verbose("Testing u_versionFromUString...\n");
    280     u_versionFromString(versionArray,"1.0.2.8");
    281     u_versionFromUString(versionArray2, versionUString);
    282     u_versionToString(versionArray2, versionString);
    283     if(memcmp(versionArray, versionArray2, sizeof(UVersionInfo))) {
    284        log_err("FAIL: u_versionFromUString produced a different result - not 1.0.2.8 but %s [%x.%x.%x.%x]\n",
    285           versionString,
    286         (int)versionArray2[0],
    287         (int)versionArray2[1],
    288         (int)versionArray2[2],
    289         (int)versionArray2[3]);
    290     }
    291     else {
    292        log_verbose(" from UString: %s\n", versionString);
    293     }
    294 
    295     /* Test the data version API for better code coverage */
    296     u_getDataVersion(version, &status);
    297     if (U_FAILURE(status)) {
    298         log_data_err("ERROR: Unable to get data version. %s\n", u_errorName(status));
    299     }
    300 }
    301 
    302 static void TestCompareVersions(void)
    303 {
    304    /* use a 1d array to be palatable to java */
    305    const char *testCases[] = {
    306       /*  v1          <|=|>       v2  */
    307     "0.0.0.0",    "=",        "0.0.0.0",
    308     "3.1.2.0",    ">",        "3.0.9.0",
    309     "3.2.8.6",    "<",        "3.4",
    310     "4.0",        ">",        "3.2",
    311     NULL,        NULL,        NULL
    312    };
    313    const char *v1str;
    314    const char *opstr;
    315    const char *v2str;
    316    int32_t op, invop, got, invgot;
    317    UVersionInfo v1, v2;
    318    int32_t j;
    319    log_verbose("Testing memcmp()\n");
    320    for(j=0;testCases[j]!=NULL;j+=3) {
    321     v1str = testCases[j+0];
    322     opstr = testCases[j+1];
    323     v2str = testCases[j+2];
    324     switch(opstr[0]) {
    325         case '-':
    326         case '<': op = -1; break;
    327         case '0':
    328         case '=': op = 0; break;
    329         case '+':
    330         case '>': op = 1; break;
    331         default:  log_err("Bad operator at j/3=%d\n", (j/3)); return;
    332     }
    333     invop = 0-op; /* inverse operation: with v1 and v2 switched */
    334     u_versionFromString(v1, v1str);
    335     u_versionFromString(v2, v2str);
    336     got = memcmp(v1, v2, sizeof(UVersionInfo));
    337     invgot = memcmp(v2, v1, sizeof(UVersionInfo)); /* Opposite */
    338     if((got <= 0 && op <= 0) || (got >= 0 && op >= 0)) {
    339         log_verbose("%d: %s %s %s, OK\n", (j/3), v1str, opstr, v2str);
    340     } else {
    341         log_err("%d: %s %s %s: wanted values of the same sign, %d got %d\n", (j/3), v1str, opstr, v2str, op, got);
    342     }
    343     if((invgot >= 0 && invop >= 0) || (invgot <= 0 && invop <= 0)) {
    344         log_verbose("%d: %s (%d) %s, OK (inverse)\n", (j/3), v2str, invop, v1str);
    345     } else {
    346         log_err("%d: %s (%d) %s: wanted values of the same sign, %d got %d\n", (j/3), v2str, invop, v1str, invop, invgot);
    347     }
    348    }
    349 }
    350 
    351 
    352 
    353 #if 0
    354 static void testIEEEremainder()
    355 {
    356     double    pinf        = uprv_getInfinity();
    357     double    ninf        = -uprv_getInfinity();
    358     double    nan         = uprv_getNaN();
    359 /*    double    pzero       = 0.0;*/
    360 /*    double    nzero       = 0.0;
    361     nzero *= -1;*/
    362 
    363      /* simple remainder checks*/
    364     remainderTest(7.0, 2.5, -0.5);
    365     remainderTest(7.0, -2.5, -0.5);
    366      /* this should work
    367      remainderTest(43.7, 2.5, 1.2);
    368      */
    369 
    370     /* infinity and real*/
    371     remainderTest(1.0, pinf, 1.0);
    372     remainderTest(1.0, ninf, 1.0);
    373 
    374     /*test infinity and real*/
    375     remainderTest(nan, 1.0, nan);
    376     remainderTest(1.0, nan, nan);
    377     /*test infinity and nan*/
    378     remainderTest(ninf, nan, nan);
    379     remainderTest(pinf, nan, nan);
    380 
    381     /* test infinity and zero */
    382 /*    remainderTest(pinf, pzero, 1.25);
    383     remainderTest(pinf, nzero, 1.25);
    384     remainderTest(ninf, pzero, 1.25);
    385     remainderTest(ninf, nzero, 1.25); */
    386 }
    387 
    388 static void remainderTest(double x, double y, double exp)
    389 {
    390     double result = uprv_IEEEremainder(x,y);
    391 
    392     if(        uprv_isNaN(result) &&
    393         ! ( uprv_isNaN(x) || uprv_isNaN(y))) {
    394         log_err("FAIL: got NaN as result without NaN as argument");
    395         log_err("      IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
    396     }
    397     else if(!compareWithNAN(result, exp)) {
    398         log_err("FAIL:  IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
    399     } else{
    400         log_verbose("OK: IEEEremainder(%f, %f) is %f\n", x, y, result);
    401     }
    402 
    403 }
    404 #endif
    405 
    406 static UBool compareWithNAN(double x, double y)
    407 {
    408   if( uprv_isNaN(x) || uprv_isNaN(y) ) {
    409     if(!uprv_isNaN(x) || !uprv_isNaN(y) ) {
    410       return FALSE;
    411     }
    412   }
    413   else if (y != x) { /* no NaN's involved */
    414     return FALSE;
    415   }
    416 
    417   return TRUE;
    418 }
    419 
    420 static void doAssert(double got, double expect, const char *message)
    421 {
    422   if(! compareWithNAN(expect, got) ) {
    423     log_err("ERROR :  %s. Expected : %lf, Got: %lf\n", message, expect, got);
    424   }
    425 }
    426 
    427 
    428 #define _CODE_ARR_LEN 8
    429 static const UErrorCode errorCode[_CODE_ARR_LEN] = {
    430     U_USING_FALLBACK_WARNING,
    431     U_STRING_NOT_TERMINATED_WARNING,
    432     U_ILLEGAL_ARGUMENT_ERROR,
    433     U_STATE_TOO_OLD_ERROR,
    434     U_BAD_VARIABLE_DEFINITION,
    435     U_RULE_MASK_ERROR,
    436     U_UNEXPECTED_TOKEN,
    437     U_UNSUPPORTED_ATTRIBUTE
    438 };
    439 
    440 static const char* str[] = {
    441     "U_USING_FALLBACK_WARNING",
    442     "U_STRING_NOT_TERMINATED_WARNING",
    443     "U_ILLEGAL_ARGUMENT_ERROR",
    444     "U_STATE_TOO_OLD_ERROR",
    445     "U_BAD_VARIABLE_DEFINITION",
    446     "U_RULE_MASK_ERROR",
    447     "U_UNEXPECTED_TOKEN",
    448     "U_UNSUPPORTED_ATTRIBUTE"
    449 };
    450 
    451 static void TestErrorName(void){
    452     int32_t code=0;
    453     const char* errorName ;
    454     for(;code<U_ERROR_LIMIT;code++){
    455         errorName = u_errorName((UErrorCode)code);
    456         if(!errorName || errorName[0] == 0) {
    457           log_err("Error:  u_errorName(0x%X) failed.\n",code);
    458         }
    459     }
    460 
    461     for(code=0;code<_CODE_ARR_LEN; code++){
    462         errorName = u_errorName(errorCode[code]);
    463         if(uprv_strcmp(str[code],errorName )!=0){
    464             log_err("Error : u_errorName failed. Expected: %s Got: %s \n",str[code],errorName);
    465         }
    466     }
    467 }
    468 
    469 #define AESTRNCPY_SIZE 13
    470 
    471 static const char * dump_binline(uint8_t *bytes) {
    472   static char buf[512];
    473   int32_t i;
    474   for(i=0;i<13;i++) {
    475     sprintf(buf+(i*3), "%02x ", bytes[i]);
    476   }
    477   return buf;
    478 }
    479 
    480 static void Test_aestrncpy(int32_t line, const uint8_t *expect, const uint8_t *src, int32_t len)
    481 {
    482   uint8_t str_buf[AESTRNCPY_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
    483   uint8_t *ret;
    484 
    485   log_verbose("\n%s:%d: Beginning test of uprv_aestrncpy(dst, src, %d)\n", __FILE__, line, len);
    486   ret = uprv_aestrncpy(str_buf, src, len);
    487   if(ret != str_buf) {
    488     log_err("\n%s:%d: FAIL: uprv_aestrncpy returned %p expected %p\n", __FILE__, line, (void*)ret, (void*)str_buf);
    489   }
    490   if(!uprv_memcmp(str_buf, expect, AESTRNCPY_SIZE)) {
    491     log_verbose("\n%s:%d: OK - compared OK.", __FILE__, line);
    492     log_verbose("\n%s:%d:         expected: %s", __FILE__, line, dump_binline((uint8_t *)expect));
    493     log_verbose("\n%s:%d:         got     : %s\n", __FILE__, line, dump_binline(str_buf));
    494   } else {
    495     log_err    ("\n%s:%d: FAIL: uprv_aestrncpy output differs", __FILE__, line);
    496     log_err    ("\n%s:%d:         expected: %s", __FILE__, line, dump_binline((uint8_t *)expect));
    497     log_err    ("\n%s:%d:         got     : %s\n", __FILE__, line, dump_binline(str_buf));
    498   }
    499 }
    500 
    501 static void TestString(void)
    502 {
    503 
    504   uint8_t str_tst[AESTRNCPY_SIZE] = { 0x81, 0x4b, 0x5c, 0x82, 0x25, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f };
    505 
    506   uint8_t str_exp1[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
    507   uint8_t str_exp2[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
    508   uint8_t str_exp3[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff };
    509 
    510 
    511 
    512   /* test #1- copy with -1 length */
    513   Test_aestrncpy(__LINE__, str_exp1, str_tst, -1);
    514   Test_aestrncpy(__LINE__, str_exp1, str_tst, 6);
    515   Test_aestrncpy(__LINE__, str_exp2, str_tst, 5);
    516   Test_aestrncpy(__LINE__, str_exp3, str_tst, 8);
    517 }
    518 
    519 void addPUtilTest(TestNode** root);
    520 
    521 static void addToolUtilTests(TestNode** root);
    522 
    523 void
    524 addPUtilTest(TestNode** root)
    525 {
    526     addTest(root, &TestVersion,       "putiltst/TestVersion");
    527     addTest(root, &TestCompareVersions,       "putiltst/TestCompareVersions");
    528 /*    addTest(root, &testIEEEremainder,  "putiltst/testIEEEremainder"); */
    529     addTest(root, &TestErrorName, "putiltst/TestErrorName");
    530     addTest(root, &TestPUtilAPI,       "putiltst/TestPUtilAPI");
    531     addTest(root, &TestString,    "putiltst/TestString");
    532     addToolUtilTests(root);
    533 }
    534 
    535 /* Tool Util Tests ================ */
    536 #define TOOLUTIL_TESTBUF_SIZE 2048
    537 static char toolutil_testBuf[TOOLUTIL_TESTBUF_SIZE];
    538 static const char *NULLSTR="NULL";
    539 
    540 /**
    541  * Normalize NULL to 'NULL'  for testing
    542  */
    543 #define STRNULL(x) ((x)?(x):NULLSTR)
    544 
    545 static void toolutil_findBasename(void)
    546 {
    547   struct {
    548     const char *inBuf;
    549     const char *expectResult;
    550   } testCases[] = {
    551     {
    552       U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
    553       "pkgdata"
    554     },
    555     {
    556       U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING,
    557       ""
    558     },
    559     {
    560       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
    561       "pkgdata"
    562     },
    563     {
    564       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING,
    565       ""
    566     },
    567   };
    568   int32_t count=(sizeof(testCases)/sizeof(testCases[0]));
    569   int32_t i;
    570 
    571 
    572   log_verbose("Testing findBaseName()\n");
    573   for(i=0;i<count;i++) {
    574     const char *result;
    575     const char *input = STRNULL(testCases[i].inBuf);
    576     const char *expect = STRNULL(testCases[i].expectResult);
    577     log_verbose("Test case [%d/%d]: %s\n", i, count-1, input);
    578     result = STRNULL(findBasename(testCases[i].inBuf));
    579     if(result==expect||!strcmp(result,expect)) {
    580       log_verbose(" -> %s PASS\n", result);
    581     } else {
    582       log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i, count-1, input, result, expect);
    583     }
    584   }
    585 }
    586 
    587 
    588 static void toolutil_findDirname(void)
    589 {
    590   int i;
    591   struct {
    592     const char *inBuf;
    593     int32_t outBufLen;
    594     UErrorCode expectStatus;
    595     const char *expectResult;
    596   } testCases[] = {
    597     {
    598       U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
    599       200,
    600       U_ZERO_ERROR,
    601       U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin",
    602     },
    603     {
    604       U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
    605       2,
    606       U_BUFFER_OVERFLOW_ERROR,
    607       NULL
    608     },
    609     {
    610       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
    611       200,
    612       U_ZERO_ERROR,
    613       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin"
    614     },
    615     {
    616       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
    617       2,
    618       U_BUFFER_OVERFLOW_ERROR,
    619       NULL
    620     },
    621     {
    622       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
    623       200,
    624       U_ZERO_ERROR,
    625       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin"
    626     },
    627     {
    628       U_FILE_ALT_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
    629       200,
    630       U_ZERO_ERROR,
    631       U_FILE_ALT_SEP_STRING "usr" U_FILE_SEP_STRING "bin"
    632     },
    633     {
    634       U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
    635       2,
    636       U_BUFFER_OVERFLOW_ERROR,
    637       NULL
    638     },
    639     {
    640       U_FILE_ALT_SEP_STRING "vmlinuz",
    641       200,
    642       U_ZERO_ERROR,
    643       U_FILE_ALT_SEP_STRING
    644     },
    645     {
    646       U_FILE_SEP_STRING "vmlinux",
    647       200,
    648       U_ZERO_ERROR,
    649       U_FILE_SEP_STRING
    650     },
    651     {
    652       "pkgdata",
    653       0,
    654       U_BUFFER_OVERFLOW_ERROR,
    655       NULL
    656     },
    657     {
    658       "pkgdata",
    659       2,
    660       U_ZERO_ERROR,
    661       ""
    662     }
    663   };
    664   int32_t count=(sizeof(testCases)/sizeof(testCases[0]));
    665 
    666   log_verbose("Testing findDirname()\n");
    667   for(i=0;i<count;i++) {
    668     const char *result;
    669     const char *input = STRNULL(testCases[i].inBuf);
    670     const char *expect = STRNULL(testCases[i].expectResult);
    671     UErrorCode status = U_ZERO_ERROR;
    672     uprv_memset(toolutil_testBuf, 0x55, TOOLUTIL_TESTBUF_SIZE);
    673 
    674     log_verbose("Test case [%d/%d]: %s\n", i, count-1, input);
    675     result = STRNULL(findDirname(testCases[i].inBuf, toolutil_testBuf, testCases[i].outBufLen, &status));
    676     log_verbose(" -> %s, \n", u_errorName(status));
    677     if(status != testCases[i].expectStatus) {
    678       log_verbose("FAIL: Test case [%d/%d]: %s got error code %s but expected %s\n", i, count-1, input, u_errorName(status), u_errorName(testCases[i].expectStatus));
    679     }
    680     if(result==expect||!strcmp(result,expect)) {
    681       log_verbose(" = -> %s \n", result);
    682     } else {
    683       log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i, count-1, input, result, expect);
    684     }
    685   }
    686 }
    687 
    688 
    689 
    690 static void addToolUtilTests(TestNode** root) {
    691     addTest(root, &toolutil_findBasename,       "putiltst/toolutil/findBasename");
    692     addTest(root, &toolutil_findDirname,       "putiltst/toolutil/findDirname");
    693     addTest(root, &TestSignedRightShiftIsArithmetic, "putiltst/toolutil/TestSignedRightShiftIsArithmetic");
    694   /*
    695     Not yet tested:
    696 
    697     addTest(root, &toolutil_getLongPathname,       "putiltst/toolutil/getLongPathname");
    698     addTest(root, &toolutil_getCurrentYear,       "putiltst/toolutil/getCurrentYear");
    699     addTest(root, &toolutil_UToolMemory,       "putiltst/toolutil/UToolMemory");
    700   */
    701 }
    702