package org.eclipse.basyx.regression.sqlproxy;

import static org.junit.Assert.assertTrue;

import java.util.Collection;
import java.util.Iterator;

import org.eclipse.basyx.tools.sqlproxy.SQLCollection;
import org.eclipse.basyx.tools.sqlproxy.SQLRootElement;
import org.junit.Test;



/**
 * Test SQL collection element implementation and its basic operations
 * 
 * @author kuhn
 *
 */
public class SQLProxyTestCollectionSimple {

	
	/**
	 * Store SQL root element reference
	 * - An SQL root element is the main gateway to a SQL database
	 */
	protected SQLRootElement sqlRootElement = null;

	
	
	/**
	 * Test basic operations
	 */
	@Test
	public void test() throws Exception {
		// Create SQL root element
		sqlRootElement = new SQLRootElement(SQLConfig.SQLUSER, SQLConfig.SQLPW,  "//localhost/basyx-map?", "org.postgresql.Driver", "jdbc:postgresql:", "root_el_01");
		
		// Drop tables to make sure we start with a fresh database
		sqlRootElement.dropTable(1);
		sqlRootElement.drop();

		// Create new table in database for root element
		sqlRootElement.createRootTableIfNotExists();

		// Create collection
		Collection<Object> sqlColl = sqlRootElement.createCollection(1);

		
		// Test simple collection functions
		assertTrue(sqlColl.size() == 0);
		// - Add single element
		sqlColl.add("A"); assertTrue(sqlColl.size() == 1);
		sqlColl.add("B"); assertTrue(sqlColl.size() == 2);
		sqlColl.add("A"); assertTrue(sqlColl.size() == 3);
		// - Check element presence
		assertTrue(sqlColl.contains("A") == true);
		assertTrue(sqlColl.contains("B") == true);
		assertTrue(sqlColl.contains("C") == false);
		// - Remove element
		sqlColl.remove("A"); 
		assertTrue(sqlColl.size() == 1); 
		assertTrue(sqlColl.isEmpty() == false);
		// - Clear collection
		sqlColl.clear(); 
		assertTrue(sqlColl.size() == 0); 
		assertTrue(sqlColl.isEmpty() == true);
		
		
		// Test collection iterator
		assertTrue(sqlColl.size() == 0);
		// - Fill collection
		sqlColl.add("A"); assertTrue(sqlColl.size() == 1);
		sqlColl.add("B"); assertTrue(sqlColl.size() == 2);
		sqlColl.add("A"); assertTrue(sqlColl.size() == 3);
		sqlColl.add("C"); assertTrue(sqlColl.size() == 4);
		// - Iterate elements
		Iterator<Object> it1 = sqlColl.iterator();
		assertTrue(it1.hasNext() == true); assertTrue(it1.next().equals("A"));
		assertTrue(it1.hasNext() == true); assertTrue(it1.next().equals("B"));
		assertTrue(it1.hasNext() == true); assertTrue(it1.next().equals("A"));
		assertTrue(it1.hasNext() == true); assertTrue(it1.next().equals("C"));
		assertTrue(it1.hasNext() == false);
		// - Test conversion to generic object array
		Object[] elements1 = sqlColl.toArray();
		assertTrue(elements1.length == 4);
		assertTrue(elements1[0].equals("A"));
		assertTrue(elements1[1].equals("B"));
		assertTrue(elements1[2].equals("A"));
		assertTrue(elements1[3].equals("C"));
		// - Test conversion to typed array
		String[] elements2 = sqlColl.toArray(new String[4]);
		assertTrue(elements2.length == 4);
		assertTrue(elements2[0].equals("A"));
		assertTrue(elements2[1].equals("B"));
		assertTrue(elements2[2].equals("A"));
		assertTrue(elements2[3].equals("C"));
		// - Iterate elements again
		Iterator<Object> it2 = sqlColl.iterator();
		assertTrue(it2.hasNext() == true); assertTrue(it2.next().equals("A"));
		assertTrue(it2.hasNext() == true); assertTrue(it2.next().equals("B"));
		assertTrue(it2.hasNext() == true); assertTrue(it2.next().equals("A"));
		assertTrue(it2.hasNext() == true); assertTrue(it2.next().equals("C"));
		assertTrue(it2.hasNext() == false);
		
		
		// Get all elements from collection
		Object[] arr = sqlColl.toArray();
		// - Check array contents
		assertTrue(arr.length == 4);
		assertTrue(arr[0].equals("A"));
		assertTrue(arr[1].equals("B"));
		assertTrue(arr[2].equals("A"));
		assertTrue(arr[3].equals("C"));

		
		// Connect to collection
		Collection<Object> sqlColl2 = new SQLCollection(sqlRootElement, 1);
		// - Iterate elements again
		Iterator<Object> it3 = sqlColl2.iterator();
		assertTrue(it3.hasNext() == true); assertTrue(it3.next().equals("A"));
		assertTrue(it3.hasNext() == true); assertTrue(it3.next().equals("B"));
		assertTrue(it3.hasNext() == true); assertTrue(it3.next().equals("A"));
		assertTrue(it3.hasNext() == true); assertTrue(it3.next().equals("C"));
		assertTrue(it3.hasNext() == false);

		
		// Drop tables
		sqlRootElement.dropTable(1);

		// Drop table for root element (= delete it)
		sqlRootElement.drop();
	}
}
