| OLD | NEW |
| (Empty) |
| 1 /******************************************************************** | |
| 2 * COPYRIGHT: | |
| 3 * Copyright (c) 1997-2013, International Business Machines Corporation and | |
| 4 * others. All Rights Reserved. | |
| 5 ********************************************************************/ | |
| 6 | |
| 7 #include "unicode/utypes.h" | |
| 8 | |
| 9 #if !UCONFIG_NO_FORMATTING | |
| 10 | |
| 11 #include "unicode/dcfmtsym.h" | |
| 12 #include "unicode/decimfmt.h" | |
| 13 #include "unicode/unum.h" | |
| 14 #include "tsdcfmsy.h" | |
| 15 | |
| 16 void IntlTestDecimalFormatSymbols::runIndexedTest( int32_t index, UBool exec, co
nst char* &name, char* /*par*/ ) | |
| 17 { | |
| 18 if (exec) { | |
| 19 logln("TestSuite DecimalFormatSymbols:"); | |
| 20 } | |
| 21 TESTCASE_AUTO_BEGIN; | |
| 22 TESTCASE_AUTO(testSymbols); | |
| 23 TESTCASE_AUTO(testLastResortData); | |
| 24 TESTCASE_AUTO_END; | |
| 25 } | |
| 26 | |
| 27 /** | |
| 28 * Test the API of DecimalFormatSymbols; primarily a simple get/set set. | |
| 29 */ | |
| 30 void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */) | |
| 31 { | |
| 32 UErrorCode status = U_ZERO_ERROR; | |
| 33 | |
| 34 DecimalFormatSymbols fr(Locale::getFrench(), status); | |
| 35 if(U_FAILURE(status)) { | |
| 36 errcheckln(status, "ERROR: Couldn't create French DecimalFormatSymbols -
%s", u_errorName(status)); | |
| 37 return; | |
| 38 } | |
| 39 | |
| 40 status = U_ZERO_ERROR; | |
| 41 DecimalFormatSymbols en(Locale::getEnglish(), status); | |
| 42 if(U_FAILURE(status)) { | |
| 43 errcheckln(status, "ERROR: Couldn't create English DecimalFormatSymbols
- %s", u_errorName(status)); | |
| 44 return; | |
| 45 } | |
| 46 | |
| 47 if(en == fr || ! (en != fr) ) { | |
| 48 errln("ERROR: English DecimalFormatSymbols equal to French"); | |
| 49 } | |
| 50 | |
| 51 // just do some VERY basic tests to make sure that get/set work | |
| 52 | |
| 53 UnicodeString zero = en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol); | |
| 54 fr.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero); | |
| 55 if(fr.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol) != en.getSymbol(Deci
malFormatSymbols::kZeroDigitSymbol)) { | |
| 56 errln("ERROR: get/set ZeroDigit failed"); | |
| 57 } | |
| 58 | |
| 59 UnicodeString group = en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorS
ymbol); | |
| 60 fr.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, group); | |
| 61 if(fr.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol) != en.getSym
bol(DecimalFormatSymbols::kGroupingSeparatorSymbol)) { | |
| 62 errln("ERROR: get/set GroupingSeparator failed"); | |
| 63 } | |
| 64 | |
| 65 UnicodeString decimal = en.getSymbol(DecimalFormatSymbols::kDecimalSeparator
Symbol); | |
| 66 fr.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, decimal); | |
| 67 if(fr.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol) != en.getSymb
ol(DecimalFormatSymbols::kDecimalSeparatorSymbol)) { | |
| 68 errln("ERROR: get/set DecimalSeparator failed"); | |
| 69 } | |
| 70 | |
| 71 UnicodeString perMill = en.getSymbol(DecimalFormatSymbols::kPerMillSymbol); | |
| 72 fr.setSymbol(DecimalFormatSymbols::kPerMillSymbol, perMill); | |
| 73 if(fr.getSymbol(DecimalFormatSymbols::kPerMillSymbol) != en.getSymbol(Decima
lFormatSymbols::kPerMillSymbol)) { | |
| 74 errln("ERROR: get/set PerMill failed"); | |
| 75 } | |
| 76 | |
| 77 UnicodeString percent = en.getSymbol(DecimalFormatSymbols::kPercentSymbol); | |
| 78 fr.setSymbol(DecimalFormatSymbols::kPercentSymbol, percent); | |
| 79 if(fr.getSymbol(DecimalFormatSymbols::kPercentSymbol) != en.getSymbol(Decima
lFormatSymbols::kPercentSymbol)) { | |
| 80 errln("ERROR: get/set Percent failed"); | |
| 81 } | |
| 82 | |
| 83 UnicodeString digit(en.getSymbol(DecimalFormatSymbols::kDigitSymbol)); | |
| 84 fr.setSymbol(DecimalFormatSymbols::kDigitSymbol, digit); | |
| 85 if(fr.getSymbol(DecimalFormatSymbols::kDigitSymbol) != en.getSymbol(DecimalF
ormatSymbols::kDigitSymbol)) { | |
| 86 errln("ERROR: get/set Percent failed"); | |
| 87 } | |
| 88 | |
| 89 UnicodeString patternSeparator = en.getSymbol(DecimalFormatSymbols::kPattern
SeparatorSymbol); | |
| 90 fr.setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, patternSeparator
); | |
| 91 if(fr.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol) != en.getSymb
ol(DecimalFormatSymbols::kPatternSeparatorSymbol)) { | |
| 92 errln("ERROR: get/set PatternSeparator failed"); | |
| 93 } | |
| 94 | |
| 95 UnicodeString infinity(en.getSymbol(DecimalFormatSymbols::kInfinitySymbol)); | |
| 96 fr.setSymbol(DecimalFormatSymbols::kInfinitySymbol, infinity); | |
| 97 UnicodeString infinity2(fr.getSymbol(DecimalFormatSymbols::kInfinitySymbol))
; | |
| 98 if(infinity != infinity2) { | |
| 99 errln("ERROR: get/set Infinity failed"); | |
| 100 } | |
| 101 | |
| 102 UnicodeString nan(en.getSymbol(DecimalFormatSymbols::kNaNSymbol)); | |
| 103 fr.setSymbol(DecimalFormatSymbols::kNaNSymbol, nan); | |
| 104 UnicodeString nan2(fr.getSymbol(DecimalFormatSymbols::kNaNSymbol)); | |
| 105 if(nan != nan2) { | |
| 106 errln("ERROR: get/set NaN failed"); | |
| 107 } | |
| 108 | |
| 109 UnicodeString minusSign = en.getSymbol(DecimalFormatSymbols::kMinusSignSymbo
l); | |
| 110 fr.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, minusSign); | |
| 111 if(fr.getSymbol(DecimalFormatSymbols::kMinusSignSymbol) != en.getSymbol(Deci
malFormatSymbols::kMinusSignSymbol)) { | |
| 112 errln("ERROR: get/set MinusSign failed"); | |
| 113 } | |
| 114 | |
| 115 UnicodeString exponential(en.getSymbol(DecimalFormatSymbols::kExponentialSym
bol)); | |
| 116 fr.setSymbol(DecimalFormatSymbols::kExponentialSymbol, exponential); | |
| 117 if(fr.getSymbol(DecimalFormatSymbols::kExponentialSymbol) != en.getSymbol(De
cimalFormatSymbols::kExponentialSymbol)) { | |
| 118 errln("ERROR: get/set Exponential failed"); | |
| 119 } | |
| 120 | |
| 121 // Test get currency spacing before the currency. | |
| 122 status = U_ZERO_ERROR; | |
| 123 for (int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; i++) { | |
| 124 UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing( | |
| 125 (UCurrencySpacing)i, TRUE, status); | |
| 126 if(U_FAILURE(status)) { | |
| 127 errln("Error: cannot get CurrencyMatch for locale:en"); | |
| 128 status = U_ZERO_ERROR; | |
| 129 } | |
| 130 UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing( | |
| 131 (UCurrencySpacing)i, TRUE, status); | |
| 132 if(U_FAILURE(status)) { | |
| 133 errln("Error: cannot get CurrencyMatch for locale:fr"); | |
| 134 } | |
| 135 if (enCurrencyPattern != frCurrencyPattern) { | |
| 136 errln("ERROR: get CurrencySpacing failed"); | |
| 137 } | |
| 138 } | |
| 139 // Test get currencySpacing after the currency. | |
| 140 status = U_ZERO_ERROR; | |
| 141 for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { | |
| 142 UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing( | |
| 143 (UCurrencySpacing)i, FALSE, status); | |
| 144 if(U_FAILURE(status)) { | |
| 145 errln("Error: cannot get CurrencyMatch for locale:en"); | |
| 146 status = U_ZERO_ERROR; | |
| 147 } | |
| 148 UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing( | |
| 149 (UCurrencySpacing)i, FALSE, status); | |
| 150 if(U_FAILURE(status)) { | |
| 151 errln("Error: cannot get CurrencyMatch for locale:fr"); | |
| 152 } | |
| 153 if (enCurrencyPattern != frCurrencyPattern) { | |
| 154 errln("ERROR: get CurrencySpacing failed"); | |
| 155 } | |
| 156 } | |
| 157 // Test set curerncySpacing APIs | |
| 158 status = U_ZERO_ERROR; | |
| 159 UnicodeString dash = UnicodeString("-"); | |
| 160 en.setPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, TRUE, dash); | |
| 161 UnicodeString enCurrencyInsert = en.getPatternForCurrencySpacing( | |
| 162 UNUM_CURRENCY_INSERT, TRUE, status); | |
| 163 if (dash != enCurrencyInsert) { | |
| 164 errln("Error: Failed to setCurrencyInsert for locale:en"); | |
| 165 } | |
| 166 | |
| 167 status = U_ZERO_ERROR; | |
| 168 DecimalFormatSymbols foo(status); | |
| 169 | |
| 170 DecimalFormatSymbols bar(foo); | |
| 171 | |
| 172 en = fr; | |
| 173 | |
| 174 if(en != fr || foo != bar) { | |
| 175 errln("ERROR: Copy Constructor or Assignment failed"); | |
| 176 } | |
| 177 | |
| 178 // test get/setSymbol() | |
| 179 if((int) UNUM_FORMAT_SYMBOL_COUNT != (int) DecimalFormatSymbols::kFormatSymb
olCount) { | |
| 180 errln("unum.h and decimfmt.h have inconsistent numbers of format symbols
!"); | |
| 181 return; | |
| 182 } | |
| 183 | |
| 184 int i; | |
| 185 for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) { | |
| 186 foo.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i, UnicodeStrin
g((UChar32)(0x10330 + i))); | |
| 187 } | |
| 188 for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) { | |
| 189 if(foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) != Unicod
eString((UChar32)(0x10330 + i))) { | |
| 190 errln("get/setSymbol did not roundtrip, got " + | |
| 191 foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) + | |
| 192 ", expected " + | |
| 193 UnicodeString((UChar32)(0x10330 + i))); | |
| 194 } | |
| 195 } | |
| 196 | |
| 197 DecimalFormatSymbols sym(Locale::getUS(), status); | |
| 198 | |
| 199 UnicodeString customDecSeperator("S"); | |
| 200 Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34.50"); | |
| 201 sym.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, customDecSepera
tor); | |
| 202 Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34S50"); | |
| 203 sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UnicodeString)"P"); | |
| 204 Verify(34.5, (UnicodeString)"00 %", sym, (UnicodeString)"3450 P"); | |
| 205 sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, (UnicodeString)"D"); | |
| 206 Verify(34.5, CharsToUnicodeString("\\u00a4##.##"), sym, (UnicodeString)"D34.
5"); | |
| 207 sym.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, (UnicodeString
)"|"); | |
| 208 Verify(3456.5, (UnicodeString)"0,000.##", sym, (UnicodeString)"3|456S5"); | |
| 209 | |
| 210 } | |
| 211 | |
| 212 void IntlTestDecimalFormatSymbols::testLastResortData() { | |
| 213 IcuTestErrorCode errorCode(*this, "testLastResortData"); | |
| 214 LocalPointer<DecimalFormatSymbols> lastResort( | |
| 215 DecimalFormatSymbols::createWithLastResortData(errorCode)); | |
| 216 if(errorCode.logIfFailureAndReset("DecimalFormatSymbols::createWithLastResor
tData() failed")) { | |
| 217 return; | |
| 218 } | |
| 219 DecimalFormatSymbols root(Locale::getRoot(), errorCode); | |
| 220 if(errorCode.logDataIfFailureAndReset("DecimalFormatSymbols(root) failed"))
{ | |
| 221 return; | |
| 222 } | |
| 223 // Note: It is not necessary that the last resort data matches the root loca
le, | |
| 224 // but it seems weird if most symbols did not match. | |
| 225 // Also, one purpose for calling operator==() is to find uninitialized memor
y in a debug build. | |
| 226 if(*lastResort == root) { | |
| 227 errln("DecimalFormatSymbols last resort data unexpectedly matches root")
; | |
| 228 } | |
| 229 // Here we adjust for expected differences. | |
| 230 assertEquals("last-resort grouping separator", | |
| 231 "", lastResort->getSymbol(DecimalFormatSymbols::kGroupingSepara
torSymbol)); | |
| 232 lastResort->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, ","); | |
| 233 assertEquals("last-resort monetary grouping separator", | |
| 234 "", lastResort->getSymbol(DecimalFormatSymbols::kMonetaryGroupi
ngSeparatorSymbol)); | |
| 235 lastResort->setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol
, ","); | |
| 236 assertEquals("last-resort NaN", | |
| 237 UnicodeString((UChar)0xfffd), lastResort->getSymbol(DecimalForm
atSymbols::kNaNSymbol)); | |
| 238 lastResort->setSymbol(DecimalFormatSymbols::kNaNSymbol, "NaN"); | |
| 239 // Check that now all of the symbols match root. | |
| 240 for(int32_t i = 0; i < DecimalFormatSymbols::kFormatSymbolCount; ++i) { | |
| 241 DecimalFormatSymbols::ENumberFormatSymbol e = (DecimalFormatSymbols::ENu
mberFormatSymbol)i; | |
| 242 assertEquals("last-resort symbol vs. root", root.getSymbol(e), lastResor
t->getSymbol(e)); | |
| 243 } | |
| 244 // Also, the CurrencySpacing patterns are empty in the last resort instance, | |
| 245 // but not in root. | |
| 246 Verify(1234567.25, "#,##0.##", *lastResort, "1,234,567.25"); | |
| 247 } | |
| 248 | |
| 249 void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pat
tern, | |
| 250 const DecimalFormatSymbols &sym, const
UnicodeString& expected){ | |
| 251 UErrorCode status = U_ZERO_ERROR; | |
| 252 DecimalFormat df(pattern, sym, status); | |
| 253 if(U_FAILURE(status)){ | |
| 254 errln("ERROR: construction of decimal format failed - %s", u_errorName(s
tatus)); | |
| 255 } | |
| 256 UnicodeString buffer; | |
| 257 FieldPosition pos(FieldPosition::DONT_CARE); | |
| 258 buffer = df.format(value, buffer, pos); | |
| 259 if(buffer != expected){ | |
| 260 errln((UnicodeString)"ERROR: format() returns wrong result\n Expected "
+ | |
| 261 expected + ", Got " + buffer); | |
| 262 } | |
| 263 } | |
| 264 | |
| 265 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
| OLD | NEW |