package eu.dnetlib.data.utility.cleaner;

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

import java.util.Arrays;
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.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;

import com.google.common.collect.Lists;

import eu.dnetlib.data.utility.cleaner.rmi.CleanerException;
import eu.dnetlib.enabling.tools.ServiceResolver;
import eu.dnetlib.test.utils.EPRTestUtil;

@RunWith(MockitoJUnit44Runner.class)
public class ContextualizedCleaningRuleTest {

	/**
	 * Class under test
	 */
	private CleaningUnaryFunction cleaningRule;

	private static final int RS_SIZE = 1230;

	@Mock
	private ProviderConsumerFactory providerConsumerFactory;
	@Mock
	private ProviderConsumer providerConsumer;
	@Mock
	private CleaningRule cleanRule;
	@Mock
	private ServiceResolver serviceResolver;

	private W3CEndpointReference epr = EPRTestUtil.getTestEpr("http://1");

	@Before
	public void setUp() throws Exception {
		when(providerConsumerFactory.createProviderConsumer(epr, serviceResolver)).thenReturn(providerConsumer);
		when(providerConsumer.getSize()).thenReturn(RS_SIZE);
		when(providerConsumer.getElements(1, 4)).thenReturn(Arrays.asList("a,b,c,d".split(",")));
		when(cleanRule.evaluate("a", null)).thenReturn("A");
		when(cleanRule.evaluate("b", null)).thenReturn("B");
		when(cleanRule.evaluate("c", null)).thenReturn("C");
		when(cleanRule.evaluate("d", null)).thenReturn("D");

		cleaningRule = new CleaningUnaryFunction(cleanRule, null);
	}

	@Test
	public void testClean_from_to() throws CleanerException {
		List<String> res = Lists.newArrayList();
		
		for(String text : providerConsumer.getElements(1, 4))
			res.add(cleaningRule.evaluate(text));

		verify(providerConsumer).getElements(1, 4);
		assertNotNull(res);
		assertEquals(4, res.size());
		assertEquals("A", res.get(0));
		assertEquals("B", res.get(1));
		assertEquals("C", res.get(2));
		assertEquals("D", res.get(3));
	}

}
