package eu.dnetlib.data.textengine.ws;

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

import java.util.LinkedList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.DocumentException;
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.common.ws.dataprov.DataProviderException;
import eu.dnetlib.data.textengine.categorizer.LanguageCategorizerWrapper;
import eu.dnetlib.data.textengine.categorizer.VocabularyMapper;
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;

@RunWith(MockitoJUnit44Runner.class)
public class TextEngineDataProviderImplTest {

	private static Log log = LogFactory.getLog(TextEngineDataProviderImplTest.class);
	private transient TextEngineDataProviderImpl dataProvider;
	
	@Mock
	private transient TextEngineDataProviderProperties dataProvProps;
	
	private transient ResultSetService rsService;
	
    private String bdId;
		
	@Before
	public void setUp() throws ResultSetException, DocumentException{
		rsService = mock(ResultSetService.class);
		final String testString1 = "Bitte ein Bier!";
		final String testString2 = "<record>Ich habe zur Zeit keinen Hunger.</record>";
		final String testString3 = "<record>The results of this study further demonstrate the potency of the group's CTX stem cell line when applied in ischaemic (reduced blood flow) disease settings.</record>";
		dataProvider = new TextEngineDataProviderImpl();
		final VocabularyMapper mapper = new VocabularyMapper();
		mapper.init();
		final LanguageCategorizerWrapper lc = new LanguageCategorizerWrapper();
		lc.setVocabMapper(mapper);
		lc.init();
		dataProvider.setLanguageCategorizer(lc);
		
		final String rsId = "123-abc";
		final List<String> resultList = new LinkedList<String>();
		resultList.add(testString1);
		final List<String> resultList2 = new LinkedList<String>();
		resultList2.add(testString2);
		resultList2.add(testString3);
		bdId = dataProvider.createBulkData(dataProvProps);
		log.debug("bdId: " + bdId);
		when(dataProvProps.getResultSetService()).thenReturn(rsService);
		when(dataProvProps.getRsMode()).thenReturn("waiting");
		when(dataProvProps.getRsResourceIdentifier()).thenReturn(rsId);
		when(rsService.getResult(rsId, 1, 1, null)).thenReturn(resultList);
		when(rsService.getResult(rsId, 1, 2, null)).thenReturn(resultList2);
	}
	
	@Test (expected=DataProviderException.class)
	public void testGetBulkDataExtractionError() throws DataProviderException{
		final String[] expectedResult = new String[]{"deu/ger"};
		assertArrayEquals(expectedResult, dataProvider.getBulkData(bdId, 1, 1).toArray());
	}
	
	@Test
	public void testGetBulkData() throws DataProviderException{
		final String[] expectedResult = new String[]{"deu/ger", "eng"};
		assertArrayEquals(expectedResult, dataProvider.getBulkData(bdId, 1, 2).toArray());
	}
	
}
