/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-1999, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #include "unicode/utypes.h" #include "unicode/dcfmtsym.h" #include "unicode/decimfmt.h" #include "unicode/unum.h" #include "tsdcfmsy.h" 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; } } /** * Test the API of DecimalFormatSymbols; primarily a simple get/set set. */ void IntlTestDecimalFormatSymbols::testSymbols(char *par) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols fr(Locale::FRENCH, status); if(U_FAILURE(status)) { errln("ERROR: Couldn't create French DecimalFormatSymbols"); } status = U_ZERO_ERROR; DecimalFormatSymbols en(Locale::ENGLISH, status); if(U_FAILURE(status)) { errln("ERROR: Couldn't create English DecimalFormatSymbols"); } if(en == fr || ! (en != fr) ) { errln("ERROR: English DecimalFormatSymbols equal to French"); } // just do some VERY basic tests to make sure that get/set work UChar zero = en.getZeroDigit(); fr.setZeroDigit(zero); if(fr.getZeroDigit() != en.getZeroDigit()) { errln("ERROR: get/set ZeroDigit failed"); } UChar group = en.getGroupingSeparator(); fr.setGroupingSeparator(group); if(fr.getGroupingSeparator() != en.getGroupingSeparator()) { errln("ERROR: get/set GroupingSeparator failed"); } UChar decimal = en.getDecimalSeparator(); fr.setDecimalSeparator(decimal); if(fr.getDecimalSeparator() != en.getDecimalSeparator()) { errln("ERROR: get/set DecimalSeparator failed"); } UChar perMill = en.getPerMill(); fr.setPerMill(perMill); if(fr.getPerMill() != en.getPerMill()) { errln("ERROR: get/set PerMill failed"); } UChar percent = en.getPercent(); fr.setPercent(percent); if(fr.getPercent() != en.getPercent()) { errln("ERROR: get/set Percent failed"); } UChar digit = en.getDigit(); fr.setDigit(digit); if(fr.getPercent() != en.getPercent()) { errln("ERROR: get/set Percent failed"); } UChar patternSeparator = en.getPatternSeparator(); fr.setPatternSeparator(patternSeparator); if(fr.getPatternSeparator() != en.getPatternSeparator()) { errln("ERROR: get/set PatternSeparator failed"); } UnicodeString infinity; infinity = en.getInfinity(infinity); fr.setInfinity(infinity); UnicodeString infinity2; infinity2 = fr.getInfinity(infinity2); if(infinity != infinity2) { errln("ERROR: get/set Infinity failed"); } UnicodeString nan; nan = en.getNaN(infinity); fr.setNaN(nan); UnicodeString nan2; nan2 = fr.getNaN(nan2); if(nan != nan2) { errln("ERROR: get/set NaN failed"); } UChar minusSign = en.getMinusSign(); fr.setMinusSign(minusSign); if(fr.getMinusSign() != en.getMinusSign()) { errln("ERROR: get/set MinusSign failed"); } UChar exponential = en.getExponentialSymbol(); fr.setExponentialSymbol(exponential); if(fr.getExponentialSymbol() != en.getExponentialSymbol()) { errln("ERROR: get/set Exponential failed"); } status = U_ZERO_ERROR; DecimalFormatSymbols foo(status); DecimalFormatSymbols bar(foo); en = fr; if(en != fr || foo != bar) { errln("ERROR: Copy Constructor or Assignment failed"); } // test get/setSymbol() if((int) UNUM_FORMAT_SYMBOL_COUNT != (int) DecimalFormatSymbols::kFormatSymbolCount) { errln("unum.h and decimfmt.h have inconsistent numbers of format symbols!"); return; } int i; for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) { foo.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i, UnicodeString((UChar32)(0x10330 + i))); } for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) { if(foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) != UnicodeString((UChar32)(0x10330 + i))) { errln("get/setSymbol did not roundtrip, got " + foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) + ", expected " + UnicodeString((UChar32)(0x10330 + i))); } } DecimalFormatSymbols sym(Locale::US, status); UnicodeString customDecSeperator("S"); Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34.50"); sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)0, customDecSeperator); Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34S50"); sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)3, (UnicodeString)"P"); Verify(34.5, (UnicodeString)"00 %", sym, (UnicodeString)"3450 P"); sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)8, (UnicodeString)"D"); Verify(34.5, CharsToUnicodeString("\\u00a4##.##"), sym, (UnicodeString)"D34.5"); sym.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)1, (UnicodeString)"|"); Verify(3456.5, (UnicodeString)"0,000.##", sym, (UnicodeString)"3|456S5"); } void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern, DecimalFormatSymbols sym, const UnicodeString& expected){ UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(pattern, sym, status); if(U_FAILURE(status)){ errln("ERROR: construction of decimal format failed"); } UnicodeString buffer; FieldPosition pos(FieldPosition::DONT_CARE); buffer = df->format(value, buffer, pos); if(buffer != expected){ errln((UnicodeString)"ERROR: format failed after setSymbols()\n Expected" + expected + ", Got " + buffer); } delete df; }