/*
 * Copyright (c) 1998, 2020 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.tests.workbenchintegration;

import org.eclipse.persistence.testing.tests.proxyindirection.ProxyIndirectionTestModel;
import org.eclipse.persistence.testing.framework.TestModel;
import org.eclipse.persistence.testing.framework.TestSuite;
import org.eclipse.persistence.testing.framework.TestWarningException;
import org.eclipse.persistence.testing.tests.aggregate.AggregateTestModel;
import org.eclipse.persistence.testing.tests.directmap.DirectMapMappingBatchReadTest;
import org.eclipse.persistence.testing.tests.directmap.DirectMapMappingDeleteTest;
import org.eclipse.persistence.testing.tests.directmap.DirectMapMappingIndirectionTest;
import org.eclipse.persistence.testing.tests.directmap.MergeChangeSetWithDirectMapMappingTest;
import org.eclipse.persistence.testing.tests.employee.EmployeeBasicTestModel;
import org.eclipse.persistence.testing.tests.insurance.InsuranceObjectRelationalTestModel;
import org.eclipse.persistence.testing.tests.interfaces.InterfaceWithoutTablesTestModel;
import org.eclipse.persistence.testing.tests.mapping.MappingTestModel;
import org.eclipse.persistence.testing.tests.multipletable.MultipleTableModel;


/**
 *  This model tests mapping workbench integration with the foundation library
 *  by writing and reading project .xml files and then running some operations on them.
 */
public class XMLProjectWriterTestModel extends TestModel {

    /**
     *  The constructor provides the test description.
     */
    public XMLProjectWriterTestModel() {
        setDescription("This model tests mapping workbench integration with the foundation library by writing and reading project .xml files and then running some operations on them.");
    }

    /**
     *  Add the Mapping Workbench Integration test system.
     */
    public void addRequiredSystems() {
        addRequiredSystem(new EmployeeWorkbenchIntegrationSystem());
        addRequiredSystem(new InheritanceWorkbenchIntegrationSystem());
        addRequiredSystem(new AggregateWorkbenchIntegrationSystem());
        addRequiredSystem(new InterfaceWorkbenchIntegrationSystem());
        addRequiredSystem(new DirectMapMappingMWIntergrationSystem());
        addRequiredSystem(new CMWorkbenchIntegrationSystem());
        addRequiredSystem(new ProxyIndirectionMWIntegrationSystem());
        if(this.getSession().getPlatform().isOracle9()) {
            addRequiredSystem(new InsuranceORWorkbenchIntegrationSystem());
        }
        addRequiredSystem(new MappingModelWorkbenchIntegrationSystem());
        addRequiredSystem(new MultipleTableModelWorkbenchIntegrationSystem());
    }

    public void addTests() {
        // Employee Tests
        TestSuite employeeSuite = new TestSuite();
        employeeSuite.setName("EmployeeModel");
        employeeSuite.addTest(EmployeeBasicTestModel.getReadObjectTestSuite());
        employeeSuite.addTest(EmployeeBasicTestModel.getUpdateObjectTestSuite());
        employeeSuite.addTest(EmployeeBasicTestModel.getInsertObjectTestSuite());
        employeeSuite.addTest(EmployeeBasicTestModel.getDeleteObjectTestSuite());
        employeeSuite.addTest(EmployeeBasicTestModel.getReadAllTestSuite());
        addTest(employeeSuite);

        // Inheritance Tests
        TestSuite inheritanceSuite = new TestSuite();
        inheritanceSuite.setName("InheritanceModel");
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getDuplicateFieldTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getReadObjectTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getReadAllTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getDeleteObjectTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getInsertObjectTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getUpdateObjectTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getUnitOfWorkTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getUnitOfWorkCommitResumeTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getDeepInheritanceTestSuite());
        inheritanceSuite.addTest(org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel.getTranslatedKeyInheritanceTestSuite());
        addTest(inheritanceSuite);

        // Aggregate Tests
        TestSuite aggregateSuite = new TestSuite();
        aggregateSuite.setName("AggregateModel");
        boolean useNewAggregateCollectionOriginal = AggregateTestModel.useNewAggregateCollection;
        // MW doesn't support new AggregateCollection apis - temporary set the flag to false
        AggregateTestModel.useNewAggregateCollection = false;
        aggregateSuite.addTest(AggregateTestModel.getReadObjectTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getUpdateObjectTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getReadAllTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getDeleteObjectTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getInsertObjectTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getUnitOfWorkTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getUnitOfWorkCommitResumeTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getCheckForNullUnitOfWorkTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getMergingUnitOfWorkTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getDescriptorPropertiesTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getEventTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getNestedAggregateTestSuite());
        aggregateSuite.addTest(AggregateTestModel.getAggregateInheritanceTestSuite());
        // reset the original value
        AggregateTestModel.useNewAggregateCollection = useNewAggregateCollectionOriginal;
        addTest(aggregateSuite);

        // Interface Tests
        TestSuite interfaceSuite = new TestSuite();
        interfaceSuite.setName("InterfaceModel");
        interfaceSuite.addTest(InterfaceWithoutTablesTestModel.getReadObjectTestSuite());
        interfaceSuite.addTest(InterfaceWithoutTablesTestModel.getUpdateObjectTestSuite());
        interfaceSuite.addTest(InterfaceWithoutTablesTestModel.getReadAllTestSuite());
        interfaceSuite.addTest(InterfaceWithoutTablesTestModel.getDeleteObjectTestSuite());
        interfaceSuite.addTest(InterfaceWithoutTablesTestModel.getInsertObjectTestSuite());
        addTest(interfaceSuite);

        //ExpressionPersistenceTests
        addTest(new org.eclipse.persistence.testing.tests.workbenchintegration.ExpressionPersistence.ExpressionPersistenceTestSuite());

        //ReportQuery
        addTest(new org.eclipse.persistence.testing.tests.workbenchintegration.ExpressionPersistence.ReportQueryTestSuite());

        //Query options
        addTest(new org.eclipse.persistence.testing.tests.workbenchintegration.QueryOptions.QueryOptionTestSuite());

        TestSuite readAndWriteSuite = new TestSuite();
        readAndWriteSuite.setName("XMLReadAndWriteSuite");
        readAndWriteSuite.setDescription("Tests to ensure various project options are properly read and written in XML.");
        readAndWriteSuite.addTest(new QueryShouldMaintainCacheTest());
        readAndWriteSuite.addTest(new ProjectXMLDatabaseTableNameTest());
        readAndWriteSuite.addTest(new ProjectXMLOrderByQueryKeysTest());
        readAndWriteSuite.addTest(new ProjectXMLQueryManagerQueryOrderTest());
        readAndWriteSuite.addTest(new EventListenerCollectionTest()); //bug 295383
        addTest(readAndWriteSuite);

        TestSuite mappingSuite = new TestSuite();
        mappingSuite.setName("MappingSuite");
        mappingSuite.setDescription("Tests to ensure mappings are properly written to and read from XML.");
        mappingSuite.addTest(new DirectMapMappingTest());
        mappingSuite.addTest(new MergeChangeSetWithDirectMapMappingTest());
        mappingSuite.addTest(new DirectMapMappingDeleteTest());
        mappingSuite.addTest(new DirectMapMappingBatchReadTest());
        mappingSuite.addTest(new DirectMapMappingIndirectionTest());
        addTest(mappingSuite);

        TestSuite proxyIndirectSuite = new TestSuite();
        proxyIndirectSuite.setName("ProxyIndirectionSuite");
        proxyIndirectSuite.setDescription("Tests to ensure proxy indirection is properly written to and read from XML.");
        proxyIndirectSuite.addTest(ProxyIndirectionTestModel.getDeleteTestSuite());
        proxyIndirectSuite.addTest(ProxyIndirectionTestModel.getReadTestSuite());
        proxyIndirectSuite.addTest(ProxyIndirectionTestModel.getUnitOfWorkTestSuite());
        proxyIndirectSuite.addTest(ProxyIndirectionTestModel.getWriteTestSuite());
        proxyIndirectSuite.addTest(ProxyIndirectionTestModel.getProxyObjectTestSuite());
        addTest(proxyIndirectSuite);

        //Insurance model test
        class TestSuiteOracleOnly extends TestSuite {
            public void setup() {
                if(!getSession().getPlatform().isOracle9()) {
                    throw new TestWarningException("This test suite is intended for Oracle databases only.");
                }
            }
        }
        TestSuiteOracleOnly insuranceORTestSuite = new TestSuiteOracleOnly();
        insuranceORTestSuite.setName("InsuranceORTestModel");
        insuranceORTestSuite.setDescription("Tests to enusre Insurance - object relationship descriptor - is properly written to and read from XML.");
        insuranceORTestSuite.addTest(InsuranceObjectRelationalTestModel.getDeleteObjectTestSuite());
        insuranceORTestSuite.addTest(InsuranceObjectRelationalTestModel.getInsertObjectTestSuite());
        insuranceORTestSuite.addTest(InsuranceObjectRelationalTestModel.getReadAllTestSuite());
        insuranceORTestSuite.addTest(InsuranceObjectRelationalTestModel.getReadObjectTestSuite());
        insuranceORTestSuite.addTest(InsuranceObjectRelationalTestModel.getUpdateObjectTestSuite());
        addTest(insuranceORTestSuite);

        // Mapping model test
        TestSuite mappingTestSuite = new TestSuite();
        mappingTestSuite.setName("MappingTestModel");
        mappingTestSuite.setDescription("Tests to enusre mapping model is properly written to and read from XML.");
        mappingTestSuite.addTest(MappingTestModel.getReadObjectTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getReadAllTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getDeleteObjectTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getInsertObjectTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getUpdateObjectTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getUnitOfWorkTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getPublic1MTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getPrivateMMTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getTransformationMappingTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getUnitOfWorkCommitResumeTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getBidirectionalUnitOfWorkTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getAdditionalJoinTest());
        mappingTestSuite.addTest(MappingTestModel.getBuildSelectionCriteriaTestSuite());
        mappingTestSuite.addTest(MappingTestModel.getSameNameMappingTestSuite());
        addTest(mappingTestSuite);

        // Multiple table model test
        TestSuite multipleTableTestSuite = new TestSuite();
        multipleTableTestSuite.setName("MultipleTableTestModel");
        MultipleTableModel.addTestsToTestCollection(multipleTableTestSuite);
        addTest(multipleTableTestSuite);
    }
}
