/*

   Derby - Class org.apache.derbyTesting.functionTests.tests.jdbcapi.RelativeTest

   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you 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.apache.derbyTesting.functionTests.tests.jdbcapi;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
import org.apache.derbyTesting.junit.DatabasePropertyTestSetup;
import org.apache.derbyTesting.junit.TestConfiguration;

/**
 * Tests relative scrolling of a resultset. This is the JUnit conversion of
 * jdbcapi/testRelative test.
 */
public class RelativeTest extends BaseJDBCTestCase {

	public RelativeTest(String name) {
		super(name);
	}

	/**
	 * Test relative scrolling of ResultSet with concurrency set to
	 * CONCUR_READ_ONLY.
	 */
	public void testScrolling_CONCUR_READ_ONLY() throws SQLException {
		int concurrency = ResultSet.CONCUR_READ_ONLY;
		Statement stmt1 = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				concurrency);
		ResultSet rs = stmt1.executeQuery("select * from testRelative");

		rs.next(); // First Record
		assertEquals("work1", rs.getString("name"));
		rs.relative(2);
		assertEquals("work3", rs.getString("name"));
		assertEquals(false, rs.isFirst());
		assertEquals(false, rs.isLast());
		assertEquals(false, rs.isAfterLast());
		rs.relative(-2);
		assertEquals("work1", rs.getString("name"));

		rs.relative(10);
		try {
			/*
			 * Attempting to move beyond the first/last row in the result set
			 * positions the cursor before/after the the first/last row.
			 * Therefore, attempting to get value will throw an exception.
			 */
			rs.getString("name");
			fail("FAIL - Attempting to read from an invalid row should have " +
					"thrown an exception");
		} catch (SQLException sqle) {
			/**
			 * sets the expected sql state for the expected exceptions,
			 * according to return value of usingDerbyNetClient().
			 */
			String NO_CURRENT_ROW_SQL_STATE = "";
			if (usingDerbyNetClient()) {
				NO_CURRENT_ROW_SQL_STATE = "XJ121";
			} else {
				NO_CURRENT_ROW_SQL_STATE = "24000";
			}
			assertSQLState(NO_CURRENT_ROW_SQL_STATE, sqle);
		}
	}

	/**
	 * Test relative scrolling of ResultSet with concurrency set to
	 * CONCUR_UPDATABLE.
	 */
	public void testScrolling_CONCUR_UPDATABLE() throws SQLException {
		int concurrency = ResultSet.CONCUR_UPDATABLE;
		Statement stmt1 = createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				concurrency);
		ResultSet rs = stmt1.executeQuery("select * from testRelative");

		rs.next(); // First Record
		assertEquals("work1", rs.getString("name"));
		rs.relative(2);
		assertEquals("work3", rs.getString("name"));
		assertEquals(false, rs.isFirst());
		assertEquals(false, rs.isLast());
		assertEquals(false, rs.isAfterLast());
		rs.relative(-2);
		assertEquals("work1", rs.getString("name"));

		rs.relative(10);
		try {
			/*
			 * Attempting to move beyond the first/last row in the result set
			 * positions the cursor before/after the the first/last row.
			 * Therefore, attempting to get value now will throw an exception.
			 */
			rs.getString("name");
			fail("FAIL - Attempting to read from an invalid row should have " +
				"thrown an exception");
		} catch (SQLException sqle) {
			/**
			 * sets the expected sql state for the expected exceptions,
			 * according to return value of usingDerbyNetClient().
			 */
			String NO_CURRENT_ROW_SQL_STATE = "";
			if (usingDerbyNetClient()) {
				NO_CURRENT_ROW_SQL_STATE = "XJ121";
			} else {
				NO_CURRENT_ROW_SQL_STATE = "24000";
			}
			assertSQLState(NO_CURRENT_ROW_SQL_STATE, sqle);
		}
	}

	/**
	 * Runs the test fixtures in embedded and client.
	 * 
	 * @return test suite
	 */
	public static Test suite() {
        BaseTestSuite suite = new BaseTestSuite("RelativeTest");
		suite.addTest(baseSuite("RelativeTest:embedded"));
		suite.addTest(TestConfiguration
				.clientServerDecorator(baseSuite("RelativeTest:client")));
		return suite;
	}

	/**
	 * Base suite of tests that will run in both embedded and client.
	 * 
	 * @param name
	 *            Name for the suite.
	 */
	private static Test baseSuite(String name) {
        BaseTestSuite suite = new BaseTestSuite(name);
		suite.addTestSuite(RelativeTest.class);
		return new CleanDatabaseTestSetup(DatabasePropertyTestSetup
				.setLockTimeouts(suite, 2, 4)) {

			/**
			 * Creates the tables used in the test cases.
			 * 
			 * @exception SQLException
			 *                if a database error occurs
			 */
			protected void decorateSQL(Statement stmt) throws SQLException {
				stmt.execute("create table testRelative("
						+ "name varchar(10), i int)");

				stmt.execute("insert into testRelative values ("
						+ "'work1', NULL)");
				stmt.execute("insert into testRelative values ("
						+ "'work2', NULL)");
				stmt.execute("insert into testRelative values ("
						+ "'work3', NULL)");
				stmt.execute("insert into testRelative values ("
						+ "'work4', NULL)");
			}
		};
	}
}
