]> granicus.if.org Git - icu/commitdiff
ICU-10458 Add more data driven tests for parsing currency.
authorTravis Keep <keep94@gmail.com>
Tue, 9 Jun 2015 18:01:13 +0000 (18:01 +0000)
committerTravis Keep <keep94@gmail.com>
Tue, 9 Jun 2015 18:01:13 +0000 (18:01 +0000)
X-SVN-Rev: 37507

icu4c/source/test/intltest/datadrivennumberformattestsuite.cpp
icu4c/source/test/intltest/datadrivennumberformattestsuite.h
icu4c/source/test/intltest/numberformattesttuple.cpp
icu4c/source/test/intltest/numberformattesttuple.h
icu4c/source/test/intltest/numfmtst.cpp
icu4c/source/test/testdata/numberformattestspecification.txt

index 7aad4a33b51a55710a0408f60bd9e72baec1ca6c..3fd7023deba9bfde0e63518e0289d898334418af 100644 (file)
@@ -213,6 +213,9 @@ UBool DataDrivenNumberFormatTestSuite::isPass(
     }
     else if (tuple.toPatternFlag || tuple.toLocalizedPatternFlag) {
         result = isToPatternPass(tuple, appendErrorMessage, status);
+    } else if (tuple.parseFlag && tuple.outputFlag && tuple.outputCurrencyFlag) {
+        result = isParseCurrencyPass(tuple, appendErrorMessage, status);
+
     } else if (tuple.parseFlag && tuple.outputFlag) {
         result = isParsePass(tuple, appendErrorMessage, status);
     } else if (tuple.pluralFlag) {
@@ -277,6 +280,16 @@ UBool DataDrivenNumberFormatTestSuite::isParsePass(
     return TRUE;
 }
 
+UBool DataDrivenNumberFormatTestSuite::isParseCurrencyPass(
+        const NumberFormatTestTuple & /* tuple */,
+        UnicodeString & /*appendErrorMessage*/,
+        UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return FALSE;
+    }
+    return TRUE;
+}
+
 UBool DataDrivenNumberFormatTestSuite::isSelectPass(
         const NumberFormatTestTuple & /* tuple */,
         UnicodeString & /*appendErrorMessage*/,
index 5c90cbf381f35a4d1d8b9cb76006186a43d4d0b6..98f06daaaae064c7802a143eb889a15ff80e8197 100644 (file)
@@ -96,6 +96,14 @@ class DataDrivenNumberFormatTestSuite : IntlTest {
             UnicodeString &appendErrorMessage,
             UErrorCode &status);
 
+    /**
+     * Test parsing with currency.
+     */
+    virtual UBool isParseCurrencyPass(
+            const NumberFormatTestTuple &tuple,
+            UnicodeString &appendErrorMessage,
+            UErrorCode &status);
+
     /**
      * Test plural selection.
      */
index a35aa97713c67d251b88bd23f0a92435b4dcf890..9caae2519c8e0334533c43708bd76886c0fffd31 100644 (file)
@@ -329,7 +329,8 @@ const NumberFormatTestTupleFieldData gFieldData[] = {
     FIELD_INIT(plural, &gStrOps),
     FIELD_INIT(parseIntegerOnly, &gIntOps),
     FIELD_INIT(decimalPatternMatchRequired, &gIntOps),
-    FIELD_INIT(parseNoExponent, &gIntOps)
+    FIELD_INIT(parseNoExponent, &gIntOps),
+    FIELD_INIT(outputCurrency, &gStrOps)
 };
 
 UBool
index 4a3a255d92669847a1d078b012fa941ce0e39f65..415b828eb8e1fe0fb9d7a75d16848cef7982f87d 100644 (file)
@@ -60,6 +60,7 @@ enum ENumberFormatTestTupleField {
     kParseIntegerOnly,
     kDecimalPatternMatchRequired,
     kParseNoExponent,
+    kOutputCurrency,
     kNumberFormatTestTupleFieldCount
 };
 
@@ -121,6 +122,7 @@ public:
     int32_t parseIntegerOnly;
     int32_t decimalPatternMatchRequired;
     int32_t parseNoExponent;
+    UnicodeString outputCurrency;
 
     UBool localeFlag;
     UBool currencyFlag;
@@ -165,6 +167,7 @@ public:
     UBool parseIntegerOnlyFlag;
     UBool decimalPatternMatchRequiredFlag;
     UBool parseNoExponentFlag;
+    UBool outputCurrencyFlag;
 
     NumberFormatTestTuple() {
         clear();
index 126e5540d977b500670f23dea2f38a5fe10ce9fa..a22bebd6c494094bdba6e327fcb5cdec86e235e5 100644 (file)
@@ -49,6 +49,10 @@ UBool isParsePass(
         const NumberFormatTestTuple &tuple,
         UnicodeString &appendErrorMessage,
         UErrorCode &status);
+UBool isParseCurrencyPass(
+        const NumberFormatTestTuple &tuple,
+        UnicodeString &appendErrorMessage,
+        UErrorCode &status);
 };
 
 static DigitList &strToDigitList(
@@ -360,6 +364,57 @@ UBool NumberFormatTestDataDriven::isParsePass(
     return TRUE;
 }
 
+UBool NumberFormatTestDataDriven::isParseCurrencyPass(
+        const NumberFormatTestTuple &tuple,
+        UnicodeString &appendErrorMessage,
+        UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return FALSE;
+    }
+    LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
+    if (U_FAILURE(status)) {
+        appendErrorMessage.append("Error creating DecimalFormat.");
+        return FALSE;
+    }
+    adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
+    if (appendErrorMessage.length() > 0) {
+        return FALSE;
+    }
+    ParsePosition ppos;
+    LocalPointer<CurrencyAmount> currAmt(
+            fmtPtr->parseCurrency(tuple.parse, ppos));
+    if (ppos.getIndex() == 0) {
+        if (tuple.output != "fail") {
+            appendErrorMessage.append("Parse failed but was expected to succeed.");
+            return FALSE;
+        }
+        return TRUE;
+    }
+    UnicodeString currStr(currAmt->getISOCurrency());
+    Formattable resultFormattable(currAmt->getNumber());
+    UnicodeString resultStr(UnicodeString::fromUTF8(resultFormattable.getDecimalNumber(status)));
+    if (tuple.output == "fail") {
+        appendErrorMessage.append(UnicodeString("Parse succeeded: ") + resultStr + ", but was expected to fail.");
+        return FALSE;
+    }
+    DigitList expected;
+    strToDigitList(tuple.output, expected, status);
+    if (U_FAILURE(status)) {
+        appendErrorMessage.append("Error parsing.");
+        return FALSE;
+    }
+    if (expected != *currAmt->getNumber().getDigitList()) {
+        appendErrorMessage.append(
+                    UnicodeString("Expected: ") + tuple.output + ", got: " + resultStr + ". ");
+        return FALSE;
+    }
+    if (currStr != tuple.outputCurrency) {
+        appendErrorMessage.append(UnicodeString(
+                "Expected currency: ") + tuple.outputCurrency + ", got: " + currStr + ". ");
+        return FALSE;
+    }
+    return TRUE;
+}
 
 //#define NUMFMTST_CACHE_DEBUG 1
 #include "stdio.h" /* for sprintf */
index 5df3087f5ce0dfe041f7d141ed98e9483bd40723..b32bf0b865b186e3f46a58e380dffb30759bbdd7 100644 (file)
@@ -721,6 +721,13 @@ parseNoExponent    parse   output  breaks
 1      5e2     5       J
 1      5.3E2   5.3     JK
 
+test parse currency fail
+set pattern 0
+set locale en
+begin
+parse  output  outputCurrency  breaks
+// See ticket 11735
+53.45  fail    USD     J
 
 test parse strange prefix
 set locale en
@@ -750,10 +757,10 @@ begin
 parse  output  breaks
 // C consumes the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549K  654     CJK
+// 6549K       654     CJK
 // C consumes the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549N  -654    CJK
+// 6549N       -654    CJK
 
 test really strange prefix
 set locale en
@@ -782,4 +789,297 @@ NaN       0.0     other
 5.1    0.0     one
 5.09   0.0     one
 
+test parse currency ISO
+set pattern 0.00 \u00a4\u00a4;(#) \u00a4\u00a4
+set locale en_US
+begin
+parse  output  outputCurrency  breaks
+$53.45 53.45   USD
+53.45 USD      53.45   USD
+USD 53.45      53.45   USD     J
+53.45USD       fail    USD
+USD53.45       53.45   USD
+(7.92) USD     -7.92   USD
+(7.92) EUR     -7.92   EUR
+(7.926) USD    -7.926  USD
+(7.926 USD)    fail    USD
+(USD 7.926)    fail    USD
+USD (7.926)    fail    USD
+USD (7.92)     fail    USD
+(7.92)USD      fail    USD
+USD(7.92)      fail    USD
+(8) USD        -8      USD
+-8 USD fail    USD
+67 USD 67      USD
+53.45$ fail    USD
+US Dollars 53.45       53.45   USD     J
+53.45 US Dollars       53.45   USD
+US Dollar 53.45        53.45   USD     J
+53.45 US Dollar        53.45   USD
+US Dollars53.45        53.45   USD
+53.45US Dollars        fail    USD
+US Dollar53.45 53.45   USD
+US Dollat53.45 fail    USD
+53.45US Dollar fail    USD
+US Dollars (53.45)     fail    USD
+(53.45) US Dollars     -53.45  USD
+US Dollar (53.45)      fail    USD
+(53.45) US Dollar      -53.45  USD
+US Dollars(53.45)      fail    USD
+(53.45)US Dollars      fail    USD
+US Dollar(53.45)       fail    USD
+US Dollat(53.45)       fail    USD
+(53.45)US Dollar       fail    USD
+
+
+test parse currency ISO negative
+set pattern 0.00 \u00a4\u00a4;-# \u00a4\u00a4
+set locale en_US
+begin
+parse  output  outputCurrency  breaks
+$53.45 53.45   USD
+53.45 USD      53.45   USD
+USD 53.45      53.45   USD     J
+53.45USD       fail    USD
+USD53.45       53.45   USD
+-7.92 USD      -7.92   USD
+-7.92 EUR      -7.92   EUR
+-7.926 USD     -7.926  USD
+USD -7.926     fail    USD
+-7.92USD       fail    USD
+USD-7.92       fail    USD
+-8 USD -8      USD
+67 USD 67      USD
+53.45$ fail    USD
+US Dollars 53.45       53.45   USD     J
+53.45 US Dollars       53.45   USD
+US Dollar 53.45        53.45   USD     J
+53.45 US Dollar        53.45   USD
+US Dollars53.45        53.45   USD
+53.45US Dollars        fail    USD
+US Dollar53.45 53.45   USD
+US Dollat53.45 fail    USD
+53.45US Dollar fail    USD
+
+
+test parse currency long
+set pattern 0.00 \u00a4\u00a4\u00a4;(#) \u00a4\u00a4\u00a4
+set locale en_US
+begin
+parse  output  outputCurrency  breaks
+$53.45 53.45   USD
+53.45 USD      53.45   USD
+USD 53.45      53.45   USD     J
+// See ticket 11735
+53.45USD       fail    USD     J
+USD53.45       53.45   USD
+(7.92) USD     -7.92   USD
+(7.926) USD    -7.926  USD
+(7.926 USD)    fail    USD
+(USD 7.926)    fail    USD
+USD (7.926)    fail    USD
+USD (7.92)     fail    USD
+(7.92)USD      fail    USD
+USD(7.92)      fail    USD
+(8) USD        -8      USD
+// See ticket 11735
+-8 USD fail    USD     J
+67 USD 67      USD
+// See ticket 11735
+53.45$ fail    USD     J
+US Dollars 53.45       53.45   USD     J
+53.45 US Dollars       53.45   USD
+US Dollar 53.45        53.45   USD     J
+53.45 US Dollar        53.45   USD
+US Dollars53.45        53.45   USD
+// See ticket 11735
+53.45US Dollars        fail    USD     J
+US Dollar53.45 53.45   USD
+US Dollat53.45 fail    USD
+// See ticket 11735
+53.45US Dollar fail    USD     J
+
+
+test parse currency short
+set pattern 0.00 \u00a4;(#) \u00a4
+set locale en_US
+begin
+parse  output  outputCurrency  breaks
+$53.45 53.45   USD
+53.45 USD      53.45   USD
+USD 53.45      53.45   USD     J
+53.45USD       fail    USD
+USD53.45       53.45   USD
+(7.92) USD     -7.92   USD
+(7.926) USD    -7.926  USD
+(7.926 USD)    fail    USD
+(USD 7.926)    fail    USD
+USD (7.926)    fail    USD
+USD (7.92)     fail    USD
+(7.92)USD      fail    USD
+USD(7.92)      fail    USD
+(8) USD        -8      USD
+-8 USD fail    USD
+67 USD 67      USD
+53.45$ fail    USD
+US Dollars 53.45       53.45   USD     J
+53.45 US Dollars       53.45   USD
+US Dollar 53.45        53.45   USD     J
+53.45 US Dollar        53.45   USD
+US Dollars53.45        53.45   USD
+53.45US Dollars        fail    USD
+US Dollar53.45 53.45   USD
+US Dollat53.45 fail    USD
+53.45US Dollar fail    USD
+
+
+test parse currency short prefix
+set pattern \u00a40.00;(\u00a4#)
+set locale en_US
+begin
+parse  output  outputCurrency  breaks
+$53.45 53.45   USD
+53.45 USD      fail    USD
+USD 53.45      53.45   USD     J
+53.45USD       fail    USD
+USD53.45       53.45   USD
+(7.92) USD     fail    USD
+(7.926) USD    fail    USD
+(7.926 USD)    fail    USD
+(USD 7.926)    -7.926  USD     J
+USD (7.926)    fail    USD
+USD (7.92)     fail    USD
+(7.92)USD      fail    USD
+USD(7.92)      fail    USD
+(8) USD        fail    USD
+-8 USD fail    USD
+67 USD fail    USD
+53.45$ fail    USD
+US Dollars 53.45       53.45   USD     J
+53.45 US Dollars       53.45   USD
+US Dollar 53.45        53.45   USD     J
+53.45 US Dollar        53.45   USD
+US Dollars53.45        53.45   USD
+53.45US Dollars        fail    USD
+US Dollar53.45 53.45   USD
+53.45US Dollar fail    USD
+
+test format foreign currency
+set locale fa_IR
+begin
+pattern        format  output  breaks
+\u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 #   1235    \u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5        K
+\u00a4\u00a4 0.00;\u00a4\u00a4 -#      1235    IRR \u06F1\u06F2\u06F3\u06F5    K
+\u00a4 0.00;\u00a4 -#  1235    \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5       K
+
+test parse foreign currency symbol
+set pattern \u00a4 0.00;\u00a4 -#
+set locale fa_IR
+begin
+parse  output  outputCurrency
+\u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5      1235    IRR
+IRR \u06F1\u06F2\u06F3\u06F5   1235    IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5       1235    IRR
+IRR 1235       1235    IRR
+\u0631\u06cc\u0627\u0644 1235  1235    IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235   1235    IRR
+
+test parse foreign currency ISO
+set pattern \u00a4\u00a4 0.00;\u00a4\u00a4 -#
+set locale fa_IR
+begin
+parse  output  outputCurrency
+\u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5      1235    IRR
+IRR \u06F1\u06F2\u06F3\u06F5   1235    IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5       1235    IRR
+IRR 1235       1235    IRR
+\u0631\u06cc\u0627\u0644 1235  1235    IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235   1235    IRR
+
+test parse foreign currency full
+set pattern \u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 -#
+set locale fa_IR
+begin
+parse  output  outputCurrency
+\u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5      1235    IRR
+IRR \u06F1\u06F2\u06F3\u06F5   1235    IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5       1235    IRR
+IRR 1235       1235    IRR
+\u0631\u06cc\u0627\u0644 1235  1235    IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235   1235    IRR
+
+test parse currency with foreign symbols symbol english
+set pattern \u00a4 0.00;\u00a4 (#)
+set locale en_US
+begin
+parse  output  outputCurrency
+EUR 7.82       7.82    EUR
+\u20ac 7.82    7.82    EUR
+Euro 7.82      7.82    EUR
+Euros 7.82     7.82    EUR
+
+test parse currency with foreign symbols ISO english
+set pattern \u00a4\u00a4 0.00;\u00a4\u00a4 (#)
+set locale en_US
+begin
+parse  output  outputCurrency
+EUR 7.82       7.82    EUR
+\u20ac 7.82    7.82    EUR
+Euro 7.82      7.82    EUR
+Euros 7.82     7.82    EUR
+
+test parse currency with foreign symbols full english
+set pattern \u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 (#)
+set locale en_US
+begin
+parse  output  outputCurrency
+EUR 7.82       7.82    EUR
+\u20ac 7.82    7.82    EUR
+Euro 7.82      7.82    EUR
+Euros 7.82     7.82    EUR
+
+test parse currency ISO strict
+set pattern 0.00 \u00a4\u00a4;(#) \u00a4\u00a4
+set locale en_US
+set lenient 0
+begin
+parse  output  outputCurrency  breaks
+$53.45 53.45   USD
+53.45 USD      53.45   USD
+USD 53.45      fail    USD
+53.45USD       fail    USD
+USD53.45       53.45   USD
+(7.92) USD     -7.92   USD
+(7.92) EUR     -7.92   EUR
+(7.926) USD    -7.926  USD
+(7.926 USD)    fail    USD
+(USD 7.926)    fail    USD
+USD (7.926)    fail    USD
+USD (7.92)     fail    USD
+(7.92)USD      fail    USD
+USD(7.92)      fail    USD
+(8) USD        -8      USD
+-8 USD fail    USD
+67 USD 67      USD
+53.45$ fail    USD
+US Dollars 53.45       fail    USD
+53.45 US Dollars       53.45   USD
+US Dollar 53.45        fail    USD
+53.45 US Dollar        53.45   USD
+US Dollars53.45        53.45   USD
+53.45US Dollars        fail    USD
+US Dollar53.45 53.45   USD
+US Dollat53.45 fail    USD
+53.45US Dollar fail    USD
+US Dollars (53.45)     fail    USD
+(53.45) US Dollars     -53.45  USD
+US Dollar (53.45)      fail    USD
+(53.45) US Dollar      -53.45  USD
+US Dollars(53.45)      fail    USD
+(53.45)US Dollars      fail    USD
+US Dollar(53.45)       fail    USD
+US Dollat(53.45)       fail    USD
+(53.45)US Dollar       fail    USD
+
+