/*
 *******************************************************************************
 * Copyright (C) 2001-2010, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

/** 
 * Port From:   ICU4C v1.8.1 : format : IntlTestDecimalFormatSymbols
 * Source File: $ICU4CRoot/source/test/intltest/tsdcfmsy.cpp
 **/

package com.ibm.icu.dev.test.format;

import java.text.FieldPosition;
import java.util.Locale;

import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;

/**
 * Tests for DecimalFormatSymbols
 **/
public class IntlTestDecimalFormatSymbolsC extends com.ibm.icu.dev.test.TestFmwk {
    
    public static void main(String[] args) throws Exception {
        new IntlTestDecimalFormatSymbolsC().run(args);
    }

    /**
     * Test the API of DecimalFormatSymbols; primarily a simple get/set set.
     */
    public void TestSymbols() {    
        DecimalFormatSymbols fr = new DecimalFormatSymbols(Locale.FRENCH);    
        DecimalFormatSymbols en = new DecimalFormatSymbols(Locale.ENGLISH);
    
        if (en.equals(fr)) {
            errln("ERROR: English DecimalFormatSymbols equal to French");
        }
    
        // just do some VERY basic tests to make sure that get/set work
    
        char zero = en.getZeroDigit();
        fr.setZeroDigit(zero);
        if (fr.getZeroDigit() != en.getZeroDigit()) {
            errln("ERROR: get/set ZeroDigit failed");
        }
    
        char group = en.getGroupingSeparator();
        fr.setGroupingSeparator(group);
        if (fr.getGroupingSeparator() != en.getGroupingSeparator()) {
            errln("ERROR: get/set GroupingSeparator failed");
        }
    
        char decimal = en.getDecimalSeparator();
        fr.setDecimalSeparator(decimal);
        if (fr.getDecimalSeparator() != en.getDecimalSeparator()) {
            errln("ERROR: get/set DecimalSeparator failed");
        }
    
        char perMill = en.getPerMill();
        fr.setPerMill(perMill);
        if (fr.getPerMill() != en.getPerMill()) {
            errln("ERROR: get/set PerMill failed");
        }
    
        char percent = en.getPercent();
        fr.setPercent(percent);
        if (fr.getPercent() != en.getPercent()) {
            errln("ERROR: get/set Percent failed");
        }
    
        char digit = en.getDigit();
        fr.setDigit(digit);
        if (fr.getPercent() != en.getPercent()) {
            errln("ERROR: get/set Percent failed");
        }
    
        char patternSeparator = en.getPatternSeparator();
        fr.setPatternSeparator(patternSeparator);
        if (fr.getPatternSeparator() != en.getPatternSeparator()) {
            errln("ERROR: get/set PatternSeparator failed");
        }
    
        String infinity = en.getInfinity();
        fr.setInfinity(infinity);
        String infinity2 = fr.getInfinity();
        if (!infinity.equals(infinity2)) {
            errln("ERROR: get/set Infinity failed");
        }
    
        String nan = en.getNaN();
        fr.setNaN(nan);
        String nan2 = fr.getNaN();
        if (!nan.equals(nan2)) {
            errln("ERROR: get/set NaN failed");
        }
    
        char minusSign = en.getMinusSign();
        fr.setMinusSign(minusSign);
        if (fr.getMinusSign() != en.getMinusSign()) {
            errln("ERROR: get/set MinusSign failed");
        }
    
        //        char exponential = en.getExponentialSymbol();
        //        fr.setExponentialSymbol(exponential);
        //        if(fr.getExponentialSymbol() != en.getExponentialSymbol()) {
        //            errln("ERROR: get/set Exponential failed");
        //        }
    
        //DecimalFormatSymbols foo = new DecimalFormatSymbols(); //The variable is never used
    
        en = (DecimalFormatSymbols) fr.clone();
    
        if (!en.equals(fr)) {
            errln("ERROR: Clone failed");
        }
        
        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
    
        verify(34.5, "00.00", sym, "34.50");
        sym.setDecimalSeparator('S');
        verify(34.5, "00.00", sym, "34S50");
        sym.setPercent('P');
        verify(34.5, "00 %", sym, "3450 P");
        sym.setCurrencySymbol("D");
        verify(34.5, "\u00a4##.##", sym, "D34.5");
        sym.setGroupingSeparator('|');
        verify(3456.5, "0,000.##", sym, "3|456S5");
    }
    
    /** helper functions**/
    public void verify(double value, String pattern, DecimalFormatSymbols sym, String expected) {
        DecimalFormat df = new DecimalFormat(pattern, sym);
        StringBuffer buffer = new StringBuffer("");
        FieldPosition pos = new FieldPosition(-1);
        buffer = df.format(value, buffer, pos);
        if(!buffer.toString().equals(expected)){
            errln("ERROR: format failed after setSymbols()\n Expected" + 
                expected + ", Got " + buffer);
        }
    }
}