package com.dbdeploy.database;
import org.apache.commons.lang.SystemUtils;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class QueryStatementSplitterTest {
private QueryStatementSplitter splitter;
@Before
public void setUp() throws Exception {
splitter = new QueryStatementSplitter();
}
@Test
public void shouldNotSplitStatementsThatHaveNoDelimter() throws Exception {
List<String> result = splitter.split("SELECT 1");
assertThat(result, hasItem("SELECT 1"));
assertThat(result.size(), is(1));
}
@Test
public void shouldIgnoreSemicolonsInTheMiddleOfALine() throws Exception {
List<String> result = splitter.split("SELECT ';'");
assertThat(result, hasItem("SELECT ';'"));
assertThat(result.size(), is(1));
}
@Test
public void shouldSplitStatementsOnASemicolonAtTheEndOfALine() throws Exception {
List<String> result = splitter.split("SELECT 1;\nSELECT 2;");
assertThat(result, hasItems("SELECT 1", "SELECT 2"));
assertThat(result.size(), is(2));
}
@Test
public void shouldSplitStatementsOnASemicolonAtTheEndOfALineEvenWithWindowsLineEndings() throws Exception {
List<String> result = splitter.split("SELECT 1;\r\nSELECT 2;");
assertThat(result, hasItems("SELECT 1", "SELECT 2"));
assertThat(result.size(), is(2));
}
@Test
public void shouldSplitStatementsOnASemicolonAtTheEndOfALineIgnoringWhitespace() throws Exception {
List<String> result = splitter.split("SELECT 1; \nSELECT 2; ");
assertThat(result, hasItems("SELECT 1", "SELECT 2"));
assertThat(result.size(), is(2));
}
@Test
public void shouldLeaveLineBreaksAlone() throws Exception {
assertThat(splitter.split("SELECT\n1"), hasItems("SELECT" + SystemUtils.LINE_SEPARATOR + "1"));
assertThat(splitter.split("SELECT\r\n1"), hasItems("SELECT" + SystemUtils.LINE_SEPARATOR + "1"));
}
@Test
public void shouldSupportRowStyleTerminators() throws Exception {
splitter.setDelimiter("/");
splitter.setDelimiterType(DelimiterType.row);
List<String> result = splitter.split("SHOULD IGNORE /\nAT THE END OF A LINE\n/\nSELECT BLAH FROM DUAL");
assertThat(result, hasItems("SHOULD IGNORE /" + SystemUtils.LINE_SEPARATOR + "AT THE END OF A LINE" + SystemUtils.LINE_SEPARATOR, "SELECT BLAH FROM DUAL"));
assertThat(result.size(), is(2));
}
@Test
public void shouldSupportDefinedNewLineCharacters() throws Exception {
splitter.setOutputLineEnding(LineEnding.crlf);
assertThat(splitter.split("SELECT\n1"), hasItems("SELECT\r\n1"));
assertThat(splitter.split("SELECT\r\n1"), hasItems("SELECT\r\n1"));
splitter.setOutputLineEnding(LineEnding.cr);
assertThat(splitter.split("SELECT\n1"), hasItems("SELECT\r1"));
assertThat(splitter.split("SELECT\r\n1"), hasItems("SELECT\r1"));
splitter.setOutputLineEnding(LineEnding.lf);
assertThat(splitter.split("SELECT\n1"), hasItems("SELECT\n1"));
assertThat(splitter.split("SELECT\r\n1"), hasItems("SELECT\n1"));
splitter.setOutputLineEnding(LineEnding.platform);
assertThat(splitter.split("SELECT\n1"), hasItems("SELECT" + SystemUtils.LINE_SEPARATOR + "1"));
assertThat(splitter.split("SELECT\r\n1"), hasItems("SELECT" + SystemUtils.LINE_SEPARATOR + "1"));
}
}