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