//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.annotators.regex;
import static org.junit.Assert.assertEquals;
import org.apache.uima.fit.util.JCasUtil;
import org.junit.Test;
import uk.gov.dstl.baleen.annotators.regex.LatLon;
import uk.gov.dstl.baleen.annotators.testing.AbstractAnnotatorTest;
import uk.gov.dstl.baleen.annotators.testing.types.TestCoordinate;
import uk.gov.dstl.baleen.types.geo.Coordinate;
/** Tests the DD implementation of {@link LatLon}.
*
*/
public class LatLonDDTest extends AbstractAnnotatorTest{
private static final String TYPE_POINT_COORDINATES_0_125_51_507 = "{\"type\":\"Point\",\"coordinates\":[-0.125,51.507]}";
private static final String TYPE_POINT_COORDINATES_3_188_55_953 = "{\"type\":\"Point\",\"coordinates\":[-3.188,55.953]}";
private static final String TYPE_POINT_COORDINATES_56_3_2 = "{\"type\":\"Point\",\"coordinates\":[56.0,-3.2]}";
private static final String TYPE_POINT_COORDINATES_75_0152_09_190 = "{\"type\":\"Point\",\"coordinates\":[-75.0152,-9.19]}";
private static final String TYPE_POINT_COORDINATES_127_766_35_907 = "{\"type\":\"Point\",\"coordinates\":[127.7669,35.9078]}";
public LatLonDDTest() {
super(LatLon.class);
}
@Test
public void testLatlon() throws Exception{
jCas.setDocumentText("London is located in the UK, at 51.507, -0.125. Edinburgh is also in the UK, at 55.953,-3.188. The following coordinates aren't valid: 987.654,32.1; 12.3,456.789.");
processJCas();
assertAnnotations(2, Coordinate.class,
new TestCoordinate(0, "51.507, -0.125", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.953,-3.188", "dd", TYPE_POINT_COORDINATES_3_188_55_953)
);
}
@Test
public void testNoDelimiter() throws Exception{
jCas.setDocumentText("London is located in the UK, at 51.507, -0.125. Edinburgh is also in the UK, at 55.953,-3.188. The following coordinates aren't valid: 87.65432.1; 12.3-56.789.");
processJCas();
assertAnnotations(2, Coordinate.class,
new TestCoordinate(0, "51.507, -0.125", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.953,-3.188", "dd", TYPE_POINT_COORDINATES_3_188_55_953)
);
}
@Test
public void testLonlat() throws Exception{
jCas.setDocumentText("London is located in the UK, at -0.125, 51.507. Edinburgh is also in the UK, at -3.188,55.953.");
processJCas("lonlat", true);
assertAnnotations(2, Coordinate.class,
new TestCoordinate(0, "-0.125, 51.507", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "-3.188,55.953", "dd", TYPE_POINT_COORDINATES_3_188_55_953)
);
}
@Test
public void testMinDPString() throws Exception{
jCas.setDocumentText("London is located in the UK, at 51.507, -0.125. Edinburgh is also in the UK, at -3.2,56.0.");
processJCas("minDP", "2");
assertAnnotations(1, Coordinate.class,
new TestCoordinate(0, "51.507, -0.125", "dd", TYPE_POINT_COORDINATES_0_125_51_507)
);
}
@Test
public void test0MinDPString() throws Exception{
jCas.setDocumentText("London is located in the UK, at 51.507, -0.125. Edinburgh is also in the UK, at -3.2,56.");
processJCas("minDP", "0");
assertAnnotations(2, Coordinate.class,
new TestCoordinate(0, "51.507, -0.125", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "-3.2,56", "dd", TYPE_POINT_COORDINATES_56_3_2)
);
}
@Test
public void testDegreeSym() throws Exception{
String docText = "London is located in the UK, at 51.507°, -0.125°. Edinburgh is also in the UK, at 55.9530,-3.1880."
+ "But darkest Peru is at -9.19°, -75.0152° and South Korea at 35.9078°, 127.7669°.";
jCas.setDocumentText(docText);
processJCas();
assertAnnotations(4, Coordinate.class,
new TestCoordinate(0, "51.507°, -0.125°", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.9530,-3.1880", "dd", TYPE_POINT_COORDINATES_3_188_55_953),
new TestCoordinate(2, "-9.19°, -75.0152°", "dd", TYPE_POINT_COORDINATES_75_0152_09_190),
new TestCoordinate(3, "35.9078°, 127.7669°", "dd", TYPE_POINT_COORDINATES_127_766_35_907)
);
}
@Test
public void testCardinalSym() throws Exception{
String docText = "London is located in the UK, at 51.507° N, 0.125°W. Edinburgh is also in the UK, at 55.9530°N,3.1880° W."
+ "But darkest Peru is at 9.19° S, 75.0152°W and South Korea at 35.9078°N, 127.7669° E.";
jCas.setDocumentText(docText);
processJCas();
assertAnnotations(4, Coordinate.class,
new TestCoordinate(0, "51.507° N, 0.125°W", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.9530°N,3.1880° W", "dd", TYPE_POINT_COORDINATES_3_188_55_953),
new TestCoordinate(2, "9.19° S, 75.0152°W", "dd", TYPE_POINT_COORDINATES_75_0152_09_190),
new TestCoordinate(3, "35.9078°N, 127.7669° E", "dd", TYPE_POINT_COORDINATES_127_766_35_907)
);
Coordinate t = JCasUtil.selectByIndex(jCas, Coordinate.class, 0);
assertEquals(false, t.getIsNormalised());
}
@Test
public void testNormalize() throws Exception{
String docText = "London is located in the UK, at 51.507° N, 0.125°W. Edinburgh is also in the UK, at 55.9530°N,3.1880° W."
+ "But darkest Peru is at 9.19° S, 75.0152°W and South Korea at 35.9078°N, 127.7669° E.";
jCas.setDocumentText(docText);
processJCas("storeDecimalValue", true);
assertAnnotations(4, Coordinate.class,
new TestCoordinate(0, "51.507° N, 0.125°W", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.9530°N,3.1880° W", "dd", TYPE_POINT_COORDINATES_3_188_55_953),
new TestCoordinate(2, "9.19° S, 75.0152°W", "dd", TYPE_POINT_COORDINATES_75_0152_09_190),
new TestCoordinate(3, "35.9078°N, 127.7669° E", "dd", TYPE_POINT_COORDINATES_127_766_35_907)
);
Coordinate t = JCasUtil.selectByIndex(jCas, Coordinate.class, 0);
assertEquals("51.507 -0.125", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 1);
assertEquals("55.953 -3.188", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 2);
assertEquals("-9.19 -75.0152", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 3);
assertEquals("35.9078 127.7669", t.getValue());
assertEquals(true, t.getIsNormalised());
}
@Test
public void testNormalizeCardinal() throws Exception{
String docText = "London is located in the UK, at 51.507° N, 0.125°W. Edinburgh is also in the UK, at 55.9530°N,3.1880° W."
+ "But darkest Peru is at 9.19° S, 75.0152°W and South Korea at 35.9078°N, 127.7669° E.";
jCas.setDocumentText(docText);
processJCas("storeDecimalValue", true, "storeCardinalPoint", true);
assertAnnotations(4, Coordinate.class,
new TestCoordinate(0, "51.507° N, 0.125°W", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.9530°N,3.1880° W", "dd", TYPE_POINT_COORDINATES_3_188_55_953),
new TestCoordinate(2, "9.19° S, 75.0152°W", "dd", TYPE_POINT_COORDINATES_75_0152_09_190),
new TestCoordinate(3, "35.9078°N, 127.7669° E", "dd", TYPE_POINT_COORDINATES_127_766_35_907)
);
Coordinate t = JCasUtil.selectByIndex(jCas, Coordinate.class, 0);
assertEquals("51.507N 0.125W", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 1);
assertEquals("55.953N 3.188W", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 2);
assertEquals("9.19S 75.0152W", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 3);
assertEquals("35.9078N 127.7669E", t.getValue());
assertEquals(true, t.getIsNormalised());
}
@Test
public void testNormalizeLonFirst() throws Exception{
String docText = "London is located in the UK, at 51.507° N, 0.125°W. Edinburgh is also in the UK, at 55.9530°N,3.1880° W."
+ "But darkest Peru is at 9.19° S, 75.0152°W and South Korea at 35.9078°N, 127.7669° E.";
jCas.setDocumentText(docText);
processJCas("storeDecimalValue", true, "storeLongitudeFirst", true);
assertAnnotations(4, Coordinate.class,
new TestCoordinate(0, "51.507° N, 0.125°W", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.9530°N,3.1880° W", "dd", TYPE_POINT_COORDINATES_3_188_55_953),
new TestCoordinate(2, "9.19° S, 75.0152°W", "dd", TYPE_POINT_COORDINATES_75_0152_09_190),
new TestCoordinate(3, "35.9078°N, 127.7669° E", "dd", TYPE_POINT_COORDINATES_127_766_35_907)
);
Coordinate t = JCasUtil.selectByIndex(jCas, Coordinate.class, 0);
assertEquals("-0.125 51.507", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 1);
assertEquals("-3.188 55.953", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 2);
assertEquals("-75.0152 -9.19", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 3);
assertEquals("127.7669 35.9078", t.getValue());
assertEquals(true, t.getIsNormalised());
}
@Test
public void testNormalizeLonFirstCard() throws Exception{
String docText = "London is located in the UK, at 51.507° N, 0.125°W. Edinburgh is also in the UK, at 55.9530°N,3.1880° W."
+ "But darkest Peru is at 9.19° S, 75.0152°W and South Korea at 35.9078°N, 127.7669° E.";
jCas.setDocumentText(docText);
processJCas("storeDecimalValue", true, "storeCardinalPoint", true, "storeLongitudeFirst", true);
assertAnnotations(4, Coordinate.class,
new TestCoordinate(0, "51.507° N, 0.125°W", "dd", TYPE_POINT_COORDINATES_0_125_51_507),
new TestCoordinate(1, "55.9530°N,3.1880° W", "dd", TYPE_POINT_COORDINATES_3_188_55_953),
new TestCoordinate(2, "9.19° S, 75.0152°W", "dd", TYPE_POINT_COORDINATES_75_0152_09_190),
new TestCoordinate(3, "35.9078°N, 127.7669° E", "dd", TYPE_POINT_COORDINATES_127_766_35_907)
);
Coordinate t = JCasUtil.selectByIndex(jCas, Coordinate.class, 0);
assertEquals("0.125W 51.507N", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 1);
assertEquals("3.188W 55.953N", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 2);
assertEquals("75.0152W 9.19S", t.getValue());
assertEquals(true, t.getIsNormalised());
t = JCasUtil.selectByIndex(jCas, Coordinate.class, 3);
assertEquals("127.7669E 35.9078N", t.getValue());
assertEquals(true, t.getIsNormalised());
}
@Test
public void testMoney() throws Exception{
jCas.setDocumentText("It may cost £2,000 a month to live in London, but that doesn't mean there are any coordiantes in this sentence!");
processJCas();
assertAnnotations(0, Coordinate.class);
}
}