package eu.dnetlib.enabling.is.resultset;

import static org.junit.Assert.*; // NOPMD

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

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

import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
import eu.dnetlib.enabling.tools.ServiceLocator;
import eu.dnetlib.enabling.tools.ServiceResolver;
import eu.dnetlib.test.AbstractIntegrationContainerTest;

/**
 * test a push resultset.
 *
 * @author marko
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
public class PushResultSetTest extends AbstractIntegrationContainerTest {

	/**
	 * result set service locator.
	 */
	@Resource(name = "resultSetLocator")
	private transient ServiceLocator<ResultSetService> resultSetLocator;

	/**
	 * service resolver.
	 */
	@Resource
	private transient ServiceResolver serviceResolver;

	/**
	 * push rs creation.
	 *
	 * @throws ResultSetException
	 *             shouldn't happen
	 */
	@Test
	public void testPushResultSetCreation() throws ResultSetException {
		assertNotNull("check locator", resultSetLocator);

		W3CEndpointReference epr = resultSetLocator.getService().createPushRS(0, 0);
		assertNotNull("check epr", epr);
	}

	/**
	 * test push resultset.
	 *
	 * @throws ResultSetException
	 *             shouldn't happen
	 */
	@Test
	public void testPushResultSet() throws ResultSetException {
		assertNotNull("check resolver", serviceResolver);

		final W3CEndpointReference epr = resultSetLocator.getService().createPushRS(0, 0);
		assertNotNull("check epr", epr);

		final ResultSetService service = serviceResolver.getService(ResultSetService.class, epr);
		final String rsId = serviceResolver.getResourceIdentifier(epr);

		assertEquals("status", "open", service.getRSStatus(rsId));

		final List<String> list = new ArrayList<String>();
		list.add("one");
		service.populateRS(rsId, list);

		final List<String> res = service.getResult(rsId, 1, 1, "blocking");
		assertEquals("check size", 1, res.size());
		assertEquals("check res", "one", res.get(0));

		final List<String> list2 = new ArrayList<String>();
		list2.add("two");
		list2.add("three");
		service.populateRS(rsId, list2);

		final List<String> res2 = service.getResult(rsId, 2, 2, "blocking");
		assertEquals("check size", 1, res2.size());
		assertEquals("check res", "two", res2.get(0));

		final List<String> res3 = service.getResult(rsId, 1, 2 + 1, "blocking");
		assertEquals("check size", 2 + 1, res3.size());
		assertEquals("check res", "one", res3.get(0));
		assertEquals("check res", "two", res3.get(1));

		assertEquals("should be open", "open", service.getRSStatus(rsId));

		service.closeRS(rsId);

		assertEquals("should be closed", "closed", service.getRSStatus(rsId));

		final List<String> res4 = service.getResult(rsId, 1, 2 + 1, "blocking");
		assertEquals("check size", 2 + 1, res4.size());
		assertEquals("check res", "one", res4.get(0));
		assertEquals("check res", "two", res4.get(1));
	}

	/**
	 * test resultset properties.
	 *
	 * @throws ResultSetException
	 *             shouldn't happen
	 */
	@Test
	public void testPushResultSetProperties() throws ResultSetException {
		final W3CEndpointReference epr = resultSetLocator.getService().createPushRS(0, 0);
		assertNotNull("check epr", epr);

		final ResultSetService service = serviceResolver.getService(ResultSetService.class, epr);
		final String rsId = serviceResolver.getResourceIdentifier(epr);

		final List<String> list = new ArrayList<String>();
		list.add("one");
		service.populateRS(rsId, list);

		assertEquals("status", "open", service.getRSStatus(rsId));
		assertEquals("size", 1, service.getNumberOfElements(rsId));
		assertEquals("size", "1", service.getProperty(rsId, "total"));
	}
}
