/*******************************************************************************
 * Copyright (c) 1998, 2013 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 v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * 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);
    }
}
