package com.github.davidmoten.rx.jdbc;
import static com.github.davidmoten.rx.jdbc.Util.autoMap;
import static com.github.davidmoten.rx.jdbc.Util.closeQuietly;
import static com.github.davidmoten.rx.jdbc.Util.closeQuietlyIfAutoCommit;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Arrays;
import org.easymock.EasyMock;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import com.github.davidmoten.junit.Asserts;
public class UtilTest {
@Test
public void obtainCoverageOfPrivateConstructor() {
Asserts.assertIsUtilityClass(Util.class);
}
@Test
public void testAutoMapOfUtilDateToSqlDate() {
assertEquals(new java.sql.Date(1), autoMap(new java.util.Date(1), java.sql.Date.class));
}
@Test
public void testAutoMapOfSqlDateToUtilDate() {
assertEquals(new java.util.Date(1), autoMap(new java.sql.Date(1), java.util.Date.class));
}
@Test
public void testAutoMapOfSqlDateToLong() {
assertEquals(1L, autoMap(new java.sql.Date(1), Long.class));
}
@Test
public void testAutoMapOfSqlDateToBigInteger() {
assertEquals(BigInteger.ONE, autoMap(new java.sql.Date(1), BigInteger.class));
}
private static class Simple {
}
@Test
public void testAutoMapOfSqlDateToSimple() {
assertEquals(new java.sql.Date(1), autoMap(new java.sql.Date(1), Simple.class));
}
@Test
public void testAutoMapOfSqlTimestampToUtilDate() {
assertEquals(new java.util.Date(1),
autoMap(new java.sql.Timestamp(1), java.util.Date.class));
}
@Test
public void testAutoMapOfSqlTimestampToLong() {
assertEquals(1L, autoMap(new java.sql.Timestamp(1), Long.class));
}
@Test
public void testAutoMapOfSqlTimestampToBigInteger() {
assertEquals(BigInteger.ONE, autoMap(new java.sql.Timestamp(1), BigInteger.class));
}
@Test
public void testAutoMapOfSqlTimestampToSimple() {
assertEquals(new java.sql.Timestamp(1), autoMap(new java.sql.Timestamp(1), Simple.class));
}
@Test
public void testAutoMapOfSqlTimeToUtilDate() {
assertEquals(new java.util.Date(1), autoMap(new java.sql.Time(1), java.util.Date.class));
}
@Test
public void testAutoMapOfSqlTimeToLong() {
assertEquals(1L, autoMap(new java.sql.Time(1), Long.class));
}
@Test
public void testAutoMapOfSqlTimeToBigInteger() {
assertEquals(BigInteger.ONE, autoMap(new java.sql.Time(1), BigInteger.class));
}
@Test
public void testAutoMapOfSqlTimeToSimple() {
assertEquals(new java.sql.Time(1), autoMap(new java.sql.Time(1), Simple.class));
}
@Test
public void testAutoMapBlobToByteArray() throws SQLException {
Blob blob = EasyMock.createMock(Blob.class);
byte[] b = "hello there".getBytes();
expect(blob.getBinaryStream()).andReturn(new ByteArrayInputStream(b)).once();
blob.free();
EasyMock.expectLastCall().once();
replay(blob);
Object bytes = autoMap(blob, byte[].class);
Arrays.equals(b, (byte[]) bytes);
verify(blob);
}
@Test
public void testAutoMapBlobToSimple() throws SQLException {
Blob blob = EasyMock.createMock(Blob.class);
replay(blob);
Object bytes = autoMap(blob, Simple.class);
assertEquals(bytes, blob);
verify(blob);
}
@Test
public void testAutoMapClobToByteArray() throws SQLException {
Clob clob = EasyMock.createMock(Clob.class);
String s = "hello there";
expect(clob.getCharacterStream()).andReturn(new StringReader(s)).once();
clob.free();
EasyMock.expectLastCall().once();
replay(clob);
Object string = autoMap(clob, String.class);
assertEquals(s, string);
verify(clob);
}
@Test
public void testAutoMapClobToSimple() throws SQLException {
Clob clob = EasyMock.createMock(Clob.class);
replay(clob);
Object result = autoMap(clob, Simple.class);
assertEquals(clob, result);
verify(clob);
}
@Test
public void testAutoMapBigIntegerToLong() {
assertEquals(1L, autoMap(BigInteger.ONE, Long.class));
}
@Test
public void testAutoMapBigIntegerToDouble() {
assertEquals(1.0, (Double) autoMap(BigInteger.ONE, Double.class), 0.00001);
}
@Test
public void testAutoMapBigIntegerToFloat() {
assertEquals(1.0, (Float) autoMap(BigInteger.ONE, Float.class), 0.00001);
}
@Test
public void testAutoMapBigIntegerToShort() {
assertEquals((short) 1, autoMap(BigInteger.ONE, Short.class));
}
@Test
public void testAutoMapBigIntegerToInteger() {
assertEquals(1, autoMap(BigInteger.ONE, Integer.class));
}
@Test
public void testAutoMapBigDecimalToDouble() {
assertEquals(1.0, (Double) autoMap(BigDecimal.ONE, Double.class), 0.00001);
}
@Test
public void testAutoMapBigDecimalToFloat() {
assertEquals(1.0, (Float) autoMap(BigDecimal.ONE, Float.class), 0.00001);
}
@Test
public void testAutoMapBigDecimalToShort() {
assertEquals((short) 1, autoMap(BigDecimal.ONE, Short.class));
}
@Test
public void testAutoMapBigDecimalToInteger() {
assertEquals(1, autoMap(BigDecimal.ONE, Integer.class));
}
@Test
public void testAutoMapBigDecimalToLong() {
assertEquals(1L, autoMap(BigDecimal.ONE, Long.class));
}
@Test
public void testAutoMapOfBigIntegerToSimple() {
assertEquals(BigInteger.ONE, autoMap(BigInteger.ONE, Simple.class));
}
@Test
public void testAutoMapOfBigDecimalToSimple() {
assertEquals(BigDecimal.ONE, autoMap(BigDecimal.ONE, Simple.class));
}
@Test
public void testAutoMapOfDoubleToBigDecimal() {
assertEquals(BigDecimal.ONE.doubleValue(),
((BigDecimal) autoMap(1.0, BigDecimal.class)).doubleValue(), 0.0001);
}
@Test
public void testAutoMapOfIntegerToBigDecimal() {
assertEquals(BigDecimal.ONE.doubleValue(),
((BigDecimal) autoMap(1, BigDecimal.class)).doubleValue(), 0.0001);
}
@Test
public void testAutoMapOfDoubleToBigInteger() {
assertEquals(1.2, (Double) autoMap(1.2, BigInteger.class), 0.0001);
}
@Test
public void testAutoMapOfShortToBigInteger() {
assertEquals(BigInteger.ONE, autoMap((short) 1, BigInteger.class));
}
@Test
public void testAutoMapOfIntegerToBigInteger() {
assertEquals(BigInteger.ONE, autoMap(1, BigInteger.class));
}
@Test
public void testAutoMapOfNumberToBigInteger() {
assertEquals(BigInteger.ONE, autoMap(1L, BigInteger.class));
}
@Test
public void testAutoMapOfNumberToInteger() {
assertEquals(1, autoMap(1L, Integer.class));
}
@Test
public void testAutoMapOfNumberToShort() {
assertEquals((short) 1, autoMap(1L, Short.class));
}
@Test
public void testAutoMapOfNumberToDouble() {
assertEquals(1.0, (Double) autoMap(1L, Double.class), 0.00001);
}
@Test
public void testAutoMapOfNumberToLong() {
assertEquals(1L, (long) (Long) autoMap(1, Long.class));
}
@Test
public void testAutoMapOfLongToFloat() {
assertEquals(1.0f, (Float) autoMap(1L, Float.class), 0.00001);
}
@Test
public void testClose1() throws SQLException {
Connection con = createMock(Connection.class);
expect(con.isClosed()).andThrow(new SQLException());
replay(con);
closeQuietly(con);
verify(con);
}
@Test(expected = RuntimeException.class)
public void testClose2() throws SQLException {
Connection con = createMock(Connection.class);
expect(con.isClosed()).andThrow(new SQLException());
replay(con);
closeQuietlyIfAutoCommit(con);
verify(con);
}
@Test(expected = RuntimeException.class)
public void testCommit() throws SQLException {
Connection con = createMock(Connection.class);
con.commit();
expectLastCall().andThrow(new SQLException());
replay(con);
Util.commit(con);
verify(con);
}
@Test
public void testCommitNullDoesNothing() {
Util.commit(null);
}
@Test
public void testRollbackNullDoesNothing() {
Util.rollback(null);
}
@Test(expected = RuntimeException.class)
public void testRollback() throws SQLException {
Connection con = createMock(Connection.class);
con.rollback();
expectLastCall().andThrow(new SQLException());
replay(con);
Util.rollback(con);
verify(con);
}
@Test
public void testMapObjectExistingClob() throws SQLException, IOException {
final Clob mock = Mockito.mock(Clob.class);
Mockito.when(mock.getCharacterStream()).thenAnswer(new Answer<Reader>() {
@Override
public Reader answer(InvocationOnMock invocationOnMock) throws Throwable {
return new StringReader("test");
}
});
final ResultSetMetaData metaData = Mockito.mock(ResultSetMetaData.class);
Mockito.when(metaData.getColumnType(1)).thenAnswer(new Answer<Integer>() {
@Override
public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
return Types.CLOB;
}
});
ResultSet resultSet = Mockito.mock(ResultSet.class);
Mockito.when(resultSet.getObject(1)).thenAnswer(new Answer<Clob>() {
@Override
public Clob answer(InvocationOnMock invocationOnMock) throws Throwable {
return mock;
}
});
Mockito.when(resultSet.getClob(1)).thenAnswer(new Answer<Clob>() {
@Override
public Clob answer(InvocationOnMock invocationOnMock) throws Throwable {
return mock;
}
});
Mockito.when(resultSet.getMetaData()).thenAnswer(new Answer<ResultSetMetaData>() {
@Override
public ResultSetMetaData answer(InvocationOnMock invocationOnMock) throws Throwable {
return metaData;
}
});
assertEquals(Util.mapObject(resultSet, String.class, 1), "test");
}
@Test
public void testMapObjectNullClob() throws SQLException, IOException {
final ResultSetMetaData metaData = Mockito.mock(ResultSetMetaData.class);
Mockito.when(metaData.getColumnType(1)).thenAnswer(new Answer<Integer>() {
@Override
public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
return Types.CLOB;
}
});
ResultSet resultSet = Mockito.mock(ResultSet.class);
Mockito.when(resultSet.getObject(1)).thenAnswer(new Answer<Clob>() {
@Override
public Clob answer(InvocationOnMock invocationOnMock) throws Throwable {
return null;
}
});
Mockito.when(resultSet.getClob(1)).thenAnswer(new Answer<Clob>() {
@Override
public Clob answer(InvocationOnMock invocationOnMock) throws Throwable {
return null;
}
});
Mockito.when(resultSet.getMetaData()).thenAnswer(new Answer<ResultSetMetaData>() {
@Override
public ResultSetMetaData answer(InvocationOnMock invocationOnMock) throws Throwable {
return metaData;
}
});
assertEquals(Util.mapObject(resultSet, String.class, 1), null);
}
@Test
public void testCamelCaseToUnderscore() {
assertEquals("a", Util.camelCaseToUnderscore("a"));
}
@Test
public void testCamelCaseToUnderscore2() {
assertEquals("ab", Util.camelCaseToUnderscore("ab"));
}
@Test
public void testCamelCaseToUnderscore3() {
assertEquals("a_B", Util.camelCaseToUnderscore("aB"));
}
@Test
public void testCamelCaseToUnderscore4() {
assertEquals("a_BC", Util.camelCaseToUnderscore("aBC"));
}
@Test
public void testCamelCaseToUnderscore5() {
assertEquals("a_Before_Count", Util.camelCaseToUnderscore("aBeforeCount"));
}
@Test
public void testCamelCaseToUnderscore6() {
assertEquals("", Util.camelCaseToUnderscore(""));
}
@Test
public void testCountOfQuestionMarks() {
assertEquals(2,
Util.countQuestionMarkParameters("select name from blah where a <? and b = ?"));
}
@Test
public void testCountOfQuestionMarksIgnoresTextInQuotes() {
assertEquals(1,
Util.countQuestionMarkParameters("select name from blah where a < '?' and b = ?"));
}
@Test
public void testCountOfNoQuestionMarks() {
assertEquals(0, Util.countQuestionMarkParameters("boo"));
}
@Test
public void testCountOfNoQuestionMarksReturnsZeroWhenEmptyString() {
assertEquals(0, Util.countQuestionMarkParameters(""));
}
@Test
public void testCountOfNoQuestionMarksSkipsNestedUnclosedQuotes() {
assertEquals(1, Util.countQuestionMarkParameters(
"select name from person where name > '\"?' and name > ?"));
}
}