/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.oxm.xmlconversionmanager;

import java.math.BigDecimal;
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
import org.eclipse.persistence.testing.oxm.OXTestCase;

public class DoubleToBigDecimalTestCases extends OXTestCase {

    XMLConversionManager xmlConversionManager;

    @Override
    public void setUp() {
        xmlConversionManager = XMLConversionManager.getDefaultXMLManager();
    }

    public DoubleToBigDecimalTestCases(String name) {
        super(name);
    }

    public void testConvertDoubleToBigDecimal1() {
        String controlString = "1.1";
        Double controlDouble = Double.valueOf(controlString);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals(controlString, testString);
    }

    public void testConvertDoubleToBigDecimal2a() {
        String controlString = "1";
        Double controlDouble = Double.valueOf(1);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals(controlString, testString);
    }

    public void testConvertDoubleToBigDecimal2b() {
        String controlString = "1";
        Double controlDouble = Double.valueOf(1.0);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals(controlString, testString);
    }

    public void testConvertDoubleToBigDecimal3a() {
        String controlString = "1.0E-10";
        Double controlDouble = Double.valueOf(controlString);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals(controlString, testString);
    }

    public void testConvertDoubleToBigDecimal3b() {
        String controlString = "0.00000000010";
        Double controlDouble = Double.valueOf(controlString);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals("1.0E-10", testString);
    }

    public void testConvertDoubleToBigDecimal4a() {
        String controlString = "1000000000";
        Double controlDouble = Double.valueOf(1000000000);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals("1.0E+9", testString);
    }

    public void testConvertDoubleToBigDecimal4b() {
        String controlString = "1000000000";
        Double controlDouble = Double.valueOf(1000000000.0);
        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
        String testString = String.valueOf(testBigDecimal);
        assertEquals("1.0E+9", testString);
    }

}
