]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/tsputil.cpp
1 /********************************************************************
3 * Copyright (c) 1997-2004, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
9 #include <float.h> // DBL_MAX, DBL_MIN
12 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break;
15 PUtilTest::runIndexedTest( int32_t index
, UBool exec
, const char* &name
, char* /*par*/ )
17 //if (exec) logln("TestSuite PUtilTest: ");
21 CASE(2, testPositiveInfinity
)
22 CASE(3, testNegativeInfinity
)
24 // CASE(5, testIEEEremainder)
26 default: name
= ""; break; //needed to end loop
32 PUtilTest::testIEEEremainder()
34 double pinf
= uprv_getInfinity();
35 double ninf
= -uprv_getInfinity();
36 double nan
= uprv_getNaN();
42 // simple remainder checks
43 remainderTest(7.0, 2.5, -0.5);
44 remainderTest(7.0, -2.5, -0.5);
47 // The following tests fails on S/390 with IEEE support in release builds;
49 // The functioning of ChoiceFormat is not affected by this bug.
50 remainderTest(-7.0, 2.5, 0.5);
51 remainderTest(-7.0, -2.5, 0.5);
53 remainderTest(5.0, 3.0, -1.0);
56 //remainderTest(43.7, 2.5, 1.25);
61 remainderTest(pinf, 1.0, 1.25);
62 remainderTest(1.0, pinf, 1.0);
63 remainderTest(ninf, 1.0, 1.25);
64 remainderTest(1.0, ninf, 1.0);
66 // test infinity and nan
67 remainderTest(ninf, pinf, 1.25);
68 remainderTest(ninf, nan, 1.25);
69 remainderTest(pinf, nan, 1.25);
71 // test infinity and zero
72 remainderTest(pinf, pzero, 1.25);
73 remainderTest(pinf, nzero, 1.25);
74 remainderTest(ninf, pzero, 1.25);
75 remainderTest(ninf, nzero, 1.25);
80 PUtilTest::remainderTest(double x
, double y
, double exp
)
82 double result
= uprv_IEEEremainder(x
,y
);
84 if( uprv_isNaN(result
) &&
85 ! ( uprv_isNaN(x
) || uprv_isNaN(y
))) {
86 errln(UnicodeString("FAIL: got NaN as result without NaN as argument"));
87 errln(UnicodeString(" IEEEremainder(") + x
+ ", " + y
+ ") is " + result
+ ", expected " + exp
);
89 else if(result
!= exp
)
90 errln(UnicodeString("FAIL: IEEEremainder(") + x
+ ", " + y
+ ") is " + result
+ ", expected " + exp
);
92 logln(UnicodeString("OK: IEEEremainder(") + x
+ ", " + y
+ ") is " + result
);
98 PUtilTest::testMaxMin()
100 double pinf
= uprv_getInfinity();
101 double ninf
= -uprv_getInfinity();
102 double nan
= uprv_getNaN();
109 maxMinTest(pinf
, ninf
, pinf
, TRUE
);
110 maxMinTest(pinf
, ninf
, ninf
, FALSE
);
112 // +Inf with +0 and -0
113 maxMinTest(pinf
, pzero
, pinf
, TRUE
);
114 maxMinTest(pinf
, pzero
, pzero
, FALSE
);
115 maxMinTest(pinf
, nzero
, pinf
, TRUE
);
116 maxMinTest(pinf
, nzero
, nzero
, FALSE
);
118 // -Inf with +0 and -0
119 maxMinTest(ninf
, pzero
, pzero
, TRUE
);
120 maxMinTest(ninf
, pzero
, ninf
, FALSE
);
121 maxMinTest(ninf
, nzero
, nzero
, TRUE
);
122 maxMinTest(ninf
, nzero
, ninf
, FALSE
);
124 // NaN with +Inf and -Inf
125 maxMinTest(pinf
, nan
, nan
, TRUE
);
126 maxMinTest(pinf
, nan
, nan
, FALSE
);
127 maxMinTest(ninf
, nan
, nan
, TRUE
);
128 maxMinTest(ninf
, nan
, nan
, FALSE
);
131 maxMinTest(nan
, nan
, nan
, TRUE
);
132 maxMinTest(nan
, nan
, nan
, FALSE
);
134 // NaN with +0 and -0
135 maxMinTest(nan
, pzero
, nan
, TRUE
);
136 maxMinTest(nan
, pzero
, nan
, FALSE
);
137 maxMinTest(nan
, nzero
, nan
, TRUE
);
138 maxMinTest(nan
, nzero
, nan
, FALSE
);
140 // +Inf with DBL_MAX and DBL_MIN
141 maxMinTest(pinf
, DBL_MAX
, pinf
, TRUE
);
142 maxMinTest(pinf
, -DBL_MAX
, pinf
, TRUE
);
143 maxMinTest(pinf
, DBL_MIN
, pinf
, TRUE
);
144 maxMinTest(pinf
, -DBL_MIN
, pinf
, TRUE
);
145 maxMinTest(pinf
, DBL_MIN
, DBL_MIN
, FALSE
);
146 maxMinTest(pinf
, -DBL_MIN
, -DBL_MIN
, FALSE
);
147 maxMinTest(pinf
, DBL_MAX
, DBL_MAX
, FALSE
);
148 maxMinTest(pinf
, -DBL_MAX
, -DBL_MAX
, FALSE
);
150 // -Inf with DBL_MAX and DBL_MIN
151 maxMinTest(ninf
, DBL_MAX
, DBL_MAX
, TRUE
);
152 maxMinTest(ninf
, -DBL_MAX
, -DBL_MAX
, TRUE
);
153 maxMinTest(ninf
, DBL_MIN
, DBL_MIN
, TRUE
);
154 maxMinTest(ninf
, -DBL_MIN
, -DBL_MIN
, TRUE
);
155 maxMinTest(ninf
, DBL_MIN
, ninf
, FALSE
);
156 maxMinTest(ninf
, -DBL_MIN
, ninf
, FALSE
);
157 maxMinTest(ninf
, DBL_MAX
, ninf
, FALSE
);
158 maxMinTest(ninf
, -DBL_MAX
, ninf
, FALSE
);
160 // +0 with DBL_MAX and DBL_MIN
161 maxMinTest(pzero
, DBL_MAX
, DBL_MAX
, TRUE
);
162 maxMinTest(pzero
, -DBL_MAX
, pzero
, TRUE
);
163 maxMinTest(pzero
, DBL_MIN
, DBL_MIN
, TRUE
);
164 maxMinTest(pzero
, -DBL_MIN
, pzero
, TRUE
);
165 maxMinTest(pzero
, DBL_MIN
, pzero
, FALSE
);
166 maxMinTest(pzero
, -DBL_MIN
, -DBL_MIN
, FALSE
);
167 maxMinTest(pzero
, DBL_MAX
, pzero
, FALSE
);
168 maxMinTest(pzero
, -DBL_MAX
, -DBL_MAX
, FALSE
);
170 // -0 with DBL_MAX and DBL_MIN
171 maxMinTest(nzero
, DBL_MAX
, DBL_MAX
, TRUE
);
172 maxMinTest(nzero
, -DBL_MAX
, nzero
, TRUE
);
173 maxMinTest(nzero
, DBL_MIN
, DBL_MIN
, TRUE
);
174 maxMinTest(nzero
, -DBL_MIN
, nzero
, TRUE
);
175 maxMinTest(nzero
, DBL_MIN
, nzero
, FALSE
);
176 maxMinTest(nzero
, -DBL_MIN
, -DBL_MIN
, FALSE
);
177 maxMinTest(nzero
, DBL_MAX
, nzero
, FALSE
);
178 maxMinTest(nzero
, -DBL_MAX
, -DBL_MAX
, FALSE
);
182 PUtilTest::maxMinTest(double a
, double b
, double exp
, UBool max
)
187 result
= uprv_fmax(a
, b
);
189 result
= uprv_fmin(a
, b
);
191 UBool nanResultOK
= (uprv_isNaN(a
) || uprv_isNaN(b
));
193 if(uprv_isNaN(result
) && ! nanResultOK
) {
194 errln(UnicodeString("FAIL: got NaN as result without NaN as argument"));
196 errln(UnicodeString(" max(") + a
+ ", " + b
+ ") is " + result
+ ", expected " + exp
);
198 errln(UnicodeString(" min(") + a
+ ", " + b
+ ") is " + result
+ ", expected " + exp
);
200 else if(result
!= exp
&& ! (uprv_isNaN(result
) || uprv_isNaN(exp
)))
202 errln(UnicodeString("FAIL: max(") + a
+ ", " + b
+ ") is " + result
+ ", expected " + exp
);
204 errln(UnicodeString("FAIL: min(") + a
+ ", " + b
+ ") is " + result
+ ", expected " + exp
);
207 logln(UnicodeString("OK: max(") + a
+ ", " + b
+ ") is " + result
);
209 logln(UnicodeString("OK: min(") + a
+ ", " + b
+ ") is " + result
);
211 //==============================
213 // NaN is weird- comparisons with NaN _always_ return false, with the
214 // exception of !=, which _always_ returns true
216 PUtilTest::testNaN(void)
218 logln("NaN tests may show that the expected NaN!=NaN etc. is not true on some");
219 logln("platforms; however, ICU does not rely on them because it defines");
220 logln("and uses uprv_isNaN(). Therefore, most failing NaN tests only report warnings.");
222 PUtilTest::testIsNaN();
230 logln("End of NaN tests.");
233 //==============================
236 PUtilTest::testPositiveInfinity(void)
238 double pinf
= uprv_getInfinity();
239 double ninf
= -uprv_getInfinity();
242 if(uprv_isInfinite(pinf
) != TRUE
) {
243 errln("FAIL: isInfinite(+Infinity) returned FALSE, should be TRUE.");
246 if(uprv_isPositiveInfinity(pinf
) != TRUE
) {
247 errln("FAIL: isPositiveInfinity(+Infinity) returned FALSE, should be TRUE.");
250 if(uprv_isNegativeInfinity(pinf
) != FALSE
) {
251 errln("FAIL: isNegativeInfinity(+Infinity) returned TRUE, should be FALSE.");
254 if(pinf
> DBL_MAX
!= TRUE
) {
255 errln("FAIL: +Infinity > DBL_MAX returned FALSE, should be TRUE.");
258 if(pinf
> DBL_MIN
!= TRUE
) {
259 errln("FAIL: +Infinity > DBL_MIN returned FALSE, should be TRUE.");
262 if(pinf
> ninf
!= TRUE
) {
263 errln("FAIL: +Infinity > -Infinity returned FALSE, should be TRUE.");
266 if(pinf
> ten
!= TRUE
) {
267 errln("FAIL: +Infinity > 10.0 returned FALSE, should be TRUE.");
271 //==============================
274 PUtilTest::testNegativeInfinity(void)
276 double pinf
= uprv_getInfinity();
277 double ninf
= -uprv_getInfinity();
280 if(uprv_isInfinite(ninf
) != TRUE
) {
281 errln("FAIL: isInfinite(-Infinity) returned FALSE, should be TRUE.");
284 if(uprv_isNegativeInfinity(ninf
) != TRUE
) {
285 errln("FAIL: isNegativeInfinity(-Infinity) returned FALSE, should be TRUE.");
288 if(uprv_isPositiveInfinity(ninf
) != FALSE
) {
289 errln("FAIL: isPositiveInfinity(-Infinity) returned TRUE, should be FALSE.");
292 if(ninf
< DBL_MAX
!= TRUE
) {
293 errln("FAIL: -Infinity < DBL_MAX returned FALSE, should be TRUE.");
296 if(ninf
< DBL_MIN
!= TRUE
) {
297 errln("FAIL: -Infinity < DBL_MIN returned FALSE, should be TRUE.");
300 if(ninf
< pinf
!= TRUE
) {
301 errln("FAIL: -Infinity < +Infinity returned FALSE, should be TRUE.");
304 if(ninf
< ten
!= TRUE
) {
305 errln("FAIL: -Infinity < 10.0 returned FALSE, should be TRUE.");
309 //==============================
312 // -0.0 == 0.0 == TRUE
313 // -0.0 < 0.0 == FALSE
314 // generating -0.0 must be done at runtime. compiler apparently ignores sign?
316 PUtilTest::testZero(void)
318 // volatile is used to fake out the compiler optimizer. We really want to divide by 0.
319 volatile double pzero
= 0.0;
320 volatile double nzero
= 0.0;
324 if(pzero
== nzero
!= TRUE
) {
325 errln("FAIL: 0.0 == -0.0 returned FALSE, should be TRUE.");
328 if(pzero
> nzero
!= FALSE
) {
329 errln("FAIL: 0.0 > -0.0 returned TRUE, should be FALSE.");
332 if(pzero
>= nzero
!= TRUE
) {
333 errln("FAIL: 0.0 >= -0.0 returned FALSE, should be TRUE.");
336 if(pzero
< nzero
!= FALSE
) {
337 errln("FAIL: 0.0 < -0.0 returned TRUE, should be FALSE.");
340 if(pzero
<= nzero
!= TRUE
) {
341 errln("FAIL: 0.0 <= -0.0 returned FALSE, should be TRUE.");
343 #ifndef OS400 /* OS/400 will generate divide by zero exception MCH1214 */
344 if(uprv_isInfinite(1/pzero
) != TRUE
) {
345 errln("FAIL: isInfinite(1/0.0) returned FALSE, should be TRUE.");
348 if(uprv_isInfinite(1/nzero
) != TRUE
) {
349 errln("FAIL: isInfinite(1/-0.0) returned FALSE, should be TRUE.");
352 if(uprv_isPositiveInfinity(1/pzero
) != TRUE
) {
353 errln("FAIL: isPositiveInfinity(1/0.0) returned FALSE, should be TRUE.");
356 if(uprv_isNegativeInfinity(1/nzero
) != TRUE
) {
357 errln("FAIL: isNegativeInfinity(1/-0.0) returned FALSE, should be TRUE.");
362 //==============================
365 PUtilTest::testIsNaN(void)
367 double pinf
= uprv_getInfinity();
368 double ninf
= -uprv_getInfinity();
369 double nan
= uprv_getNaN();
372 if(uprv_isNaN(nan
) == FALSE
) {
373 errln("FAIL: isNaN() returned FALSE for NaN.");
376 if(uprv_isNaN(pinf
) == TRUE
) {
377 errln("FAIL: isNaN() returned TRUE for +Infinity.");
380 if(uprv_isNaN(ninf
) == TRUE
) {
381 errln("FAIL: isNaN() returned TRUE for -Infinity.");
384 if(uprv_isNaN(ten
) == TRUE
) {
385 errln("FAIL: isNaN() returned TRUE for 10.0.");
389 //==============================
392 PUtilTest::NaNGT(void)
394 double pinf
= uprv_getInfinity();
395 double ninf
= -uprv_getInfinity();
396 double nan
= uprv_getNaN();
399 if(nan
> nan
!= FALSE
) {
400 logln("WARNING: NaN > NaN returned TRUE, should be FALSE");
403 if(nan
> pinf
!= FALSE
) {
404 logln("WARNING: NaN > +Infinity returned TRUE, should be FALSE");
407 if(nan
> ninf
!= FALSE
) {
408 logln("WARNING: NaN > -Infinity returned TRUE, should be FALSE");
411 if(nan
> ten
!= FALSE
) {
412 logln("WARNING: NaN > 10.0 returned TRUE, should be FALSE");
416 //==============================
419 PUtilTest::NaNLT(void)
421 double pinf
= uprv_getInfinity();
422 double ninf
= -uprv_getInfinity();
423 double nan
= uprv_getNaN();
426 if(nan
< nan
!= FALSE
) {
427 logln("WARNING: NaN < NaN returned TRUE, should be FALSE");
430 if(nan
< pinf
!= FALSE
) {
431 logln("WARNING: NaN < +Infinity returned TRUE, should be FALSE");
434 if(nan
< ninf
!= FALSE
) {
435 logln("WARNING: NaN < -Infinity returned TRUE, should be FALSE");
438 if(nan
< ten
!= FALSE
) {
439 logln("WARNING: NaN < 10.0 returned TRUE, should be FALSE");
443 //==============================
446 PUtilTest::NaNGTE(void)
448 double pinf
= uprv_getInfinity();
449 double ninf
= -uprv_getInfinity();
450 double nan
= uprv_getNaN();
453 if(nan
>= nan
!= FALSE
) {
454 logln("WARNING: NaN >= NaN returned TRUE, should be FALSE");
457 if(nan
>= pinf
!= FALSE
) {
458 logln("WARNING: NaN >= +Infinity returned TRUE, should be FALSE");
461 if(nan
>= ninf
!= FALSE
) {
462 logln("WARNING: NaN >= -Infinity returned TRUE, should be FALSE");
465 if(nan
>= ten
!= FALSE
) {
466 logln("WARNING: NaN >= 10.0 returned TRUE, should be FALSE");
470 //==============================
473 PUtilTest::NaNLTE(void)
475 double pinf
= uprv_getInfinity();
476 double ninf
= -uprv_getInfinity();
477 double nan
= uprv_getNaN();
480 if(nan
<= nan
!= FALSE
) {
481 logln("WARNING: NaN <= NaN returned TRUE, should be FALSE");
484 if(nan
<= pinf
!= FALSE
) {
485 logln("WARNING: NaN <= +Infinity returned TRUE, should be FALSE");
488 if(nan
<= ninf
!= FALSE
) {
489 logln("WARNING: NaN <= -Infinity returned TRUE, should be FALSE");
492 if(nan
<= ten
!= FALSE
) {
493 logln("WARNING: NaN <= 10.0 returned TRUE, should be FALSE");
497 //==============================
500 PUtilTest::NaNE(void)
502 double pinf
= uprv_getInfinity();
503 double ninf
= -uprv_getInfinity();
504 double nan
= uprv_getNaN();
507 if(nan
== nan
!= FALSE
) {
508 logln("WARNING: NaN == NaN returned TRUE, should be FALSE");
511 if(nan
== pinf
!= FALSE
) {
512 logln("WARNING: NaN == +Infinity returned TRUE, should be FALSE");
515 if(nan
== ninf
!= FALSE
) {
516 logln("WARNING: NaN == -Infinity returned TRUE, should be FALSE");
519 if(nan
== ten
!= FALSE
) {
520 logln("WARNING: NaN == 10.0 returned TRUE, should be FALSE");
524 //==============================
527 PUtilTest::NaNNE(void)
529 double pinf
= uprv_getInfinity();
530 double ninf
= -uprv_getInfinity();
531 double nan
= uprv_getNaN();
534 if(nan
!= nan
!= TRUE
) {
535 logln("WARNING: NaN != NaN returned FALSE, should be TRUE");
538 if(nan
!= pinf
!= TRUE
) {
539 logln("WARNING: NaN != +Infinity returned FALSE, should be TRUE");
542 if(nan
!= ninf
!= TRUE
) {
543 logln("WARNING: NaN != -Infinity returned FALSE, should be TRUE");
546 if(nan
!= ten
!= TRUE
) {
547 logln("WARNING: NaN != 10.0 returned FALSE, should be TRUE");