| Index: source/test/cintltst/cnumtst.c
|
| diff --git a/source/test/cintltst/cnumtst.c b/source/test/cintltst/cnumtst.c
|
| index 4a8f366d1db672973078681fabef3ee980fdb131..867b074eac8fb55d8de84981037c21026f0cd408 100644
|
| --- a/source/test/cintltst/cnumtst.c
|
| +++ b/source/test/cintltst/cnumtst.c
|
| @@ -1,6 +1,6 @@
|
| /********************************************************************
|
| * COPYRIGHT:
|
| - * Copyright (c) 1997-2013, International Business Machines Corporation and
|
| + * Copyright (c) 1997-2014, International Business Machines Corporation and
|
| * others. All Rights Reserved.
|
| ********************************************************************/
|
| /********************************************************************************
|
| @@ -28,6 +28,7 @@
|
| #include "unicode/unum.h"
|
| #include "unicode/unumsys.h"
|
| #include "unicode/ustring.h"
|
| +#include "unicode/udisplaycontext.h"
|
|
|
| #include "cintltst.h"
|
| #include "cnumtst.h"
|
| @@ -35,6 +36,7 @@
|
| #include "cstring.h"
|
| #include "putilimp.h"
|
| #include <stdio.h>
|
| +#include <stdlib.h>
|
|
|
| #define LENGTH(arr) (sizeof(arr)/sizeof(arr[0]))
|
|
|
| @@ -55,6 +57,10 @@ static void TestMaxInt(void);
|
| static void TestNoExponent(void);
|
| static void TestUFormattable(void);
|
| static void TestUNumberingSystem(void);
|
| +static void TestCurrencyIsoPluralFormat(void);
|
| +static void TestContext(void);
|
| +static void TestCurrencyUsage(void);
|
| +static void TestCurrFmtNegSameAsPositive(void);
|
|
|
| #define TESTCASE(x) addTest(root, &x, "tsformat/cnumtst/" #x)
|
|
|
| @@ -79,6 +85,10 @@ void addNumForTest(TestNode** root)
|
| TESTCASE(TestNoExponent);
|
| TESTCASE(TestUFormattable);
|
| TESTCASE(TestUNumberingSystem);
|
| + TESTCASE(TestCurrencyIsoPluralFormat);
|
| + TESTCASE(TestContext);
|
| + TESTCASE(TestCurrencyUsage);
|
| + TESTCASE(TestCurrFmtNegSameAsPositive);
|
| }
|
|
|
| /* test Parse int 64 */
|
| @@ -1072,8 +1082,6 @@ static void TestParseCurrency()
|
| log_data_err("unexpected error in unum_open UNUM_CURRENCY for locale %s: '%s'\n", itemPtr->locale, u_errorName(status));
|
| }
|
|
|
| -#if 0
|
| - /* Hmm, for UNUM_CURRENCY_PLURAL, currently unum_open always sets U_UNSUPPORTED_ERROR, save this test until it is supported */
|
| if (itemPtr->plurStr != NULL) {
|
| status = U_ZERO_ERROR;
|
| unum = unum_open(UNUM_CURRENCY_PLURAL, NULL, 0, itemPtr->locale, NULL, &status);
|
| @@ -1104,7 +1112,6 @@ static void TestParseCurrency()
|
| log_data_err("unexpected error in unum_open UNUM_CURRENCY_PLURAL for locale %s: '%s'\n", itemPtr->locale, u_errorName(status));
|
| }
|
| }
|
| -#endif
|
| }
|
| }
|
|
|
| @@ -1150,7 +1157,7 @@ static void TestSpelloutNumberParse()
|
| const SpelloutParseTest * testPtr;
|
| for (testPtr = spelloutParseTests; testPtr->testname != NULL; ++testPtr) {
|
| UErrorCode status = U_ZERO_ERROR;
|
| - int32_t value, position = testPtr->startPos;
|
| + int32_t value, position = testPtr->startPos;
|
| UNumberFormat *nf = unum_open(UNUM_SPELLOUT, NULL, 0, testPtr->locale, NULL, &status);
|
| if (U_FAILURE(status)) {
|
| log_err_status(status, "unum_open fails for UNUM_SPELLOUT with locale %s, status %s\n", testPtr->locale, myErrorName(status));
|
| @@ -1214,8 +1221,8 @@ static void TestSigDigRounding()
|
| UErrorCode status = U_ZERO_ERROR;
|
| UChar expected[128];
|
| UChar result[128];
|
| - char temp1[128];
|
| - char temp2[128];
|
| + char temp1[128];
|
| + char temp2[128];
|
| UNumberFormat* fmt;
|
| double d = 123.4;
|
|
|
| @@ -1478,8 +1485,8 @@ static void TestInt64Format() {
|
| log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
|
| }
|
| }
|
| -
|
| - u_uastrcpy(result, "5.06e-27");
|
| +
|
| + u_uastrcpy(result, "5.06e-27");
|
| parsepos = 0;
|
| valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
|
| if (U_FAILURE(status)) {
|
| @@ -2339,6 +2346,7 @@ static void TestUNumberingSystem(void) {
|
| itemPtr->locale, itemPtr->numsys, itemPtr->radix, itemPtr->isAlgorithmic, numsys, radix, isAlgorithmic);
|
| }
|
| ulen = unumsys_getDescription(unumsys, ubuf, kNumSysDescripBufMax, &status);
|
| + (void)ulen; // Suppress variable not used warning.
|
| if ( U_FAILURE(status) || u_strcmp(ubuf, itemPtr->description) != 0 ) {
|
| log_data_err("unumsys description for locale %s, description unexpected and/or status %\n", myErrorName(status));
|
| }
|
| @@ -2378,4 +2386,274 @@ static void TestUNumberingSystem(void) {
|
| }
|
| }
|
|
|
| +/* plain-C version of test in numfmtst.cpp */
|
| +enum { kUBufMax = 64 };
|
| +static void TestCurrencyIsoPluralFormat(void) {
|
| + static const char* DATA[][6] = {
|
| + // the data are:
|
| + // locale,
|
| + // currency amount to be formatted,
|
| + // currency ISO code to be formatted,
|
| + // format result using CURRENCYSTYLE,
|
| + // format result using ISOCURRENCYSTYLE,
|
| + // format result using PLURALCURRENCYSTYLE,
|
| +
|
| + {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"},
|
| + {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"},
|
| + {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"},
|
| + {"zh_CN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00\\u7F8E\\u5143"},
|
| + {"zh_CN", "1234.56", "USD", "US$\\u00A01,234.56", "USD\\u00A01,234.56", "1,234.56\\u7F8E\\u5143"},
|
| + // wrong ISO code {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "1.00 CHY"},
|
| + // wrong ISO code {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.56", "1,234.56 CHY"},
|
| + {"zh_CN", "1", "CNY", "\\uFFE5\\u00A01.00", "CNY\\u00A01.00", "1.00\\u4EBA\\u6C11\\u5E01"},
|
| + {"zh_CN", "1234.56", "CNY", "\\uFFE5\\u00A01,234.56", "CNY\\u00A01,234.56", "1,234.56\\u4EBA\\u6C11\\u5E01"},
|
| + {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| + {"ru_RU", "2", "RUB", "2,00\\u00A0\\u0440\\u0443\\u0431.", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| + {"ru_RU", "5", "RUB", "5,00\\u00A0\\u0440\\u0443\\u0431.", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| + // test locale without currency information
|
| + {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 USD"},
|
| + // test choice format
|
| + {"es_AR", "1", "INR", "INR1,00", "INR1,00", "1,00 rupia india"},
|
| + };
|
| + static const UNumberFormatStyle currencyStyles[] = {
|
| + UNUM_CURRENCY,
|
| + UNUM_CURRENCY_ISO,
|
| + UNUM_CURRENCY_PLURAL
|
| + };
|
| +
|
| + int32_t i, sIndex;
|
| +
|
| + for (i=0; i<LENGTH(DATA); ++i) {
|
| + const char* localeString = DATA[i][0];
|
| + double numberToBeFormat = atof(DATA[i][1]);
|
| + const char* currencyISOCode = DATA[i][2];
|
| + for (sIndex = 0; sIndex < LENGTH(currencyStyles); ++sIndex) {
|
| + UNumberFormatStyle style = currencyStyles[sIndex];
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UChar currencyCode[4];
|
| + UChar ubufResult[kUBufMax];
|
| + UChar ubufExpected[kUBufMax];
|
| + int32_t ulenRes;
|
| +
|
| + UNumberFormat* unumFmt = unum_open(style, NULL, 0, localeString, NULL, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_data_err("FAIL: unum_open, locale %s, style %d - %s\n", localeString, (int)style, myErrorName(status));
|
| + continue;
|
| + }
|
| + u_charsToUChars(currencyISOCode, currencyCode, 4);
|
| + unum_setTextAttribute(unumFmt, UNUM_CURRENCY_CODE, currencyCode, 3, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_err("FAIL: unum_setTextAttribute, locale %s, UNUM_CURRENCY_CODE %s\n", localeString, currencyISOCode);
|
| + }
|
| + ulenRes = unum_formatDouble(unumFmt, numberToBeFormat, ubufResult, kUBufMax, NULL, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_err("FAIL: unum_formatDouble, locale %s, UNUM_CURRENCY_CODE %s - %s\n", localeString, currencyISOCode, myErrorName(status));
|
| + } else {
|
| + int32_t ulenExp = u_unescape(DATA[i][3 + sIndex], ubufExpected, kUBufMax);
|
| + if (ulenRes != ulenExp || u_strncmp(ubufResult, ubufExpected, ulenExp) != 0) {
|
| + log_err("FAIL: unum_formatDouble, locale %s, UNUM_CURRENCY_CODE %s, expected %s, got something else\n",
|
| + localeString, currencyISOCode, DATA[i][3 + sIndex]);
|
| + }
|
| + }
|
| + unum_close(unumFmt);
|
| + }
|
| + }
|
| +}
|
| +
|
| +typedef struct {
|
| + const char * locale;
|
| + UNumberFormatStyle style;
|
| + UDisplayContext context;
|
| + const char * expectedResult;
|
| +} TestContextItem;
|
| +
|
| +/* currently no locales have contextTransforms data for "symbol" type */
|
| +static const TestContextItem tcItems[] = { /* results for 123.45 */
|
| + { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, "ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
|
| + { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, "Ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
|
| + { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, "ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
|
| + { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, "ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
|
| + { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, "one hundred twenty-three point four five" },
|
| + { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, "One hundred twenty-three point four five" },
|
| + { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, "One hundred twenty-three point four five" },
|
| + { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, "One hundred twenty-three point four five" },
|
| + { NULL, (UNumberFormatStyle)0, (UDisplayContext)0, NULL }
|
| +};
|
| +
|
| +static void TestContext(void) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + const TestContextItem* itemPtr;
|
| +
|
| + UNumberFormat *unum = unum_open(UNUM_SPELLOUT, NULL, 0, "en", NULL, &status);
|
| + if ( U_SUCCESS(status) ) {
|
| + UDisplayContext context = unum_getContext(unum, UDISPCTX_TYPE_CAPITALIZATION, &status);
|
| + if ( U_FAILURE(status) || context != UDISPCTX_CAPITALIZATION_NONE) {
|
| + log_err("FAIL: Initial unum_getContext is not UDISPCTX_CAPITALIZATION_NONE\n");
|
| + status = U_ZERO_ERROR;
|
| + }
|
| + unum_setContext(unum, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, &status);
|
| + context = unum_getContext(unum, UDISPCTX_TYPE_CAPITALIZATION, &status);
|
| + if ( U_FAILURE(status) || context != UDISPCTX_CAPITALIZATION_FOR_STANDALONE) {
|
| + log_err("FAIL: unum_getContext does not return the value set, UDISPCTX_CAPITALIZATION_FOR_STANDALONE\n");
|
| + }
|
| + unum_close(unum);
|
| + } else {
|
| + log_data_err("unum_open UNUM_SPELLOUT for en fails with status %s\n", myErrorName(status));
|
| + }
|
| +#if !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_BREAK_ITERATION
|
| + for (itemPtr = tcItems; itemPtr->locale != NULL; itemPtr++) {
|
| + UChar ubufResult[kUBufMax];
|
| + int32_t ulenRes;
|
| +
|
| + status = U_ZERO_ERROR;
|
| + unum = unum_open(itemPtr->style, NULL, 0, itemPtr->locale, NULL, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_data_err("FAIL: unum_open, locale %s, style %d - %s\n",
|
| + itemPtr->locale, (int)itemPtr->style, myErrorName(status));
|
| + continue;
|
| + }
|
| + unum_setContext(unum, itemPtr->context, &status);
|
| + ulenRes = unum_formatDouble(unum, 123.45, ubufResult, kUBufMax, NULL, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_err("FAIL: unum_formatDouble, locale %s, style %d, context %d - %s\n",
|
| + itemPtr->locale, (int)itemPtr->style, (int)itemPtr->context, myErrorName(status));
|
| + } else {
|
| + UChar ubufExpected[kUBufMax];
|
| + int32_t ulenExp = u_unescape(itemPtr->expectedResult, ubufExpected, kUBufMax);
|
| + if (ulenRes != ulenExp || u_strncmp(ubufResult, ubufExpected, ulenExp) != 0) {
|
| + char bbuf[kUBufMax*2];
|
| + u_austrncpy(bbuf, ubufResult, sizeof(bbuf));
|
| + log_err("FAIL: unum_formatDouble, locale %s, style %d, context %d, expected %d:\"%s\", got %d:\"%s\"\n",
|
| + itemPtr->locale, (int)itemPtr->style, (int)itemPtr->context, ulenExp,
|
| + itemPtr->expectedResult, ulenRes, bbuf);
|
| + }
|
| + }
|
| + unum_close(unum);
|
| + }
|
| +#endif /* #if !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_BREAK_ITERATION */
|
| +}
|
| +
|
| +static void TestCurrencyUsage(void) {
|
| + static const char* DATA[][2] = {
|
| + /* the data are:
|
| + * currency ISO code to be formatted,
|
| + * format result using CURRENCYSTYLE with CASH purpose,-
|
| + * Note that as of CLDR 26:-
|
| + * - TWD switches from 0 decimals to 2; PKR still has 0, so change test to that
|
| + * - CAD and all other currencies that rounded to .05 no longer do
|
| + */
|
| +
|
| + {"PKR", "PKR124"},
|
| + {"CAD", "CA$123.57"},
|
| + {"USD", "$123.57"}
|
| + };
|
| +
|
| + // 1st time for getter/setter, 2nd for factory method
|
| + int32_t i;
|
| + for(i=0; i<2; i++){
|
| + const char* localeString = "en_US";
|
| + double numberToBeFormat = 123.567;
|
| + UNumberFormat* unumFmt;
|
| + UNumberFormatStyle style = UNUM_CURRENCY;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + int32_t j;
|
| +
|
| + if(i == 1){ // change for factory method
|
| + style = UNUM_CASH_CURRENCY;
|
| + }
|
| +
|
| + unumFmt = unum_open(style, NULL, 0, localeString, NULL, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_data_err("FAIL: unum_open, locale %s, style %d - %s\n",
|
| + localeString, (int)style, myErrorName(status));
|
| + continue;
|
| + }
|
| +
|
| + if(i == 0){ // this is for the getter/setter
|
| + if(unum_getAttribute(unumFmt, UNUM_CURRENCY_USAGE) != UCURR_USAGE_STANDARD) {
|
| + log_err("FAIL: currency usage attribute is not UNUM_CURRENCY_STANDARD\n");
|
| + }
|
| +
|
| + unum_setAttribute(unumFmt, UNUM_CURRENCY_USAGE, UCURR_USAGE_CASH);
|
| + }
|
| +
|
| + if(unum_getAttribute(unumFmt, UNUM_CURRENCY_USAGE) != UCURR_USAGE_CASH) {
|
| + log_err("FAIL: currency usage attribute is not UNUM_CURRENCY_CASH\n");
|
| + }
|
| +
|
| + for (j=0; j<LENGTH(DATA); ++j) {
|
| + UChar expect[64];
|
| + int32_t expectLen;
|
| + UChar currencyCode[4];
|
| + UChar result[64];
|
| + int32_t resultLen;
|
| + UFieldPosition pos = {0};
|
| +
|
| + u_charsToUChars(DATA[j][0], currencyCode, 3);
|
| + expectLen = u_unescape(DATA[j][1], expect, LENGTH(expect));
|
| +
|
| + unum_setTextAttribute(unumFmt, UNUM_CURRENCY_CODE, currencyCode, 3, &status);
|
| + assertSuccess("num_setTextAttribute()", &status);
|
| +
|
| + resultLen = unum_formatDouble(unumFmt, numberToBeFormat, result, LENGTH(result),
|
| + &pos, &status);
|
| + assertSuccess("num_formatDouble()", &status);
|
| +
|
| + if(resultLen != expectLen || u_strcmp(result, expect) != 0) {
|
| + log_err("Fail: Error in Number Format Currency Purpose using unum_setAttribute() expected: %s, got %s\n",
|
| + aescstrdup(expect, expectLen), aescstrdup(result, resultLen));
|
| + }
|
| +
|
| + }
|
| +
|
| + unum_close(unumFmt);
|
| + }
|
| +}
|
| +
|
| +static UChar currFmtNegSameAsPos[] = /* "\u00A4#,##0.00;\u00A4#,##0.00" */
|
| + {0xA4,0x23,0x2C,0x23,0x23,0x30,0x2E,0x30,0x30,0x3B,0xA4,0x23,0x2C,0x23,0x23,0x30,0x2E,0x30,0x30,0};
|
| +
|
| +static UChar currFmtToPatExpected[] = /* "\u00A4#,##0.00" */
|
| + {0xA4,0x23,0x2C,0x23,0x23,0x30,0x2E,0x30,0x30,0};
|
| +
|
| +static UChar currFmtResultExpected[] = /* "$100.00" */
|
| + {0x24,0x31,0x30,0x30,0x2E,0x30,0x30,0};
|
| +
|
| +static UChar emptyString[] = {0};
|
| +
|
| +enum { kUBufSize = 64 };
|
| +
|
| +static void TestCurrFmtNegSameAsPositive(void) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UNumberFormat* unumfmt = unum_open(UNUM_CURRENCY, NULL, 0, "en_US", NULL, &status);
|
| + if ( U_SUCCESS(status) ) {
|
| + unum_applyPattern(unumfmt, FALSE, currFmtNegSameAsPos, -1, NULL, &status);
|
| + if (U_SUCCESS(status)) {
|
| + UChar ubuf[kUBufSize];
|
| + int32_t ulen = unum_toPattern(unumfmt, FALSE, ubuf, kUBufSize, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_err("unum_toPattern fails with status %s\n", myErrorName(status));
|
| + } else if (u_strcmp(ubuf, currFmtToPatExpected) != 0) {
|
| + log_err("unum_toPattern result wrong, expected %s, got %s\n", aescstrdup(currFmtToPatExpected,-1), aescstrdup(ubuf,ulen));
|
| + }
|
| + unum_setSymbol(unumfmt, UNUM_MINUS_SIGN_SYMBOL, emptyString, 0, &status);
|
| + if (U_SUCCESS(status)) {
|
| + ulen = unum_formatDouble(unumfmt, -100.0, ubuf, kUBufSize, NULL, &status);
|
| + if (U_FAILURE(status)) {
|
| + log_err("unum_formatDouble fails with status %s\n", myErrorName(status));
|
| + } else if (u_strcmp(ubuf, currFmtResultExpected) != 0) {
|
| + log_err("unum_formatDouble result wrong, expected %s, got %s\n", aescstrdup(currFmtResultExpected,-1), aescstrdup(ubuf,ulen));
|
| + }
|
| + } else {
|
| + log_err("unum_setSymbol fails with status %s\n", myErrorName(status));
|
| + }
|
| + } else {
|
| + log_err("unum_applyPattern fails with status %s\n", myErrorName(status));
|
| + }
|
| + unum_close(unumfmt);
|
| + } else {
|
| + log_data_err("unum_open UNUM_CURRENCY for en_US fails with status %s\n", myErrorName(status));
|
| + }
|
| +}
|
| +
|
| #endif /* #if !UCONFIG_NO_FORMATTING */
|
|
|