/*
 **********************************************************************
 * Copyright (c) 2002-2008, International Business Machines
 * Corporation and others.  All Rights Reserved.
 **********************************************************************
 * Author: Alan Liu
 * Created: December 18 2002
 * Since: ICU 2.4
 **********************************************************************
 */

package com.ibm.icu.dev.test.util;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.text.DecimalFormatSymbols;
import com.ibm.icu.util.*;

import java.util.Locale;
import java.util.Date;

/**
 * @test
 * @summary General test of Currency
 */
public class CurrencyTest extends TestFmwk {

    public static void main(String[] args) throws Exception {
        new CurrencyTest().run(args);
    }

    /**
     * Test of basic API.
     */
    public void TestAPI() {
        Currency usd = Currency.getInstance("USD");
        /*int hash = */usd.hashCode();
        Currency jpy = Currency.getInstance("JPY");
        if (usd.equals(jpy)) {
            errln("FAIL: USD == JPY");
        }
        if (usd.equals("abc")) {
            errln("FAIL: USD == (String)");
        }
        if (usd.equals(null)) {
            errln("FAIL: USD == (null)");
        }
        if (!usd.equals(usd)) {
            errln("FAIL: USD != USD");
        }

        Locale[] avail = Currency.getAvailableLocales();
        if(avail==null){
            errln("FAIL: getAvailableLocales returned null");
        }

    try {
      usd.getName(ULocale.US, 5, new boolean[1]);
      errln("expected getName with invalid type parameter to throw exception");
    }
    catch (Exception e) {
    	logln("PASS: getName failed as expected");
    }
    }

    /**
     * Test registration.
     */
    public void TestRegistration() {
        final Currency jpy = Currency.getInstance("JPY");
        final Currency usd = Currency.getInstance(Locale.US);

    try {
      Currency.unregister(null); // should fail, coverage
      errln("expected unregister of null to throw exception");
    }
    catch (Exception e) {
    	logln("PASS: unregister of null failed as expected");
    }

    if (Currency.unregister("")) { // coverage
      errln("unregister before register erroneously succeeded");
    }

        ULocale fu_FU = new ULocale("fu_FU");

        Object key1 = Currency.registerInstance(jpy, ULocale.US);
        Object key2 = Currency.registerInstance(jpy, fu_FU);

        Currency nus = Currency.getInstance(Locale.US);
        if (!nus.equals(jpy)) {
            errln("expected " + jpy + " but got: " + nus);
        }

        // converage, make sure default factory works
        Currency nus1 = Currency.getInstance(Locale.JAPAN);
        if (!nus1.equals(jpy)) {
            errln("expected " + jpy + " but got: " + nus1);
        }

        ULocale[] locales = Currency.getAvailableULocales();
        boolean found = false;
        for (int i = 0; i < locales.length; ++i) {
            if (locales[i].equals(fu_FU)) {
                found = true;
                break;
            }
        }
        if (!found) {
            errln("did not find locale" + fu_FU + " in currency locales");
        }

        if (!Currency.unregister(key1)) {
            errln("unable to unregister currency using key1");
        }
        if (!Currency.unregister(key2)) {
            errln("unable to unregister currency using key2");
        }

        Currency nus2 = Currency.getInstance(Locale.US);
        if (!nus2.equals(usd)) {
            errln("expected " + usd + " but got: " + nus2);
        }

        locales = Currency.getAvailableULocales();
        found = false;
        for (int i = 0; i < locales.length; ++i) {
            if (locales[i].equals(fu_FU)) {
                found = true;
                break;
            }
        }
        if (found) {
            errln("found locale" + fu_FU + " in currency locales after unregister");
        }
    }

    /**
     * Test names.
     */
    public void TestNames() {
        // Do a basic check of getName()
        // USD { "US$", "US Dollar"            } // 04/04/1792-
        ULocale en = ULocale.ENGLISH;
        boolean[] isChoiceFormat = new boolean[1];
        Currency usd = Currency.getInstance("USD");
        // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
        // THE LOCALE DATA before diving into the code.
        if (!noData()) {
            assertEquals("USD.getName(SYMBOL_NAME)",
                         "$",
                         usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
            assertEquals("USD.getName(LONG_NAME)",
                         "US Dollar",
                         usd.getName(en, Currency.LONG_NAME, isChoiceFormat));
        }
        // TODO add more tests later
    }

    public void TestCoverage() {
        Currency usd = Currency.getInstance("USD");
        if (!noData()) {
        assertEquals("USD.getSymbol()",
                "$",
                usd.getSymbol());
        }
        assertEquals("USD.getLocale()",
        		ULocale.ROOT,
				usd.getLocale(null));
    }

    public void TestCurrencyKeyword() {
        ULocale locale = new ULocale("th_TH@collation=traditional;currency=QQQ");
        Currency currency = Currency.getInstance(locale);
        String result = currency.getCurrencyCode();
        if (!"QQQ".equals(result)) {
            errln("got unexpected currency: " + result);
        }
    }

	public void TestCurrencyByDate()
	{
		// local Variables
		Date date;
		ULocale locale;
		Currency currency;
        String result;		
 
 	    // Cycle through historical currencies 
		currency = Currency.getInstance(new ULocale("eo_AM"), new Date(-630720000000L));
		result = currency.getCurrencyCode();
		if (!"AMD".equals(result))
		{
			errln("didn't return AMD for eo_AM returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AM"), new Date(0L));
		result = currency.getCurrencyCode();
		if (!"SUR".equals(result))
		{
			errln("didn't return SUR for eo_AM returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AM"), new Date(693792000000L));
		result = currency.getCurrencyCode();
		if (!"RUR".equals(result))
		{
			errln("didn't return RUR for eo_AM returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AM"), new Date(977616000000L));
		result = currency.getCurrencyCode();
		if (!"AMD".equals(result))
		{
			errln("didn't return AMD for eo_AM returned: " + result);
		}

        // Locale AD has multiple currencies at once
		currency = Currency.getInstance(new ULocale("eo_AD"), new Date(977616000000L));
		result = currency.getCurrencyCode();
		if (!"EUR".equals(result))
		{
			errln("didn't return EUR for eo_AD returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AD"), new Date(0L));
		result = currency.getCurrencyCode();
		if (!"ESP".equals(result))
		{
			errln("didn't return ESP for eo_AD returned: " + result);
		}

        // Locale UA has gap between years 1994 - 1996
		currency = Currency.getInstance(new ULocale("eo_UA"), new Date(788400000000L));
		result = currency.getCurrencyCode();
		if (!"UAH".equals(result))
		{
			errln("didn't return UAH for eo_UA returned: " + result);
		}

 	    // Cycle through historical currencies 
		currency = Currency.getInstance(new ULocale("eo_AO"), new Date(977616000000L));
		result = currency.getCurrencyCode();
		if (!"AOA".equals(result))
		{
			errln("didn't return AOA for eo_AO returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AO"), new Date(819936000000L));
		result = currency.getCurrencyCode();
		if (!"AOR".equals(result))
		{
			errln("didn't return AOR for eo_AO returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AO"), new Date(662256000000L));
		result = currency.getCurrencyCode();
		if (!"AON".equals(result))
		{
			errln("didn't return AON for eo_AO returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AO"), new Date(315360000000L));
		result = currency.getCurrencyCode();
		if (!"AOK".equals(result))
		{
			errln("didn't return AOK for eo_AO returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("eo_AO"), new Date(0L));
		result = currency.getCurrencyCode();
		if (!"AOA".equals(result))
		{
			errln("didn't return AOA for eo_AO returned: " + result);
		}

        // Test EURO support
		currency = Currency.getInstance(new ULocale("en_US"), new Date(System.currentTimeMillis()));
		result = currency.getCurrencyCode();
		if (!"USD".equals(result))
		{
			errln("didn't return USD for en_US returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("en_US_PREEURO"), new Date(System.currentTimeMillis()));
		result = currency.getCurrencyCode();
		if (!"USD".equals(result))
		{
			errln("didn't return USD for en_US_PREEURO returned: " + result);
		}

		currency = Currency.getInstance(new ULocale("en_US_Q"), new Date(System.currentTimeMillis()));
		result = currency.getCurrencyCode();
		if (!"USD".equals(result))
		{
			errln("didn't return USD for en_US_Q returned: " + result);
		}

		// non-existant locale
 		currency = Currency.getInstance(new ULocale("en_QQ"), new Date(System.currentTimeMillis()));
		if (currency != null)
		{
			errln("didn't return NULL for en_QQ");
		}

	}

    public void TestDeprecatedCurrencyFormat() {
        // bug 5952
        Locale locale = new Locale("sr", "QQ");
        DecimalFormatSymbols icuSymbols = new 
        com.ibm.icu.text.DecimalFormatSymbols(locale);
        String symbol = icuSymbols.getCurrencySymbol();
        Currency currency = icuSymbols.getCurrency();
        String expectCur = null;
        String expectSym = "\u00A4";
        if(!symbol.toString().equals(expectSym) || currency != null) {
            errln("for " + locale + " expected " + expectSym+"/"+expectCur + " but got " + symbol+"/"+currency);
        } else {
            logln("for " + locale + " expected " + expectSym+"/"+expectCur + " and got " + symbol+"/"+currency);
        }
    }
}
