/*******************************************************************************
 * 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.framework.TestModel;
import org.eclipse.persistence.testing.framework.TestSuite;
import org.eclipse.persistence.testing.models.aggregate.AggregateProject;


/**
 *  This model tests the integration between the Mapping Workbench and the foundation library.
 */
public class MappingWorkbenchIntegrationTestModel extends TestModel {
    static boolean isServer = false;

    /**
     *  The constructor provides the test description.
     */
    public MappingWorkbenchIntegrationTestModel() {
        setDescription("This model tests the integration between the Mapping Workbench and the foundation library.");
    }

    public void addTests() {
        isServer = getExecutor().isServer;
        addTest(new XMLProjectWriterTestModel());
        //the following model has been commented out due to bug 5483044
        if (!isServer) {
            addTest(new ProjectClassGeneratorTestModel());
        }

        //Integration Code Coverage Tests
        addTest(getIntegrationTestSuite());

        //UTF-8 support
        addTest(getUTF8TestSuite());

        //Returning Policy support
        addTest(getReturningPolicyTestSuite());

        //Multiple sequences support
        addTest(getSequencingTestSuite());
    }

    public static TestSuite getIntegrationTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("IntegrationTestSuite");
        suite.setDescription("Contains integration tests for Code coverage");
        suite.addTest(new CopyPolicyBuildsNewInstanceTest());
        suite.addTest(new FactoryClassIsNullTest());
        suite.addTest(new FactoryMethodNameIsNotNullTest());
        suite.addTest(new FactoryMethodNameIsNullTest());
        suite.addTest(new ProjectClassGeneratorWithVariablesTest());
        suite.addTest(new ShouldAlwaysConformResultsInUnitOfWorkTest());
        suite.addTest(new ShouldAlwaysRefreshCacheOnRemoteTest());
        suite.addTest(new ShouldAlwaysRefreshCacheTest());
        suite.addTest(new ShouldBeReadOnlyTest());
        suite.addTest(new IsIsolatedTest());
        suite.addTest(new ShouldDisableCacheHitsOnRemoteTest());
        suite.addTest(new ShouldDisableCacheHitsTest());
        suite.addTest(new ShouldOnlyRefreshCacheIfNewerVersionTest());
        suite.addTest(new ShouldUseCacheIdentityMapTest());
        suite.addTest(new ShouldUseHardCacheWeakIdentityMapTest());
        suite.addTest(new ShouldUseNoIdentityMapTest());
        suite.addTest(new ShouldUseRemoteCacheIdentityMapTest());
        suite.addTest(new ShouldUseRemoteHardCacheWeakIdentityMap());
        suite.addTest(new ShouldUseRemoteNoIdentityMapTest());
        suite.addTest(new ShouldUseRemoteWeakIdentityMap());
        suite.addTest(new ShouldUseWeakIdentityMapTest());
        suite.addTest(new GetAboutToInsertSelectorIsNotNullTest());
        suite.addTest(new GetAboutToUpdateSelectorIsNotNullTest());
        suite.addTest(new GetPostBuildSelectorIsNotNullTest());
        suite.addTest(new GetPostCloneSelectorIsNotNullTest());
        suite.addTest(new GetPostDeleteSelectorIsNotNullTest());
        suite.addTest(new GetPostInsertSelectorIsNotNullTest());
        suite.addTest(new GetPostMergeSelectorIsNotNullTest());

        suite.addTest(new BuildConstructorPorjectsDefaultReadOnlyClassesIsNotEmptyTest());
        suite.addTest(new BuildDescriptorAddMultipleTableForeignKeyFieldNameTest());
        suite.addTest(new BuildDescriptorIsForInterfaceTrueTest());
        suite.addTest(new CollectionMappingIsMapPolicyTest());
        suite.addTest(new GetClassExtractionMethodNameIsNotNullTest());
        suite.addTest(new GetPostRefreshSelectorIsNotNullTest());
        suite.addTest(new GetPostUpdateSelectorIsNotNullTest());
        suite.addTest(new GetPostWriteSelectorIsNotNullTest());
        suite.addTest(new GetPreDeleteSelectorIsNotNullTest());
        suite.addTest(new GetPreInsertSelectorIsNotNullTest());
        suite.addTest(new GetPreUpdateSelectorIsNotNullTest());
        suite.addTest(new GetPreWriteSelectorIsNotNullTest());
        suite.addTest(new GetReadAllSubclassesViewIsNotNullTest());
        suite.addTest(new GetRelationshipPartnerAttributeNameIsNotNullTest());
        suite.addTest(new GettersAndSettersForProjectClassGeneratorTest());
        suite.addTest(new MappingIsReadOnlyTest());
        suite.addTest(new NamedQueryLinesGetEJBQLStringIsNotNullTest());
        suite.addTest(new NamedQueryLinesIGetSQLStringIsNotNullTest());
        suite.addTest(new NamedQueryLinesIsReadObjectQueryTest());
        suite.addTest(new NamedQueryLinesRedirectorNotNullTest());
        suite.addTest(new OneToOneMappingShouldUseJoiningTest());
        suite.addTest(new OneToOneMappingShouldVerifyDeleteTest());
        suite.addTest(new OptimisticLockingLinesSelectedFieldsLockingPolicyTest());
        suite.addTest(new QueryKeyIsAbstractQueryKeyTest());
        suite.addTest(new QueryManagerHasDeleteQueryIsSQLCallQueryTest());
        suite.addTest(new QueryManagerHasDoesExistQueryIsSQLCallQueryTest());
        suite.addTest(new QueryManagerHasInsertQueryIsSQLCallQueryTest());
        suite.addTest(new QueryManagerHasReadAllQueryIsSQLCallQueryTest());
        suite.addTest(new QueryManagerHasReadObjectQueryIsSQLCallQueryTest());
        suite.addTest(new QueryManagerHasUpdateQueryIsSQLCallQueryTest());
        suite.addTest(new QueryManagerPropertyLinesAssumeExistenceForDoesExistTest());
        suite.addTest(new QueryManagerPropertyLinesAssumeNonExistenceForDoesExistTest());
        suite.addTest(new ShouldUseBatchReadingOnMappingTest());
        suite.addTest(new ShouldUseClassNameAsIndicatorTest());
        suite.addTest(new TimestampLockingPolicyUseLocalTimeTest());
        suite.addTest(new TransformationMappingUsesBasicIndirectionTest());
        suite.addTest(new TransparentIndirectionPolicyInstanceTest());
        suite.addTest(new UseCollectionClassOnMappingTest());
        suite.addTest(new UseTransparentMapOnCollectionMapping());
        suite.addTest(new VariableOneToOneMappingClassIndicatorFieldTest());
        suite.addTest(new VariableOneToOneMappingUniquePKTest());
        suite.addTest(new VersionLockingPolicyStoreInObjectTest());
        suite.addTest(new DuplicateDescriptorNameTest());
        suite.addTest(new ProjectClassGeneratorWriteMethodTest());
        suite.addTest(new ProjectXMLSortedCollectionMapping());
        suite.addTest(new ProjectXMLSortedCollectionMappingWithInvalidComparatorTest());

        //following test has been commented out due to bug 5483044
        if (!isServer) {
            suite.addTest(new ProjectClassGeneratorWithCMPDescriptorTest());
        }

        ProjectClassGeneratorResultFileTest test = 
            new ProjectClassGeneratorResultFileTest(new AggregateProject(), ".addFieldNameTranslation");
        test.setName("AddFieldNameTranslationTest");
        suite.addTest(test);

        test = 
new ProjectClassGeneratorResultFileTest(new org.eclipse.persistence.testing.models.relationshipmaintenance.RelationshipsProject(), 
                                        ".useTransparentCollection();");
        test.setName("UseTransparentCollectionTest");
        suite.addTest(test);

        test = 
new ProjectClassGeneratorResultFileTest(new org.eclipse.persistence.testing.models.mapping.MappingProject(), "SerializedObjectConverter");
        test.setName("SerializedObjectMappingTest");
        suite.addTest(test);

        test = new ProjectClassGeneratorResultFileTest(new EmployeeSubProject(), "addAscendingOrdering(\"id\")");
        test.setName("AscendingOrderingTest");
        suite.addTest(test);

        test = new ProjectClassGeneratorResultFileTest(new EmployeeSubProject(), "addDescendingOrdering(\"id\")");
        test.setName("DescendingOrderingTest");
        suite.addTest(test);

        test = new ProjectClassGeneratorResultFileTest(new EmployeeSubProject(), "new java.util.Date");
        test.setName("DatePrintTest");
        suite.addTest(test);

        test = new ProjectClassGeneratorResultFileTest(new EmployeeSubProject(), ".useContainerIndirection(");
        test.setName("ContainerIndirectionTransformationMappingTest");
        suite.addTest(test);

        test = 
new ProjectClassGeneratorResultFileTest(new org.eclipse.persistence.testing.models.transparentindirection.CustomIndirectContainerProject(), 
                                        ".useContainerIndirection(");
        test.setName("ContainerIndirectionForeignReferenceMappingTest");
        suite.addTest(test);

        suite.addTest(new RuntimeCustomSQLQueriesTest());
        suite.addTest(new CMPDescriptorPessimisticLockingTest());
        suite.addTest(new MapPolicyIndirectionTest());

        // Bug 5170735 - PROJECTCLASSGENERATOR GENERATES NON-COMPILING CODE FOR TYPECONVERSIONCONVERTER
        suite.addTest(new TypeConversionConverterDataClassIsArrayTest(byte[].class));
        suite.addTest(new TypeConversionConverterDataClassIsArrayTest(Byte[].class));
        suite.addTest(new TypeConversionConverterDataClassIsArrayTest(char[].class));
        suite.addTest(new TypeConversionConverterDataClassIsArrayTest(Character[].class));
         
        suite.addTest(new TypeConversionConverterObjectClassIsArrayTest(byte[].class));
        suite.addTest(new TypeConversionConverterObjectClassIsArrayTest(Byte[].class));
        suite.addTest(new TypeConversionConverterObjectClassIsArrayTest(char[].class));
        suite.addTest(new TypeConversionConverterObjectClassIsArrayTest(Character[].class));

        return suite;
    }

    public static TestSuite getUTF8TestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("UTF8TestSuite");
        suite.setDescription("Contains tests to test only UTF-8 is supported.");

        suite.addTest(new ProjectXMLUTF8EncodingTest());
        suite.addTest(new ProjectXMLUTF16EncodingTest());
        return suite;
    }

    public static TestSuite getReturningPolicyTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("ReturningPolicyTestSuite");
        suite.addTest(ReturningPolicyWorkbenchIntegrationTest.projectXML());
        //following model has been commented out due to bug 5483044
        if (!isServer) {
            suite.addTest(ReturningPolicyWorkbenchIntegrationTest.projectClassGenerated());
        }

        return suite;
    }

    public static TestSuite getSequencingTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("SequencingTestSuite");
        suite.addTest(SequencingWorkbenchIntegrationTest.projectXML());
        //following model has been commented out due to bug 5483044
        if (!isServer) {
            suite.addTest(SequencingWorkbenchIntegrationTest.projectClassGenerated());
        }

        return suite;
    }
}
