summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu-xetex/test/intltest/tsnmfmt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu-xetex/test/intltest/tsnmfmt.cpp')
-rw-r--r--Build/source/libs/icu-xetex/test/intltest/tsnmfmt.cpp441
1 files changed, 0 insertions, 441 deletions
diff --git a/Build/source/libs/icu-xetex/test/intltest/tsnmfmt.cpp b/Build/source/libs/icu-xetex/test/intltest/tsnmfmt.cpp
deleted file mode 100644
index 57d49ecce4c..00000000000
--- a/Build/source/libs/icu-xetex/test/intltest/tsnmfmt.cpp
+++ /dev/null
@@ -1,441 +0,0 @@
-/***********************************************************************
- * COPYRIGHT:
- * Copyright (c) 1997-2004, International Business Machines Corporation
- * and others. All Rights Reserved.
- ***********************************************************************/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-
-#include "unicode/decimfmt.h"
-#include "tsnmfmt.h"
-#include "putilimp.h"
-#include <float.h>
-#include <stdlib.h>
-
-IntlTestNumberFormat::~IntlTestNumberFormat() {}
-
-static const char * formattableTypeName(Formattable::Type t)
-{
- switch(t) {
- case Formattable::kDate: return "kDate";
- case Formattable::kDouble: return "kDouble";
- case Formattable::kLong: return "kLong";
- case Formattable::kString: return "kString";
- case Formattable::kArray: return "kArray";
- case Formattable::kInt64: return "kInt64";
- default: return "??unknown??";
- }
-}
-
-/**
- * This test does round-trip testing (format -> parse -> format -> parse -> etc.) of
- * NumberFormat.
- */
-void IntlTestNumberFormat::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
-{
-
- if (exec) logln((UnicodeString)"TestSuite NumberFormat");
- switch (index) {
- case 0: name = "createInstance";
- if (exec)
- {
- logln(name);
- fStatus = U_ZERO_ERROR;
- fFormat = NumberFormat::createInstance(fStatus);
- testFormat(/*par*/);
- }
- break;
-
- case 1: name = "DefaultLocale";
- if (exec) testLocale(/*par, */Locale::getDefault(), name);
- break;
-
- case 2: name = "testAvailableLocales";
- if (exec) {
- logln(name);
- testAvailableLocales(/*par*/);
- }
- break;
-
- case 3: name = "monsterTest";
- if (exec) {
- logln(name);
- monsterTest(/*par*/);
- }
- break;
-
- default: name = ""; break;
- }
-}
-
-void
-IntlTestNumberFormat::testLocale(/* char* par, */const Locale& locale, const UnicodeString& localeName)
-{
- const char* name;
-
- fLocale = locale;
- name = "Number test";
- logln((UnicodeString)name + " (" + localeName + ")");
- fStatus = U_ZERO_ERROR;
- fFormat = NumberFormat::createInstance(locale, fStatus);
- testFormat(/* par */);
-
- name = "Currency test";
- logln((UnicodeString)name + " (" + localeName + ")");
- fStatus = U_ZERO_ERROR;
- fFormat = NumberFormat::createCurrencyInstance(locale, fStatus);
- testFormat(/* par */);
-
- name = "Percent test";
- logln((UnicodeString)name + " (" + localeName + ")");
- fStatus = U_ZERO_ERROR;
- fFormat = NumberFormat::createPercentInstance(locale, fStatus);
- testFormat(/* par */);
-}
-
-double IntlTestNumberFormat::randDouble()
-{
- // Assume 8-bit (or larger) rand values. Also assume
- // that the system rand() function is very poor, which it always is.
- // Call srand(currentTime) in intltest to make it truly random.
- double d;
- uint32_t i;
- char* poke = (char*)&d;
- do {
- for (i=0; i < sizeof(double); ++i)
- {
- poke[i] = (char)(rand() & 0xFF);
- }
- } while (uprv_isNaN(d) || uprv_isInfinite(d)
- || !((-DBL_MAX < d && d < DBL_MAX) || (d < -DBL_MIN && DBL_MIN < d)));
-
- return d;
-}
-
-/*
- * Return a random uint32_t
- **/
-uint32_t IntlTestNumberFormat::randLong()
-{
- // Assume 8-bit (or larger) rand values. Also assume
- // that the system rand() function is very poor, which it always is.
- // Call srand(currentTime) in intltest to make it truly random.
- uint32_t d;
- uint32_t i;
- char* poke = (char*)&d;
- for (i=0; i < sizeof(uint32_t); ++i)
- {
- poke[i] = (char)(rand() & 0xFF);
- }
- return d;
-}
-
-
-/* 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 (low > it || it > high);
- return it;
-}
-
-void
-IntlTestNumberFormat::testFormat(/* char* par */)
-{
- if (U_FAILURE(fStatus))
- {
- errln((UnicodeString)"**** FAIL: createXxxInstance failed.");
- if (fFormat != 0)
- errln("**** FAIL: Non-null format returned by createXxxInstance upon failure.");
- delete fFormat;
- fFormat = 0;
- return;
- }
-
- if (fFormat == 0)
- {
- errln((UnicodeString)"**** FAIL: Null format returned by createXxxInstance.");
- return;
- }
-
- UnicodeString str;
-
- // Assume it's a DecimalFormat and get some info
- DecimalFormat *s = (DecimalFormat*)fFormat;
- logln((UnicodeString)" Pattern " + s->toPattern(str));
-
-#if defined(OS390) || defined(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
- tryIt(9.29526819488338e+64); // Ok -- used to fail?
-#else
- tryIt(-2.02147304840132e-100);
- tryIt(3.88057859588817e-096); // Test rounding when only some digits are shown because exponent is close to -maxfrac
- tryIt(-2.64651110485945e+306); // Overflows to +INF when shown as a percent
- tryIt(9.29526819488338e+250); // Ok -- used to fail?
-#endif
-
- // These PASS now, with the sprintf/atof based format-parse.
-
- // 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
- tryIt(-9.18228054496402e+64);
- tryIt(-9.69413034454191e+64);
-#else
- tryIt(-9.18228054496402e+255);
- tryIt(-9.69413034454191e+273);
-#endif
-
-#ifndef OS390
- tryIt(1.234e-200);
- tryIt(-2.3e-168);
-
- tryIt(uprv_getNaN());
- tryIt(uprv_getInfinity());
- tryIt(-uprv_getInfinity());
-#endif
-
- tryIt((int32_t)251887531);
- tryIt(5e-20 / 9);
- tryIt(5e20 / 9);
- tryIt(1.234e-50);
- tryIt(9.99999999999996);
- tryIt(9.999999999999996);
-
- tryIt((int32_t)INT32_MIN);
- tryIt((int32_t)INT32_MAX);
- tryIt((double)INT32_MIN);
- tryIt((double)INT32_MAX);
- tryIt((double)INT32_MIN - 1.0);
- tryIt((double)INT32_MAX + 1.0);
-
- tryIt(5.0 / 9.0 * 1e-20);
- tryIt(4.0 / 9.0 * 1e-20);
- tryIt(5.0 / 9.0 * 1e+20);
- tryIt(4.0 / 9.0 * 1e+20);
-
- tryIt(2147483647.);
- tryIt((int32_t)0);
- tryIt(0.0);
- tryIt((int32_t)1);
- tryIt((int32_t)10);
- tryIt((int32_t)100);
- tryIt((int32_t)-1);
- tryIt((int32_t)-10);
- tryIt((int32_t)-100);
- tryIt((int32_t)-1913860352);
-
- for (int32_t z=0; z<10; ++z)
- {
- double d = randFraction() * 2e10 - 1e10;
- tryIt(d);
- }
-
- double it = getSafeDouble(100000.0);
-
- tryIt(0.0);
- tryIt(it);
- tryIt((int32_t)0);
- tryIt(uprv_floor(it));
- tryIt((int32_t)randLong());
-
- // try again
- it = getSafeDouble(100.0);
- tryIt(it);
- tryIt(uprv_floor(it));
- tryIt((int32_t)randLong());
-
- // try again with very large numbers
- it = getSafeDouble(100000000000.0);
- tryIt(it);
-
- // try again with very large numbers
- // and without going outside of the int32_t range
- it = randFraction() * INT32_MAX;
- tryIt(it);
- tryIt((int32_t)uprv_floor(it));
-
- delete fFormat;
-}
-
-void
-IntlTestNumberFormat::tryIt(double aNumber)
-{
- const int32_t DEPTH = 10;
- Formattable number[DEPTH];
- UnicodeString string[DEPTH];
-
- int32_t numberMatch = 0;
- int32_t stringMatch = 0;
- UnicodeString errMsg;
- int32_t i;
- for (i=0; i<DEPTH; ++i)
- {
- errMsg.truncate(0); // if non-empty, we failed this iteration
- UErrorCode status = U_ZERO_ERROR;
- string[i] = "(n/a)"; // "format was never done" value
- if (i == 0) {
- number[i].setDouble(aNumber);
- } else {
- fFormat->parse(string[i-1], number[i], status);
- if (U_FAILURE(status)) {
- number[i].setDouble(1234.5); // "parse failed" value
- errMsg = "**** FAIL: Parse of " + prettify(string[i-1]) + " failed.";
- --i; // don't show empty last line: "1234.5 F> (n/a) P>"
- break;
- }
- }
- // 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])
- + " returned non-numeric Formattable, type " + UnicodeString(formattableTypeName(number[i].getType()))
- + ", Locale=" + UnicodeString(fLocale.getName())
- + ", longValue=" + number[i].getLong());
- break;
- }
- string[i].truncate(0);
- fFormat->format(number[i].getDouble(), string[i]);
- if (i > 0)
- {
- if (numberMatch == 0 && number[i] == number[i-1])
- numberMatch = i;
- else if (numberMatch > 0 && number[i] != number[i-1])
- {
- errMsg = ("**** FAIL: Numeric mismatch after match.");
- break;
- }
- if (stringMatch == 0 && string[i] == string[i-1])
- stringMatch = i;
- else if (stringMatch > 0 && string[i] != string[i-1])
- {
- errMsg = ("**** FAIL: String mismatch after match.");
- break;
- }
- }
- if (numberMatch > 0 && stringMatch > 0)
- break;
- }
- if (i == DEPTH)
- --i;
-
- if (stringMatch > 2 || numberMatch > 2)
- {
- errMsg = ("**** FAIL: No string and/or number match within 2 iterations.");
- }
-
- if (errMsg.length() != 0)
- {
- for (int32_t k=0; k<=i; ++k)
- {
- logln((UnicodeString)"" + k + ": " + number[k].getDouble() + " F> " +
- prettify(string[k]) + " P> ");
- }
- errln(errMsg);
- }
-}
-
-void
-IntlTestNumberFormat::tryIt(int32_t aNumber)
-{
- Formattable number(aNumber);
- UnicodeString stringNum;
- UErrorCode status = U_ZERO_ERROR;
-
- fFormat->format(number, stringNum, status);
- if (U_FAILURE(status))
- {
- errln("**** FAIL: Formatting " + aNumber);
- return;
- }
- fFormat->parse(stringNum, number, status);
- if (U_FAILURE(status))
- {
- errln("**** FAIL: Parse of " + prettify(stringNum) + " failed.");
- return;
- }
- if (number.getType() != Formattable::kLong)
- {
- errln("**** FAIL: Parse of " + prettify(stringNum)
- + " returned non-long Formattable, type " + UnicodeString(formattableTypeName(number.getType()))
- + ", Locale=" + UnicodeString(fLocale.getName())
- + ", doubleValue=" + number.getDouble()
- + ", longValue=" + number.getLong()
- + ", origValue=" + aNumber
- );
- }
- if (number.getLong() != aNumber) {
- errln("**** FAIL: Parse of " + prettify(stringNum) + " failed. Got:" + number.getLong()
- + " Expected:" + aNumber);
- }
-}
-
-void IntlTestNumberFormat::testAvailableLocales(/* char* par */)
-{
- int32_t count = 0;
- const Locale* locales = NumberFormat::getAvailableLocales(count);
- logln((UnicodeString)"" + count + " available locales");
- if (locales && count)
- {
- UnicodeString name;
- UnicodeString all;
- for (int32_t i=0; i<count; ++i)
- {
- if (i!=0)
- all += ", ";
- all += locales[i].getName();
- }
- logln(all);
- }
- else
- errln((UnicodeString)"**** FAIL: Zero available locales or null array pointer");
-}
-
-void IntlTestNumberFormat::monsterTest(/* char* par */)
-{
- const char *SEP = "============================================================\n";
- int32_t count;
- const Locale* allLocales = NumberFormat::getAvailableLocales(count);
- Locale* locales = (Locale*)allLocales;
- Locale quickLocales[6];
- if (allLocales && count)
- {
- if (quick && count > 6) {
- logln("quick test: testing just 6 locales!");
- count = 6;
- locales = quickLocales;
- locales[0] = allLocales[0];
- locales[1] = allLocales[1];
- locales[2] = allLocales[2];
- // In a quick test, make sure we test locales that use
- // currency prefix, currency suffix, and choice currency
- // logic. Otherwise bugs in these areas can slip through.
- locales[3] = Locale("ar", "AE", "");
- locales[4] = Locale("cs", "CZ", "");
- locales[5] = Locale("en", "IN", "");
- }
- for (int32_t i=0; i<count; ++i)
- {
- UnicodeString name(locales[i].getName(), "");
- logln(SEP);
- testLocale(/* par, */locales[i], name);
- }
- }
-
- logln(SEP);
-}
-
-#endif /* #if !UCONFIG_NO_FORMATTING */