Home | History | Annotate | Download | only in cintltst
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1998-2009, 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 "cstring.h"
     22 #include "putilimp.h"
     23 
     24 static UBool compareWithNAN(double x, double y);
     25 static void doAssert(double expect, double got, const char *message);
     26 
     27 static void TestPUtilAPI(void){
     28 
     29     double  n1=0.0, y1=0.0, expn1, expy1;
     30     double  value1 = 0.021;
     31     char *str=0;
     32     UBool isTrue=FALSE;
     33 
     34     log_verbose("Testing the API uprv_modf()\n");
     35     y1 = uprv_modf(value1, &n1);
     36     expn1=0;
     37     expy1=0.021;
     38     if(y1 != expy1   || n1 != expn1){
     39         log_err("Error in uprv_modf.  Expected IntegralValue=%f, Got=%f, \n Expected FractionalValue=%f, Got=%f\n",
     40              expn1, n1, expy1, y1);
     41     }
     42     if(VERBOSITY){
     43         log_verbose("[float]  x = %f  n = %f y = %f\n", value1, n1, y1);
     44     }
     45     log_verbose("Testing the API uprv_fmod()\n");
     46     expn1=uprv_fmod(30.50, 15.00);
     47     doAssert(expn1, 0.5, "uprv_fmod(30.50, 15.00) failed.");
     48 
     49     log_verbose("Testing the API uprv_ceil()\n");
     50     expn1=uprv_ceil(value1);
     51     doAssert(expn1, 1, "uprv_ceil(0.021) failed.");
     52 
     53     log_verbose("Testing the API uprv_floor()\n");
     54     expn1=uprv_floor(value1);
     55     doAssert(expn1, 0, "uprv_floor(0.021) failed.");
     56 
     57     log_verbose("Testing the API uprv_fabs()\n");
     58     expn1=uprv_fabs((2.02-1.345));
     59     doAssert(expn1, 0.675, "uprv_fabs(2.02-1.345) failed.");
     60 
     61     log_verbose("Testing the API uprv_fmax()\n");
     62     doAssert(uprv_fmax(2.4, 1.2), 2.4, "uprv_fmax(2.4, 1.2) failed.");
     63 
     64     log_verbose("Testing the API uprv_fmax() with x value= NaN\n");
     65     expn1=uprv_fmax(uprv_getNaN(), 1.2);
     66     doAssert(expn1, uprv_getNaN(), "uprv_fmax(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
     67 
     68     log_verbose("Testing the API uprv_fmin()\n");
     69     doAssert(uprv_fmin(2.4, 1.2), 1.2, "uprv_fmin(2.4, 1.2) failed.");
     70 
     71     log_verbose("Testing the API uprv_fmin() with x value= NaN\n");
     72     expn1=uprv_fmin(uprv_getNaN(), 1.2);
     73     doAssert(expn1, uprv_getNaN(), "uprv_fmin(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
     74 
     75     log_verbose("Testing the API uprv_max()\n");
     76     doAssert(uprv_max(4, 2), 4, "uprv_max(4, 2) failed.");
     77 
     78     log_verbose("Testing the API uprv_min()\n");
     79     doAssert(uprv_min(-4, 2), -4, "uprv_min(-4, 2) failed.");
     80 
     81     log_verbose("Testing the API uprv_trunc()\n");
     82     doAssert(uprv_trunc(12.3456), 12, "uprv_trunc(12.3456) failed.");
     83     doAssert(uprv_trunc(12.234E2), 1223, "uprv_trunc(12.234E2) failed.");
     84     doAssert(uprv_trunc(uprv_getNaN()), uprv_getNaN(), "uprv_trunc(uprv_getNaN()) failed. with parameter=NaN");
     85     doAssert(uprv_trunc(uprv_getInfinity()), uprv_getInfinity(), "uprv_trunc(uprv_getInfinity()) failed. with parameter=Infinity");
     86 
     87 
     88     log_verbose("Testing the API uprv_pow10()\n");
     89     doAssert(uprv_pow10(4), 10000, "uprv_pow10(4) failed.");
     90 
     91     log_verbose("Testing the API uprv_isNegativeInfinity()\n");
     92     isTrue=uprv_isNegativeInfinity(uprv_getInfinity() * -1);
     93     if(isTrue != TRUE){
     94         log_err("ERROR: uprv_isNegativeInfinity failed.\n");
     95     }
     96     log_verbose("Testing the API uprv_isPositiveInfinity()\n");
     97     isTrue=uprv_isPositiveInfinity(uprv_getInfinity());
     98     if(isTrue != TRUE){
     99         log_err("ERROR: uprv_isPositiveInfinity failed.\n");
    100     }
    101     log_verbose("Testing the API uprv_isInfinite()\n");
    102     isTrue=uprv_isInfinite(uprv_getInfinity());
    103     if(isTrue != TRUE){
    104         log_err("ERROR: uprv_isInfinite failed.\n");
    105     }
    106 
    107 #if 0
    108     log_verbose("Testing the API uprv_digitsAfterDecimal()....\n");
    109     doAssert(uprv_digitsAfterDecimal(value1), 3, "uprv_digitsAfterDecimal() failed.");
    110     doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
    111     doAssert(uprv_digitsAfterDecimal(1.2345E-2), 6, "uprv_digitsAfterDecimal(1.2345E-2) failed.");
    112     doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
    113     doAssert(uprv_digitsAfterDecimal(-1.2345E-20), 24, "uprv_digitsAfterDecimal(1.2345E-20) failed.");
    114     doAssert(uprv_digitsAfterDecimal(1.2345E20), 0, "uprv_digitsAfterDecimal(1.2345E20) failed.");
    115     doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021) failed.");
    116     doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) failed.");
    117     doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecimal(0.022223333321) failed.");
    118 #endif
    119 
    120     log_verbose("Testing the API u_errorName()...\n");
    121     str=(char*)u_errorName((UErrorCode)0);
    122     if(strcmp(str, "U_ZERO_ERROR") != 0){
    123         log_err("ERROR: u_getVersion() failed. Expected: U_ZERO_ERROR Got=%s\n",  str);
    124     }
    125     log_verbose("Testing the API u_errorName()...\n");
    126     str=(char*)u_errorName((UErrorCode)-127);
    127     if(strcmp(str, "U_USING_DEFAULT_WARNING") != 0){
    128         log_err("ERROR: u_getVersion() failed. Expected: U_USING_DEFAULT_WARNING Got=%s\n",  str);
    129     }
    130     log_verbose("Testing the API u_errorName().. with BOGUS ERRORCODE...\n");
    131     str=(char*)u_errorName((UErrorCode)200);
    132     if(strcmp(str, "[BOGUS UErrorCode]") != 0){
    133         log_err("ERROR: u_getVersion() failed. Expected: [BOGUS UErrorCode] Got=%s\n",  str);
    134     }
    135 
    136     {
    137         const char* dataDirectory;
    138         int32_t dataDirectoryLen;
    139         UChar *udataDir=0;
    140         UChar temp[100];
    141         char *charvalue=0;
    142         log_verbose("Testing chars to UChars\n");
    143 
    144          /* This cannot really work on a japanese system. u_uastrcpy will have different results than */
    145         /* u_charsToUChars when there is a backslash in the string! */
    146         /*dataDirectory=u_getDataDirectory();*/
    147 
    148         dataDirectory="directory1";  /*no backslashes*/
    149         dataDirectoryLen=(int32_t)strlen(dataDirectory);
    150         udataDir=(UChar*)malloc(sizeof(UChar) * (dataDirectoryLen + 1));
    151         u_charsToUChars(dataDirectory, udataDir, (dataDirectoryLen + 1));
    152         u_uastrcpy(temp, dataDirectory);
    153 
    154         if(u_strcmp(temp, udataDir) != 0){
    155             log_err("ERROR: u_charsToUChars failed. Expected %s, Got %s\n", austrdup(temp), austrdup(udataDir));
    156         }
    157         log_verbose("Testing UChars to chars\n");
    158         charvalue=(char*)malloc(sizeof(char) * (u_strlen(udataDir) + 1));
    159 
    160         u_UCharsToChars(udataDir, charvalue, (u_strlen(udataDir)+1));
    161         if(strcmp(charvalue, dataDirectory) != 0){
    162             log_err("ERROR: u_UCharsToChars failed. Expected %s, Got %s\n", charvalue, dataDirectory);
    163         }
    164         free(charvalue);
    165         free(udataDir);
    166     }
    167 
    168     log_verbose("Testing uprv_timezone()....\n");
    169     {
    170         int32_t tzoffset = uprv_timezone();
    171         log_verbose("Value returned from uprv_timezone = %d\n",  tzoffset);
    172         if (tzoffset != 28800) {
    173             log_verbose("***** WARNING: If testing in the PST timezone, t_timezone should return 28800! *****");
    174         }
    175         if ((tzoffset % 1800 != 0)) {
    176             log_err("FAIL: t_timezone may be incorrect. It is not a multiple of 30min.");
    177         }
    178         /*tzoffset=uprv_getUTCtime();*/
    179 
    180     }
    181 }
    182 
    183 static void TestVersion()
    184 {
    185     UVersionInfo versionArray = {0x01, 0x00, 0x02, 0x02};
    186     UVersionInfo versionArray2 = {0x01, 0x00, 0x02, 0x02};
    187     char versionString[17]; /* xxx.xxx.xxx.xxx\0 */
    188     UChar versionUString[] = { 0x0031, 0x002E, 0x0030, 0x002E,
    189                                0x0032, 0x002E, 0x0038, 0x0000 }; /* 1.0.2.8 */
    190 
    191     log_verbose("Testing the API u_versionToString().....\n");
    192     u_versionToString(versionArray, versionString);
    193     if(strcmp(versionString, "1.0.2.2") != 0){
    194         log_err("ERROR: u_versionToString() failed. Expected: 1.0.2.2, Got=%s\n", versionString);
    195     }
    196     log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
    197     u_versionToString(NULL, versionString);
    198     if(strcmp(versionString, "") != 0){
    199         log_err("ERROR: u_versionToString() failed. with versionArray=NULL. It should just return\n");
    200     }
    201     log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
    202     u_versionToString(NULL, versionString);
    203     if(strcmp(versionString, "") != 0){
    204         log_err("ERROR: u_versionToString() failed . It should just return\n");
    205     }
    206     log_verbose("Testing the API u_versionToString().....with versionString=NULL\n");
    207     u_versionToString(versionArray, NULL);
    208     if(strcmp(versionString, "") != 0){
    209         log_err("ERROR: u_versionToString() failed. with versionArray=NULL  It should just return\n");
    210     }
    211     versionArray[0] = 0x0a;
    212     log_verbose("Testing the API u_versionToString().....\n");
    213     u_versionToString(versionArray, versionString);
    214     if(strcmp(versionString, "10.0.2.2") != 0){
    215         log_err("ERROR: u_versionToString() failed. Expected: 10.0.2.2, Got=%s\n", versionString);
    216     }
    217     versionArray[0] = 0xa0;
    218     u_versionToString(versionArray, versionString);
    219     if(strcmp(versionString, "160.0.2.2") != 0){
    220         log_err("ERROR: u_versionToString() failed. Expected: 160.0.2.2, Got=%s\n", versionString);
    221     }
    222     versionArray[0] = 0xa0;
    223     versionArray[1] = 0xa0;
    224     u_versionToString(versionArray, versionString);
    225     if(strcmp(versionString, "160.160.2.2") != 0){
    226         log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
    227     }
    228     versionArray[0] = 0x01;
    229     versionArray[1] = 0x0a;
    230     u_versionToString(versionArray, versionString);
    231     if(strcmp(versionString, "1.10.2.2") != 0){
    232         log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
    233     }
    234 
    235     log_verbose("Testing the API u_versionFromString() ....\n");
    236     u_versionFromString(versionArray, "1.3.5.6");
    237     u_versionToString(versionArray, versionString);
    238     if(strcmp(versionString, "1.3.5.6") != 0){
    239         log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
    240     }
    241     log_verbose("Testing the API u_versionFromString() where versionArray=NULL....\n");
    242     u_versionFromString(NULL, "1.3.5.6");
    243     u_versionToString(versionArray, versionString);
    244     if(strcmp(versionString, "1.3.5.6") != 0){
    245         log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
    246     }
    247 
    248     log_verbose("Testing the API u_getVersion().....\n");
    249     u_getVersion(versionArray);
    250     u_versionToString(versionArray, versionString);
    251     if(strcmp(versionString, U_ICU_VERSION) != 0){
    252         log_err("ERROR: u_getVersion() failed. Got=%s, expected %s\n",  versionString, U_ICU_VERSION);
    253     }
    254     /* test unicode */
    255     log_verbose("Testing u_versionFromUString...\n");
    256     u_versionFromString(versionArray,"1.0.2.8");
    257     u_versionFromUString(versionArray2, versionUString);
    258     u_versionToString(versionArray2, versionString);
    259     if(memcmp(versionArray, versionArray2, sizeof(UVersionInfo))) {
    260        log_err("FAIL: u_versionFromUString produced a different result - not 1.0.2.8 but %s [%x.%x.%x.%x]\n",
    261           versionString,
    262         (int)versionArray2[0],
    263         (int)versionArray2[1],
    264         (int)versionArray2[2],
    265         (int)versionArray2[3]);
    266     }
    267     else {
    268        log_verbose(" from UString: %s\n", versionString);
    269     }
    270 }
    271 
    272 static void TestCompareVersions()
    273 {
    274    /* use a 1d array to be palatable to java */
    275    const char *testCases[] = {
    276       /*  v1          <|=|>       v2  */
    277     "0.0.0.0",    "=",        "0.0.0.0",
    278     "3.1.2.0",    ">",        "3.0.9.0",
    279     "3.2.8.6",    "<",        "3.4",
    280     "4.0",        ">",        "3.2",
    281     NULL,        NULL,        NULL
    282    };
    283    const char *v1str;
    284    const char *opstr;
    285    const char *v2str;
    286    int32_t op, invop, got, invgot;
    287    UVersionInfo v1, v2;
    288    int32_t j;
    289    log_verbose("Testing u_compareVersions()\n");
    290    for(j=0;testCases[j]!=NULL;j+=3) {
    291     v1str = testCases[j+0];
    292     opstr = testCases[j+1];
    293     v2str = testCases[j+2];
    294     switch(opstr[0]) {
    295         case '-':
    296         case '<': op = -1; break;
    297         case '0':
    298         case '=': op = 0; break;
    299         case '+':
    300         case '>': op = 1; break;
    301         default:  log_err("Bad operator at j/3=%d\n", (j/3)); return;
    302     }
    303     invop = 0-op; /* inverse operation: with v1 and v2 switched */
    304     u_versionFromString(v1, v1str);
    305     u_versionFromString(v2, v2str);
    306     got = u_compareVersions(v1,v2);
    307     invgot = u_compareVersions(v2,v1); /* oppsite */
    308     if(got==op) {
    309         log_verbose("%d: %s %s %s, OK\n", (j/3), v1str, opstr, v2str);
    310     } else {
    311         log_err("%d: %s %s %s: wanted %d got %d\n", (j/3), v1str, opstr, v2str, op, got);
    312     }
    313     if(invgot==invop) {
    314         log_verbose("%d: %s (%d) %s, OK (inverse)\n", (j/3), v2str, invop, v1str);
    315     } else {
    316         log_err("%d: %s (%d) %s: wanted %d got %d\n", (j/3), v2str, invop, v1str, invop, invgot);
    317     }
    318    }
    319 }
    320 
    321 
    322 
    323 #if 0
    324 static void testIEEEremainder()
    325 {
    326     double    pinf        = uprv_getInfinity();
    327     double    ninf        = -uprv_getInfinity();
    328     double    nan         = uprv_getNaN();
    329 /*    double    pzero       = 0.0;*/
    330 /*    double    nzero       = 0.0;
    331     nzero *= -1;*/
    332 
    333      /* simple remainder checks*/
    334     remainderTest(7.0, 2.5, -0.5);
    335     remainderTest(7.0, -2.5, -0.5);
    336      /* this should work
    337      remainderTest(43.7, 2.5, 1.2);
    338      */
    339 
    340     /* infinity and real*/
    341     remainderTest(1.0, pinf, 1.0);
    342     remainderTest(1.0, ninf, 1.0);
    343 
    344     /*test infinity and real*/
    345     remainderTest(nan, 1.0, nan);
    346     remainderTest(1.0, nan, nan);
    347     /*test infinity and nan*/
    348     remainderTest(ninf, nan, nan);
    349     remainderTest(pinf, nan, nan);
    350 
    351     /* test infinity and zero */
    352 /*    remainderTest(pinf, pzero, 1.25);
    353     remainderTest(pinf, nzero, 1.25);
    354     remainderTest(ninf, pzero, 1.25);
    355     remainderTest(ninf, nzero, 1.25); */
    356 }
    357 
    358 static void remainderTest(double x, double y, double exp)
    359 {
    360     double result = uprv_IEEEremainder(x,y);
    361 
    362     if(        uprv_isNaN(result) &&
    363         ! ( uprv_isNaN(x) || uprv_isNaN(y))) {
    364         log_err("FAIL: got NaN as result without NaN as argument");
    365         log_err("      IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
    366     }
    367     else if(!compareWithNAN(result, exp)) {
    368         log_err("FAIL:  IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
    369     } else{
    370         log_verbose("OK: IEEEremainder(%f, %f) is %f\n", x, y, result);
    371     }
    372 
    373 }
    374 #endif
    375 
    376 static UBool compareWithNAN(double x, double y)
    377 {
    378   if( uprv_isNaN(x) || uprv_isNaN(y) ) {
    379     if(!uprv_isNaN(x) || !uprv_isNaN(y) ) {
    380       return FALSE;
    381     }
    382   }
    383   else if (y != x) { /* no NaN's involved */
    384     return FALSE;
    385   }
    386 
    387   return TRUE;
    388 }
    389 
    390 static void doAssert(double got, double expect, const char *message)
    391 {
    392   if(! compareWithNAN(expect, got) ) {
    393     log_err("ERROR :  %s. Expected : %lf, Got: %lf\n", message, expect, got);
    394   }
    395 }
    396 
    397 
    398 #define _CODE_ARR_LEN 8
    399 static const UErrorCode errorCode[_CODE_ARR_LEN] = {
    400     U_USING_FALLBACK_WARNING,
    401     U_STRING_NOT_TERMINATED_WARNING,
    402     U_ILLEGAL_ARGUMENT_ERROR,
    403     U_STATE_TOO_OLD_ERROR,
    404     U_BAD_VARIABLE_DEFINITION,
    405     U_RULE_MASK_ERROR,
    406     U_UNEXPECTED_TOKEN,
    407     U_UNSUPPORTED_ATTRIBUTE
    408 };
    409 
    410 static const char* str[] = {
    411     "U_USING_FALLBACK_WARNING",
    412     "U_STRING_NOT_TERMINATED_WARNING",
    413     "U_ILLEGAL_ARGUMENT_ERROR",
    414     "U_STATE_TOO_OLD_ERROR",
    415     "U_BAD_VARIABLE_DEFINITION",
    416     "U_RULE_MASK_ERROR",
    417     "U_UNEXPECTED_TOKEN",
    418     "U_UNSUPPORTED_ATTRIBUTE"
    419 };
    420 
    421 static void TestErrorName(void){
    422     int32_t code=0;
    423     const char* errorName ;
    424     for(;code<U_ERROR_LIMIT;code++){
    425         errorName = u_errorName((UErrorCode)code);
    426     }
    427 
    428     for(code=0;code<_CODE_ARR_LEN; code++){
    429         errorName = u_errorName(errorCode[code]);
    430         if(uprv_strcmp(str[code],errorName )!=0){
    431             log_err("Error : u_errorName failed. Expected: %s Got: %s \n",str[code],errorName);
    432         }
    433     }
    434 }
    435 
    436 void addPUtilTest(TestNode** root);
    437 
    438 void
    439 addPUtilTest(TestNode** root)
    440 {
    441     addTest(root, &TestPUtilAPI,       "putiltst/TestPUtilAPI");
    442     addTest(root, &TestVersion,       "putiltst/TestVersion");
    443     addTest(root, &TestCompareVersions,       "putiltst/TestCompareVersions");
    444 /*    addTest(root, &testIEEEremainder,  "putiltst/testIEEEremainder"); */
    445     addTest(root, &TestErrorName, "putiltst/TestErrorName");
    446 }
    447 
    448