]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/tsdcfmsy.cpp
ICU-531.48.tar.gz
[apple/icu.git] / icuSources / test / intltest / tsdcfmsy.cpp
index e243eec1a1f27cb8c9e5c21b7e2f704341c1ad3d..bfb00156644a866a3597b3bc01ec36d31493e49f 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
- * COPYRIGHT: 
- * Copyright (c) 1997-2001, International Business Machines Corporation and
+ * COPYRIGHT:
+ * Copyright (c) 1997-2013, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
 
 void IntlTestDecimalFormatSymbols::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
 {
-    if (exec) logln("TestSuite DecimalFormatSymbols");
-    switch (index) {
-        case 0: name = "DecimalFormatSymbols test"; 
-                if (exec) {
-                    logln("DecimalFormatSymbols test---"); logln("");
-                    testSymbols(/*par*/);
-                }
-                break;
-
-        default: name = ""; break;
+    if (exec) {
+        logln("TestSuite DecimalFormatSymbols:");
     }
+    TESTCASE_AUTO_BEGIN;
+    TESTCASE_AUTO(testSymbols);
+    TESTCASE_AUTO(testLastResortData);
+    TESTCASE_AUTO_END;
 }
 
 /**
@@ -37,13 +33,15 @@ void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */)
 
     DecimalFormatSymbols fr(Locale::getFrench(), status);
     if(U_FAILURE(status)) {
-        errln("ERROR: Couldn't create French DecimalFormatSymbols");
+        errcheckln(status, "ERROR: Couldn't create French DecimalFormatSymbols - %s", u_errorName(status));
+        return;
     }
 
     status = U_ZERO_ERROR;
     DecimalFormatSymbols en(Locale::getEnglish(), status);
     if(U_FAILURE(status)) {
-        errln("ERROR: Couldn't create English DecimalFormatSymbols");
+        errcheckln(status, "ERROR: Couldn't create English DecimalFormatSymbols - %s", u_errorName(status));
+        return;
     }
 
     if(en == fr || ! (en != fr) ) {
@@ -113,16 +111,62 @@ void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */)
     if(fr.getSymbol(DecimalFormatSymbols::kMinusSignSymbol) != en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol)) {
         errln("ERROR: get/set MinusSign failed");
     }
+
     UnicodeString exponential(en.getSymbol(DecimalFormatSymbols::kExponentialSymbol));
     fr.setSymbol(DecimalFormatSymbols::kExponentialSymbol, exponential);
     if(fr.getSymbol(DecimalFormatSymbols::kExponentialSymbol) != en.getSymbol(DecimalFormatSymbols::kExponentialSymbol)) {
         errln("ERROR: get/set Exponential failed");
     }
 
+    // Test get currency spacing before the currency.
+    status = U_ZERO_ERROR;
+    for (int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; i++) {
+        UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing(
+             (UCurrencySpacing)i, TRUE, status);
+        if(U_FAILURE(status)) {
+            errln("Error: cannot get CurrencyMatch for locale:en");
+            status = U_ZERO_ERROR;
+        }
+        UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing(
+             (UCurrencySpacing)i, TRUE, status);
+        if(U_FAILURE(status)) {
+            errln("Error: cannot get CurrencyMatch for locale:fr");
+        }
+        if (enCurrencyPattern != frCurrencyPattern) {
+           errln("ERROR: get CurrencySpacing failed");
+        }
+    }
+    // Test get currencySpacing after the currency.
+    status = U_ZERO_ERROR;
+    for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) {
+        UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing(
+            (UCurrencySpacing)i, FALSE, status);
+        if(U_FAILURE(status)) {
+            errln("Error: cannot get CurrencyMatch for locale:en");
+            status = U_ZERO_ERROR;
+        }
+        UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing(
+             (UCurrencySpacing)i, FALSE, status);
+        if(U_FAILURE(status)) {
+            errln("Error: cannot get CurrencyMatch for locale:fr");
+        }
+        if (enCurrencyPattern != frCurrencyPattern) {
+            errln("ERROR: get CurrencySpacing failed");
+        }
+    }
+    // Test set curerncySpacing APIs
+    status = U_ZERO_ERROR;
+    UnicodeString dash = UnicodeString("-");
+    en.setPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, TRUE, dash);
+    UnicodeString enCurrencyInsert = en.getPatternForCurrencySpacing(
+        UNUM_CURRENCY_INSERT, TRUE, status);
+    if (dash != enCurrencyInsert) {
+        errln("Error: Failed to setCurrencyInsert for locale:en");
+    }
+
     status = U_ZERO_ERROR;
     DecimalFormatSymbols foo(status);
-    
+
     DecimalFormatSymbols bar(foo);
 
     en = fr;
@@ -149,37 +193,73 @@ void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */)
                   UnicodeString((UChar32)(0x10330 + i)));
         }
     }
-   
-   
+
     DecimalFormatSymbols sym(Locale::getUS(), status);
 
     UnicodeString customDecSeperator("S");
     Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34.50");
-    sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)0, customDecSeperator);
+    sym.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, customDecSeperator);
     Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34S50");
-    sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)3, (UnicodeString)"P");
+    sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UnicodeString)"P");
     Verify(34.5, (UnicodeString)"00 %", sym, (UnicodeString)"3450 P");
-    sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)8, (UnicodeString)"D");
+    sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, (UnicodeString)"D");
     Verify(34.5, CharsToUnicodeString("\\u00a4##.##"), sym, (UnicodeString)"D34.5");
-    sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)1, (UnicodeString)"|");
+    sym.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, (UnicodeString)"|");
     Verify(3456.5, (UnicodeString)"0,000.##", sym, (UnicodeString)"3|456S5");
-    
+
+}
+
+void IntlTestDecimalFormatSymbols::testLastResortData() {
+    IcuTestErrorCode errorCode(*this, "testLastResortData");
+    LocalPointer<DecimalFormatSymbols> lastResort(
+        DecimalFormatSymbols::createWithLastResortData(errorCode));
+    if(errorCode.logIfFailureAndReset("DecimalFormatSymbols::createWithLastResortData() failed")) {
+        return;
+    }
+    DecimalFormatSymbols root(Locale::getRoot(), errorCode);
+    if(errorCode.logDataIfFailureAndReset("DecimalFormatSymbols(root) failed")) {
+        return;
+    }
+    // Note: It is not necessary that the last resort data matches the root locale,
+    // but it seems weird if most symbols did not match.
+    // Also, one purpose for calling operator==() is to find uninitialized memory in a debug build.
+    if(*lastResort == root) {
+        errln("DecimalFormatSymbols last resort data unexpectedly matches root");
+    }
+    // Here we adjust for expected differences.
+    assertEquals("last-resort grouping separator",
+                 "", lastResort->getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol));
+    lastResort->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, ",");
+    assertEquals("last-resort monetary grouping separator",
+                 "", lastResort->getSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol));
+    lastResort->setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, ",");
+    assertEquals("last-resort NaN",
+                 UnicodeString((UChar)0xfffd), lastResort->getSymbol(DecimalFormatSymbols::kNaNSymbol));
+    lastResort->setSymbol(DecimalFormatSymbols::kNaNSymbol, "NaN");
+    // Check that now all of the symbols match root.
+    for(int32_t i = 0; i < DecimalFormatSymbols::kFormatSymbolCount; ++i) {
+        DecimalFormatSymbols::ENumberFormatSymbol e = (DecimalFormatSymbols::ENumberFormatSymbol)i;
+        assertEquals("last-resort symbol vs. root", root.getSymbol(e), lastResort->getSymbol(e));
+    }
+    // Also, the CurrencySpacing patterns are empty in the last resort instance,
+    // but not in root.
+    Verify(1234567.25, "#,##0.##", *lastResort, "1,234,567.25");
 }
 
-void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern, DecimalFormatSymbols sym, const UnicodeString& expected){
+void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern,
+                                          const DecimalFormatSymbols &sym, const UnicodeString& expected){
     UErrorCode status = U_ZERO_ERROR;
-    DecimalFormat *df = new DecimalFormat(pattern, sym, status);
+    DecimalFormat df(pattern, sym, status);
     if(U_FAILURE(status)){
-        errln("ERROR: construction of decimal format failed");
+        errln("ERROR: construction of decimal format failed - %s", u_errorName(status));
     }
     UnicodeString buffer;
     FieldPosition pos(FieldPosition::DONT_CARE);
-    buffer = df->format(value, buffer, pos);
+    buffer = df.format(value, buffer, pos);
     if(buffer != expected){
-        errln((UnicodeString)"ERROR: format failed after setSymbols()\n Expected " + 
+        errln((UnicodeString)"ERROR: format() returns wrong result\n Expected " +
             expected + ", Got " + buffer);
     }
-    delete df;
 }
 
 #endif /* #if !UCONFIG_NO_FORMATTING */