/*
 *******************************************************************************
 * Copyright (C) 2014, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.test.format;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.Currency;
import com.ibm.icu.util.ULocale;

/**
 * @author rocketman
 *
 */
public class NumberFormatSpecificationTest extends TestFmwk {
    
    public static void main(String[] args) throws Exception {
        new NumberFormatSpecificationTest().run(args);
    }
    
    public void TestBasicPatterns() {
        double num = 1234.567;
        assertEquals("", "1 234,57", formatFrWithPattern(num, "#,##0.##"));
        assertEquals("", "1234,57", formatFrWithPattern(num, "0.##"));
        assertEquals("", "1235", formatFrWithPattern(num, "0"));
        assertEquals("", "1 234,567", formatFrWithPattern(num, "#,##0.###"));
        assertEquals("", "1234,567", formatFrWithPattern(num, "###0.#####"));
        assertEquals("", "1234,5670", formatFrWithPattern(num, "###0.0000#"));
        assertEquals("", "01234,5670", formatFrWithPattern(num, "00000.0000"));
        assertEquals("", "1 234,57 €", formatFrWithPattern(num, "#,##0.00 ¤"));  
    }
    
    public void TestNfSetters() {
        NumberFormat nf = nfWithPattern("#,##0.##");
        nf.setMaximumIntegerDigits(5);
        nf.setMinimumIntegerDigits(4);
        assertEquals("", "34 567,89", format(1234567.89, nf));
        assertEquals("", "0 034,56", format(34.56, nf));
        
    }
    
    public void TestRounding() {
        assertEquals("", "1,0", formatFrWithPattern(1.25, "0.5"));
        assertEquals("", "2,0", formatFrWithPattern(1.75, "0.5"));
        assertEquals("", "-1,0", formatFrWithPattern(-1.25, "0.5"));
        assertEquals("", "-02,0", formatFrWithPattern(-1.75, "00.5"));
        assertEquals("", "0", formatFrWithPattern(2.0, "4"));
        assertEquals("", "8", formatFrWithPattern(6.0, "4"));
        assertEquals("", "8", formatFrWithPattern(10.0, "4"));
        assertEquals("", "99,90", formatFrWithPattern(99.0, "2.70"));
        assertEquals("", "273,00", formatFrWithPattern(272.0, "2.73"));
        assertEquals("", "1 03,60", formatFrWithPattern(104.0, "#,#3.70"));
    }
    
    public void TestSignificantDigits() {
        assertEquals("", "1230", formatFrWithPattern(1234.0, "@@@"));
        assertEquals("", "1 234", formatFrWithPattern(1234.0, "@,@@@"));
        assertEquals("", "1 235 000", formatFrWithPattern(1234567.0, "@,@@@"));
        assertEquals("", "1 234 567", formatFrWithPattern(1234567.0, "@@@@,@@@"));
        assertEquals("", "12 34 567,00", formatFrWithPattern(1234567.0, "@@@@,@@,@@@"));
        assertEquals("", "12 34 567,0", formatFrWithPattern(1234567.0, "@@@@,@@,@@#"));
        assertEquals("", "12 34 567", formatFrWithPattern(1234567.0, "@@@@,@@,@##"));
        assertEquals("", "12 34 567", formatFrWithPattern(1234567.001, "@@@@,@@,@##"));
        assertEquals("", "12 34 567", formatFrWithPattern(1234567.001, "@@@@,@@,###"));
        assertEquals("", "1 200", formatFrWithPattern(1234.0, "#,#@@"));       
    }
    
    public void TestScientificNotation() {
        assertEquals("", "1,23E4", formatFrWithPattern(12345.0, "0.00E0"));
        assertEquals("", "123,00E2", formatFrWithPattern(12300.0, "000.00E0"));
        assertEquals("", "123,0E2", formatFrWithPattern(12300.0, "000.0#E0"));
        assertEquals("", "123,0E2", formatFrWithPattern(12300.1, "000.0#E0"));
        assertEquals("", "123,01E2", formatFrWithPattern(12301.0, "000.0#E0"));
        assertEquals("", "123,01E+02", formatFrWithPattern(12301.0, "000.0#E+00"));
        assertEquals("", "12,3E3", formatFrWithPattern(12345.0, "##0.00E0"));
        assertEquals("", "12,300E3", formatFrWithPattern(12300.1, "##0.0000E0"));
        assertEquals("", "12,30E3", formatFrWithPattern(12300.1, "##0.000#E0"));
        assertEquals("", "12,301E3", formatFrWithPattern(12301.0, "##0.000#E0"));
        if (!logKnownIssue("11020", "Rounding does not work with scientific notation.")) {
            assertEquals("", "170,0E-3", formatFrWithPattern(0.17, "##0.000#E0"));
        }
    }
    
    public void TestPercent() {
        assertEquals("", "57,3%", formatFrWithPattern(0.573, "0.0%"));
        assertEquals("", "%57,3", formatFrWithPattern(0.573, "%0.0"));
        assertEquals("", "p%p57,3", formatFrWithPattern(0.573, "p%p0.0"));
        assertEquals("", "p%p0,6", formatFrWithPattern(0.573, "p'%'p0.0"));
        assertEquals("", "%3,260", formatFrWithPattern(0.0326, "%@@@@"));
        assertEquals("", "%1 540", formatFrWithPattern(15.43, "%#,@@@"));
        assertEquals("", "%1 656,4", formatFrWithPattern(16.55, "%#,##4.1"));
        assertEquals("", "%16,3E3", formatFrWithPattern(162.55, "%##0.00E0"));  
    }
    
    public void TestPerMilli() {
        assertEquals("", "573,0‰", formatFrWithPattern(0.573, "0.0‰"));
        assertEquals("", "‰573,0", formatFrWithPattern(0.573, "‰0.0"));
        assertEquals("", "p‰p573,0", formatFrWithPattern(0.573, "p‰p0.0"));
        assertEquals("", "p‰p0,6", formatFrWithPattern(0.573, "p'‰'p0.0"));
        assertEquals("", "‰32,60", formatFrWithPattern(0.0326, "‰@@@@"));
        assertEquals("", "‰15 400", formatFrWithPattern(15.43, "‰#,@@@"));
        assertEquals("", "‰16 551,7", formatFrWithPattern(16.55, "‰#,##4.1"));
        assertEquals("", "‰163E3", formatFrWithPattern(162.55, "‰##0.00E0"));
    }
    
    public void TestPadding() {
        assertEquals("", "$***1 234", formatFrWithPattern(1234, "$**####,##0"));
        assertEquals("", "xxx$1 234", formatFrWithPattern(1234, "*x$####,##0"));
        assertEquals("", "1 234xxx$", formatFrWithPattern(1234, "####,##0*x$"));
        assertEquals("", "1 234$xxx", formatFrWithPattern(1234, "####,##0$*x"));
        assertEquals("", "ne1 234nx", formatFrWithPattern(-1234, "####,##0$*x;ne#n"));
        assertEquals("", "n1 234*xx", formatFrWithPattern(-1234, "####,##0$*x;n#'*'"));
        assertEquals("", "yyyy%432,6", formatFrWithPattern(4.33, "*y%4.2######"));
        if (!logKnownIssue("11025", "Padding broken when used with currencies")) {
            assertEquals("", "EUR *433,00", formatFrWithPattern(433.0, "¤¤ **####0.00"));
            assertEquals("", "EUR *433,00", formatFrWithPattern(433.0, "¤¤ **#######0"));
        }
        {
            DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
            DecimalFormat fmt = new DecimalFormat("¤¤ **#######0", sym);
            fmt.setCurrency(Currency.getInstance("JPY"));
            if (!logKnownIssue("11025", "Padding broken when used with currencies")) {
                assertEquals("", "JPY ****433", fmt.format(433.22)); 
            }
        }
        {
            DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.US);
            DecimalFormat fmt = new DecimalFormat("¤¤ **#######0;¤¤ (#)", sym);
            assertEquals("", "USD (433.22)", fmt.format(-433.22));   
        }
        assertEquals("", "QU***43,3E-1", formatFrWithPattern(4.33, "QU**00.#####E0"));
        {
            DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
            sym.setExponentSeparator("EE");
            DecimalFormat fmt = new DecimalFormat("QU**00.#####E0", sym);
            assertEquals("", "QU**43,3EE-1", fmt.format(4.33));   
        }
        // padding cannot work as intended with scientific notation.
        assertEquals("", "QU**43,32E-1", formatFrWithPattern(4.332, "QU**00.#####E0"));
    }
    
    private static String formatFrWithPattern(double d, String pattern) {
        DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
        DecimalFormat fmt = new DecimalFormat(pattern, sym);
        return fmt.format(d).replace('\u00a0', ' ');
    }
    
    private static NumberFormat nfWithPattern(String pattern) {
        DecimalFormatSymbols sym = new DecimalFormatSymbols(ULocale.FRANCE);
        return new DecimalFormat(pattern, sym);
    }

    private static String format(double d, NumberFormat nf) {
        return nf.format(d).replace('\u00a0', ' ');
    }
   

}
