]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/tsnmfmt.cpp
ICU-491.11.1.tar.gz
[apple/icu.git] / icuSources / test / intltest / tsnmfmt.cpp
index 1b126603e04bfa5c36a2c00748da8747e4d9ebb4..9e417a3c40cf663634083f49d2b456d9996a14e2 100644 (file)
@@ -1,8 +1,8 @@
-/********************************************************************
+/***********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2003, International Business Machines Corporation and
- * others. All Rights Reserved.
- ********************************************************************/
+ * Copyright (c) 1997-2011, International Business Machines Corporation
+ * and others. All Rights Reserved.
+ ***********************************************************************/
 
 #include "unicode/utypes.h"
 
 
 #include "unicode/decimfmt.h"
 #include "tsnmfmt.h"
+#include "putilimp.h"
+#include "cstring.h"
 #include <float.h>
+#include <stdlib.h>
+
+IntlTestNumberFormat::~IntlTestNumberFormat() {}
 
 static const char * formattableTypeName(Formattable::Type t)
 {
@@ -20,6 +25,7 @@ static const char * formattableTypeName(Formattable::Type t)
   case Formattable::kLong: return "kLong";
   case Formattable::kString: return "kString";
   case Formattable::kArray: return "kArray";
+  case Formattable::kInt64: return "kInt64";
   default: return "??unknown??";
   }
 }
@@ -88,6 +94,14 @@ IntlTestNumberFormat::testLocale(/* char* par, */const Locale& locale, const Uni
     fStatus = U_ZERO_ERROR;
     fFormat = NumberFormat::createPercentInstance(locale, fStatus);
     testFormat(/* par */);
+       
+    if (uprv_strcmp(locale.getName(), "en_US_POSIX") != 0) {
+        name = "Scientific test";
+        logln((UnicodeString)name + " (" + localeName + ")");
+        fStatus = U_ZERO_ERROR;
+        fFormat = NumberFormat::createScientificInstance(locale, fStatus);
+        testFormat(/* par */);
+    }
 }
 
 double IntlTestNumberFormat::randDouble()
@@ -128,13 +142,15 @@ uint32_t IntlTestNumberFormat::randLong()
 }
 
 
-/* Make sure that we don't get something too large and multiply into infinity. */
+/* Make sure that we don't get something too large and multiply into infinity.
+   @param smallerThanMax the requested maximum value smaller than DBL_MAX */
 double IntlTestNumberFormat::getSafeDouble(double smallerThanMax) {
     double it;
+    double high = (DBL_MAX/smallerThanMax)/10.0;
+    double low = -high;
     do {
         it = randDouble();
-    } while (-DBL_MAX/smallerThanMax > it || it > DBL_MAX/smallerThanMax);
-    it *= smallerThanMax/10.0;
+    } while (low > it || it > high);
     return it;
 }
 
@@ -143,7 +159,7 @@ IntlTestNumberFormat::testFormat(/* char* par */)
 {
     if (U_FAILURE(fStatus))
     { 
-        errln((UnicodeString)"**** FAIL: createXxxInstance failed.");
+        dataerrln((UnicodeString)"**** FAIL: createXxxInstance failed. - " + u_errorName(fStatus));
         if (fFormat != 0)
             errln("**** FAIL: Non-null format returned by createXxxInstance upon failure.");
         delete fFormat;
@@ -163,7 +179,7 @@ IntlTestNumberFormat::testFormat(/* char* par */)
     DecimalFormat *s = (DecimalFormat*)fFormat;
     logln((UnicodeString)"  Pattern " + s->toPattern(str));
 
-#if defined(OS390) || defined(OS400)
+#if U_PF_OS390 <= U_PLATFORM && U_PLATFORM <= U_PF_OS400
     tryIt(-2.02147304840132e-68);
     tryIt(3.88057859588817e-68); // Test rounding when only some digits are shown because exponent is close to -maxfrac
     tryIt(-2.64651110485945e+65); // Overflows to +INF when shown as a percent
@@ -180,7 +196,7 @@ IntlTestNumberFormat::testFormat(/* char* par */)
     // These fail due to round-off
     // The least significant digit drops by one during each format-parse cycle.
     // Both numbers DON'T have a round-off problem when multiplied by 100! (shown as %)
-#ifdef OS390
+#if U_PLATFORM == U_PF_OS390
     tryIt(-9.18228054496402e+64);
     tryIt(-9.69413034454191e+64);
 #else
@@ -188,7 +204,7 @@ IntlTestNumberFormat::testFormat(/* char* par */)
     tryIt(-9.69413034454191e+273);
 #endif
 
-#ifndef OS390
+#if U_PLATFORM != U_PF_OS390
     tryIt(1.234e-200);
     tryIt(-2.3e-168);
 
@@ -203,6 +219,8 @@ IntlTestNumberFormat::testFormat(/* char* par */)
     tryIt(1.234e-50);
     tryIt(9.99999999999996);
     tryIt(9.999999999999996);
+       
+       tryIt(5.06e-27);
 
     tryIt((int32_t)INT32_MIN);
     tryIt((int32_t)INT32_MAX);
@@ -290,6 +308,8 @@ IntlTestNumberFormat::tryIt(double aNumber)
         // Convert from long to double
         if (number[i].getType() == Formattable::kLong)
             number[i].setDouble(number[i].getLong());
+        else if (number[i].getType() == Formattable::kInt64)
+            number[i].setDouble((double)number[i].getInt64());
         else if (number[i].getType() != Formattable::kDouble)
         {
             errMsg = ("**** FAIL: Parse of " + prettify(string[i-1])
@@ -392,7 +412,7 @@ void IntlTestNumberFormat::testAvailableLocales(/* char* par */)
         logln(all);
     }
     else
-        errln((UnicodeString)"**** FAIL: Zero available locales or null array pointer");
+        dataerrln((UnicodeString)"**** FAIL: Zero available locales or null array pointer");
 }
 
 void IntlTestNumberFormat::monsterTest(/* char* par */)