/*
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
/*
* @test @(#)CurrencyTest.java 1.6 06/10/10
* @bug 4290801
* @summary Basic tests for Currency class.
*/
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Currency;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
public class CurrencyTest {
// save a copy of available locales
static Locale[] supportedLocales;
public static void main(String[] args) throws Exception {
testCurrencyCodeValidation();
testLocaleMapping();
testSymbols();
testFractionDigits();
testSerialization();
}
static void testCurrencyCodeValidation() {
// test creation of some valid currencies
testValidCurrency("USD");
testValidCurrency("EUR");
testValidCurrency("GBP");
testValidCurrency("JPY");
testValidCurrency("CNY");
testValidCurrency("CHF");
// test creation of some fictitious currencies
testInvalidCurrency("AQD");
testInvalidCurrency("US$");
testInvalidCurrency("\u20AC");
}
static void testValidCurrency(String currencyCode) {
Currency currency1 = Currency.getInstance(currencyCode);
Currency currency2 = Currency.getInstance(currencyCode);
if (currency1 != currency2) {
throw new RuntimeException("Didn't get same instance for same currency code");
}
if (!currency1.getCurrencyCode().equals(currencyCode)) {
throw new RuntimeException("Currency code changed");
}
}
static void testInvalidCurrency(String currencyCode) {
boolean gotException = false;
try {
Currency currency = Currency.getInstance(currencyCode);
} catch (IllegalArgumentException e) {
gotException = true;
}
if (!gotException) {
throw new RuntimeException("didn't get specified exception");
}
}
static void testLocaleMapping() {
// very basic test: most countries have their own currency, and then
// their currency code is an extension of their country code.
Locale[] locales = Locale.getAvailableLocales();
int goodCountries = 0;
int ownCurrencies = 0;
for (int i = 0; i < locales.length; i++) {
Locale locale = locales[i];
if (locale.getCountry().length() == 0) {
boolean gotException = false;
try {
Currency.getInstance(locale);
} catch (IllegalArgumentException e) {
gotException = true;
}
if (!gotException) {
throw new RuntimeException("didn't get specified exception");
}
} else {
goodCountries++;
Currency currency = Currency.getInstance(locale);
if (currency.getCurrencyCode().indexOf(locale.getCountry()) == 0) {
ownCurrencies++;
}
}
}
System.out.println("Countries tested: " + goodCountries +
", own currencies: " + ownCurrencies);
if (ownCurrencies < (goodCountries / 2 + 1)) {
throw new RuntimeException("suspicious: not enough countries have their own currency.");
}
// check a few countries that don't change their currencies too often
String[] country1 = {"US", "CA", "JP", "CN", "SG", "CH"};
String[] currency1 = {"USD", "CAD", "JPY", "CNY", "SGD", "CHF"};
for (int i = 0; i < country1.length; i++) {
checkCountryCurrency(country1[i], currency1[i]);
}
// check a few countries that are known to change their currencies soon
String[] country2 = {"DE", "FR", "ES", "IT", "NL", "BE"};
String[] currency2 = {"DEM", "FRF", "ESP", "ITL", "NLG", "BEF"};
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris"));
Calendar date = new GregorianCalendar(2002, Calendar.JANUARY, 1);
long switchOver = date.getTime().getTime();
boolean switchedOver = System.currentTimeMillis() >= switchOver;
for (int i = 0; i < country2.length; i++) {
checkCountryCurrency(country2[i],
switchedOver ? "EUR" : currency2[i]);
}
// check a country code which doesn't have a currency
checkCountryCurrency("AQ", null);
// check an invalid country code
boolean gotException = false;
try {
Currency.getInstance(new Locale("", "EU"));
} catch (IllegalArgumentException e) {
gotException = true;
}
if (!gotException) {
throw new RuntimeException("didn't get specified exception.");
}
// save the locale list for other tests to use
supportedLocales = new Locale[locales.length];
System.arraycopy((Object)locales, 0,
(Object)supportedLocales, 0, locales.length);
}
static void checkCountryCurrency(String countryCode, String expected) {
Locale locale = new Locale("", countryCode);
Currency currency = Currency.getInstance(locale);
String code = (currency != null) ? currency.getCurrencyCode() : null;
if (!(expected == null ? code == null : expected.equals(code))) {
throw new RuntimeException("Wrong currency for " +
locale.getDisplayCountry() +
": expected " + expected + ", got " + code);
}
}
static void testSymbols() {
testSymbol("USD", Locale.US, "$");
testSymbol("EUR", Locale.GERMANY, "\u20AC");
testSymbol("USD", Locale.PRC, "USD");
}
static void testSymbol(String currencyCode, Locale locale, String expectedSymbol) {
if (supportedLocales == null)
supportedLocales = Locale.getAvailableLocales();
for (int i = 0; i < supportedLocales.length; i++) {
if (supportedLocales[i].getCountry().equals(locale.getCountry())) {
String symbol = Currency.getInstance(currencyCode).getSymbol(locale);
if (!symbol.equals(expectedSymbol)) {
throw new RuntimeException("Wrong symbol for currency " +
currencyCode +": expected " + expectedSymbol +
", got " + symbol);
}
return;
}
}
System.out.println(locale + " not supported, ignoring a symbol test.");
}
static void testFractionDigits() {
testFractionDigits("USD", 2);
testFractionDigits("EUR", 2);
testFractionDigits("JPY", 0);
testFractionDigits("XDR", -1);
}
static void testFractionDigits(String currencyCode, int expectedFractionDigits) {
int digits = Currency.getInstance(currencyCode).getDefaultFractionDigits();
if (digits != expectedFractionDigits) {
throw new RuntimeException("Wrong number of fraction digits for currency " +
currencyCode +": expected " + expectedFractionDigits +
", got " + digits);
}
}
static void testSerialization() throws Exception {
Currency currency1 = Currency.getInstance("DEM");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oStream = new ObjectOutputStream(baos);
oStream.writeObject(currency1);
oStream.flush();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream iStream = new ObjectInputStream(bais);
Currency currency2 = (Currency) iStream.readObject();
if (currency1 != currency2) {
throw new RuntimeException("serialization breaks class invariant");
}
}
}