17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **********************************************************************
3578e467cc0b85f5a3f1b49bba673d654abb3dbd3roubert * Copyright (c) 2002-2015, International Business Machines
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Corporation and others.  All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **********************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Author: Alan Liu
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Created: December 18 2002
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Since: ICU 2.4
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **********************************************************************
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.util;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Arrays;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashSet;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil;
23578e467cc0b85f5a3f1b49bba673d654abb3dbd3roubertimport com.ibm.icu.dev.test.TestUtil.JavaVendor;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.CurrencyData;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyDisplayNames;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyMetaInfo;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyMetaInfo.CurrencyFilter;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyMetaInfo.CurrencyInfo;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SimpleDateFormat;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.GregorianCalendar;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @test
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @summary General test of Currency
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CurrencyTest extends TestFmwk {
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new CurrencyTest().run(args);
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test of basic API.
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAPI() {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency usd = Currency.getInstance("USD");
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*int hash = */usd.hashCode();
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency jpy = Currency.getInstance("JPY");
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (usd.equals(jpy)) {
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: USD == JPY");
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (usd.equals("abc")) {
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: USD == (String)");
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (usd.equals(null)) {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: USD == (null)");
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!usd.equals(usd)) {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: USD != USD");
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency nullCurrency = Currency.getInstance((String)null);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected getInstance(null) to throw "
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "a NullPointerException, but returned " + nullCurrency);
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (NullPointerException npe) {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: getInstance(null) threw a NullPointerException");
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency bogusCurrency = Currency.getInstance("BOGUS");
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected getInstance(\"BOGUS\") to throw "
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "an IllegalArgumentException, but returned " + bogusCurrency);
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException iae) {
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: getInstance(\"BOGUS\") threw an IllegalArgumentException");
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] avail = Currency.getAvailableLocales();
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(avail==null){
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: getAvailableLocales returned null");
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            usd.getName(ULocale.US, 5, new boolean[1]);
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected getName with invalid type parameter to throw exception");
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: getName failed as expected");
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test registration.
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRegistration() {
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Currency jpy = Currency.getInstance("JPY");
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Currency usd = Currency.getInstance(Locale.US);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    try {
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      Currency.unregister(null); // should fail, coverage
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      errln("expected unregister of null to throw exception");
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    catch (Exception e) {
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("PASS: unregister of null failed as expected");
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    if (Currency.unregister("")) { // coverage
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      errln("unregister before register erroneously succeeded");
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale fu_FU = new ULocale("fu_FU");
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object key1 = Currency.registerInstance(jpy, ULocale.US);
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object key2 = Currency.registerInstance(jpy, fu_FU);
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency nus = Currency.getInstance(Locale.US);
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nus.equals(jpy)) {
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected " + jpy + " but got: " + nus);
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // converage, make sure default factory works
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency nus1 = Currency.getInstance(Locale.JAPAN);
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nus1.equals(jpy)) {
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected " + jpy + " but got: " + nus1);
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale[] locales = Currency.getAvailableULocales();
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean found = false;
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; ++i) {
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locales[i].equals(fu_FU)) {
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                found = true;
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!found) {
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("did not find locale" + fu_FU + " in currency locales");
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!Currency.unregister(key1)) {
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unable to unregister currency using key1");
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!Currency.unregister(key2)) {
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unable to unregister currency using key2");
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency nus2 = Currency.getInstance(Locale.US);
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nus2.equals(usd)) {
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected " + usd + " but got: " + nus2);
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        locales = Currency.getAvailableULocales();
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        found = false;
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; ++i) {
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locales[i].equals(fu_FU)) {
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                found = true;
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (found) {
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("found locale" + fu_FU + " in currency locales after unregister");
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] locs = Currency.getAvailableLocales();
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        found = false;
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locs.length; ++i) {
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locs[i].equals(fu_FU)) {
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                found = true;
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (found) {
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("found locale" + fu_FU + " in currency locales after unregister");
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test names.
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNames() {
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Do a basic check of getName()
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // USD { "US$", "US Dollar"            } // 04/04/1792-
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale en = ULocale.ENGLISH;
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean[] isChoiceFormat = new boolean[1];
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency usd = Currency.getInstance("USD");
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // THE LOCALE DATA before diving into the code.
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!noData()) {
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("USD.getName(SYMBOL_NAME)",
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "$",
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("USD.getName(LONG_NAME)",
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "US Dollar",
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         usd.getName(en, Currency.LONG_NAME, isChoiceFormat));
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO add more tests later
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCoverage() {
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency usd = Currency.getInstance("USD");
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!noData()) {
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("USD.getSymbol()",
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "$",
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                usd.getSymbol());
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // A real test of the CurrencyDisplayNames class.
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyDisplayNames() {
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!CurrencyDisplayNames.hasData()) {
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("hasData() should return true.");
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // with substitute
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyDisplayNames cdn = CurrencyDisplayNames.getInstance(ULocale.GERMANY);
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_name", "US-Dollar", cdn.getName("USD"));
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_symbol", "$", cdn.getSymbol("USD"));
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_plural_other", "US-Dollar", cdn.getPluralName("USD", "other"));
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // unknown plural category, substitute "other"
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_plural_foo", "US-Dollar", cdn.getPluralName("USD", "foo"));
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.forLanguageTag("en-US"));
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_name", "US Dollar", cdn.getName("USD"));
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_symbol", "$", cdn.getSymbol("USD"));
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_plural_one", "US dollar", cdn.getPluralName("USD", "one"));
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_plural_other", "US dollars", cdn.getPluralName("USD", "other"));
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_FOO_name", "FOO", cdn.getName("FOO"));
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_FOO_symbol", "FOO", cdn.getSymbol("FOO"));
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_FOO_plural_other", "FOO", cdn.getPluralName("FOO", "other"));
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US bundle", "en", cdn.getULocale().toString());
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.forLanguageTag("zz-Gggg-YY"));
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("bundle from current locale", "en", cdn.getULocale().toString());
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // with no substitute
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.GERMANY, true);
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have currency data for Germany", cdn);
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // known currency, behavior unchanged
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_name", "US-Dollar", cdn.getName("USD"));
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_symbol", "$", cdn.getSymbol("USD"));
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_plural_other", "US-Dollar", cdn.getPluralName("USD", "other"));
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // known currency but unknown plural category
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_USD_plural_foo", cdn.getPluralName("USD", "foo"));
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // unknown currency, get null
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_name", cdn.getName("FOO"));
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_symbol", cdn.getSymbol("FOO"));
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_plural_other", cdn.getPluralName("FOO", "other"));
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_plural_foo", cdn.getPluralName("FOO", "foo"));
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // unknown locale with no substitute
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.forLanguageTag("zz-Gggg-YY"), true);
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String ln = "";
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (cdn != null) {
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ln = " (" + cdn.getULocale().toString() + ")";
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("no fallback from unknown locale" + ln , cdn);
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Locale version
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(Locale.GERMANY, true);
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have currency data for Germany (Java Locale)", cdn);
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_name (Locale)", "US-Dollar", cdn.getName("USD"));
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_name (Locale)", cdn.getName("FOO"));
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Coverage-only test of CurrencyData
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyData() {
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyData.DefaultInfo info_fallback = (CurrencyData.DefaultInfo)CurrencyData.DefaultInfo.getWithFallback(true);
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_fallback == null) {
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("getWithFallback() returned null.");
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyData.DefaultInfo info_nofallback = (CurrencyData.DefaultInfo)CurrencyData.DefaultInfo.getWithFallback(false);
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_nofallback == null) {
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("getWithFallback() returned null.");
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getName("isoCode").equals("isoCode") || info_nofallback.getName("isoCode") != null) {
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getName().");
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getPluralName("isoCode", "type").equals("isoCode") || info_nofallback.getPluralName("isoCode", "type") != null) {
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getPluralName().");
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getSymbol("isoCode").equals("isoCode") || info_nofallback.getSymbol("isoCode") != null) {
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getSymbol().");
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.symbolMap().isEmpty()) {
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("symbolMap() should return empty map.");
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.nameMap().isEmpty()) {
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("nameMap() should return empty map.");
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getUnitPatterns().isEmpty() || info_nofallback.getUnitPatterns() != null) {
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getUnitPatterns().");
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getSpacingInfo().equals((CurrencyData.CurrencySpacingInfo.DEFAULT)) ||
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                info_nofallback.getSpacingInfo() != null) {
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getSpacingInfo().");
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_fallback.getULocale() != ULocale.ROOT) {
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getLocale().");
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_fallback.getFormatInfo("isoCode") != null) {
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getFormatInfo().");
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // A real test of CurrencyMetaInfo.
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyMetaInfoRanges() {
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance(true);
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have metainfo", metainfo);
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyFilter filter = CurrencyFilter.onRegion("DE"); // must be capitalized
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<CurrencyInfo> currenciesInGermany = metainfo.currencyInfo(filter);
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("currencies: " + currenciesInGermany.size());
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date demLastDate = new Date(Long.MAX_VALUE);
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date eurFirstDate = new Date(Long.MIN_VALUE);
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (CurrencyInfo info : currenciesInGermany) {
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(info.toString());
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("from: " + fmt.format(info.from)+ Long.toHexString(info.from));
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("  to: " + fmt.format(info.to) + Long.toHexString(info.to));
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info.code.equals("DEM")) {
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                demLastDate = new Date(info.to);
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (info.code.equals("EUR")) {
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                eurFirstDate = new Date(info.from);
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the Euro and Deutschmark overlapped for several years
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM available at last date", 2, metainfo.currencyInfo(filter.withDate(demLastDate)).size());
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // demLastDate + 1 millisecond is not the start of the last day, we consider it the next day, so...
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date demLastDatePlus1ms = new Date(demLastDate.getTime() + 1);
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM not available after very start of last date", 1, metainfo.currencyInfo(filter.withDate(demLastDatePlus1ms)).size());
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // both available for start of euro
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR available on start of first date", 2, metainfo.currencyInfo(filter.withDate(eurFirstDate)).size());
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // but not one millisecond before the start of the first day
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date eurFirstDateMinus1ms = new Date(eurFirstDate.getTime() - 1);
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR not avilable before very start of first date", 1, metainfo.currencyInfo(filter.withDate(eurFirstDateMinus1ms)).size());
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // end time is last millisecond of day
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GregorianCalendar cal = new GregorianCalendar();
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTimeZone(TimeZone.getTimeZone("GMT"));
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTime(demLastDate);
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("hour is 23", 23, cal.get(GregorianCalendar.HOUR_OF_DAY));
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("minute is 59", 59, cal.get(GregorianCalendar.MINUTE));
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("second is 59", 59, cal.get(GregorianCalendar.SECOND));
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("millisecond is 999", 999, cal.get(GregorianCalendar.MILLISECOND));
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // start time is first millisecond of day
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTime(eurFirstDate);
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("hour is 0", 0, cal.get(GregorianCalendar.HOUR_OF_DAY));
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("minute is 0", 0, cal.get(GregorianCalendar.MINUTE));
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("second is 0", 0, cal.get(GregorianCalendar.SECOND));
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("millisecond is 0", 0, cal.get(GregorianCalendar.MILLISECOND));
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyMetaInfoRangesWithLongs() {
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance(true);
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have metainfo", metainfo);
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyFilter filter = CurrencyFilter.onRegion("DE"); // must be capitalized
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<CurrencyInfo> currenciesInGermany = metainfo.currencyInfo(filter);
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("currencies: " + currenciesInGermany.size());
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long demLastDate = Long.MAX_VALUE;
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long eurFirstDate = Long.MIN_VALUE;
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (CurrencyInfo info : currenciesInGermany) {
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(info.toString());
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info.code.equals("DEM")) {
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                demLastDate = info.to;
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (info.code.equals("EUR")) {
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                eurFirstDate = info.from;
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the Euro and Deutschmark overlapped for several years
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM available at last date", 2, metainfo.currencyInfo(filter.withDate(demLastDate)).size());
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // demLastDate + 1 millisecond is not the start of the last day, we consider it the next day, so...
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long demLastDatePlus1ms = demLastDate + 1;
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM not available after very start of last date", 1, metainfo.currencyInfo(filter.withDate(demLastDatePlus1ms)).size());
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // both available for start of euro
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR available on start of first date", 2, metainfo.currencyInfo(filter.withDate(eurFirstDate)).size());
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // but not one millisecond before the start of the first day
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long eurFirstDateMinus1ms = eurFirstDate - 1;
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR not avilable before very start of first date", 1, metainfo.currencyInfo(filter.withDate(eurFirstDateMinus1ms)).size());
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestWithTender() {
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance();
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (metainfo == null) {
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unable to get CurrencyMetaInfo instance.");
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyFilter filter =
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CurrencyMetaInfo.CurrencyFilter.onRegion("CH");
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<String> currencies = metainfo.currencies(filter);
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("More than one currency for switzerland", currencies.size() > 1);
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "With tender",
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Arrays.asList(new String[] {"CHF", "CHE", "CHW"}),
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                metainfo.currencies(filter.withTender()));
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Coverage-only test of the CurrencyMetaInfo class
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyMetaInfo() {
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance();
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (metainfo == null) {
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unable to get CurrencyMetaInfo instance.");
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!CurrencyMetaInfo.hasData()) {
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("hasData() should note return false.");
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyFilter filter;
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyInfo info;
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyDigits digits;
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { // CurrencyFilter
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            filter = CurrencyMetaInfo.CurrencyFilter.onCurrency("currency");
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyMetaInfo.CurrencyFilter filter2 = CurrencyMetaInfo.CurrencyFilter.onCurrency("test");
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter == null) {
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Unable to create CurrencyFilter.");
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.equals(new Object())) {
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("filter should not equal to Object");
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.equals(filter2)) {
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("filter should not equal filter2");
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.hashCode() == 0) {
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting filter hashcode");
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.toString() == null) {
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error calling toString()");
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { // CurrencyInfo
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            info = new CurrencyMetaInfo.CurrencyInfo("region", "code", 0, 1, 1, false);
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info == null) {
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error creating CurrencyInfo.");
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info.toString() == null) {
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error calling toString()");
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { // CurrencyDigits
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            digits = metainfo.currencyDigits("isoCode");
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (digits == null) {
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Unable to get CurrencyDigits.");
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (digits.toString() == null) {
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error calling toString()");
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyKeyword() {
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("th_TH@collation=traditional;currency=QQQ");
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency currency = Currency.getInstance(locale);
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = currency.getCurrencyCode();
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!"QQQ".equals(result)) {
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("got unexpected currency: " + result);
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAvailableCurrencyCodes() {
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] tests = {
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "1950-01-05" },
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "1969-12-31", "SUR" },
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "1991-12-26", "RUR" },
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "2000-12-23", "AMD" },
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "2000-12-23", "EUR", "ESP", "FRF", "ADP" },
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "1969-12-31", "ESP", "FRF", "ADP" },
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "1950-01-05", "ESP", "ADP" },
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "1900-01-17", "ESP" },
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_UA", "1994-12-25" },
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_QQ", "1969-12-31" },
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "2000-12-23", "AOA" },
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1995-12-25", "AOR", "AON" },
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1990-12-26", "AON", "AOK" },
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1979-12-29", "AOK" },
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1969-12-31" },
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_DE@currency=DEM", "2000-12-23", "EUR", "DEM" },
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo-DE-u-cu-dem", "2000-12-23", "EUR", "DEM" },
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "en_US", null, "USD", "USN" },
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "en_US_PREEURO", null, "USD", "USN" },
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "en_US_Q", null, "USD", "USN" },
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] test : tests) {
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale locale = new ULocale(test[0]);
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String timeString = test[1];
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date date;
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (timeString == null) {
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                date = new Date();
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                timeString = "today";
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    date = fmt.parse(timeString);
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Exception e) {
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fail("could not parse date: " + timeString);
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] expected = null;
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (test.length > 2) {
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expected = new String[test.length - 2];
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.arraycopy(test, 2, expected, 0, expected.length);
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] actual = Currency.getAvailableCurrencyCodes(locale, date);
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Order is not important as of 4.4.  We never documented that it was.
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Set<String> expectedSet = new HashSet<String>();
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (expected != null) {
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedSet.addAll(Arrays.asList(expected));
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Set<String> actualSet = new HashSet<String>();
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (actual != null) {
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                actualSet.addAll(Arrays.asList(actual));
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(locale + " on " + timeString, expectedSet, actualSet);
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // With Java Locale
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Note: skip this test on Java 6 or older when keywords are available
579578e467cc0b85f5a3f1b49bba673d654abb3dbd3roubert            if (locale.getKeywords() == null || TestUtil.getJavaVendor() == JavaVendor.Android || TestUtil.getJavaVersion() >= 7) {
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Locale javaloc = locale.toLocale();
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String[] actualWithJavaLocale = Currency.getAvailableCurrencyCodes(javaloc, date);
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // should be exactly same with the ULocale version
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean same = true;
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (actual == null) {
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (actualWithJavaLocale != null) {
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        same = false;
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (actualWithJavaLocale == null || actual.length != actualWithJavaLocale.length) {
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        same = false;
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        same = true;
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        for (int i = 0; i < actual.length; i++) {
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (!actual[i].equals(actualWithJavaLocale[i])) {
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                same = false;
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                break;
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertTrue("getAvailableCurrencyCodes with ULocale vs Locale", same);
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDeprecatedCurrencyFormat() {
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // bug 5952
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale locale = new Locale("sr", "QQ");
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols icuSymbols = new
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        com.ibm.icu.text.DecimalFormatSymbols(locale);
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String symbol = icuSymbols.getCurrencySymbol();
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency currency = icuSymbols.getCurrency();
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expectCur = null;
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expectSym = "\u00A4";
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!symbol.toString().equals(expectSym) || currency != null) {
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("for " + locale + " expected " + expectSym+"/"+expectCur + " but got " + symbol+"/"+currency);
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("for " + locale + " expected " + expectSym+"/"+expectCur + " and got " + symbol+"/"+currency);
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetKeywordValues(){
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String[][] PREFERRED = {
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"root",                 },
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"und",                  },
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"und_ZZ",          "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XDR", "XPD", "XPT", "XSU", "XTS", "XUA", "XXX"},
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en_US",           "USD", "USN"},
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en_029",               },
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en_TH",           "THB"},
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de",              "EUR"},
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de_DE",           "EUR"},
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de_ZZ",           "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XDR", "XPD", "XPT", "XSU", "XTS", "XUA", "XXX"},
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"ar",              "EGP"},
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"ar_PS",           "ILS", "JOD"},
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en@currency=CAD",     "USD", "USN"},
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"fr@currency=ZZZ",     "EUR"},
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de_DE@currency=DEM",  "EUR"},
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] ALL = Currency.getKeywordValuesForLocale("currency", ULocale.getDefault(), false);
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        HashSet ALLSET = new HashSet();
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < ALL.length; i++) {
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ALLSET.add(ALL[i]);
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < PREFERRED.length; i++) {
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(PREFERRED[i][0]);
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] expected = new String[PREFERRED[i].length - 1];
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.arraycopy(PREFERRED[i], 1, expected, 0, expected.length);
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] pref = Currency.getKeywordValuesForLocale("currency", loc, true);
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(loc.toString(), expected, pref);
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] all = Currency.getKeywordValuesForLocale("currency", loc, false);
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // The items in the two collections should match (ignore order,
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // behavior change from 4.3.3)
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Set<String> returnedSet = new HashSet<String>();
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            returnedSet.addAll(Arrays.asList(all));
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(loc.toString(), ALLSET, returnedSet);
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIsAvailable() {
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d1995 = new Date(788918400000L);   // 1995-01-01 00:00 GMT
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d2000 = new Date(946684800000L);   // 2000-01-01 00:00 GMT
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d2005 = new Date(1104537600000L);  // 2005-01-01 00:00 GMT
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD all time", Currency.isAvailable("USD", null, null));
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD before 1995", Currency.isAvailable("USD", null, d1995));
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD 1995-2005", Currency.isAvailable("USD", d1995, d2005));
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD after 2005", Currency.isAvailable("USD", d2005, null));
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD on 2005-01-01", Currency.isAvailable("USD", d2005, d2005));
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("usd all time", Currency.isAvailable("usd", null, null));
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM all time", Currency.isAvailable("DEM", null, null));
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM before 1995", Currency.isAvailable("DEM", null, d1995));
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM 1995-2000", Currency.isAvailable("DEM", d1995, d2000));
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM 1995-2005", Currency.isAvailable("DEM", d1995, d2005));
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("DEM after 2005", Currency.isAvailable("DEM", d2005, null));
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM on 2000-01-01", Currency.isAvailable("DEM", d2000, d2000));
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("DEM on 2005-01-01", Currency.isAvailable("DEM", d2005, d2005));
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("CHE all the time", Currency.isAvailable("CHE", null, null));
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("XXY unknown code", Currency.isAvailable("XXY", null, null));
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("USDOLLAR invalid code", Currency.isAvailable("USDOLLAR", null, null));
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // illegal argument combination
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency.isAvailable("USD", d2005, d1995);
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Expected IllegalArgumentException, because lower range is after upper range");
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException e) {
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("IllegalArgumentException, because lower range is after upper range");
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for getAvailableCurrencies()
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetAvailableCurrencies() {
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Set<Currency> avail1 = Currency.getAvailableCurrencies();
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // returned set must be modifiable - add one more currency
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        avail1.add(Currency.getInstance("ZZZ"));    // ZZZ is not defined by ISO 4217
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Set<Currency> avail2 = Currency.getAvailableCurrencies();
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("avail1 does not contain all currencies in avail2", avail1.containsAll(avail2));
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("avail1 must have one more currency", (avail1.size() - avail2.size() == 1));
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for getNumericCode()
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetNumericCode() {
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Object[][] NUMCODE_TESTDATA = {
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"USD", 840},
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"Usd", 840},   /* mixed casing */
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"EUR", 978},
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"JPY", 392},
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"XFU", 0},     /* XFU: no numeric code */
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"ZZZ", 0},     /* ZZZ: undefined ISO currency code */
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] data : NUMCODE_TESTDATA) {
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency cur = Currency.getInstance((String)data[0]);
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int numCode = cur.getNumericCode();
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int expected = ((Integer)data[1]).intValue();
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (numCode != expected) {
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: getNumericCode returned " + numCode + " for "
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + cur.getCurrencyCode() + " - expected: " + expected);
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for getDisplayName()
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetDisplayName() {
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String[][] DISPNAME_TESTDATA = {
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"USD", "US Dollar"},
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"EUR", "Euro"},
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"JPY", "Japanese Yen"},
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale defLocale = Locale.getDefault();
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale jaJP = new Locale("ja", "JP");
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale root = new Locale("");
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] data : DISPNAME_TESTDATA) {
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency cur = Currency.getInstance(data[0]);
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("getDisplayName() for " + data[0], data[1], cur.getDisplayName());
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("getDisplayName() for " + data[0] + " in locale " + defLocale, data[1], cur.getDisplayName(defLocale));
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // ICU has localized display name for ja
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertNotEquals("getDisplayName() for " + data[0] + " in locale " + jaJP, data[1], cur.getDisplayName(jaJP));
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // root locale does not have any localized display names,
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // so the currency code itself should be returned
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("getDisplayName() for " + data[0] + " in locale " + root, data[0], cur.getDisplayName(root));
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyInfoCtor() {
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new CurrencyMetaInfo.CurrencyInfo("region", "code", 0, 0, 1);
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
768