/*
 * 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:
//     dmccann - September 15/2009 - 1.2 - Initial implementation
package org.eclipse.persistence.testing.sdo.helper.sdohelper;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.sdo.SDOChangeSummary;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.SDOHelper;
import org.eclipse.persistence.sdo.SDOProperty;
import org.eclipse.persistence.sdo.SDOSequence;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOCopyHelper;
import org.eclipse.persistence.sdo.helper.SDODataFactory;
import org.eclipse.persistence.sdo.helper.SDODataHelper;
import org.eclipse.persistence.sdo.helper.SDOEqualityHelper;
import org.eclipse.persistence.sdo.helper.SDOHelperContext;
import org.eclipse.persistence.sdo.helper.SDOTypeHelper;
import org.eclipse.persistence.sdo.helper.SDOXMLHelper;
import org.eclipse.persistence.sdo.helper.SDOXSDHelper;
import org.eclipse.persistence.sdo.types.SDOChangeSummaryType;
import org.eclipse.persistence.sdo.types.SDODataObjectType;
import org.eclipse.persistence.sdo.types.SDODataType;
import org.eclipse.persistence.sdo.types.SDOObjectType;
import org.eclipse.persistence.sdo.types.SDOOpenSequencedType;
import org.eclipse.persistence.sdo.types.SDOPropertyType;
import org.eclipse.persistence.sdo.types.SDOTypeType;
import org.eclipse.persistence.sdo.types.SDOWrapperType;
import org.eclipse.persistence.sdo.types.SDOXMLHelperLoadOptionsType;

import commonj.sdo.ChangeSummary;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.Sequence;
import commonj.sdo.Type;
import commonj.sdo.helper.CopyHelper;
import commonj.sdo.helper.DataFactory;
import commonj.sdo.helper.DataHelper;
import commonj.sdo.helper.EqualityHelper;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.TypeHelper;
import commonj.sdo.helper.XMLHelper;
import commonj.sdo.helper.XSDHelper;
import commonj.sdo.impl.HelperProvider;

import junit.framework.TestCase;

public class SDOHelperTestCases extends TestCase {
    HelperContext aHelperContext;
    TypeHelper typeHelper;
    XMLHelper xmlHelper;
    XSDHelper xsdHelper;
    EqualityHelper equalityHelper;
    CopyHelper copyHelper;
    DataFactory dataFactory;
    DataHelper dataHelper;
    DataObject customerTypeDO;
    List types;
    Type teamType;
    DataObject teamDO;

    @Override
    public void setUp() throws Exception {
        aHelperContext = SDOHelperContext.getHelperContext();
        typeHelper = aHelperContext.getTypeHelper();
        xmlHelper = aHelperContext.getXMLHelper();
        xsdHelper = aHelperContext.getXSDHelper();
        equalityHelper = aHelperContext.getEqualityHelper();
        copyHelper = aHelperContext.getCopyHelper();
        dataFactory = aHelperContext.getDataFactory();
        dataHelper = aHelperContext.getDataHelper();

        Reader rdr = new InputStreamReader(new FileInputStream(new File(
                "./org/eclipse/persistence/testing/sdo/schemas/Team_cs_on_root.xsd")));
        types = xsdHelper.define(rdr, null);
        teamType = typeHelper.getType("http://www.example.org", "Team");
        teamDO = dataFactory.create(teamType);
    }

    /**
     * Also tests getType method.
     */
    public void testUnwrapType() {
        assertTrue(SDOHelper.unwrap(teamType, SDOType.class) instanceof SDOType);
    }

    public void testUnwrapTypeToSDOTypeType() {
        Type typeType = typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.TYPE);
        assertTrue(SDOHelper.unwrap(typeType, SDOTypeType.class) instanceof SDOTypeType);
    }

    public void testUnwrapTypeToSDOPropertyType() {
        Type propertyType = typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.PROPERTY);
        assertTrue(SDOHelper.unwrap(propertyType, SDOPropertyType.class) instanceof SDOPropertyType);
    }

    public void testUnwrapTypeToSDOChangeSummaryType() {
        Type csType = typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.CHANGESUMMARY);
        assertTrue(SDOHelper.unwrap(csType, SDOChangeSummaryType.class) instanceof SDOChangeSummaryType);
    }

    public void testUnwrapTypeToSDODataObjectType() {
        Type doType = typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.DATAOBJECT);
        assertTrue(SDOHelper.unwrap(doType, SDODataObjectType.class) instanceof SDODataObjectType);
    }

    public void testUnwrapTypeToSDODataType() {
        Type dataType = typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.BOOLEAN);
        assertTrue(SDOHelper.unwrap(dataType, SDODataType.class) instanceof SDODataType);
    }

    public void testUnwrapTypeToSDOOpenSequencedType() {
        Type osType = typeHelper.getType(SDOConstants.ORACLE_SDO_URL, "OpenSequencedType");
        assertTrue(SDOHelper.unwrap(osType, SDOOpenSequencedType.class) instanceof SDOOpenSequencedType);
    }

    public void testUnwrapTypeToSDOWrapperType() {
        Type wrapperType = new SDOWrapperType(teamType, "MyTeamTypeWrapper", (SDOTypeHelper) typeHelper);
        assertTrue(SDOHelper.unwrap(wrapperType, SDOWrapperType.class) instanceof SDOWrapperType);
    }

    public void testUnwrapTypeToSDOXMLHelperLoadOptionsType() {
        Type loType = new SDOXMLHelperLoadOptionsType((SDOTypeHelper) typeHelper, SDOHelper.getType(teamType));
        assertTrue(SDOHelper.unwrap(loType, SDOXMLHelperLoadOptionsType.class) instanceof SDOXMLHelperLoadOptionsType);
    }

    public void testUnwrapTypeToSDOObjectType() {
        Type sdoObjectType = new SDOObjectType("http://www.example.org", "Team", (SDOTypeHelper) typeHelper);
        assertTrue(SDOHelper.unwrap(sdoObjectType, SDOObjectType.class) instanceof SDOObjectType);
    }

    /**
     * Also tests getProperty method.
     */
    public void testUnwrapProperty() {
        Property prop = teamType.getProperty("employee");
        assertTrue(SDOHelper.unwrap(prop, SDOProperty.class) instanceof SDOProperty);
    }

    /**
     * Also tests getDataObject method.
     */
    public void testUnwrapDataObject() {
        assertTrue(SDOHelper.unwrap(teamDO, SDODataObject.class) instanceof SDODataObject);
    }

    /**
     * Also tests getChangeSummary method.
     */
    public void testCastToSDOChangeSummary() {
        ChangeSummary teamCS = teamDO.getChangeSummary();
        assertTrue(SDOHelper.unwrap(teamCS, SDOChangeSummary.class) instanceof SDOChangeSummary);
    }

    /**
     * Also tests getSequence method.
     */
    public void testUnwrapSequence() {
        Sequence teamSeq = teamDO.getSequence();
        assertTrue(SDOHelper.unwrap(teamSeq, SDOSequence.class) instanceof SDOSequence);
    }

    /**
     * Also tests getHelperContext method.
     */
    public void testUnwrapHelperContext() {
        HelperContext hCtx = HelperProvider.getDefaultContext();
        assertTrue(SDOHelper.unwrap(hCtx, SDOHelperContext.class) instanceof SDOHelperContext);
    }

    /**
     * Also tests getCopyHelper method.
     */
    public void testUnwrapCopyHelper() {
        assertTrue(SDOHelper.unwrap(copyHelper, SDOCopyHelper.class) instanceof SDOCopyHelper);
    }

    /**
     * Also tests getDataFactory method.
     */
    public void testUnwrapDataFactory() {
        assertTrue(SDOHelper.unwrap(dataFactory, SDODataFactory.class) instanceof SDODataFactory);
    }

    /**
     * Also tests getDataHelper method.
     */
    public void testUnwrapDataHelper() {
        assertTrue(SDOHelper.unwrap(dataHelper, SDODataHelper.class) instanceof SDODataHelper);
    }

    /**
     * Also tests getEqualityHelper method.
     */
    public void testUnwrapEqualityHelper() {
        assertTrue(SDOHelper.unwrap(equalityHelper, SDOEqualityHelper.class) instanceof SDOEqualityHelper);
    }

    /**
     * Also tests getTypeHelper method.
     */
    public void testUnwrapTypeHelper() {
        assertTrue(SDOHelper.unwrap(typeHelper, SDOTypeHelper.class) instanceof SDOTypeHelper);
    }

    /**
     * Also tests getXSDHelper method.
     */
    public void testUnwrapXSDHelper() {
        assertTrue(SDOHelper.unwrap(xsdHelper, SDOXSDHelper.class) instanceof SDOXSDHelper);
    }

    /**
     * Also tests getXMLHelper method.
     */
    public void testUnwrapXMLHelper() {
        assertTrue(SDOHelper.unwrap(xmlHelper, SDOXMLHelper.class) instanceof SDOXMLHelper);
    }

    public void testUnwrapXMLHelperToXMLContext() {
        assertTrue(SDOHelper.unwrap(xmlHelper, XMLContext.class) instanceof XMLContext);
    }
}
