/*******************************************************************************
 * 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:
 *     James - initial impl
 ******************************************************************************/
package org.eclipse.persistence.testing.tests.plsql;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

import org.eclipse.persistence.exceptions.QueryException;
import org.eclipse.persistence.sessions.DatabaseRecord;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.plsql.Address;
import org.eclipse.persistence.testing.models.plsql.Employee;
import org.eclipse.persistence.testing.models.plsql.PLSQLSystem;
import org.eclipse.persistence.testing.models.plsql.Phone;

/**
 * This model tests calling PLSQL stored procedures with PLSQL types.
 */
public class PLSQLTestModel extends TestModel {
    public PLSQLTestModel() {
        setDescription("This model tests calling PLSQL stored procedures with PLSQL types.");
    }

    public void addRequiredSystems() {
        if (!getSession().getLogin().getPlatform().isOracle()) {
            warning("PLSQL is only supported on Oracle.");
        }

        addRequiredSystem(new PLSQLSystem());
    }

    public void addTests() {
        addTest(getSimpleTestSuite());
        addTest(getRecordTestSuite());
        addTest(getCollectionTestSuite());
        addTest(getFunctionTestSuite());
        addTest(getErrorTestSuite());
    }

    public static TestSuite getErrorTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("PLSQLErrorTestSuite");
        suite.setDescription("This suite tests calling PLSQL procedures with invalid arguments.");

        List args = new ArrayList();
        PLSQLTest test = new PLSQLTest("BadAddressOut", Address.class, args, QueryException.typeNameNotSet(null));
        test.setName("BadAddressOutTest");
        suite.addTest(test);

        args = new ArrayList();
        test = new PLSQLTest("MissingTypeAddressListOut", Address.class, args, QueryException.compatibleTypeNotSet(null));
        test.setName("MissingTypeAddressListOutTest");
        suite.addTest(test);

        Employee employee = new Employee();
        employee.setId(new BigDecimal(123));
        employee.setName("Bad Jones");

        args = new ArrayList();
        DatabaseRecord result = new DatabaseRecord();
        result.put("P_EMP", employee);
        result.put("P_CITY", "Nepean");
        args.add(employee);
        args.add("Nepean");
        test = new PLSQLTest("EmployeeInOutObject", Employee.class, args, result);
        test.setName("EmptyEmployeeInOutObjectTest");
        // PLSQL does not seem to allow empty collections.
        // suite.addTest(test);

        return suite;
    }

    public static TestSuite getSimpleTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("PLSQLSimpleTestSuite");
        suite.setDescription("This suite tests calling PLSQL procedures that take simple types.");

        List args = new ArrayList();
        args.add("varchar");
        args.add(new Integer(1));
        args.add(new Integer(123));
        args.add(new BigDecimal("123.6"));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new BigDecimal("123.5"));
        PLSQLTest test = new PLSQLTest("SimpleIn", Address.class, args);
        test.setName("SimpleInTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(new Integer(1));
        args.add(new Integer(123));
        args.add(new BigDecimal("123.6"));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new BigDecimal("123.5"));
        test = new PLSQLTest("SimpleInDefaults", Address.class, args);
        test.setName("SimpleInDefaults");
        suite.addTest(test);

        args = new ArrayList();
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        args.add(null);
        test = new PLSQLTest("SimpleInDefaults2", Address.class, args);
        test.setName("SimpleInDefaults2");
        suite.addTest(test);

        args = new ArrayList();
        test = new PLSQLTest("SimpleOut", Address.class, args);
        test.setName("SimpleOutTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add("varchar");
        args.add(new Integer(1));
        args.add(new Integer(123));
        args.add(new BigDecimal("123.6"));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new BigDecimal("123.5"));
        test = new PLSQLTest("SimpleInOut", Address.class, args);
        test.setName("SimpleInOutTest");
        suite.addTest(test);

        return suite;
    }

    public static TestSuite getFunctionTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("PLSQLFunctionTestSuite");
        suite.setDescription("This suite tests calling PLSQL functions.");

        List args = new ArrayList();
        args.add("varchar");
        args.add(new Integer(1));
        args.add(new Integer(123));
        args.add(new BigDecimal("123.6"));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new Integer(1));
        args.add(new BigDecimal("123.5"));
        PLSQLTest test = new PLSQLTest("SimpleInFunc", Address.class, args);
        test.setName("SimpleInFuncTest");
        suite.addTest(test);

        Address resultAddress = new Address();
        resultAddress.setId(new BigDecimal(1234));
        resultAddress.setNumber(17);
        resultAddress.setStreet("Bank");
        resultAddress.setCity("Ottawa");
        resultAddress.setState("ON");
        
        args = new ArrayList();
        DatabaseRecord result = new DatabaseRecord();
        result.put("RESULT", resultAddress);
        test = new PLSQLTest("AddressOutObjectFunc", Address.class, args, result);
        test.setName("AddressOutFuncTest");
        suite.addTest(test);

        return suite;
    }

    public static TestSuite getRecordTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("PLSQLRecordTestSuite");
        suite.setDescription("This suite tests calling PLSQL procedures that take records.");

        Address address = new Address();
        address.setId(new BigDecimal(123));
        address.setNumber(17);
        address.setStreet("Bank");
        address.setCity("Ottawa");
        address.setState("ON");

        Address resultAddress = new Address();
        resultAddress.setId(new BigDecimal(1234));
        resultAddress.setNumber(17);
        resultAddress.setStreet("Bank");
        resultAddress.setCity("Ottawa");
        resultAddress.setState("ON");

        Phone phone = new Phone();
        phone.setAreaCode("613");
        phone.setNumber("7927711");

        Employee employee = new Employee();
        employee.setId(new BigDecimal(123));
        employee.setName("Bob Jones");
        employee.setAddress(address);
        employee.getPhones().add(phone);

        List args = new ArrayList();
        args.add(address);
        DatabaseRecord result = new DatabaseRecord();
        result.put("P_ADDRESS", resultAddress);
        PLSQLTest test = new PLSQLTest("AddressInOutObject", Address.class, args, result);
        test.setName("AddressInOutObjectTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(address.getId());
        args.add(address.getNumber());
        args.add(address.getStreet());
        args.add(address.getCity());
        args.add(address.getState());
        args.add("Local");
        result = new DatabaseRecord();
        result.put("ADDRESS_ID", resultAddress.getId());
        result.put("ADDRESS_NUM", resultAddress.getNumber());
        result.put("STREET", resultAddress.getStreet());
        result.put("CITY", resultAddress.getCity());
        result.put("STATE", resultAddress.getState());
        result.put("P_LOCAL", "Nepean");
        test = new PLSQLTest("AddressInOutData", Address.class, args);
        test.setName("AddressInOutDataTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(address.getId());
        args.add(address.getNumber());
        args.add(address.getStreet());
        args.add(address.getCity());
        args.add(address.getState());
        args.add("Local");
        test = new PLSQLTest("AddressInData", Address.class, args);
        test.setName("AddressInDataTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(address);
        test = new PLSQLTest("AddressInObject", Address.class, args);
        test.setName("AddressInObjectTest");
        suite.addTest(test);

        args = new ArrayList();
        result = new DatabaseRecord();
        result.put("P_ADDRESS", resultAddress);
        test = new PLSQLTest("AddressOutObject", Address.class, args, result);
        test.setName("AddressOutTest");
        suite.addTest(test);

        args = new ArrayList();
        result = new DatabaseRecord();
        result.put("ADDRESS_ID", resultAddress.getId());
        result.put("STREET_NUM", resultAddress.getNumber());
        result.put("STREET", resultAddress.getStreet());
        result.put("CITY", resultAddress.getCity());
        result.put("STATE", resultAddress.getState());
        result.put("P_LOCAL", "Local");
        test = new PLSQLTest("AddressOutData", Address.class, args, result);
        test.setName("AddressOutDataTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(employee);
        args.add("Nepean");
        test = new PLSQLTest("EmployeeInObject", Employee.class, args);
        test.setName("EmployeeInObjectTest");
        suite.addTest(test);

        args = new ArrayList();
        result = new DatabaseRecord();
        result.put("P_EMP", new Employee());
        result.put("P_CITY", "Nepean");
        test = new PLSQLTest("EmployeeOutObject", Employee.class, args, result);
        test.setName("EmployeeOutTest");
        suite.addTest(test);

        args = new ArrayList();
        result = new DatabaseRecord();
        result.put("P_EMP", employee);
        result.put("P_CITY", "Nepean");
        args.add(employee);
        args.add("Nepean");
        test = new PLSQLTest("EmployeeInOutObject", Employee.class, args, result);
        test.setName("EmployeeInOutObjectTest");
        suite.addTest(test);
        
        test = new PLSQLTest("AddressOutCursor", Address.class, new ArrayList(), new Vector());
        test.setName("AddressOutCursorTest");
        suite.addTest(test);
        
        test = new PLSQLTest("AddressRecOutCursor", Address.class, new ArrayList(), new Vector());
        test.setName("AddressRecOutCursorTest");
        suite.addTest(test);

        return suite;
    }

    public static TestSuite getCollectionTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("PLSQLCollectionTestSuite");
        suite.setDescription("This suite tests calling PLSQL procedures that take collections.");

        Address address = new Address();
        address.setId(new BigDecimal(123));
        address.setNumber(17);
        address.setStreet("Bank");
        address.setCity("Ottawa");
        address.setState("ON");

        Phone phone = new Phone();
        phone.setAreaCode("613");
        phone.setNumber("7927711");

        Employee employee = new Employee();
        employee.setId(new BigDecimal(123));
        employee.setName("Bob Jones");
        employee.setAddress(address);
        employee.getPhones().add(phone);

        List args = new ArrayList();
        DatabaseRecord result = new DatabaseRecord();
        List collection = new ArrayList();
        collection.add("Ottawa");
        result.put("P_CITY_LIST", collection);
        result.put("P_CITY", "Nepean");
        PLSQLTest test = new PLSQLTest("CityListOut", Address.class, args, result);
        test.setName("CityListOutTest");
        suite.addTest(test);

        args = new ArrayList();
        collection = new ArrayList(Arrays.asList(new String[] { "Ottawa", "Toronto" }));
        args.add(collection);
        args.add("Nepean");
        result = new DatabaseRecord();
        result.put("P_CITY_LIST", collection);
        result.put("P_CITY", "Nepean");
        test = new PLSQLTest("CityListInOut", Address.class, args, result);
        test.setName("CityListInOutTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(new Object[] { address, address });
        args.add("Nepean");
        test = new PLSQLTest("AddressListIn", Address.class, args);
        test.setName("AddressListInTest");
        suite.addTest(test);

        args = new ArrayList();
        result = new DatabaseRecord();
        result.put("P_ADDRESS_LIST", new ArrayList());
        result.put("P_CITY", "Nepean");
        test = new PLSQLTest("AddressListOut", Address.class, args, result);
        test.setName("AddressListOutTest");
        suite.addTest(test);

        args = new ArrayList();
        collection = new ArrayList(Arrays.asList(new Object[] { address, address }));
        args.add(collection);
        args.add("Nepean");
        result = new DatabaseRecord();
        result.put("P_ADDRESS_LIST", collection);
        result.put("P_CITY", "Nepean");
        test = new PLSQLTest("AddressListInOut", Address.class, args, result);
        test.setName("AddressListInOutTest");
        suite.addTest(test);

        args = new ArrayList();
        args.add(new Object[] { employee, employee });
        args.add("Nepean");
        test = new PLSQLTest("EmployeeListIn", Employee.class, args);
        test.setName("EmployeeListInTest");
        suite.addTest(test);

        args = new ArrayList();
        result = new DatabaseRecord();
        result.put("P_EMP_LIST", new ArrayList());
        result.put("P_CITY", "Nepean");
        test = new PLSQLTest("EmployeeListOut", Employee.class, args, result);
        test.setName("EmployeeListOutTest");
        suite.addTest(test);

        args = new ArrayList();
        collection = new ArrayList(Arrays.asList(new Object[] { employee, employee }));
        args.add(collection);
        args.add("Nepean");
        result = new DatabaseRecord();
        result.put("P_EMP_LIST", collection);
        result.put("P_CITY", "Nepean");
        test = new PLSQLTest("EmployeeListInOut", Employee.class, args, result);
        test.setName("EmployeeListInOutTest");
        suite.addTest(test);

        return suite;
    }
}
