package eu.dnetlib.contract.cp.eval;

import static org.junit.Assert.*;

import org.junit.Test;

import eu.dnetlib.contract.cp.ICheckPoint;
import eu.dnetlib.contract.cp.ResultCheckPoint;
import eu.dnetlib.contract.cp.eval.module.RegexpStringEvaluatorModule;
import eu.dnetlib.contract.event.ExceptionContractEvent;
import eu.dnetlib.contract.event.IContractEvent;
import eu.dnetlib.contract.event.ResultContractEvent;
import eu.dnetlib.contract.node.EvaluationResult;
import eu.dnetlib.contract.node.EvaluationResult.Status;


/**
 * {@link RegexpStringEvaluatorModule} test class.
 * @author mhorst
 *
 */
public class RegexpStringEvaluatorModuleTest {
	
	RegexpStringEvaluatorModule module = null;
	ICheckPoint<IContractEvent> checkPoint = null;
	String stringResult = "someStringValue";
	String stringResult2 = "someOtherValue";
	String regexPattern = "some(String|Other).*";
	
	@Test
	public void testEvaluate() throws Exception {
		checkPoint = new ResultCheckPoint();
		module = new RegexpStringEvaluatorModule();
//		null regex pattern:
		module.setRegexPattern(null);
		EvaluationResult result = module.evaluate(stringResult, new ResultContractEvent(null, stringResult), checkPoint);
		assertNotNull(result);
		assertEquals(Status.FATAL,result.getStatus());
		
		module.setRegexPattern(regexPattern);
		result = module.evaluate(new Integer(1), new ResultContractEvent(null, new Integer(1)), checkPoint);
		assertNotNull(result);
		assertEquals(Status.FAIL,result.getStatus());
		
		module.setRegexPattern(regexPattern);
//		currently ContractEvent implementation is irrelevant
		result = module.evaluate(null, new ExceptionContractEvent(null, null), checkPoint);
		assertNotNull(result);
		assertEquals(Status.FAIL,result.getStatus());
		
		module.setRegexPattern(regexPattern);
		result = module.evaluate(stringResult, new ResultContractEvent(null, stringResult), checkPoint);
		assertNotNull(result);
		assertEquals(Status.OK,result.getStatus());
		
		module.setRegexPattern(regexPattern);
		result = module.evaluate(stringResult2, new ResultContractEvent(null, stringResult2), checkPoint);
		assertNotNull(result);
		assertEquals(Status.OK,result.getStatus());
		
		module.setRegexPattern(regexPattern);
		result = module.evaluate("blah", new ResultContractEvent(null, "blah"), checkPoint);
		assertNotNull(result);
		assertEquals(Status.FAIL,result.getStatus());
	}
}
