/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.sequencer.ddl; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.modeshape.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT; import static org.modeshape.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT; import static org.modeshape.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT; import static org.modeshape.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM; import static org.modeshape.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.modeshape.common.text.ParsingException; import org.modeshape.sequencer.ddl.DdlParsers.ParsingResult; import org.modeshape.sequencer.ddl.dialect.derby.DerbyDdlParser; import org.modeshape.sequencer.ddl.dialect.oracle.OracleDdlParser; import org.modeshape.sequencer.ddl.dialect.postgres.PostgresDdlParser; import org.modeshape.sequencer.ddl.node.AstNode; import org.modeshape.sequencer.ddl.node.AstNodeFactory; /** * */ public class DdlParsersTest extends DdlParserTestHelper { private DdlParsers parsers; public static final String DDL_TEST_FILE_PATH = "ddl/"; @Before public void beforeEach() { parsers = new DdlParsers(); } @Test public void shouldParseUntypedDdlFileWithTypeInFilename() { printTest("shouldParseUntypedDdlFileWithTypeInFilename()"); String content = "-- SAMPLE DDL FILE\n" + "CREATE TABLE myTableName (PART_COLOR VARCHAR(255) NOT NULL, PART_ID INTEGER DEFAULT (100))\n" + "DROP TABLE list_customers CASCADE"; rootNode = parsers.parse(content, "someSQL92.ddl"); assertEquals("SQL92", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); } @Test public void shouldParseTypedDdlFileWith() { printTest("shouldParseTypedDdlFileWith()"); String content = "-- SAMPLE SQL92 DDL FILE\n" + "CREATE TABLE myTableName (PART_COLOR VARCHAR(255) NOT NULL, PART_ID INTEGER DEFAULT (100))\n" + "DROP TABLE list_customers CASCADE"; rootNode = parsers.parse(content, null); assertEquals("SQL92", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); } @Test public void shouldParseUntypedDdlFile() { printTest("shouldParseUntypedDdlFile()"); String content = "\n" + "-- SAMPLE DDL FILE\n" + "CREATE TABLE myTableName (PART_COLOR VARCHAR(255) NOT NULL, PART_ID INTEGER DEFAULT (100))\n" + "DROP TABLE list_customers CASCADE"; rootNode = parsers.parse(content, null); assertEquals("SQL92", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); } @Test public void shouldParseUntypedDerbyFile() { printTest("shouldParseUntypedDerbyFile()"); String content = getFileContent(DDL_TEST_FILE_PATH + "dialect/derby/derby_test_statements.ddl"); rootNode = parsers.parse(content, null); assertEquals("DERBY", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); } @Test public void shouldParseTypedDerbyFile() { printTest("shouldParseTypedDerbyFile()"); String content = getFileContent(DDL_TEST_FILE_PATH + "dialect/derby/derby_test_statements_typed.ddl"); rootNode = parsers.parse(content, null); assertEquals("DERBY", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); } @Test public void shouldParseUntypedOracleFile() { printTest("shouldParseUntypedOracleFile()"); String content = getFileContent(DDL_TEST_FILE_PATH + "dialect/oracle/oracle_test_statements_3.ddl"); rootNode = parsers.parse(content, null); assertEquals("ORACLE", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); } @Test public void shouldParseUntypedPostgresFile() { printTest("shouldParseUntypedPostgresFile()"); String content = getFileContent(DDL_TEST_FILE_PATH + "dialect/postgres/postgres_test_statements_1.ddl"); rootNode = parsers.parse(content, null); assertThat("POSTGRES", is((String)rootNode.getProperty(StandardDdlLexicon.PARSER_ID))); } @Test public void shouldParseUnterminatedOracleFile() { printTest("shouldParseUnterminatedOracleFile()"); String content = getFileContent(DDL_TEST_FILE_PATH + "GFM_Physical.ddl"); rootNode = parsers.parse(content, null); assertEquals("ORACLE", rootNode.getProperty(StandardDdlLexicon.PARSER_ID)); // printNodeChildren(rootNode); setPrintToConsole(true); final AstNodeFactory nodeFactory = new AstNodeFactory(); List<AstNode> problems = nodeFactory.getChildrenForType(rootNode, TYPE_PROBLEM); for (AstNode problem : problems) { printTest(problem.toString()); } assertThat(rootNode.getChildCount(), is(123)); List<AstNode> schemaNodes = nodeFactory.getChildrenForType(rootNode, TYPE_CREATE_SCHEMA_STATEMENT); assertThat(schemaNodes.size(), is(1)); assertThat(schemaNodes.get(0).getChildCount(), is(53)); assertThat(schemaNodes.get(0).getName(), is("GLOBALFORCEMGMT")); List<AstNode> alterNodes = nodeFactory.getChildrenForType(rootNode, TYPE_ALTER_TABLE_STATEMENT); assertThat(alterNodes.size(), is(120)); List<AstNode> dropSchemaNodes = nodeFactory.getChildrenForType(rootNode, TYPE_DROP_SCHEMA_STATEMENT); assertThat(dropSchemaNodes.size(), is(1)); List<AstNode> unknownNodes = nodeFactory.getChildrenForType(rootNode, TYPE_UNKNOWN_STATEMENT); assertThat(unknownNodes.size(), is(1)); } @Test( expected = ParsingException.class ) public void shouldErrorWhenInvalidParserId() { final String content = getFileContent(DDL_TEST_FILE_PATH + "dialect/derby/derby_test_statements.ddl"); this.parsers.parseUsing(content, "BOGUS"); } @Test public void shouldParseHugeOracleFile() { printTest("shouldParseHugeOracleFile()"); final String content = getFileContent(DDL_TEST_FILE_PATH + "dialect/oracle/huge.ddl"); this.rootNode = this.parsers.parse(content, null); assertThat("ORACLE", is((String)this.rootNode.getProperty(StandardDdlLexicon.PARSER_ID))); } @Test public void shouldReturnBuiltInParsers() { printTest("shouldReturnBuiltInParsers()"); assertThat(this.parsers.getParsers(), hasItems(DdlParsers.BUILTIN_PARSERS.toArray(new DdlParser[DdlParsers.BUILTIN_PARSERS.size()]))); } @Test public void shouldReturnParsersConstructedWith() { printTest("shouldReturnParsersConstructedWith()"); final List<DdlParser> myParsers = new ArrayList<DdlParser>(); myParsers.add(new DerbyDdlParser()); final DdlParsers ddlParsers = new DdlParsers(myParsers); assertThat(ddlParsers.getParsers(), hasItems(myParsers.toArray(new DdlParser[myParsers.size()]))); } @Test public void shouldReturnResultsInOrder() { printTest("shouldReturnResultsInOrder()"); { // oracle final String ddl = getFileContent(DDL_TEST_FILE_PATH + "dialect/oracle/oracle_test_statements_3.ddl"); final List<ParsingResult> results = this.parsers.parseUsingAll(ddl); assertThat(results.size(), is(DdlParsers.BUILTIN_PARSERS.size())); assertThat(results.get(0).getParserId(), is(OracleDdlParser.ID)); // first element should be Oracle result } { // derby final String ddl = getFileContent(DDL_TEST_FILE_PATH + "dialect/derby/derby_test_statements.ddl"); final List<ParsingResult> results = this.parsers.parseUsingAll(ddl); assertThat(results.size(), is(DdlParsers.BUILTIN_PARSERS.size())); assertThat(results.get(0).getParserId(), is(DerbyDdlParser.ID)); // first element should be Teiid result } } @Test public void shouldReturnCorrectNumberOfResults() { printTest("shouldReturnCorrectNumberOfResults()"); final List<DdlParser> myParsers = new ArrayList<DdlParser>(2); myParsers.add(new PostgresDdlParser()); myParsers.add(new OracleDdlParser()); final DdlParsers ddlParsers = new DdlParsers(myParsers); final String ddl = getFileContent(DDL_TEST_FILE_PATH + "dialect/oracle/oracle_test_statements_3.ddl"); final List<ParsingResult> results = ddlParsers.parseUsing(ddl, myParsers.get(0).getId(), myParsers.get(1).getId(), (String[])null); assertThat(results.size(), is(myParsers.size())); } @Test( expected = ParsingException.class ) public void shouldNotAllowInvalidParserId() { printTest("shouldNotAllowInvalidParserId()"); final String ddl = getFileContent(DDL_TEST_FILE_PATH + "dialect/oracle/oracle_test_statements_3.ddl"); this.parsers.parseUsing(ddl, this.parsers.getParsers().iterator().next().getId(), "bogusId", (String[])null); } }