1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package org.apache.harmony.tests.java.text;
19 
20 import java.io.ByteArrayInputStream;
21 import java.io.ByteArrayOutputStream;
22 import java.io.File;
23 import java.io.ObjectInputStream;
24 import java.io.ObjectOutputStream;
25 import java.net.URL;
26 import java.text.DecimalFormat;
27 import java.text.DecimalFormatSymbols;
28 import java.text.NumberFormat;
29 import java.util.Currency;
30 import java.util.Locale;
31 import java.util.ServiceConfigurationError;
32 
33 import junit.framework.TestCase;
34 
35 import org.apache.harmony.testframework.serialization.SerializationTest;
36 
37 public class DecimalFormatSymbolsTest extends TestCase {
38 
39     DecimalFormatSymbols dfs;
40 
41     DecimalFormatSymbols dfsUS;
42 
43     /**
44      * @tests java.text.DecimalFormatSymbols#DecimalFormatSymbols()
45      */
test_Constructor()46     public void test_Constructor() {
47         // Test for method java.text.DecimalFormatSymbols()
48         // Used in tests
49     }
50 
51     /**
52      * @tests java.text.DecimalFormatSymbols#DecimalFormatSymbols(java.util.Locale)
53      */
test_ConstructorLjava_util_Locale()54     public void test_ConstructorLjava_util_Locale() {
55         DecimalFormatSymbols dfs = new DecimalFormatSymbols(new Locale("en",
56                 "us"));
57         assertEquals("Returned incorrect symbols", '%', dfs.getPercent());
58     }
59 
60 
61     /**
62      * @tests java.text.DecimalFormatSymbols#getAvailableLocales()
63      */
test_getAvailableLocales_no_provider()64     public void test_getAvailableLocales_no_provider() throws Exception {
65         Locale[] locales = DecimalFormatSymbols.getAvailableLocales();
66         assertNotNull(locales);
67         // must contain Locale.US
68         boolean flag = false;
69         for (Locale locale : locales) {
70             if (locale.equals(Locale.US)) {
71                 flag = true;
72                 break;
73             }
74         }
75         assertTrue(flag);
76     }
77 
78     /**
79      * @tests java.text.DecimalFormatSymbols#getInstance()
80      */
test_getInstance()81     public void test_getInstance() {
82         assertEquals(new DecimalFormatSymbols(), DecimalFormatSymbols.getInstance());
83         assertEquals(new DecimalFormatSymbols(Locale.getDefault()),
84                 DecimalFormatSymbols.getInstance());
85 
86         assertNotSame(DecimalFormatSymbols.getInstance(), DecimalFormatSymbols.getInstance());
87     }
88 
test_getInstanceLjava_util_Locale()89     public void test_getInstanceLjava_util_Locale() {
90         try {
91             DecimalFormatSymbols.getInstance(null);
92             fail();
93         } catch (NullPointerException expected) {
94         }
95 
96         assertEquals(new DecimalFormatSymbols(Locale.GERMANY), DecimalFormatSymbols.getInstance(Locale.GERMANY));
97 
98         Locale locale = new Locale("not exist language", "not exist country");
99         DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
100         assertNotNull(symbols);
101     }
102 
103     /**
104      * @tests java.text.DecimalFormatSymbols#equals(java.lang.Object)
105      */
test_equalsLjava_lang_Object()106     public void test_equalsLjava_lang_Object() {
107         assertTrue("Equal objects returned false", dfs.equals(dfs.clone()));
108         dfs.setDigit('B');
109         assertTrue("Un-Equal objects returned true", !dfs
110                 .equals(new DecimalFormatSymbols()));
111 
112     }
113 
114     /**
115      * @tests java.text.DecimalFormatSymbols#getCurrency()
116      */
test_getCurrency()117     public void test_getCurrency() {
118         Currency currency = Currency.getInstance("USD");
119         assertEquals("Returned incorrect currency",
120                 dfsUS.getCurrency(), currency);
121 
122         Currency currK = Currency.getInstance("KRW");
123         Currency currX = Currency.getInstance("XXX");
124         Currency currE = Currency.getInstance("EUR");
125         // Currency currF = Currency.getInstance("FRF");
126 
127         DecimalFormatSymbols dfs1 = new DecimalFormatSymbols(new Locale("ko",
128                 "KR"));
129         assertTrue("Test1: Returned incorrect currency",
130                 dfs1.getCurrency() == currK);
131         assertEquals("Test1: Returned incorrect currencySymbol", "\u20a9", dfs1
132                 .getCurrencySymbol());
133         assertEquals("Test1: Returned incorrect intlCurrencySymbol", "KRW",
134                 dfs1.getInternationalCurrencySymbol());
135 
136         dfs1 = new DecimalFormatSymbols(new Locale("", "KR"));
137         assertTrue("Test2: Returned incorrect currency",
138                 dfs1.getCurrency() == currK);
139         assertEquals("Test2: Returned incorrect currencySymbol", "\u20a9", dfs1
140                 .getCurrencySymbol());
141         assertEquals("Test2: Returned incorrect intlCurrencySymbol", "KRW",
142                 dfs1.getInternationalCurrencySymbol());
143 
144         dfs1 = new DecimalFormatSymbols(new Locale("ko", ""));
145         assertTrue("Test3: Returned incorrect currency",
146                 dfs1.getCurrency() == currX);
147         assertEquals("Test3: Returned incorrect currencySymbol", "\u00a4", dfs1
148                 .getCurrencySymbol());
149         assertEquals("Test3: Returned incorrect intlCurrencySymbol", "XXX",
150                 dfs1.getInternationalCurrencySymbol());
151 
152         dfs1 = new DecimalFormatSymbols(new Locale("fr", "FR"));
153         assertTrue("Test4: Returned incorrect currency",
154                 dfs1.getCurrency() == currE);
155         assertEquals("Test4: Returned incorrect currencySymbol", "\u20ac", dfs1
156                 .getCurrencySymbol());
157         assertEquals("Test4: Returned incorrect intlCurrencySymbol", "EUR",
158                 dfs1.getInternationalCurrencySymbol());
159 
160         // RI fails these tests since it doesn't have the PREEURO variant
161         // dfs1 = new DecimalFormatSymbols(new Locale("fr", "FR","PREEURO"));
162         // assertTrue("Test5: Returned incorrect currency", dfs1.getCurrency()
163         // == currF);
164         // assertTrue("Test5: Returned incorrect currencySymbol",
165         // dfs1.getCurrencySymbol().equals("F"));
166         // assertTrue("Test5: Returned incorrect intlCurrencySymbol",
167         // dfs1.getInternationalCurrencySymbol().equals("FRF"));
168     }
169 
170     /**
171      * @tests java.text.DecimalFormatSymbols#getCurrencySymbol()
172      */
test_getCurrencySymbol()173     public void test_getCurrencySymbol() {
174         assertEquals("Returned incorrect currencySymbol", "$", dfsUS
175                 .getCurrencySymbol());
176     }
177 
178     /**
179      * @tests java.text.DecimalFormatSymbols#getDecimalSeparator()
180      */
test_getDecimalSeparator()181     public void test_getDecimalSeparator() {
182         dfs.setDecimalSeparator('*');
183         assertEquals("Returned incorrect DecimalSeparator symbol", '*', dfs
184                 .getDecimalSeparator());
185     }
186 
187     /**
188      * @tests java.text.DecimalFormatSymbols#getDigit()
189      */
test_getDigit()190     public void test_getDigit() {
191         dfs.setDigit('*');
192         assertEquals("Returned incorrect Digit symbol", '*', dfs.getDigit());
193     }
194 
195     /**
196      * @tests java.text.DecimalFormatSymbols#getExponentSeparator()
197      */
test_getExponentSeparator()198     public void test_getExponentSeparator() {
199         dfs.setExponentSeparator("EE");
200         assertEquals("Returned incorrect Exponent Separator symbol", "EE", dfs
201                 .getExponentSeparator());
202     }
203 
204     /**
205      * @tests java.text.DecimalFormatSymbols#getGroupingSeparator()
206      */
test_getGroupingSeparator()207     public void test_getGroupingSeparator() {
208         dfs.setGroupingSeparator('*');
209         assertEquals("Returned incorrect GroupingSeparator symbol", '*', dfs
210                 .getGroupingSeparator());
211     }
212 
213     /**
214      * @tests java.text.DecimalFormatSymbols#getInfinity()
215      */
test_getInfinity()216     public void test_getInfinity() {
217         dfs.setInfinity("&");
218         assertTrue("Returned incorrect Infinity symbol",
219                 dfs.getInfinity() == "&");
220     }
221 
222     /**
223      * @tests java.text.DecimalFormatSymbols#getInternationalCurrencySymbol()
224      */
test_getInternationalCurrencySymbol()225     public void test_getInternationalCurrencySymbol() {
226         assertEquals("Returned incorrect InternationalCurrencySymbol", "USD",
227                 dfsUS.getInternationalCurrencySymbol());
228     }
229 
230     /**
231      * @tests java.text.DecimalFormatSymbols#getMinusSign()
232      */
test_getMinusSign()233     public void test_getMinusSign() {
234         dfs.setMinusSign('&');
235         assertEquals("Returned incorrect MinusSign symbol", '&', dfs
236                 .getMinusSign());
237     }
238 
239     /**
240      * @tests java.text.DecimalFormatSymbols#getNaN()
241      */
test_getNaN()242     public void test_getNaN() {
243         dfs.setNaN("NAN!!");
244         assertEquals("Returned incorrect nan symbol", "NAN!!", dfs.getNaN());
245     }
246 
247     /**
248      * @tests java.text.DecimalFormatSymbols#getPatternSeparator()
249      */
test_getPatternSeparator()250     public void test_getPatternSeparator() {
251         dfs.setPatternSeparator('X');
252         assertEquals("Returned incorrect PatternSeparator symbol", 'X', dfs
253                 .getPatternSeparator());
254     }
255 
256     /**
257      * @tests java.text.DecimalFormatSymbols#getPercent()
258      */
test_getPercent()259     public void test_getPercent() {
260         dfs.setPercent('*');
261         assertEquals("Returned incorrect Percent symbol", '*', dfs.getPercent());
262     }
263 
264     /**
265      * @tests java.text.DecimalFormatSymbols#getPerMill()
266      */
test_getPerMill()267     public void test_getPerMill() {
268         dfs.setPerMill('#');
269         assertEquals("Returned incorrect PerMill symbol", '#', dfs.getPerMill());
270     }
271 
272     /**
273      * @tests java.text.DecimalFormatSymbols#getZeroDigit()
274      */
test_getZeroDigit()275     public void test_getZeroDigit() {
276         dfs.setZeroDigit('*');
277         assertEquals("Returned incorrect ZeroDigit symbol", '*', dfs
278                 .getZeroDigit());
279     }
280 
281     /**
282      * @tests java.text.DecimalFormatSymbols#setCurrency(java.util.Currency)
283      */
test_setCurrencyLjava_util_Currency()284     public void test_setCurrencyLjava_util_Currency() {
285         Locale locale = Locale.CANADA;
286         DecimalFormatSymbols dfs = ((DecimalFormat) NumberFormat
287                 .getCurrencyInstance(locale)).getDecimalFormatSymbols();
288 
289         try {
290             dfs.setCurrency(null);
291             fail("Expected NullPointerException");
292         } catch (NullPointerException e) {
293         }
294 
295         Currency currency = Currency.getInstance("JPY");
296         dfs.setCurrency(currency);
297 
298         assertTrue("Returned incorrect currency", currency == dfs.getCurrency());
299         assertEquals("Returned incorrect currency symbol", currency.getSymbol(
300                 locale), dfs.getCurrencySymbol());
301         assertTrue("Returned incorrect international currency symbol", currency
302                 .getCurrencyCode().equals(dfs.getInternationalCurrencySymbol()));
303     }
304 
305     /**
306      * @tests java.text.DecimalFormatSymbols#setDecimalSeparator(char)
307      */
test_setDecimalSeparatorC()308     public void test_setDecimalSeparatorC() {
309         dfs.setDecimalSeparator('*');
310         assertEquals("Returned incorrect DecimalSeparator symbol", '*', dfs
311                 .getDecimalSeparator());
312     }
313 
314     /**
315      * @tests java.text.DecimalFormatSymbols#setDigit(char)
316      */
test_setDigitC()317     public void test_setDigitC() {
318         dfs.setDigit('*');
319         assertEquals("Returned incorrect Digit symbol", '*', dfs.getDigit());
320     }
321 
322     /**
323      * @tests java.text.DecimalFormatSymbols#setExponentSeparator(String)
324      */
test_setExponentSeparator()325     public void test_setExponentSeparator() {
326         try {
327             dfs.setExponentSeparator(null);
328             fail("Should throw NullPointerException");
329         } catch (NullPointerException e) {
330             // expected
331         }
332 
333         dfs.setExponentSeparator("");
334         assertEquals("Returned incorrect Exponent Separator symbol", "", dfs
335                 .getExponentSeparator());
336 
337         dfs.setExponentSeparator("what ever you want");
338         assertEquals("Returned incorrect Exponent Separator symbol",
339                 "what ever you want", dfs.getExponentSeparator());
340 
341         dfs.setExponentSeparator(" E ");
342         assertEquals("Returned incorrect Exponent Separator symbol", " E ", dfs
343                 .getExponentSeparator());
344     }
345 
346     /**
347      * @tests java.text.DecimalFormatSymbols#setGroupingSeparator(char)
348      */
test_setGroupingSeparatorC()349     public void test_setGroupingSeparatorC() {
350         dfs.setGroupingSeparator('*');
351         assertEquals("Returned incorrect GroupingSeparator symbol", '*', dfs
352                 .getGroupingSeparator());
353     }
354 
355     /**
356      * @tests java.text.DecimalFormatSymbols#setInfinity(java.lang.String)
357      */
test_setInfinityLjava_lang_String()358     public void test_setInfinityLjava_lang_String() {
359         dfs.setInfinity("&");
360         assertTrue("Returned incorrect Infinity symbol",
361                 dfs.getInfinity() == "&");
362     }
363 
364     /**
365      * @tests java.text.DecimalFormatSymbols#setInternationalCurrencySymbol(java.lang.String)
366      */
test_setInternationalCurrencySymbolLjava_lang_String()367     public void test_setInternationalCurrencySymbolLjava_lang_String() {
368         Locale locale = Locale.CANADA;
369         DecimalFormatSymbols dfs = ((DecimalFormat) NumberFormat
370                 .getCurrencyInstance(locale)).getDecimalFormatSymbols();
371         Currency currency = Currency.getInstance("JPY");
372         dfs.setInternationalCurrencySymbol(currency.getCurrencyCode());
373 
374         assertTrue("Test1: Returned incorrect currency", currency == dfs
375                 .getCurrency());
376         assertEquals("Test1: Returned incorrect currency symbol", currency
377                 .getSymbol(locale), dfs.getCurrencySymbol());
378         assertTrue("Test1: Returned incorrect international currency symbol",
379                 currency.getCurrencyCode().equals(
380                         dfs.getInternationalCurrencySymbol()));
381 
382         dfs.setInternationalCurrencySymbol("bogus");
383         // RI support this legacy country code
384         // assertNotNull("Test2: Returned incorrect currency", dfs.getCurrency());
385         assertEquals("Test2: Returned incorrect international currency symbol",
386                 "bogus", dfs.getInternationalCurrencySymbol());
387     }
388 
389     /**
390      * @tests java.text.DecimalFormatSymbols#setMinusSign(char)
391      */
test_setMinusSignC()392     public void test_setMinusSignC() {
393         dfs.setMinusSign('&');
394         assertEquals("Returned incorrect MinusSign symbol", '&', dfs
395                 .getMinusSign());
396     }
397 
398     /**
399      * @tests java.text.DecimalFormatSymbols#setNaN(java.lang.String)
400      */
test_setNaNLjava_lang_String()401     public void test_setNaNLjava_lang_String() {
402         dfs.setNaN("NAN!!");
403         assertEquals("Returned incorrect nan symbol", "NAN!!", dfs.getNaN());
404     }
405 
406     /**
407      * @tests java.text.DecimalFormatSymbols#setPatternSeparator(char)
408      */
test_setPatternSeparatorC()409     public void test_setPatternSeparatorC() {
410         dfs.setPatternSeparator('X');
411         assertEquals("Returned incorrect PatternSeparator symbol", 'X', dfs
412                 .getPatternSeparator());
413     }
414 
415     /**
416      * @tests java.text.DecimalFormatSymbols#setPercent(char)
417      */
test_setPercentC()418     public void test_setPercentC() {
419         dfs.setPercent('*');
420         assertEquals("Returned incorrect Percent symbol", '*', dfs.getPercent());
421     }
422 
423     /**
424      * @tests java.text.DecimalFormatSymbols#setPerMill(char)
425      */
test_setPerMillC()426     public void test_setPerMillC() {
427         dfs.setPerMill('#');
428         assertEquals("Returned incorrect PerMill symbol", '#', dfs.getPerMill());
429     }
430 
431     /**
432      * @tests java.text.DecimalFormatSymbols#setZeroDigit(char)
433      */
test_setZeroDigitC()434     public void test_setZeroDigitC() {
435         dfs.setZeroDigit('*');
436         assertEquals("Set incorrect ZeroDigit symbol", '*', dfs.getZeroDigit());
437     }
438 
439     /**
440      * Sets up the fixture, for example, open a network connection. This method
441      * is called before a test is executed.
442      */
setUp()443     protected void setUp() {
444         dfs = new DecimalFormatSymbols();
445         dfsUS = new DecimalFormatSymbols(new Locale("en", "us"));
446     }
447 
448     /**
449      * Tears down the fixture, for example, close a network connection. This
450      * method is called after a test is executed.
451      */
tearDown()452     protected void tearDown() {
453     }
454 
455     // Test serialization mechanism of DecimalFormatSymbols
test_serialization()456     public void test_serialization() throws Exception {
457         DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.FRANCE);
458         Currency currency = symbols.getCurrency();
459         assertNotNull(currency);
460 
461         // serialize
462         ByteArrayOutputStream byteOStream = new ByteArrayOutputStream();
463         ObjectOutputStream objectOStream = new ObjectOutputStream(byteOStream);
464         objectOStream.writeObject(symbols);
465 
466         // and deserialize
467         ObjectInputStream objectIStream = new ObjectInputStream(
468                 new ByteArrayInputStream(byteOStream.toByteArray()));
469         DecimalFormatSymbols symbolsD = (DecimalFormatSymbols) objectIStream
470                 .readObject();
471 
472         // The associated currency will not persist
473         currency = symbolsD.getCurrency();
474         assertNotNull(currency);
475     }
476 
477     /**
478      * Assert that Harmony can correct read an instance that was created by
479      * the Java 1.5 RI. The actual values may differ on Harmony and other JREs,
480      * so we only assert the values that are known to be in the serialized data.
481      */
test_RIHarmony_compatible()482     public void test_RIHarmony_compatible() throws Exception {
483         DecimalFormatSymbols dfs;
484         ObjectInputStream i = null;
485         try {
486             i = new ObjectInputStream(getClass().getClassLoader().getResourceAsStream(
487                     "serialization/org/apache/harmony/tests/java/text/DecimalFormatSymbols.ser"));
488             dfs = (DecimalFormatSymbols) i.readObject();
489         } finally {
490             try {
491                 if (i != null) {
492                     i.close();
493                 }
494             } catch (Exception e) {
495             }
496         }
497         assertDecimalFormatSymbolsRIFrance(dfs);
498     }
499 
assertDecimalFormatSymbolsRIFrance(DecimalFormatSymbols dfs)500     static void assertDecimalFormatSymbolsRIFrance(DecimalFormatSymbols dfs) {
501         // Values based on Java 1.5 RI DecimalFormatSymbols for Locale.FRANCE
502         /*
503          * currency = [EUR]
504          * currencySymbol = [€][U+20ac]
505          * decimalSeparator = [,][U+002c]
506          * digit = [#][U+0023]
507          * groupingSeparator = [ ][U+00a0]
508          * infinity = [∞][U+221e]
509          * internationalCurrencySymbol = [EUR]
510          * minusSign = [-][U+002d]
511          * monetaryDecimalSeparator = [,][U+002c]
512          * naN = [�][U+fffd]
513          * patternSeparator = [;][U+003b]
514          * perMill = [‰][U+2030]
515          * percent = [%][U+0025]
516          * zeroDigit = [0][U+0030]
517          */
518         assertEquals("EUR", dfs.getCurrency().getCurrencyCode());
519         assertEquals("\u20AC", dfs.getCurrencySymbol());
520         assertEquals(',', dfs.getDecimalSeparator());
521         assertEquals('#', dfs.getDigit());
522         assertEquals('\u00a0', dfs.getGroupingSeparator());
523         assertEquals("\u221e", dfs.getInfinity());
524         assertEquals("EUR", dfs.getInternationalCurrencySymbol());
525         assertEquals('-', dfs.getMinusSign());
526         assertEquals(',', dfs.getMonetaryDecimalSeparator());
527         // RI's default NaN is U+FFFD, Harmony's is based on ICU
528         assertEquals("\uFFFD", dfs.getNaN());
529         assertEquals('\u003b', dfs.getPatternSeparator());
530         assertEquals('\u2030', dfs.getPerMill());
531         assertEquals('%', dfs.getPercent());
532         assertEquals('0', dfs.getZeroDigit());
533     }
534 
535     /**
536      * @tests serialization/deserialization compatibility with RI6.
537      */
testSerializationCompatibility()538     public void testSerializationCompatibility() throws Exception {
539         DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
540         symbols.setExponentSeparator("EE");
541         symbols.setNaN("NaN");
542         SerializationTest.verifyGolden(this, symbols);
543     }
544 
545     /**
546      * @tests serialization/deserialization compatibility.
547      */
testSerializationSelf()548     public void testSerializationSelf() throws Exception {
549         DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.ITALIAN);
550         SerializationTest.verifySelf(symbols);
551     }
552 }
553