package eu.dnetlib.dlms;

import static org.junit.Assert.assertEquals;

import java.sql.SQLException;

import javax.xml.bind.JAXBException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Before;
import org.junit.Test;

import com.google.common.collect.Lists;

import eu.dnetlib.dlms.jdbc.ColumnInfo;
import eu.dnetlib.dlms.jdbc.DOLResultSet;
import eu.dnetlib.dlms.jdbc.DOLResultSetMetaData;
import eu.dnetlib.dlms.jdbc.DOLStatement;
import eu.dnetlib.dlms.jdbc.InformationObject;
import eu.dnetlib.dlms.jdbc.InformationObjectImpl;
import eu.dnetlib.dlms.jdbc.SimpleDOLResultSet;
import eu.dnetlib.dlms.jdbc.serialization.ItemType;
import eu.dnetlib.dlms.jdbc.serialization.ItemWrapper;
import eu.dnetlib.dlms.jdbc.serialization.RSMetadataWrapper;
import eu.dnetlib.dlms.jdbc.server.ResultSetWrapper;
import eu.dnetlib.dlms.lowlevel.objects.DorotyObjectEnum;
import eu.dnetlib.miscutils.jaxb.JaxbFactory;

/**
 * Tests object serialization.
 * 
 * @author lexis
 * 
 */
public class ResultSetWrapperTest {
	/** logger. */
	private static final Log log = LogFactory.getLog(ResultSetWrapperTest.class);
	private ResultSetWrapper rsWrapper;
	private JaxbFactory<ItemWrapper> itemFactory;
	private JaxbFactory<RSMetadataWrapper> metadataFactory;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		this.itemFactory = new JaxbFactory<ItemWrapper>(ItemWrapper.class);
		this.metadataFactory = new JaxbFactory<RSMetadataWrapper>(RSMetadataWrapper.class);
		this.rsWrapper = new ResultSetWrapper(new SimpleDOLResultSet(new DOLStatement(), null), this.itemFactory, this.metadataFactory);
	}

	/**
	 * Test method for {@link eu.dnetlib.dlms.jdbc.server.ResultSetWrapper#serialize(java.lang.Object)}.
	 * 
	 * @throws JAXBException
	 */
	@Test
	public void testSerialize() throws JAXBException {
		final InformationObject iobj = new InformationObjectImpl(1);
		iobj.setType("obj");
		iobj.setSet("setName");
		final String serializedRS = this.rsWrapper.serialize(new Object[] { iobj, iobj });
		final ItemWrapper item = new ItemWrapper();
		item.getTypes().add(ItemType.INFORMATION_OBJECT);
		final String descrString = "1,obj,setName";
		item.getValues().add(descrString);
		item.getTypes().add(ItemType.INFORMATION_OBJECT);
		final String descrString2 = "1,obj,setName";
		item.getValues().add(descrString2);
		final String serializedFactory = this.itemFactory.serialize(item);
		log.info("RESULTSET WRAPPER SERIALIZED :" + serializedRS);
		log.info("JAXBFACTORY SERIALIZED :" + serializedFactory);
		assertEquals(serializedRS, serializedFactory);
	}

	/**
	 * Test method for
	 * {@link eu.dnetlib.dlms.jdbc.server.ResultSetWrapper#serializeMetaData(java.sql.ResultSetMetaData)}.
	 * 
	 * @throws JAXBException
	 * @throws SQLException
	 */
	@Test
	public void testSerializeMetaData() throws JAXBException, SQLException {
		final DOLResultSet resultSet = new SimpleDOLResultSet(new DOLStatement(), new ColumnInfo[] {
				new ColumnInfo("test1", DorotyObjectEnum.std_boolean), new ColumnInfo("test2", DorotyObjectEnum.d_boolean) });
		final DOLResultSetMetaData md = new DOLResultSetMetaData(resultSet);
		final String serializedRS = this.rsWrapper.serializeMetadata(md);
		log.info("RESULTSET WRAPPER SERIALIZED :" + serializedRS);
		final RSMetadataWrapper wrapper = new RSMetadataWrapper(2, Lists.newArrayList("test1", "test2"), Lists.newArrayList(DorotyObjectEnum.std_boolean
				.getTypeCode(), DorotyObjectEnum.d_boolean.getTypeCode()));
		final String serializedFactory = this.metadataFactory.serialize(wrapper);
		log.info("JAXBFACTORY SERIALIZED :" + serializedFactory);
		assertEquals(serializedRS, serializedFactory);
	}

}
