/**************************************************************
 * 
 * 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 complex.dbaccess;

import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.container.XNamed;
import com.sun.star.sdb.XQueriesSupplier;
import com.sun.star.sdbcx.XColumnsSupplier;
import com.sun.star.uno.UnoRuntime;
import connectivity.tools.CRMDatabase;

// ---------- junit imports -----------------
import org.junit.Test;
import static org.junit.Assert.*;
// ------------------------------------------

public class Query extends TestCase
{

    connectivity.tools.HsqlDatabase m_database;

    // --------------------------------------------------------------------------------------------------------
    private void createTestCase()
    {
        try
        {
            if (m_database == null)
            {
                final CRMDatabase database = new CRMDatabase(getMSF(), false);
                m_database = database.getDatabase();
            }
        }
        catch (Exception e)
        {
            System.out.println("could not create the test case, error message:\n" + e.getMessage());
            e.printStackTrace(System.err);
            fail("failed to created the test case");
        }
    }

    // --------------------------------------------------------------------------------------------------------
//    private XMultiServiceFactory getFactory()
//    {
//        return (XMultiServiceFactory)param.getMSF();
//    }
    // --------------------------------------------------------------------------------------------------------
    @Test
    public void testQueryColumns()
    {
        createTestCase();

        try
        {
            final XQueriesSupplier suppQueries = UnoRuntime.queryInterface(
                XQueriesSupplier.class, m_database.defaultConnection().getXConnection() );
            final XNameAccess queries = suppQueries.getQueries();

            final String[] queryNames = new String[] { "parseable", "parseable native", "unparseable" };
            final String[][] expectedColumnNames = new String[][] {
                new String[] { "ID", "Name", "Address", "City", "Postal","Comment" },
                new String[] { "TABLE_CATALOG", "TABLE_SCHEMA", "TABLE_NAME", "VIEW_DEFINITION", "CHECK_OPTION", "IS_UPDATABLE", "VALID" },
                new String[] { "ID_VARCHAR" }
            };

            for ( int i = 0; i < queryNames.length; ++i )
            {
				if (queries.hasByName(queryNames[i]))
                {
	                final XPropertySet query = UnoRuntime.queryInterface(
    	                XPropertySet.class, queries.getByName( queryNames[i] ) );

        	        final XColumnsSupplier suppCols = UnoRuntime.queryInterface(
            	        XColumnsSupplier.class, query);
                	final XIndexAccess columns = UnoRuntime.queryInterface(
                    			XIndexAccess.class, suppCols.getColumns());

    	            // check whether the columns supplied by the query match what we expected
	                assertTrue( "invalid column count (found " + columns.getCount() + ", expected: " + expectedColumnNames[i].length + ") for query \"" + queryNames[i] + "\"",
        	            columns.getCount() == expectedColumnNames[i].length );
            	    for ( int col = 0; col < columns.getCount(); ++col )
                	{
                    	final XNamed columnName = UnoRuntime.queryInterface(
                        	XNamed.class, columns.getByIndex(col) );
	                    assertTrue( "column no. " + col + " of query \"" + queryNames[i] + "\" not matching",
    	                    columnName.getName().equals( expectedColumnNames[i][col] ) );
        	        }
				}
            }
        }
        catch ( Exception e )
        {
            fail( "caught an unexpected exception: " + e.getMessage() );
        }
    }
}
