/*
* 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.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.modeshape.common.text.TokenStream.Tokenizer;
/**
*
*/
public class DdlTokenStreamTest extends DdlParserTestHelper {
public static final int WORD = DdlTokenStream.DdlTokenizer.WORD;
public static final int SYMBOL = DdlTokenStream.DdlTokenizer.SYMBOL;
public static final int DECIMAL = DdlTokenStream.DdlTokenizer.DECIMAL;
public static final int SINGLE_QUOTED_STRING = DdlTokenStream.DdlTokenizer.SINGLE_QUOTED_STRING;
public static final int DOUBLE_QUOTED_STRING = DdlTokenStream.DdlTokenizer.DOUBLE_QUOTED_STRING;
public static final int COMMENT = DdlTokenStream.DdlTokenizer.COMMENT;
public static final int KEYWORD = DdlTokenStream.DdlTokenizer.KEYWORD;
public static final int STATEMENT_KEY = DdlTokenStream.DdlTokenizer.STATEMENT_KEY;
public static final String CREATE = "CREATE";
public static final String ALTER = "ALTER";
public static final String DROP = "DROP";
public static final String PUNT = "PUNT";
public static final String FOOBAR = "FOOBAR";
public static final String[] STMT_CREATE_FOOBAR = {CREATE, FOOBAR};
public static final String[] STMT_ALTER_FOOBAR = {ALTER, FOOBAR};
public static final String[] STMT_DROP_FOOBAR = {DROP, FOOBAR};
public static final String[] STMT_PUNT_FOOBAR = {PUNT, FOOBAR};
private final static String[] CUSTOM_KEYWORDS = {"CREATE", "ALTER", "DROP", "PUNT", "FOOBAR"};
private Tokenizer tokenizer;
@Before
public void beforeEach() {
tokenizer = DdlTokenStream.ddlTokenizer(true);
setPrintToConsole(false);
}
/**
* {@inheritDoc}
*
* @see org.modeshape.sequencer.ddl.DdlParserTestHelper#getTokens(java.lang.String)
*/
@Override
protected DdlTokenStream getTokens( String content ) {
DdlTokenStream tokens = new DdlTokenStream(content, tokenizer, false);
return tokens;
}
@Test
public void shouldRegisterKeyWords() {
printTest("shouldRegisterKeyWords()");
String content = "CREATE FOOBAR with NO WORDS";
DdlTokenStream tokens = getTokens(content);
tokens.registerKeyWords(CUSTOM_KEYWORDS);
// Do the work
tokens.start();
// Check results
assertTrue(tokens.isKeyWord(CREATE));
assertTrue(tokens.isKeyWord(ALTER));
assertTrue(tokens.isKeyWord(DROP));
assertTrue(tokens.isKeyWord(PUNT));
assertTrue(tokens.isKeyWord(FOOBAR));
assertFalse(tokens.isKeyWord("BARNYARD"));
assertTrue(tokens.matches(CREATE, FOOBAR));
assertFalse(tokens.matches(PUNT, FOOBAR));
assertTrue(tokens.matches(KEYWORD));
assertTrue(tokens.matches(WORD));
assertTrue(tokens.isNextKeyWord());
assertTrue(tokens.canConsume(CREATE)); // CREATE
assertTrue(tokens.isNextKeyWord());
assertTrue(tokens.canConsume(FOOBAR)); // FOOBAR
assertThat(tokens.nextPosition().getIndexInContent(), is(14));
assertFalse(tokens.isNextKeyWord()); // "with"
}
@Test
public void shouldRegisterStatementStarts() {
printTest("shouldRegisterStatementStarts()");
String content = "CREATE FOOBAR with NO WORDS";
DdlTokenStream tokens = getTokens(content);
// SET UP
tokens.registerKeyWords(CUSTOM_KEYWORDS);
tokens.registerStatementStartPhrase(STMT_CREATE_FOOBAR);
tokens.registerStatementStartPhrase(STMT_ALTER_FOOBAR);
tokens.registerStatementStartPhrase(STMT_DROP_FOOBAR);
tokens.registerStatementStartPhrase(STMT_PUNT_FOOBAR);
// Do the work
tokens.start();
// Check Results
assertThat(tokens.computeNextStatementStartKeywordCount(), is(2)); // CREATE FOOBAR
assertTrue(tokens.matches(CREATE, FOOBAR));
assertTrue(tokens.matches(STMT_CREATE_FOOBAR));
assertFalse(tokens.matches(PUNT, FOOBAR));
assertFalse(tokens.matches(STMT_ALTER_FOOBAR));
assertTrue(tokens.matches(KEYWORD));
assertTrue(tokens.matches(STATEMENT_KEY));
assertTrue(tokens.matches(WORD));
}
@Test
public void shouldMarkPosition() {
printTest("shouldMarkPosition()");
String content = "CREATE FOOBAR with NO WORDS";
DdlTokenStream tokens = getTokens(content);
// Do the work
tokens.start();
tokens.consume("CREATE");
tokens.mark();
tokens.consume();
tokens.consume();
tokens.consume();
String stringFragment = tokens.getMarkedContent();
assertThat(stringFragment, is("FOOBAR with NO "));
}
@Test
public void shouldMarkPositionWithMultilineContent() {
printTest("shouldMarkPositionWithMultilineContent()");
String content = "CREATE FOOBAR with NO WORDS;\n" + "CREATE BARFOO with lots of words after it;\n"
+ "CREATE TABLE myTable (column definition data);";
String fragment = "with lots of words after it;\n" + "CREATE TABLE myTable (column definition data);";
DdlTokenStream tokens = getTokens(content);
// Do the work
tokens.start();
while (tokens.hasNext()) {
String lastToken = tokens.consume();
if (lastToken.equalsIgnoreCase("BARFOO")) {
tokens.mark();
}
}
String stringFragment = tokens.getMarkedContent();
assertThat(stringFragment, is(fragment));
}
@Test
public void shouldFindNextPositionStartIndex() {
printTest("shouldFindNextPositionStartIndex()");
String content = "Select all columns from this table";
DdlTokenStream tokens = getTokens(content);
// Do the work
tokens.start();
// "Select all columns from this table";
assertThat(tokens.nextPosition().getIndexInContent(), is(0));
assertThat(tokens.nextPosition().getColumn(), is(1));
assertThat(tokens.nextPosition().getLine(), is(1));
tokens.consume();
// Next position should be line 1, column 8
assertThat(tokens.nextPosition().getIndexInContent(), is(7));
assertThat(tokens.nextPosition().getColumn(), is(8));
assertThat(tokens.nextPosition().getLine(), is(1));
}
@Test
public void shouldParseMultiLineString() {
printTest("shouldParseMultiLineString()");
String content = "ALTER DATABASE \n" + "DO SOMETHING; \n" + "ALTER DATABASE \n" + " SET DEFAULT BIGFILE TABLESPACE;";
DdlTokenStream tokens = getTokens(content);
// Do the work
tokens.start();
tokens.consume(); // LINE
tokens.consume(); // ONE
tokens.consume(); // DO
tokens.consume(); // SOMETHING
tokens.consume(); // ;
assertThat(tokens.nextPosition().getIndexInContent(), is(31));
assertThat(tokens.nextPosition().getColumn(), is(1));
tokens.consume(); // ALTER
assertThat(tokens.nextPosition().getIndexInContent(), is(37));
assertThat(tokens.nextPosition().getColumn(), is(7));
}
@Test
public void shouldParseQuotedStringWithEmbeddedSingleQuotes() {
printTest("shouldParseSingleQuotedStringWithEmbeddedSingleQuotes()");
final String content = "'Status: ''SUCCESSFUL EVENTS''/''UNSUCCESSFUL EVENTS''/''ALL EVENTS'''";
final DdlTokenStream tokens = getTokens(content);
tokens.start();
assertThat(tokens.consume(), is(content));
}
@Test
public void shouldParseQuotedStringWithEmbeddedDoubleQuotes() {
printTest("shouldParseSingleQuotedStringWithEmbeddedSingleQuotes()");
// '"Sledge""Hammer"'
final String content = "'\"Sledge\"\"Hammer\"'";
final DdlTokenStream tokens = getTokens(content);
tokens.start();
assertThat(tokens.consume(), is(content));
}
}