/*
 *******************************************************************************
 * Copyright (C) 2001-2004, 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.*;

/**
 * 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);
        }
    }
}