17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2008-2012, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.localespi;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.lang.reflect.Method;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Currency;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashSet;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert@SuppressWarnings("unchecked")
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CurrencyNameTest extends TestFmwk {
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new CurrencyNameTest().run(args);
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Set<Currency> AVAILABLE_CURRENCIES;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Method GETDISPLAYNAME_METHOD;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static {
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Method mGetDisplayName = null;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Set<Currency> currencies = null;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            mGetDisplayName = Currency.class.getMethod("getDisplayName", new Class[] {Locale.class});
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Method mGetAvailableCurrencies = Currency.class.getMethod("getAvailableCurrencies", (Class[]) null);
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            currencies = (Set<Currency>)mGetAvailableCurrencies.invoke(null, (Object[]) null);
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // fall through
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (currencies == null) {
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make a set of unique currencies
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            currencies = new HashSet<Currency>();
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (Locale l : Locale.getAvailableLocales()) {
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (l.getCountry().length() == 0) {
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Currency currency = Currency.getInstance(l);
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (currency != null) {
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        currencies.add(currency);
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (IllegalArgumentException iae) {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // ignore
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GETDISPLAYNAME_METHOD = mGetDisplayName;
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        AVAILABLE_CURRENCIES = Collections.unmodifiableSet(currencies);
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencySymbols() {
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Currency currency : AVAILABLE_CURRENCIES) {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String currencyCode = currency.getCurrencyCode();
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.util.Currency currencyIcu = com.ibm.icu.util.Currency.getInstance(currencyCode);
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (Locale loc : Locale.getAvailableLocales()) {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (TestUtil.isProblematicIBMLocale(loc)) {
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Skipped " + loc);
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String curSymbol = currency.getSymbol(loc);
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String curSymbolIcu = currencyIcu.getSymbol(loc);
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (curSymbolIcu.equals(currencyCode)) {
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // No data in ICU
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curSymbol.equals(currencyCode)) {
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("INFO: JDK has currency symbol " + curSymbol + " for locale " +
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                loc + ", but ICU does not");
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (TestUtil.isICUExtendedLocale(loc)) {
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curSymbol.equals(curSymbolIcu)) {
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: Currency symbol for " + currencyCode + " by ICU is " + curSymbolIcu
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + ", but got " + curSymbol + " in locale " + loc);
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curSymbol.equals(curSymbolIcu)) {
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("INFO: Currency symbol for " + currencyCode +  " by ICU is " + curSymbolIcu
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + ", but " + curSymbol + " by JDK in locale " + loc);
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // Try explicit ICU locale (xx_yy_ICU)
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Locale locIcu = TestUtil.toICUExtendedLocale(loc);
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    curSymbol = currency.getSymbol(locIcu);
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curSymbol.equals(curSymbolIcu)) {
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: Currency symbol for " + currencyCode + " by ICU is " + curSymbolIcu
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + ", but got " + curSymbol + " in locale " + locIcu);
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyDisplayNames() {
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (GETDISPLAYNAME_METHOD == null) {
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("INFO: Currency#getDisplayName(String,Locale) is not available.");
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Currency currency : AVAILABLE_CURRENCIES) {
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String currencyCode = currency.getCurrencyCode();
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.util.Currency currencyIcu = com.ibm.icu.util.Currency.getInstance(currencyCode);
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (Locale loc : Locale.getAvailableLocales()) {
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (TestUtil.isProblematicIBMLocale(loc)) {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Skipped " + loc);
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String curName = null;
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    curName = (String)GETDISPLAYNAME_METHOD.invoke(currency, new Object[] {loc});
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Exception e) {
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: JDK Currency#getDisplayName(\"" + currency + "\", \"" + loc + "\") throws exception: " + e.getMessage());
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String curNameIcu = currencyIcu.getDisplayName(loc);
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (curNameIcu.equals(currencyCode)) {
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // No data in ICU
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curName.equals(currencyCode)) {
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("INFO: JDK has currency display name " + curName + " for locale " +
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                loc + ", but ICU does not");
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (TestUtil.isICUExtendedLocale(loc)) {
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curName.equals(curNameIcu)) {
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: Currency display name for " + currencyCode + " by ICU is " + curNameIcu
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + ", but got " + curName + " in locale " + loc);
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curName.equals(curNameIcu)) {
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("INFO: Currency display name for " + currencyCode +  " by ICU is " + curNameIcu
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + ", but " + curName + " by JDK in locale " + loc);
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // Try explicit ICU locale (xx_yy_ICU)
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Locale locIcu = TestUtil.toICUExtendedLocale(loc);
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        curName = (String)GETDISPLAYNAME_METHOD.invoke(currency, new Object[] {locIcu});
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (Exception e) {
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: JDK Currency#getDisplayName(\"" + currency + "\", \"" + locIcu + "\") throws exception: " + e.getMessage());
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        continue;
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!curName.equals(curNameIcu)) {
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: Currency display name for " + currencyCode + " by ICU is " + curNameIcu
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + ", but got " + curName + " in locale " + locIcu);
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
165