/*******************************************************************************
 * 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.interfaces;

import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.models.interfaces.*;

/**
 * This model tests interface support, where the interfaces do not have tables in the database.
 */
public class InterfaceWithoutTablesTestModel extends TestModel {
    public InterfaceWithoutTablesTestModel() {
        setDescription("This model tests interface support, where the interfaces have tables in the database");
    }

    public void addRequiredSystems() {
        addRequiredSystem(new InterfaceWithoutTablesSystem());
    }

    public void addTests() {
        addTest(getReadObjectTestSuite());
        addTest(getReadAllTestSuite());
        addTest(getDeleteObjectTestSuite());
        addTest(getInsertObjectTestSuite());
        addTest(getUpdateObjectTestSuite());
        addTest(getVariable1To1TestSuite());
        addTest(getManyDescriptorTestSuite());
    }

    public static TestSuite getDeleteObjectTestSuite() {
        TestSuite suite = new TestSuite();

        suite.setName("InterfaceWithoutTablesDeleteObjectTestSuite");
        suite.setDescription("This suite tests the deletion of each object in the interface model (without tables).");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new DeleteObjectTest(manager.getObject(Film.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Documentary.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Secretary.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Receptionist.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(ProductDeveloper.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(CourseDeveloper.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(ProductManager.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(PersonnelManager.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Employee.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Phone.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Email.class, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(Company.class, "example1")));

        return suite;
    }

    public static TestSuite getInsertObjectTestSuite() {
        TestSuite suite = new TestSuite();

        suite.setName("InserfaceWithoutTablesInsertObjectTestSuite");
        suite.setDescription("This suite tests the insertion of each object in the interface model (without tables).");

        suite.addTest(new InsertObjectTest(Film.example2()));
        suite.addTest(new InsertObjectTest(Secretary.example2()));
        suite.addTest(new InsertObjectTest(Company.example3()));
        suite.addTest(new InsertObjectTest(CourseDeveloper.example1()));
        suite.addTest(new InsertObjectTest(Email.example2()));
        //suite.addTest(new InsertObjectTest(Employee.example3())); Cannot use insert test on emp as bi-1-1
        suite.addTest(new InsertObjectTest(PersonnelManager.example1()));
        suite.addTest(new InsertObjectTest(Phone.example1()));
        suite.addTest(new InsertObjectTest(ProductDeveloper.example3()));
        suite.addTest(new InsertObjectTest(ProductManager.example1()));
        suite.addTest(new InsertObjectTest(Receptionist.example1()));
        return suite;
    }

    public static TestSuite getManyDescriptorTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InterfaceWithoutTablesManyDescriptorTestSuite");
        suite.setDescription("This suite tests the support of many descriptors. (without tables).");

        suite.addTest(new DescriptorInitTest());

        return suite;
    }

    public static TestSuite getReadAllTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InterfaceWithoutTablesReadAllTestSuite");
        suite.setDescription("This suite tests the reading of all the objects of each class in the interface model (without tables).");

        ReadAllQuery query = new ReadAllQuery();
        query.setReferenceClass(Unionized.class);
        query.useCollectionClass(java.util.ArrayList.class);
        ReadAllTest aTest = new ReadAllTest(Unionized.class, 6);
        aTest.setQuery(query);
        suite.addTest(aTest);

        suite.addTest(new ReadAllTest(Actor.class, 4));
        suite.addTest(new ReadAllTest(Documentary.class, 1));
        suite.addTest(new ReadAllTest(Film.class, 3));
        suite.addTest(new ReadAllTest(Job.class, 18));
        suite.addTest(new ReadAllTest(ManagerialJob.class, 6));
        suite.addTest(new ReadAllTest(VIP.class, 3));
        // Used to test Cursored Streams
        ReadAllTest test = new ReadAllTest(VIP.class, 3);
        test.setQuery(new ReadAllQuery());
        test.getQuery().setReferenceClass(VIP.class);
        test.getQuery().useCursoredStream();
        suite.addTest(test);

        // Test the non-availability of batch reading
        test = new ReadAllBatchTest(Employee.class, 3);
        test.setName("Batch Read Test");
        test.setQuery(new ReadAllQuery());
        test.getQuery().setReferenceClass(Employee.class);
        test.getQuery().addBatchReadAttribute("contact");
        suite.addTest(test);

        suite.addTest(new OneToManyVariableBackBatchReadingTest());

        // Test cascading
        test = new ReadAllTest(Employee.class, 4);
        test.setQuery(new ReadAllQuery());
        test.getQuery().setReferenceClass(Employee.class);
        test.getQuery().cascadeAllParts();
        suite.addTest(test);

        suite.addTest(new ReadAllTest(Employee.class, 4));
        suite.addTest(new ReadAllConformInUowTest());
        return suite;
    }

    public static ReadObjectTest getReadInterfaceObjectTest() {
        TestSuite suite = new TestSuite();
        PopulationManager manager = PopulationManager.getDefaultManager();
        Contact contact = ((Employee)manager.getObject(Employee.class, "example1")).getContact();

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("id").equal(contact.getEmp().getId());

        ReadObjectQuery query = new ReadObjectQuery();
        query.setReferenceClass(ContactHolder.class);
        query.setSelectionCriteria(expression);

        ReadObjectTest test = new ReadObjectTest(contact.getEmp());
        test.setQuery(query);

        return test;
    }

    public static TestSuite getReadObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InterfaceWithoutTablesReadObjectTestSuite");
        suite.setDescription("This suite test the reading of each object in the interface model (without tables).");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new ReadObjectTest(manager.getObject(Actor.class, "example4")));
        suite.addTest(new ReadObjectTest(manager.getObject(Documentary.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Film.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Employee.class, "example2")));
        suite.addTest(new ReadObjectTest(manager.getObject(CourseDeveloper.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Email.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(PersonnelManager.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Phone.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(ProductDeveloper.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(ProductManager.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Receptionist.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Secretary.class, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(Employee.class, "example4")));
        suite.addTest(new ReadObjectTest(manager.getObject(Employee.class, "example1")));

        suite.addTest(getReadInterfaceObjectTest());

        return suite;
    }

    public static TestSuite getUpdateObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InterfaceWithoutTablesUpdateObjectTestSuite");
        suite.setDescription("This suite tests the updating of each object in the interface model (without tables).");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new WriteObjectTest(manager.getObject(Employee.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Employee.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(CourseDeveloper.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(CourseDeveloper.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(Email.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Email.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(PersonnelManager.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(PersonnelManager.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(Phone.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Phone.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(ProductDeveloper.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(ProductDeveloper.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(ProductManager.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(ProductManager.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(Receptionist.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Receptionist.class, "example1")));
        suite.addTest(new WriteObjectTest(manager.getObject(Secretary.class, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(Secretary.class, "example1")));
        suite.addTest(new UpdateObjectTest());
        suite.addTest(new VariableOneToOneNonPrivatelyOwnedTest());

        return suite;
    }

    public static QueryAcrossV11Test getV11QueryTest() {
        return new QueryAcrossV11Test();
    }

    public static TestSuite getVariable1To1TestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InterfaceWithoutTablesVariable1To1TestSuite");
        suite.setDescription("This suite tests certain aspects of the Variable 1 to 1 implementation using the interface model (without tables).");

        suite.addTest(new VariableOneToOneDeepMergeCloneTest());
        suite.addTest(new VariableOneToOneShallowWriteTest());
        suite.addTest(getV11QueryTest());
        suite.addTest(new QueryAccrossV11ProxyIndirectionTest());
        suite.addTest(new PostCommitEventPrimaryKeyTest());
        suite.addTest(new VariableOneToOneUpdateTest());
        suite.addTest(new VariableOneToOneDeleteTest());
        suite.addTest(new VariableOneToOneCodeCoverageTest());
        suite.addTest(new VariableOneToOneInsertTest());
        suite.addTest(new VariableOneToOneGetTypeFieldTest());
        return suite;
    }
}
