//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.annotators.regex; import static org.junit.Assert.assertEquals; import java.time.LocalDate; import java.time.ZoneOffset; import org.apache.uima.fit.util.JCasUtil; import org.junit.Test; import uk.gov.dstl.baleen.annotators.regex.RelativeDate; import uk.gov.dstl.baleen.annotators.testing.AbstractAnnotatorTest; import uk.gov.dstl.baleen.types.metadata.Metadata; import uk.gov.dstl.baleen.types.semantic.Temporal; public class RelativeDateTest extends AbstractAnnotatorTest { private static final LocalDate relativeTo = LocalDate.of(2016, 10, 5); public RelativeDateTest(){ super(RelativeDate.class); } private void setDocumentDate(){ Metadata md = new Metadata(jCas); md.setKey("date"); md.setValue("2016-10-05"); md.addToIndexes(); } @Test public void testToday() throws Exception{ jCas.setDocumentText("Today is Wednesday"); setDocumentDate(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Today", t1.getCoveredText()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); } @Test public void testYesterday() throws Exception{ jCas.setDocumentText("Yesterday was Tuesday, and the day before yesterday was Monday"); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Yesterday", t1.getCoveredText()); assertEquals(relativeTo.minusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("day before yesterday", t2.getCoveredText()); assertEquals(relativeTo.minusDays(2).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.minusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testTomorrow() throws Exception{ jCas.setDocumentText("Tomorrow was Thursday, and the day after tomorrow is Friday"); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Tomorrow", t1.getCoveredText()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusDays(2).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("day after tomorrow", t2.getCoveredText()); assertEquals(relativeTo.plusDays(2).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.plusDays(3).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testThisX() throws Exception{ jCas.setDocumentText("This week is part of this month, which is part of this year."); setDocumentDate(); processJCas(); assertEquals(3, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("This week", t1.getCoveredText()); assertEquals(LocalDate.of(2016, 10, 3).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(LocalDate.of(2016, 10, 10).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("this month", t2.getCoveredText()); assertEquals(LocalDate.of(2016, 10, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(LocalDate.of(2016, 11, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); Temporal t3 = JCasUtil.selectByIndex(jCas, Temporal.class, 2); assertEquals("this year", t3.getCoveredText()); assertEquals(LocalDate.of(2016, 1, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t3.getTimestampStart()); assertEquals(LocalDate.of(2017, 1, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t3.getTimestampStop()); } @Test public void testNextLastDay() throws Exception{ jCas.setDocumentText("Next Friday is in two days time. Last Wednesday was seven days ago."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Next Friday", t1.getCoveredText()); assertEquals(relativeTo.plusDays(2).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusDays(3).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("Last Wednesday", t2.getCoveredText()); assertEquals(relativeTo.minusWeeks(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.minusDays(6).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastWeek() throws Exception{ jCas.setDocumentText("Next week begins on the 10th October, last week began on 26th September."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Next week", t1.getCoveredText()); assertEquals(LocalDate.of(2016, 10, 10).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(LocalDate.of(2016, 10, 17).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("last week", t2.getCoveredText()); assertEquals(LocalDate.of(2016, 9, 26).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(LocalDate.of(2016, 10, 3).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastWeekPeriod() throws Exception{ jCas.setDocumentText("In the next week we expect to see results from what happened within the last week."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("In the next week", t1.getCoveredText()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusDays(8).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("within the last week", t2.getCoveredText()); assertEquals(relativeTo.minusDays(7).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastWeekDay() throws Exception{ jCas.setDocumentText("Tuesday next week we hope to do better than we did on Thursday last week."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Tuesday next week", t1.getCoveredText()); assertEquals(LocalDate.of(2016, 10, 11).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(LocalDate.of(2016, 10, 12).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("Thursday last week", t2.getCoveredText()); assertEquals(LocalDate.of(2016, 9, 29).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(LocalDate.of(2016, 9, 30).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastMonth() throws Exception{ jCas.setDocumentText("Last month was September, and next month is November"); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Last month", t1.getCoveredText()); assertEquals(LocalDate.of(2016, 9, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(LocalDate.of(2016, 10, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("next month", t2.getCoveredText()); assertEquals(LocalDate.of(2016, 11, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(LocalDate.of(2016, 12, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastMonthPeriod() throws Exception{ jCas.setDocumentText("In the last month something happened, but it's not expected to happen again within the next month"); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("In the last month", t1.getCoveredText()); assertEquals(relativeTo.minusMonths(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("within the next month", t2.getCoveredText()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.plusMonths(1).plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastYear() throws Exception{ jCas.setDocumentText("Next year is 2017, last year was 2016."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("Next year", t1.getCoveredText()); assertEquals(LocalDate.of(2017, 1, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(LocalDate.of(2018, 1, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("last year", t2.getCoveredText()); assertEquals(LocalDate.of(2015, 1, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(LocalDate.of(2016, 1, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastYearPeriod() throws Exception{ jCas.setDocumentText("In the next year, something will happen which didn't happen within the last year."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("In the next year", t1.getCoveredText()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusYears(1).plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("within the last year", t2.getCoveredText()); assertEquals(relativeTo.minusYears(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testNextLastYearMonth() throws Exception{ jCas.setDocumentText("October last year was cold, but June next year will probably be hot."); setDocumentDate(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("October last year", t1.getCoveredText()); assertEquals(LocalDate.of(2015, 10, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(LocalDate.of(2015, 11, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("June next year", t2.getCoveredText()); assertEquals(LocalDate.of(2017, 6, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(LocalDate.of(2017, 7, 1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); } @Test public void testInTheNextX() throws Exception{ jCas.setDocumentText("It could happen in the next 3 days, or within the next 2 weeks. Or it could have happened in the last 4 months or within the last 15 years."); setDocumentDate(); processJCas(); assertEquals(4, JCasUtil.select(jCas, Temporal.class).size()); Temporal t1 = JCasUtil.selectByIndex(jCas, Temporal.class, 0); assertEquals("in the next 3 days", t1.getCoveredText()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStart()); assertEquals(relativeTo.plusDays(4).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t1.getTimestampStop()); Temporal t2 = JCasUtil.selectByIndex(jCas, Temporal.class, 1); assertEquals("within the next 2 weeks", t2.getCoveredText()); assertEquals(relativeTo.atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStart()); assertEquals(relativeTo.plusWeeks(2).plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t2.getTimestampStop()); Temporal t3 = JCasUtil.selectByIndex(jCas, Temporal.class, 2); assertEquals("in the last 4 months", t3.getCoveredText()); assertEquals(relativeTo.minusMonths(4).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t3.getTimestampStart()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t3.getTimestampStop()); Temporal t4 = JCasUtil.selectByIndex(jCas, Temporal.class, 3); assertEquals("within the last 15 years", t4.getCoveredText()); assertEquals(relativeTo.minusYears(15).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t4.getTimestampStart()); assertEquals(relativeTo.plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.UTC), t4.getTimestampStop()); } }