//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.uima; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import org.apache.uima.UIMAException; import org.apache.uima.fit.util.JCasUtil; import org.apache.uima.jcas.JCas; import org.apache.uima.resource.impl.CustomResourceSpecifier_impl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import com.google.common.collect.Maps; import uk.gov.dstl.baleen.core.history.BaleenHistory; import uk.gov.dstl.baleen.core.history.memory.InMemoryBaleenHistory; import uk.gov.dstl.baleen.types.common.Person; import uk.gov.dstl.baleen.types.metadata.Metadata; import uk.gov.dstl.baleen.types.metadata.ProtectiveMarking; import uk.gov.dstl.baleen.types.semantic.Location; import uk.gov.dstl.baleen.types.semantic.ReferenceTarget; import uk.gov.dstl.baleen.types.semantic.Relation; import uk.gov.dstl.baleen.uima.testing.JCasSingleton; @RunWith(MockitoJUnitRunner.Silent.class) public class UimaSupportTest { private static final String PIPELINE = null; @Mock private UimaMonitor monitor; private BaleenHistory history; private JCas jCas; private Location location; private Metadata md; @Before public void setUp() throws UIMAException { jCas = JCasSingleton.getJCasInstance(); jCas.setDocumentText("Dave saw is some of London"); location = new Location(jCas); location.setBegin(20); location.setEnd(26); location.setValue("London"); location.addToIndexes(); md = new Metadata(jCas); md.setKey("k"); md.setValue("v"); md.addToIndexes(); history = new InMemoryBaleenHistory(); history.initialize(new CustomResourceSpecifier_impl(), Maps.newHashMap()); } @Test public void testAddAnnotationArray() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); Person withValue = new Person(jCas); withValue.setBegin(0); withValue.setEnd(4); withValue.setValue("David"); Person withoutValue = new Person(jCas); withoutValue.setBegin(0); withoutValue.setEnd(4); support.add(new ProtectiveMarking(jCas), withValue, withoutValue); assertEquals(1, JCasUtil.select(jCas, ProtectiveMarking.class).size()); List<Person> persons = new ArrayList<Person>(JCasUtil.select(jCas, Person.class)); assertEquals(2, persons.size()); // Check value is set / not overridden assertNotEquals(persons.get(0).getCoveredText(), persons.get(0).getValue()); assertEquals(persons.get(1).getCoveredText(), persons.get(1).getValue()); // Check Id set assertNotEquals(persons.get(0).getInternalId(), persons.get(1).getInternalId()); // Check had history of addition assertFalse( support.getDocumentHistory(jCas).getHistory(persons.get(1).getInternalId()).isEmpty() ); } @Test public void testRemoveAnnotationArray() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); support.remove(location, md); assertEquals(0, JCasUtil.select(jCas, Location.class).size()); assertEquals(0, JCasUtil.select(jCas, Metadata.class).size()); // Location should not have history and id assertNotNull(location.getInternalId()); assertFalse( support.getDocumentHistory(jCas).getHistory(location.getInternalId()).isEmpty() ); } @Test public void testMergeWithNewAnnotationAnnotationArray() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); Location l = new Location(jCas); l.setBegin(0); l.setEnd(0); Metadata md2 = new Metadata(jCas); md2.setBegin(0); md2.setEnd(0); support.mergeWithNew(l, location); support.mergeWithNew(md2, md); List<Location> locations = new ArrayList<>(JCasUtil.select(jCas, Location.class)); List<Metadata> mds = new ArrayList<>(JCasUtil.select(jCas, Metadata.class)); assertEquals(1, locations.size()); assertEquals(l, locations.get(0)); assertEquals(1, mds.size()); assertEquals(md2, mds.get(0)); assertFalse( support.getDocumentHistory(jCas).getHistory(l.getInternalId()).isEmpty() ); } @Test public void testMergeWithExistingAnnotationAnnotationArray() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); Location l = new Location(jCas); l.setBegin(0); l.setEnd(0); l.addToIndexes(); Metadata md2 = new Metadata(jCas); md2.setBegin(0); md2.setEnd(0); md2.addToIndexes(); support.mergeWithExisting(l, location); support.mergeWithExisting(md2, md); List<Location> locations = new ArrayList<>(JCasUtil.select(jCas, Location.class)); List<Metadata> mds = new ArrayList<>(JCasUtil.select(jCas, Metadata.class)); assertEquals(1, locations.size()); assertEquals(l, locations.get(0)); assertEquals(1, mds.size()); assertEquals(md2, mds.get(0)); assertFalse( support.getDocumentHistory(jCas).getHistory(l.getInternalId()).isEmpty() ); } @Test public void testMergeWithMergeDifferentReferent() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, true); ReferenceTarget rt1 = new ReferenceTarget(jCas); rt1.addToIndexes(); ReferenceTarget rt2 = new ReferenceTarget(jCas); rt2.addToIndexes(); Location locationRT1 = new Location(jCas); locationRT1.setBegin(0); locationRT1.setEnd(0); locationRT1.setReferent(rt1); locationRT1.addToIndexes(); Location locationRT2 = new Location(jCas); locationRT2.setBegin(0); locationRT2.setEnd(0); locationRT2.setReferent(rt2); locationRT2.addToIndexes(); Location locationRT2Again = new Location(jCas); locationRT2Again.setBegin(1); locationRT2Again.setEnd(1); locationRT2Again.setReferent(rt2); locationRT2Again.addToIndexes(); Metadata md2 = new Metadata(jCas); md2.setBegin(0); md2.setEnd(0); md2.addToIndexes(); support.mergeWithExisting(locationRT2Again, location, locationRT1, locationRT2); support.mergeWithExisting(md2, md); List<Location> locations = new ArrayList<>(JCasUtil.select(jCas, Location.class)); List<Metadata> mds = new ArrayList<>(JCasUtil.select(jCas, Metadata.class)); assertEquals(1, locations.size()); assertEquals(locationRT2Again, locations.get(0)); assertEquals(1, mds.size()); assertEquals(md2, mds.get(0)); assertFalse( support.getDocumentHistory(jCas).getHistory(locationRT2Again.getInternalId()).isEmpty() ); } @Test public void testMergeWithDontMergeDifferentReferent() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); ReferenceTarget rt1 = new ReferenceTarget(jCas); rt1.addToIndexes(); ReferenceTarget rt2 = new ReferenceTarget(jCas); rt2.addToIndexes(); Location locationRT1 = new Location(jCas); locationRT1.setBegin(0); locationRT1.setEnd(0); locationRT1.setReferent(rt1); locationRT1.addToIndexes(); Location locationRT2 = new Location(jCas); locationRT2.setBegin(0); locationRT2.setEnd(0); locationRT2.setReferent(rt2); locationRT2.addToIndexes(); Location locationRT2Again = new Location(jCas); locationRT2Again.setBegin(1); locationRT2Again.setEnd(1); locationRT2Again.setReferent(rt2); locationRT2Again.addToIndexes(); Metadata md2 = new Metadata(jCas); md2.setBegin(0); md2.setEnd(0); md2.addToIndexes(); support.mergeWithExisting(locationRT2Again, location, locationRT1, locationRT2); support.mergeWithExisting(md2, md); List<Location> locations = new ArrayList<>(JCasUtil.select(jCas, Location.class)); List<Metadata> mds = new ArrayList<>(JCasUtil.select(jCas, Metadata.class)); assertEquals(3, locations.size()); assertFalse(locations.contains(locationRT2)); assertTrue(locations.contains(locationRT2Again)); assertTrue(locations.contains(location)); assertTrue(locations.contains(locationRT1)); assertEquals(1, mds.size()); assertEquals(md2, mds.get(0)); assertTrue( support.getDocumentHistory(jCas).getHistory(locationRT1.getInternalId()).isEmpty() ); assertFalse( support.getDocumentHistory(jCas).getHistory(locationRT2Again.getInternalId()).isEmpty() ); } @Test public void testMergeWithRelation() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); Person p1 = new Person(jCas); p1.setBegin(0); p1.setEnd(0); p1.addToIndexes(); Person p2 = new Person(jCas); p2.setBegin(0); p2.setEnd(0); p2.addToIndexes(); Person p3 = new Person(jCas); p3.setBegin(1); p3.setEnd(1); p3.addToIndexes(); Relation r = new Relation(jCas); r.setBegin(0); r.setEnd(1); r.setSource(p2); r.setTarget(p3); r.addToIndexes(); support.mergeWithExisting(p1, p2); List<Person> people = new ArrayList<>(JCasUtil.select(jCas, Person.class)); List<Relation> relations = new ArrayList<>(JCasUtil.select(jCas, Relation.class)); assertEquals(2, people.size()); assertEquals(p1, people.get(0)); assertEquals(p3, people.get(1)); assertEquals(1, relations.size()); assertEquals(r, relations.get(0)); assertEquals(p1, relations.get(0).getSource()); assertEquals(p3, relations.get(0).getTarget()); } @Test public void testGetDocumentAnnotation() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); assertNotNull(support.getDocumentAnnotation(jCas)); } @Test public void testGetRelations() { UimaSupport support = new UimaSupport(PIPELINE, UimaSupportTest.class, history, monitor, false); Person p1 = new Person(jCas); p1.setBegin(0); p1.setEnd(0); p1.addToIndexes(); Person p2 = new Person(jCas); p2.setBegin(0); p2.setEnd(0); p2.addToIndexes(); Person p3 = new Person(jCas); p3.setBegin(1); p3.setEnd(1); p3.addToIndexes(); Relation r1 = new Relation(jCas); r1.setBegin(0); r1.setEnd(1); r1.setSource(p2); r1.setTarget(p3); r1.addToIndexes(); Relation r2 = new Relation(jCas); r2.setBegin(0); r2.setEnd(0); r2.setSource(p1); r2.setTarget(p2); r2.addToIndexes(); List<Relation> relations = new ArrayList<>(support.getRelations(p1)); assertEquals(1, relations.size()); assertEquals(r2, relations.get(0)); relations = new ArrayList<>(support.getRelations(p2)); assertEquals(2, relations.size()); assertEquals(r1, relations.get(0)); assertEquals(r2, relations.get(1)); relations = new ArrayList<>(support.getRelations(p3)); assertEquals(1, relations.size()); assertEquals(r1, relations.get(0)); } }