| /* |
| ********************************************************************** |
| * Copyright (c) 2002-2009, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| ********************************************************************** |
| * Author: Alan Liu |
| * Created: December 18 2002 |
| * Since: ICU 2.4 |
| ********************************************************************** |
| */ |
| |
| package com.ibm.icu.dev.test.util; |
| |
| import java.util.Arrays; |
| import java.util.Date; |
| import java.util.HashSet; |
| import java.util.Locale; |
| |
| import com.ibm.icu.dev.test.TestFmwk; |
| import com.ibm.icu.text.DecimalFormatSymbols; |
| import com.ibm.icu.util.Currency; |
| import com.ibm.icu.util.ULocale; |
| |
| /** |
| * @test |
| * @summary General test of Currency |
| */ |
| public class CurrencyTest extends TestFmwk { |
| |
| public static void main(String[] args) throws Exception { |
| new CurrencyTest().run(args); |
| } |
| |
| /** |
| * Test of basic API. |
| */ |
| public void TestAPI() { |
| Currency usd = Currency.getInstance("USD"); |
| /*int hash = */usd.hashCode(); |
| Currency jpy = Currency.getInstance("JPY"); |
| if (usd.equals(jpy)) { |
| errln("FAIL: USD == JPY"); |
| } |
| if (usd.equals("abc")) { |
| errln("FAIL: USD == (String)"); |
| } |
| if (usd.equals(null)) { |
| errln("FAIL: USD == (null)"); |
| } |
| if (!usd.equals(usd)) { |
| errln("FAIL: USD != USD"); |
| } |
| |
| try { |
| Currency nullCurrency = Currency.getInstance((String)null); |
| errln("FAIL: Expected getInstance(null) to throw " |
| + "a NullPointerException, but returned " + nullCurrency); |
| } catch (NullPointerException npe) { |
| logln("PASS: getInstance(null) threw a NullPointerException"); |
| } |
| |
| try { |
| Currency bogusCurrency = Currency.getInstance("BOGUS"); |
| errln("FAIL: Expected getInstance(\"BOGUS\") to throw " |
| + "an IllegalArgumentException, but returned " + bogusCurrency); |
| } catch (IllegalArgumentException iae) { |
| logln("PASS: getInstance(\"BOGUS\") threw an IllegalArgumentException"); |
| } |
| |
| Locale[] avail = Currency.getAvailableLocales(); |
| if(avail==null){ |
| errln("FAIL: getAvailableLocales returned null"); |
| } |
| |
| try { |
| usd.getName(ULocale.US, 5, new boolean[1]); |
| errln("expected getName with invalid type parameter to throw exception"); |
| } |
| catch (Exception e) { |
| logln("PASS: getName failed as expected"); |
| } |
| } |
| |
| /** |
| * Test registration. |
| */ |
| public void TestRegistration() { |
| final Currency jpy = Currency.getInstance("JPY"); |
| final Currency usd = Currency.getInstance(Locale.US); |
| |
| try { |
| Currency.unregister(null); // should fail, coverage |
| errln("expected unregister of null to throw exception"); |
| } |
| catch (Exception e) { |
| logln("PASS: unregister of null failed as expected"); |
| } |
| |
| if (Currency.unregister("")) { // coverage |
| errln("unregister before register erroneously succeeded"); |
| } |
| |
| ULocale fu_FU = new ULocale("fu_FU"); |
| |
| Object key1 = Currency.registerInstance(jpy, ULocale.US); |
| Object key2 = Currency.registerInstance(jpy, fu_FU); |
| |
| Currency nus = Currency.getInstance(Locale.US); |
| if (!nus.equals(jpy)) { |
| errln("expected " + jpy + " but got: " + nus); |
| } |
| |
| // converage, make sure default factory works |
| Currency nus1 = Currency.getInstance(Locale.JAPAN); |
| if (!nus1.equals(jpy)) { |
| errln("expected " + jpy + " but got: " + nus1); |
| } |
| |
| ULocale[] locales = Currency.getAvailableULocales(); |
| boolean found = false; |
| for (int i = 0; i < locales.length; ++i) { |
| if (locales[i].equals(fu_FU)) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| errln("did not find locale" + fu_FU + " in currency locales"); |
| } |
| |
| if (!Currency.unregister(key1)) { |
| errln("unable to unregister currency using key1"); |
| } |
| if (!Currency.unregister(key2)) { |
| errln("unable to unregister currency using key2"); |
| } |
| |
| Currency nus2 = Currency.getInstance(Locale.US); |
| if (!nus2.equals(usd)) { |
| errln("expected " + usd + " but got: " + nus2); |
| } |
| |
| locales = Currency.getAvailableULocales(); |
| found = false; |
| for (int i = 0; i < locales.length; ++i) { |
| if (locales[i].equals(fu_FU)) { |
| found = true; |
| break; |
| } |
| } |
| if (found) { |
| errln("found locale" + fu_FU + " in currency locales after unregister"); |
| } |
| } |
| |
| /** |
| * Test names. |
| */ |
| public void TestNames() { |
| // Do a basic check of getName() |
| // USD { "US$", "US Dollar" } // 04/04/1792- |
| ULocale en = ULocale.ENGLISH; |
| boolean[] isChoiceFormat = new boolean[1]; |
| Currency usd = Currency.getInstance("USD"); |
| // Warning: HARD-CODED LOCALE DATA in this test. If it fails, CHECK |
| // THE LOCALE DATA before diving into the code. |
| if (!noData()) { |
| assertEquals("USD.getName(SYMBOL_NAME)", |
| "$", |
| usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat)); |
| assertEquals("USD.getName(LONG_NAME)", |
| "US Dollar", |
| usd.getName(en, Currency.LONG_NAME, isChoiceFormat)); |
| } |
| // TODO add more tests later |
| } |
| |
| public void TestCoverage() { |
| Currency usd = Currency.getInstance("USD"); |
| if (!noData()) { |
| assertEquals("USD.getSymbol()", |
| "$", |
| usd.getSymbol()); |
| } |
| assertEquals("USD.getLocale()", |
| ULocale.ROOT, |
| usd.getLocale(null)); |
| } |
| |
| public void TestCurrencyKeyword() { |
| ULocale locale = new ULocale("th_TH@collation=traditional;currency=QQQ"); |
| Currency currency = Currency.getInstance(locale); |
| String result = currency.getCurrencyCode(); |
| if (!"QQQ".equals(result)) { |
| errln("got unexpected currency: " + result); |
| } |
| } |
| |
| public void TestAvailableCurrencyCodes() |
| { |
| // local Variables |
| String[] currency; |
| |
| // Cycle through historical currencies |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AM"), new Date(-630720000000L)); // pre 1961 |
| if (currency != null) |
| { |
| errln("FAIL: didn't return null for eo_AM"); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AM"), new Date(0L)); // 1970 |
| if (currency.length != 1) |
| { |
| errln("FAIL: didn't return 1 for eo_AM returned: " + currency.length); |
| } |
| if (!"SUR".equals(currency[0])) |
| { |
| errln("didn't return SUR for eo_AM returned: " + currency[0]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AM"), new Date(693792000000L)); // 1992 |
| if (currency.length != 1) |
| { |
| errln("FAIL: didn't return 1 for eo_AM returned: " + currency.length); |
| } |
| if (!"RUR".equals(currency[0])) |
| { |
| errln("didn't return RUR for eo_AM returned: " + currency[0]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AM"), new Date(977616000000L)); // post 1993 |
| if (currency.length != 1) |
| { |
| errln("FAIL: didn't return 1 for eo_AM returned: " + currency.length); |
| } |
| if (!"AMD".equals(currency[0])) |
| { |
| errln("didn't return AMD for eo_AM returned: " + currency[0]); |
| } |
| |
| // Locale AD has multiple currencies at once |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AD"), new Date(977616000000L)); // 2001 |
| if (currency.length != 4) |
| { |
| errln("FAIL: didn't return 4 for eo_AD returned: " + currency.length); |
| } |
| if (!"EUR".equals(currency[0])) |
| { |
| errln("didn't return EUR for eo_AD returned: " + currency[0]); |
| } |
| if (!"ESP".equals(currency[1])) |
| { |
| errln("didn't return ESP for eo_AD returned: " + currency[1]); |
| } |
| if (!"FRF".equals(currency[2])) |
| { |
| errln("didn't return FRF for eo_AD returned: " + currency[2]); |
| } |
| if (!"ADP".equals(currency[3])) |
| { |
| errln("didn't return ADP for eo_AD returned: " + currency[3]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AD"), new Date(0L)); // 1970 |
| if (currency.length != 3) |
| { |
| errln("FAIL: didn't return 3 for eo_AD returned: " + currency.length); |
| } |
| if (!"ESP".equals(currency[0])) |
| { |
| errln("didn't return ESP for eo_AD returned: " + currency[0]); |
| } |
| if (!"FRF".equals(currency[1])) |
| { |
| errln("didn't return FRF for eo_AD returned: " + currency[1]); |
| } |
| if (!"ADP".equals(currency[2])) |
| { |
| errln("didn't return ADP for eo_AD returned: " + currency[2]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AD"), new Date(-630720000000L)); // 1950 |
| if (currency.length != 2) |
| { |
| errln("FAIL: didn't return 2 for eo_AD returned: " + currency.length); |
| } |
| if (!"ESP".equals(currency[0])) |
| { |
| errln("didn't return ESP for eo_AD returned: " + currency[0]); |
| } |
| if (!"ADP".equals(currency[1])) |
| { |
| errln("didn't return ADP for eo_AD returned: " + currency[1]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AD"), new Date(-2207520000000L)); // 1900 |
| if (currency.length != 1) |
| { |
| errln("FAIL: didn't return 1 for eo_AD returned: " + currency.length); |
| } |
| if (!"ESP".equals(currency[0])) |
| { |
| errln("didn't return ESP for eo_AD returned: " + currency[0]); |
| } |
| |
| // Locale UA has gap between years 1994 - 1996 |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_UA"), new Date(788400000000L)); |
| if (currency != null) |
| { |
| errln("FAIL: didn't return null for eo_UA"); |
| } |
| |
| // Test for bogus locale |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_QQ"), new Date(0L)); |
| if (currency != null) |
| { |
| errln("FAIL: didn't return null for eo_QQ"); |
| } |
| |
| // Cycle through historical currencies |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AO"), new Date(977616000000L)); // 2001 |
| if (currency.length != 1) |
| { |
| errln("FAIL: didn't return 1 for eo_AO returned: " + currency.length); |
| } |
| if (!"AOA".equals(currency[0])) |
| { |
| errln("didn't return AOA for eo_AO returned: " + currency[0]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AO"), new Date(819936000000L)); // 1996 |
| if (currency.length != 2) |
| { |
| errln("FAIL: didn't return 2 for eo_AO returned: " + currency.length); |
| } |
| if (!"AOR".equals(currency[0])) |
| { |
| errln("didn't return AOR for eo_AO returned: " + currency[0]); |
| } |
| if (!"AON".equals(currency[1])) |
| { |
| errln("didn't return AON for eo_AO returned: " + currency[1]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AO"), new Date(662256000000L)); // |
| if (currency.length != 2) |
| { |
| errln("FAIL: didn't return 2 for eo_AO returned: " + currency.length); |
| } |
| if (!"AON".equals(currency[0])) |
| { |
| errln("didn't return AON for eo_AO returned: " + currency[0]); |
| } |
| if (!"AOK".equals(currency[1])) |
| { |
| errln("didn't return AOK for eo_AO returned: " + currency[1]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AO"), new Date(315360000000L)); // 1980 |
| if (currency.length != 1) |
| { |
| errln("FAIL: didn't return 1 for eo_AO returned: " + currency.length); |
| } |
| if (!"AOK".equals(currency[0])) |
| { |
| errln("didn't return AOK for eo_AO returned: " + currency[0]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_AO"), new Date(0L)); // 1970 |
| if (currency != null) |
| { |
| errln("FAIL: didn't return null for eo_AO"); |
| } |
| |
| // Test with currency keyword override |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("eo_DE@currency=DEM"), new Date(977616000000L)); // 2001 |
| if (currency.length != 2) |
| { |
| errln("FAIL: didn't return 2 for eo_DE@currency=DEM returned: " + currency.length); |
| } |
| if (!"EUR".equals(currency[0])) |
| { |
| errln("didn't return EUR for eo_DE@currency=DEM returned: " + currency[0]); |
| } |
| if (!"DEM".equals(currency[1])) |
| { |
| errln("didn't return DEM for eo_DE@currency=DEM returned: " + currency[1]); |
| } |
| |
| // Test Euro Support |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("en_US"), new Date(System.currentTimeMillis())); |
| if (!"USD".equals(currency[0])) |
| { |
| errln("didn't return USD for en_US returned: " + currency[0]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("en_US_PREEURO"), new Date(System.currentTimeMillis())); |
| if (!"USD".equals(currency[0])) |
| { |
| errln("didn't return USD for en_US_PREEURO returned: " + currency[0]); |
| } |
| |
| currency = Currency.getAvailableCurrencyCodes(new ULocale("en_US_Q"), new Date(System.currentTimeMillis())); |
| if (!"USD".equals(currency[0])) |
| { |
| errln("didn't return USD for en_US_Q returned: " + currency[0]); |
| } |
| |
| } |
| |
| public void TestDeprecatedCurrencyFormat() { |
| // bug 5952 |
| Locale locale = new Locale("sr", "QQ"); |
| DecimalFormatSymbols icuSymbols = new |
| com.ibm.icu.text.DecimalFormatSymbols(locale); |
| String symbol = icuSymbols.getCurrencySymbol(); |
| Currency currency = icuSymbols.getCurrency(); |
| String expectCur = null; |
| String expectSym = "\u00A4"; |
| if(!symbol.toString().equals(expectSym) || currency != null) { |
| errln("for " + locale + " expected " + expectSym+"/"+expectCur + " but got " + symbol+"/"+currency); |
| } else { |
| logln("for " + locale + " expected " + expectSym+"/"+expectCur + " and got " + symbol+"/"+currency); |
| } |
| } |
| |
| public void TestGetKeywordValues(){ |
| |
| final String[][] PREFERRED = { |
| {"root", "USD"}, |
| {"und", "USD"}, |
| {"und_ZZ", "USD"}, |
| {"en_US", "USD"}, |
| {"en_029", "USD"}, |
| {"en_TH", "THB"}, |
| {"de", "EUR"}, |
| {"de_DE", "EUR"}, |
| {"ar", "EGP"}, |
| {"ar_PS", "JOD", "ILS"}, |
| {"en@currency=CAD", "USD"}, |
| {"fr@currency=ZZZ", "EUR"}, |
| {"de_DE@currency=DEM", "EUR"}, |
| }; |
| |
| String[] ALL = Currency.getKeywordValuesForLocale("currency", ULocale.getDefault(), false); |
| HashSet ALLSET = new HashSet(); |
| for (int i = 0; i < ALL.length; i++) { |
| ALLSET.add(ALL[i]); |
| } |
| |
| for (int i = 0; i < PREFERRED.length; i++) { |
| ULocale loc = new ULocale(PREFERRED[i][0]); |
| String[] expected = new String[PREFERRED[i].length - 1]; |
| System.arraycopy(PREFERRED[i], 1, expected, 0, expected.length); |
| |
| String[] pref = Currency.getKeywordValuesForLocale("currency", loc, true); |
| boolean matchPref = false; |
| if (pref.length == expected.length) { |
| matchPref = true; |
| for (int j = 0; j < pref.length; j++) { |
| if (!pref[j].equals(expected[j])) { |
| matchPref = false; |
| } |
| } |
| } |
| if (!matchPref) { |
| errln("FAIL: Preferred values for locale " + loc |
| + " got:" + Arrays.toString(pref) + " expected:" + Arrays.toString(expected)); |
| } |
| |
| String[] all = Currency.getKeywordValuesForLocale("currency", loc, false); |
| boolean matchAll = false; |
| if (all.length == ALLSET.size()) { |
| matchAll = true; |
| for (int j = 0; j < all.length; j++) { |
| if (!ALLSET.contains(all[j])) { |
| matchAll = false; |
| break; |
| } |
| } |
| } |
| if (!matchAll) { |
| errln("FAIL: All values for locale " + loc |
| + " got:" + Arrays.toString(all)); |
| } |
| } |
| } |
| } |