/*
 * Copyright (c) 2012, 2020 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:
//     Mike Norman: Jan 2012 - Initial implementation
package dbws.testing.shadowddlgeneration;

import static dbws.testing.DBWSTestSuite.DATABASE_DDL_CREATE_KEY;
import static dbws.testing.DBWSTestSuite.DATABASE_DDL_DEBUG_KEY;
import static dbws.testing.DBWSTestSuite.DATABASE_DDL_DROP_KEY;
import static dbws.testing.DBWSTestSuite.DATABASE_USERNAME_KEY;
import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_DDL_CREATE;
import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_DDL_DEBUG;
import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_DDL_DROP;
import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_USERNAME;
import static dbws.testing.DBWSTestSuite.buildConnection;
import static dbws.testing.DBWSTestSuite.removeLineTerminators;
import static dbws.testing.DBWSTestSuite.runDdl;
import static dbws.testing.shadowddlgeneration.oldjpub.Util.IS_PACKAGE;
import static org.eclipse.persistence.tools.dbws.Util.sqlMatch;
import static org.junit.Assert.assertEquals;

//javase imports
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

//EclipseLink imports
import org.eclipse.persistence.tools.dbws.oracle.ShadowDDLGenerator;
import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCollectionType;
import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLPackageType;
import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLRecordType;
import org.eclipse.persistence.tools.oracleddl.parser.ParseException;
import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypeBuilder;

//java eXtension imports

//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

//test imports
import dbws.testing.shadowddlgeneration.oldjpub.AttributeField;
import dbws.testing.shadowddlgeneration.oldjpub.MethodFilter;
import dbws.testing.shadowddlgeneration.oldjpub.PlsqlRecordType;
import dbws.testing.shadowddlgeneration.oldjpub.PlsqlTableType;
import dbws.testing.shadowddlgeneration.oldjpub.ProcedureMethod;
import dbws.testing.shadowddlgeneration.oldjpub.PublisherException;
import dbws.testing.shadowddlgeneration.oldjpub.SqlReflector;
import dbws.testing.shadowddlgeneration.oldjpub.SqlTypeWithMethods;
import dbws.testing.shadowddlgeneration.oldjpub.TypeClass;

public class ShadowDDLGenerationTestSuite {

    static final String SHADOWDDLTEST_PACKAGE = "SHADOWDDLTEST";
    static final String SHADOWDDLTEST_PROCEDURE = "P1";
    static final String SHADOWDDLTEST_RECORD_TYPE = "NUM_RECORD";
    static final String SHADOWDDLTEST_TABLE_TYPE = "NUM_TBL";
    static final String SHADOWDDLTEST_TABLE_TYPE2 = "NUM_TBL2";
    static final String SHADOWDDLTEST_TABLE_TYPE3 = "NONASSO_ARRAY";
    static final String SHADOWDDLTEST_RECORD_TYPE2 = "NUM_RECORD2";
    static final String SHADOWDDLTEST_RECORD_TYPE3 = "NUM_RECORD3";
    static final String CREATE_SHADOWDDLTEST_PACKAGE =
        "CREATE OR REPLACE PACKAGE " + SHADOWDDLTEST_PACKAGE + " AS" +
            "\nTYPE " + SHADOWDDLTEST_TABLE_TYPE + " IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;" +
            "\nTYPE " + SHADOWDDLTEST_RECORD_TYPE3 + " IS RECORD (" +
                "\nF1 VARCHAR2(10)," +
                "\nF2 NUMBER," +
                "\nF3 DATE" +
            "\n);" +
            "\nTYPE " + SHADOWDDLTEST_TABLE_TYPE3 + " IS TABLE OF VARCHAR2(20);" +
            "\nTYPE " + SHADOWDDLTEST_RECORD_TYPE + " IS RECORD (" +
                "\nN1 INTEGER," +
                "\nN2 SMALLINT," +
                "\nN3 NUMERIC," +
                "\nN4 DEC," +
                "\nN5 DECIMAL," +
                "\nN6 DECIMAL(7,2)," +
                "\nN7 NUMBER," +
                "\nN8 VARCHAR(10)," +
                "\nN9 VARCHAR2(10)," +
                "\nN10 CHAR," +
                "\nN11 REAL," +
                "\nN12 FLOAT," +
                "\nN13 DOUBLE PRECISION," +
                "\nN14 DATE," +
                "\nN15 TIMESTAMP," +
                "\nN16 CLOB," +
                "\nN17 BLOB," +
                "\nN18 LONG," +
                "\nN19 LONG RAW," +
                "\nN20 RAW(50)," +
                "\nN21 BINARY_DOUBLE," +
                "\nN22 BINARY_FLOAT," +
                "\nN23 BINARY_INTEGER," +
                "\nN24 BOOLEAN," +
                "\nN25 NATURAL," +
                "\nN26 PLS_INTEGER," +
                "\nN27 POSITIVE," +
                "\nN28 ROWID," +
                "\nN29 SIGNTYPE," +
                "\nN30 SIMPLE_INTEGER DEFAULT 0," +
                "\nN31 SIMPLE_DOUBLE DEFAULT 0," +
                "\nN32 SIMPLE_FLOAT DEFAULT 0," +
                "\nN33 " + SHADOWDDLTEST_TABLE_TYPE + "," +
                "\nN34 " + SHADOWDDLTEST_TABLE_TYPE3 + "," +
                "\nN35 " + SHADOWDDLTEST_RECORD_TYPE3 +
            "\n);" +
            "\nTYPE " + SHADOWDDLTEST_TABLE_TYPE2 + " IS TABLE OF " + SHADOWDDLTEST_RECORD_TYPE + ";" +
            "\nTYPE " + SHADOWDDLTEST_RECORD_TYPE2 + " IS RECORD (" +
                "\nA1 " + SHADOWDDLTEST_TABLE_TYPE2 + "," +
                "\nA2 " + SHADOWDDLTEST_RECORD_TYPE +
            "\n);" +
            "\nPROCEDURE " + SHADOWDDLTEST_PROCEDURE + "(NR2 IN " + SHADOWDDLTEST_RECORD_TYPE2 + ");" +
        "\nEND " + SHADOWDDLTEST_PACKAGE + ";";
    static final String CREATE_SHADOWDDLTEST_PACKAGE_BODY =
        "CREATE OR REPLACE PACKAGE BODY " + SHADOWDDLTEST_PACKAGE + " AS" +
            "\nPROCEDURE " + SHADOWDDLTEST_PROCEDURE + "(NR2 IN " + SHADOWDDLTEST_RECORD_TYPE2 + ") AS" +
            "\nBEGIN" +
                "\nnull;" +
            "\nEND " + SHADOWDDLTEST_PROCEDURE + ";" +
        "\nEND " + SHADOWDDLTEST_PACKAGE + ";";
    static final String DROP_SHADOWDDLTEST_PACKAGE =
        "DROP PACKAGE " + SHADOWDDLTEST_PACKAGE;

    //JUnit 'fixture's
    static boolean ddlCreate = false;
    static boolean ddlDrop = false;
    static boolean ddlDebug = false;
    static String username = null;
    static Connection conn = null;
    static PLSQLPackageType shadowDDLTestPackage = null;

    @BeforeClass
    public static void setUp() throws ParseException, ClassNotFoundException, SQLException {
        username = System.getProperty(DATABASE_USERNAME_KEY, DEFAULT_DATABASE_USERNAME);
        conn = buildConnection();
        String ddlCreateProp = System.getProperty(DATABASE_DDL_CREATE_KEY, DEFAULT_DATABASE_DDL_CREATE);
        if ("true".equalsIgnoreCase(ddlCreateProp)) {
            ddlCreate = true;
        }
        String ddlDropProp = System.getProperty(DATABASE_DDL_DROP_KEY, DEFAULT_DATABASE_DDL_DROP);
        if ("true".equalsIgnoreCase(ddlDropProp)) {
            ddlDrop = true;
        }
        String ddlDebugProp = System.getProperty(DATABASE_DDL_DEBUG_KEY, DEFAULT_DATABASE_DDL_DEBUG);
        if ("true".equalsIgnoreCase(ddlDebugProp)) {
            ddlDebug = true;
        }
        if (ddlCreate) {
            runDdl(conn, CREATE_SHADOWDDLTEST_PACKAGE, ddlDebug);
            runDdl(conn, CREATE_SHADOWDDLTEST_PACKAGE_BODY, ddlDebug);
        }
        shadowDDLTestPackage = new DatabaseTypeBuilder().buildPackages(conn, username,
            SHADOWDDLTEST_PACKAGE).get(0);
    }

    @AfterClass
    public static void tearDown() {
        if (ddlDrop) {
            runDdl(conn, DROP_SHADOWDDLTEST_PACKAGE, ddlDebug);
        }
    }

    @Test
    public void testOldJPubDDLGeneration() throws SQLException, PublisherException {
        SqlReflector sqlReflector = new SqlReflector(conn, username);
        SqlTypeWithMethods methodType = (SqlTypeWithMethods)sqlReflector.addSqlUserType(
            username.toUpperCase(), SHADOWDDLTEST_PACKAGE, IS_PACKAGE, true, 0, 0,
            new MethodFilter() {
                @Override
                public boolean acceptMethod(ProcedureMethod method, boolean preApprove) {
                    String methodName = method.getName();
                    if (sqlMatch(SHADOWDDLTEST_PROCEDURE, methodName)) {
                        return true;
                    }
                    return false;
                }

            }
         );
        String numRecord2CreateDDL = null;
        String numRecord2DropDDL = null;
        String numRecordCreateDDL = null;
        String numRecordDropDDL = null;
        String numTblCreateDDL = null;
        String numTblDropDDL = null;
        String numTbl2CreateDDL = null;
        String numTbl2DropDDL = null;
        String numTbl3CreateDDL = null;
        String numTbl3DropDDL = null;
        String numRecord3CreateDDL = null;
        String numRecord3DropDDL = null;
        List<ProcedureMethod> methods = methodType.getDeclaredMethods();
        for (TypeClass typeClass : methods.get(0).getParamTypes()) {
            if (typeClass.getName().contains(SHADOWDDLTEST_RECORD_TYPE2)) {
                PlsqlRecordType record2Type = (PlsqlRecordType)typeClass;
                numRecord2CreateDDL = removeLineTerminators(record2Type.getSqlTypeDecl());
                numRecord2DropDDL = removeLineTerminators(record2Type.getSqlTypeDrop());
                List<AttributeField> record2Fields = record2Type.getFields(false);
                TypeClass fieldA1 = getFieldFromRecords(record2Fields, "A1").getType();
                PlsqlTableType numTbl2Type = (PlsqlTableType)fieldA1;
                numTbl2CreateDDL = removeLineTerminators(numTbl2Type.getSqlTypeDecl());
                numTbl2DropDDL = removeLineTerminators(numTbl2Type.getSqlTypeDrop());
                TypeClass fieldA2 = getFieldFromRecords(record2Fields, "A2").getType();
                PlsqlRecordType recordType = (PlsqlRecordType)fieldA2;
                numRecordCreateDDL = removeLineTerminators(recordType.getSqlTypeDecl());
                numRecordDropDDL = removeLineTerminators(recordType.getSqlTypeDrop());
                List<AttributeField> recordFields = recordType.getFields(false);
                TypeClass fieldN33 = getFieldFromRecords(recordFields, "N33").getType();
                PlsqlTableType numTblType = (PlsqlTableType)fieldN33;
                numTblCreateDDL = removeLineTerminators(numTblType.getSqlTypeDecl());
                numTblDropDDL = removeLineTerminators(numTblType.getSqlTypeDrop());
                TypeClass fieldN34 = getFieldFromRecords(recordFields, "N34").getType();
                PlsqlTableType numTbl3Type = (PlsqlTableType)fieldN34;
                numTbl3CreateDDL = removeLineTerminators(numTbl3Type.getSqlTypeDecl());
                numTbl3DropDDL = removeLineTerminators(numTbl3Type.getSqlTypeDrop());
                TypeClass fieldN35 = getFieldFromRecords(recordFields, "N35").getType();
                PlsqlRecordType recordType3 = (PlsqlRecordType)fieldN35;
                numRecord3CreateDDL = removeLineTerminators(recordType3.getSqlTypeDecl());
                numRecord3DropDDL = removeLineTerminators(recordType3.getSqlTypeDrop());
            }
        }
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE2 +
            " does not match expected shadow DDL", numRecord2CreateDDL,
            EXPECTED_NUMRECORD2_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE2 +
            " does not match expected shadow DDL", numRecord2DropDDL,
            EXPECTED_NUMRECORD2_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE +
            " does not match expected shadow DDL", numRecordCreateDDL,
            EXPECTED_NUMRECORD_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE +
            " does not match expected shadow DDL", numRecordDropDDL, EXPECTED_NUMRECORD_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE +
            " does not match expected shadow DDL", numTblCreateDDL, EXPECTED_NUMTBL_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE +
            " does not match expected shadow DDL", numTblDropDDL, EXPECTED_NUMTBL_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE2 +
            " does not match expected shadow DDL", numTbl2CreateDDL, EXPECTED_NUMTBL2_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE2 +
            " does not match expected shadow DDL", numTbl2DropDDL, EXPECTED_NUMTBL2_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE3 +
            " does not match expected shadow DDL", numTbl3CreateDDL, EXPECTED_NUMTBL3_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE3 +
            " does not match expected shadow DDL", numTbl3DropDDL, EXPECTED_NUMTBL3_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE3 +
            " does not match expected shadow DDL", numRecord3CreateDDL , EXPECTED_NUMRECORD3_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE3 +
            " does not match expected shadow DDL", numRecord3DropDDL, EXPECTED_NUMRECORD3_DROP_SHADOWDDL);
    }

    private AttributeField getFieldFromRecords(List<AttributeField> record2Fields, String name) {
        for (AttributeField f: record2Fields) {
            if (name.equals(f.getName())) {
                return f;
            }
        }
        return null;
    }

    static final String EXPECTED_NUMRECORD2_CREATE_SHADOWDDL =
        "CREATE OR REPLACE TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE2 + " AS OBJECT (" +
        "      A1 " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE2 + "," + //original definition: NUM_TBL2
        "      A2 " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE +       //original definition: NUM_RECORD
        ");";
    static final String EXPECTED_NUMRECORD2_DROP_SHADOWDDL =
        "DROP TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE2 + " FORCE;";
    static final String EXPECTED_NUMRECORD_CREATE_SHADOWDDL =
        "CREATE OR REPLACE TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE + " AS OBJECT (" +
        "      N1 NUMBER(38)," +                //original definition: INTEGER
        "      N2 NUMBER(38)," +                //original definition: SMALLINT
        "      N3 NUMBER(38)," +                //original definition: NUMERIC
        "      N4 NUMBER(38)," +                //original definition: DEC
        "      N5 NUMBER(38)," +                //original definition: DECIMAL
        "      N6 NUMBER(7, 2)," +              //original definition: DECIMAL(7,2)
        "      N7 NUMBER," +                    //original definition: NUMBER
        "      N8 VARCHAR2(10)," +              //original definition: VARCHAR(10)
        "      N9 VARCHAR2(10)," +              //original definition: VARCHAR2(10)
        "      N10 CHAR(1)," +                  //original definition: CHAR
        "      N11 FLOAT(63)," +                //original definition: REAL
        "      N12 FLOAT(126)," +               //original definition: FLOAT
        "      N13 FLOAT(126)," +               //original definition: DOUBLE PRECISION
        "      N14 DATE," +                     //original definition: DATE
        "      N15 TIMESTAMP," +                //original definition: TIMESTAMP
        "      N16 CLOB," +                     //original definition: CLOB
        "      N17 BLOB," +                     //original definition: BLOB
        "      N18 VARCHAR2(32760)," +          //original definition: LONG
        "      N19 RAW(32760)," +               //original definition: LONG RAW
        "      N20 RAW(50)," +                  //original definition: RAW(50)
        "      N21 BINARY_DOUBLE," +            //original definition: BINARY_DOUBLE
        "      N22 BINARY_FLOAT," +             //original definition: BINARY_FLOAT
        "      N23 INTEGER," +                  //original definition: BINARY_INTEGER
        "      N24 INTEGER," +                  //original definition: BOOLEAN
        "      N25 INTEGER," +                  //original definition: NATURAL
        "      N26 INTEGER," +                  //original definition: PLS_INTEGER
        "      N27 INTEGER," +                  //original definition: POSITIVE
        "      N28 VARCHAR2(256)," +            //original definition: ROWID
        "      N29 INTEGER," +                  //original definition: SIGNTYPE
        "      N30 INTEGER," +                  //original definition: SIMPLE_INTEGER
        "      N31 BINARY_DOUBLE," +            //original definition: SIMPLE_DOUBLE
        "      N32 BINARY_FLOAT," +             //original definition: SIMPLE_FLOAT
        "      N33 " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE + "," +
        "      N34 " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE3 + "," +
        "      N35 " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE3 +
        ");";
    static final String EXPECTED_NUMRECORD_DROP_SHADOWDDL =
        "DROP TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE + " FORCE;";
    static final String EXPECTED_NUMTBL_CREATE_SHADOWDDL =
        "CREATE OR REPLACE TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE +
            " AS TABLE OF NUMBER;";
    static final String EXPECTED_NUMTBL_DROP_SHADOWDDL =
        "DROP TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE + " FORCE;";
    static final String EXPECTED_NUMTBL2_CREATE_SHADOWDDL =
        "CREATE OR REPLACE TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE2 +
            " AS TABLE OF " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE + ";";
    static final String EXPECTED_NUMTBL2_DROP_SHADOWDDL =
        "DROP TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE2 + " FORCE;";
    static final String EXPECTED_NUMTBL3_CREATE_SHADOWDDL =
        "CREATE OR REPLACE TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE3 +
            " AS TABLE OF VARCHAR2(20);";
    static final String EXPECTED_NUMTBL3_DROP_SHADOWDDL =
        "DROP TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_TABLE_TYPE3 + " FORCE;";
    static final String EXPECTED_NUMRECORD3_CREATE_SHADOWDDL =
        "CREATE OR REPLACE TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE3 + " AS OBJECT (" +
        "      F1 VARCHAR2(10)," +
        "      F2 NUMBER," +
        "      F3 DATE" +
        ");";
    static final String EXPECTED_NUMRECORD3_DROP_SHADOWDDL =
        "DROP TYPE " + SHADOWDDLTEST_PACKAGE + "_" + SHADOWDDLTEST_RECORD_TYPE3 + " FORCE;";

    @Test
    public void testNewShadowDDLGeneration() {
        ShadowDDLGenerator shadowDDLGenerator = new ShadowDDLGenerator(shadowDDLTestPackage);
        PLSQLCollectionType collectionType = (PLSQLCollectionType)shadowDDLTestPackage.getTypes().get(0);
        String numTblCreateDDL = removeLineTerminators(shadowDDLGenerator.getCreateDDLFor(collectionType));
        String numTblDropDDL = removeLineTerminators(shadowDDLGenerator.getDropDDLFor(collectionType));
        PLSQLRecordType recordType3 = (PLSQLRecordType)shadowDDLTestPackage.getTypes().get(1);
        String numRecord3CreateDDL = removeLineTerminators(shadowDDLGenerator.getCreateDDLFor(recordType3));
        String numRecord3DropDDL = removeLineTerminators(shadowDDLGenerator.getDropDDLFor(recordType3));
        PLSQLCollectionType collectionType3 = (PLSQLCollectionType)shadowDDLTestPackage.getTypes().get(2);
        String numTbl3CreateDDL = removeLineTerminators(shadowDDLGenerator.getCreateDDLFor(collectionType3));
        String numTbl3DropDDL = removeLineTerminators(shadowDDLGenerator.getDropDDLFor(collectionType3));
        PLSQLRecordType recordType = (PLSQLRecordType)shadowDDLTestPackage.getTypes().get(3);
        String numRecordCreateDDL = removeLineTerminators(shadowDDLGenerator.getCreateDDLFor(recordType));
        String numRecordDropDDL = removeLineTerminators(shadowDDLGenerator.getDropDDLFor(recordType));
        PLSQLCollectionType collectionType2 = (PLSQLCollectionType)shadowDDLTestPackage.getTypes().get(4);
        String numTbl2CreateDDL = removeLineTerminators(shadowDDLGenerator.getCreateDDLFor(collectionType2));
        String numTbl2DropDDL = removeLineTerminators(shadowDDLGenerator.getDropDDLFor(collectionType2));
        PLSQLRecordType recordType2 = (PLSQLRecordType)shadowDDLTestPackage.getTypes().get(5);
        String numRecord2CreateDDL = removeLineTerminators(shadowDDLGenerator.getCreateDDLFor(recordType2));
        String numRecord2DropDDL = removeLineTerminators(shadowDDLGenerator.getDropDDLFor(recordType2));
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE2 +
            " does not match expected shadow DDL", numRecord2CreateDDL,
            EXPECTED_NUMRECORD2_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE2 +
            " does not match expected shadow DDL", numRecord2DropDDL,
            EXPECTED_NUMRECORD2_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE +
            " does not match expected shadow DDL", numRecordCreateDDL,
            EXPECTED_NUMRECORD_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE +
            " does not match expected shadow DDL", numRecordDropDDL, EXPECTED_NUMRECORD_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE +
            " does not match expected shadow DDL", numTblCreateDDL, EXPECTED_NUMTBL_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE +
            " does not match expected shadow DDL", numTblDropDDL, EXPECTED_NUMTBL_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE2 +
            " does not match expected shadow DDL", numTbl2CreateDDL, EXPECTED_NUMTBL2_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE2 +
            " does not match expected shadow DDL", numTbl2DropDDL, EXPECTED_NUMTBL2_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE3 +
            " does not match expected shadow DDL", numTbl3CreateDDL, EXPECTED_NUMTBL3_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_TABLE_TYPE3 +
            " does not match expected shadow DDL", numTbl3DropDDL, EXPECTED_NUMTBL3_DROP_SHADOWDDL);
        assertEquals("generated create shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE3 +
            " does not match expected shadow DDL", numRecord3CreateDDL , EXPECTED_NUMRECORD3_CREATE_SHADOWDDL);
        assertEquals("generated drop shadow DDL for " + SHADOWDDLTEST_RECORD_TYPE3 +
            " does not match expected shadow DDL", numRecord3DropDDL, EXPECTED_NUMRECORD3_DROP_SHADOWDDL);
    }

}
