package eu.dnetlib.enabling.aas.ismock;

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

import java.util.Arrays;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;

import eu.dnetlib.enabling.aas.is.ISConstants;
import eu.dnetlib.enabling.aas.utils.SpringUtils;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;

public class MockResultSetTest {

	ApplicationContext ctx;
	ResultSetService resultSet;
		
	@Before
	public void setUp() throws Exception {
		ctx = SpringUtils.getSpringContext(SpringUtils.DEFAULT_INTEGRATION_RESOURCE);
		resultSet = (ResultSetService) ctx.getBean("MockResultSetService");
	}

	@After
	public void tearDown() throws Exception {
	}

	String[] prepareResult(int count) {
		String[] result = new String[count];
		for (int i = 0; i < result.length; i++) {
			result[i] = "dummyResult"+i;
		}
		return result;
	}
	
//	@Test
	/**
	 * Delete method was removed from DNet1.1 ResultSet interface.
	 */
	public void testDeleteRS() throws Exception {
		String rsId = String.valueOf(System.currentTimeMillis());
		assertEquals(resultSet.populateRS(rsId, Arrays.asList(prepareResult(2))),rsId);
//		assertTrue(resultSet.deleteRS(rsId));
		List<String> array1Results = resultSet.getResult(rsId, 0, 
				ISConstants.RESULT_SET_END_POSITION_UNSPECIFIED, null);
		assertEquals(0,array1Results.size());
	}

	@Test
	public void testGetNumberOfElements() throws Exception {
		String rsId = String.valueOf(System.currentTimeMillis());
		assertEquals(resultSet.populateRS(rsId, Arrays.asList(prepareResult(2))),rsId);
		assertEquals(resultSet.getNumberOfElements(rsId), 2);
//		assertTrue(resultSet.deleteRS(rsId));
	}

	@Test
	public void testGetResult() throws Exception {
		String rsId = String.valueOf(System.currentTimeMillis());
		assertEquals(resultSet.populateRS(rsId, Arrays.asList(prepareResult(3))),rsId);
		assertEquals(resultSet.getNumberOfElements(rsId), 3);
		List<String> results = resultSet.getResult(rsId, 1, 2, null);
		assertEquals(results.size(),2);
//			assertTrue(resultSet.deleteRS(rsId));
		results = resultSet.getResult(rsId, 0, 
				ISConstants.RESULT_SET_END_POSITION_UNSPECIFIED, null);
		assertNotNull(results);
		assertEquals(0,results.size());
	}

	@Test
	public void testPopulateRS() throws Exception {
		String rsId = String.valueOf(System.currentTimeMillis());
		assertEquals(resultSet.populateRS(rsId, Arrays.asList(prepareResult(2))),rsId);
		assertEquals(resultSet.getNumberOfElements(rsId), 2);
		List<String> results = resultSet.getResult(rsId, 0, ISConstants.RESULT_SET_END_POSITION_UNSPECIFIED, null);
		assertEquals(results.size(),2);
		assertEquals(resultSet.populateRS(rsId, Arrays.asList(prepareResult(2))),rsId);
		assertEquals(resultSet.getNumberOfElements(rsId), 4);
		results = resultSet.getResult(rsId, 0, ISConstants.RESULT_SET_END_POSITION_UNSPECIFIED, null);
		assertEquals(results.size(),4);
//		assertTrue(resultSet.deleteRS(rsId));
		results = resultSet.getResult(rsId, 0, ISConstants.RESULT_SET_END_POSITION_UNSPECIFIED, null);
		assertNotNull(results);
		assertEquals(0,results.size());
	}

}
