/* * 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.jdbc; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.sql.Blob; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.sql.Timestamp; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Map; import java.util.TimeZone; import javax.jcr.query.QueryResult; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.modeshape.common.util.IoUtil; import org.modeshape.jdbc.util.TimestampWithTimezone; /** * Unit test for {@link org.modeshape.jdbc.JcrResultSet} */ public class JcrResultSetTest { @Mock private JcrStatement statement; private QueryResult result; private JcrResultSet resultSet; @Before public void beforeEach() throws Exception { MockitoAnnotations.initMocks(this); result = TestUtil.createQueryResult(); resultSet = new JcrResultSet(statement, result, null); Calendar londonTime = new GregorianCalendar(); londonTime.clear(); londonTime.setTimeZone(TimeZone.getTimeZone(TestUtil.TIME_ZONE)); TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone(TestUtil.TIME_ZONE)); } @After public void afterEach() throws Exception { result = null; resultSet = null; } @Test public void shouldHaveResultSet() { assertThat(resultSet, is(notNullValue())); } @Test public void shouldCallNext() throws SQLException { // iterate the full resultset for (int i = 1; i <= TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); } // after all rows have been retrieved, the resultset // should return false assertThat(resultSet.next(), is(false)); } @Test public void shouldCallGetRow() throws SQLException { // first call, before current row being set, // should return zero to indicate positioning pre-firsts row assertThat(resultSet.getRow(), is(0)); // set i=1 because row position is 1 based for (int i = 1; i <= TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); assertThat(resultSet.getRow(), is(i)); } } @Test public void shouldCallIsBeforeFirst() throws SQLException { assertThat(resultSet.isBeforeFirst(), is(true)); // as the resultset is being processed // verify isBeforeFirst is only valid before processing the resultset for (int i = 1; i <= TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); assertThat(resultSet.isBeforeFirst(), is(false)); } assertThat(resultSet.next(), is(false)); assertThat(resultSet.isBeforeFirst(), is(false)); } @Test public void shouldCallIsFirst() throws SQLException { assertThat(resultSet.isFirst(), is(false)); // as the resultset is being processed // verify isFirst is only valid for the first row of the resultset for (int i = 1; i <= TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); if (i == 1) { assertThat(resultSet.isFirst(), is(true)); } else { assertThat(resultSet.isFirst(), is(false)); } } assertThat(resultSet.next(), is(false)); assertThat(resultSet.isFirst(), is(false)); } @Test public void shouldCallIsLast() throws SQLException { resultSet.isLast(); assertThat(resultSet.isLast(), is(false)); // as the resultset is being processed // verify isLast only valid for the last row of the resultset for (int i = 1; i <= TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); if (i == TestUtil.TUPLES.size()) { assertThat(resultSet.isLast(), is(true)); } else { assertThat(resultSet.isLast(), is(false)); } } assertThat(resultSet.next(), is(false)); assertThat(resultSet.isLast(), is(false)); } @Test public void shouldCallIsAfterLast() throws SQLException { assertThat(resultSet.isAfterLast(), is(false)); // as the resultset is being processed // verify isAfterLast is only valid after processing all rows in the resultset for (int i = 1; i <= TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); assertThat(resultSet.isAfterLast(), is(false)); } assertThat(resultSet.next(), is(false)); assertThat(resultSet.isAfterLast(), is(true)); } @Test public void shouldCallGetStringUsingColmnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.STRING); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); assertThat(resultSet.getString(TestUtil.COLUMN_NAMES[col]), is(tuple[col])); } } @Test public void shouldCallGetStringUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.STRING); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); // need to increment because ResultSet is 1 based. assertThat(resultSet.getString(col + 1), is(tuple[col])); } } /** * MODE-1007 * * @throws SQLException */ @Test public void shouldCallGetLongReturnZeroWhenNullUsingColumnName() throws SQLException { int col = 8; for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); assertThat(resultSet.getLong(TestUtil.COLUMN_NAMES[col]), is(new Long(0).longValue())); } } @Test public void shouldCallGetLongUsingColumnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.LONG); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); assertThat(resultSet.getLong(TestUtil.COLUMN_NAMES[col]), is(tuple[col])); } } @Test public void shouldCallGetLongUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.LONG); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); // need to increment because ResultSet is 1 based. assertThat(resultSet.getLong(col + 1), is(tuple[col])); } } @Test public void shouldCallGetDoubleUsingColumnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.DOUBLE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); assertThat(resultSet.getDouble(TestUtil.COLUMN_NAMES[col]), is(tuple[col])); } } @Test public void shouldCallGetDoubleUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.DOUBLE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); // need to increment because ResultSet is 1 based. assertThat(resultSet.getDouble(col + 1), is(tuple[col])); } } @Test public void shouldCallGetBooleanUsingColumnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.BOOLEAN); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); assertThat(resultSet.getBoolean(TestUtil.COLUMN_NAMES[col]), is(tuple[col])); } } @Test public void shouldCallGetBooleanUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.BOOLEAN); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); // need to increment because ResultSet is 1 based. assertThat(resultSet.getBoolean(col + 1), is(tuple[col])); } } @Test public void shouldCallGetDateUsingColumnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Date r = resultSet.getDate(col + 1); // the result date should match the date coming from the souce, no change should occur // somewhere based on calendar or timezone assertThat(r.toString(), is(TestUtil.USE_DATE_FOR_SOURCE)); } } @Test public void shouldCallGetDateUsingColumnNameAndCalendar() throws SQLException { Calendar localTime = new GregorianCalendar(); localTime.setTimeZone(TimeZone.getTimeZone(TestUtil.EXPECTED_TIMEZONE)); int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Date resultDate = resultSet.getDate(col + 1, localTime); assertThat(resultDate.toString(), is(TestUtil.EXPECTED_DATE_FOR_TARGET)); } } @Test public void shouldCallGetDateUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Date r = resultSet.getDate(col + 1); // the result date should match the date coming from the souce, no change should occur // somewhere based on calendar or timezone assertThat(r.toString(), is(TestUtil.USE_DATE_FOR_SOURCE)); } } @Test public void shouldCallGetDateUsingColmnIndexAndCalendar() throws SQLException { Calendar localTime = new GregorianCalendar(); localTime.setTimeZone(TimeZone.getTimeZone(TestUtil.EXPECTED_TIMEZONE)); int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Date resultDate = resultSet.getDate(col + 1, localTime); assertThat(resultDate.toString(), is(TestUtil.EXPECTED_DATE_FOR_TARGET)); } } @Test public void shouldCallGetTimeUsingColumnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Time r = resultSet.getTime(col + 1); // the result date should match the date coming from the souce, no change should occur // somewhere based on calendar or timezone assertThat(r.toString(), is(TestUtil.USE_TIME_FOR_SOURCE)); } } @Test public void shouldCallGetTimeUsingColumnNameAndCalendar() throws SQLException { Calendar localTime = new GregorianCalendar(); localTime.setTimeZone(TimeZone.getTimeZone(TestUtil.EXPECTED_TIMEZONE)); String EXPECTED_TIME_FOR_TARGET = "08:39:10"; int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Time resultTime = resultSet.getTime(TestUtil.COLUMN_NAMES[col], localTime); assertThat(resultTime.toString(), is(EXPECTED_TIME_FOR_TARGET)); } } @Test public void shouldCallGetTimeUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Time r = resultSet.getTime(col + 1); // the result date should match the date coming from the souce, no change should occur // somewhere based on calendar or timezone assertThat(r.toString(), is(TestUtil.USE_TIME_FOR_SOURCE)); } } @Test public void shouldCallGetTimeUsingColmnIndexAndCalendar() throws SQLException { Calendar localTime = new GregorianCalendar(); localTime.setTimeZone(TimeZone.getTimeZone(TestUtil.EXPECTED_TIMEZONE)); String EXPECTED_TIME_FOR_TARGET = "08:39:10"; int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Time resultTime = resultSet.getTime(col + 1, localTime); assertThat(resultTime.toString(), is(EXPECTED_TIME_FOR_TARGET)); } } @Test public void shouldCallGetTimeStampUsingColumnName() throws SQLException { int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Timestamp r = resultSet.getTimestamp(col + 1); // the result date should match the date coming from the souce, no change should occur // somewhere based on calendar or timezone assertThat(r.toString(), is(TestUtil.USE_TIMESTAMP_FOR_SOURCE)); } } @Test public void shouldCallGetTimeStampUsingColumnNameAndCalendar() throws SQLException { Calendar localTime = new GregorianCalendar(); localTime.clear(); localTime.setTimeZone(TimeZone.getTimeZone(TestUtil.EXPECTED_TIMEZONE)); int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Timestamp resultTimestamp = resultSet.getTimestamp(TestUtil.COLUMN_NAMES[col], localTime); assertThat(resultTimestamp.toString(), is(TestUtil.EXPECTED_TIMESTAMP_FOR_TARGET)); } } @Test public void shouldCallGetTimeStampUsingColmnIndex() throws SQLException { int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Timestamp r = resultSet.getTimestamp(col + 1); // the result date should match the date coming from the souce, no change should occur // somewhere based on calendar or timezone assertThat(r.toString(), is(TestUtil.USE_TIMESTAMP_FOR_SOURCE)); } } @Test public void shouldCallGetTimeStampUsingColmnIndexAndCalendar() throws SQLException { Calendar localTime = new GregorianCalendar(); localTime.clear(); localTime.setTimeZone(TimeZone.getTimeZone(TestUtil.EXPECTED_TIMEZONE)); int col = getColumnTypeLoc(TestUtil.DATE); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); java.sql.Timestamp resultTime = resultSet.getTimestamp(col + 1, localTime); assertThat(resultTime.toString(), is(TestUtil.EXPECTED_TIMESTAMP_FOR_TARGET)); } } @Test public void shouldCallGetBytesUsingColmnIndex() throws SQLException { int numCols = TestUtil.COLUMN_NAMES.length; for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); // need to start at 1 because ResultSet is 1 based. for (int x = 1; x <= numCols; x++) { Object expectedValue = tuple[x - 1]; if (expectedValue != null && !(expectedValue instanceof byte[])) { expectedValue = expectedValue.toString().getBytes(); } assertThat(resultSet.getBytes(x), is(expectedValue)); } } } @Test public void shouldCallGetBytesUsingColumnName() throws SQLException { int numCols = TestUtil.COLUMN_NAMES.length; for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); for (int x = 0; x < numCols; x++) { Object expectedValue = tuple[x]; if (expectedValue != null && !(expectedValue instanceof byte[])) { expectedValue = expectedValue.toString().getBytes(); } assertThat(resultSet.getBytes(TestUtil.COLUMN_NAMES[x]), is(expectedValue)); } } } @Test public void shouldCallGetBinaryUsingColmnIndex() throws SQLException, IOException { int col = getColumnTypeLoc(TestUtil.BINARY); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); // need to increment because ResultSet is 1 based. assertThat(IoUtil.readBytes(resultSet.getBinaryStream(col + 1)), is(tuple[col])); } } @Test public void shouldCallGetBinaryUsingColumnName() throws SQLException, IOException { int col = getColumnTypeLoc(TestUtil.BINARY); for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); assertThat(IoUtil.readBytes(resultSet.getBinaryStream(TestUtil.COLUMN_NAMES[col])), is(tuple[col])); } } @Test public void shouldCallGetObjectUsingColumnName() throws Exception { int numCols = TestUtil.COLUMN_NAMES.length; for (int i = 0; i < TestUtil.TUPLES.size(); i++) { assertThat(resultSet.next(), is(true)); Object[] tuple = TestUtil.TUPLES.get(i); for (int x = 0; x < numCols; x++) { Object o = resultSet.getObject(TestUtil.COLUMN_NAMES[x]); Object expectedValue = tuple[x]; if (expectedValue instanceof Calendar) { expectedValue = new Timestamp(((Calendar)expectedValue).getTimeInMillis()); } if (expectedValue instanceof byte[]) { assertThat(o instanceof Blob, is(true)); assert o != null; o = IoUtil.readBytes(((Blob)o).getBinaryStream()); } assertThat((o != null ? o : null), is((expectedValue != null ? expectedValue : null))); } } } private int getColumnTypeLoc( String type ) { for (int i = 0; i <= TestUtil.TYPE_NAMES.length; i++) { if (TestUtil.TYPE_NAMES[i].equals(type)) { return i; } } assertFalse("Did not find a type match: " + type, true); return -1; } @Test public void shouldReturnMetaData() throws SQLException { assertThat(resultSet.getMetaData(), is(notNullValue())); } @Test public void shouldReturnFetchDirection() throws SQLException { assertThat(resultSet.getFetchDirection(), is(ResultSet.FETCH_FORWARD)); } @Test public void shouldReturnDefaultFetchSize() throws SQLException { assertThat(resultSet.getFetchSize(), is(0)); } @Test public void shouldReturnHoldability() throws SQLException { assertThat(resultSet.getHoldability(), is(0)); } @Test public void shouldBeAbleToClose() { resultSet.close(); } @Test public void shouldReturnIsClosed() { assertThat(resultSet.isClosed(), is(false)); } /** * Since no current row is set, it should return 0 * * @throws SQLException */ @Test public void shouldReturnRow() throws SQLException { assertThat(resultSet.getRow(), is(0)); } @Test public void shouldFindColumn() throws SQLException { assertThat(resultSet.findColumn(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A), is(1)); } @Test public void shouldCallConcurrency() throws SQLException { assertThat(resultSet.getConcurrency(), is(0)); } // ******************* // There are 3 - wasNull - tests because each has its own path for setting current value. // ******************* @Test public void shouldCallWasNull() throws SQLException { // wasNull should be null until a get method is called assertTrue(resultSet.wasNull()); assertThat(resultSet.next(), is(true)); assertTrue(resultSet.wasNull()); assertThat(resultSet.getString(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A), is(notNullValue())); assertFalse(resultSet.wasNull()); } @Test public void shouldCallWasNullCallingGetObject() throws SQLException { // wasNull should be null until a get method is called assertTrue(resultSet.wasNull()); assertThat(resultSet.next(), is(true)); assertTrue(resultSet.wasNull()); assertThat(resultSet.getObject(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A), is(notNullValue())); assertFalse(resultSet.wasNull()); } @Test public void shouldCallWasNullCallingGetBytes() throws SQLException { // wasNull should be null until a get method is called assertTrue(resultSet.wasNull()); assertThat(resultSet.next(), is(true)); assertTrue(resultSet.wasNull()); assertThat(resultSet.getBytes(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A), is(notNullValue())); assertFalse(resultSet.wasNull()); } // ******************* // The following tests should throw an exception because fetch direction is {@link ResultSet#FETCH_FORWARD}, // therefore, cursor movement related methods are not supported. // ******************* /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForFetchDirectionNotForward() throws SQLException { resultSet.setFetchDirection(ResultSet.FETCH_REVERSE); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForBeforeFirst() throws SQLException { resultSet.beforeFirst(); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForFirst() throws SQLException { assertThat(resultSet.first(), is(false)); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForLast() throws SQLException { assertThat(resultSet.last(), is(false)); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForAfterLast() throws SQLException { resultSet.afterLast(); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForMoveToCurrentRow() throws SQLException { resultSet.moveToCurrentRow(); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForAbsolute() throws SQLException { resultSet.absolute(1); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForRelative() throws SQLException { resultSet.relative(1); } // ******************* // The following methods are not supported because updates are not supported // // NOTE: Not all the UPDATE related methods are tested here because // they all call the same 2 methods: // 1. notClosed(); // 2. noUpdates(); // Therefore, only 2 tests; insertRow() and deleteRow() are tested to verify // the accuracy of those 2 internal methods. // ******************* /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForInsertRow() throws SQLException { resultSet.insertRow(); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForDeleteRow() throws SQLException { resultSet.deleteRow(); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForMoveToInsertRow() throws SQLException { resultSet.moveToInsertRow(); } // ******************* // The following tests initiate invalid test in order // to validate expected exceptions // ******************* /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForInvalidColumnIndexPlus1() throws SQLException { assertThat(resultSet.next(), is(true)); resultSet.getString(TestUtil.COLUMN_NAMES.length + 1); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionForInvalidColumnIndexMinus1() throws SQLException { assertThat(resultSet.next(), is(true)); resultSet.getString(-1); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionResultSetIsForwardOnly() throws SQLException { resultSet.first(); } /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionInvalidColumn() throws SQLException { assertThat(resultSet.next(), is(true)); resultSet.getString("InvalidColumnName"); } /** * Not all the update related methods are tested because they all perform the same check. * * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowUpdatesNotSupported() throws SQLException { assertThat(resultSet.next(), is(true)); resultSet.insertRow(); } // ******************* // These are negative tests and verify exception is thrown // when the resultset is closed // ******************* /** * @throws SQLException */ @Test( expected = SQLException.class ) public void shouldThrowExceptionResultSetIsClosed() throws SQLException { resultSet.close(); resultSet.next(); } @Test( expected = SQLException.class ) public void shouldThrowExceptionIsClosedWhenGettingValue() throws SQLException { resultSet.close(); resultSet.getString(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A); } @Test( expected = SQLException.class ) public void shouldThrowExceptionIsClosedWhenGettingObject() throws SQLException { resultSet.close(); resultSet.getObject(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A); } @Test( expected = SQLException.class ) public void shouldThrowExceptionIsClosedWhenGettingBytes() throws SQLException { resultSet.close(); resultSet.getBytes(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A); } // ******************* // There are negative tests the verify an exception will be thrown // when the row has not been set; // ******************* @Test( expected = SQLException.class ) public void shouldThrowExceptionIsRowSetWhenGettingValue() throws SQLException { resultSet.getString(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A); } @Test( expected = SQLException.class ) public void shouldThrowExceptionIsRowSetWhenGettingObject() throws SQLException { resultSet.getObject(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A); } @Test( expected = SQLException.class ) public void shouldThrowExceptionIsRowSetWhenGettingBytes() throws SQLException { resultSet.getBytes(TestUtil.COLUMN_NAME_PROPERTIES.PROP_A); } // ******************* // The following are unsupported features // ******************* /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetRowIDInt() throws SQLException { resultSet.getRowId(0); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetRowIDString() throws SQLException { resultSet.getRowId("columnname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetCursorName() throws SQLException { resultSet.getCursorName(); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetArrayIdx() throws SQLException { resultSet.getArray(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetArrayColName() throws SQLException { resultSet.getArray("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetAsciiStreamIdx() throws SQLException { resultSet.getAsciiStream(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetAsciiStreamColName() throws SQLException { resultSet.getAsciiStream("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetCharacterStreamIdx() throws SQLException { resultSet.getCharacterStream(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetCharacterStreamColName() throws SQLException { resultSet.getCharacterStream("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetClobIdx() throws SQLException { resultSet.getClob(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetClobColName() throws SQLException { resultSet.getClob("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetNCharacterStreamIdx() throws SQLException { resultSet.getNCharacterStream(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetNCharacterStreamColName() throws SQLException { resultSet.getNCharacterStream("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetNClobIdx() throws SQLException { resultSet.getNClob(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetNClobColName() throws SQLException { resultSet.getNClob("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetNStringIdx() throws SQLException { resultSet.getNString(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetNStringColName() throws SQLException { resultSet.getNString("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetObjectIdxMap() throws SQLException { resultSet.getObject(1, (Map<String, Class<?>>)null); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetObjectColNameMap() throws SQLException { resultSet.getObject("colname", (Map<String, Class<?>>)null); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetObjectIdxClass() throws SQLException { resultSet.getObject(1, (Class<?>)null); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetObjectColNameClass() throws SQLException { resultSet.getObject("colname", (Class<?>)null); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetRefIdx() throws SQLException { resultSet.getRef(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetRefColName() throws SQLException { resultSet.getRef("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetSQLXMLIdx() throws SQLException { resultSet.getSQLXML(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetSQLXMLColName() throws SQLException { resultSet.getSQLXML("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetUnicodeStreamIdx() throws SQLException { resultSet.getUnicodeStream(1); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingGetUnicodeStreamColName() throws SQLException { resultSet.getUnicodeStream("colname"); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingRowDeleted() throws SQLException { resultSet.rowDeleted(); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingRowInserted() throws SQLException { resultSet.rowInserted(); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingRowUpdated() throws SQLException { resultSet.rowUpdated(); } /** * @throws SQLException */ @Test( expected = SQLFeatureNotSupportedException.class ) public void featureNotSupportedCallingSetFetchDirectionForward() throws SQLException { resultSet.setFetchDirection(ResultSet.FETCH_FORWARD); } }