/*
 * 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.tests.feature;

import org.eclipse.persistence.testing.models.insurance.InsuranceSystem;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.tests.queries.*;
import org.eclipse.persistence.testing.models.multipletable.ProjectSystem;
import org.eclipse.persistence.testing.models.ownership.*;
import org.eclipse.persistence.testing.models.legacy.*;
import org.eclipse.persistence.testing.tests.queries.options.*;
import org.eclipse.persistence.testing.tests.queries.repreparation.*;
import org.eclipse.persistence.testing.models.inheritance.InheritanceSystem;
import org.eclipse.persistence.testing.tests.events.EventHookTestSuite;
import org.eclipse.persistence.testing.models.events.EventHookSystem;
import org.eclipse.persistence.testing.tests.expressions.ExpressionInMemoryTestSuite;
import org.eclipse.persistence.testing.tests.expressions.ExpressionOperatorUnitTestSuite;
import org.eclipse.persistence.testing.tests.expressions.ExpressionOuterJoinTestSuite;
import org.eclipse.persistence.testing.tests.expressions.ExpressionSubSelectTestSuite;
import org.eclipse.persistence.testing.tests.expressions.ExpressionTestSuite;
import org.eclipse.persistence.testing.tests.expressions.ExpressionUnitTestSuite;
import org.eclipse.persistence.testing.tests.identitymaps.IdentityMapTestSuite;
import org.eclipse.persistence.testing.tests.transactions.ReadingThroughWriteConnectionInTransactionTest;
import org.eclipse.persistence.testing.tests.transactions.TransactionTestSuite;
import org.eclipse.persistence.testing.tests.writing.CommitOrderTest;
import org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem;
import org.eclipse.persistence.testing.tests.sessioncache.SessionCacheTestSuite;

public class FeatureTestModel extends TestModel {

    /**
     * Return the JUnit suite to allow JUnit runner to find it.
     * Unfortunately JUnit only allows suite methods to be static,
     * so it is not possible to generically do this.
     */
    public static junit.framework.TestSuite suite() {
        return new FeatureTestModel();
    }

    public FeatureTestModel() {
        setDescription("This model tests selected TopLink features using the employee demo.");
    }

    public FeatureTestModel(boolean isSRG) {
        this();
        this.isSRG = isSRG;
    }

    @Override
    public void addRequiredSystems() {
        addRequiredSystem(new EmployeeSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.aggregate.AggregateSystem());
        addRequiredSystem(new InheritanceSystem());
        addRequiredSystem(new InsuranceSystem());
        addRequiredSystem(new OwnershipSystem());
        addRequiredSystem(new LegacySystem());
        addRequiredSystem(new EventHookSystem());
        addRequiredSystem(new ProjectSystem());
        addRequiredSystem(new IdentitySystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.collections.CollectionsSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.mapping.MappingSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.sequencing.SequenceTestSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.tests.queries.report.ReportQuerySystem());
        addRequiredSystem(new org.eclipse.persistence.testing.tests.queries.options.QueryOptionSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.bigbad.BigBadSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.vehicle.VehicleSystem());
        // Force field names to upper case for custom SQL tests on postgres.
        if (getSession().getPlatform().isPostgreSQL()) {
            getSession().getPlatform().setShouldForceFieldNamesToUpperCase(true);
        }
    }

    @Override
    public void addTests() {
        addTest(new IdentityMapTestSuite());
        addTest(new ExpressionTestSuite());
        addTest(new ExpressionInMemoryTestSuite());
        addTest(new ExpressionSubSelectTestSuite());
        addTest(new ExpressionOperatorUnitTestSuite());
        addTest(new ExpressionOuterJoinTestSuite());
        addTest(new ExpressionUnitTestSuite());
        addTest(new QueryFrameworkTestSuite());
        addTest(new org.eclipse.persistence.testing.tests.queries.inmemory.CacheHitAndInMemoryTestSuite());
        addTest(new EventHookTestSuite());
        addTest(getOptimisticLockingTestSuite());
        addTest(new org.eclipse.persistence.testing.tests.queries.optimization.QueryOptimizationTestSuite());
        addTest(new org.eclipse.persistence.testing.tests.queries.report.ReportQueryTestSuite());
        addTest(new TransactionTestSuite());
        addTest(getReadingThroughWriteConnectionSuite());
        addTest(getIntegrityCheckerTestSuite());
        addTest(getExceptionHandlerTestSuite());
        addTest(getMessageLoggingTestSuite());
        addTest(getFieldedMessageLoggingTestSuite());
        addTest(getNullValueTestSuite());
        addTest(getMiscTestSuite());
        if (!getExecutor().isServer) {
            addTest(getJNDIConnectionTestSuite());
        }
        addTest(getCustomSequenceTestSuite());
        addTest(getSequenceTestSuite());
        addTest(getCopyingTestSuite());
        addTest(new QueryOptionTestSuite());
        addTest(new QueryRepreparationTestSuite());
        addTest(getDatabaseLoginCodeCoverageTestSuite());
        addTest(getInstantiationPoicyTestSuite());
        addTest(new SessionCacheTestSuite());
        addTest(getSessionAPITestSuite());
        addTest(new CommitOrderTest());
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    @Override
    public void addSRGTests() {
        addTest(new ExpressionTestSuite(true));
        addTest(new QueryFrameworkTestSuite(true));
        addTest(new TransactionTestSuite(true));
        addTest(new EventHookTestSuite(true));
    }

    // For CR#4334, test reading through write connection when in transaction and
    // using a client/server setup.
    //
    public static TestSuite getReadingThroughWriteConnectionSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("ReadingThroughWriteConnectionSuite");
        suite.setDescription("This suite tests reading through write connection when in transaction and using a client/server.");
        suite.addTests(ReadingThroughWriteConnectionInTransactionTest.buildTests());
        return suite;
    }
    // CR3855


    public static TestSuite getDatabaseLoginCodeCoverageTestSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("DatabaseLoginCodeCoverageTestSuite");
        suite.setDescription("This tests code coverage for DatabaseLogin.");
        suite.addTest(new DatabaseLoginCodeCoverageTest());
        return suite;
    }

    public static TestSuite getCopyingTestSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("CopyingTestSuite");
        suite.setDescription("This tests object copying.");
        suite.addTest(new ObjectCopyingTest());
        suite.addTest(new ContainerCloningTest());
        return suite;
    }

    public static TestSuite getCustomSequenceTestSuite() {
        TestSuite suite;

        suite = new TestSuite();
        suite.setName("CustomSequenceTestSuite");
        suite.setDescription("This tests custom sequencing.");

        suite.addTest(new CustomSequenceTest());

        return suite;

    }

    public static TestSuite getExceptionHandlerTestSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("ExceptionHandler");
        suite.setDescription("This Suite tests the functionality of ExceptionHandler.");
        suite.addTest(new ExceptionHandlerTest1());
        suite.addTest(new ExceptionHandlerTest2());
        suite.addTest(new ExceptionHandlerLoginIntegrityTest());
        return suite;

    }

    public static TestSuite getMessageLoggingTestSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("Message Logging");
        suite.setDescription("This Suite tests the functionality of Logging messages.");
        suite.addTest(new MessageLoggingEfficiencyTest());
        return suite;
    }

    public static TestSuite getFieldedMessageLoggingTestSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("Fielded Message Logging");
        suite.setDescription("This Suite tests the functionality of Logging messages containing formatting strings.");
        suite.addTest(new FieldedMessageLoggingTest());
        // This test exercises the code that does a key:value lookup for messages that are not translated
        suite.addTest(new FieldedMessageLoggingTraceLocalizationTest());
        return suite;
    }


    public static TestSuite getIntegrityCheckerTestSuite() {
        TestSuite suite;

        suite = new TestSuite();
        suite.setName("Integrity Checker");
        suite.setDescription("This Suite tests the functionality of Integrity Checker.");

        suite.addTest(new IntegrityCheckerTest());
        suite.addTest(new IntegrityCheckerLazyCreationTest());
        suite.addTest(new ShouldThroughIntegrityCheckerTest());
        suite.addTest(new ShouldNotThroughIntegrityCheckerTest());
        suite.addTest(new ShouldCheckDatabaseTest());
        suite.addTest(new ShouldNotCheckDatabaseTest());

        return suite;

    }

    public static TestSuite getJNDIConnectionTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("JNDIConnectionTestSuite");
        suite.setDescription("Test connecting to a database with a JNDI-supplied DataSource");

        suite.addTest(new JNDIConnectionTest());

        return suite;
    }

    public static TestSuite getMiscTestSuite() {
        TestSuite suite;

        suite = new TestSuite();
        suite.setName("MiscellaneousTests");
        suite.setDescription("Tests that don't fit anywhere else.  Okay, sue me.");

        suite.addTest(new OptomizeValueHolderTest());
        suite.addTest(new NullPasswordLoginTest());
        suite.addTest(new HelperSystemPropertyTest());
        suite.addTest(new GermanUmlautsWriteTest());
        suite.addTest(new ReconnectFlushStatementCacheTest());
        suite.addTest(new TransactionIsolationTest());
        suite.addTest(new SessionIsConnectedFlagTest());
        suite.addTest(new ContainerIndirectionPolicySerializationTest());

        return suite;

    }

    public static TestSuite getNullValueTestSuite() {
        TestSuite suite;

        suite = new TestSuite();
        suite.setName("NullValueTestSuite");
        suite.setDescription("Test default null value settings");

        suite.addTest(new NullValueTest());
        suite.addTest(new NoDefaultNullValueTest());
        return suite;

    }

    public static TestSuite getOptimisticLockingTestSuite() {
        TestSuite suite;

        suite = new TestSuite();
        suite.setName("OptimisticLockingTestSuite");
        suite.setDescription("This suite tests the functionality of the optimistic locking feature.");

        suite.addTest(new OptimisticLockingDeleteRowTest());
        suite.addTest(new OptimisticLockingChangedValueTest());
        suite.addTest(new OptimisticLockingChangedValueUpdateTest());
        suite.addTest(new OptimisticLockingDeleteValueUpdateTest());

        return suite;

    }

    public static TestSuite getSequenceTestSuite() {
        TestSuite suite;
        suite = new TestSuite();
        suite.setName("SequenceTestSuite");
        suite.setDescription("This tests both custom and regular sequencing.");
        suite.addTest(new CustomSequenceTest());
        suite.addTest(new SequencingConcurrencyTest(7, 100, false, false));
        suite.addTest(new SequencingConcurrencyTest(7, 100, false, false, 2));
        suite.addTest(new SequencingConcurrencyTest(7, 100, false, true));
        suite.addTest(new SequencingConcurrencyTest(7, 100, true, false));
        suite.addTest(new SequencingConcurrencyTest(7, 100, true, false, 2));
        suite.addTest(new SequencingConcurrencyTest(7, 100, true, true));
        suite.addTest(new SequencingRollbackTest(true));
        suite.addTest(new SequencingRollbackTest(false));
        suite.addTest(new SequenceStringPKInsertTest());
        suite.addTest(new SequenceStringExistingPKTest());
        suite.addTest(new CustomSequencingPolicyTest());
        suite.addTest(new InitializeDescriptorsBeforeLoginTest());
        suite.addTest(new SequencingTableQualifierTest(SequencingTableQualifierTest.TABLE_SEQUENCE));
        suite.addTest(new SequencingTableQualifierTest(SequencingTableQualifierTest.UNARY_TABLE_SEQUENCE));
        suite.addTest(new SequenceFieldRemovalForAcquireValueAfterInsertTest());
        suite.addTest(new CannotOverrideConnectedSequenceTest());
        return suite;
    }

    public static TestSuite getInstantiationPoicyTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("Instantiation Policy Test Suite");

        suite.setDescription("Test instantiation policy feature.");
        suite.addTest(new InstantiationPolicyTest());
        return suite;
    }

    public static TestSuite getSessionAPITestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("Session API Test Suite");

        suite.setDescription("Test Session API.");
        suite.addTest(new GetClassDescriptorForAliasTest());
        return suite;
    }

}
