1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * COPYRIGHT:
359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (c) 1997-2013, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/dcfmtsym.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/decimfmt.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unum.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "tsdcfmsy.h"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid IntlTestDecimalFormatSymbols::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1859d709d503bab6e2b61931737e662dd293b40578ccornelius    if (exec) {
1959d709d503bab6e2b61931737e662dd293b40578ccornelius        logln("TestSuite DecimalFormatSymbols:");
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2159d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE_AUTO_BEGIN;
2259d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE_AUTO(testSymbols);
2359d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE_AUTO(testLastResortData);
2459d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE_AUTO_END;
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test the API of DecimalFormatSymbols; primarily a simple get/set set.
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid IntlTestDecimalFormatSymbols::testSymbols(/* char *par */)
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DecimalFormatSymbols fr(Locale::getFrench(), status);
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        errcheckln(status, "ERROR: Couldn't create French DecimalFormatSymbols - %s", u_errorName(status));
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DecimalFormatSymbols en(Locale::getEnglish(), status);
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        errcheckln(status, "ERROR: Couldn't create English DecimalFormatSymbols - %s", u_errorName(status));
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(en == fr || ! (en != fr) ) {
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: English DecimalFormatSymbols equal to French");
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // just do some VERY basic tests to make sure that get/set work
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString zero = en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol);
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, zero);
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol) != en.getSymbol(DecimalFormatSymbols::kZeroDigitSymbol)) {
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set ZeroDigit failed");
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString group = en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol);
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, group);
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)) {
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set GroupingSeparator failed");
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString decimal = en.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol);
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, decimal);
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)) {
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set DecimalSeparator failed");
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString perMill = en.getSymbol(DecimalFormatSymbols::kPerMillSymbol);
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kPerMillSymbol, perMill);
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kPerMillSymbol) != en.getSymbol(DecimalFormatSymbols::kPerMillSymbol)) {
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set PerMill failed");
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString percent = en.getSymbol(DecimalFormatSymbols::kPercentSymbol);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kPercentSymbol, percent);
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kPercentSymbol) != en.getSymbol(DecimalFormatSymbols::kPercentSymbol)) {
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set Percent failed");
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString digit(en.getSymbol(DecimalFormatSymbols::kDigitSymbol));
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kDigitSymbol, digit);
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kDigitSymbol) != en.getSymbol(DecimalFormatSymbols::kDigitSymbol)) {
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set Percent failed");
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString patternSeparator = en.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol);
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, patternSeparator);
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol) != en.getSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol)) {
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set PatternSeparator failed");
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString infinity(en.getSymbol(DecimalFormatSymbols::kInfinitySymbol));
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kInfinitySymbol, infinity);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString infinity2(fr.getSymbol(DecimalFormatSymbols::kInfinitySymbol));
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(infinity != infinity2) {
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set Infinity failed");
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString nan(en.getSymbol(DecimalFormatSymbols::kNaNSymbol));
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kNaNSymbol, nan);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString nan2(fr.getSymbol(DecimalFormatSymbols::kNaNSymbol));
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(nan != nan2) {
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set NaN failed");
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString minusSign = en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol);
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, minusSign);
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kMinusSignSymbol) != en.getSymbol(DecimalFormatSymbols::kMinusSignSymbol)) {
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set MinusSign failed");
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString exponential(en.getSymbol(DecimalFormatSymbols::kExponentialSymbol));
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fr.setSymbol(DecimalFormatSymbols::kExponentialSymbol, exponential);
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fr.getSymbol(DecimalFormatSymbols::kExponentialSymbol) != en.getSymbol(DecimalFormatSymbols::kExponentialSymbol)) {
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: get/set Exponential failed");
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // Test get currency spacing before the currency.
12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    status = U_ZERO_ERROR;
123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; i++) {
12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing(
125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho             (UCurrencySpacing)i, TRUE, status);
12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errln("Error: cannot get CurrencyMatch for locale:en");
12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            status = U_ZERO_ERROR;
12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing(
131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho             (UCurrencySpacing)i, TRUE, status);
13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errln("Error: cannot get CurrencyMatch for locale:fr");
13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (enCurrencyPattern != frCurrencyPattern) {
13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho           errln("ERROR: get CurrencySpacing failed");
13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // Test get currencySpacing after the currency.
14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    status = U_ZERO_ERROR;
141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) {
14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UnicodeString enCurrencyPattern = en.getPatternForCurrencySpacing(
143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            (UCurrencySpacing)i, FALSE, status);
14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errln("Error: cannot get CurrencyMatch for locale:en");
14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            status = U_ZERO_ERROR;
14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UnicodeString frCurrencyPattern = fr.getPatternForCurrencySpacing(
149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho             (UCurrencySpacing)i, FALSE, status);
15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(status)) {
15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errln("Error: cannot get CurrencyMatch for locale:fr");
15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (enCurrencyPattern != frCurrencyPattern) {
15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            errln("ERROR: get CurrencySpacing failed");
15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // Test set curerncySpacing APIs
15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    status = U_ZERO_ERROR;
15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UnicodeString dash = UnicodeString("-");
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    en.setPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, TRUE, dash);
16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UnicodeString enCurrencyInsert = en.getPatternForCurrencySpacing(
162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNUM_CURRENCY_INSERT, TRUE, status);
16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (dash != enCurrencyInsert) {
16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        errln("Error: Failed to setCurrencyInsert for locale:en");
16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DecimalFormatSymbols foo(status);
16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DecimalFormatSymbols bar(foo);
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    en = fr;
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(en != fr || foo != bar) {
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("ERROR: Copy Constructor or Assignment failed");
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // test get/setSymbol()
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if((int) UNUM_FORMAT_SYMBOL_COUNT != (int) DecimalFormatSymbols::kFormatSymbolCount) {
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("unum.h and decimfmt.h have inconsistent numbers of format symbols!");
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i;
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) {
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        foo.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i, UnicodeString((UChar32)(0x10330 + i)));
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i = 0; i < (int)DecimalFormatSymbols::kFormatSymbolCount; ++i) {
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) != UnicodeString((UChar32)(0x10330 + i))) {
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("get/setSymbol did not roundtrip, got " +
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  foo.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)i) +
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  ", expected " +
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  UnicodeString((UChar32)(0x10330 + i)));
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString customDecSeperator("S");
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34.50");
20127f654740f2a26ad62a5c155af9199af9e69b889claireho    sym.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, customDecSeperator);
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Verify(34.5, (UnicodeString)"00.00", sym, (UnicodeString)"34S50");
20327f654740f2a26ad62a5c155af9199af9e69b889claireho    sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UnicodeString)"P");
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Verify(34.5, (UnicodeString)"00 %", sym, (UnicodeString)"3450 P");
20527f654740f2a26ad62a5c155af9199af9e69b889claireho    sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, (UnicodeString)"D");
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Verify(34.5, CharsToUnicodeString("\\u00a4##.##"), sym, (UnicodeString)"D34.5");
20727f654740f2a26ad62a5c155af9199af9e69b889claireho    sym.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, (UnicodeString)"|");
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Verify(3456.5, (UnicodeString)"0,000.##", sym, (UnicodeString)"3|456S5");
20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21259d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid IntlTestDecimalFormatSymbols::testLastResortData() {
21359d709d503bab6e2b61931737e662dd293b40578ccornelius    IcuTestErrorCode errorCode(*this, "testLastResortData");
21459d709d503bab6e2b61931737e662dd293b40578ccornelius    LocalPointer<DecimalFormatSymbols> lastResort(
21559d709d503bab6e2b61931737e662dd293b40578ccornelius        DecimalFormatSymbols::createWithLastResortData(errorCode));
21659d709d503bab6e2b61931737e662dd293b40578ccornelius    if(errorCode.logIfFailureAndReset("DecimalFormatSymbols::createWithLastResortData() failed")) {
21759d709d503bab6e2b61931737e662dd293b40578ccornelius        return;
21859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
21959d709d503bab6e2b61931737e662dd293b40578ccornelius    DecimalFormatSymbols root(Locale::getRoot(), errorCode);
22059d709d503bab6e2b61931737e662dd293b40578ccornelius    if(errorCode.logDataIfFailureAndReset("DecimalFormatSymbols(root) failed")) {
22159d709d503bab6e2b61931737e662dd293b40578ccornelius        return;
22259d709d503bab6e2b61931737e662dd293b40578ccornelius    }
22359d709d503bab6e2b61931737e662dd293b40578ccornelius    // Note: It is not necessary that the last resort data matches the root locale,
22459d709d503bab6e2b61931737e662dd293b40578ccornelius    // but it seems weird if most symbols did not match.
22559d709d503bab6e2b61931737e662dd293b40578ccornelius    // Also, one purpose for calling operator==() is to find uninitialized memory in a debug build.
22659d709d503bab6e2b61931737e662dd293b40578ccornelius    if(*lastResort == root) {
22759d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("DecimalFormatSymbols last resort data unexpectedly matches root");
22859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
22959d709d503bab6e2b61931737e662dd293b40578ccornelius    // Here we adjust for expected differences.
23059d709d503bab6e2b61931737e662dd293b40578ccornelius    assertEquals("last-resort grouping separator",
23159d709d503bab6e2b61931737e662dd293b40578ccornelius                 "", lastResort->getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol));
23259d709d503bab6e2b61931737e662dd293b40578ccornelius    lastResort->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, ",");
23359d709d503bab6e2b61931737e662dd293b40578ccornelius    assertEquals("last-resort monetary grouping separator",
23459d709d503bab6e2b61931737e662dd293b40578ccornelius                 "", lastResort->getSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol));
23559d709d503bab6e2b61931737e662dd293b40578ccornelius    lastResort->setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, ",");
23659d709d503bab6e2b61931737e662dd293b40578ccornelius    assertEquals("last-resort NaN",
23759d709d503bab6e2b61931737e662dd293b40578ccornelius                 UnicodeString((UChar)0xfffd), lastResort->getSymbol(DecimalFormatSymbols::kNaNSymbol));
23859d709d503bab6e2b61931737e662dd293b40578ccornelius    lastResort->setSymbol(DecimalFormatSymbols::kNaNSymbol, "NaN");
23959d709d503bab6e2b61931737e662dd293b40578ccornelius    // Check that now all of the symbols match root.
24059d709d503bab6e2b61931737e662dd293b40578ccornelius    for(int32_t i = 0; i < DecimalFormatSymbols::kFormatSymbolCount; ++i) {
24159d709d503bab6e2b61931737e662dd293b40578ccornelius        DecimalFormatSymbols::ENumberFormatSymbol e = (DecimalFormatSymbols::ENumberFormatSymbol)i;
24259d709d503bab6e2b61931737e662dd293b40578ccornelius        assertEquals("last-resort symbol vs. root", root.getSymbol(e), lastResort->getSymbol(e));
24359d709d503bab6e2b61931737e662dd293b40578ccornelius    }
24459d709d503bab6e2b61931737e662dd293b40578ccornelius    // Also, the CurrencySpacing patterns are empty in the last resort instance,
24559d709d503bab6e2b61931737e662dd293b40578ccornelius    // but not in root.
24659d709d503bab6e2b61931737e662dd293b40578ccornelius    Verify(1234567.25, "#,##0.##", *lastResort, "1,234,567.25");
24759d709d503bab6e2b61931737e662dd293b40578ccornelius}
24859d709d503bab6e2b61931737e662dd293b40578ccornelius
24959d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern,
25059d709d503bab6e2b61931737e662dd293b40578ccornelius                                          const DecimalFormatSymbols &sym, const UnicodeString& expected){
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
25259d709d503bab6e2b61931737e662dd293b40578ccornelius    DecimalFormat df(pattern, sym, status);
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
25459d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("ERROR: construction of decimal format failed - %s", u_errorName(status));
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString buffer;
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
25859d709d503bab6e2b61931737e662dd293b40578ccornelius    buffer = df.format(value, buffer, pos);
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(buffer != expected){
26059d709d503bab6e2b61931737e662dd293b40578ccornelius        errln((UnicodeString)"ERROR: format() returns wrong result\n Expected " +
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            expected + ", Got " + buffer);
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
266