Home | History | Annotate | Download | only in util
      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.util;
     19 
     20 import java.util.ArrayList;
     21 import java.util.Arrays;
     22 import java.util.Collection;
     23 import java.util.Currency;
     24 import java.util.HashSet;
     25 import java.util.Iterator;
     26 import java.util.Locale;
     27 import java.util.Set;
     28 
     29 public class CurrencyTest extends junit.framework.TestCase {
     30 
     31     private Locale originalLocale;
     32 
     33     @Override
     34     protected void setUp() throws Exception {
     35         super.setUp();
     36         originalLocale = Locale.getDefault();
     37     }
     38 
     39     @Override
     40     protected void tearDown() {
     41         Locale.setDefault(originalLocale);
     42     }
     43 
     44     /**
     45      * java.util.Currency#getInstance(java.lang.String)
     46      */
     47     public void test_getInstanceLjava_lang_String() {
     48         // see test_getInstanceLjava_util_Locale() tests
     49     }
     50 
     51     /**
     52      * java.util.Currency#getInstance(java.util.Locale)
     53      */
     54     public void test_getInstanceLjava_util_Locale() {
     55         /*
     56          * the behaviour in all these three cases should be the same since this
     57          * method ignores language and variant component of the locale.
     58          */
     59         Currency c0 = Currency.getInstance("CAD");
     60         Currency c1 = Currency.getInstance(new Locale("en", "CA"));
     61         assertTrue(
     62                 "Currency.getInstance(new Locale(\"en\",\"CA\")) isn't equal to Currency.getInstance(\"CAD\")",
     63                 c1 == c0);
     64         Currency c2 = Currency.getInstance(new Locale("fr", "CA"));
     65         assertTrue(
     66                 "Currency.getInstance(new Locale(\"fr\",\"CA\")) isn't equal to Currency.getInstance(\"CAD\")",
     67                 c2 == c0);
     68         Currency c3 = Currency.getInstance(new Locale("", "CA"));
     69         assertTrue(
     70                 "Currency.getInstance(new Locale(\"\",\"CA\")) isn't equal to Currency.getInstance(\"CAD\")",
     71                 c3 == c0);
     72 
     73         c0 = Currency.getInstance("JPY");
     74         c1 = Currency.getInstance(new Locale("ja", "JP"));
     75         assertTrue(
     76                 "Currency.getInstance(new Locale(\"ja\",\"JP\")) isn't equal to Currency.getInstance(\"JPY\")",
     77                 c1 == c0);
     78         c2 = Currency.getInstance(new Locale("", "JP"));
     79         assertTrue(
     80                 "Currency.getInstance(new Locale(\"\",\"JP\")) isn't equal to Currency.getInstance(\"JPY\")",
     81                 c2 == c0);
     82         c3 = Currency.getInstance(new Locale("bogus", "JP"));
     83         assertTrue(
     84                 "Currency.getInstance(new Locale(\"bogus\",\"JP\")) isn't equal to Currency.getInstance(\"JPY\")",
     85                 c3 == c0);
     86 
     87         Locale localeGu = new Locale("gu", "IN");
     88         Currency cGu = Currency.getInstance(localeGu);
     89         Locale localeKn = new Locale("kn", "IN");
     90         Currency cKn = Currency.getInstance(localeKn);
     91         assertTrue("Currency.getInstance(Locale_" + localeGu.toString() + "))"
     92                 + "isn't equal to " + "Currency.getInstance(Locale_"
     93                 + localeKn.toString() + "))", cGu == cKn);
     94 
     95         // some teritories do not have currencies, like Antarctica
     96         Locale loc = new Locale("", "AQ");
     97         try {
     98             Currency curr = Currency.getInstance(loc);
     99             assertNull(
    100                     "Currency.getInstance(new Locale(\"\", \"AQ\")) did not return null",
    101                     curr);
    102         } catch (IllegalArgumentException e) {
    103             fail("Unexpected IllegalArgumentException " + e);
    104         }
    105 
    106         // unsupported/legacy iso3 countries
    107         loc = new Locale("", "ZR");
    108         try {
    109             Currency curr = Currency.getInstance(loc);
    110             fail("Expected IllegalArgumentException");
    111         } catch (IllegalArgumentException e) {
    112         }
    113 
    114         loc = new Locale("", "ZAR");
    115         try {
    116             Currency curr = Currency.getInstance(loc);
    117             fail("Expected IllegalArgumentException");
    118         } catch (IllegalArgumentException e) {
    119         }
    120 
    121         loc = new Locale("", "FX");
    122         try {
    123             Currency curr = Currency.getInstance(loc);
    124             fail("Expected IllegalArgumentException");
    125         } catch (IllegalArgumentException e) {
    126         }
    127 
    128         loc = new Locale("", "FXX");
    129         try {
    130             Currency curr = Currency.getInstance(loc);
    131             fail("Expected IllegalArgumentException");
    132         } catch (IllegalArgumentException e) {
    133         }
    134 
    135         try {
    136             Currency.getInstance((Locale) null);
    137             fail("Expected NullPointerException");
    138         } catch (NullPointerException expected) {
    139         }
    140 
    141         try {
    142             Currency.getInstance((String) null);
    143             fail("Expected NullPointerException");
    144         } catch (NullPointerException expected) {
    145         }
    146     }
    147 
    148     /**
    149      * java.util.Currency#getSymbol()
    150      */
    151     public void test_getSymbol() {
    152         Currency currK = Currency.getInstance("KRW");
    153         Currency currI = Currency.getInstance("IEP");
    154         Currency currUS = Currency.getInstance("USD");
    155 
    156         Locale.setDefault(Locale.US);
    157         // BEGIN Android-changed
    158         // KRW currency symbol is \u20a9 since CLDR1.7 release.
    159         assertEquals("currK.getSymbol()", "\u20a9", currK.getSymbol());
    160         // IEP currency symbol is IEP since CLDR2.0 release.
    161         assertEquals("currI.getSymbol()", "IEP", currI.getSymbol());
    162         // END Android-changed
    163         assertEquals("currUS.getSymbol()", "$", currUS.getSymbol());
    164 
    165         Locale.setDefault(new Locale("en", "IE"));
    166         // BEGIN Android-changed
    167         assertEquals("currK.getSymbol()", "\u20a9", currK.getSymbol());
    168         assertEquals("currI.getSymbol()", "IEP", currI.getSymbol());
    169         assertEquals("currUS.getSymbol()", "US$", currUS.getSymbol());
    170         // END Android-changed
    171 
    172         // Test what happens if the default is an invalid locale, one with the country Korea (KR)
    173         // but a currently unsupported language. "kr" == Kanuri (Korean is actually "ko").
    174         // All these values are those defined in the "root" locale or the currency code if one isn't
    175         // defined.
    176         Locale.setDefault(new Locale("kr", "KR"));
    177         // BEGIN Android-changed
    178         assertEquals("currK.getSymbol()", "\u20a9", currK.getSymbol());
    179         assertEquals("currI.getSymbol()", "IEP", currI.getSymbol());
    180         assertEquals("currUS.getSymbol()", "US$", currUS.getSymbol());
    181         // END Android-changed
    182     }
    183 
    184     /**
    185      * java.util.Currency#getSymbol(java.util.Locale)
    186      */
    187     public void test_getSymbolLjava_util_Locale() {
    188         //Tests was simplified because java specification not
    189         // includes strong requirements for returning symbol.
    190         // on android platform used wrong character for yen
    191         // sign: \u00a5 instead of \uffe5
    192         Locale[] desiredLocales = new Locale[]{
    193                 Locale.JAPAN,  Locale.JAPANESE,
    194                 Locale.FRANCE, Locale.FRENCH,
    195                 Locale.US,     Locale.UK,
    196                 Locale.CANADA, Locale.CANADA_FRENCH,
    197                 Locale.ENGLISH,
    198                 new Locale("ja", "JP"), new Locale("", "JP"),
    199 
    200                 new Locale("fr", "FR"), new Locale("", "FR"),
    201 
    202                 new Locale("en", "US"), new Locale("", "US"),
    203                 new Locale("es", "US"), new Locale("ar", "US"),
    204                 new Locale("ja", "US"),
    205 
    206                 new Locale("en", "CA"), new Locale("fr", "CA"),
    207                 new Locale("", "CA"),   new Locale("ar", "CA"),
    208 
    209                 new Locale("ja", "JP"), new Locale("", "JP"),
    210                 new Locale("ar", "JP"),
    211 
    212                 new Locale("ja", "AE"), new Locale("en", "AE"),
    213                 new Locale("ar", "AE"),
    214 
    215                 new Locale("da", "DK"), new Locale("", "DK"),
    216 
    217                 new Locale("da", ""), new Locale("ja", ""),
    218                 new Locale("en", "")};
    219 
    220         Set<Locale> availableLocales = new HashSet<Locale>(Arrays.asList(Locale.getAvailableLocales()));
    221 
    222         ArrayList<Locale> locales = new ArrayList<Locale>();
    223         for (Locale desiredLocale : desiredLocales) {
    224             if (availableLocales.contains(desiredLocale)) {
    225                 locales.add(desiredLocale);
    226             }
    227         }
    228 
    229         Locale[] loc1 = locales.toArray(new Locale[locales.size()]);
    230 
    231         String[] euro    = new String[] {"EUR", "\u20ac"};
    232         // \u00a5 and \uffe5 are actually the same symbol, just different code points.
    233         // But the RI returns the \uffe5 and Android returns those with \u00a5
    234         String[] yen     = new String[] {"JPY", "\u00a5", "\u00a5JP", "JP\u00a5", "\uffe5", "\uffe5JP", "JP\uffe5"};
    235         String[] dollar  = new String[] {"USD", "$", "US$", "$US", "$US"};
    236         // BEGIN Android-changed
    237         // Starting CLDR 1.7 release, currency symbol for CAD changed to CA$ in some locales such as ja.
    238         String[] cDollar = new String[] {"CA$", "CAD", "$", "Can$", "$CA"};
    239         // END Android-changed
    240 
    241         Currency currE   = Currency.getInstance("EUR");
    242         Currency currJ   = Currency.getInstance("JPY");
    243         Currency currUS  = Currency.getInstance("USD");
    244         Currency currCA  = Currency.getInstance("CAD");
    245 
    246         int i, j, k;
    247         boolean flag;
    248 
    249         for(k = 0; k < loc1.length; k++) {
    250             Locale.setDefault(loc1[k]);
    251 
    252             for (i = 0; i < loc1.length; i++) {
    253                 flag = false;
    254                 for  (j = 0; j < euro.length; j++) {
    255                     if (currE.getSymbol(loc1[i]).equals(euro[j])) {
    256                         flag = true;
    257                         break;
    258                     }
    259                 }
    260                 assertTrue("Default Locale is: " + Locale.getDefault()
    261                         + ". For locale " + loc1[i]
    262                         + " the Euro currency returned "
    263                         + currE.getSymbol(loc1[i])
    264                         + ". Expected was one of these: "
    265                         + Arrays.toString(euro), flag);
    266             }
    267 
    268             for (i = 0; i < loc1.length; i++) {
    269                 flag = false;
    270                 for  (j = 0; j < yen.length; j++) {
    271                     if (currJ.getSymbol(loc1[i]).equals(yen[j])) {
    272                         flag = true;
    273                         break;
    274                     }
    275                 }
    276                 assertTrue("Default Locale is: " + Locale.getDefault()
    277                         + ". For locale " + loc1[i]
    278                         + " the Yen currency returned "
    279                         + currJ.getSymbol(loc1[i])
    280                         + ". Expected was one of these: "
    281                         + Arrays.toString(yen), flag);
    282             }
    283 
    284             for (i = 0; i < loc1.length; i++) {
    285                 flag = false;
    286                 for  (j = 0; j < dollar.length; j++) {
    287                     if (currUS.getSymbol(loc1[i]).equals(dollar[j])) {
    288                         flag = true;
    289                         break;
    290                     }
    291                 }
    292                 assertTrue("Default Locale is: " + Locale.getDefault()
    293                         + ". For locale " + loc1[i]
    294                         + " the Dollar currency returned "
    295                         + currUS.getSymbol(loc1[i])
    296                         + ". Expected was one of these: "
    297                         + Arrays.toString(dollar), flag);
    298             }
    299 
    300             for (i = 0; i < loc1.length; i++) {
    301                 flag = false;
    302                 for  (j = 0; j < cDollar.length; j++) {
    303                     if (currCA.getSymbol(loc1[i]).equals(cDollar[j])) {
    304                         flag = true;
    305                         break;
    306                     }
    307                 }
    308                 assertTrue("Default Locale is: " + Locale.getDefault()
    309                         + ". For locale " + loc1[i]
    310                         + " the Canadian Dollar currency returned "
    311                         + currCA.getSymbol(loc1[i])
    312                         + ". Expected was one of these: "
    313                         + Arrays.toString(cDollar), flag);
    314             }
    315         }
    316     }
    317 
    318     /**
    319      * java.util.Currency#getDefaultFractionDigits()
    320      */
    321     public void test_getDefaultFractionDigits() {
    322 
    323         Currency c1 = Currency.getInstance("TND");
    324         c1.getDefaultFractionDigits();
    325         assertEquals(" Currency.getInstance(\"" + c1
    326                 + "\") returned incorrect number of digits. ", 3, c1
    327                 .getDefaultFractionDigits());
    328 
    329         Currency c2 = Currency.getInstance("EUR");
    330         c2.getDefaultFractionDigits();
    331         assertEquals(" Currency.getInstance(\"" + c2
    332                 + "\") returned incorrect number of digits. ", 2, c2
    333                 .getDefaultFractionDigits());
    334 
    335         Currency c3 = Currency.getInstance("JPY");
    336         c3.getDefaultFractionDigits();
    337         assertEquals(" Currency.getInstance(\"" + c3
    338                 + "\") returned incorrect number of digits. ", 0, c3
    339                 .getDefaultFractionDigits());
    340 
    341         Currency c4 = Currency.getInstance("XXX");
    342         c4.getDefaultFractionDigits();
    343         assertEquals(" Currency.getInstance(\"" + c4
    344                 + "\") returned incorrect number of digits. ", -1, c4
    345                 .getDefaultFractionDigits());
    346     }
    347 
    348     /**
    349      * java.util.Currency#getCurrencyCode() Note: lines under remarks
    350      *        (Locale.CHINESE, Locale.ENGLISH, Locale.FRENCH, Locale.GERMAN,
    351      *        Locale.ITALIAN, Locale.JAPANESE, Locale.KOREAN) raises exception
    352      *        on SUN VM
    353      */
    354     public void test_getCurrencyCode() {
    355         final Collection<Locale> locVal = Arrays.asList(
    356                 Locale.CANADA,
    357                 Locale.CANADA_FRENCH,
    358                 Locale.CHINA,
    359                 // Locale.CHINESE,
    360                 // Locale.ENGLISH,
    361                 Locale.FRANCE,
    362                 // Locale.FRENCH,
    363                 // Locale.GERMAN,
    364                 Locale.GERMANY,
    365                 // Locale.ITALIAN,
    366                 Locale.ITALY, Locale.JAPAN,
    367                 // Locale.JAPANESE,
    368                 Locale.KOREA,
    369                 // Locale.KOREAN,
    370                 Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN, Locale.TRADITIONAL_CHINESE,
    371                 Locale.UK, Locale.US);
    372         final Collection<String> locDat = Arrays.asList("CAD", "CAD", "CNY", "EUR", "EUR", "EUR",
    373                 "JPY", "KRW", "CNY", "CNY", "TWD", "TWD", "GBP", "USD");
    374 
    375         Iterator<String> dat = locDat.iterator();
    376         for (Locale l : locVal) {
    377             String d = dat.next().trim();
    378             assertEquals("For locale " + l + " currency code wrong", Currency.getInstance(l)
    379                     .getCurrencyCode(), d);
    380         }
    381     }
    382 
    383     /**
    384      * java.util.Currency#toString() Note: lines under remarks
    385      *        (Locale.CHINESE, Locale.ENGLISH, Locale.FRENCH, Locale.GERMAN,
    386      *        Locale.ITALIAN, Locale.JAPANESE, Locale.KOREAN) raises exception
    387      *        on SUN VM
    388      */
    389     public void test_toString() {
    390         final Collection<Locale> locVal = Arrays.asList(
    391                 Locale.CANADA,
    392                 Locale.CANADA_FRENCH,
    393                 Locale.CHINA,
    394                 // Locale.CHINESE,
    395                 // Locale.ENGLISH,
    396                 Locale.FRANCE,
    397                 // Locale.FRENCH,
    398                 // Locale.GERMAN,
    399                 Locale.GERMANY,
    400                 // Locale.ITALIAN,
    401                 Locale.ITALY, Locale.JAPAN,
    402                 // Locale.JAPANESE,
    403                 Locale.KOREA,
    404                 // Locale.KOREAN,
    405                 Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN, Locale.TRADITIONAL_CHINESE,
    406                 Locale.UK, Locale.US);
    407         final Collection<String> locDat = Arrays.asList("CAD", "CAD", "CNY", "EUR", "EUR", "EUR",
    408                 "JPY", "KRW", "CNY", "CNY", "TWD", "TWD", "GBP", "USD");
    409 
    410         Iterator<String> dat = locDat.iterator();
    411         for (Locale l : locVal) {
    412             String d = dat.next().trim();
    413             assertEquals("For locale " + l + " Currency.toString method returns wrong value",
    414                     Currency.getInstance(l).toString(), d);
    415         }
    416     }
    417 }
    418