OLD | NEW |
| (Empty) |
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 Expe
cted 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 o
ne 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 o
ne 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(upr
v_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() fail
ed."); | |
132 doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.23
45E2) failed."); | |
133 doAssert(uprv_digitsAfterDecimal(1.2345E-2), 6, "uprv_digitsAfterDecimal(1.2
345E-2) failed."); | |
134 doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.23
45E2) 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.2
345E20) failed."); | |
137 doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021
) failed."); | |
138 doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) fa
iled."); | |
139 doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecima
l(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 d
ifferent 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", aust
rdup(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", char
value, 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_timezo
ne should return 28800! *****"); | |
196 } | |
197 if ((tzoffset % 1800 != 0)) { | |
198 log_info("Note: t_timezone offset of %ld (for %s : %s) is not a mult
iple 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 s
hould 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 s
hould 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", ve
rsionString); | |
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", ve
rsionString); | |
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", versionS
tring, 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(stat
us)); | |
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, resul
t, 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[co
de],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 *s
rc, 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", __FIL
E__, 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((u
int8_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((u
int8_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_STR
ING "pkgdata", | |
561 "pkgdata" | |
562 }, | |
563 { | |
564 U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STR
ING, | |
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_STR
ING "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_STR
ING "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_STR
ING "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].expectStat
us)); | |
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/TestSign
edRightShiftIsArithmetic"); | |
694 /* | |
695 Not yet tested: | |
696 | |
697 addTest(root, &toolutil_getLongPathname, "putiltst/toolutil/getLongPat
hname"); | |
698 addTest(root, &toolutil_getCurrentYear, "putiltst/toolutil/getCurrentY
ear"); | |
699 addTest(root, &toolutil_UToolMemory, "putiltst/toolutil/UToolMemory"); | |
700 */ | |
701 } | |
OLD | NEW |