]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/ieeetest/ieeetest.cpp
1 /*******************************************************************************
3 * Copyright (C) 1998-2001, International Business Machines
4 * Corporation and others. All Rights Reserved.
6 *******************************************************************************
9 * Modification History:
11 * Date Name Description
12 * 08/21/98 stephen Creation.
13 *******************************************************************************
17 #include <float.h> // DBL_MAX
20 #include "unicode/utypes.h"
21 #include "unicode/putil.h"
23 //==============================
29 int flags
= IEEETest::kNone
;
31 // parse command line switches
32 for(int i
= 1; i
< argc
; ++i
) {
33 if(argv
[i
][0] == '-') {
36 flags
+= IEEETest::kVerboseMode
;
56 //==============================
59 usage(const char *execName
)
61 fprintf(stdout
, "usage: %s [flags]\n\n"
63 "-v Verbose mode\n", execName
);
66 //==============================
68 IEEETest::IEEETest(int flags
)
75 //==============================
80 //==============================
88 log("Starting IEEETest").logln();
91 // add more tests here
92 errCount
+= runTest("NaN behavior", &IEEETest::testNaN
);
93 errCount
+= runTest("+Infinity behavior", &IEEETest::testPositiveInfinity
);
94 errCount
+= runTest("-Infinity behavior", &IEEETest::testNegativeInfinity
);
95 errCount
+= runTest("Zero behavior", &IEEETest::testZero
);
99 log("IEEETest Passed");
101 log("IEEETest failed with ").log(errCount
)
102 .log(errCount
== 1 ? " error." : " errors.");
106 if(errCount
== 0 && ! (mFlags
& kVerboseMode
))
107 fprintf(stdout
, "\nAll tests passed without error.\n");
112 //==============================
114 IEEETest::runTest(const char *testName
,
115 int (IEEETest::*testFunc
)(void))
117 logln().log("Running test ").log(testName
).logln();
119 int errCount
= (this->*testFunc
)();
121 log("Test ").log(testName
);
125 log(" failed with ").log(errCount
)
126 .log(errCount
== 1 ? " error." : " errors.");
135 //==============================
137 // NaN is weird- comparisons with NaN _always_ return false, with the
138 // exception of !=, which _always_ returns true
140 IEEETest::testNaN(void)
144 log("NaN tests may show that the expected NaN!=NaN etc. is not true on some").logln();
145 log("platforms; however, ICU does not rely on them because it defines").logln();
146 log("and uses uprv_isNaN(). Therefore, most failing NaN tests only report warnings.").logln();
148 errCount
+= runTest("isNaN", &IEEETest::testIsNaN
);
149 errCount
+= runTest("NaN >", &IEEETest::NaNGT
);
150 errCount
+= runTest("NaN <", &IEEETest::NaNLT
);
151 errCount
+= runTest("NaN >=", &IEEETest::NaNGTE
);
152 errCount
+= runTest("NaN <=", &IEEETest::NaNLTE
);
153 errCount
+= runTest("NaN ==", &IEEETest::NaNE
);
154 errCount
+= runTest("NaN !=", &IEEETest::NaNNE
);
156 log("End of NaN tests.").logln();
161 //==============================
164 IEEETest::testPositiveInfinity(void)
167 double pinf
= uprv_getInfinity();
168 double ninf
= -uprv_getInfinity();
171 if(uprv_isInfinite(pinf
) != TRUE
) {
172 err("FAIL: isInfinite(+Infinity) returned FALSE, should be TRUE.").errln();
176 if(uprv_isPositiveInfinity(pinf
) != TRUE
) {
177 err("FAIL: isPositiveInfinity(+Infinity) returned FALSE, should be TRUE.").errln();
181 if(uprv_isNegativeInfinity(pinf
) != FALSE
) {
182 err("FAIL: isNegativeInfinity(+Infinity) returned TRUE, should be FALSE.").errln();
186 if(pinf
> DBL_MAX
!= TRUE
) {
187 err("FAIL: +Infinity > DBL_MAX returned FALSE, should be TRUE.").errln();
191 if(pinf
> DBL_MIN
!= TRUE
) {
192 err("FAIL: +Infinity > DBL_MIN returned FALSE, should be TRUE.").errln();
196 if(pinf
> ninf
!= TRUE
) {
197 err("FAIL: +Infinity > -Infinity returned FALSE, should be TRUE.").errln();
201 if(pinf
> ten
!= TRUE
) {
202 err("FAIL: +Infinity > 10.0 returned FALSE, should be TRUE.").errln();
209 //==============================
212 IEEETest::testNegativeInfinity(void)
215 double pinf
= uprv_getInfinity();
216 double ninf
= -uprv_getInfinity();
219 if(uprv_isInfinite(ninf
) != TRUE
) {
220 err("FAIL: isInfinite(-Infinity) returned FALSE, should be TRUE.").errln();
224 if(uprv_isNegativeInfinity(ninf
) != TRUE
) {
225 err("FAIL: isNegativeInfinity(-Infinity) returned FALSE, should be TRUE.").errln();
229 if(uprv_isPositiveInfinity(ninf
) != FALSE
) {
230 err("FAIL: isPositiveInfinity(-Infinity) returned TRUE, should be FALSE.").errln();
234 if(ninf
< DBL_MAX
!= TRUE
) {
235 err("FAIL: -Infinity < DBL_MAX returned FALSE, should be TRUE.").errln();
239 if(ninf
< DBL_MIN
!= TRUE
) {
240 err("FAIL: -Infinity < DBL_MIN returned FALSE, should be TRUE.").errln();
244 if(ninf
< pinf
!= TRUE
) {
245 err("FAIL: -Infinity < +Infinity returned FALSE, should be TRUE.").errln();
249 if(ninf
< ten
!= TRUE
) {
250 err("FAIL: -Infinity < 10.0 returned FALSE, should be TRUE.").errln();
257 //==============================
260 // -0.0 == 0.0 == TRUE
261 // -0.0 < 0.0 == FALSE
262 // generating -0.0 must be done at runtime. compiler apparently ignores sign?
264 IEEETest::testZero(void)
267 // volatile is used to fake out the compiler optimizer. We really want to divide by 0.
268 volatile double pzero
= 0.0;
269 volatile double nzero
= 0.0;
273 if(pzero
== nzero
!= TRUE
) {
274 err("FAIL: 0.0 == -0.0 returned FALSE, should be TRUE.").errln();
278 if(pzero
> nzero
!= FALSE
) {
279 err("FAIL: 0.0 > -0.0 returned TRUE, should be FALSE.").errln();
283 if(pzero
>= nzero
!= TRUE
) {
284 err("FAIL: 0.0 >= -0.0 returned FALSE, should be TRUE.").errln();
288 if(pzero
< nzero
!= FALSE
) {
289 err("FAIL: 0.0 < -0.0 returned TRUE, should be FALSE.").errln();
293 if(pzero
<= nzero
!= TRUE
) {
294 err("FAIL: 0.0 <= -0.0 returned FALSE, should be TRUE.").errln();
298 if(uprv_isInfinite(1/pzero
) != TRUE
) {
299 err("FAIL: isInfinite(1/0.0) returned FALSE, should be TRUE.").errln();
303 if(uprv_isInfinite(1/nzero
) != TRUE
) {
304 err("FAIL: isInfinite(1/-0.0) returned FALSE, should be TRUE.").errln();
308 if(uprv_isPositiveInfinity(1/pzero
) != TRUE
) {
309 err("FAIL: isPositiveInfinity(1/0.0) returned FALSE, should be TRUE.").errln();
313 if(uprv_isNegativeInfinity(1/nzero
) != TRUE
) {
314 err("FAIL: isNegativeInfinity(1/-0.0) returned FALSE, should be TRUE.").errln();
321 //==============================
324 IEEETest::testIsNaN(void)
327 double pinf
= uprv_getInfinity();
328 double ninf
= -uprv_getInfinity();
329 double nan
= uprv_getNaN();
332 if(uprv_isNaN(nan
) == FALSE
) {
333 err("FAIL: isNaN() returned FALSE for NaN.").errln();
337 if(uprv_isNaN(pinf
) == TRUE
) {
338 err("FAIL: isNaN() returned TRUE for +Infinity.").errln();
342 if(uprv_isNaN(ninf
) == TRUE
) {
343 err("FAIL: isNaN() returned TRUE for -Infinity.").errln();
347 if(uprv_isNaN(ten
) == TRUE
) {
348 err("FAIL: isNaN() returned TRUE for 10.0.").errln();
355 //==============================
358 IEEETest::NaNGT(void)
360 double pinf
= uprv_getInfinity();
361 double ninf
= -uprv_getInfinity();
362 double nan
= uprv_getNaN();
366 if(nan
> nan
!= FALSE
) {
367 log("WARNING: NaN > NaN returned TRUE, should be FALSE").logln();
370 if(nan
> pinf
!= FALSE
) {
371 log("WARNING: NaN > +Infinity returned TRUE, should be FALSE").logln();
374 if(nan
> ninf
!= FALSE
) {
375 log("WARNING: NaN > -Infinity returned TRUE, should be FALSE").logln();
378 if(nan
> ten
!= FALSE
) {
379 log("WARNING: NaN > 10.0 returned TRUE, should be FALSE").logln();
385 //==============================
388 IEEETest::NaNLT(void)
390 double pinf
= uprv_getInfinity();
391 double ninf
= -uprv_getInfinity();
392 double nan
= uprv_getNaN();
396 if(nan
< nan
!= FALSE
) {
397 log("WARNING: NaN < NaN returned TRUE, should be FALSE").logln();
400 if(nan
< pinf
!= FALSE
) {
401 log("WARNING: NaN < +Infinity returned TRUE, should be FALSE").logln();
404 if(nan
< ninf
!= FALSE
) {
405 log("WARNING: NaN < -Infinity returned TRUE, should be FALSE").logln();
408 if(nan
< ten
!= FALSE
) {
409 log("WARNING: NaN < 10.0 returned TRUE, should be FALSE").logln();
415 //==============================
418 IEEETest::NaNGTE(void)
420 double pinf
= uprv_getInfinity();
421 double ninf
= -uprv_getInfinity();
422 double nan
= uprv_getNaN();
426 if(nan
>= nan
!= FALSE
) {
427 log("WARNING: NaN >= NaN returned TRUE, should be FALSE").logln();
430 if(nan
>= pinf
!= FALSE
) {
431 log("WARNING: NaN >= +Infinity returned TRUE, should be FALSE").logln();
434 if(nan
>= ninf
!= FALSE
) {
435 log("WARNING: NaN >= -Infinity returned TRUE, should be FALSE").logln();
438 if(nan
>= ten
!= FALSE
) {
439 log("WARNING: NaN >= 10.0 returned TRUE, should be FALSE").logln();
445 //==============================
448 IEEETest::NaNLTE(void)
450 double pinf
= uprv_getInfinity();
451 double ninf
= -uprv_getInfinity();
452 double nan
= uprv_getNaN();
456 if(nan
<= nan
!= FALSE
) {
457 log("WARNING: NaN <= NaN returned TRUE, should be FALSE").logln();
460 if(nan
<= pinf
!= FALSE
) {
461 log("WARNING: NaN <= +Infinity returned TRUE, should be FALSE").logln();
464 if(nan
<= ninf
!= FALSE
) {
465 log("WARNING: NaN <= -Infinity returned TRUE, should be FALSE").logln();
468 if(nan
<= ten
!= FALSE
) {
469 log("WARNING: NaN <= 10.0 returned TRUE, should be FALSE").logln();
475 //==============================
480 double pinf
= uprv_getInfinity();
481 double ninf
= -uprv_getInfinity();
482 double nan
= uprv_getNaN();
486 if(nan
== nan
!= FALSE
) {
487 log("WARNING: NaN == NaN returned TRUE, should be FALSE").logln();
490 if(nan
== pinf
!= FALSE
) {
491 log("WARNING: NaN == +Infinity returned TRUE, should be FALSE").logln();
494 if(nan
== ninf
!= FALSE
) {
495 log("WARNING: NaN == -Infinity returned TRUE, should be FALSE").logln();
498 if(nan
== ten
!= FALSE
) {
499 log("WARNING: NaN == 10.0 returned TRUE, should be FALSE").logln();
505 //==============================
508 IEEETest::NaNNE(void)
510 double pinf
= uprv_getInfinity();
511 double ninf
= -uprv_getInfinity();
512 double nan
= uprv_getNaN();
516 if(nan
!= nan
!= TRUE
) {
517 log("WARNING: NaN != NaN returned FALSE, should be TRUE").logln();
520 if(nan
!= pinf
!= TRUE
) {
521 log("WARNING: NaN != +Infinity returned FALSE, should be TRUE").logln();
524 if(nan
!= ninf
!= TRUE
) {
525 log("WARNING: NaN != -Infinity returned FALSE, should be TRUE").logln();
528 if(nan
!= ten
!= TRUE
) {
529 log("WARNING: NaN != 10.0 returned FALSE, should be TRUE").logln();
535 //==============================
538 IEEETest::log(char c
)
540 if(mFlags
& kVerboseMode
) {
542 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
544 mNeedLogIndent
= FALSE
;
551 //==============================
554 IEEETest::log(const char *s
)
556 if(mFlags
& kVerboseMode
) {
558 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
560 mNeedLogIndent
= FALSE
;
562 fprintf(stdout
, "%s", s
);
567 //==============================
572 if(mFlags
& kVerboseMode
) {
574 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
576 mNeedLogIndent
= FALSE
;
578 fprintf(stdout
, "%d", i
);
583 //==============================
586 IEEETest::log(long l
)
588 if(mFlags
& kVerboseMode
) {
590 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
592 mNeedLogIndent
= FALSE
;
594 fprintf(stdout
, "%ld", l
);
599 //==============================
602 IEEETest::log(double d
)
604 if(mFlags
& kVerboseMode
) {
606 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
608 mNeedLogIndent
= FALSE
;
610 fprintf(stdout
, "%g", d
);
615 //==============================
618 IEEETest::logln(void)
620 if(mFlags
& kVerboseMode
)
622 mNeedLogIndent
= TRUE
;
626 //==============================
629 IEEETest::err(char c
)
632 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
634 mNeedErrIndent
= FALSE
;
640 //==============================
643 IEEETest::err(const char *s
)
646 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
648 mNeedErrIndent
= FALSE
;
650 fprintf(stderr
, "%s", s
);
654 //==============================
660 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
662 mNeedErrIndent
= FALSE
;
664 fprintf(stderr
, "%d", i
);
668 //==============================
671 IEEETest::err(long l
)
674 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
676 mNeedErrIndent
= FALSE
;
678 fprintf(stderr
, "%ld", l
);
682 //==============================
685 IEEETest::err(double d
)
688 for(int j
= 0; j
< 2 * getTestLevel(); ++j
)
690 mNeedErrIndent
= FALSE
;
692 fprintf(stderr
, "%g", d
);
696 //==============================
699 IEEETest::errln(void)
702 mNeedErrIndent
= TRUE
;