blob: fcaf539b13cdf09c43aec028897c8288cb3f191a [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.ddlparser;
//javase imports
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.List;
//JUnit4 imports
import org.junit.BeforeClass;
//import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
//DDL imports
import org.eclipse.persistence.tools.oracleddl.metadata.FieldType;
import org.eclipse.persistence.tools.oracleddl.metadata.ObjectTableType;
import org.eclipse.persistence.tools.oracleddl.metadata.ObjectType;
import org.eclipse.persistence.tools.oracleddl.metadata.UnresolvedType;
import org.eclipse.persistence.tools.oracleddl.metadata.VArrayType;
import org.eclipse.persistence.tools.oracleddl.metadata.visit.UnresolvedTypesVisitor;
import org.eclipse.persistence.tools.oracleddl.parser.DDLParser;
import org.eclipse.persistence.tools.oracleddl.parser.ParseException;
import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypesRepository;
public class TypeDDLTestSuite {
static final String CREATE_TYPE_PREFIX = "CREATE OR REPLACE TYPE ";
//JUnit fixture(s)
static DDLParser parser = null;
@BeforeClass
static public void setUp() {
parser = new DDLParser(new InputStream() {
public int read() throws IOException {
return 0;
}
});
parser.setTypesRepository(new DatabaseTypesRepository());
}
/*
CREATE OR REPLACE TYPE EMP_INFO AS OBJECT (
ID NUMERIC(5),
NAME VARCHAR2(50)
);
*/
static final String SIMPLE_TYPE = "EMP_INFO";
static final String SIMPLE_TYPE_FIELD1_NAME = "ID";
static final String SIMPLE_TYPE_FIELD1_TYPE = "NUMERIC(5)";
static final String SIMPLE_TYPE_FIELD2_NAME = "NAME";
static final String SIMPLE_TYPE_FIELD2_TYPE = "VARCHAR2(50)";
static final String CREATE_SIMPLE_TYPE =
CREATE_TYPE_PREFIX + SIMPLE_TYPE + " IS OBJECT (" +
"\n" + SIMPLE_TYPE_FIELD1_NAME + " " + SIMPLE_TYPE_FIELD1_TYPE + "," +
"\n" + SIMPLE_TYPE_FIELD2_NAME + " " + SIMPLE_TYPE_FIELD2_TYPE +
"\n);";
@Test
public void testSimpleType() {
parser.ReInit(new StringReader(CREATE_SIMPLE_TYPE));
boolean worked = true;
String message = "";
ObjectType simpleType = null;
try {
simpleType = (ObjectType)parser.parseType();
}
catch (ParseException pe) {
message = pe.getMessage();
worked = false;
}
assertTrue(SIMPLE_TYPE + " type did not parse:\n" + message, worked);
UnresolvedTypesVisitor l = new UnresolvedTypesVisitor();
l.visit(simpleType);
assertTrue(SIMPLE_TYPE + " type should not contain unresolved column datatypes",
l.getUnresolvedTypes().isEmpty());
List<FieldType> fields = simpleType.getFields();
assertEquals(SIMPLE_TYPE + " type should contain 2 column fields",
2, fields.size());
FieldType field1 = fields.get(0);
assertEquals("incorrect name for " + SIMPLE_TYPE_FIELD1_NAME + " field ",
SIMPLE_TYPE_FIELD1_NAME, field1.getFieldName());
assertEquals("incorrect type for " + SIMPLE_TYPE_FIELD1_NAME + " field ",
SIMPLE_TYPE_FIELD1_TYPE, field1.getEnclosedType().toString());
FieldType field2 = fields.get(1);
assertEquals("incorrect name for " + SIMPLE_TYPE_FIELD2_NAME + " field ",
SIMPLE_TYPE_FIELD2_NAME, field2.getFieldName());
assertEquals("incorrect type for " + SIMPLE_TYPE_FIELD2_NAME + " field ",
SIMPLE_TYPE_FIELD2_TYPE, field2.getEnclosedType().toString());
}
/*
CREATE OR REPLACE TYPE GUID_PACKAGE_GUID_ARRAY AS TABLE OF VARCHAR2(20);
*/
static final String GUID_TABLE_TYPE = "GUID_PACKAGE_GUID_ARRAY";
static final String CREATE_GUID_TABLE_TYPE =
CREATE_TYPE_PREFIX + GUID_TABLE_TYPE + " AS TABLE OF VARCHAR2(20);";
@Test
public void testObjectTableType() {
parser.ReInit(new StringReader(CREATE_GUID_TABLE_TYPE));
boolean worked = true;
String message = "";
ObjectTableType objectTableType = null;
try {
objectTableType = (ObjectTableType)parser.parseType();
}
catch (ParseException pe) {
message = pe.getMessage();
worked = false;
}
assertTrue(GUID_TABLE_TYPE + " type did not parse:\n" + message, worked);
assertEquals(GUID_TABLE_TYPE + " type wrong name", GUID_TABLE_TYPE,
objectTableType.getTypeName());
UnresolvedTypesVisitor l = new UnresolvedTypesVisitor();
l.visit(objectTableType);
List<UnresolvedType> unresolvedTypes = l.getUnresolvedTypes();
assertTrue(GUID_TABLE_TYPE + " type should not contain unresolved column datatypes",
unresolvedTypes.isEmpty());
assertEquals("incorrect table type for " + GUID_TABLE_TYPE,
"VARCHAR2(20)", objectTableType.getEnclosedType().toString());
}
/*
CREATE OR REPLACE TYPE VCARRAY AS VARRAY(4) OF VARCHAR2(20);
*/
static final String VCARRAY_VARRAY_TYPE = "VCARRAY";
static final String CREATE_VCARRAY_VARRAY_TYPE =
CREATE_TYPE_PREFIX + VCARRAY_VARRAY_TYPE + " AS VARRAY(4) OF VARCHAR2(20);";
@Test
public void testVArrayType() {
parser.ReInit(new StringReader(CREATE_VCARRAY_VARRAY_TYPE));
boolean worked = true;
String message = "";
VArrayType varrayType = null;
try {
varrayType = (VArrayType)parser.parseType();
}
catch (ParseException pe) {
message = pe.getMessage();
worked = false;
}
assertTrue(VCARRAY_VARRAY_TYPE + " type did not parse:\n" + message, worked);
assertEquals(VCARRAY_VARRAY_TYPE + " type wrong name", VCARRAY_VARRAY_TYPE,
varrayType.getTypeName());
UnresolvedTypesVisitor l = new UnresolvedTypesVisitor();
l.visit(varrayType);
List<UnresolvedType> unresolvedTypes = l.getUnresolvedTypes();
assertTrue(VCARRAY_VARRAY_TYPE + " type should not contain unresolved column datatypes",
unresolvedTypes.isEmpty());
assertEquals(VCARRAY_VARRAY_TYPE + "'s size be 4", 4L, varrayType.getSize());
assertEquals("incorrect enclosed type for " + VCARRAY_VARRAY_TYPE,
"VARCHAR2(20)", varrayType.getEnclosedType().toString());
}
/*
CREATE OR REPLACE TYPE EMPLOYEE_CONTACT IS OBJECT (
EMP_NUMBER NUMERIC,
EMP_NAME VARCHAR2(50),
HOME_CONTACT HR.CONTACT,
WORK_CONTACT HR.CONTACT
);
*/
static final String TYPE_WITH_UNRESOLVED_TYPE = "EMPLOYEE_CONTACT";
static final String TWUT_FIELD1_NAME = "EMP_NUMBER";
static final String TWUT_FIELD1_TYPE = "NUMERIC";
static final String TWUT_FIELD2_NAME = "EMP_NAME";
static final String TWUT_FIELD2_TYPE = "VARCHAR2(50)";
static final String TWUT_FIELD3_NAME = "HOME_CONTACT";
static final String TWUT_FIELD3_TYPE = "HR.CONTACT";
static final String TWUT_FIELD4_NAME = "WORK_CONTACT";
static final String TWUT_FIELD4_TYPE = TWUT_FIELD3_TYPE;
static final String CREATE_TYPE_WITH_UNRESOLVED_TYPE =
CREATE_TYPE_PREFIX + TYPE_WITH_UNRESOLVED_TYPE + " IS OBJECT (" +
"\n" + TWUT_FIELD1_NAME + " " + TWUT_FIELD1_TYPE + "," +
"\n" + TWUT_FIELD2_NAME + " " + TWUT_FIELD2_TYPE + "," +
"\n" + TWUT_FIELD3_NAME + " " + TWUT_FIELD3_TYPE + "," +
"\n" + TWUT_FIELD4_NAME + " " + TWUT_FIELD4_TYPE +
"\n);";
@Test
public void testTypeWithUnresolvedType() {
parser.ReInit(new StringReader(CREATE_TYPE_WITH_UNRESOLVED_TYPE));
boolean worked = true;
String message = "";
ObjectType typeWithUnresolvedType = null;
try {
typeWithUnresolvedType = (ObjectType)parser.parseType();
}
catch (ParseException pe) {
message = pe.getMessage();
worked = false;
}
assertTrue(TYPE_WITH_UNRESOLVED_TYPE + " type did not parse:\n" + message, worked);
UnresolvedTypesVisitor l = new UnresolvedTypesVisitor();
l.visit(typeWithUnresolvedType);
List<UnresolvedType> unresolvedTypes = l.getUnresolvedTypes();
assertFalse(TYPE_WITH_UNRESOLVED_TYPE + " type should contain unresolved column datatypes",
unresolvedTypes.isEmpty());
assertEquals(TYPE_WITH_UNRESOLVED_TYPE + " type should contain 2 unresolved column datatypes",
2, unresolvedTypes.size());
List<FieldType> fields = typeWithUnresolvedType.getFields();
assertEquals(TYPE_WITH_UNRESOLVED_TYPE + " type should contain 4 column fields",
4, fields.size());
FieldType field1 = fields.get(0);
assertEquals("incorrect name for " + TWUT_FIELD1_NAME + " field ",
TWUT_FIELD1_NAME, field1.getFieldName());
assertEquals("incorrect type for " + TWUT_FIELD1_NAME + " field ",
TWUT_FIELD1_TYPE, field1.getEnclosedType().toString());
FieldType field2 = fields.get(1);
assertEquals("incorrect name for " + TWUT_FIELD2_NAME + " field ",
TWUT_FIELD2_NAME, field2.getFieldName());
assertEquals("incorrect type for " + TWUT_FIELD2_NAME + " field ",
TWUT_FIELD2_TYPE, field2.getEnclosedType().toString());
FieldType field3 = fields.get(2);
assertEquals("incorrect name for " + TWUT_FIELD3_NAME + " field ",
TWUT_FIELD3_NAME, field3.getFieldName());
assertEquals("incorrect type for " + TWUT_FIELD3_NAME + " field ",
TWUT_FIELD3_TYPE, field3.getEnclosedType().toString());
FieldType field4 = fields.get(3);
assertEquals("incorrect name for " + TWUT_FIELD4_NAME + " field ",
TWUT_FIELD4_NAME, field4.getFieldName());
assertEquals("incorrect type for " + TWUT_FIELD4_NAME + " field ",
TWUT_FIELD4_TYPE, field4.getEnclosedType().toString());
}
static final String TYPE_W_KEYWORDS = "KEYWORD_TYPE";
static final String TWKW_FIELD1_NAME = "OID";
static final String TWKW_FIELD1_TYPE = "VARCHAR2(50)";
static final String TWKW_FIELD2_NAME = "CODE";
static final String TWKW_FIELD2_TYPE = "VARCHAR2 (2)";
static final String CREATE_TYPE_WITH_KEYWORD =
CREATE_TYPE_PREFIX + TYPE_W_KEYWORDS + " IS OBJECT (" +
"\n" + TWKW_FIELD1_NAME + " " + TWKW_FIELD1_TYPE + "," +
"\n" + TWKW_FIELD2_NAME + " " + TWKW_FIELD2_TYPE +
"\n);";
@Test
public void testKeywordType() {
parser.ReInit(new StringReader(CREATE_TYPE_WITH_KEYWORD));
boolean worked = true;
String message = "";
ObjectType typeWithKeyword = null;
try {
typeWithKeyword = (ObjectType)parser.parseType();
}
catch (ParseException pe) {
message = pe.getMessage();
worked = false;
}
assertTrue("type with keyword did not parse:\n" + message, worked);
assertEquals("incorrect type name " + TYPE_W_KEYWORDS,
TYPE_W_KEYWORDS, typeWithKeyword.getTypeName());
}
}