Imported Upstream version 58.1
[platform/upstream/icu.git] / source / test / cintltst / cnumtst.c
index c4f4cdc..15fec24 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /********************************************************************
  * COPYRIGHT:
  * Copyright (c) 1997-2016, International Business Machines Corporation and
@@ -60,6 +62,7 @@ static void TestContext(void);
 static void TestCurrencyUsage(void);
 static void TestCurrFmtNegSameAsPositive(void);
 static void TestVariousStylesAndAttributes(void);
+static void TestParseCurrPatternWithDecStyle(void);
 
 #define TESTCASE(x) addTest(root, &x, "tsformat/cnumtst/" #x)
 
@@ -89,6 +92,7 @@ void addNumForTest(TestNode** root)
     TESTCASE(TestCurrencyUsage);
     TESTCASE(TestCurrFmtNegSameAsPositive);
     TESTCASE(TestVariousStylesAndAttributes);
+    TESTCASE(TestParseCurrPatternWithDecStyle);
 }
 
 /* test Parse int 64 */
@@ -990,6 +994,7 @@ static void TestParseZero(void)
 
 static const UChar dollars2Sym[] = { 0x24,0x32,0x2E,0x30,0x30,0 }; /* $2.00 */
 static const UChar dollars4Sym[] = { 0x24,0x34,0 }; /* $4 */
+static const UChar dollarsUS4Sym[] = { 0x55,0x53,0x24,0x34,0 }; /* US$4 */
 static const UChar dollars9Sym[] = { 0x39,0xA0,0x24,0 }; /* 9 $ */
 static const UChar pounds3Sym[]  = { 0xA3,0x33,0x2E,0x30,0x30,0 }; /* [POUND]3.00 */
 static const UChar pounds5Sym[]  = { 0xA3,0x35,0 }; /* [POUND]5 */
@@ -1030,8 +1035,8 @@ static const ParseCurrencyItem parseCurrencyItems[] = {
     { "en_GB", "pounds7",  pounds7Sym,  NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
     { "en_GB", "euros4",   euros4Sym,   NULL,          U_PARSE_ERROR, 4, 0.0, U_PARSE_ERROR, 4, 0.0, ""    },
     { "en_GB", "euros6",   euros6Sym,   NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
-    { "en_GB", "euros8",   euros8Sym,   euros8PluEn,   U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 8.0, "EUR" },
-    { "en_GB", "dollars4", dollars4Sym, dollars4PluEn, U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 4.0, "USD" },
+    { "en_GB", "euros8",   euros8Sym,     euros8PluEn,   U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 8.0, "EUR" },
+    { "en_GB", "dollars4", dollarsUS4Sym, dollars4PluEn, U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  4, 4.0, "USD" },
 
     { "fr_FR", "euros4",   euros4Sym,   NULL,          U_ZERO_ERROR,  6, 4.0, U_ZERO_ERROR,  6, 4.0, "EUR" },
     { "fr_FR", "euros6",   euros6Sym,   euros6PluFr,   U_ZERO_ERROR,  3, 6.0, U_ZERO_ERROR,  3, 6.0, "EUR" },
@@ -1163,6 +1168,7 @@ static void TestSpelloutNumberParse()
             log_err_status(status, "unum_open fails for UNUM_SPELLOUT with locale %s, status %s\n", testPtr->locale, myErrorName(status));
             continue;
         }
+        status = U_ZERO_ERROR;
         value = unum_parse(nf, testPtr->source, -1, &position, &status);
         if ( value != testPtr->value || position != testPtr->endPos || status != testPtr->status ) {
             log_err("unum_parse SPELLOUT, locale %s, testname %s, startPos %d: for value / endPos / status, expected %d / %d / %s, got %d / %d / %s\n",
@@ -1385,7 +1391,7 @@ static void TestInt64Format() {
     /* create a number format using unum_openPattern(....) */
     log_verbose("\nTesting Int64Format\n");
     u_uastrcpy(temp1, "#.#E0");
-    fmt = unum_open(UNUM_IGNORE, temp1, u_strlen(temp1), NULL, NULL, &status);
+    fmt = unum_open(UNUM_IGNORE, temp1, u_strlen(temp1), "en_US", NULL, &status);
     if(U_FAILURE(status)) {
         log_data_err("error in unum_openPattern() - %s\n", myErrorName(status));
     } else {
@@ -2858,4 +2864,27 @@ static void TestVariousStylesAndAttributes(void) {
     }
 }
 
+static const UChar currpat[]  = { 0xA4,0x23,0x2C,0x23,0x23,0x30,0x2E,0x30,0x30,0};
+static const UChar parsetxt[] = { 0x78,0x30,0x79,0x24,0 }; /* x0y$ */
+
+static void TestParseCurrPatternWithDecStyle() {
+    UErrorCode status = U_ZERO_ERROR;
+    UNumberFormat *unumfmt = unum_open(UNUM_DECIMAL, NULL, 0, "en_US", NULL, &status);
+    if (U_FAILURE(status)) {
+        log_data_err("unum_open DECIMAL failed for en_US: %s (Are you missing data?)\n", u_errorName(status));
+    } else {
+        unum_applyPattern(unumfmt, FALSE, currpat, -1, NULL, &status);
+        if (U_FAILURE(status)) {
+            log_err_status(status, "unum_applyPattern failed: %s\n", u_errorName(status));
+        } else {
+            int32_t pos = 0;
+            double value = unum_parseDouble(unumfmt, parsetxt, -1, &pos, &status);
+            if (U_SUCCESS(status)) {
+                log_err_status(status, "unum_parseDouble expected to fail but got status %s, value %f\n", u_errorName(status), value);
+            }
+        }
+        unum_close(unumfmt);
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */