2 **********************************************************************
\r
3 * Copyright (c) 2002-2009, International Business Machines
\r
4 * Corporation and others. All Rights Reserved.
\r
5 **********************************************************************
\r
7 * Created: December 18 2002
\r
9 **********************************************************************
\r
12 package com.ibm.icu.dev.test.util;
\r
14 import java.text.DateFormat;
\r
15 import java.text.SimpleDateFormat;
\r
16 import java.util.Arrays;
\r
17 import java.util.Date;
\r
18 import java.util.HashSet;
\r
19 import java.util.Locale;
\r
20 import java.util.Set;
\r
22 import com.ibm.icu.dev.test.TestFmwk;
\r
23 import com.ibm.icu.text.DecimalFormatSymbols;
\r
24 import com.ibm.icu.util.Currency;
\r
25 import com.ibm.icu.util.ULocale;
\r
29 * @summary General test of Currency
\r
31 public class CurrencyTest extends TestFmwk {
\r
33 public static void main(String[] args) throws Exception {
\r
34 new CurrencyTest().run(args);
\r
38 * Test of basic API.
\r
40 public void TestAPI() {
\r
41 Currency usd = Currency.getInstance("USD");
\r
42 /*int hash = */usd.hashCode();
\r
43 Currency jpy = Currency.getInstance("JPY");
\r
44 if (usd.equals(jpy)) {
\r
45 errln("FAIL: USD == JPY");
\r
47 if (usd.equals("abc")) {
\r
48 errln("FAIL: USD == (String)");
\r
50 if (usd.equals(null)) {
\r
51 errln("FAIL: USD == (null)");
\r
53 if (!usd.equals(usd)) {
\r
54 errln("FAIL: USD != USD");
\r
58 Currency nullCurrency = Currency.getInstance((String)null);
\r
59 errln("FAIL: Expected getInstance(null) to throw "
\r
60 + "a NullPointerException, but returned " + nullCurrency);
\r
61 } catch (NullPointerException npe) {
\r
62 logln("PASS: getInstance(null) threw a NullPointerException");
\r
66 Currency bogusCurrency = Currency.getInstance("BOGUS");
\r
67 errln("FAIL: Expected getInstance(\"BOGUS\") to throw "
\r
68 + "an IllegalArgumentException, but returned " + bogusCurrency);
\r
69 } catch (IllegalArgumentException iae) {
\r
70 logln("PASS: getInstance(\"BOGUS\") threw an IllegalArgumentException");
\r
73 Locale[] avail = Currency.getAvailableLocales();
\r
75 errln("FAIL: getAvailableLocales returned null");
\r
79 usd.getName(ULocale.US, 5, new boolean[1]);
\r
80 errln("expected getName with invalid type parameter to throw exception");
\r
82 catch (Exception e) {
\r
83 logln("PASS: getName failed as expected");
\r
88 * Test registration.
\r
90 public void TestRegistration() {
\r
91 final Currency jpy = Currency.getInstance("JPY");
\r
92 final Currency usd = Currency.getInstance(Locale.US);
\r
95 Currency.unregister(null); // should fail, coverage
\r
96 errln("expected unregister of null to throw exception");
\r
98 catch (Exception e) {
\r
99 logln("PASS: unregister of null failed as expected");
\r
102 if (Currency.unregister("")) { // coverage
\r
103 errln("unregister before register erroneously succeeded");
\r
106 ULocale fu_FU = new ULocale("fu_FU");
\r
108 Object key1 = Currency.registerInstance(jpy, ULocale.US);
\r
109 Object key2 = Currency.registerInstance(jpy, fu_FU);
\r
111 Currency nus = Currency.getInstance(Locale.US);
\r
112 if (!nus.equals(jpy)) {
\r
113 errln("expected " + jpy + " but got: " + nus);
\r
116 // converage, make sure default factory works
\r
117 Currency nus1 = Currency.getInstance(Locale.JAPAN);
\r
118 if (!nus1.equals(jpy)) {
\r
119 errln("expected " + jpy + " but got: " + nus1);
\r
122 ULocale[] locales = Currency.getAvailableULocales();
\r
123 boolean found = false;
\r
124 for (int i = 0; i < locales.length; ++i) {
\r
125 if (locales[i].equals(fu_FU)) {
\r
131 errln("did not find locale" + fu_FU + " in currency locales");
\r
134 if (!Currency.unregister(key1)) {
\r
135 errln("unable to unregister currency using key1");
\r
137 if (!Currency.unregister(key2)) {
\r
138 errln("unable to unregister currency using key2");
\r
141 Currency nus2 = Currency.getInstance(Locale.US);
\r
142 if (!nus2.equals(usd)) {
\r
143 errln("expected " + usd + " but got: " + nus2);
\r
146 locales = Currency.getAvailableULocales();
\r
148 for (int i = 0; i < locales.length; ++i) {
\r
149 if (locales[i].equals(fu_FU)) {
\r
155 errln("found locale" + fu_FU + " in currency locales after unregister");
\r
162 public void TestNames() {
\r
163 // Do a basic check of getName()
\r
164 // USD { "US$", "US Dollar" } // 04/04/1792-
\r
165 ULocale en = ULocale.ENGLISH;
\r
166 boolean[] isChoiceFormat = new boolean[1];
\r
167 Currency usd = Currency.getInstance("USD");
\r
168 // Warning: HARD-CODED LOCALE DATA in this test. If it fails, CHECK
\r
169 // THE LOCALE DATA before diving into the code.
\r
171 assertEquals("USD.getName(SYMBOL_NAME)",
\r
173 usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
\r
174 assertEquals("USD.getName(LONG_NAME)",
\r
176 usd.getName(en, Currency.LONG_NAME, isChoiceFormat));
\r
178 // TODO add more tests later
\r
181 public void TestCoverage() {
\r
182 Currency usd = Currency.getInstance("USD");
\r
184 assertEquals("USD.getSymbol()",
\r
188 assertEquals("USD.getLocale()",
\r
190 usd.getLocale(null));
\r
193 public void TestCurrencyKeyword() {
\r
194 ULocale locale = new ULocale("th_TH@collation=traditional;currency=QQQ");
\r
195 Currency currency = Currency.getInstance(locale);
\r
196 String result = currency.getCurrencyCode();
\r
197 if (!"QQQ".equals(result)) {
\r
198 errln("got unexpected currency: " + result);
\r
202 public void TestAvailableCurrencyCodes() {
\r
203 String[][] tests = {
\r
204 { "eo_AM", "1950-01-05" },
\r
205 { "eo_AM", "1969-12-31", "SUR" },
\r
206 { "eo_AM", "1991-12-26", "RUR" },
\r
207 { "eo_AM", "2000-12-23", "AMD" },
\r
208 { "eo_AD", "2000-12-23", "EUR", "ESP", "FRF", "ADP" },
\r
209 { "eo_AD", "1969-12-31", "ESP", "FRF", "ADP" },
\r
210 { "eo_AD", "1950-01-05", "ESP", "ADP" },
\r
211 { "eo_AD", "1900-01-17", "ESP" },
\r
212 { "eo_UA", "1994-12-25" },
\r
213 { "eo_QQ", "1969-12-31" },
\r
214 { "eo_AO", "2000-12-23", "AOA" },
\r
215 { "eo_AO", "1995-12-25", "AOR", "AON" },
\r
216 { "eo_AO", "1990-12-26", "AON", "AOK" },
\r
217 { "eo_AO", "1979-12-29", "AOK" },
\r
218 { "eo_AO", "1969-12-31" },
\r
219 { "eo_DE@currency=DEM", "2000-12-23", "EUR", "DEM" },
\r
220 { "en_US", null, "USD" },
\r
221 { "en_US_PREEURO", null, "USD" },
\r
222 { "en_US_Q", null, "USD" },
\r
225 DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
\r
226 for (String[] test : tests) {
\r
227 ULocale locale = new ULocale(test[0]);
\r
228 String timeString = test[1];
\r
230 if (timeString == null) {
\r
232 timeString = "today";
\r
235 date = fmt.parse(timeString);
\r
236 } catch (Exception e) {
\r
237 fail("could not parse date: " + timeString);
\r
241 String[] expected = null;
\r
242 if (test.length > 2) {
\r
243 expected = new String[test.length - 2];
\r
244 System.arraycopy(test, 2, expected, 0, expected.length);
\r
246 String[] actual = Currency.getAvailableCurrencyCodes(locale, date);
\r
248 // Order is not important as of 4.4. We never documented that it was.
\r
249 Set<String> expectedSet = new HashSet<String>();
\r
250 if (expected != null) {
\r
251 expectedSet.addAll(Arrays.asList(expected));
\r
253 Set<String> actualSet = new HashSet<String>();
\r
254 if (actual != null) {
\r
255 actualSet.addAll(Arrays.asList(actual));
\r
257 assertEquals(locale + " on " + timeString, expectedSet, actualSet);
\r
261 public void TestDeprecatedCurrencyFormat() {
\r
263 Locale locale = new Locale("sr", "QQ");
\r
264 DecimalFormatSymbols icuSymbols = new
\r
265 com.ibm.icu.text.DecimalFormatSymbols(locale);
\r
266 String symbol = icuSymbols.getCurrencySymbol();
\r
267 Currency currency = icuSymbols.getCurrency();
\r
268 String expectCur = null;
\r
269 String expectSym = "\u00A4";
\r
270 if(!symbol.toString().equals(expectSym) || currency != null) {
\r
271 errln("for " + locale + " expected " + expectSym+"/"+expectCur + " but got " + symbol+"/"+currency);
\r
273 logln("for " + locale + " expected " + expectSym+"/"+expectCur + " and got " + symbol+"/"+currency);
\r
277 public void TestGetKeywordValues(){
\r
279 final String[][] PREFERRED = {
\r
290 {"ar_PS", "JOD", "ILS"},
\r
291 {"en@currency=CAD", "USD"},
\r
292 {"fr@currency=ZZZ", "EUR"},
\r
293 {"de_DE@currency=DEM", "EUR"},
\r
296 String[] ALL = Currency.getKeywordValuesForLocale("currency", ULocale.getDefault(), false);
\r
297 HashSet ALLSET = new HashSet();
\r
298 for (int i = 0; i < ALL.length; i++) {
\r
299 ALLSET.add(ALL[i]);
\r
302 for (int i = 0; i < PREFERRED.length; i++) {
\r
303 ULocale loc = new ULocale(PREFERRED[i][0]);
\r
304 String[] expected = new String[PREFERRED[i].length - 1];
\r
305 System.arraycopy(PREFERRED[i], 1, expected, 0, expected.length);
\r
306 String[] pref = Currency.getKeywordValuesForLocale("currency", loc, true);
\r
307 assertEquals(loc.toString(), expected, pref);
\r
309 String[] all = Currency.getKeywordValuesForLocale("currency", loc, false);
\r
310 // The items in the two collections should match (ignore order,
\r
311 // behavior change from 4.3.3)
\r
312 Set<String> returnedSet = new HashSet<String>();
\r
313 returnedSet.addAll(Arrays.asList(all));
\r
314 assertEquals(loc.toString(), ALLSET, returnedSet);
\r