12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **********************************************************************
587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * Copyright (c) 2002-2016, International Business Machines
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Corporation and others.  All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **********************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Author: Alan Liu
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Created: December 18 2002
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Since: ICU 2.4
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **********************************************************************
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.util;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Arrays;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashSet;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil;
27578e467cc0b85f5a3f1b49bba673d654abb3dbd3roubertimport com.ibm.icu.dev.test.TestUtil.JavaVendor;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.CurrencyData;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyDisplayNames;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyMetaInfo;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyMetaInfo.CurrencyFilter;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyMetaInfo.CurrencyInfo;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SimpleDateFormat;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.GregorianCalendar;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @test
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @summary General test of Currency
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CurrencyTest extends TestFmwk {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test of basic API.
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
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     */
1002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRegistration() {
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Currency jpy = Currency.getInstance("JPY");
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Currency usd = Currency.getInstance(Locale.US);
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    try {
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      Currency.unregister(null); // should fail, coverage
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      errln("expected unregister of null to throw exception");
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    catch (Exception e) {
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("PASS: unregister of null failed as expected");
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    if (Currency.unregister("")) { // coverage
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      errln("unregister before register erroneously succeeded");
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale fu_FU = new ULocale("fu_FU");
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object key1 = Currency.registerInstance(jpy, ULocale.US);
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object key2 = Currency.registerInstance(jpy, fu_FU);
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency nus = Currency.getInstance(Locale.US);
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nus.equals(jpy)) {
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected " + jpy + " but got: " + nus);
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // converage, make sure default factory works
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency nus1 = Currency.getInstance(Locale.JAPAN);
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nus1.equals(jpy)) {
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected " + jpy + " but got: " + nus1);
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale[] locales = Currency.getAvailableULocales();
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean found = false;
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; ++i) {
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locales[i].equals(fu_FU)) {
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                found = true;
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!found) {
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("did not find locale" + fu_FU + " in currency locales");
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!Currency.unregister(key1)) {
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unable to unregister currency using key1");
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!Currency.unregister(key2)) {
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unable to unregister currency using key2");
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency nus2 = Currency.getInstance(Locale.US);
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nus2.equals(usd)) {
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expected " + usd + " but got: " + nus2);
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        locales = Currency.getAvailableULocales();
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        found = false;
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; ++i) {
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locales[i].equals(fu_FU)) {
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                found = true;
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (found) {
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("found locale" + fu_FU + " in currency locales after unregister");
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] locs = Currency.getAvailableLocales();
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        found = false;
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locs.length; ++i) {
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locs[i].equals(fu_FU)) {
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                found = true;
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (found) {
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("found locale" + fu_FU + " in currency locales after unregister");
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test names.
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNames() {
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Do a basic check of getName()
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // USD { "US$", "US Dollar"            } // 04/04/1792-
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale en = ULocale.ENGLISH;
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean[] isChoiceFormat = new boolean[1];
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency usd = Currency.getInstance("USD");
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // THE LOCALE DATA before diving into the code.
1942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("USD.getName(SYMBOL_NAME)",
1952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "$",
1962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
1972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("USD.getName(LONG_NAME)",
1982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "US Dollar",
1992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                usd.getName(en, Currency.LONG_NAME, isChoiceFormat));
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO add more tests later
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testGetName_Locale_Int_String_BooleanArray() {
2052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Currency currency = Currency.getInstance(ULocale.CHINA);
2062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        boolean[] isChoiceFormat = new boolean[1];
2072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        int nameStyle = Currency.LONG_NAME;
2082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String pluralCount = "";
2092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String ulocaleName =
2102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                currency.getName(ULocale.CANADA, nameStyle, pluralCount, isChoiceFormat);
2112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("currency name mismatch", "Chinese Yuan", ulocaleName);
2122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String localeName = currency.getName(Locale.CANADA, nameStyle, pluralCount, isChoiceFormat);
2132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("currency name mismatch", ulocaleName, localeName);
2142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
2152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCoverage() {
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency usd = Currency.getInstance("USD");
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("USD.getSymbol()",
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "$",
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                usd.getSymbol());
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // A real test of the CurrencyDisplayNames class.
2252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyDisplayNames() {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!CurrencyDisplayNames.hasData()) {
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("hasData() should return true.");
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // with substitute
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyDisplayNames cdn = CurrencyDisplayNames.getInstance(ULocale.GERMANY);
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_name", "US-Dollar", cdn.getName("USD"));
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_symbol", "$", cdn.getSymbol("USD"));
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_plural_other", "US-Dollar", cdn.getPluralName("USD", "other"));
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // unknown plural category, substitute "other"
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_plural_foo", "US-Dollar", cdn.getPluralName("USD", "foo"));
2382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.forLanguageTag("en-US"));
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_name", "US Dollar", cdn.getName("USD"));
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_symbol", "$", cdn.getSymbol("USD"));
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_plural_one", "US dollar", cdn.getPluralName("USD", "one"));
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_USD_plural_other", "US dollars", cdn.getPluralName("USD", "other"));
2442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_FOO_name", "FOO", cdn.getName("FOO"));
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_FOO_symbol", "FOO", cdn.getSymbol("FOO"));
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US_FOO_plural_other", "FOO", cdn.getPluralName("FOO", "other"));
2482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("en-US bundle", "en", cdn.getULocale().toString());
2502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.forLanguageTag("zz-Gggg-YY"));
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("bundle from current locale", "en", cdn.getULocale().toString());
2532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // with no substitute
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.GERMANY, true);
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have currency data for Germany", cdn);
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // known currency, behavior unchanged
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_name", "US-Dollar", cdn.getName("USD"));
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_symbol", "$", cdn.getSymbol("USD"));
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_plural_other", "US-Dollar", cdn.getPluralName("USD", "other"));
2622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // known currency but unknown plural category
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_USD_plural_foo", cdn.getPluralName("USD", "foo"));
2652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // unknown currency, get null
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_name", cdn.getName("FOO"));
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_symbol", cdn.getSymbol("FOO"));
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_plural_other", cdn.getPluralName("FOO", "other"));
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_plural_foo", cdn.getPluralName("FOO", "foo"));
2712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // unknown locale with no substitute
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(ULocale.forLanguageTag("zz-Gggg-YY"), true);
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String ln = "";
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (cdn != null) {
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ln = " (" + cdn.getULocale().toString() + ")";
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("no fallback from unknown locale" + ln , cdn);
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Locale version
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdn = CurrencyDisplayNames.getInstance(Locale.GERMANY, true);
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have currency data for Germany (Java Locale)", cdn);
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("de_USD_name (Locale)", "US-Dollar", cdn.getName("USD"));
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNull("de_FOO_name (Locale)", cdn.getName("FOO"));
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Coverage-only test of CurrencyData
2882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyData() {
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyData.DefaultInfo info_fallback = (CurrencyData.DefaultInfo)CurrencyData.DefaultInfo.getWithFallback(true);
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_fallback == null) {
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("getWithFallback() returned null.");
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyData.DefaultInfo info_nofallback = (CurrencyData.DefaultInfo)CurrencyData.DefaultInfo.getWithFallback(false);
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_nofallback == null) {
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("getWithFallback() returned null.");
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getName("isoCode").equals("isoCode") || info_nofallback.getName("isoCode") != null) {
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getName().");
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getPluralName("isoCode", "type").equals("isoCode") || info_nofallback.getPluralName("isoCode", "type") != null) {
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getPluralName().");
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getSymbol("isoCode").equals("isoCode") || info_nofallback.getSymbol("isoCode") != null) {
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getSymbol().");
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.symbolMap().isEmpty()) {
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("symbolMap() should return empty map.");
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.nameMap().isEmpty()) {
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("nameMap() should return empty map.");
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getUnitPatterns().isEmpty() || info_nofallback.getUnitPatterns() != null) {
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getUnitPatterns().");
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!info_fallback.getSpacingInfo().equals((CurrencyData.CurrencySpacingInfo.DEFAULT)) ||
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                info_nofallback.getSpacingInfo() != null) {
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getSpacingInfo().");
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_fallback.getULocale() != ULocale.ROOT) {
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getLocale().");
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (info_fallback.getFormatInfo("isoCode") != null) {
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error calling getFormatInfo().");
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // A real test of CurrencyMetaInfo.
3502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyMetaInfoRanges() {
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance(true);
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have metainfo", metainfo);
3542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyFilter filter = CurrencyFilter.onRegion("DE"); // must be capitalized
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<CurrencyInfo> currenciesInGermany = metainfo.currencyInfo(filter);
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("currencies: " + currenciesInGermany.size());
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date demLastDate = new Date(Long.MAX_VALUE);
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date eurFirstDate = new Date(Long.MIN_VALUE);
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (CurrencyInfo info : currenciesInGermany) {
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(info.toString());
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("from: " + fmt.format(info.from)+ Long.toHexString(info.from));
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("  to: " + fmt.format(info.to) + Long.toHexString(info.to));
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info.code.equals("DEM")) {
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                demLastDate = new Date(info.to);
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (info.code.equals("EUR")) {
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                eurFirstDate = new Date(info.from);
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the Euro and Deutschmark overlapped for several years
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM available at last date", 2, metainfo.currencyInfo(filter.withDate(demLastDate)).size());
3752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // demLastDate + 1 millisecond is not the start of the last day, we consider it the next day, so...
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date demLastDatePlus1ms = new Date(demLastDate.getTime() + 1);
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM not available after very start of last date", 1, metainfo.currencyInfo(filter.withDate(demLastDatePlus1ms)).size());
3792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // both available for start of euro
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR available on start of first date", 2, metainfo.currencyInfo(filter.withDate(eurFirstDate)).size());
3822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // but not one millisecond before the start of the first day
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date eurFirstDateMinus1ms = new Date(eurFirstDate.getTime() - 1);
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR not avilable before very start of first date", 1, metainfo.currencyInfo(filter.withDate(eurFirstDateMinus1ms)).size());
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // end time is last millisecond of day
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GregorianCalendar cal = new GregorianCalendar();
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTimeZone(TimeZone.getTimeZone("GMT"));
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTime(demLastDate);
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("hour is 23", 23, cal.get(GregorianCalendar.HOUR_OF_DAY));
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("minute is 59", 59, cal.get(GregorianCalendar.MINUTE));
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("second is 59", 59, cal.get(GregorianCalendar.SECOND));
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("millisecond is 999", 999, cal.get(GregorianCalendar.MILLISECOND));
3952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // start time is first millisecond of day
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTime(eurFirstDate);
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("hour is 0", 0, cal.get(GregorianCalendar.HOUR_OF_DAY));
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("minute is 0", 0, cal.get(GregorianCalendar.MINUTE));
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("second is 0", 0, cal.get(GregorianCalendar.SECOND));
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("millisecond is 0", 0, cal.get(GregorianCalendar.MILLISECOND));
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyMetaInfoRangesWithLongs() {
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance(true);
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotNull("have metainfo", metainfo);
4082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyFilter filter = CurrencyFilter.onRegion("DE"); // must be capitalized
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<CurrencyInfo> currenciesInGermany = metainfo.currencyInfo(filter);
4112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        CurrencyFilter filter_br = CurrencyFilter.onRegion("BR"); // must be capitalized
4122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        List<CurrencyInfo> currenciesInBrazil = metainfo.currencyInfo(filter_br);
4132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        logln("currencies Germany: " + currenciesInGermany.size());
4142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        logln("currencies Brazil: " + currenciesInBrazil.size());
4152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        long demFirstDate = Long.MIN_VALUE;
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long demLastDate = Long.MAX_VALUE;
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long eurFirstDate = Long.MIN_VALUE;
4182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        CurrencyInfo demInfo = null;
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (CurrencyInfo info : currenciesInGermany) {
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(info.toString());
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info.code.equals("DEM")) {
4222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                demInfo = info;
4232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                demFirstDate = info.from;
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                demLastDate = info.to;
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (info.code.equals("EUR")) {
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                eurFirstDate = info.from;
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the Euro and Deutschmark overlapped for several years
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM available at last date", 2, metainfo.currencyInfo(filter.withDate(demLastDate)).size());
4312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // demLastDate + 1 millisecond is not the start of the last day, we consider it the next day, so...
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long demLastDatePlus1ms = demLastDate + 1;
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("DEM not available after very start of last date", 1, metainfo.currencyInfo(filter.withDate(demLastDatePlus1ms)).size());
4352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // both available for start of euro
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("EUR available on start of first date", 2, metainfo.currencyInfo(filter.withDate(eurFirstDate)).size());
4382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // but not one millisecond before the start of the first day
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long eurFirstDateMinus1ms = eurFirstDate - 1;
4412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("EUR not avilable before very start of first date", 1,
4422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                     metainfo.currencyInfo(filter.withDate(eurFirstDateMinus1ms)).size());
4432d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // Deutschmark available from first millisecond on
4452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Millisecond of DEM Big Bang", 1,
4462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                     metainfo.currencyInfo(CurrencyFilter.onDate(demFirstDate).withRegion("DE")).size());
4472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("From Deutschmark to Euro", 2,
4492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                     metainfo.currencyInfo(CurrencyFilter.onDateRange(demFirstDate, eurFirstDate).withRegion("DE")).size());
4502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("all Tender for Brazil", 7,
4522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                metainfo.currencyInfo(CurrencyFilter.onTender().withRegion("BR")).size());
4532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue("No legal tender", demInfo.isTender());
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestWithTender() {
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance();
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (metainfo == null) {
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unable to get CurrencyMetaInfo instance.");
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyFilter filter =
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CurrencyMetaInfo.CurrencyFilter.onRegion("CH");
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<String> currencies = metainfo.currencies(filter);
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("More than one currency for switzerland", currencies.size() > 1);
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "With tender",
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Arrays.asList(new String[] {"CHF", "CHE", "CHW"}),
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                metainfo.currencies(filter.withTender()));
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Coverage-only test of the CurrencyMetaInfo class
4752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyMetaInfo() {
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo metainfo = CurrencyMetaInfo.getInstance();
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (metainfo == null) {
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unable to get CurrencyMetaInfo instance.");
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!CurrencyMetaInfo.hasData()) {
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("hasData() should note return false.");
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyFilter filter;
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyInfo info;
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyMetaInfo.CurrencyDigits digits;
4912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { // CurrencyFilter
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            filter = CurrencyMetaInfo.CurrencyFilter.onCurrency("currency");
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyMetaInfo.CurrencyFilter filter2 = CurrencyMetaInfo.CurrencyFilter.onCurrency("test");
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter == null) {
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Unable to create CurrencyFilter.");
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.equals(new Object())) {
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("filter should not equal to Object");
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.equals(filter2)) {
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("filter should not equal filter2");
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.hashCode() == 0) {
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting filter hashcode");
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (filter.toString() == null) {
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error calling toString()");
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { // CurrencyInfo
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            info = new CurrencyMetaInfo.CurrencyInfo("region", "code", 0, 1, 1, false);
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info == null) {
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error creating CurrencyInfo.");
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (info.toString() == null) {
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error calling toString()");
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { // CurrencyDigits
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            digits = metainfo.currencyDigits("isoCode");
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (digits == null) {
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Unable to get CurrencyDigits.");
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (digits.toString() == null) {
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error calling toString()");
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyKeyword() {
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("th_TH@collation=traditional;currency=QQQ");
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency currency = Currency.getInstance(locale);
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = currency.getCurrencyCode();
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!"QQQ".equals(result)) {
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("got unexpected currency: " + result);
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAvailableCurrencyCodes() {
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] tests = {
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "1950-01-05" },
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "1969-12-31", "SUR" },
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "1991-12-26", "RUR" },
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AM", "2000-12-23", "AMD" },
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "2000-12-23", "EUR", "ESP", "FRF", "ADP" },
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "1969-12-31", "ESP", "FRF", "ADP" },
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "1950-01-05", "ESP", "ADP" },
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AD", "1900-01-17", "ESP" },
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_UA", "1994-12-25" },
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_QQ", "1969-12-31" },
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "2000-12-23", "AOA" },
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1995-12-25", "AOR", "AON" },
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1990-12-26", "AON", "AOK" },
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1979-12-29", "AOK" },
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_AO", "1969-12-31" },
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo_DE@currency=DEM", "2000-12-23", "EUR", "DEM" },
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "eo-DE-u-cu-dem", "2000-12-23", "EUR", "DEM" },
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "en_US", null, "USD", "USN" },
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "en_US_PREEURO", null, "USD", "USN" },
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { "en_US_Q", null, "USD", "USN" },
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] test : tests) {
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale locale = new ULocale(test[0]);
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String timeString = test[1];
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date date;
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (timeString == null) {
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                date = new Date();
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                timeString = "today";
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    date = fmt.parse(timeString);
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Exception e) {
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fail("could not parse date: " + timeString);
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] expected = null;
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (test.length > 2) {
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expected = new String[test.length - 2];
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.arraycopy(test, 2, expected, 0, expected.length);
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] actual = Currency.getAvailableCurrencyCodes(locale, date);
6052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Order is not important as of 4.4.  We never documented that it was.
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Set<String> expectedSet = new HashSet<String>();
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (expected != null) {
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedSet.addAll(Arrays.asList(expected));
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Set<String> actualSet = new HashSet<String>();
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (actual != null) {
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                actualSet.addAll(Arrays.asList(actual));
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(locale + " on " + timeString, expectedSet, actualSet);
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // With Java Locale
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Note: skip this test on Java 6 or older when keywords are available
619578e467cc0b85f5a3f1b49bba673d654abb3dbd3roubert            if (locale.getKeywords() == null || TestUtil.getJavaVendor() == JavaVendor.Android || TestUtil.getJavaVersion() >= 7) {
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Locale javaloc = locale.toLocale();
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String[] actualWithJavaLocale = Currency.getAvailableCurrencyCodes(javaloc, date);
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // should be exactly same with the ULocale version
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean same = true;
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (actual == null) {
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (actualWithJavaLocale != null) {
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        same = false;
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (actualWithJavaLocale == null || actual.length != actualWithJavaLocale.length) {
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        same = false;
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        same = true;
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        for (int i = 0; i < actual.length; i++) {
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (!actual[i].equals(actualWithJavaLocale[i])) {
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                same = false;
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                break;
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertTrue("getAvailableCurrencyCodes with ULocale vs Locale", same);
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDeprecatedCurrencyFormat() {
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // bug 5952
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale locale = new Locale("sr", "QQ");
6502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DecimalFormatSymbols icuSymbols = new
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        com.ibm.icu.text.DecimalFormatSymbols(locale);
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String symbol = icuSymbols.getCurrencySymbol();
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency currency = icuSymbols.getCurrency();
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expectCur = null;
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expectSym = "\u00A4";
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!symbol.toString().equals(expectSym) || currency != null) {
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("for " + locale + " expected " + expectSym+"/"+expectCur + " but got " + symbol+"/"+currency);
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("for " + locale + " expected " + expectSym+"/"+expectCur + " and got " + symbol+"/"+currency);
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
6632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetKeywordValues(){
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String[][] PREFERRED = {
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"root",                 },
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"und",                  },
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"und_ZZ",          "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XDR", "XPD", "XPT", "XSU", "XTS", "XUA", "XXX"},
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en_US",           "USD", "USN"},
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en_029",               },
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en_TH",           "THB"},
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de",              "EUR"},
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de_DE",           "EUR"},
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de_ZZ",           "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XDR", "XPD", "XPT", "XSU", "XTS", "XUA", "XXX"},
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"ar",              "EGP"},
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"ar_PS",           "ILS", "JOD"},
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"en@currency=CAD",     "USD", "USN"},
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"fr@currency=ZZZ",     "EUR"},
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"de_DE@currency=DEM",  "EUR"},
68187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            {"en_US@rg=THZZZZ",     "THB"},
68287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            {"de@rg=USZZZZ",        "USD", "USN"},
68387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            {"en_US@currency=CAD;rg=THZZZZ",  "THB"},
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] ALL = Currency.getKeywordValuesForLocale("currency", ULocale.getDefault(), false);
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        HashSet ALLSET = new HashSet();
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < ALL.length; i++) {
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ALLSET.add(ALL[i]);
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < PREFERRED.length; i++) {
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(PREFERRED[i][0]);
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] expected = new String[PREFERRED[i].length - 1];
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.arraycopy(PREFERRED[i], 1, expected, 0, expected.length);
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] pref = Currency.getKeywordValuesForLocale("currency", loc, true);
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(loc.toString(), expected, pref);
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] all = Currency.getKeywordValuesForLocale("currency", loc, false);
7002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            // The items in the two collections should match (ignore order,
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // behavior change from 4.3.3)
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Set<String> returnedSet = new HashSet<String>();
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            returnedSet.addAll(Arrays.asList(all));
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(loc.toString(), ALLSET, returnedSet);
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIsAvailable() {
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d1995 = new Date(788918400000L);   // 1995-01-01 00:00 GMT
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d2000 = new Date(946684800000L);   // 2000-01-01 00:00 GMT
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d2005 = new Date(1104537600000L);  // 2005-01-01 00:00 GMT
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD all time", Currency.isAvailable("USD", null, null));
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD before 1995", Currency.isAvailable("USD", null, d1995));
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD 1995-2005", Currency.isAvailable("USD", d1995, d2005));
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD after 2005", Currency.isAvailable("USD", d2005, null));
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("USD on 2005-01-01", Currency.isAvailable("USD", d2005, d2005));
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("usd all time", Currency.isAvailable("usd", null, null));
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM all time", Currency.isAvailable("DEM", null, null));
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM before 1995", Currency.isAvailable("DEM", null, d1995));
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM 1995-2000", Currency.isAvailable("DEM", d1995, d2000));
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM 1995-2005", Currency.isAvailable("DEM", d1995, d2005));
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("DEM after 2005", Currency.isAvailable("DEM", d2005, null));
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("DEM on 2000-01-01", Currency.isAvailable("DEM", d2000, d2000));
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("DEM on 2005-01-01", Currency.isAvailable("DEM", d2005, d2005));
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("CHE all the time", Currency.isAvailable("CHE", null, null));
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("XXY unknown code", Currency.isAvailable("XXY", null, null));
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("USDOLLAR invalid code", Currency.isAvailable("USDOLLAR", null, null));
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // illegal argument combination
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency.isAvailable("USD", d2005, d1995);
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Expected IllegalArgumentException, because lower range is after upper range");
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException e) {
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("IllegalArgumentException, because lower range is after upper range");
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for getAvailableCurrencies()
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetAvailableCurrencies() {
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Set<Currency> avail1 = Currency.getAvailableCurrencies();
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // returned set must be modifiable - add one more currency
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        avail1.add(Currency.getInstance("ZZZ"));    // ZZZ is not defined by ISO 4217
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Set<Currency> avail2 = Currency.getAvailableCurrencies();
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("avail1 does not contain all currencies in avail2", avail1.containsAll(avail2));
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("avail1 must have one more currency", (avail1.size() - avail2.size() == 1));
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for getNumericCode()
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetNumericCode() {
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Object[][] NUMCODE_TESTDATA = {
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"USD", 840},
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"Usd", 840},   /* mixed casing */
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"EUR", 978},
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"JPY", 392},
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"XFU", 0},     /* XFU: no numeric code */
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"ZZZ", 0},     /* ZZZ: undefined ISO currency code */
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] data : NUMCODE_TESTDATA) {
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency cur = Currency.getInstance((String)data[0]);
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int numCode = cur.getNumericCode();
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int expected = ((Integer)data[1]).intValue();
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (numCode != expected) {
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: getNumericCode returned " + numCode + " for "
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + cur.getCurrencyCode() + " - expected: " + expected);
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for getDisplayName()
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetDisplayName() {
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String[][] DISPNAME_TESTDATA = {
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"USD", "US Dollar"},
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"EUR", "Euro"},
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"JPY", "Japanese Yen"},
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale defLocale = Locale.getDefault();
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale jaJP = new Locale("ja", "JP");
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale root = new Locale("");
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] data : DISPNAME_TESTDATA) {
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency cur = Currency.getInstance(data[0]);
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("getDisplayName() for " + data[0], data[1], cur.getDisplayName());
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("getDisplayName() for " + data[0] + " in locale " + defLocale, data[1], cur.getDisplayName(defLocale));
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // ICU has localized display name for ja
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertNotEquals("getDisplayName() for " + data[0] + " in locale " + jaJP, data[1], cur.getDisplayName(jaJP));
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // root locale does not have any localized display names,
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // so the currency code itself should be returned
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("getDisplayName() for " + data[0] + " in locale " + root, data[0], cur.getDisplayName(root));
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyInfoCtor() {
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new CurrencyMetaInfo.CurrencyInfo("region", "code", 0, 0, 1);
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    /**
8192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Class CurrencyMetaInfo has methods which are overwritten by its derived classes.
8202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * A derived class is defined here for the purpose of testing these methods.
8212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Since the creator of CurrencyMetaInfo is defined as 'protected', no instance of
8222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * this class can be created directly.
8232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
8242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public class TestCurrencyMetaInfo extends CurrencyMetaInfo {
8252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
8262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    final TestCurrencyMetaInfo tcurrMetaInfo = new TestCurrencyMetaInfo();
8282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    /*
8302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *
8312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Test methods of base class CurrencyMetaInfo. ICU4J only creates subclasses,
8322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * never an instance of the base class.
8332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
8342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestCurrMetaInfoBaseClass() {
8362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        CurrencyFilter usFilter = CurrencyFilter.onRegion("US");
8372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Empty list expected", 0, tcurrMetaInfo.currencyInfo(usFilter).size());
8392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Empty list expected", 0, tcurrMetaInfo.currencies(usFilter).size());
8402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Empty list expected", 0, tcurrMetaInfo.regions(usFilter).size());
8412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Iso format for digits expected",
8432d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                     "CurrencyDigits(fractionDigits='2',roundingIncrement='0')",
8442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                     tcurrMetaInfo.currencyDigits("isoCode").toString());
8452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
8462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    /**
8482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Test cases for rounding and fractions.
8492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
8502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testGetDefaultFractionDigits_CurrencyUsage() {
8522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Currency currency = Currency.getInstance(ULocale.CHINA);
8532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        int cashFractionDigits = currency.getDefaultFractionDigits(Currency.CurrencyUsage.CASH);
8542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("number of digits in fraction incorrect", 2, cashFractionDigits);
8552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
8562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testGetRoundingIncrement() {
8592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Currency currency = Currency.getInstance(ULocale.JAPAN);
8602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // It appears as though this always returns 0 irrespective of the currency.
8612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        double roundingIncrement = currency.getRoundingIncrement();
8622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Rounding increment not zero", 0.0, roundingIncrement, 0.0);
8632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
8642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testGetRoundingIncrement_CurrencyUsage() {
8662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Currency currency = Currency.getInstance(ULocale.JAPAN);
8672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // It appears as though this always returns 0 irrespective of the currency or usage.
8682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        double roundingIncrement = currency.getRoundingIncrement(Currency.CurrencyUsage.CASH);
8692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // TODO: replace the JUnit import with TestFmwk assertEquals.
8702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Rounding increment not zero", 0.0, roundingIncrement, 0.0);
8712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
8722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
8732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestCurrencyDataCtor() throws Exception {
8752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        checkDefaultPrivateConstructor(CurrencyData.class);
8762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
878