1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /********************************************************************
5 * Copyright (c) 1998-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************/
9 * File putiltst.c (Tests the API in putil)
11 * Modification History:
13 * Date Name Description
14 * 07/12/2000 Madhu Creation
15 *******************************************************************************
18 #include "unicode/utypes.h"
21 #include "unicode/putil.h"
22 #include "unicode/ustring.h"
23 #include "unicode/icudataver.h"
29 #if U_PLATFORM_USES_ONLY_WIN32_API
33 /* See the comments on U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC. */
34 static void TestSignedRightShiftIsArithmetic(void) {
39 UBool signedRightShiftIsArithmetic
= (x4
==(int32_t)0xffff5fff && m1
==-1);
40 if(signedRightShiftIsArithmetic
==U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC
) {
41 log_info("signed right shift is Arithmetic Shift Right: %d\n",
42 signedRightShiftIsArithmetic
);
44 log_err("error: unexpected signed right shift is Arithmetic Shift Right: %d\n"
45 " You need to change the value of U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC "
46 "for your platform.\n",
47 signedRightShiftIsArithmetic
);
51 static UBool
compareWithNAN(double x
, double y
);
52 static void doAssert(double expect
, double got
, const char *message
);
54 static void TestPUtilAPI(void){
56 double n1
=0.0, y1
=0.0, expn1
, expy1
;
57 double value1
= 0.021;
61 log_verbose("Testing the API uprv_modf()\n");
62 y1
= uprv_modf(value1
, &n1
);
65 if(y1
!= expy1
|| n1
!= expn1
){
66 log_err("Error in uprv_modf. Expected IntegralValue=%f, Got=%f, \n Expected FractionalValue=%f, Got=%f\n",
67 expn1
, n1
, expy1
, y1
);
69 if(getTestOption(VERBOSITY_OPTION
)){
70 log_verbose("[float] x = %f n = %f y = %f\n", value1
, n1
, y1
);
72 log_verbose("Testing the API uprv_fmod()\n");
73 expn1
=uprv_fmod(30.50, 15.00);
74 doAssert(expn1
, 0.5, "uprv_fmod(30.50, 15.00) failed.");
76 log_verbose("Testing the API uprv_ceil()\n");
77 expn1
=uprv_ceil(value1
);
78 doAssert(expn1
, 1, "uprv_ceil(0.021) failed.");
80 log_verbose("Testing the API uprv_floor()\n");
81 expn1
=uprv_floor(value1
);
82 doAssert(expn1
, 0, "uprv_floor(0.021) failed.");
84 log_verbose("Testing the API uprv_fabs()\n");
85 expn1
=uprv_fabs((2.02-1.345));
86 doAssert(expn1
, 0.675, "uprv_fabs(2.02-1.345) failed.");
88 log_verbose("Testing the API uprv_fmax()\n");
89 doAssert(uprv_fmax(2.4, 1.2), 2.4, "uprv_fmax(2.4, 1.2) failed.");
91 log_verbose("Testing the API uprv_fmax() with x value= NaN\n");
92 expn1
=uprv_fmax(uprv_getNaN(), 1.2);
93 doAssert(expn1
, uprv_getNaN(), "uprv_fmax(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
95 log_verbose("Testing the API uprv_fmin()\n");
96 doAssert(uprv_fmin(2.4, 1.2), 1.2, "uprv_fmin(2.4, 1.2) failed.");
98 log_verbose("Testing the API uprv_fmin() with x value= NaN\n");
99 expn1
=uprv_fmin(uprv_getNaN(), 1.2);
100 doAssert(expn1
, uprv_getNaN(), "uprv_fmin(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
102 log_verbose("Testing the API uprv_max()\n");
103 doAssert(uprv_max(4, 2), 4, "uprv_max(4, 2) failed.");
105 log_verbose("Testing the API uprv_min()\n");
106 doAssert(uprv_min(-4, 2), -4, "uprv_min(-4, 2) failed.");
108 log_verbose("Testing the API uprv_trunc()\n");
109 doAssert(uprv_trunc(12.3456), 12, "uprv_trunc(12.3456) failed.");
110 doAssert(uprv_trunc(12.234E2
), 1223, "uprv_trunc(12.234E2) failed.");
111 doAssert(uprv_trunc(uprv_getNaN()), uprv_getNaN(), "uprv_trunc(uprv_getNaN()) failed. with parameter=NaN");
112 doAssert(uprv_trunc(uprv_getInfinity()), uprv_getInfinity(), "uprv_trunc(uprv_getInfinity()) failed. with parameter=Infinity");
115 log_verbose("Testing the API uprv_pow10()\n");
116 doAssert(uprv_pow10(4), 10000, "uprv_pow10(4) failed.");
118 log_verbose("Testing the API uprv_isNegativeInfinity()\n");
119 isTrue
=uprv_isNegativeInfinity(uprv_getInfinity() * -1);
121 log_err("ERROR: uprv_isNegativeInfinity failed.\n");
123 log_verbose("Testing the API uprv_isPositiveInfinity()\n");
124 isTrue
=uprv_isPositiveInfinity(uprv_getInfinity());
126 log_err("ERROR: uprv_isPositiveInfinity failed.\n");
128 log_verbose("Testing the API uprv_isInfinite()\n");
129 isTrue
=uprv_isInfinite(uprv_getInfinity());
131 log_err("ERROR: uprv_isInfinite failed.\n");
134 log_verbose("Testing the APIs uprv_add32_overflow and uprv_mul32_overflow\n");
135 int32_t overflow_result
;
136 doAssert(FALSE
, uprv_add32_overflow(INT32_MAX
- 2, 1, &overflow_result
), "should not overflow");
137 doAssert(INT32_MAX
- 1, overflow_result
, "should equal INT32_MAX - 1");
138 doAssert(FALSE
, uprv_add32_overflow(INT32_MAX
- 2, 2, &overflow_result
), "should not overflow");
139 doAssert(INT32_MAX
, overflow_result
, "should equal exactly INT32_MAX");
140 doAssert(TRUE
, uprv_add32_overflow(INT32_MAX
- 2, 3, &overflow_result
), "should overflow");
141 doAssert(FALSE
, uprv_mul32_overflow(INT32_MAX
/ 5, 4, &overflow_result
), "should not overflow");
142 doAssert(INT32_MAX
/ 5 * 4, overflow_result
, "should equal INT32_MAX / 5 * 4");
143 doAssert(TRUE
, uprv_mul32_overflow(INT32_MAX
/ 5, 6, &overflow_result
), "should overflow");
144 // Test on negative numbers:
145 doAssert(FALSE
, uprv_add32_overflow(-3, -2, &overflow_result
), "should not overflow");
146 doAssert(-5, overflow_result
, "should equal -5");
149 log_verbose("Testing the API uprv_digitsAfterDecimal()....\n");
150 doAssert(uprv_digitsAfterDecimal(value1
), 3, "uprv_digitsAfterDecimal() failed.");
151 doAssert(uprv_digitsAfterDecimal(1.2345E2
), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
152 doAssert(uprv_digitsAfterDecimal(1.2345E-2), 6, "uprv_digitsAfterDecimal(1.2345E-2) failed.");
153 doAssert(uprv_digitsAfterDecimal(1.2345E2
), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
154 doAssert(uprv_digitsAfterDecimal(-1.2345E-20), 24, "uprv_digitsAfterDecimal(1.2345E-20) failed.");
155 doAssert(uprv_digitsAfterDecimal(1.2345E20
), 0, "uprv_digitsAfterDecimal(1.2345E20) failed.");
156 doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021) failed.");
157 doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) failed.");
158 doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecimal(0.022223333321) failed.");
161 log_verbose("Testing the API u_errorName()...\n");
162 str
=(char*)u_errorName((UErrorCode
)0);
163 if(strcmp(str
, "U_ZERO_ERROR") != 0){
164 log_err("ERROR: u_getVersion() failed. Expected: U_ZERO_ERROR Got=%s\n", str
);
166 log_verbose("Testing the API u_errorName()...\n");
167 str
=(char*)u_errorName((UErrorCode
)-127);
168 if(strcmp(str
, "U_USING_DEFAULT_WARNING") != 0){
169 log_err("ERROR: u_getVersion() failed. Expected: U_USING_DEFAULT_WARNING Got=%s\n", str
);
171 log_verbose("Testing the API u_errorName().. with BOGUS ERRORCODE...\n");
172 str
=(char*)u_errorName((UErrorCode
)200);
173 if(strcmp(str
, "[BOGUS UErrorCode]") != 0){
174 log_err("ERROR: u_getVersion() failed. Expected: [BOGUS UErrorCode] Got=%s\n", str
);
178 const char* dataDirectory
;
179 int32_t dataDirectoryLen
;
183 log_verbose("Testing chars to UChars\n");
185 /* This cannot really work on a japanese system. u_uastrcpy will have different results than */
186 /* u_charsToUChars when there is a backslash in the string! */
187 /*dataDirectory=u_getDataDirectory();*/
189 dataDirectory
="directory1"; /*no backslashes*/
190 dataDirectoryLen
=(int32_t)strlen(dataDirectory
);
191 udataDir
=(UChar
*)malloc(sizeof(UChar
) * (dataDirectoryLen
+ 1));
192 u_charsToUChars(dataDirectory
, udataDir
, (dataDirectoryLen
+ 1));
193 u_uastrcpy(temp
, dataDirectory
);
195 if(u_strcmp(temp
, udataDir
) != 0){
196 log_err("ERROR: u_charsToUChars failed. Expected %s, Got %s\n", austrdup(temp
), austrdup(udataDir
));
198 log_verbose("Testing UChars to chars\n");
199 charvalue
=(char*)malloc(sizeof(char) * (u_strlen(udataDir
) + 1));
201 u_UCharsToChars(udataDir
, charvalue
, (u_strlen(udataDir
)+1));
202 if(strcmp(charvalue
, dataDirectory
) != 0){
203 log_err("ERROR: u_UCharsToChars failed. Expected %s, Got %s\n", charvalue
, dataDirectory
);
209 log_verbose("Testing uprv_timezone()....\n");
211 int32_t tzoffset
= uprv_timezone();
212 log_verbose("Value returned from uprv_timezone = %d\n", tzoffset
);
213 if (tzoffset
!= 28800) {
214 log_verbose("***** WARNING: If testing in the PST timezone, t_timezone should return 28800! *****");
216 if ((tzoffset
% 1800 != 0)) {
217 log_info("Note: t_timezone offset of %ld (for %s : %s) is not a multiple of 30min.", tzoffset
, uprv_tzname(0), uprv_tzname(1));
219 /*tzoffset=uprv_getUTCtime();*/
222 #if U_PLATFORM_USES_ONLY_WIN32_API
223 log_verbose("Testing uprv_detectWindowsTimeZone() ....\n");
225 const char* timezone
= uprv_detectWindowsTimeZone();
226 if (timezone
== NULL
) {
227 log_err("ERROR: uprv_detectWindowsTimeZone failed (returned NULL).\n");
229 log_verbose("Detected TimeZone = %s\n", timezone
);
235 static void TestVersion(void)
237 UVersionInfo versionArray
= {0x01, 0x00, 0x02, 0x02};
238 UVersionInfo versionArray2
= {0x01, 0x00, 0x02, 0x02};
239 char versionString
[17]; /* xxx.xxx.xxx.xxx\0 */
240 UChar versionUString
[] = { 0x0031, 0x002E, 0x0030, 0x002E,
241 0x0032, 0x002E, 0x0038, 0x0000 }; /* 1.0.2.8 */
242 UVersionInfo version
;
243 UErrorCode status
= U_ZERO_ERROR
;
245 log_verbose("Testing the API u_versionToString().....\n");
246 u_versionToString(versionArray
, versionString
);
247 if(strcmp(versionString
, "1.0.2.2") != 0){
248 log_err("ERROR: u_versionToString() failed. Expected: 1.0.2.2, Got=%s\n", versionString
);
250 log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
251 u_versionToString(NULL
, versionString
);
252 if(strcmp(versionString
, "") != 0){
253 log_err("ERROR: u_versionToString() failed. with versionArray=NULL. It should just return\n");
255 log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
256 u_versionToString(NULL
, versionString
);
257 if(strcmp(versionString
, "") != 0){
258 log_err("ERROR: u_versionToString() failed . It should just return\n");
260 log_verbose("Testing the API u_versionToString().....with versionString=NULL\n");
261 u_versionToString(versionArray
, NULL
);
262 if(strcmp(versionString
, "") != 0){
263 log_err("ERROR: u_versionToString() failed. with versionArray=NULL It should just return\n");
265 versionArray
[0] = 0x0a;
266 log_verbose("Testing the API u_versionToString().....\n");
267 u_versionToString(versionArray
, versionString
);
268 if(strcmp(versionString
, "10.0.2.2") != 0){
269 log_err("ERROR: u_versionToString() failed. Expected: 10.0.2.2, Got=%s\n", versionString
);
271 versionArray
[0] = 0xa0;
272 u_versionToString(versionArray
, versionString
);
273 if(strcmp(versionString
, "160.0.2.2") != 0){
274 log_err("ERROR: u_versionToString() failed. Expected: 160.0.2.2, Got=%s\n", versionString
);
276 versionArray
[0] = 0xa0;
277 versionArray
[1] = 0xa0;
278 u_versionToString(versionArray
, versionString
);
279 if(strcmp(versionString
, "160.160.2.2") != 0){
280 log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString
);
282 versionArray
[0] = 0x01;
283 versionArray
[1] = 0x0a;
284 u_versionToString(versionArray
, versionString
);
285 if(strcmp(versionString
, "1.10.2.2") != 0){
286 log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString
);
289 log_verbose("Testing the API u_versionFromString() ....\n");
290 u_versionFromString(versionArray
, "1.3.5.6");
291 u_versionToString(versionArray
, versionString
);
292 if(strcmp(versionString
, "1.3.5.6") != 0){
293 log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n", versionString
);
295 log_verbose("Testing the API u_versionFromString() where versionArray=NULL....\n");
296 u_versionFromString(NULL
, "1.3.5.6");
297 u_versionToString(versionArray
, versionString
);
298 if(strcmp(versionString
, "1.3.5.6") != 0){
299 log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n", versionString
);
302 log_verbose("Testing the API u_getVersion().....\n");
303 u_getVersion(versionArray
);
304 u_versionToString(versionArray
, versionString
);
305 if(strcmp(versionString
, U_ICU_VERSION
) != 0){
306 log_err("ERROR: u_getVersion() failed. Got=%s, expected %s\n", versionString
, U_ICU_VERSION
);
309 log_verbose("Testing u_versionFromUString...\n");
310 u_versionFromString(versionArray
,"1.0.2.8");
311 u_versionFromUString(versionArray2
, versionUString
);
312 u_versionToString(versionArray2
, versionString
);
313 if(memcmp(versionArray
, versionArray2
, sizeof(UVersionInfo
))) {
314 log_err("FAIL: u_versionFromUString produced a different result - not 1.0.2.8 but %s [%x.%x.%x.%x]\n",
316 (int)versionArray2
[0],
317 (int)versionArray2
[1],
318 (int)versionArray2
[2],
319 (int)versionArray2
[3]);
322 log_verbose(" from UString: %s\n", versionString
);
325 /* Test the data version API for better code coverage */
326 u_getDataVersion(version
, &status
);
327 if (U_FAILURE(status
)) {
328 log_data_err("ERROR: Unable to get data version. %s\n", u_errorName(status
));
332 static void TestCompareVersions(void)
334 /* use a 1d array to be palatable to java */
335 const char *testCases
[] = {
337 "0.0.0.0", "=", "0.0.0.0",
338 "3.1.2.0", ">", "3.0.9.0",
339 "3.2.8.6", "<", "3.4",
346 int32_t op
, invop
, got
, invgot
;
349 log_verbose("Testing memcmp()\n");
350 for(j
=0;testCases
[j
]!=NULL
;j
+=3) {
351 v1str
= testCases
[j
+0];
352 opstr
= testCases
[j
+1];
353 v2str
= testCases
[j
+2];
356 case '<': op
= -1; break;
358 case '=': op
= 0; break;
360 case '>': op
= 1; break;
361 default: log_err("Bad operator at j/3=%d\n", (j
/3)); return;
363 invop
= 0-op
; /* inverse operation: with v1 and v2 switched */
364 u_versionFromString(v1
, v1str
);
365 u_versionFromString(v2
, v2str
);
366 got
= memcmp(v1
, v2
, sizeof(UVersionInfo
));
367 invgot
= memcmp(v2
, v1
, sizeof(UVersionInfo
)); /* Opposite */
368 if((got
<= 0 && op
<= 0) || (got
>= 0 && op
>= 0)) {
369 log_verbose("%d: %s %s %s, OK\n", (j
/3), v1str
, opstr
, v2str
);
371 log_err("%d: %s %s %s: wanted values of the same sign, %d got %d\n", (j
/3), v1str
, opstr
, v2str
, op
, got
);
373 if((invgot
>= 0 && invop
>= 0) || (invgot
<= 0 && invop
<= 0)) {
374 log_verbose("%d: %s (%d) %s, OK (inverse)\n", (j
/3), v2str
, invop
, v1str
);
376 log_err("%d: %s (%d) %s: wanted values of the same sign, %d got %d\n", (j
/3), v2str
, invop
, v1str
, invop
, invgot
);
384 static void testIEEEremainder()
386 double pinf
= uprv_getInfinity();
387 double ninf
= -uprv_getInfinity();
388 double nan
= uprv_getNaN();
389 /* double pzero = 0.0;*/
390 /* double nzero = 0.0;
393 /* simple remainder checks*/
394 remainderTest(7.0, 2.5, -0.5);
395 remainderTest(7.0, -2.5, -0.5);
397 remainderTest(43.7, 2.5, 1.2);
400 /* infinity and real*/
401 remainderTest(1.0, pinf
, 1.0);
402 remainderTest(1.0, ninf
, 1.0);
404 /*test infinity and real*/
405 remainderTest(nan
, 1.0, nan
);
406 remainderTest(1.0, nan
, nan
);
407 /*test infinity and nan*/
408 remainderTest(ninf
, nan
, nan
);
409 remainderTest(pinf
, nan
, nan
);
411 /* test infinity and zero */
412 /* remainderTest(pinf, pzero, 1.25);
413 remainderTest(pinf, nzero, 1.25);
414 remainderTest(ninf, pzero, 1.25);
415 remainderTest(ninf, nzero, 1.25); */
418 static void remainderTest(double x
, double y
, double exp
)
420 double result
= uprv_IEEEremainder(x
,y
);
422 if( uprv_isNaN(result
) &&
423 ! ( uprv_isNaN(x
) || uprv_isNaN(y
))) {
424 log_err("FAIL: got NaN as result without NaN as argument");
425 log_err(" IEEEremainder(%f, %f) is %f, expected %f\n", x
, y
, result
, exp
);
427 else if(!compareWithNAN(result
, exp
)) {
428 log_err("FAIL: IEEEremainder(%f, %f) is %f, expected %f\n", x
, y
, result
, exp
);
430 log_verbose("OK: IEEEremainder(%f, %f) is %f\n", x
, y
, result
);
436 static UBool
compareWithNAN(double x
, double y
)
438 if( uprv_isNaN(x
) || uprv_isNaN(y
) ) {
439 if(!uprv_isNaN(x
) || !uprv_isNaN(y
) ) {
443 else if (y
!= x
) { /* no NaN's involved */
450 static void doAssert(double got
, double expect
, const char *message
)
452 if(! compareWithNAN(expect
, got
) ) {
453 log_err("ERROR : %s. Expected : %lf, Got: %lf\n", message
, expect
, got
);
458 #define _CODE_ARR_LEN 8
459 static const UErrorCode errorCode
[_CODE_ARR_LEN
] = {
460 U_USING_FALLBACK_WARNING
,
461 U_STRING_NOT_TERMINATED_WARNING
,
462 U_ILLEGAL_ARGUMENT_ERROR
,
463 U_STATE_TOO_OLD_ERROR
,
464 U_BAD_VARIABLE_DEFINITION
,
467 U_UNSUPPORTED_ATTRIBUTE
470 static const char* str
[] = {
471 "U_USING_FALLBACK_WARNING",
472 "U_STRING_NOT_TERMINATED_WARNING",
473 "U_ILLEGAL_ARGUMENT_ERROR",
474 "U_STATE_TOO_OLD_ERROR",
475 "U_BAD_VARIABLE_DEFINITION",
477 "U_UNEXPECTED_TOKEN",
478 "U_UNSUPPORTED_ATTRIBUTE"
481 static void TestErrorName(void){
483 const char* errorName
;
484 for(;code
<U_ERROR_LIMIT
;code
++){
485 errorName
= u_errorName((UErrorCode
)code
);
486 if(!errorName
|| errorName
[0] == 0) {
487 log_err("Error: u_errorName(0x%X) failed.\n",code
);
491 for(code
=0;code
<_CODE_ARR_LEN
; code
++){
492 errorName
= u_errorName(errorCode
[code
]);
493 if(uprv_strcmp(str
[code
],errorName
)!=0){
494 log_err("Error : u_errorName failed. Expected: %s Got: %s \n",str
[code
],errorName
);
499 #define AESTRNCPY_SIZE 13
501 static const char * dump_binline(uint8_t *bytes
) {
502 static char buf
[512];
505 sprintf(buf
+(i
*3), "%02x ", bytes
[i
]);
510 static void Test_aestrncpy(int32_t line
, const uint8_t *expect
, const uint8_t *src
, int32_t len
)
512 uint8_t str_buf
[AESTRNCPY_SIZE
] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
515 log_verbose("\n%s:%d: Beginning test of uprv_aestrncpy(dst, src, %d)\n", __FILE__
, line
, len
);
516 ret
= uprv_aestrncpy(str_buf
, src
, len
);
518 log_err("\n%s:%d: FAIL: uprv_aestrncpy returned %p expected %p\n", __FILE__
, line
, (void*)ret
, (void*)str_buf
);
520 if(!uprv_memcmp(str_buf
, expect
, AESTRNCPY_SIZE
)) {
521 log_verbose("\n%s:%d: OK - compared OK.", __FILE__
, line
);
522 log_verbose("\n%s:%d: expected: %s", __FILE__
, line
, dump_binline((uint8_t *)expect
));
523 log_verbose("\n%s:%d: got : %s\n", __FILE__
, line
, dump_binline(str_buf
));
525 log_err ("\n%s:%d: FAIL: uprv_aestrncpy output differs", __FILE__
, line
);
526 log_err ("\n%s:%d: expected: %s", __FILE__
, line
, dump_binline((uint8_t *)expect
));
527 log_err ("\n%s:%d: got : %s\n", __FILE__
, line
, dump_binline(str_buf
));
531 static void TestString(void)
534 uint8_t str_tst
[AESTRNCPY_SIZE
] = { 0x81, 0x4b, 0x5c, 0x82, 0x25, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f };
536 uint8_t str_exp1
[AESTRNCPY_SIZE
] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
537 uint8_t str_exp2
[AESTRNCPY_SIZE
] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
538 uint8_t str_exp3
[AESTRNCPY_SIZE
] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff };
542 /* test #1- copy with -1 length */
543 Test_aestrncpy(__LINE__
, str_exp1
, str_tst
, -1);
544 Test_aestrncpy(__LINE__
, str_exp1
, str_tst
, 6);
545 Test_aestrncpy(__LINE__
, str_exp2
, str_tst
, 5);
546 Test_aestrncpy(__LINE__
, str_exp3
, str_tst
, 8);
549 void addPUtilTest(TestNode
** root
);
551 static void addToolUtilTests(TestNode
** root
);
554 addPUtilTest(TestNode
** root
)
556 addTest(root
, &TestVersion
, "putiltst/TestVersion");
557 addTest(root
, &TestCompareVersions
, "putiltst/TestCompareVersions");
558 /* addTest(root, &testIEEEremainder, "putiltst/testIEEEremainder"); */
559 addTest(root
, &TestErrorName
, "putiltst/TestErrorName");
560 addTest(root
, &TestPUtilAPI
, "putiltst/TestPUtilAPI");
561 addTest(root
, &TestString
, "putiltst/TestString");
562 addToolUtilTests(root
);
565 /* Tool Util Tests ================ */
566 #define TOOLUTIL_TESTBUF_SIZE 2048
567 static char toolutil_testBuf
[TOOLUTIL_TESTBUF_SIZE
];
568 static const char *NULLSTR
="NULL";
571 * Normalize NULL to 'NULL' for testing
573 #define STRNULL(x) ((x)?(x):NULLSTR)
575 static void toolutil_findBasename(void)
579 const char *expectResult
;
582 U_FILE_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin" U_FILE_SEP_STRING
"pkgdata",
586 U_FILE_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin" U_FILE_SEP_STRING
,
590 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin" U_FILE_ALT_SEP_STRING
"pkgdata",
594 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin" U_FILE_ALT_SEP_STRING
,
598 int32_t count
=UPRV_LENGTHOF(testCases
);
602 log_verbose("Testing findBaseName()\n");
603 for(i
=0;i
<count
;i
++) {
605 const char *input
= STRNULL(testCases
[i
].inBuf
);
606 const char *expect
= STRNULL(testCases
[i
].expectResult
);
607 log_verbose("Test case [%d/%d]: %s\n", i
, count
-1, input
);
608 result
= STRNULL(findBasename(testCases
[i
].inBuf
));
609 if(result
==expect
||!strcmp(result
,expect
)) {
610 log_verbose(" -> %s PASS\n", result
);
612 log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i
, count
-1, input
, result
, expect
);
618 static void toolutil_findDirname(void)
624 UErrorCode expectStatus
;
625 const char *expectResult
;
628 U_FILE_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin" U_FILE_SEP_STRING
"pkgdata",
631 U_FILE_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin",
634 U_FILE_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin" U_FILE_SEP_STRING
"pkgdata",
636 U_BUFFER_OVERFLOW_ERROR
,
640 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin" U_FILE_ALT_SEP_STRING
"pkgdata",
643 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin"
646 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin" U_FILE_ALT_SEP_STRING
"pkgdata",
648 U_BUFFER_OVERFLOW_ERROR
,
652 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin" U_FILE_SEP_STRING
"pkgdata",
655 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin"
658 U_FILE_ALT_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin" U_FILE_ALT_SEP_STRING
"pkgdata",
661 U_FILE_ALT_SEP_STRING
"usr" U_FILE_SEP_STRING
"bin"
664 U_FILE_ALT_SEP_STRING
"usr" U_FILE_ALT_SEP_STRING
"bin" U_FILE_ALT_SEP_STRING
"pkgdata",
666 U_BUFFER_OVERFLOW_ERROR
,
670 U_FILE_ALT_SEP_STRING
"vmlinuz",
673 U_FILE_ALT_SEP_STRING
676 U_FILE_SEP_STRING
"vmlinux",
684 U_BUFFER_OVERFLOW_ERROR
,
694 int32_t count
=UPRV_LENGTHOF(testCases
);
696 log_verbose("Testing findDirname()\n");
697 for(i
=0;i
<count
;i
++) {
699 const char *input
= STRNULL(testCases
[i
].inBuf
);
700 const char *expect
= STRNULL(testCases
[i
].expectResult
);
701 UErrorCode status
= U_ZERO_ERROR
;
702 uprv_memset(toolutil_testBuf
, 0x55, TOOLUTIL_TESTBUF_SIZE
);
704 log_verbose("Test case [%d/%d]: %s\n", i
, count
-1, input
);
705 result
= STRNULL(findDirname(testCases
[i
].inBuf
, toolutil_testBuf
, testCases
[i
].outBufLen
, &status
));
706 log_verbose(" -> %s, \n", u_errorName(status
));
707 if(status
!= testCases
[i
].expectStatus
) {
708 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
));
710 if(result
==expect
||!strcmp(result
,expect
)) {
711 log_verbose(" = -> %s \n", result
);
713 log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i
, count
-1, input
, result
, expect
);
720 static void addToolUtilTests(TestNode
** root
) {
721 addTest(root
, &toolutil_findBasename
, "putiltst/toolutil/findBasename");
722 addTest(root
, &toolutil_findDirname
, "putiltst/toolutil/findDirname");
723 addTest(root
, &TestSignedRightShiftIsArithmetic
, "putiltst/toolutil/TestSignedRightShiftIsArithmetic");
727 addTest(root, &toolutil_getLongPathname, "putiltst/toolutil/getLongPathname");
728 addTest(root, &toolutil_getCurrentYear, "putiltst/toolutil/getCurrentYear");
729 addTest(root, &toolutil_UToolMemory, "putiltst/toolutil/UToolMemory");