package org.postgresql.test.jdbc2;

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

/*
 * Test case for getArray()
 */
public class GetArrayTest extends TestCase {
    private Connection con;
    private Statement stmt;

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

    protected void setUp() throws Exception {
        con = TestUtil.openDB();
        stmt = con.createStatement();

        // Drop the test table if it already exists for some
        // reason. It is not an error if it doesn't exist.
        try {
            stmt.executeUpdate("DROP TABLE testarray");
        } catch (SQLException e) {
             // Intentionally ignore. We cannot distinguish
             // "table does not exist" from other errors, since
             // PostgreSQL doesn't support error codes yet.
        }

        stmt.executeUpdate(
           "CREATE TABLE testarray(intarray INTEGER[], strarray TEXT[])");
    }
   
    protected void tearDown() throws Exception {
        con.setAutoCommit(true);
        if (stmt != null) {
            stmt.executeUpdate("DROP TABLE testarray");
            stmt.close();
        }
        if (con != null) {
              TestUtil.closeDB(con);
        }
    }

    public void testEmptyIntArray() throws SQLException {
        stmt.executeUpdate("INSERT INTO testarray(intarray) VALUES ('{}')");

        // Check results.
        ResultSet result = stmt.executeQuery("SELECT intarray FROM testarray");
        assertTrue(result.next());
        assertEquals("{}", result.getString(1));
        int[] array = (int[])result.getArray(1).getArray();
        assertEquals(0, array.length);
        assertTrue(!result.next());
        result.close();
    }
        
    public void testIntArray() throws SQLException {
        stmt.executeUpdate("INSERT INTO testarray(intarray) VALUES ('{1,2,3,4}')");

        // Check results.
        ResultSet result = stmt.executeQuery("SELECT intarray[1], intarray[2], intarray[3], intarray[4] FROM testarray");
        assertTrue(result.next());
        assertEquals("backend element 1:", 1, result.getInt(1));
        assertEquals("backend element 2:", 2, result.getInt(2));
        assertEquals("backend element 3:", 3, result.getInt(3));
        assertEquals("backend element 4:", 4, result.getInt(4));
        assertTrue(!result.next());
        result.close();

        result = stmt.executeQuery("SELECT intarray FROM testarray");
        assertTrue(result.next());
        int[] driverArray = (int[])result.getArray(1).getArray();
        assertEquals("driver element 1:", 1, driverArray[0]);
        assertEquals("driver element 2:", 2, driverArray[1]);
        assertEquals("driver element 3:", 3, driverArray[2]);
        assertEquals("driver element 4:", 4, driverArray[3]);
        assertTrue(!result.next());
        result.close();
    }

    public void testEmptyStringArray() throws SQLException {
        stmt.executeUpdate("INSERT INTO testarray(strarray) VALUES ('{}')");

        // Check results.
        ResultSet result = stmt.executeQuery("SELECT strarray FROM testarray");
        assertTrue(result.next());
        assertEquals("{}", result.getString(1));
        Object[] array = (Object[])result.getArray(1).getArray();
        assertEquals(0, array.length);
        result.close();
    }
    
    public void testStringArray() throws SQLException {
        // this is a four-element string array with values:
        //   1: abcd
        //   2: "
        //   3: '
        //   4: \ 
        // array parser value:  {abcd,"\"",',"\\"}
        // as a string literal: '{abcd,\"\\\"\",\',\"\\\\\"}'
        // as a Java string:   "'{abcd,\\\"\\\\\\\"\\\",\\',\\\"\\\\\\\\\\\"}'"
        //  (ow!)
        
        stmt.executeUpdate("INSERT INTO testarray(strarray) VALUES('{abcd,\\\"\\\\\\\"\\\",\\',\\\"\\\\\\\\\\\"}')");

        // Check results.
        ResultSet result = stmt.executeQuery("SELECT strarray[1], strarray[2], strarray[3], strarray[4] FROM testarray");
        assertTrue(result.next());
        assertEquals("backend element 1:", "abcd", result.getString(1));
        assertEquals("backend element 2:", "\"", result.getString(2));
        assertEquals("backend element 3:", "'", result.getString(3));
        assertEquals("backend element 4:", "\\", result.getString(4));
        assertTrue(!result.next());
        result.close();

        result = stmt.executeQuery("SELECT strarray FROM testarray");
        assertTrue(result.next());
        Object[] driverArray = (Object[])result.getArray(1).getArray();
        assertEquals("driver element 1:", "abcd", driverArray[0]);
        assertEquals("driver element 2:", "\"", driverArray[1]);
        assertEquals("driver element 3:", "'", driverArray[2]);
        assertEquals("driver element 4:", "\\", driverArray[3]);
        assertTrue(!result.next());
        result.close();
    }
}
