package eu.dnetlib.enabling.is.resultset.client;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.List;

import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.google.common.collect.Lists;

import eu.dnetlib.enabling.resultset.IterableResultSetFactory;
import eu.dnetlib.enabling.resultset.LocalResultSetFactoryImpl;
import eu.dnetlib.enabling.resultset.ResultSetFactory;
import eu.dnetlib.enabling.resultset.client.IterableResultSetClient;
import eu.dnetlib.enabling.resultset.client.ResultSetClientFactory;
import eu.dnetlib.test.AbstractIntegrationContainerTest;
import eu.dnetlib.test.SpringContextSharer;

/**
 * tests a ResultSetClient.
 *
 * @author claudio
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
public class ResultSetClientTest extends AbstractIntegrationContainerTest {

	/**
	 * resultSet factory
	 */
	private transient ResultSetFactory resultSetFactory;
	
	/**
	 * resultSet factory
	 */
	private transient IterableResultSetFactory iterableResultSetFactory;
	
	/**
	 * resultSet client factory
	 */
	private ResultSetClientFactory resultSetClientFactory;
	
	/**
	 * data provider used to build the epr
	 */
	private MockResultSetListener mockDataProvider;
	
	/**
	 * data provider used to build the epr
	 */
	private List<String> mockSource;
	
	/**
	 * mock data
	 */
	public final static String MOCKDATA = "xxx";
	
	/**
	 * resultset size
	 */
	public final static int RS_SIZE = 100;
	
	/**
	 * client page size
	 */
	private final static int PAGE_SIZE = 13; 
	
	
	@Before
	public void setUp() throws Exception {
		
		//Manual injection for these beans from the global context.
		resultSetFactory = (ResultSetFactory) SpringContextSharer.getGlobalContext().getBean(
				"resultSetFactory", LocalResultSetFactoryImpl.class);
		
		iterableResultSetFactory = (IterableResultSetFactory) SpringContextSharer.getGlobalContext().getBean(
				"iterableResultSetFactory", IterableResultSetFactory.class);
		
		resultSetClientFactory = (ResultSetClientFactory) SpringContextSharer.getGlobalContext().getBean(
				"resultSetClientFactory", ResultSetClientFactory.class);
		
		mockDataProvider = new MockResultSetListener();
		
		mockSource = Lists.newArrayList();
		for (int i = 0; i < RS_SIZE; i++)
			mockSource.add(MOCKDATA + i);
	}
	
	@Test
	public void testCreateClient_case1() throws Exception {
		W3CEndpointReference epr = resultSetFactory.createResultSet(mockDataProvider);
		assertNotNull(resultSetClientFactory.getClient(epr));
	}
	
	@Test
	public void testCreateClient_case2() throws Exception {
		W3CEndpointReference epr = iterableResultSetFactory.createIterableResultSet(mockSource);
		assertNotNull(resultSetClientFactory.getClient(epr));
	}
	
	@Test
	public void testCreateClientIterator_case1() throws Exception {
		W3CEndpointReference epr = resultSetFactory.createResultSet(mockDataProvider);
		assertNotNull(resultSetClientFactory.getClient(epr).iterator());
	}
	
	@Test
	public void testCreateClientIterator_case2() throws Exception {
		W3CEndpointReference epr = iterableResultSetFactory.createIterableResultSet(mockSource);
		assertNotNull(resultSetClientFactory.getClient(epr).iterator());
	}
	
	@Test
	public void testClientIterator_case1() throws Exception {
		W3CEndpointReference epr = resultSetFactory.createResultSet(mockDataProvider);
		IterableResultSetClient client = resultSetClientFactory.getClient(epr, PAGE_SIZE);
		int i=0;
		for (String element : client)
			assertEquals(MOCKDATA + (i++), element);

		assertEquals(mockDataProvider.getSize(), i);
	}	
	
	@Test
	public void testClientIterator_case2() throws Exception {
		W3CEndpointReference epr = iterableResultSetFactory.createIterableResultSet(mockSource);
		IterableResultSetClient client = resultSetClientFactory.getClient(epr, PAGE_SIZE);
		int i=0;
		for (String element : client)
			assertEquals(MOCKDATA + (i++), element);

		assertEquals(mockSource.size(), i);
	}	

}
