package org.postgresql.test.jdbc2;

import org.postgresql.test.TestUtil;
import junit.framework.TestCase;
import java.sql.*;

public class ResultSetMetaDataTest extends TestCase
{

	private Connection conn;
	private Statement stmt;
	private ResultSet rs;
	private ResultSetMetaData rsmd;

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

	protected void setUp() throws Exception
	{
		conn = TestUtil.openDB();
		TestUtil.createTable(conn, "rsmd1", "a int primary key, b text, c decimal(10,2)");
		stmt = conn.createStatement();
		rs = stmt.executeQuery("SELECT a,b,c,a+c as total,oid FROM rsmd1");
		rsmd = rs.getMetaData();
	}

	protected void tearDown() throws Exception
	{
		TestUtil.dropTable(conn, "rsmd1");
		TestUtil.closeDB(conn);
		rs.close();
		stmt.close();
		rsmd = null;
		rs = null;
		stmt = null;
		conn = null;
	}

	public void testGetColumnCount() throws SQLException {
		assertTrue(rsmd.getColumnCount() == 5);
	}

	public void testGetColumnLabel() throws SQLException {
		assertTrue(rsmd.getColumnLabel(1).equals("a"));
		assertTrue(rsmd.getColumnLabel(4).equals("total"));
	}

	public void testGetColumnName() throws SQLException {
		assertTrue(rsmd.getColumnName(1).equals("a"));
		assertTrue(rsmd.getColumnName(5).equals("oid"));
        System.out.println(">>"+rsmd.getColumnName(4));
		if (TestUtil.haveMinimumServerVersion(conn,"7.4")) {
			assertTrue(rsmd.getColumnName(4).equals(""));
		}
	}

	public void testGetColumnType() throws SQLException {
		assertTrue(rsmd.getColumnType(1) == Types.INTEGER);
		assertTrue(rsmd.getColumnType(2) == Types.VARCHAR);
	}

	public void testGetColumnTypeName() throws SQLException {
		assertTrue(rsmd.getColumnTypeName(1).equals("int4"));
		assertTrue(rsmd.getColumnTypeName(2).equals("text"));
	}

	public void testGetPrecision() throws SQLException {
		assertTrue(rsmd.getPrecision(3) == 10);
	}

	public void testGetScale() throws SQLException {
		assertTrue(rsmd.getScale(3) == 2);
	}

	public void testGetSchemaName() throws SQLException {
		if (TestUtil.haveMinimumServerVersion(conn,"7.4")) {
			assertTrue(rsmd.getSchemaName(1).equals("public"));
			assertTrue(rsmd.getSchemaName(4).equals(""));
		}
	}

	public void testGetTableName() throws SQLException {
		if (TestUtil.haveMinimumServerVersion(conn,"7.4")) {
			assertTrue(rsmd.getTableName(1).equals("rsmd1"));
			assertTrue(rsmd.getTableName(4).equals(""));
		}
	}

	public void testIsNullable() throws SQLException {
		if (TestUtil.haveMinimumServerVersion(conn,"7.4")) {
			assertTrue(rsmd.isNullable(1) == ResultSetMetaData.columnNoNulls);
			assertTrue(rsmd.isNullable(2) == ResultSetMetaData.columnNullable);
			assertTrue(rsmd.isNullable(4) == ResultSetMetaData.columnNullableUnknown);
		} else {
			assertTrue(rsmd.isNullable(1) == ResultSetMetaData.columnNullableUnknown);
		}
	}

}
