12b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes/*
22b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * Copyright (C) 2010 The Android Open Source Project
3f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
42b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * you may not use this file except in compliance with the License.
62b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * You may obtain a copy of the License at
7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
82b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
102b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * Unless required by applicable law or agreed to in writing, software
112b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * See the License for the specific language governing permissions and
142b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes * limitations under the License.
152b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes */
162b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes
174557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.util;
182b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes
194557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.Currency;
204557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.Locale;
210ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughesimport java.util.Set;
222b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes
232096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmeraimport libcore.util.SerializationTester;
242096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera
252b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughespublic class CurrencyTest extends junit.framework.TestCase {
262b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    // Regression test to ensure that Currency.getSymbol(Locale) returns the
272b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    // currency code if ICU doesn't have a localization of the symbol. The
282b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    // harmony Currency tests don't test this, and their DecimalFormat tests
292b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    // only test it as a side-effect, and in a way that only detected my
302b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    // specific mistake of returning null (returning "stinky" would have
312b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    // passed).
322b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    public void test_getSymbol_fallback() throws Exception {
332b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes        // This assumes that AED never becomes a currency important enough to
342b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes        // Canada that Canadians give it a localized (to Canada) symbol.
352b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes        assertEquals("AED", Currency.getInstance("AED").getSymbol(Locale.CANADA));
362b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes    }
37b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes
38b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes    // Regression test to ensure that Currency.getInstance(String) throws if
39b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes    // given an invalid ISO currency code.
40b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes    public void test_getInstance_illegal_currency_code() throws Exception {
41b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes        Currency.getInstance("USD");
42b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes        try {
43b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes            Currency.getInstance("BOGO-DOLLARS");
44b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes            fail("expected IllegalArgumentException for invalid ISO currency code");
45b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes        } catch (IllegalArgumentException expected) {
46b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes        }
47b0e5963793d8980b349f8e553067c19fd31601c5Elliott Hughes    }
480ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes
490ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes    public void testGetAvailableCurrencies() throws Exception {
500ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        Set<Currency> all = Currency.getAvailableCurrencies();
510ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        // Confirm that a few well-known stable currencies are present.
520ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertTrue(all.toString(), all.contains(Currency.getInstance("CHF")));
530ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertTrue(all.toString(), all.contains(Currency.getInstance("EUR")));
540ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertTrue(all.toString(), all.contains(Currency.getInstance("GBP")));
550ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertTrue(all.toString(), all.contains(Currency.getInstance("JPY")));
560ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertTrue(all.toString(), all.contains(Currency.getInstance("USD")));
570ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes    }
580ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes
590ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes    public void test_getDisplayName() throws Exception {
600ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertEquals("Swiss Franc", Currency.getInstance("CHF").getDisplayName(Locale.US));
610ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertEquals("Schweizer Franken", Currency.getInstance("CHF").getDisplayName(new Locale("de", "CH")));
620ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertEquals("franc suisse", Currency.getInstance("CHF").getDisplayName(new Locale("fr", "CH")));
63e6c88a51723b481276d21efcbcffe8f509488441Fredrik Roubert        assertEquals("franco svizzero", Currency.getInstance("CHF").getDisplayName(new Locale("it", "CH")));
640ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes    }
650ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes
660ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes    public void test_getDefaultFractionDigits() throws Exception {
670ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertEquals(2, Currency.getInstance("USD").getDefaultFractionDigits());
680ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertEquals(0, Currency.getInstance("JPY").getDefaultFractionDigits());
690ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes        assertEquals(-1, Currency.getInstance("XXX").getDefaultFractionDigits());
700ad1c14261c4db0731503770ec6a027e90cc6e38Elliott Hughes    }
71a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes
72a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes    // http://code.google.com/p/android/issues/detail?id=38622
73a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes    public void test_getSymbol_38622() throws Exception {
74a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        // The CLDR data had the Portuguese symbol for "EUR" in pt, not in pt_PT.
75a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        // We weren't falling back from pt_PT to pt, so we didn't find it and would
76a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        // default to U+00A4 CURRENCY SIGN (¤) rather than €.
77a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        Locale pt_BR = new Locale("pt", "BR");
78a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        Locale pt_PT = new Locale("pt", "PT");
79a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        assertEquals("R$", Currency.getInstance(pt_BR).getSymbol(pt_BR));
803a878149e82d9d42353084f4958224ac12c5aa41Elliott Hughes        assertEquals("R$", Currency.getInstance(pt_BR).getSymbol(pt_PT));
81a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        assertEquals("€", Currency.getInstance(pt_PT).getSymbol(pt_BR));
82a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes        assertEquals("€", Currency.getInstance(pt_PT).getSymbol(pt_PT));
83a49a1e8c20b3cf9435ed422379f63e33e5c2eaf2Elliott Hughes    }
84148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath
85148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath    public void test_nullLocales() {
86148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath        Currency currency = Currency.getInstance(Locale.getDefault());
87148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath        try {
88148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath            currency.getSymbol(null);
89148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath            fail();
90148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath        } catch (NullPointerException expected) {}
91148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath    }
922096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera
932096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera    public void testSerialization() throws Exception {
942096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        Currency usd = Currency.getInstance("USD");
952096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        String actual = SerializationTester.serializeHex(usd);
962096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        String expected = "aced0005737200126a6176612e7574696c2e43757272656e6379fdcd934a5911a91f02" +
972096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera                "00014c000c63757272656e6379436f64657400124c6a6176612f6c616e672f537472696e673b7870" +
982096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera                "740003555344";
992096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        assertEquals(expected, actual);
1002096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera
1012096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        Currency deserializedUsd = (Currency) SerializationTester.deserializeHex(expected);
1022096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        assertSame("Currency objects should be singletons", usd, deserializedUsd);
1032096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera    }
1042096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera
1052096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera    public void test_getNumericCode() throws Exception {
1062096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        assertEquals(840, Currency.getInstance("USD").getNumericCode());
1072096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        assertEquals(826, Currency.getInstance("GBP").getNumericCode());
1082096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        assertEquals(999, Currency.getInstance("XXX").getNumericCode());
1092096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera        assertEquals(0, Currency.getInstance("XFU").getNumericCode());
1102096edb2cb1c19d0e7ec597e60757dc183382a54Shubham Ajmera    }
1112b1f1d31b83dbabc432a928bd30d443e01b16b46Elliott Hughes}
112