X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/73c04bcfe1096173b00431f0cdc742894b15eef0..a0b4f637ba1a6c3c5651b61a69303b029bacf7d3:/icuSources/test/intltest/numrgts.cpp?ds=sidebyside diff --git a/icuSources/test/intltest/numrgts.cpp b/icuSources/test/intltest/numrgts.cpp index cb82463c..772bbe8b 100644 --- a/icuSources/test/intltest/numrgts.cpp +++ b/icuSources/test/intltest/numrgts.cpp @@ -1,6 +1,5 @@ /*********************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2006, International Business Machines Corporation + * Copyright (c) 1997-2014, International Business Machines Corporation * and others. All Rights Reserved. ***********************************************************************/ @@ -30,10 +29,10 @@ public: virtual UnicodeString& format( double number, UnicodeString& toAppendTo, - FieldPosition& pos, + FieldPositionIterator* posIter, UErrorCode& status) const { - return NumberFormat::format(number, toAppendTo, pos, status); + return NumberFormat::format(number, toAppendTo, posIter, status); } /* Just keep this here to make some of the compilers happy */ @@ -169,17 +168,27 @@ NumberFormatRegressionTest::runIndexedTest( int32_t index, UBool exec, const cha CASE(58,Test4243011); CASE(59,Test4243108); CASE(60,TestJ691); + CASE(61,Test8199); + CASE(62,Test9109); + CASE(63,Test9780); + CASE(64,Test9677); + CASE(65,Test10361); default: name = ""; break; } } UBool -NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const Locale& l) +NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const Locale& l, UBool possibleDataError) { if(U_FAILURE(status)) { - errln(UnicodeString("FAIL: ", "") + msg - + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),"")); + if (possibleDataError) { + dataerrln(UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),"")); + } else { + errcheckln(status, UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),"")); + } return TRUE; } @@ -187,11 +196,16 @@ NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, } UBool -NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const char *l) +NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const char *l, UBool possibleDataError) { if(U_FAILURE(status)) { - errln(UnicodeString("FAIL: ", "") + msg - + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, "")); + if (possibleDataError) { + dataerrln(UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, "")); + } else { + errcheckln(status, UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, "")); + } return TRUE; } @@ -199,11 +213,16 @@ NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, } UBool -NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg) +NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, UBool possibleDataError) { if(U_FAILURE(status)) { - errln(UnicodeString("FAIL: ", "") + msg - + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); + if (possibleDataError) { + dataerrln(UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); + } else { + errcheckln(status, UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); + } return TRUE; } @@ -266,23 +285,24 @@ void NumberFormatRegressionTest::Test4088161 (void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); - failure(status, "new DecimalFormat", ""); - double d = 100; - df->setMinimumFractionDigits(0); - df->setMaximumFractionDigits(16); - UnicodeString sBuf1; - FieldPosition fp1(0); - logln(UnicodeString("d = ") + d); - logln("maxFractionDigits = " + df->getMaximumFractionDigits()); - - logln(" format(d) = '" + df->format(d, sBuf1, fp1) + "'"); - df->setMaximumFractionDigits(17); - UnicodeString sBuf2; - FieldPosition fp2(0); - logln("maxFractionDigits = " + df->getMaximumFractionDigits()); - sBuf2 = df->format(d, sBuf2, fp2); - if(sBuf2 != "100") - errln(" format(d) = '" + sBuf2 + "'"); + if (!failure(status, "new DecimalFormat", "")) { + double d = 100; + df->setMinimumFractionDigits(0); + df->setMaximumFractionDigits(16); + UnicodeString sBuf1; + FieldPosition fp1(0); + logln(UnicodeString("d = ") + d); + logln(UnicodeString("maxFractionDigits = ") + df->getMaximumFractionDigits()); + + logln(" format(d) = '" + df->format(d, sBuf1, fp1) + "'"); + df->setMaximumFractionDigits(17); + UnicodeString sBuf2; + FieldPosition fp2(0); + logln(UnicodeString("maxFractionDigits = ") + df->getMaximumFractionDigits()); + sBuf2 = df->format(d, sBuf2, fp2); + if(sBuf2 != "100") + errln(" format(d) = '" + sBuf2 + "'"); + } delete df; } @@ -381,7 +401,7 @@ NumberFormatRegressionTest::assignFloatValue(float returnfloat) logln(UnicodeString(" VALUE ") + returnfloat); UErrorCode status = U_ZERO_ERROR; NumberFormat *nfcommon = NumberFormat::createCurrencyInstance(Locale::getUS(), status); - if (failure(status, "NumberFormat::createCurrencyInstance", Locale::getUS())){ + if (failure(status, "NumberFormat::createCurrencyInstance", Locale::getUS(), TRUE)){ delete nfcommon; return returnfloat; } @@ -455,7 +475,7 @@ void NumberFormatRegressionTest::Test4071492 (void) double x = 0.00159999; UErrorCode status = U_ZERO_ERROR; NumberFormat *nf = NumberFormat::createInstance(status); - if (failure(status, "NumberFormat::createInstance", Locale::getUS())) { + if (failure(status, "NumberFormat::createInstance", Locale::getUS(), TRUE)) { delete nf; return; } @@ -483,20 +503,19 @@ void NumberFormatRegressionTest::Test4086575(void) // TODO: There is not a good way to find out that the creation of this number format has // failed. Major rewiring of format construction proposed. if(U_FAILURE(status)) { - errln("Something is wrong with French number format - it should not fallback. Exitting"); + dataerrln("Something is wrong with French number format - it should not fallback. Exitting - %s", u_errorName(status)); delete nf1; return; } failure(status, "NumberFormat::createInstance", Locale::getFrance()); - + // C++ workaround to make sure cast works - // Wouldn't dynamic_cast be great? - if(nf1->getDynamicClassID() != DecimalFormat::getStaticClassID()) { + DecimalFormat *nf = dynamic_cast(nf1); + if(nf == NULL) { errln("NumberFormat::createInstance returned incorrect type."); return; } - DecimalFormat *nf = (DecimalFormat*) nf1; UnicodeString temp; logln("nf toPattern1: " + nf->toPattern(temp)); logln("nf toLocPattern1: " + nf->toLocalizedPattern(temp)); @@ -563,7 +582,7 @@ void NumberFormatRegressionTest::Test4068693(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -619,7 +638,7 @@ void NumberFormatRegressionTest::Test4087251 (void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -685,7 +704,7 @@ void NumberFormatRegressionTest::Test4090504 (void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -697,8 +716,8 @@ void NumberFormatRegressionTest::Test4090504 (void) df->setMaximumFractionDigits(i); //sb = new StringBuffer(""); fp.setField(0); - logln(" getMaximumFractionDigits() = " + i); - logln(" formated: " + df->format(d, sb, fp)); + logln(UnicodeString(" getMaximumFractionDigits() = ") + i); + logln(UnicodeString(" formated: ") + df->format(d, sb, fp)); } /*} catch (Exception foo) { errln("Bug 4090504 regression test failed. Message : " + foo.getMessage()); @@ -714,7 +733,7 @@ void NumberFormatRegressionTest::Test4095713 (void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -741,7 +760,7 @@ void NumberFormatRegressionTest::Test4092561 (void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -767,7 +786,7 @@ void NumberFormatRegressionTest::Test4092480 (void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *dfFoo = new DecimalFormat(UnicodeString("000"), status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete dfFoo; return; } @@ -823,15 +842,15 @@ void NumberFormatRegressionTest::Test4087244 (void) { Locale *de = new Locale(loc); NumberFormat *nf = NumberFormat::createCurrencyInstance(*de, status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); delete nf; return; } - if (nf->getDynamicClassID() != DecimalFormat::getStaticClassID()) { + DecimalFormat *df = dynamic_cast(nf); + if(df == NULL) { errln("expected DecimalFormat!"); return; } - DecimalFormat *df = (DecimalFormat*) nf; const DecimalFormatSymbols *sym = df->getDecimalFormatSymbols(); UnicodeString decSep = sym->getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); UnicodeString monSep = sym->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); @@ -869,14 +888,14 @@ void NumberFormatRegressionTest::Test4070798 (void) /* User error : String expectedDefault = "-5\u00a0789,987"; - String expectedCurrency = "5\u00a0789,98 F"; + String expectedCurrency = "5\u00a0789,98\u00a0F"; String expectedPercent = "-578\u00a0998%"; */ UChar chars1 [] = { 0x2d, 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x38, 0x38 }; UChar chars2 [] = { - 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x20, 0x46 + 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x00a0, 0x46 }; UChar chars3 [] = { 0x2d, 0x35, 0x37, 0x38, 0x00a0, 0x39, 0x39, 0x39, 0x00a0, 0x25 @@ -888,9 +907,10 @@ void NumberFormatRegressionTest::Test4070798 (void) UErrorCode status = U_ZERO_ERROR; char loc[256]={0}; int len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); + (void)len; // Suppress set but not used warning. formatter = NumberFormat::createInstance(Locale(loc), status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); delete formatter; return; } @@ -945,14 +965,14 @@ void NumberFormatRegressionTest::Test4071005 (void) UnicodeString tempString; /* User error : String expectedDefault = "-5\u00a0789,987"; - String expectedCurrency = "5\u00a0789,98 $"; + String expectedCurrency = "5\u00a0789,98\u00a0$"; String expectedPercent = "-578\u00a0998%"; */ UChar chars1 [] = { 0x2d, 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x38, 0x38 }; UChar chars2 [] = { - 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x20, 0x24 + 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x00a0, 0x24 }; UChar chars3 [] = { 0x2d, 0x35, 0x37, 0x38, 0x00a0, 0x39, 0x39, 0x39, 0x00a0, 0x25 @@ -963,7 +983,7 @@ void NumberFormatRegressionTest::Test4071005 (void) UErrorCode status = U_ZERO_ERROR; formatter = NumberFormat::createInstance(Locale::getCanadaFrench(), status); - if (failure(status, "NumberFormat::createNumberInstance", Locale::getCanadaFrench())){ + if (failure(status, "NumberFormat::createNumberInstance", Locale::getCanadaFrench(), TRUE)){ delete formatter; return; }; @@ -1021,14 +1041,17 @@ void NumberFormatRegressionTest::Test4071014 (void) String expectedPercent = "-578.998%"; */ UnicodeString expectedDefault("-5.789,988"); - UnicodeString expectedCurrency("5.789,99 DM"); - UnicodeString expectedPercent("-578.999%"); + UnicodeString expectedCurrency("5.789,99\\u00A0DM"); + UnicodeString expectedPercent("-578.999\\u00A0%"); + + expectedCurrency = expectedCurrency.unescape(); + expectedPercent = expectedPercent.unescape(); UErrorCode status = U_ZERO_ERROR; char loc[256]={0}; uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); formatter = NumberFormat::createInstance(Locale(loc), status); - if (failure(status, "NumberFormat::createNumberInstance", loc)){ + if (failure(status, "NumberFormat::createNumberInstance", loc, TRUE)){ delete formatter; return; } @@ -1082,11 +1105,11 @@ void NumberFormatRegressionTest::Test4071859 (void) UnicodeString tempString; /* user error : String expectedDefault = "-5.789,987"; - String expectedCurrency = "-L. 5.789,98"; + String expectedCurrency = "-L.\\u00A05.789,98"; String expectedPercent = "-578.998%"; */ UnicodeString expectedDefault("-5.789,988"); - UnicodeString expectedCurrency("-\\u20A4 5.790"); + UnicodeString expectedCurrency("-ITL\\u00A05.790", -1, US_INV); UnicodeString expectedPercent("-578.999%"); expectedCurrency = expectedCurrency.unescape(); @@ -1094,7 +1117,7 @@ void NumberFormatRegressionTest::Test4071859 (void) char loc[256]={0}; uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); formatter = NumberFormat::createInstance(Locale(loc), status); - if (failure(status, "NumberFormat::createNumberInstance")){ + if (failure(status, "NumberFormat::createNumberInstance", TRUE)){ delete formatter; return; }; @@ -1145,26 +1168,27 @@ void NumberFormatRegressionTest::Test4093610(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat("#0.#", status); - failure(status, "new DecimalFormat"); - UnicodeString s("12.4"); - roundingTest(df, 12.35, s); - roundingTest(df, 12.45, s); - s = "12.5"; - roundingTest(df, 12.452,s); - s = "12.6"; - roundingTest(df, 12.55, s); - roundingTest(df, 12.65, s); - s = "12.7"; - roundingTest(df, 12.652,s); - s = "12.8"; - roundingTest(df, 12.75, s); - roundingTest(df, 12.752,s); - roundingTest(df, 12.85, s); - s = "12.9"; - roundingTest(df, 12.852,s); - s = "13"; - roundingTest(df, 12.95, s); - roundingTest(df, 12.952,s); + if (!failure(status, "new DecimalFormat")) { + UnicodeString s("12.4"); + roundingTest(df, 12.35, s); + roundingTest(df, 12.45, s); + s = "12.5"; + roundingTest(df, 12.452,s); + s = "12.6"; + roundingTest(df, 12.55, s); + roundingTest(df, 12.65, s); + s = "12.7"; + roundingTest(df, 12.652,s); + s = "12.8"; + roundingTest(df, 12.75, s); + roundingTest(df, 12.752,s); + roundingTest(df, 12.85, s); + s = "12.9"; + roundingTest(df, 12.852,s); + s = "13"; + roundingTest(df, 12.95, s); + roundingTest(df, 12.952,s); + } delete df; } @@ -1211,7 +1235,7 @@ void NumberFormatRegressionTest::Test4074454(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *fmt = new DecimalFormat("#,#00.00;-#.#", status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete fmt; return; } @@ -1223,7 +1247,7 @@ void NumberFormatRegressionTest::Test4074454(void) FieldPosition pos(FieldPosition::DONT_CARE); tempString = newFmt->format(3456.78, tempString, pos); if (tempString != UnicodeString("3,456.78 p'ieces")) - errln("Failed! 3456.78 p'ieces expected, but got : " + tempString); + dataerrln("Failed! 3456.78 p'ieces expected, but got : " + tempString); /*} catch (Exception foo) { errln("An exception was thrown for any inconsistent negative pattern."); }*/ @@ -1280,13 +1304,13 @@ void NumberFormatRegressionTest::Test4101481(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *sdf = new DecimalFormat(UnicodeString("#,##0"), status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete sdf; return; } failure(status, "new DecimalFormat"); if (sdf->getMinimumIntegerDigits() != 1) - errln("Minimum integer digits : " + sdf->getMinimumIntegerDigits()); + errln(UnicodeString("Minimum integer digits : ") + sdf->getMinimumIntegerDigits()); delete sdf; } /* @bug 4052223 (API addition request A27) @@ -1298,7 +1322,7 @@ void NumberFormatRegressionTest::Test4052223(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *fmt = new DecimalFormat(UnicodeString("#,#00.00"), status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete fmt; return; } @@ -1382,7 +1406,7 @@ void NumberFormatRegressionTest::Test4108738(void) failure(status, "new DecimalFormatSymbols"); DecimalFormat *df = new DecimalFormat("#,##0.###", syms, status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -1421,7 +1445,7 @@ void NumberFormatRegressionTest::Test4106658(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); // Corrected; see 4147706 if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -1432,7 +1456,7 @@ void NumberFormatRegressionTest::Test4106658(void) UnicodeString temp; FieldPosition pos(FieldPosition::DONT_CARE); -#if defined(U_HPUX) +#if U_PLATFORM == U_PF_HPUX d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword #else d1 *= -1.0; // Some compilers have a problem with defining -0.0 @@ -1457,7 +1481,7 @@ void NumberFormatRegressionTest::Test4106662(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -1491,7 +1515,7 @@ void NumberFormatRegressionTest::Test4114639(void) UErrorCode status = U_ZERO_ERROR; NumberFormat *format = NumberFormat::createInstance(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); delete format; return; } @@ -1516,7 +1540,7 @@ void NumberFormatRegressionTest::Test4106664(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -1550,7 +1574,7 @@ void NumberFormatRegressionTest::Test4106667(void) UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete df; return; } @@ -1563,7 +1587,7 @@ void NumberFormatRegressionTest::Test4106667(void) FieldPosition pos(FieldPosition::DONT_CARE); logln("pattern: \"" + df->toPattern(temp) + "\""); -#if defined(U_HPUX) +#if U_PLATFORM == U_PF_HPUX d = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword #else d *= -1.0; // Some compilers have a problem with defining -0.0 @@ -1579,7 +1603,7 @@ void NumberFormatRegressionTest::Test4106667(void) /* @bug 4110936 * DecimalFormat.setMaximumIntegerDigits() works incorrectly. */ -#ifdef OS390 +#if U_PLATFORM == U_PF_OS390 # define MAX_INT_DIGITS 70 #else # define MAX_INT_DIGITS 128 @@ -1590,7 +1614,7 @@ void NumberFormatRegressionTest::Test4110936(void) UErrorCode status = U_ZERO_ERROR; NumberFormat *nf = NumberFormat::createInstance(status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); delete nf; return; } @@ -1598,7 +1622,7 @@ void NumberFormatRegressionTest::Test4110936(void) nf->setMaximumIntegerDigits(MAX_INT_DIGITS); logln("setMaximumIntegerDigits(MAX_INT_DIGITS)"); if (nf->getMaximumIntegerDigits() != MAX_INT_DIGITS) - errln("getMaximumIntegerDigits() returns " + + errln(UnicodeString("getMaximumIntegerDigits() returns ") + nf->getMaximumIntegerDigits()); delete nf; @@ -1622,15 +1646,21 @@ void NumberFormatRegressionTest::Test4122840(void) NULL/*"java.text.resources.LocaleElements"*/, locales[i], status); failure(status, "new ResourceBundle"); - ResourceBundle numPat = rb->get("NumberPatterns", status); - failure(status, "new ResourceBundle(NumberPatterns)"); - // + ResourceBundle numPat = rb->getWithFallback("NumberElements", status); + failure(status, "rb.get(NumberElements)"); + numPat = numPat.getWithFallback("latn",status); + failure(status, "rb.get(latn)"); + numPat = numPat.getWithFallback("patterns",status); + failure(status, "rb.get(patterns)"); + numPat = numPat.getWithFallback("currencyFormat",status); + failure(status, "rb.get(currencyFormat)"); + // // Get the currency pattern for this locale. We have to fish it // out of the ResourceBundle directly, since DecimalFormat.toPattern // will return the localized symbol, not \00a4 // - UnicodeString pattern = numPat.getStringEx(1, status); - failure(status, "rb->getStringArray"); + UnicodeString pattern = numPat.getString(status); + failure(status, "rb->getString()"); UChar fo[] = { 0x00A4 }; UnicodeString foo(fo, 1, 1); @@ -1725,7 +1755,7 @@ void NumberFormatRegressionTest::Test4125885(void) double rate = 12.34; DecimalFormat *formatDec = new DecimalFormat ("000.00", status); if(U_FAILURE(status)) { - errln("Error creating DecimalFormat: %s", u_errorName(status)); + errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); delete formatDec; return; } @@ -1758,22 +1788,22 @@ void NumberFormatRegressionTest::Test4134034(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *nf = new DecimalFormat("##,###,###.00", status); - failure(status, "new DecimalFormat"); - - UnicodeString f; - FieldPosition pos(FieldPosition::DONT_CARE); - f = nf->format(9.02, f, pos); - if (f == UnicodeString("9.02")) - logln(f + " ok"); - else - errln("9.02 -> " + f + "; want 9.02"); + if (!failure(status, "new DecimalFormat")) { + UnicodeString f; + FieldPosition pos(FieldPosition::DONT_CARE); + f = nf->format(9.02, f, pos); + if (f == UnicodeString("9.02")) + logln(f + " ok"); + else + errln("9.02 -> " + f + "; want 9.02"); - f.remove(); - f = nf->format((int32_t)0, f, pos); - if (f == UnicodeString(".00")) - logln(f + " ok"); - else - errln("0 -> " + f + "; want .00"); + f.remove(); + f = nf->format((int32_t)0, f, pos); + if (f == UnicodeString(".00")) + logln(f + " ok"); + else + errln("0 -> " + f + "; want .00"); + } delete nf; } @@ -1817,15 +1847,16 @@ void NumberFormatRegressionTest::Test4134300(void) { UnicodeString result; UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(DATA[i], status); - failure(status, "new DecimalFormat"); - FieldPosition pos(FieldPosition::DONT_CARE); - result = df->format(1.2, result, pos); - if (result != DATA[i+1]) { - errln("Fail: 1.2 x " + DATA[i] + " = " + result + - "; want " + DATA[i+1]); - } - else { - logln("Ok: 1.2 x " + DATA[i] + " = " + result); + if (!failure(status, "new DecimalFormat")) { + FieldPosition pos(FieldPosition::DONT_CARE); + result = df->format(1.2, result, pos); + if (result != DATA[i+1]) { + errln("Fail: 1.2 x " + DATA[i] + " = " + result + + "; want " + DATA[i+1]); + } + else { + logln("Ok: 1.2 x " + DATA[i] + " = " + result); + } } delete df; @@ -1842,16 +1873,17 @@ void NumberFormatRegressionTest::Test4140009(void) DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getEnglish(), status); failure(status, "new DecimalFormatSymbols"); DecimalFormat *f = new DecimalFormat(UnicodeString(""), syms, status); - failure(status, "new DecimalFormat"); - UnicodeString s; - FieldPosition pos(FieldPosition::DONT_CARE); - s = f->format(123.456, s, pos); - if (s != UnicodeString("123.456")) - errln("Fail: Format empty pattern x 123.456 => " + s); - s.remove(); - s = f->format(-123.456, s, pos); - if (s != UnicodeString("-123.456")) - errln("Fail: Format empty pattern x -123.456 => " + s); + if (!failure(status, "new DecimalFormat")) { + UnicodeString s; + FieldPosition pos(FieldPosition::DONT_CARE); + s = f->format(123.456, s, pos); + if (s != UnicodeString("123.456")) + errln("Fail: Format empty pattern x 123.456 => " + s); + s.remove(); + s = f->format(-123.456, s, pos); + if (s != UnicodeString("-123.456")) + errln("Fail: Format empty pattern x -123.456 => " + s); + } delete f; } @@ -1882,16 +1914,16 @@ void NumberFormatRegressionTest::Test4145457() { //try { UErrorCode status = U_ZERO_ERROR; NumberFormat *nff = NumberFormat::createInstance(status); - if (failure(status, "NumberFormat::createInstance")){ + if (failure(status, "NumberFormat::createInstance", TRUE)){ delete nff; return; }; - if(nff->getDynamicClassID() != DecimalFormat::getStaticClassID()) { + DecimalFormat *nf = dynamic_cast(nff); + if(nf == NULL) { errln("DecimalFormat needed to continue"); return; } - DecimalFormat *nf = (DecimalFormat*)nff; DecimalFormatSymbols *sym = (DecimalFormatSymbols*) nf->getDecimalFormatSymbols(); sym->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, (UChar)/*'\''*/0x0027); nf->setDecimalFormatSymbols(*sym); @@ -1920,6 +1952,7 @@ void NumberFormatRegressionTest::Test4145457() { out2 = nf->format(pi, out2, pos); UnicodeString pat2; pat2 = nf->toPattern(pat2); + pp.setIndex(0); nf->parse(out2, num, pp); double val2 = num.getDouble(); @@ -1962,16 +1995,17 @@ void NumberFormatRegressionTest::Test4147295(void) UnicodeString pattern("#,###"); logln("Applying pattern \"" + pattern + "\""); sdf->applyPattern(pattern, status); - failure(status, "sdf->applyPattern"); - int minIntDig = sdf->getMinimumIntegerDigits(); - if (minIntDig != 0) { - errln("Test failed"); - errln(" Minimum integer digits : " + minIntDig); - UnicodeString temp; - errln(" new pattern: " + sdf->toPattern(temp)); - } else { - logln("Test passed"); - logln(" Minimum integer digits : " + minIntDig); + if (!failure(status, "sdf->applyPattern")) { + int minIntDig = sdf->getMinimumIntegerDigits(); + if (minIntDig != 0) { + errln("Test failed"); + errln(UnicodeString(" Minimum integer digits : ") + minIntDig); + UnicodeString temp; + errln(UnicodeString(" new pattern: ") + sdf->toPattern(temp)); + } else { + logln("Test passed"); + logln(UnicodeString(" Minimum integer digits : ") + minIntDig); + } } delete sdf; } @@ -1987,28 +2021,29 @@ void NumberFormatRegressionTest::Test4147706(void) DecimalFormat *df = new DecimalFormat("#,##0.0##", status); failure(status, "new DecimalFormat"); DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getEnglish(), status); - failure(status, "new DecimalFormatSymbols"); - UnicodeString f1; - UnicodeString f2, temp; - FieldPosition pos(FieldPosition::DONT_CARE); - volatile double d1 = 0.0; // volatile to prevent code optimization - double d2 = -0.0001; + if (!failure(status, "new DecimalFormatSymbols")) { + UnicodeString f1; + UnicodeString f2, temp; + FieldPosition pos(FieldPosition::DONT_CARE); + volatile double d1 = 0.0; // volatile to prevent code optimization + double d2 = -0.0001; -#if defined(U_HPUX) - d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword +#if U_PLATFORM == U_PF_HPUX + d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword #else - d1 *= -1.0; // Some compilers have a problem with defining -0.0 + d1 *= -1.0; // Some compilers have a problem with defining -0.0 #endif - df->adoptDecimalFormatSymbols(syms); - f1 = df->format(d1, f1, pos); - f2 = df->format(d2, f2, pos); - if (f1 != UnicodeString("-0.0")) { - errln(UnicodeString("") + d1 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f1 + '"'); - } - if (f2 != UnicodeString("-0.0")) { - errln(UnicodeString("") + d2 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f2 + '"'); + df->adoptDecimalFormatSymbols(syms); + f1 = df->format(d1, f1, pos); + f2 = df->format(d2, f2, pos); + if (f1 != UnicodeString("-0.0")) { + errln(UnicodeString("") + d1 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f1 + '"'); + } + if (f2 != UnicodeString("-0.0")) { + errln(UnicodeString("") + d2 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f2 + '"'); + } } - + delete df; } @@ -2040,7 +2075,7 @@ NumberFormatRegressionTest::Test4162198(void) UErrorCode status = U_ZERO_ERROR; NumberFormat *f = NumberFormat::createInstance(status); if(U_FAILURE(status)) { - errln("Couldn't create number format"); + dataerrln("Couldn't create number format - %s", u_errorName(status)); return; } f->setMaximumFractionDigits(INT32_MAX); @@ -2084,7 +2119,7 @@ NumberFormatRegressionTest::Test4162852(void) NumberFormat *f = (i == 0) ? NumberFormat::createInstance(status) : NumberFormat::createPercentInstance(status); if(U_FAILURE(status)) { - errln("Couldn't create number format"); + dataerrln("Couldn't create number format - %s", u_errorName(status)); return; } double d = 0.0; @@ -2099,7 +2134,7 @@ NumberFormatRegressionTest::Test4162852(void) logln(UnicodeString("") + d + " -> " + '"' + s + '"' + " -> " + e); -#if (defined(OS390) && !defined(IEEE_754)) || defined(OS400) +#if (U_PLATFORM == U_PF_OS390 && !defined(IEEE_754)) || U_PLATFORM == U_PF_OS400 if (e != 0.0) { #else if (e != 0.0 || 1.0/e > 0.0) { @@ -2120,7 +2155,7 @@ static double _u_abs(double a) { return a<0?-a:a; } void NumberFormatRegressionTest::Test4167494(void) { UErrorCode status = U_ZERO_ERROR; NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status); - if (failure(status, "NumberFormat::createInstance")){ + if (failure(status, "NumberFormat::createInstance", TRUE)){ delete fmt; return; }; @@ -2156,15 +2191,15 @@ void NumberFormatRegressionTest::Test4167494(void) { void NumberFormatRegressionTest::Test4170798(void) { UErrorCode status = U_ZERO_ERROR; NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status); - if (failure(status, "NumberFormat::createInstance")){ + if (failure(status, "NumberFormat::createInstance", TRUE)){ delete nf; return; }; - if(nf->getDynamicClassID() != DecimalFormat::getStaticClassID()) { + DecimalFormat *df = dynamic_cast(nf); + if(df == NULL) { errln("DecimalFormat needed to continue"); return; } - DecimalFormat *df = (DecimalFormat*) nf; df->setParseIntegerOnly(TRUE); Formattable n; ParsePosition pos(0); @@ -2197,12 +2232,13 @@ void NumberFormatRegressionTest::Test4176114(void) { UnicodeString s; for (int i=0; i " + - s + ", want " + exp); + if (!failure(status, "DecimalFormat constructor")) { + df.toPattern(s); + UnicodeString exp(DATA[i+1]); + if (s != exp) { + errln(UnicodeString("FAIL: ") + DATA[i] + " -> " + + s + ", want " + exp); + } } } } @@ -2229,21 +2265,22 @@ void NumberFormatRegressionTest::Test4179818(void) { DecimalFormatSymbols sym(Locale::getUS(), status); failure(status, "Construct DecimalFormatSymbols"); DecimalFormat fmt("#", sym, status); - failure(status, "Construct DecimalFormat"); - for (int i=0; i \"" + pat + "\" -> \"" + f2.toPattern(p) + "\""); + } else { + UnicodeString l, p; + logln(UnicodeString("PASS: ") + type[j] + avail[i].getDisplayName(l) + + " -> \"" + pat + + "\""); } // Test toLocalizedPattern/applyLocalizedPattern round trip @@ -2434,7 +2478,7 @@ void NumberFormatRegressionTest::Test4212072(void) { void NumberFormatRegressionTest::Test4216742(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *fmt = (DecimalFormat*) NumberFormat::createInstance(Locale::getUS(), status); - if (failure(status, "createInstance", Locale::getUS())){ + if (failure(status, "createInstance", Locale::getUS(), TRUE)){ delete fmt; return; }; @@ -2454,7 +2498,7 @@ void NumberFormatRegressionTest::Test4216742(void) { } else { double d = num.getType() == Formattable::kDouble ? num.getDouble() : (double) num.getLong(); - if (d > 0 != DATA[i] > 0) { + if ((d > 0) != (DATA[i] > 0)) { errln(UnicodeString("\"") + str + "\" parse(x " + fmt->getMultiplier() + ") => " + toString(num)); @@ -2476,7 +2520,7 @@ void NumberFormatRegressionTest::Test4217661(void) { int D_length = (int)(sizeof(D) / sizeof(D[0])); UErrorCode status = U_ZERO_ERROR; NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status); - if (failure(status, "createInstance", Locale::getUS())){ + if (failure(status, "createInstance", Locale::getUS(), TRUE)){ delete fmt; return; }; @@ -2497,7 +2541,7 @@ void NumberFormatRegressionTest::Test4217661(void) { void NumberFormatRegressionTest::Test4161100(void) { UErrorCode status = U_ZERO_ERROR; NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status); - if (failure(status, "createInstance", Locale::getUS())){ + if (failure(status, "createInstance", Locale::getUS(), TRUE)){ delete nf; return; }; @@ -2524,22 +2568,23 @@ void NumberFormatRegressionTest::Test4243011(void) { DecimalFormatSymbols sym(Locale::getUS(), status); failure(status, "DecimalFormatSymbols ct", Locale::getUS()); DecimalFormat fmt(UnicodeString("0."), sym, status); - failure(status, "DecimalFormat ct", Locale::getUS()); - - const double NUM[] = { -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5 }; - const char* STR[] = { "-2.", "-2.", "-0.", "0.", "2.", "2.", "4.", "4." }; - int32_t N = (int32_t)(sizeof(NUM) / sizeof(NUM[0])); - - for (int32_t i=0; iparse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kDouble == val.getType()); + TEST_ASSERT(1000000000 == val.getInt64(status)); + TEST_CHECK_STATUS(status); + TEST_ASSERT(1000000000.6 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + numStr = "100000000000000001.1"; // approx 1E17, parses as a double rather + // than int64 because of the fraction + // even though int64 is more precise. + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kDouble == val.getType()); + TEST_ASSERT(100000000000000001LL == val.getInt64(status)); + TEST_CHECK_STATUS(status); + TEST_ASSERT(100000000000000000.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + numStr = "1E17"; // Parses with the internal decimal number having non-zero exponent + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kInt64 == val.getType()); + TEST_ASSERT(100000000000000000LL == val.getInt64()); + TEST_ASSERT(1.0E17 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + numStr = "9223372036854775807"; // largest int64_t + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kInt64 == val.getType()); + TEST_ASSERT(9223372036854775807LL == val.getInt64()); + // In the following check, note that a substantial range of integers will + // convert to the same double value. There are also platform variations + // in the rounding at compile time of double constants. + TEST_ASSERT(9223372036854775808.0 >= val.getDouble(status)); + TEST_ASSERT(9223372036854774700.0 <= val.getDouble(status)); + TEST_CHECK_STATUS(status); + + numStr = "-9223372036854775808"; // smallest int64_t + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kInt64 == val.getType()); + // TEST_ASSERT(-9223372036854775808LL == val.getInt64()); // Compiler chokes on constant. + TEST_ASSERT((int64_t)0x8000000000000000LL == val.getInt64()); + TEST_ASSERT(-9223372036854775808.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + numStr = "9223372036854775808"; // largest int64_t + 1 + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kDouble == val.getType()); + TEST_ASSERT(9223372036854775807LL == val.getInt64(status)); + TEST_ASSERT(status == U_INVALID_FORMAT_ERROR); + status = U_ZERO_ERROR; + TEST_ASSERT(9223372036854775810.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + numStr = "-9223372036854775809"; // smallest int64_t - 1 + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kDouble == val.getType()); + // TEST_ASSERT(-9223372036854775808LL == val.getInt64(status)); // spurious compiler warnings + TEST_ASSERT((int64_t)0x8000000000000000LL == val.getInt64(status)); + TEST_ASSERT(status == U_INVALID_FORMAT_ERROR); + status = U_ZERO_ERROR; + TEST_ASSERT(-9223372036854775810.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + // Test values near the limit of where doubles can represent all integers. + // The implementation strategy of getInt64() changes at this boundary. + // Strings to be parsed include a decimal fraction to force them to be + // parsed as doubles rather than ints. The fraction is discarded + // from the parsed double value because it is beyond what can be represented. + + status = U_ZERO_ERROR; + numStr = "9007199254740991.1"; // largest 53 bit int + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + // printf("getInt64() returns %lld\n", val.getInt64(status)); + TEST_ASSERT(Formattable::kDouble == val.getType()); + TEST_ASSERT(9007199254740991LL == val.getInt64(status)); + TEST_ASSERT(9007199254740991.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + status = U_ZERO_ERROR; + numStr = "9007199254740992.1"; // 54 bits for the int part. + nf->parse(numStr, val, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kDouble == val.getType()); + TEST_ASSERT(9007199254740992LL == val.getInt64(status)); + TEST_ASSERT(9007199254740992.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + status = U_ZERO_ERROR; + numStr = "9007199254740993.1"; // 54 bits for the int part. Double will round + nf->parse(numStr, val, status); // the ones digit, putting it up to ...994 + TEST_CHECK_STATUS(status); + TEST_ASSERT(Formattable::kDouble == val.getType()); + TEST_ASSERT(9007199254740993LL == val.getInt64(status)); + TEST_ASSERT(9007199254740994.0 == val.getDouble(status)); + TEST_CHECK_STATUS(status); + + delete nf; +} + +void NumberFormatRegressionTest::Test9109(void) { + UErrorCode status = U_ZERO_ERROR; + Formattable val; + ParsePosition pos; + DecimalFormat fmt("+##", status); + fmt.setLenient(TRUE); + + if (U_FAILURE(status)) { + dataerrln("Failed to create DecimalFormat with pattern '+##' - %s", u_errorName(status)); + } + + UnicodeString text("123"); + int32_t expected = 123; + int32_t expos = 3; + + fmt.parse(text, val, pos); + if (pos.getErrorIndex() >= 0) { + errln(UnicodeString("Parse failure at ") + pos.getErrorIndex()); + } else if (val.getLong() != 123) { + errln(UnicodeString("Incorrect parse result: ") + val.getLong() + " expected: " + expected); + } else if (pos.getIndex() != 3) { + errln(UnicodeString("Incorrect parse position: ") + pos.getIndex() + " expected: " + expos); + } +} + + +void NumberFormatRegressionTest::Test9780(void) { + UErrorCode status = U_ZERO_ERROR; + NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status); + if (failure(status, "NumberFormat::createInstance", TRUE)){ + delete nf; + return; + }; + DecimalFormat *df = dynamic_cast(nf); + if(df == NULL) { + errln("DecimalFormat needed to continue"); + return; + } + df->setParseIntegerOnly(TRUE); + + { + Formattable n; + ParsePosition pos(0); + UnicodeString toParse("1,234",""); + df->parse(toParse, n, pos); + if (n.getType() != Formattable::kLong + || n.getLong() != 1234) { + errln(UnicodeString("FAIL: parse(\"") + toParse + UnicodeString("\") returns ") + toString(n)); + } + } + // should still work in lenient mode, just won't get fastpath + df->setLenient(TRUE); + { + Formattable n; + ParsePosition pos(0); + UnicodeString toParse("1,234",""); + df->parse(toParse, n, pos); + if (n.getType() != Formattable::kLong + || n.getLong() != 1234) { + errln(UnicodeString("FAIL: parse(\"") + toParse + UnicodeString("\") returns ") + toString(n)); + } + } + delete nf; +} + + +void NumberFormatRegressionTest::Test9677(void) { + static const UChar pattern[] = { 0x23,0x23,0x23,0x23,0x2E,0x23,0x23,0x23,0x23,0 }; // "####.####" + static const UChar positivePrefix[] = { 0x40,0 }; // "@" + static const UChar negativePrefix[] = { 0x6E,0 }; // "n" + static const UChar text[] = { 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0 }; // 123456789 + static const UChar text2[] = { 0x6E, 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0 }; // n123456789 + + UErrorCode status = U_ZERO_ERROR; + LocalUNumberFormatPointer f(unum_open(UNUM_DEFAULT, NULL, 0, "en_US", NULL, &status)); + if (U_FAILURE(status)) { + dataerrln("Failure opening unum_open"); + return; + } + + if (U_SUCCESS(status)) { + unum_applyPattern(f.getAlias(), FALSE, pattern, -1, NULL, &status); + unum_setTextAttribute(f.getAlias(), UNUM_POSITIVE_PREFIX, positivePrefix, -1, &status); + assertSuccess("setting attributes", status); + } + + if(U_SUCCESS(status)) { + int32_t n = unum_parse(f.getAlias(), text, -1, NULL, &status); + logln("unum_parse status %s, result %d\n", u_errorName(status), n); + + if(U_FAILURE(status)) { + logln("Got expected parse error %s\n", u_errorName(status)); + status = U_ZERO_ERROR; + } else { + errln("FAIL: unum_parse status %s, result %d - expected failure\n", u_errorName(status), n); + } + } + + if (U_SUCCESS(status)) { + unum_setTextAttribute(f.getAlias(), UNUM_POSITIVE_PREFIX, NULL, 0, &status); + assertSuccess("setting attributes", status); + logln("removed positive prefix"); + } + + if(U_SUCCESS(status)) { + int32_t n = unum_parse(f.getAlias(), text, -1, NULL, &status); + logln("unum_parse status %s, result %d\n", u_errorName(status), n); + + if(U_FAILURE(status)) { + errln("FAIL: with pos prefix removed, parse error %s\n", u_errorName(status)); + status = U_ZERO_ERROR; + } else { + if(n!=123456789) { + errln("FAIL: with pos prefix removed , unum_parse status %s, result %d expected 123456789\n", u_errorName(status), n); + } else { + logln("PASS: with pos prefix removed , unum_parse status %s, result %d expected 123456789\n", u_errorName(status),n); + } + } + } + + if(U_SUCCESS(status)) { + int32_t n = unum_parse(f.getAlias(), text2, -1, NULL, &status); + logln("unum_parse status %s, result %d\n", u_errorName(status), n); + + if(U_FAILURE(status)) { + logln("text2: Got expected parse error %s\n", u_errorName(status)); + status = U_ZERO_ERROR; + } else { + errln("FAIL: text2: unum_parse status %s, result %d - expected failure\n", u_errorName(status), n); + } + } + + if (U_SUCCESS(status)) { + unum_setTextAttribute(f.getAlias(), UNUM_NEGATIVE_PREFIX, negativePrefix, -1, &status); + assertSuccess("setting attributes", status); + logln("Set a different neg prefix prefix"); + } + + if(U_SUCCESS(status)) { + int32_t n = unum_parse(f.getAlias(), text2, -1, NULL, &status); + logln("unum_parse status %s, result %d\n", u_errorName(status), n); + + if(U_FAILURE(status)) { + errln("FAIL: with different neg prefix , parse error %s\n", u_errorName(status)); + status = U_ZERO_ERROR; + } else { +; + if(n!=-123456789) { + errln("FAIL: with different neg prefix , unum_parse status %s, result %d expected -123456789\n", u_errorName(status), n); + } else { + logln("PASS: with different neg prefix , unum_parse status %s, result %d expected -123456789\n", u_errorName(status), n); + } + } + } +} + +void NumberFormatRegressionTest::Test10361(void) { + // DecimalFormat/NumberFormat were artificially limiting the number of digits, + // preventing formatting of big decimals. + UErrorCode status = U_ZERO_ERROR; + DecimalFormatSymbols symbols(Locale::getEnglish(), status); + LocalPointer df(new DecimalFormat("###.##", symbols, status), status); + TEST_CHECK_STATUS(status); + + // Create a decimal number with a million digits. + const int32_t NUMSIZE=1000000; + char *num = new char[NUMSIZE]; + for (int32_t i=0; iformat(fmtable, s, pos, status); + TEST_CHECK_STATUS(status); + TEST_ASSERT(999999 == s.length()); + TEST_ASSERT(999997 == pos.getBeginIndex()); + TEST_ASSERT(999998 == pos.getEndIndex()); + + UnicodeString expected(num, -1, US_INV); + TEST_ASSERT(expected == s); + delete [] num; +} + #endif /* #if !UCONFIG_NO_FORMATTING */