/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.unit;
import java.io.StringReader;
import java.util.Random;
import org.h2.test.TestBase;
import org.h2.util.ScriptReader;
/**
* Tests the script reader tool that breaks up SQL scripts in statements.
*/
public class TestScriptReader extends TestBase {
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() {
testCommon();
testRandom();
}
private void testRandom() {
int len = getSize(1000, 10000);
Random random = new Random(10);
for (int i = 0; i < len; i++) {
int l = random.nextInt(10);
String[] sql = new String[l];
StringBuilder buff = new StringBuilder();
for (int j = 0; j < l; j++) {
sql[j] = randomStatement(random);
buff.append(sql[j]);
if (j < l - 1) {
buff.append(";");
}
}
String s = buff.toString();
StringReader reader = new StringReader(s);
ScriptReader source = new ScriptReader(reader);
for (int j = 0; j < l; j++) {
String e = source.readStatement();
String c = sql[j];
if (c.length() == 0 && j == l - 1) {
c = null;
}
assertEquals(c, e);
}
assertEquals(null, source.readStatement());
}
}
private static String randomStatement(Random random) {
StringBuilder buff = new StringBuilder();
int len = random.nextInt(5);
for (int i = 0; i < len; i++) {
switch (random.nextInt(10)) {
case 0: {
int l = random.nextInt(4);
String[] ch = { "\n", "\r", " ", "*", "a", "0", "$ " };
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
break;
}
case 1: {
buff.append('\'');
int l = random.nextInt(4);
String[] ch = { ";", "\n", "\r", "--", "//", "/", "-", "*", "/*", "*/", "\"", "$ " };
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
buff.append('\'');
break;
}
case 2: {
buff.append('"');
int l = random.nextInt(4);
String[] ch = { ";", "\n", "\r", "--", "//", "/", "-", "*", "/*", "*/", "\'", "$" };
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
buff.append('"');
break;
}
case 3: {
buff.append('-');
if (random.nextBoolean()) {
String[] ch = { "\n", "\r", "*", "a", " ", "$ " };
int l = 1 + random.nextInt(4);
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
} else {
buff.append('-');
String[] ch = { ";", "-", "//", "/*", "*/", "a", "$" };
int l = random.nextInt(4);
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
buff.append('\n');
}
break;
}
case 4: {
buff.append('/');
if (random.nextBoolean()) {
String[] ch = { "\n", "\r", "a", " ", "- ", "$ " };
int l = 1 + random.nextInt(4);
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
} else {
buff.append('*');
String[] ch = { ";", "-", "//", "/* ", "--", "\n", "\r", "a", "$" };
int l = random.nextInt(4);
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
buff.append("*/");
}
break;
}
case 5: {
if (buff.length() > 0) {
buff.append(" ");
}
buff.append("$");
if (random.nextBoolean()) {
String[] ch = { "\n", "\r", "a", " ", "- ", "/ " };
int l = 1 + random.nextInt(4);
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
} else {
buff.append("$");
String[] ch = { ";", "-", "//", "/* ", "--", "\n", "\r", "a", "$ " };
int l = random.nextInt(4);
for (int j = 0; j < l; j++) {
buff.append(ch[random.nextInt(ch.length)]);
}
buff.append("$$");
}
break;
}
default:
}
}
return buff.toString();
}
private void testCommon() {
String s;
ScriptReader source;
s = "$$;$$;";
source = new ScriptReader(new StringReader(s));
assertEquals("$$;$$", source.readStatement());
assertEquals(null, source.readStatement());
source.close();
s = "a;';';\";\";--;\n;/*;\n*/;//;\na;";
source = new ScriptReader(new StringReader(s));
assertEquals("a", source.readStatement());
assertEquals("';'", source.readStatement());
assertEquals("\";\"", source.readStatement());
assertEquals("--;\n", source.readStatement());
assertEquals("/*;\n*/", source.readStatement());
assertEquals("//;\na", source.readStatement());
assertEquals(null, source.readStatement());
source.close();
s = "/\n$ \n\n $';$$a$$ $\n;'";
source = new ScriptReader(new StringReader(s));
assertEquals("/\n$ \n\n $';$$a$$ $\n;'", source.readStatement());
assertEquals(null, source.readStatement());
source.close();
}
}