blob: 72cfce7e0eaa74579c141c9f3e597d048bcae96a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Oracle. 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:
* Mike Norman - June 10 2011, created DDL parser package
* David McCann - July 2011, visit tests
******************************************************************************/
package org.eclipse.persistence.tools.oracleddl.test.databasetypebuilder;
//javase imports
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
//JUnit4 imports
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
//DDL imports
import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentType;
import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
import org.eclipse.persistence.tools.oracleddl.metadata.FunctionType;
import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLPackageType;
import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLRecordType;
import org.eclipse.persistence.tools.oracleddl.metadata.ProcedureType;
import org.eclipse.persistence.tools.oracleddl.metadata.visit.UnresolvedTypesVisitor;
import org.eclipse.persistence.tools.oracleddl.parser.ParseException;
import org.eclipse.persistence.tools.oracleddl.test.AllTests;
import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypeBuilder;
//testing imports
import static org.eclipse.persistence.tools.oracleddl.test.TestHelper.DATABASE_DDL_KEY;
import static org.eclipse.persistence.tools.oracleddl.test.TestHelper.DEFAULT_DATABASE_DDL;
import static org.eclipse.persistence.tools.oracleddl.test.TestHelper.buildConnection;
import static org.eclipse.persistence.tools.oracleddl.test.TestHelper.createDbArtifact;
public class TypeResolutionTestSuite {
static final String CREATE_TESTMAN_TYPE1 =
"CREATE OR REPLACE TYPE TESMAN_TYPE1 AS OBJECT (" +
"\n\tACCT\tNUMBER," +
"\n\tCOUNTRY\tVARCHAR2(30)," +
"\n\tADDR_DIVISION\tVARCHAR2(30)," +
"\n\tSTATE\tVARCHAR2(30)" +
")";
static final String CREATE_TESTMAN_TYPE2 =
"CREATE OR REPLACE TYPE TESMAN_TYPE2 AS OBJECT (" +
"\n\tPNR\tNUMBER," +
"\n\tCOMPANY\tVARCHAR2(30)," +
"\n\tSE\tVARCHAR2(30)," +
"\n\tSCRIP\tVARCHAR2(30)," +
"\n\tTT\tTESMAN_TYPE1" +
")";
static final String CREATE_TESTMAN_TYPE3 =
"CREATE OR REPLACE TYPE TESMAN_TYPE3 AS VARRAY(2) OF TESMAN_TYPE2";
static final String CREATE_TESTMAN_TABLE1 =
"CREATE OR REPLACE TABLE TESMAN_TABLE1 (" +
"\n\tIDE\tNUMBER," +
"\n\tIDTT\tTESMAN_TYPE1" +
")";
static final String CREATE_TESTMAN_TABLE2 =
"CREATE OR REPLACE TABLE TESMAN_TABLE2 (" +
"\n\tSRNO\tNUMBER," +
"\n\tDETAIL\tTESMAN_TYPE2" +
")";
static final String CREATE_TESTMAN_TABLE3 =
"CREATE OR REPLACE TABLE TESMAN_TABLE3 (" +
"\n\tID\tINTEGER," +
"\n\tTT3\tTESMAN_TYPE3" +
")";
static final String TESMANPACK_PACKAGE = "TESMANPACK";
static final String CREATE_TESTMAN_PACKAGE =
"CREATE OR REPLACE PACKAGE " + TESMANPACK_PACKAGE + " AS" +
"\n\tTYPE EMPREC IS RECORD ( " +
"\n\tEMPNO EMP.EMPNO%TYPE," +
"\n\tENAME EMP.ENAME%TYPE," +
"\n\tJOB EMP.JOB%TYPE," +
"\n\tMGR EMP.MGR%TYPE," +
"\n\tHIREDATE EMP.HIREDATE%TYPE," +
"\n\tSAL EMP.SAL%TYPE," +
"\n\tCOMM EMP.COMM%TYPE," +
"\n\tDEPTNO EMP.DEPTNO%TYPE" +
"\n\t);" +
"\n\tFUNCTION TESMANFUNC17(PARAM1 IN INTEGER) RETURN TESMAN_TABLE2%ROWTYPE;" +
"\n\tPROCEDURE TESMANPROC17(PARAM1 IN INTEGER, REC OUT TESMAN_TABLE2%ROWTYPE);" +
"\n\tPROCEDURE TESMANPROC17b(OLDREC IN TESMAN_TABLE3%ROWTYPE, NEWREC OUT TESMAN_TABLE3%ROWTYPE);" +
"\n\tPROCEDURE EMP_TEST(E1 IN EMPREC, NAME IN VARCHAR2);" +
"\n\tPROCEDURE EMP_TEST2(NAME IN EMP.ENAME%TYPE);" +
"END " + TESMANPACK_PACKAGE + ";";
static final String CREATE_TESTMAN_PACKAGE_BODY =
"CREATE OR REPLACE PACKAGE BODY " + TESMANPACK_PACKAGE + " AS" +
"\n\tFUNCTION TESMANFUNC17(PARAM1 IN INTEGER) RETURN TESMAN_TABLE2%ROWTYPE AS" +
"\n\tL_DATA1 TESMAN_TABLE2%ROWTYPE;" +
"\n\tCURSOR C_EMP(PARAMTEMP IN INTEGER) IS SELECT * FROM TESMAN_TABLE2 TE WHERE TE.SRNO=PARAMTEMP;" +
"\n\tBEGIN" +
"\n\tOPEN C_EMP(PARAM1);" +
"\n\tLOOP" +
"\n\tFETCH C_EMP INTO L_DATA1;" +
"\n\tEXIT WHEN C_EMP%NOTFOUND;" +
"\n\tEND LOOP;" +
"\n\tRETURN L_DATA1;" +
"\n\tEND;" +
"\n\tPROCEDURE TESMANPROC17( PARAM1 IN INTEGER, REC OUT TESMAN_TABLE2%ROWTYPE) AS" +
"\n\tBEGIN" +
"\n\tREC := TESMANFUNC17(PARAM1);" +
"\n\tEND;" +
"\n\tPROCEDURE TESMANPROC17b(OLDREC IN TESMAN_TABLE3%ROWTYPE, NEWREC OUT TESMAN_TABLE3%ROWTYPE) AS" +
"\n\tBEGIN" +
"\n\tNEWREC := OLDREC;" +
"\n\tEND;" +
"\n\tPROCEDURE EMP_TEST(E1 IN EMPREC, NAME IN VARCHAR2) AS" +
"\n\tBEGIN" +
"\n\tnull;" +
"\n\tEND EMP_TEST;" +
"\n\tPROCEDURE EMP_TEST2(NAME IN EMP.ENAME%TYPE) AS" +
"\n\tBEGIN" +
"\n\tnull;" +
"\n\tEND EMP_TEST2;" +
"END " + TESMANPACK_PACKAGE + ";";
//JUnit fixture(s)
static DatabaseTypeBuilder dtBuilder = DatabaseTypeBuilderTestSuite.dtBuilder;
static Connection conn = AllTests.conn;
static PLSQLPackageType tesmanPackage = null;
@BeforeClass
static public void setUp() {
try {
conn = buildConnection();
}
catch (Exception e) {
e.printStackTrace();
}
String ddl = System.getProperty(DATABASE_DDL_KEY, DEFAULT_DATABASE_DDL);
if ("true".equalsIgnoreCase(ddl)) {
try {
createDbArtifact(conn, CREATE_TESTMAN_TYPE1);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_TYPE2);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_TYPE3);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_TABLE1);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_TABLE2);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_TABLE3);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_PACKAGE);
}
catch (SQLException e) {
//ignore
}
try {
createDbArtifact(conn, CREATE_TESTMAN_PACKAGE_BODY);
}
catch (SQLException e) {
//ignore
}
}
dtBuilder = new DatabaseTypeBuilder();
boolean worked = true;
String msg = null;
try {
tesmanPackage = dtBuilder.buildPackages(conn, null, TESMANPACK_PACKAGE).get(0);
}
catch (Exception e) {
worked = false;
msg = e.getMessage();
}
if (!worked) {
fail(msg);
}
}
@Test
public void testUnresolvedTypeResolution() throws ParseException {
assertEquals("incorrect procedure name", TESMANPACK_PACKAGE , tesmanPackage.getPackageName());
UnresolvedTypesVisitor visitor = new UnresolvedTypesVisitor();
visitor.visit(tesmanPackage);
assertEquals(TESMANPACK_PACKAGE + " should not have any unresolved types",
0, visitor.getUnresolvedTypes().size());
FunctionType func1 = (FunctionType)tesmanPackage.getProcedures().get(0);
DatabaseType tesmanfunc17ReturnType = func1.getReturnArgument().getDataType();
ProcedureType proc2 = tesmanPackage.getProcedures().get(1);
DatabaseType tesmanproc17OutArgType = proc2.getArguments().get(1).getDataType();
assertSame(tesmanfunc17ReturnType, tesmanproc17OutArgType);
ProcedureType proc3 = tesmanPackage.getProcedures().get(2);
List<ArgumentType> proc3Args = proc3.getArguments();
DatabaseType oldrecDatabaseType = proc3Args.get(0).getDataType();
DatabaseType newrecDatabaseType = proc3Args.get(1).getDataType();
assertSame(oldrecDatabaseType, newrecDatabaseType);
PLSQLRecordType empRecType = (PLSQLRecordType)tesmanPackage.getTypes().get(0);
PLSQLRecordType empRecType2 = (PLSQLRecordType)tesmanPackage.getProcedures().get(3).
getArguments().get(0).getDataType();
assertSame(empRecType, empRecType2);
DatabaseType empDotEnamePcentTYPE1 = empRecType.getFields().get(1).getDataType();
ArgumentType nameArg = tesmanPackage.getProcedures().get(4).getArguments().get(0);
DatabaseType empDotEnamePcentTYPE2 = nameArg.getDataType();
assertSame(empDotEnamePcentTYPE1, empDotEnamePcentTYPE2);
}
}