package eu.dnetlib.data.utility.cleaner;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

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

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;

import eu.dnetlib.data.utility.cleaner.rmi.CleanerException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;

@RunWith(MockitoJUnit44Runner.class)
public class ProviderConsumerImplTest {

	/**
	 * Class under test.
	 */
	private ProviderConsumerImpl consumer;

	@Mock
	private ResultSetService provider;

	private static final int RS_SIZE = 10;
	private static final String PROVIDER_BDID = "BDID";

	@Before
	public void setUp() throws Exception {
		when(provider.getResult(anyString(), anyInt(), anyInt(), anyString())).thenReturn(Arrays.asList("a,b,c,d".split(",")));
		when(provider.getNumberOfElements(anyString())).thenReturn(RS_SIZE);
		consumer = new ProviderConsumerImpl(provider, PROVIDER_BDID);
	}

	@Test
	public void testProviderConsumerImpl() throws CleanerException {
		assertNotNull(consumer);
	}

	@Test
	public void testGetSize() throws CleanerException, ResultSetException {
		assertEquals(RS_SIZE, consumer.getSize());
		verify(provider).getNumberOfElements(PROVIDER_BDID);
	}

	@Test
	public void testGetElements() throws CleanerException, ResultSetException {
		List<String> res = consumer.getElements(1, 4);
		verify(provider).getResult(PROVIDER_BDID, 1, 4, "WAITING");
		assertEquals(4, res.size());
		assertEquals("a", res.get(0));
		assertEquals("b", res.get(1));
		assertEquals("c", res.get(2));
		assertEquals("d", res.get(3));
	}

}
