/*
 *******************************************************************************
 * Copyright (C) 2001-2003, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/format/NumberFormatRoundTripTest.java,v $ 
 * $Date: 2003/06/03 18:49:29 $ 
 * $Revision: 1.5 $
 *
 *****************************************************************************************
 */

/** 
 * Porting From: ICU4C v1.8.1 : format : NumberFormatRoundTripTest
 * Source File: $ICU4CRoot/source/test/intltest/nmfmtrt.cpp
 **/

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

import com.ibm.icu.text.*;
import java.util.Locale;
import java.util.Random;

/** 
 * Performs round-trip tests for NumberFormat
 **/
public class NumberFormatRoundTripTest extends com.ibm.icu.dev.test.TestFmwk {
    
    public double MAX_ERROR = 1e-14;
    public double max_numeric_error = 0.0;
    public double min_numeric_error = 1.0;
    public boolean verbose = false;
    public boolean STRING_COMPARE = false;
    public boolean EXACT_NUMERIC_COMPARE = false;
    public boolean DEBUG = false;
    public boolean quick = true;
    
    public static void main(String[] args) throws Exception {
        new NumberFormatRoundTripTest().run(args);
    }
    
    public void TestNumberFormatRoundTrip() {
    
        NumberFormat fmt = null;
    
        logln("Default Locale");
        
        logln("Default Number format");
        fmt = NumberFormat.getInstance();
        _test(fmt);
    
        logln("Currency Format");
        fmt = NumberFormat.getCurrencyInstance();
        _test(fmt);
    
        logln("Percent Format");
        fmt = NumberFormat.getPercentInstance();
        _test(fmt);
    
    
        int locCount = 0;
        final Locale[] loc = NumberFormat.getAvailableLocales();
        if(quick) {
            if(locCount > 5)
                locCount = 5;
            logln("Quick mode: only _testing first 5 Locales");
        }
        for(int i = 0; i < locCount; ++i) {
            logln(loc[i].getDisplayName());
    
            fmt = NumberFormat.getInstance(loc[i]);
            _test(fmt);
        
            fmt = NumberFormat.getCurrencyInstance(loc[i]);
            _test(fmt);
        
            fmt = NumberFormat.getPercentInstance(loc[i]);
            _test(fmt);
        }
    
        logln("Numeric error " + min_numeric_error + " to " + max_numeric_error);
    }
    
    /**
     * Return a random value from -range..+range.
     */
    private Random random;
    public double randomDouble(double range) {
        if (random == null) {
            random = createRandom(); // use test framework's random seed
        }
        return  random.nextDouble() * range;
    } 
    
    public void _test(NumberFormat fmt) {
    
        _test(fmt, Double.NaN);
        _test(fmt, Double.POSITIVE_INFINITY);
        _test(fmt, Double.NEGATIVE_INFINITY);
    
        _test(fmt, 500);
        _test(fmt, 0);
        _test(fmt, -0);
        _test(fmt, 0.0);
        double negZero = 0.0;
        negZero /= -1.0;
        _test(fmt, negZero);
        _test(fmt, 9223372036854775808.0d);
        _test(fmt, -9223372036854775809.0d);
        //_test(fmt, 6.936065876100493E74d);
        
    //    _test(fmt, 6.212122845281909E48d);
        for (int i = 0; i < 10; ++i) {
    
            _test(fmt, randomDouble(1));
            
            _test(fmt, randomDouble(10000));
    
            _test(fmt, Math.floor((randomDouble(10000))));
    
            _test(fmt, randomDouble(1e50));
    
            _test(fmt, randomDouble(1e-50));
    
            _test(fmt, randomDouble(1e100));
    
            _test(fmt, randomDouble(1e75));
    
            _test(fmt, randomDouble(1e308) / ((DecimalFormat) fmt).getMultiplier());
    
            _test(fmt, randomDouble(1e75) / ((DecimalFormat) fmt).getMultiplier());
    
            _test(fmt, randomDouble(1e65) / ((DecimalFormat) fmt).getMultiplier());
    
            _test(fmt, randomDouble(1e-292));
    
            _test(fmt, randomDouble(1e-78));
    
            _test(fmt, randomDouble(1e-323));
    
            _test(fmt, randomDouble(1e-100));
    
            _test(fmt, randomDouble(1e-78));
        }
    }
    
    public void _test(NumberFormat fmt, double value) {
        _test(fmt, new Double(value));
    }
    
    public void _test(NumberFormat fmt, long value) {
        _test(fmt, new Long(value));
    }
    
    public void _test(NumberFormat fmt, Number value) {
        logln("test data = " + value);
        fmt.setMaximumFractionDigits(999);
        String s, s2;
        if (value.getClass().getName().equalsIgnoreCase("java.lang.Double"))
            s = fmt.format(value.doubleValue());
        else
            s = fmt.format(value.longValue());
    
        Number n = new Double(0);
        boolean show = verbose;
        if (DEBUG)
            logln(
            /*value.getString(temp) +*/ " F> " + s);
        try {
            n = fmt.parse(s);
        } catch (java.text.ParseException e) {
            System.out.println(e);
        }
    
        if (DEBUG)
            logln(s + " P> " /*+ n.getString(temp)*/);
    
        if (value.getClass().getName().equalsIgnoreCase("java.lang.Double"))
            s2 = fmt.format(n.doubleValue());
        else
            s2 = fmt.format(n.longValue());
    
        if (DEBUG)
            logln(/*n.getString(temp) +*/ " F> " + s2);
    
        if (STRING_COMPARE) {
            if (!s.equals(s2)) {
                errln("*** STRING ERROR \"" + s + "\" != \"" + s2 + "\"");
                show = true;
            }
        }
    
        if (EXACT_NUMERIC_COMPARE) {
            if (value != n) {
                errln("*** NUMERIC ERROR");
                show = true;
            }
        } else {
            // Compute proportional error
            double error = proportionalError(value, n);
    
            if (error > MAX_ERROR) {
                errln("*** NUMERIC ERROR " + error);
                show = true;
            }
    
            if (error > max_numeric_error)
                max_numeric_error = error;
            if (error < min_numeric_error)
                min_numeric_error = error;
        }
    
        if (show)
            logln(
            /*value.getString(temp) +*/ value.getClass().getName() + " F> " + s + " P> " +
            /*n.getString(temp) +*/ n.getClass().getName() + " F> " + s2);
    
    }
        
    public double proportionalError(Number a, Number b) {
        double aa,bb;
        
        if(a.getClass().getName().equalsIgnoreCase("java.lang.Double"))
            aa = a.doubleValue();
        else
            aa = a.longValue();
    
        if(a.getClass().getName().equalsIgnoreCase("java.lang.Double"))
            bb = b.doubleValue();
        else
            bb = b.longValue();
    
        double error = aa - bb;
        if(aa != 0 && bb != 0) 
            error /= aa;
           
        return Math.abs(error);
    }   
}
