/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package libcore.java.text;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DecimalFormatSymbols;
import java.util.Currency;
import java.util.Locale;

public class DecimalFormatSymbolsTest extends junit.framework.TestCase {

    // http://code.google.com/p/android/issues/detail?id=14495
    public void testSerialization() throws Exception {
        DecimalFormatSymbols originalDfs = DecimalFormatSymbols.getInstance(Locale.GERMANY);

        // Serialize...
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        new ObjectOutputStream(out).writeObject(originalDfs);
        byte[] bytes = out.toByteArray();

        // Deserialize...
        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
        DecimalFormatSymbols deserializedDfs = (DecimalFormatSymbols) in.readObject();
        assertEquals(-1, in.read());

        // The two objects should claim to be equal.
        assertEquals(originalDfs, deserializedDfs);
    }

//    // https://code.google.com/p/android/issues/detail?id=79925
//    public void testSetSameCurrency() throws Exception {
//        DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
//        dfs.setCurrency(Currency.getInstance("USD"));
//        assertEquals("$", dfs.getCurrencySymbol());
//        dfs.setCurrencySymbol("poop");
//        assertEquals("poop", dfs.getCurrencySymbol());
//        dfs.setCurrency(Currency.getInstance("USD"));
//        assertEquals("$", dfs.getCurrencySymbol());
//    }

    public void testSetNulInternationalCurrencySymbol() throws Exception {
        Currency usd = Currency.getInstance("USD");

        DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
        dfs.setCurrency(usd);
        assertEquals(usd, dfs.getCurrency());
        assertEquals("$", dfs.getCurrencySymbol());
        assertEquals("USD", dfs.getInternationalCurrencySymbol());

        // Setting the international currency symbol to null sets the currency to null too,
        // but not the currency symbol.
        dfs.setInternationalCurrencySymbol(null);
        assertEquals(null, dfs.getCurrency());
        assertEquals("$", dfs.getCurrencySymbol());
        assertEquals(null, dfs.getInternationalCurrencySymbol());
    }

    // https://code.google.com/p/android/issues/detail?id=170718
    public void testSerializationOfMultiCharNegativeAndPercentage() throws Exception {
        DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.forLanguageTag("ar-AR"));
        // TODO(narayan): Investigate.
        // assertTrue(dfs.getMinusSignString().length() > 1);
        // assertTrue(dfs.getPercentString().length() > 1);

        // Serialize...
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        new ObjectOutputStream(out).writeObject(dfs);
        byte[] bytes = out.toByteArray();

        // Deserialize...
        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
        DecimalFormatSymbols deserializedDfs = (DecimalFormatSymbols) in.readObject();
        assertEquals(-1, in.read());

        assertEquals(dfs.getMinusSign(), deserializedDfs.getMinusSign());
        assertEquals(dfs.getPercent(), deserializedDfs.getPercent());
    }

//    // http://b/18785260
//    public void testMultiCharMinusSignAndPercentage() {
//        DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.forLanguageTag("ar-AR"));
//
//        assertEquals('٪', dfs.getPercent());
//        assertEquals('-', dfs.getMinusSign());
//    }


//    /**
//     * This class exists to allow the test to access the protected methods
//     * getIcuDecimalFormatSymbols and fromIcuInstance on the real DecimalFormatSymbols class.
//     */
//    private static class DFSForTests extends DecimalFormatSymbols {
//        public DFSForTests(Locale locale) {
//            super(locale);
//        }
//
//        @Override
//        public android.icu.text.DecimalFormatSymbols getIcuDecimalFormatSymbols() {
//            return super.getIcuDecimalFormatSymbols();
//        }
//
//        protected static DecimalFormatSymbols fromIcuInstance(
//                android.icu.text.DecimalFormatSymbols dfs) {
//            return DecimalFormatSymbols.fromIcuInstance(dfs);
//        }
//    }
//
//    public void compareDfs(DecimalFormatSymbols dfs,
//                           android.icu.text.DecimalFormatSymbols icuSymb) {
//        // Check currency code is the same because ICU returns its own currency class.
//        assertEquals(dfs.getCurrency().getCurrencyCode(), icuSymb.getCurrency().getCurrencyCode());
//        assertEquals(dfs.getCurrencySymbol(), icuSymb.getCurrencySymbol());
//        assertEquals(dfs.getDecimalSeparator(), icuSymb.getDecimalSeparator());
//        assertEquals(dfs.getDigit(), icuSymb.getDigit());
//        assertEquals(dfs.getExponentSeparator(), icuSymb.getExponentSeparator());
//        assertEquals(dfs.getGroupingSeparator(), icuSymb.getGroupingSeparator());
//        assertEquals(dfs.getInfinity(), icuSymb.getInfinity());
//        assertEquals(dfs.getInternationalCurrencySymbol(),
//                icuSymb.getInternationalCurrencySymbol());
//        assertEquals(dfs.getMinusSign(), icuSymb.getMinusSign());
//        assertEquals(dfs.getMonetaryDecimalSeparator(), icuSymb.getMonetaryDecimalSeparator());
//        assertEquals(dfs.getPatternSeparator(), icuSymb.getPatternSeparator());
//        assertEquals(dfs.getPercent(), icuSymb.getPercent());
//        assertEquals(dfs.getPerMill(), icuSymb.getPerMill());
//        assertEquals(dfs.getZeroDigit(), icuSymb.getZeroDigit());
//    }
//
//    // Test the methods to convert to and from the ICU DecimalFormatSymbols
//    public void testToIcuDecimalFormatSymbols() {
//        DFSForTests dfs = new DFSForTests(Locale.US);
//        android.icu.text.DecimalFormatSymbols icuSymb = dfs.getIcuDecimalFormatSymbols();
//        compareDfs(dfs, icuSymb);
//    }
//
//    public void testFromIcuDecimalFormatSymbols() {
//        android.icu.text.DecimalFormatSymbols icuSymb = new android.icu.text.DecimalFormatSymbols();
//        DecimalFormatSymbols dfs = DFSForTests.fromIcuInstance(icuSymb);
//        compareDfs(dfs, icuSymb);
//    }

}
