/*
 *******************************************************************************
 * Copyright (C) 2006-2011, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

package com.ibm.icu.tests;

import java.util.Locale;

import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;

public class DecimalFormatTest extends ICUTestCase {
    private static final long lmax = Long.MAX_VALUE;
    private static final double dsmall = 23.33;
        
    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.clone()'
     */
    public void testClone() {
        DecimalFormat df = new DecimalFormat("#,#0.00");
        DecimalFormat df2 = new DecimalFormat("#,#0.00");
        DecimalFormat dfn = new DecimalFormat("#,#0.00");
        dfn.setNegativePrefix(dfn.getNegativePrefix() + '!');
        testEHCS(df, df2, dfn);
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.DecimalFormat(DecimalFormat)'
     */
    public void testDecimalFormatDecimalFormat() {
        // tested implicitly
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.DecimalFormat()'
     */
    public void testDecimalFormat() {
        DecimalFormat df = new DecimalFormat();
        assertEquals("9,223,372,036,854,775,807", df.format(lmax));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.DecimalFormat(String)'
     */
    public void testDecimalFormatString() {
        DecimalFormat df = new DecimalFormat("#,##0.000");
        assertEquals("23.330", df.format(dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.DecimalFormat(String, DecimalFormatSymbols)'
     */
    public void testDecimalFormatStringDecimalFormatSymbols() {
        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.FRANCE);
        DecimalFormat df = new DecimalFormat("#,##0.000", sym);
        assertEquals("23,330", df.format(dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getDecimalFormatSymbols()'
     */
    public void testGetDecimalFormatSymbols() {
        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.FRANCE);
        DecimalFormat df = new DecimalFormat("#,##0.000", sym);
        assertEquals(sym, df.getDecimalFormatSymbols());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setDecimalFormatSymbols(DecimalFormatSymbols)'
     */
    public void testSetDecimalFormatSymbols() {
        DecimalFormat df = new DecimalFormat();
        df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.FRANCE));
        assertEquals("23,33", df.format(dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getPositivePrefix()'
     */
    public void testGetPositivePrefix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#;-#,##0.#");
        assertEquals("+", df.getPositivePrefix());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setPositivePrefix(String)'
     */
    public void testSetPositivePrefix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#;-#,##0.#");
        df.setPositivePrefix("?");
        assertEquals("?23.3", df.format(dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getNegativePrefix()'
     */
    public void testGetNegativePrefix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#;-#,##0.#");
        assertEquals("-", df.getNegativePrefix());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setNegativePrefix(String)'
     */
    public void testSetNegativePrefix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#;-#,##0.#");
        df.setNegativePrefix("~");
        assertEquals("~23.3", df.format(-dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getPositiveSuffix()'
     */
    public void testGetPositiveSuffix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#**;-#,##0.#~~");
        assertEquals("**", df.getPositiveSuffix());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setPositiveSuffix(String)'
     */
    public void testSetPositiveSuffix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#;-#,##0.#");
        df.setPositiveSuffix("**");
        assertEquals("+23.3**", df.format(dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getNegativeSuffix()'
     */
    public void testGetNegativeSuffix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#**;-#,##0.#~~");
        assertEquals("~~", df.getNegativeSuffix());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setNegativeSuffix(String)'
     */
    public void testSetNegativeSuffix() {
        DecimalFormat df = new DecimalFormat("+#,##0.#;-#,##0.#");
        df.setNegativeSuffix("~~");
        assertEquals("-23.3~~", df.format(-dsmall));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getMultiplier()'
     */
    public void testGetMultiplier() {
        DecimalFormat df = new DecimalFormat("%000");
        df.setMultiplier(1000);
        assertEquals(1000, df.getMultiplier());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setMultiplier(int)'
     */
    public void testSetMultiplier() {
        DecimalFormat df = new DecimalFormat("%000");
        assertEquals("%012", df.format(.123));
        df.setMultiplier(1000);
        assertEquals("%123", df.format(.123));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.getGroupingSize()'
     */
    public void testGetGroupingSize() {
        DecimalFormat df = new DecimalFormat("#,#0.#");
        assertEquals(2, df.getGroupingSize());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setGroupingSize(int)'
     */
    public void testSetGroupingSize() {
        DecimalFormat df = new DecimalFormat("#,##0.##");
        assertEquals("1,234,567.89", df.format(1234567.89));
        df.setGroupingSize(2);
        assertEquals("1,23,45,67.89", df.format(1234567.89));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.isDecimalSeparatorAlwaysShown()'
     */
    public void testIsDecimalSeparatorAlwaysShown() {
        DecimalFormat df = new DecimalFormat("#.#");
        df.setDecimalSeparatorAlwaysShown(false);
        assertEquals("1", df.format(1));
        assertEquals("1.2", df.format(1.2));
        df.setDecimalSeparatorAlwaysShown(true);
        assertEquals("1.", df.format(1));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.setDecimalSeparatorAlwaysShown(boolean)'
     */
    public void testSetDecimalSeparatorAlwaysShown() {
        DecimalFormat df = new DecimalFormat("#.#");
        df.setDecimalSeparatorAlwaysShown(false);
        assertFalse(df.isDecimalSeparatorAlwaysShown());
        df.setDecimalSeparatorAlwaysShown(true);
        assertTrue(df.isDecimalSeparatorAlwaysShown());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.toPattern()'
     */
    public void testToPattern() {
        DecimalFormat df = new DecimalFormat("#,##0.##");
        assertEquals("#,##0.##", df.toPattern());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.toLocalizedPattern()'
     */
    public void testToLocalizedPattern() {
        DecimalFormat df = new DecimalFormat("#,##0.##", new DecimalFormatSymbols(Locale.FRANCE));
        assertEquals("#,##0.##", df.toPattern());
        assertEquals("#\u00a0##0,##", df.toLocalizedPattern());
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.applyPattern(String)'
     */
    public void testApplyPattern() {
        DecimalFormat df = new DecimalFormat("#,##0.##");
        df.applyPattern("#,0.#");
        assertEquals("1,2,3.4", df.format(123.4));
    }

    /*
     * Test method for 'com.ibm.icu.text.DecimalFormat.applyLocalizedPattern(String)'
     */
    public void testApplyLocalizedPattern() {
        DecimalFormat df = new DecimalFormat("#,##0.##", new DecimalFormatSymbols(Locale.FRANCE));
        df.applyLocalizedPattern("#\u00a00,#");
        assertEquals("1\u00a02\u00a03,4", df.format(123.4));
    }
}
