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