/*******************************************************************************
 * 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.inheritance;

import java.util.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.testing.models.inheritance.*;
import org.eclipse.persistence.testing.tests.writing.ComplexDeleteTest;

/**
 * This test model tests basic CRUD operations with complex inheritance models.
 * It also tests some complex querying and unit of work inheritance use cases.
 */
public class InheritanceTestModel extends TestModel {
    public InheritanceTestModel() {
    }

    public InheritanceTestModel(boolean isSRG) {
        this();
        this.isSRG = isSRG;
    }

    public void addRequiredSystems() {
        addRequiredSystem(new InheritanceSystem());
    }

    public void addTests() {
        addTest(getDuplicateFieldTestSuite());
        addTest(getReadObjectTestSuite());
        addTest(getReadAllTestSuite());
        addTest(getDeleteObjectTestSuite());
        addTest(getInsertObjectTestSuite());
        addTest(getUpdateObjectTestSuite());
        addTest(getUnitOfWorkTestSuite());
        addTest(getUnitOfWorkCommitResumeTestSuite());
        addTest(getDeepInheritanceTestSuite());
        addTest(getTranslatedKeyInheritanceTestSuite());
        addTest(getSingleInheritanceTestSuite());
        addTest(new CursoredStreamInheritanceTestCase());
        addTest(new ReinitializeJoiningOnClassDescriptorWithInheritanceTest());
        addTest(new UnitOfWorkIdentityMapAccessorTest());
        // EL bug 378512
        addTest(new NestedUnitOfWorkMergeIntoParentTest());
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public void addSRGTests() {
        addTest(getSRGDuplicateFieldTestSuite());
        addTest(getSRGReadObjectTestSuite());
        addTest(getSRGReadAllTestSuite());
        addTest(getSRGDeleteObjectTestSuite());
        addTest(getSRGInsertObjectTestSuite());
        addTest(getSRGUpdateObjectTestSuite());
        addTest(getSRGUnitOfWorkTestSuite());
        addTest(getSRGUnitOfWorkCommitResumeTestSuite());
        addTest(getSRGDeepInheritanceTestSuite());
        addTest(getSRGTranslatedKeyInheritanceTestSuite());
        addTest(getSRGSingleInheritanceTestSuite());
    }

    public static TestSuite getDeepInheritanceTestSuite() {
        TestSuite suite = getSRGDeepInheritanceTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGDeepInheritanceTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("Deep Inheritance Tests");
        suite.addTest(new LeafQueryTest());
        suite.addTest(new SecondaryTableUpdateTest());
        return suite;
    }

    public static TestSuite getDeleteObjectTestSuite() {
        TestSuite suite = getSRGDeleteObjectTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGDeleteObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceDeleteObjectTestSuite");
        suite.setDescription("This suite tests the deletion of each object in the inheritance model.");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new DeleteObjectTest(manager.getObject(Cat.class, "catExample1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Dog.class, "dogExample1")));

        suite.addTest(new DeleteObjectTest(manager.getObject(Cat.class, "catExample2")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Dog.class, "dogExample2")));

        suite.addTest(new DeleteObjectTest(manager.getObject(Cat.class, "catExample3")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Dog.class, "dogExample3")));

        suite.addTest(new DeleteObjectTest(manager.getObject(Person.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(SalesRep.class, "example3")));

        suite.addTest(new DeleteObjectTest(manager.getObject(Company.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Company.class, "example2")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Company.class, "example3")));

        suite.addTest(new DeleteObjectTest(manager.getObject(Mac.class, "example1")));

        suite.addTest(new DeleteObjectTest(manager.getObject(IBMPC.class, "example2")));
        suite.addTest(new DeleteObjectTest(manager.getObject(IBMPC.class, "example3")));
        suite.addTest(new DeleteObjectTest(manager.getObject(PC.class, "example4")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Mainframe.class, "example5")));

        Vector dependants = new Vector(1);
        Alligator alligator = (Alligator)manager.getObject(Alligator.class, "example1");
        dependants.add(alligator.getLatestVictim());
        suite.addTest(new ComplexDeleteTest(alligator, dependants));
        return suite;
    }

    public static TestSuite getDuplicateFieldTestSuite() {
        TestSuite suite = getSRGDuplicateFieldTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGDuplicateFieldTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceDuplicateFieldTestSuite");
        suite.setDescription("This suite tests ther read from the root class generated duplicate filed in SQL in the inheritance model.");

        //duplicate field SQL testing read
        ReadAllTest rs = new ReadAllTest(A_King2.class, 5);
        ReadAllQuery rq = new ReadAllQuery(A_King2.class);
        rq.addAscendingOrdering("foo");
        rs.setQuery(rq);
        suite.addTest(rs);
        return suite;
    }

    public static TestSuite getInsertObjectTestSuite() {
        TestSuite suite = getSRGInsertObjectTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGInsertObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceInsertObjectTestSuite");
        suite.setDescription("This suite tests the insertion of each object in the inheritance model.");

        suite.addTest(new InsertObjectTest(Cat.example4()));
        suite.addTest(new InsertObjectTest(Dog.example4()));

        suite.addTest(new InsertObjectTest(Company.example1()));
        suite.addTest(new InsertObjectTest(Company.example2()));
        suite.addTest(new InsertObjectTest(Company.example3()));

        suite.addTest(new InsertObjectTest(Person.example1()));
        suite.addTest(new InsertObjectTest(Person.example3()));
        suite.addTest(new InsertObjectTest(Person.example6()));

        suite.addTest(new InsertObjectTest(Car.example1()));
        suite.addTest(new InsertObjectTest(Car.example2()));
        suite.addTest(new InsertObjectTest(Car.example3()));
        suite.addTest(new InsertObjectTest(Car.example4()));

        suite.addTest(new InsertObjectTest(Computer.example1()));
        suite.addTest(new InsertObjectTest(Computer.example2()));
        suite.addTest(new InsertObjectTest(Computer.example3()));
        suite.addTest(new InsertObjectTest(Computer.example4()));
        suite.addTest(new InsertObjectTest(Computer.example5()));

        //insert using native sequencing in the branch class Aug.18, 1999
        suite.addTest(new InsertObjectTest(Developer_King.exp2()));
        suite.addTest(new InsertObjectTest(Developer_King.exp3()));
        suite.addTest(new InsertObjectTest(SeniorDeveloper_King.exp4()));

        //testing subclass overriding of an inherited mapping.
        suite.addTest(new OverrideInheritedMappingTest());
        // Bug 2996585
        suite.addTest(new BindingWithShallowInsertTest());

        return suite;
    }

    public static TestSuite getReadAllTestSuite() {
        TestSuite suite = getSRGReadAllTestSuite();

        suite.addTest(new QueryInheritanceTest());
        suite.addTest(new JoinWithSecondaryTableTest());
        suite.addTest(new PaginationInheritanceTest());
        
        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGReadAllTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceReadAllTestSuite");
        suite.setDescription("This suite tests the reading of all the objects of each class in the inheritance model.");

        suite.addTest(new ReadAllTest(Cat.class, 3));
        suite.addTest(new ReadAllTest(Dog.class, 3));

        suite.addTest(new ReadAllTest(Company.class, 3));
        suite.addTest(new ReadAllTest(Person.class, 1));
        suite.addTest(new ReadAllTest(SalesRep.class, 2));
        suite.addTest(new ReadAllTest(Engineer.class, 2));
        suite.addTest(new ReadAllTest(SoftwareEngineer.class, 1));

        suite.addTest(new ReadAllTest(Computer.class, 5));
        suite.addTest(new ReadAllTest(PC.class, 4));
        suite.addTest(new ReadAllTest(IBMPC.class, 2));
        suite.addTest(new ReadAllTest(Mac.class, 1));
        suite.addTest(new ReadAllTest(Mainframe.class, 1));

        suite.addTest(new ReadAllTest(Car.class, 4));
        suite.addTest(new ReadAllTest(SportsCar.class, 1));
        suite.addTest(new ReadAllTest(Bus.class, 4));
        suite.addTest(new ReadAllTest(Bicycle.class, 3));
        suite.addTest(new ReadAllTest(Boat.class, 4));
        suite.addTest(new ReadAllTest(Vehicle.class, 19));
        suite.addTest(new ReadAllTest(NonFueledVehicle.class, 10));
        suite.addTest(new ReadAllTest(FueledVehicle.class, 1));

        suite.addTest(new ReadAllTest(A_King2.class, 5));

        return suite;
    }

    public static TestSuite getReadObjectTestSuite() {
        TestSuite suite = getSRGReadObjectTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGReadObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceReadObjectTestSuite");
        suite.setDescription("This suite test the reading of each object in the inheritance model.");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new ReadObjectTest(manager.getObject(Cat.class, "catExample1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Dog.class, "dogExample1")));

        suite.addTest(new ReadObjectTest(manager.getObject(Cat.class, "catExample2")));
        suite.addTest(new ReadObjectTest(manager.getObject(Dog.class, "dogExample2")));

        suite.addTest(new ReadObjectTest(manager.getObject(Cat.class, "catExample3")));
        suite.addTest(new ReadObjectTest(manager.getObject(Dog.class, "dogExample3")));

        suite.addTest(new ReadObjectTest(manager.getObject(Company.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Company.class, "example2")));
        suite.addTest(new ReadObjectTest(manager.getObject(Company.class, "example3")));

        Bus bus = (Bus)manager.getObject(Bus.class, "example1");
        ReadObjectTest test = new ReadObjectTest(bus);
        test.setQuery(new ReadObjectQuery(Vehicle.class, new ExpressionBuilder().get("id").equal(bus.id)));
        suite.addTest(test);

        suite.addTest(new ReadObjectTest(manager.getObject(Person.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Engineer.class, "example2")));
        suite.addTest(new ReadObjectTest(manager.getObject(SalesRep.class, "example4")));
        suite.addTest(new ReadObjectTest(manager.getObject(SoftwareEngineer.class, "example5")));
        suite.addTest(new ReadObjectTest(manager.getObject(SalesRep.class, "example3")));

        suite.addTest(new ReadObjectTest(manager.getObject(PC.class, "example4")));
        suite.addTest(new ReadObjectTest(manager.getObject(IBMPC.class, "example3")));
        suite.addTest(new ReadObjectTest(manager.getObject(IBMPC.class, "example2")));
        suite.addTest(new ReadObjectTest(manager.getObject(Mac.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Mainframe.class, "example5")));

        return suite;
    }

    public static TestSuite getTranslatedKeyInheritanceTestSuite() {
        TestSuite suite = getSRGTranslatedKeyInheritanceTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGTranslatedKeyInheritanceTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("TranslatedKeyInheritance");
        suite.setDescription("Test when a subclass has a key different from the superclass");
        suite.addTest(new TranslatedKeyInheritanceTestCase());
        return suite;
    }

    public static TestSuite getUnitOfWorkCommitResumeTestSuite() {
        TestSuite suite = getSRGUnitOfWorkCommitResumeTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGUnitOfWorkCommitResumeTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceUnitOfWorkCommitResumeTestSuite");
        suite.setDescription("This suite tests updating objects with UOW in the inheritance model using the commitAndResume method.");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new UnitOfWorkCommitResumeTest(manager.getObject(Company.class, "example1")));
        suite.addTest(new UnitOfWorkCommitResumeTest(manager.getObject(Company.class, "example2")));
        suite.addTest(new UnitOfWorkCommitResumeTest(manager.getObject(Company.class, "example3")));

        return suite;
    }

    public static TestSuite getUnitOfWorkTestSuite() {
        TestSuite suite = getSRGUnitOfWorkTestSuite();
        suite.addTest(new InfiniteRecursionWithNoDescriptorTest());
        // Add new tests here...
        return suite;
        
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGUnitOfWorkTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceUnitOfWorkTestSuite");
        suite.setDescription("This suite tests updating objects with UOW in the inheritance model.");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new UnitOfWorkTest(manager.getObject(Company.class, "example1")));
        suite.addTest(new UnitOfWorkTest(manager.getObject(Company.class, "example2")));
        suite.addTest(new UnitOfWorkTest(manager.getObject(Company.class, "example3")));

        return suite;
    }

    public static TestSuite getUpdateObjectTestSuite() {
        TestSuite suite = getSRGUpdateObjectTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGUpdateObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InheritanceUpdateObjectTestSuite");
        suite.setDescription("This suite tests the updating of each object in the inheritance model.");

        Class companyClass = Company.class;
        Class personClass = Person.class;
        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new WriteObjectTest(manager.getObject(Cat.class, "catExample1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Cat.class, "catExample1")));
        suite.addTest(new WriteObjectTest(manager.getObject(Dog.class, "dogExample1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Dog.class, "dogExample1")));

        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Cat.class, "catExample2")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Dog.class, "dogExample2")));

        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Cat.class, "catExample3")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Dog.class, "dogExample3")));

        suite.addTest(new WriteObjectTest(manager.getObject(companyClass, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(companyClass, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(companyClass, "example2")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(companyClass, "example3")));

        suite.addTest(new WriteObjectTest(manager.getObject(personClass, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(personClass, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(Engineer.class, "example2")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Engineer.class, "example2")));
        suite.addTest(new WriteObjectTest(manager.getObject(SalesRep.class, "example3")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(SalesRep.class, "example3")));

        suite.addTest(new WriteObjectTest(manager.getObject(Mac.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Mac.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(IBMPC.class, "example2")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(IBMPC.class, "example2")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(IBMPC.class, "example3")));
        suite.addTest(new WriteObjectTest(manager.getObject(PC.class, "example4")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(PC.class, "example4")));
        suite.addTest(new WriteObjectTest(manager.getObject(Mainframe.class, "example5")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Mainframe.class, "example5")));

        return suite;
    }

    public static TestSuite getSingleInheritanceTestSuite() {
        TestSuite suite = getSRGSingleInheritanceTestSuite();

        // Add new tests here...
        return suite;
    }

    //SRG test set is maintained by QA only, do NOT add any new tests into it.
    public static TestSuite getSRGSingleInheritanceTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("SingleInheritanceTestSuite");
        suite.setDescription("This suite tests an inheritance model containing only a single class .");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new SingleInheritanceTest());

        return suite;
    }
}
