1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html#License
3/*****************************************************************************************
4 *
5 *   Copyright (C) 1996-2016, International Business Machines
6 *   Corporation and others.  All Rights Reserved.
7 **/
8
9/**
10 * Port From:   JDK 1.4b1 : java.text.Format.IntlTestDecimalFormatSymbols
11 * Source File: java/text/format/IntlTestDecimalFormatSymbols.java
12 **/
13
14/*
15    @test 1.4 98/03/06
16    @summary test International Decimal Format Symbols
17*/
18
19
20package com.ibm.icu.dev.test.format;
21
22import java.util.Arrays;
23import java.util.Locale;
24
25import org.junit.Test;
26import org.junit.runner.RunWith;
27import org.junit.runners.JUnit4;
28
29import com.ibm.icu.dev.test.TestFmwk;
30import com.ibm.icu.text.DecimalFormat;
31import com.ibm.icu.text.DecimalFormatSymbols;
32import com.ibm.icu.text.NumberingSystem;
33import com.ibm.icu.util.Currency;
34import com.ibm.icu.util.ULocale;
35
36@RunWith(JUnit4.class)
37public class IntlTestDecimalFormatSymbols extends TestFmwk
38{
39    // Test the API of DecimalFormatSymbols; primarily a simple get/set set.
40    @Test
41    public void TestSymbols()
42    {
43        DecimalFormatSymbols fr = new DecimalFormatSymbols(Locale.FRENCH);
44
45        DecimalFormatSymbols en = new DecimalFormatSymbols(Locale.ENGLISH);
46
47        if(en.equals(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        if(!en.getLocale().equals(Locale.ENGLISH)) {
54            errln("ERROR: getLocale failed");
55        }
56        if(!en.getULocale().equals(ULocale.ENGLISH)) {
57            errln("ERROR: getULocale failed");
58        }
59
60        if(!en.getLocale().equals(Locale.ENGLISH)) {
61            errln("ERROR: getLocale failed");
62        }
63        if(!en.getULocale().equals(ULocale.ENGLISH)) {
64            errln("ERROR: getULocale failed");
65        }
66
67        char zero = en.getZeroDigit();
68        fr.setZeroDigit(zero);
69        if(fr.getZeroDigit() != en.getZeroDigit()) {
70            errln("ERROR: get/set ZeroDigit failed");
71        }
72
73        String[] digits = en.getDigitStrings();
74        fr.setDigitStrings(digits);
75        if (!Arrays.equals(fr.getDigitStrings(), en.getDigitStrings())) {
76            errln("ERROR: get/set DigitStrings failed");
77        }
78
79        char sigDigit = en.getSignificantDigit();
80        fr.setSignificantDigit(sigDigit);
81        if(fr.getSignificantDigit() != en.getSignificantDigit()) {
82            errln("ERROR: get/set SignificantDigit failed");
83        }
84
85        Currency currency = Currency.getInstance("USD");
86        fr.setCurrency(currency);
87        if (!fr.getCurrency().equals(currency)){
88            errln("ERROR: get/set Currency failed");
89        }
90
91        char group = en.getGroupingSeparator();
92        fr.setGroupingSeparator(group);
93        if(fr.getGroupingSeparator() != en.getGroupingSeparator()) {
94            errln("ERROR: get/set GroupingSeparator failed");
95        }
96
97        String groupStr = en.getGroupingSeparatorString();
98        fr.setGroupingSeparatorString(groupStr);
99        if (!fr.getGroupingSeparatorString().equals(en.getGroupingSeparatorString())) {
100            errln("ERROR: get/set GroupingSeparatorString failed");
101        }
102
103        char decimal = en.getDecimalSeparator();
104        fr.setDecimalSeparator(decimal);
105        if(fr.getDecimalSeparator() != en.getDecimalSeparator()) {
106            errln("ERROR: get/set DecimalSeparator failed");
107        }
108
109        String decimalStr = en.getDecimalSeparatorString();
110        fr.setDecimalSeparatorString(decimalStr);
111        if (!fr.getDecimalSeparatorString().equals(en.getDecimalSeparatorString())) {
112            errln("ERROR: get/set DecimalSeparatorString failed");
113        }
114
115        char monetaryGroup = en.getMonetaryGroupingSeparator();
116        fr.setMonetaryGroupingSeparator(monetaryGroup);
117        if(fr.getMonetaryGroupingSeparator() != en.getMonetaryGroupingSeparator()) {
118            errln("ERROR: get/set MonetaryGroupingSeparator failed");
119        }
120
121        String monetaryGroupStr = en.getMonetaryGroupingSeparatorString();
122        fr.setMonetaryGroupingSeparatorString(monetaryGroupStr);
123        if (!fr.getMonetaryGroupingSeparatorString().equals(en.getMonetaryGroupingSeparatorString())){
124            errln("ERROR: get/set MonetaryGroupingSeparatorString failed");
125        }
126
127        char monetaryDecimal = en.getMonetaryDecimalSeparator();
128        fr.setMonetaryDecimalSeparator(monetaryDecimal);
129        if(fr.getMonetaryDecimalSeparator() != en.getMonetaryDecimalSeparator()) {
130            errln("ERROR: get/set MonetaryDecimalSeparator failed");
131        }
132
133        String monetaryDecimalStr = en.getMonetaryDecimalSeparatorString();
134        fr.setMonetaryDecimalSeparatorString(monetaryDecimalStr);
135        if (!fr.getMonetaryDecimalSeparatorString().equals(en.getMonetaryDecimalSeparatorString())) {
136            errln("ERROR: get/set MonetaryDecimalSeparatorString failed");
137        }
138
139        char perMill = en.getPerMill();
140        fr.setPerMill(perMill);
141        if(fr.getPerMill() != en.getPerMill()) {
142            errln("ERROR: get/set PerMill failed");
143        }
144
145        String perMillStr = en.getPerMillString();
146        fr.setPerMillString(perMillStr);
147        if (!fr.getPerMillString().equals(en.getPerMillString())) {
148            errln("ERROR: get/set PerMillString failed");
149        }
150
151        char percent = en.getPercent();
152        fr.setPercent(percent);
153        if(fr.getPercent() != en.getPercent()) {
154            errln("ERROR: get/set Percent failed");
155        }
156
157        String percentStr = en.getPercentString();
158        fr.setPercentString(percentStr);
159        if (!fr.getPercentString().equals(en.getPercentString())) {
160            errln("ERROR: get/set PercentString failed");
161        }
162
163        char digit = en.getDigit();
164        fr.setDigit(digit);
165        if(fr.getDigit() != en.getDigit()) {
166            errln("ERROR: get/set Digit failed");
167        }
168
169        char patternSeparator = en.getPatternSeparator();
170        fr.setPatternSeparator(patternSeparator);
171        if(fr.getPatternSeparator() != en.getPatternSeparator()) {
172            errln("ERROR: get/set PatternSeparator failed");
173        }
174
175        String infinity = en.getInfinity();
176        fr.setInfinity(infinity);
177        String infinity2 = fr.getInfinity();
178        if(! infinity.equals(infinity2)) {
179            errln("ERROR: get/set Infinity failed");
180        }
181
182        String nan = en.getNaN();
183        fr.setNaN(nan);
184        String nan2 = fr.getNaN();
185        if(! nan.equals(nan2)) {
186            errln("ERROR: get/set NaN failed");
187        }
188
189        char minusSign = en.getMinusSign();
190        fr.setMinusSign(minusSign);
191        if(fr.getMinusSign() != en.getMinusSign()) {
192            errln("ERROR: get/set MinusSign failed");
193        }
194
195        String minusSignStr = en.getMinusSignString();
196        fr.setMinusSignString(minusSignStr);
197        if (!fr.getMinusSignString().equals(en.getMinusSignString())) {
198            errln("ERROR: get/set MinusSignString failed");
199        }
200
201        char plusSign = en.getPlusSign();
202        fr.setPlusSign(plusSign);
203        if(fr.getPlusSign() != en.getPlusSign()) {
204            errln("ERROR: get/set PlusSign failed");
205        }
206
207        String plusSignStr = en.getPlusSignString();
208        fr.setPlusSignString(plusSignStr);
209        if (!fr.getPlusSignString().equals(en.getPlusSignString())) {
210            errln("ERROR: get/set PlusSignString failed");
211        }
212
213        char padEscape = en.getPadEscape();
214        fr.setPadEscape(padEscape);
215        if(fr.getPadEscape() != en.getPadEscape()) {
216            errln("ERROR: get/set PadEscape failed");
217        }
218
219        String exponential = en.getExponentSeparator();
220        fr.setExponentSeparator(exponential);
221        if(fr.getExponentSeparator() != en.getExponentSeparator()) {
222            errln("ERROR: get/set Exponential failed");
223        }
224
225        String exponentMultiplicationSign = en.getExponentMultiplicationSign();
226        fr.setExponentMultiplicationSign(exponentMultiplicationSign);
227        if(fr.getExponentMultiplicationSign() != en.getExponentMultiplicationSign()) {
228            errln("ERROR: get/set ExponentMultiplicationSign failed");
229        }
230
231        // Test CurrencySpacing.
232        // In CLDR 1.7, only root.txt has CurrencySpacing data. This data might
233        // be different between en and fr in the future.
234        for (int i = DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH; i <= DecimalFormatSymbols.CURRENCY_SPC_INSERT; i++) {
235            if (en.getPatternForCurrencySpacing(i, true) !=
236                fr.getPatternForCurrencySpacing(i, true)) {
237                errln("ERROR: get currency spacing item:"+ i+" before the currency");
238                if (en.getPatternForCurrencySpacing(i, false) !=
239                    fr.getPatternForCurrencySpacing(i, false)) {
240                    errln("ERROR: get currency spacing item:" + i + " after currency");
241                }
242            }
243        }
244
245        String dash = "-";
246        en.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, true, dash);
247        if (dash != en.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, true)) {
248            errln("ERROR: set currency spacing pattern for before currency.");
249        }
250
251        //DecimalFormatSymbols foo = new DecimalFormatSymbols(); //The variable is never used
252
253        en = (DecimalFormatSymbols) fr.clone();
254
255        if(! en.equals(fr)) {
256            errln("ERROR: Clone failed");
257        }
258    }
259
260    @Test
261    public void testCoverage() {
262        DecimalFormatSymbols df = new DecimalFormatSymbols();
263        DecimalFormatSymbols df2 = (DecimalFormatSymbols)df.clone();
264        if (!df.equals(df2) || df.hashCode() != df2.hashCode()) {
265            errln("decimal format symbols clone, equals, or hashCode failed");
266        }
267    }
268
269    @Test
270    public void testPropagateZeroDigit() {
271        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
272        dfs.setZeroDigit('\u1040');
273        DecimalFormat df = new DecimalFormat("0");
274        df.setDecimalFormatSymbols(dfs);
275        assertEquals("Should propagate char with number property zero",
276                '\u1041', dfs.getDigits()[1]);
277        assertEquals("Should propagate char with number property zero",
278                "\u1044\u1040\u1041\u1042\u1043", df.format(40123));
279        dfs.setZeroDigit('a');
280        df.setDecimalFormatSymbols(dfs);
281        assertEquals("Should propagate char WITHOUT number property zero",
282                'b', dfs.getDigits()[1]);
283        assertEquals("Should propagate char WITHOUT number property zero",
284                "eabcd", df.format(40123));
285    }
286
287    @Test
288    public void testDigitSymbols() {
289        final char defZero = '0';
290        final char[] defDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
291        final String[] defDigitStrings = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
292        final String[] osmanyaDigitStrings = {
293            "\uD801\uDCA0", "\uD801\uDCA1", "\uD801\uDCA2", "\uD801\uDCA3", "\uD801\uDCA4",
294            "\uD801\uDCA5", "\uD801\uDCA6", "\uD801\uDCA7", "\uD801\uDCA8", "\uD801\uDCA9"
295        };
296        final String[] differentDigitStrings = {"0", "b", "3", "d", "5", "ff", "7", "h", "9", "j"};
297
298        DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.ENGLISH);
299
300        symbols.setDigitStrings(osmanyaDigitStrings);
301        if (!Arrays.equals(symbols.getDigitStrings(), osmanyaDigitStrings)) {
302            errln("ERROR: Osmanya digits (supplementary) should be set");
303        }
304        if (Character.codePointAt(osmanyaDigitStrings[0], 0) != symbols.getCodePointZero()) {
305            errln("ERROR: Code point zero be Osmanya code point zero");
306        }
307        if (defZero != symbols.getZeroDigit()) {
308            errln("ERROR: Zero digit should be 0");
309        }
310        if (!Arrays.equals(symbols.getDigits(), defDigits)) {
311            errln("ERROR: Char digits should be Latin digits");
312        }
313
314        symbols.setDigitStrings(differentDigitStrings);
315        if (!Arrays.equals(symbols.getDigitStrings(), differentDigitStrings)) {
316            errln("ERROR: Different digits should be set");
317        }
318        if (-1 != symbols.getCodePointZero()) {
319            errln("ERROR: Code point zero should be invalid");
320        }
321
322        // Reset digits to Latin
323        symbols.setZeroDigit(defZero);
324        if (!Arrays.equals(symbols.getDigitStrings(), defDigitStrings)) {
325            errln("ERROR: Latin digits should be set" + symbols.getDigitStrings()[0]);
326        }
327        if (defZero != symbols.getCodePointZero()) {
328            errln("ERROR: Code point zero be ASCII 0");
329        }
330    }
331
332    @Test
333    public void testNumberingSystem() {
334        Object[][] cases = {
335                {"en", "latn", "1,234.56", ';'},
336                {"en", "arab", "١٬٢٣٤٫٥٦", '؛'},
337                {"en", "mathsanb", "��,������.����", ';'},
338                {"en", "mymr", "၁,၂၃၄.၅၆", ';'},
339                {"my", "latn", "1,234.56", ';'},
340                {"my", "arab", "١٬٢٣٤٫٥٦", '؛'},
341                {"my", "mathsanb", "��,������.����", ';'},
342                {"my", "mymr", "၁,၂၃၄.၅၆", '၊'},
343                {"en@numbers=thai", "mymr", "၁,၂၃၄.၅၆", ';'}, // conflicting numbering system
344        };
345
346        for (Object[] cas : cases) {
347            ULocale loc = new ULocale((String) cas[0]);
348            NumberingSystem ns = NumberingSystem.getInstanceByName((String) cas[1]);
349            String expectedFormattedNumberString = (String) cas[2];
350            char expectedPatternSeparator = (Character) cas[3];
351
352            DecimalFormatSymbols dfs = DecimalFormatSymbols.forNumberingSystem(loc, ns);
353            DecimalFormat df = new DecimalFormat("#,##0.##", dfs);
354            String actual1 = df.format(1234.56);
355            assertEquals("1234.56 with " + loc + " and " + ns.getName(),
356                    expectedFormattedNumberString, actual1);
357            // The pattern separator is something that differs by numbering system in my@numbers=mymr.
358            char actual2 = dfs.getPatternSeparator();
359            assertEquals("Pattern separator with " + loc + " and " + ns.getName(),
360                    expectedPatternSeparator, actual2);
361
362            // Coverage for JDK Locale overload
363            DecimalFormatSymbols dfs2 = DecimalFormatSymbols.forNumberingSystem(loc.toLocale(), ns);
364            assertEquals("JDK Locale and ICU Locale should produce the same object", dfs, dfs2);
365        }
366    }
367}
368