blob: 7a3715492e63a88e1eb8161c79e86aaa6a74d780 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* 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 tests.SQLite;
import SQLite.Constants;
import SQLite.Database;
import SQLite.Exception;
import SQLite.Stmt;
import SQLite.TableResult;
import dalvik.annotation.BrokenTest;
import dalvik.annotation.KnownFailure;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargetClass;
import tests.support.DatabaseCreator;
import tests.support.Support_SQL;
import java.sql.Connection;
import java.sql.SQLException;
@TestTargetClass(Stmt.class)
public class StmtTest extends SQLiteTest {
private static Database db = null;
private static Stmt st = null;
private static final String createAllTypes =
"create table type (" +
" BoolVal BOOLEAN," + " IntVal INT," + " LongVal LONG,"
+ " Bint BIGINT," + " Tint TINYINT," + " Sint SMALLINT,"
+ " Mint MEDIUMINT, " +
" IntegerVal INTEGER, " + " RealVal REAL, "
+ " DoubleVal DOUBLE, " + " FloatVal FLOAT, "
+ " DecVal DECIMAL, " +
" NumVal NUMERIC, " + " charStr CHAR(20), "
+ " dateVal DATE, " + " timeVal TIME, " + " TS TIMESTAMP, "
+
" DT DATETIME, " + " TBlob TINYBLOB, " + " BlobVal BLOB, "
+ " MBlob MEDIUMBLOB, " + " LBlob LONGBLOB, " +
" TText TINYTEXT, " + " TextVal TEXT, "
+ " MText MEDIUMTEXT, " + " LText LONGTEXT, " +
" MaxLongVal BIGINT, MinLongVal BIGINT, "+
" validURL URL, invalidURL URL "+
");";
static final String insertAllTypes =
"insert into type (BoolVal, IntVal, LongVal, Bint, Tint, Sint, Mint,"
+ "IntegerVal, RealVal, DoubleVal, FloatVal, DecVal,"
+ "NumVal, charStr, dateVal, timeVal, TS,"
+ "DT, TBlob, BlobVal, MBlob, LBlob,"
+ "TText, TextVal, MText, LText, MaxLongVal, MinLongVal,"
+ " validURL, invalidURL"
+ ") "
+ "values (1, -1, 22, 2, 33,"
+ "3, 1, 2, 3.9, 23.2, 33.3, 44,"
+ "5, 'test string', '1799-05-26', '12:35:45', '2007-10-09 14:28:02.0',"
+ "'1221-09-22 10:11:55', 1, 2, 3, 4,"
+ "'Test text message tiny', 'Test text',"
+ " 'Test text message medium', 'Test text message long', "
+ Long.MAX_VALUE+", "+Long.MIN_VALUE+", "
+ "null, null "+
");";
static final String allTypesTable = "type";
public void setUp() throws java.lang.Exception {
super.setUp();
Support_SQL.loadDriver();
db = new Database();
db.open(dbFile.getPath(), 0);
db.exec(DatabaseCreator.CREATE_TABLE_SIMPLE1, null);
DatabaseCreator.fillSimpleTable1(conn);
}
public void tearDown() {
if (st != null) {
try {
st.close();
} catch (Exception e) {
}
}
try {
db.close();
Connection con = Support_SQL.getConnection();
con.close();
// dbFile.delete();
} catch (Exception e) {
fail("Exception in tearDown: "+e.getMessage());
} catch (SQLException e) {
fail("SQLException in tearDown: "+e.getMessage());
}
super.tearDown();
}
/**
* @tests {@link Stmt#Stmt()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "constructor test",
method = "Stmt",
args = {}
)
public void testStmt() {
Stmt st = new Stmt();
assertNotNull(st);
try {
Stmt actual = db.prepare("");
assertNotNull(st);
// no black box test assertEquals(actual.error_code,st.error_code);
} catch (Exception e) {
fail("Statement setup fails: "+e.getMessage());
e.printStackTrace();
}
try {
st.step();
fail("Cannot execute non prepared Stmt");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#finalize()}
*/
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
notes = "method test",
method = "finalize",
args = {}
)
public void testFinalize() {
}
/**
* @tests {@link Stmt#prepare()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "prepare",
args = {}
)
public void testPrepare() {
try {
st = db.prepare("");
st.prepare();
fail("statement is closed");
} catch (Exception e) {
assertEquals("stmt already closed", e.getMessage());
}
try {
st = new Stmt();
st = db.prepare("select * from " + DatabaseCreator.SIMPLE_TABLE1);
assertFalse(st.prepare());
st = new Stmt();
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
assertFalse(st.prepare());
st = new Stmt();
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
st.bind(1, 1);
st.bind(2, 10);
st.bind(3, 30);
assertFalse(st.prepare());
st = db.prepare("select * from " + DatabaseCreator.SIMPLE_TABLE1
+ "; " + "delete from " + DatabaseCreator.SIMPLE_TABLE1
+ " where id = 5; " + "insert into "
+ DatabaseCreator.SIMPLE_TABLE1 + " values(5, 10, 20); "
+ "select * from " + DatabaseCreator.SIMPLE_TABLE1 + ";");
assertTrue(st.prepare());
assertTrue(st.prepare());
assertTrue(st.prepare());
assertFalse(st.prepare());
} catch (Exception e) {
fail("statement should be ready for execution: "
+ e.getMessage());
e.printStackTrace();
}
}
/**
* @tests {@link Stmt#step()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "step",
args = {}
)
public void testStep() {
try {
st.step();
fail("Exception expected");
} catch (Exception e) {
assertEquals("stmt already closed", e.getMessage());
}
try {
st = new Stmt();
st = db.prepare("select name from sqlite_master where type = 'table'");
st.step();
} catch (Exception e) {
fail("test fails");
}
}
/**
* @tests {@link Stmt#close()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "close",
args = {}
)
public void testClose() {
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
st.close();
} catch (Exception e) {
fail("Test fails");
e.printStackTrace();
}
try {
st.step();
fail("Test fails");
} catch (Exception e) {
assertEquals("stmt already closed", e.getMessage());
}
}
/**
* @throws Exception
* @tests {@link Stmt#reset()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "reset",
args = {}
)
public void testReset() throws Exception {
db.exec("create table TEST (res integer not null)", null);
st = db.prepare("insert into TEST values (:one);");
st.bind(1, 1);
st.step();
// verify that parameter is still bound
st.reset();
assertEquals(1,st.bind_parameter_count());
st.step();
TableResult count = db.get_table("select count(*) from TEST where res=1", null);
String[] row0 = (String[]) count.rows.elementAt(0);
assertEquals(2, Integer.parseInt(row0[0]));
}
/**
* @tests {@link Stmt#clear_bindings()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "not supported",
method = "clear_bindings",
args = {}
)
public void testClear_bindings() {
try {
st.clear_bindings();
} catch (Exception e) {
assertEquals("unsupported", e.getMessage());
}
}
/**
* @tests {@link Stmt#bind(int, int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind",
args = {int.class, int.class}
)
public void testBindIntInt() {
try {
int input = 0;
int maxVal = Integer.MAX_VALUE;
int minVal = Integer.MIN_VALUE;
db.exec("create table TEST (res integer)", null);
st = db.prepare("insert into TEST values (:one);");
st.bind(1, input);
st.step();
st.reset();
st.bind(1,maxVal);
st.step();
st.reset();
st.bind(1,minVal);
st.step();
TableResult r = db.get_table("select * from TEST");
String[] row0 = (String[]) r.rows.elementAt(0);
assertEquals(input,Integer.parseInt(row0[0]));
String[] row1 = (String[]) r.rows.elementAt(1);
assertEquals(maxVal,Integer.parseInt(row1[0]));
String[] row2 = (String[]) r.rows.elementAt(2);
assertEquals(minVal,Integer.parseInt(row2[0]));
} catch (Exception e) {
fail("Error in test setup: "+e.getMessage());
e.printStackTrace();
}
try {
st.close();
st.bind(1,Integer.MIN_VALUE);
fail("Exception expected");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#bind(int, long)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind",
args = {int.class, long.class}
)
public void testBindIntLong() {
try {
long input = 0;
long maxVal = Long.MAX_VALUE;
long minVal = Long.MIN_VALUE;
db.exec("create table TEST (res long)", null);
st = db.prepare("insert into TEST values (:one);");
st.bind(1, input);
st.step();
st.reset();
st.bind(1,maxVal);
st.step();
st.reset();
st.bind(1,minVal);
st.step();
TableResult r = db.get_table("select * from TEST");
String[] row0 = (String[]) r.rows.elementAt(0);
assertEquals(input,Long.parseLong(row0[0]));
String[] row1 = (String[]) r.rows.elementAt(1);
assertEquals(maxVal,Long.parseLong(row1[0]));
String[] row2 = (String[]) r.rows.elementAt(2);
assertEquals(minVal,Long.parseLong(row2[0]));
} catch (Exception e) {
fail("Error in test setup: "+e.getMessage());
e.printStackTrace();
}
try {
st.close();
st.bind(1,Long.MIN_VALUE);
fail("Exception expected");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#bind(int, double)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind",
args = {int.class, double.class}
)
public void testBindIntDouble() {
try {
double input = 0.0;
double maxVal = Double.MAX_VALUE;
double minVal = Double.MIN_VALUE;
double negInf = Double.NEGATIVE_INFINITY;
double posInf = Double.POSITIVE_INFINITY;
double nan = Double.NaN;
db.exec("create table TEST (res double)", null);
st = db.prepare("insert into TEST values (:one);");
st.bind(1, input);
st.step();
st.reset();
st.bind(1, maxVal);
st.step();
st.reset();
st.bind(1, minVal);
st.step();
st.reset();
st.bind(1, negInf);
st.step();
st.reset();
st.bind(1, posInf);
st.step();
st.reset();
st.bind(1, nan);
st.step();
TableResult r = db.get_table("select * from TEST");
String[] row0 = (String[]) r.rows.elementAt(0);
assertTrue(Double.compare(input, Double.parseDouble(row0[0])) == 0);
String[] row1 = (String[]) r.rows.elementAt(1);
assertFalse(Double.compare(maxVal, Double.parseDouble(row1[0])) == 0);
assertTrue(Double.compare(maxVal, Double.parseDouble(row1[0])) < 0);
assertTrue(Double.isInfinite(Double.parseDouble(row1[0])));
String[] row2 = (String[]) r.rows.elementAt(2);
assertTrue(Double.compare(minVal, Double.parseDouble(row2[0])) == 0);
String[] row3 = (String[]) r.rows.elementAt(3);
assertEquals("Double.NEGATIVE_INFINITY SQLite representation",
"-Inf", row3[0]);
String[] row4 = (String[]) r.rows.elementAt(4);
assertEquals("Double.POSITIVE_INFINITY SQLite representation",
"Inf", row4[0]);
String[] row5 = (String[]) r.rows.elementAt(4);
assertEquals("Double.Nan SQLite representation", "Inf", row5[0]);
} catch (Exception e) {
fail("Error in test setup: " + e.getMessage());
e.printStackTrace();
}
try {
st.close();
st.bind(1,0.0);
fail("Exception expected");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#bind(int, byte[])}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "bind",
args = {int.class, byte[].class}
)
public void testBindIntByteArray() {
String name = "Hello World";
try {
byte[] b = new byte[name.getBytes().length];
b = name.getBytes();
String stringInHex = "";
db.exec(DatabaseCreator.CREATE_TABLE_PARENT, null);
st = db.prepare("insert into " + DatabaseCreator.PARENT_TABLE
+ " values (:one, :two);");
st.bind(1, 2);
st.bind(2, b);
st.step();
//compare what was stored with input based on Hex representation
// since type of column is CHAR
TableResult r = db.get_table("select * from "
+ DatabaseCreator.PARENT_TABLE);
String[] row = (String[]) r.rows.elementAt(0);
for (byte aByte : b) {
stringInHex += Integer.toHexString(aByte);
}
stringInHex = "X'" + stringInHex + "'";
assertTrue(stringInHex.equalsIgnoreCase(row[1]));
} catch (Exception e) {
fail("Error in test setup: "+e.getMessage());
e.printStackTrace();
}
try {
st.close();
st.bind(1,name.getBytes());
fail("Exception expected");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#bind(int, String)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind",
args = {int.class, java.lang.String.class}
)
public void testBindIntString() {
String name = "Hello World";
try {
db.exec(DatabaseCreator.CREATE_TABLE_PARENT, null);
st = db.prepare("insert into " + DatabaseCreator.PARENT_TABLE
+ " values (:one, :two);");
st.bind(1, 2);
st.bind(2, name);
st.step();
TableResult r = db.get_table("select * from "
+ DatabaseCreator.PARENT_TABLE);
String[] row = (String[]) r.rows.elementAt(0);
assertEquals(name,row[1]);
} catch (Exception e) {
fail("Error in test setup: "+e.getMessage());
e.printStackTrace();
}
try {
st.close();
st.bind(1,name);
fail("Exception expected");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#bind(int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind",
args = {int.class}
)
public void testBindInt() {
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
st.bind(4);
st.bind(1, 4);
st.bind(2, 10);
st.bind(3, 30);
st.step();
fail("Test failes");
} catch (Exception e) {
// What happens if null is bound to non existing variable position
assertEquals("parameter position out of bounds" , e.getMessage());
}
// functional tests
try {
st.reset();
st.bind(1);
st.bind(2, 10);
st.bind(3, 30);
st.step();
fail("Test failes");
} catch (Exception e) {
// What happens if null is bound to NON NULL field
assertEquals("SQL logic error or missing database", e.getMessage());
}
try {
st.reset();
st.bind(1, 3);
st.bind(2);
st.bind(3, 30);
st.step();
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
}
}
/**
* @tests {@link Stmt#bind_zeroblob(int, int)}
*/
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
notes = "not supported",
method = "bind_zeroblob",
args = {int.class, int.class}
)
public void testBind_zeroblob() {
try {
st.bind_zeroblob(1, 128);
} catch (Exception e) {
assertEquals("unsupported", e.getMessage());
}
}
/**
* @tests {@link Stmt#bind_parameter_count()}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind_parameter_count",
args = {}
)
public void testBind_parameter_count() {
try {
st.bind_parameter_count();
} catch (Exception e) {
assertEquals("stmt already closed", e.getMessage());
}
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
assertEquals(3, st.bind_parameter_count());
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (?, ?, ?)");
assertEquals(3, st.bind_parameter_count());
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
st = db.prepare("select * from " + DatabaseCreator.SIMPLE_TABLE1);
assertEquals(0, st.bind_parameter_count());
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
st.close();
st.bind_parameter_count();
fail("Exception expected");
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#bind_parameter_name(int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind_parameter_name",
args = {int.class}
)
public void testBind_parameter_name() {
try {
st.bind_parameter_name(1);
fail("Exception expected");
} catch (Exception e) {
assertEquals("stmt already closed", e.getMessage());
}
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
assertEquals(":one", st.bind_parameter_name(1));
assertEquals(":two", st.bind_parameter_name(2));
assertEquals(":three", st.bind_parameter_name(3));
String name = st.bind_parameter_name(4);
} catch (Exception e) {
assertEquals("parameter position out of bounds",e.getMessage());
}
}
/**
* @tests {@link Stmt#bind_parameter_index(String)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "bind_parameter_index",
args = {java.lang.String.class}
)
public void testBind_parameter_index() {
try {
st.bind_parameter_index("");
fail("Exception expected");
} catch (Exception e) {
assertEquals("stmt already closed", e.getMessage());
}
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
assertEquals(3, st.bind_parameter_index(":three"));
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
assertEquals(0, st.bind_parameter_index(":t"));
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (?, ?, ?)");
assertEquals(0, st.bind_parameter_index("?"));
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
}
/**
* @throws Exception
* @tests {@link Stmt#column_int(int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "column_int",
args = {int.class}
)
public void testColumn_int() throws Exception {
db.exec(createAllTypes, null);
db.exec(insertAllTypes, null);
int columnObjectCastFromLong;
Object columnObject = null;
int intColumn = 0;
String selectStmt = "select * from "+DatabaseCreator.SIMPLE_TABLE1;
st = db.prepare(selectStmt);
st.step();
// select 'speed' value
columnObject = st.column(1);
intColumn = st.column_int(1);
assertNotNull(intColumn);
assertTrue("Integer".equalsIgnoreCase(st.column_decltype(1)));
int stSpeed = Integer.parseInt(columnObject.toString());
assertNotNull(stSpeed);
assertEquals( intColumn, stSpeed);
assertEquals(10,stSpeed);
selectStmt = "select TextVal from "+allTypesTable;
st = db.prepare(selectStmt);
st.step();
// select double value
try {
st.column_int(0);
} catch (Exception e) {
//ok
}
}
/**
* @tests {@link Stmt#column_long(int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "column_long",
args = {int.class}
)
public void testColumn_long() {
Object columnObject = null;
int columnObjectCastFromLong;
long longColumn = 0;
try {
String selectStmt = "select * from "+DatabaseCreator.SIMPLE_TABLE1;
st = db.prepare(selectStmt);
st.step();
columnObject = st.column(1);
longColumn = st.column_long(1);
assertNotNull(longColumn);
// column declared as integer
assertTrue("Integer".equalsIgnoreCase(st.column_decltype(1)));
int stSpeed = Integer.parseInt(columnObject.toString());
assertNotNull(stSpeed);
assertEquals( longColumn, stSpeed);
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
st.column_long(4);
fail("Exception expected");
} catch (Exception e) {
assertEquals( "column out of bounds" , e.getMessage());
}
try {
st.column_long(-1);
fail("Exception expected");
} catch (Exception e) {
assertEquals( "column out of bounds" , e.getMessage());
}
}
/**
* @throws Exception
* @tests {@link Stmt#column_double(int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "column_double",
args = {int.class}
)
public void testColumn_double() throws Exception {
db.exec(createAllTypes, null);
db.exec(insertAllTypes, null);
Object columnObject = null;
double doubleColumn = 0;
double actualVal = 23.2;
String selectStmt = "select DoubleVal from "+allTypesTable;
st = db.prepare(selectStmt);
st.step();
// select double value
doubleColumn = st.column_double(0);
assertNotNull(doubleColumn);
assertTrue("DOUBLE".equalsIgnoreCase(st.column_decltype(0)));
assertNotNull(doubleColumn);
assertEquals( actualVal, doubleColumn);
// Exception test
selectStmt = "select dateVal from "+allTypesTable;
st = db.prepare(selectStmt);
st.step();
// select double value
try {
st.column_double(0);
} catch (Exception e) {
//ok
}
}
/**
* @throws Exception
* @tests {@link Stmt#column_bytes(int)}
*/
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
notes = "not supported",
method = "column_bytes",
args = {int.class}
)
public void testColumn_bytes() throws Exception {
db.exec("create table B(id integer primary key, val blob)",null);
db.exec("insert into B values(1, zeroblob(128))", null);
st = db.prepare("select val from B where id = 1");
assertTrue(st.step());
try {
st.column_bytes(0);
} catch (Exception e) {
assertEquals("unsupported", e.getMessage());
}
}
/**
* @throws Exception
* @tests {@link Stmt#column_string(int)}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "column_string",
args = {int.class}
)
public void testColumn_string() throws Exception {
db.exec(createAllTypes, null);
db.exec(insertAllTypes, null);
Object columnObject = null;
String stringColumn = "";
String actualVal = "test string";
String selectStmt = "select charStr from "+allTypesTable;
st = db.prepare(selectStmt);
st.step();
// select string value
stringColumn = st.column_string(0);
assertNotNull(stringColumn);
assertTrue("CHAR(20)".equalsIgnoreCase(st.column_decltype(0)));
assertNotNull(stringColumn);
assertEquals( actualVal, stringColumn);
// Exception test
selectStmt = "select DoubleVal from "+allTypesTable;
st = db.prepare(selectStmt);
st.step();
// select double value
try {
st.column_string(0);
} catch (Exception e) {
//ok
}
}
public void testColumn_type() throws Exception {
db.exec(createAllTypes, null);
db.exec(insertAllTypes, null);
st = db.prepare("select * from " + allTypesTable);
st.step();
// Exception test
try {
st.column_type(100);
} catch (Exception e) {
// ok
}
/*
Dictionary
public static final int SQLITE_INTEGER = 1;
public static final int SQLITE_FLOAT = 2;
public static final int SQLITE_BLOB = 4;
public static final int SQLITE_NULL = 5;
public static final int SQLITE3_TEXT = 3;
public static final int SQLITE_NUMERIC = -1;
*/
assertEquals(Constants.SQLITE3_TEXT, st.column_type(23)); // ok TEXT
assertEquals(Constants.SQLITE3_TEXT, st.column_type(13)); // CHAR(20)
assertEquals(Constants.SQLITE_FLOAT, st.column_type(8));
assertEquals(Constants.SQLITE_FLOAT, st.column_type(9));
assertEquals(Constants.SQLITE_FLOAT, st.column_type(10)); // FLOAT
for (int i = 0; i < 8; i++) {
assertEquals("Expected Integer at position " + i,
Constants.SQLITE_INTEGER, st.column_type(i));
}
assertEquals(Constants.SQLITE_NULL, st.column_type(28));
assertEquals(Constants.SQLITE_NULL, st.column_type(29));
// Failing tests
assertTrue("INTEGER".equalsIgnoreCase(st.column_decltype(12)));
assertEquals(Constants.SQLITE_INTEGER, st.column_type(12));
assertTrue("FLOAT".equalsIgnoreCase(st.column_decltype(11)));
assertEquals(Constants.SQLITE_FLOAT, st.column_type(11)); // FLOAT ->
// got INTEGER
assertTrue("BLOB".equalsIgnoreCase(st.column_decltype(19)));
assertEquals(Constants.SQLITE_BLOB, st.column_type(19)); // Blob got
// INTEGER
}
/**
* @throws Exception
* @tests {@link Stmt#column_count() )}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "column_count",
args = {}
)
@KnownFailure("Wrong value is returned in case of a prepared statment to "+
"which a '*' bound ")
public void testColumn_count() throws Exception {
String selectStmt = "select * from "+DatabaseCreator.SIMPLE_TABLE1;
st = db.prepare(selectStmt);
assertEquals(3, st.column_count());
st.step();
int columnCount = st.column_count();
assertNotNull(columnCount);
assertEquals( 3, columnCount);
// actual prepared statement
selectStmt = "select ? from "+DatabaseCreator.SIMPLE_TABLE1;
st = db.prepare(selectStmt);
assertEquals(3, st.column_count());
st.bind(1, "*");
st.step();
columnCount = st.column_count();
assertNotNull(columnCount);
assertEquals( 3, columnCount);
}
/**
* @throws Exception
* @tests {@link Stmt#column(int) )}
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "method test",
method = "column",
args = {int.class}
)
public void testColumn() throws Exception {
Object columnObject = null;
int columnObjectCastFromLong;
int intColumn = 0;
try {
String selectStmt = "select * from "+DatabaseCreator.SIMPLE_TABLE1;
TableResult res = db.get_table(selectStmt);
st = db.prepare(selectStmt);
st.step();
columnObject = st.column(1);
intColumn = st.column_int(1);
assertNotNull(intColumn);
assertTrue("Integer".equalsIgnoreCase(st.column_decltype(1)));
int stSpeed = Integer.parseInt(columnObject.toString());
assertNotNull(stSpeed);
assertEquals( intColumn, stSpeed);
} catch (Exception e) {
fail("Error in test setup : " + e.getMessage());
e.printStackTrace();
}
try {
assertNotNull(columnObject);
int dummy = ((Integer) columnObject).intValue();
fail("Cast to Integer should fail");
} catch (ClassCastException e) {
assertEquals("java.lang.Long", e.getMessage());
}
try {
st.column(4);
fail("Exception expected");
} catch (Exception e) {
assertEquals( "column out of bounds" , e.getMessage());
}
try {
st.column(-1);
fail("Exception expected");
} catch (Exception e) {
assertEquals( "column out of bounds" , e.getMessage());
}
}
/**
* @tests {@link Stmt#column_table_name(int)}
*/
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
notes = "not supported",
method = "column_table_name",
args = {int.class}
)
public void testColumn_table_name() {
try {
st = db.prepare("select * from " + DatabaseCreator.SIMPLE_TABLE1);
String name = st.column_table_name(1);
fail("Function is now supported.");
} catch (Exception e) {
assertEquals("unsupported", e.getMessage());
}
}
/**
* @tests {@link Stmt#column_database_name(int)}
*/
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
notes = "not supported",
method = "column_database_name",
args = {int.class}
)
public void testColumn_database_name() {
try {
st = db.prepare("insert into " + DatabaseCreator.SIMPLE_TABLE1
+ " values (:one,:two,:three)");
String name = st.column_database_name(1);
fail("Function is now supported.");
} catch (Exception e) {
assertEquals("unsupported", e.getMessage());
}
}
/**
* @throws Exception
* @tests {@link Stmt#column_decltype(int)}
*/
@TestTargetNew(
level = TestLevel.SUFFICIENT,
notes = "method test",
method = "column_decltype",
args = {int.class}
)
public void testColumn_decltype() throws Exception {
db.exec(createAllTypes, null);
db.exec(insertAllTypes, null);
st = db.prepare("select * from " + allTypesTable);
st.step();
// Exception test
try {
st.column_decltype(100);
} catch (Exception e) {
// ok
}
assertTrue(st.column_decltype(0), "BOOLEAN".equalsIgnoreCase(st
.column_decltype(0)));
assertTrue(st.column_decltype(1), "INT".equalsIgnoreCase(st
.column_decltype(1)));
assertTrue(st.column_decltype(2), "LONG".equalsIgnoreCase(st
.column_decltype(2)));
assertTrue(st.column_decltype(3), "BIGINT".equalsIgnoreCase(st
.column_decltype(3)));
assertTrue(st.column_decltype(4), "TINYINT".equalsIgnoreCase(st
.column_decltype(4)));
assertTrue(st.column_decltype(5), "SMALLINT".equalsIgnoreCase(st
.column_decltype(5)));
assertTrue(st.column_decltype(6), "MEDIUMINT".equalsIgnoreCase(st
.column_decltype(6)));
assertTrue(st.column_decltype(7), "INTEGER".equalsIgnoreCase(st
.column_decltype(7)));
assertTrue(st.column_decltype(8), "REAL".equalsIgnoreCase(st
.column_decltype(8)));
assertTrue(st.column_decltype(9), "DOUBLE".equalsIgnoreCase(st
.column_decltype(9)));
assertTrue(st.column_decltype(10), "FLOAT".equalsIgnoreCase(st
.column_decltype(10)));
assertTrue(st.column_decltype(11), "DECIMAL".equalsIgnoreCase(st
.column_decltype(11)));
assertTrue(st.column_decltype(12), "NUMERIC".equalsIgnoreCase(st
.column_decltype(12)));
assertTrue(st.column_decltype(13), "CHAR(20)".equalsIgnoreCase(st
.column_decltype(13)));
assertTrue(st.column_decltype(19), "BLOB".equalsIgnoreCase(st
.column_decltype(19)));
assertTrue(st.column_decltype(23), "TEXT".equalsIgnoreCase(st
.column_decltype(23)));
assertTrue(st.column_decltype(28), "URL".equalsIgnoreCase(st
.column_decltype(28)));
assertTrue(st.column_decltype(29), "URL".equalsIgnoreCase(st
.column_decltype(29)));
}
/**
* @tests {@link Stmt#column_origin_name(int)}
*/
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
notes = "not supported",
method = "column_origin_name",
args = {int.class}
)
public void testColumn_origin_name() {
try {
st = db.prepare("select * from " + DatabaseCreator.SIMPLE_TABLE1);
String name = st.column_origin_name(1);
fail("Function is now supported.");
} catch (Exception e) {
assertEquals("unsupported", e.getMessage());
}
}
}