//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import java.util.Collections;
import java.util.List;
import org.apache.uima.UIMAException;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.fit.factory.UimaContextFactory;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;
import org.apache.uima.resource.ResourceInitializationException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import uk.gov.dstl.baleen.core.pipelines.PipelineBuilder;
import uk.gov.dstl.baleen.core.pipelines.orderers.AnalysisEngineAction;
import uk.gov.dstl.baleen.uima.testing.JCasSingleton;
@RunWith(MockitoJUnitRunner.Silent.class)
public class BaleenAnnotatorTest {
private static final String PIPELINE_NAME = "testPipeline";
@Mock
UimaSupport support;
@Mock
UimaMonitor monitor;
UimaContext context;
JCas jCas;
Annotation annotation;
@Before
public void setUp() throws UIMAException {
jCas = JCasSingleton.getJCasInstance();
annotation = new Annotation(jCas);
context = UimaContextFactory.createUimaContext(PipelineBuilder.PIPELINE_NAME, PIPELINE_NAME);
}
@Test
public void testDestroy() throws ResourceInitializationException {
FakeBaleenAnnotator annotator = new FakeBaleenAnnotator();
annotator.initialize(context);
annotator.destroy();
assertTrue(annotator.destroyed);
}
@Test
public void testDoInitialize() throws ResourceInitializationException {
FakeBaleenAnnotator annotator = new FakeBaleenAnnotator();
annotator.initialize(context);
assertTrue(annotator.initialised);
}
@Test
public void testProcessJCas() throws Exception {
FakeBaleenAnnotator annotator = new FakeBaleenAnnotator();
annotator.initialize(context);
annotator.process(jCas);
assertTrue(annotator.processed);
}
@Test
public void testGetMonitor() throws ResourceInitializationException {
FakeBaleenAnnotator annotator = new FakeBaleenAnnotator();
annotator.initialize(context);
assertNotNull(annotator.getMonitor());
assertEquals(PIPELINE_NAME, annotator.getMonitor().getPipelineName());
}
@Test
public void testGetSupport() throws ResourceInitializationException {
FakeBaleenAnnotator annotator = new FakeBaleenAnnotator();
annotator.initialize(context);
assertNotNull(annotator.getSupport());
assertEquals(PIPELINE_NAME, annotator.getSupport().getPipelineName());
}
@Test
public void testSupport() throws ResourceInitializationException {
MockedBaleenAnnotator annotator = new MockedBaleenAnnotator();
annotator.initialize(context);
Annotation existingAnnotation = new Annotation(jCas);
List<Annotation> list = Collections.singletonList(annotation);
annotator.addToJCasIndex(annotation);
verify(support, only()).add(annotation);
resetMocked();
annotator.addToJCasIndex(list);
verify(support, only()).add(list);
resetMocked();
annotator.getDocumentAnnotation(jCas);
verify(support, only()).getDocumentAnnotation(jCas);
resetMocked();
annotator.mergeWithExisting(existingAnnotation, annotation);
verify(support, only()).mergeWithExisting(existingAnnotation, annotation);
resetMocked();
annotator.mergeWithExisting(existingAnnotation, list);
verify(support, only()).mergeWithExisting(existingAnnotation, list);
resetMocked();
annotator.mergeWithNew(existingAnnotation, annotation);
verify(support, only()).mergeWithNew(existingAnnotation, annotation);
resetMocked();
annotator.mergeWithNew(existingAnnotation, list);
verify(support, only()).mergeWithNew(existingAnnotation, list);
resetMocked();
annotator.removeFromJCasIndex(annotation);
verify(support, only()).remove(annotation);
resetMocked();
annotator.removeFromJCasIndex(list);
verify(support, only()).remove(list);
resetMocked();
}
private void resetMocked() {
reset(support, monitor);
}
// Use a consumer as it's derivced from annotator
private static class FakeBaleenAnnotator extends BaleenConsumer {
private boolean processed;
private boolean initialised;
private boolean destroyed;
@Override
protected void doProcess(JCas jCas) throws AnalysisEngineProcessException {
processed = true;
}
@Override
public void doInitialize(UimaContext aContext) throws ResourceInitializationException {
super.doInitialize(aContext);
initialised = true;
}
@Override
protected void doDestroy() {
super.doDestroy();
destroyed = true;
}
@Override
public AnalysisEngineAction getAction() {
return new AnalysisEngineAction(Collections.emptySet(), Collections.emptySet());
}
}
private class MockedBaleenAnnotator extends BaleenConsumer {
@Override
protected void doProcess(JCas jCas) throws AnalysisEngineProcessException {
// Do nothing
}
@Override
protected UimaMonitor createMonitor(String pipelineName) {
return monitor;
}
@Override
protected UimaSupport createSupport(String pipelineName, UimaContext context) {
return support;
}
@Override
public AnalysisEngineAction getAction() {
return new AnalysisEngineAction(Collections.emptySet(), Collections.emptySet());
}
}
}