//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima.utils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
import org.apache.uima.UIMAException;
import org.apache.uima.jcas.JCas;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Multimap;
import uk.gov.dstl.baleen.types.Base;
import uk.gov.dstl.baleen.types.common.Person;
import uk.gov.dstl.baleen.types.semantic.Entity;
import uk.gov.dstl.baleen.types.semantic.Location;
import uk.gov.dstl.baleen.types.semantic.ReferenceTarget;
import uk.gov.dstl.baleen.uima.testing.JCasSingleton;
public class ReferentUtilsTest {
private JCas jCas;
private Location bigBen;
private Location there;
private Location london;
private Person he;
private Person chris;
private ReferenceTarget chrisRT;
private ReferenceTarget londonRT;
private Multimap<ReferenceTarget, Entity> referentMap;
@Before
public void before() throws UIMAException {
jCas = JCasSingleton.getJCasInstance();
jCas.setDocumentText("Chris when to London and he saw Big Ben there");
chrisRT = new ReferenceTarget(jCas);
chrisRT.addToIndexes();
londonRT = new ReferenceTarget(jCas);
londonRT.addToIndexes();
chris = new Person(jCas);
chris.setBegin(jCas.getDocumentText().indexOf("Chris"));
chris.setEnd(chris.getBegin() + "Chris".length());
chris.setReferent(chrisRT);
chris.addToIndexes();
he = new Person(jCas);
he.setBegin(jCas.getDocumentText().indexOf("he"));
he.setEnd(he.getBegin() + "he".length());
he.setReferent(chrisRT);
he.addToIndexes();
london = new Location(jCas);
london.setBegin(jCas.getDocumentText().indexOf("London"));
london.setEnd(london.getBegin() + "london".length());
london.setReferent(londonRT);
london.addToIndexes();
there = new Location(jCas);
there.setBegin(jCas.getDocumentText().indexOf("there"));
there.setEnd(there.getBegin() + "there".length());
there.setReferent(londonRT);
there.addToIndexes();
bigBen = new Location(jCas);
bigBen.setBegin(jCas.getDocumentText().indexOf("Big Ben"));
bigBen.setEnd(london.getBegin() + "Big Ben".length());
bigBen.addToIndexes();
referentMap = ReferentUtils.createReferentMap(jCas, Entity.class);
}
@Test
public void testCreateReferentMap() {
final Multimap<ReferenceTarget, Entity> map = ReferentUtils.createReferentMap(jCas, Entity.class);
assertEquals(2, map.get(chrisRT).size());
assertEquals(2, map.get(londonRT).size());
}
@Test
public void testFilterToSingle() {
final Map<ReferenceTarget, Entity> map = ReferentUtils.filterToSingle(referentMap, l -> l.iterator().next());
//NB: HashMultimap doesn't preserve the order of elements, so testing for exact elements may fail.
//Instead, we'll just check the type here.
assertEquals(chris.getTypeName(), map.get(chrisRT).getTypeName());
assertEquals(london.getTypeName(), map.get(londonRT).getTypeName());
}
@Test
public void testGetAllEntityOrReferentToEntity() {
final Map<ReferenceTarget, Entity> referentMap = new HashMap<>();
final List<Base> list = ReferentUtils.getAllEntityOrReferentToEntity(jCas, referentMap);
assertEquals(5, list.size());
}
@Test
public void testGetAllAndReferents() {
final Map<ReferenceTarget, Entity> referentMap = new HashMap<>();
final List<Base> list = ReferentUtils.getAllAndReferents(jCas, Entity.class, referentMap);
assertEquals(5, list.size());
}
@Test
public void testStreamReferent() {
final Map<ReferenceTarget, Entity> referentMap = new HashMap<>();
referentMap.put(chrisRT, chris);
referentMap.put(londonRT, london);
final Stream<Base> stream = ReferentUtils.streamReferent(jCas, referentMap);
assertEquals(4, stream.count());
}
@Test
public void testGetLongestSingle() {
final Collection<Entity> list = Arrays.asList(london, there);
final Entity longest = ReferentUtils.getLongestSingle(list);
assertSame(london, longest);
}
@Test
public void testSingleViaCompare() {
final Collection<Entity> list = Arrays.asList(chris, he);
final Entity entity = ReferentUtils.singleViaCompare(list,
(a, b) -> Integer.compare(a.getCoveredText().length(), b.getCoveredText().length()));
assertSame(chris, entity);
}
@Test
public void testReplaceWithCoreferent() {
final Collection<Entity> entities = Arrays.asList(he);
final Map<ReferenceTarget, Entity> referentMap = new HashMap<>();
referentMap.put(chrisRT, chris);
final Set<Entity> coreferents = ReferentUtils.replaceWithCoreferent(entities, referentMap);
assertEquals(chris, coreferents.iterator().next());
}
}