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 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 eu.dnetlib.data.utility.cleaner.rmi.CleanerException;
import eu.dnetlib.enabling.resultset.MappedResultSetFactory;
import eu.dnetlib.enabling.tools.ServiceResolver;
import eu.dnetlib.test.utils.EPRTestUtil;

@RunWith(MockitoJUnit44Runner.class)
public class CleanerServiceImplTest {

	/**
	 * Class under test.
	 */
	private CleanerServiceImpl service;

	@Mock
	private ProviderConsumerFactory providerConsumerFactory;
	@Mock
	private CleanerFactory cleanerFactory;
	//@Mock
	//private CleaningRule rule;
	@Mock
	private ProviderConsumer consumer;
	@Mock
	private ServiceResolver serviceResolver;
	@Mock
	private MappedResultSetFactory mappedResultSetFactory;
	@Mock
	private CleaningUnaryFunction cleaningRule;

	private W3CEndpointReference epr_IN = EPRTestUtil.getTestEpr("http://1");
	private W3CEndpointReference epr_OUT = EPRTestUtil.getTestEpr("http://2");

	private static final String RULE_ID = "RULE_01";

	@Before
	public void setUp() throws Exception {
		when(providerConsumerFactory.createProviderConsumer(epr_IN, serviceResolver)).thenReturn(consumer);
		when(cleanerFactory.createContextualizedCleaner(RULE_ID, null)).thenReturn(cleaningRule);
		when(mappedResultSetFactory.createMappedResultSet(epr_IN, cleaningRule)).thenReturn(epr_OUT);

		service = new CleanerServiceImpl();
		service.setCleanerFactory(cleanerFactory);
		service.setProviderConsumerFactory(providerConsumerFactory);
		service.setServiceResolver(serviceResolver);
		service.setMappedResultSetFactory(mappedResultSetFactory);
	}

	@Test
	public void dummy() {
		int x = 0;
		for (int i = 0; i < 1000000000; i++)
			for (int j = 0; j < 1000000000; j++)
				x = x + i * j;
	}

	@Test
	public void testClean() throws CleanerException {
		W3CEndpointReference epr = service.clean(epr_IN, RULE_ID);
		assertNotNull(epr);
		assertEquals(epr_OUT, epr);
		verify(cleanerFactory).createContextualizedCleaner(RULE_ID, null);
	}

	@Test(expected = CleanerException.class)
	public void testClean_null_1() throws CleanerException {
		service.clean(epr_IN, null);
	}

	@Test(expected = CleanerException.class)
	public void testClean_null_2() throws CleanerException {
		service.clean(null, RULE_ID);
	}
}
